commit
eb013645e7
2
.github/workflows/prodtag.yml
vendored
2
.github/workflows/prodtag.yml
vendored
|
@ -12,5 +12,5 @@ jobs:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
ref: production
|
ref: production
|
||||||
- run: git tag -a "'{date +%Y.%m.%d}.{git rev-parse --short HEAD}'" $(git rev-parse HEAD)
|
- run: git tag "`date +%Y.%m.%d`.`git rev-parse --short HEAD`" $(git rev-parse HEAD)
|
||||||
- run: git push
|
- run: git push
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
"index.css$",
|
"index.css$",
|
||||||
".css$",
|
".css$",
|
||||||
"<THIRD_PARTY_MODULES>",
|
"<THIRD_PARTY_MODULES>",
|
||||||
|
"/assets/",
|
||||||
"^../",
|
"^../",
|
||||||
"^[./]"
|
"^[./]"
|
||||||
],
|
],
|
||||||
|
|
|
@ -121,6 +121,7 @@ Try search for "how to self-host static sites" as there are many ways to do it.
|
||||||
- [React Router](https://reactrouter.com/) - Routing
|
- [React Router](https://reactrouter.com/) - Routing
|
||||||
- [masto.js](https://github.com/neet/masto.js/) - Mastodon API client
|
- [masto.js](https://github.com/neet/masto.js/) - Mastodon API client
|
||||||
- [Iconify](https://iconify.design/) - Icon library
|
- [Iconify](https://iconify.design/) - Icon library
|
||||||
|
- [MingCute icons](https://www.mingcute.com/)
|
||||||
- Vanilla CSS - *Yes, I'm old school.*
|
- Vanilla CSS - *Yes, I'm old school.*
|
||||||
|
|
||||||
Some of these may change in the future. The front-end world is ever-changing.
|
Some of these may change in the future. The front-end world is ever-changing.
|
||||||
|
|
|
@ -3,7 +3,6 @@ import './account-block.css';
|
||||||
// import { useNavigate } from 'react-router-dom';
|
// import { useNavigate } from 'react-router-dom';
|
||||||
import enhanceContent from '../utils/enhance-content';
|
import enhanceContent from '../utils/enhance-content';
|
||||||
import niceDateTime from '../utils/nice-date-time';
|
import niceDateTime from '../utils/nice-date-time';
|
||||||
import shortenNumber from '../utils/shorten-number';
|
|
||||||
import states from '../utils/states';
|
import states from '../utils/states';
|
||||||
|
|
||||||
import Avatar from './avatar';
|
import Avatar from './avatar';
|
||||||
|
|
|
@ -401,6 +401,7 @@ function AccountInfo({
|
||||||
))}
|
))}
|
||||||
<div
|
<div
|
||||||
class="note"
|
class="note"
|
||||||
|
dir="auto"
|
||||||
onClick={handleContentLinks({
|
onClick={handleContentLinks({
|
||||||
instance,
|
instance,
|
||||||
})}
|
})}
|
||||||
|
@ -417,6 +418,7 @@ function AccountInfo({
|
||||||
verifiedAt ? 'profile-verified' : ''
|
verifiedAt ? 'profile-verified' : ''
|
||||||
}`}
|
}`}
|
||||||
key={name + i}
|
key={name + i}
|
||||||
|
dir="auto"
|
||||||
>
|
>
|
||||||
<b>
|
<b>
|
||||||
<EmojiText text={name} emojis={emojis} />{' '}
|
<EmojiText text={name} emojis={emojis} />{' '}
|
||||||
|
|
|
@ -1,11 +1,6 @@
|
||||||
import './nav-menu.css';
|
import './nav-menu.css';
|
||||||
|
|
||||||
import {
|
import { ControlledMenu, MenuDivider, MenuItem } from '@szhsin/react-menu';
|
||||||
ControlledMenu,
|
|
||||||
Menu,
|
|
||||||
MenuDivider,
|
|
||||||
MenuItem,
|
|
||||||
} from '@szhsin/react-menu';
|
|
||||||
import { useEffect, useRef, useState } from 'preact/hooks';
|
import { useEffect, useRef, useState } from 'preact/hooks';
|
||||||
import { useLongPress } from 'use-long-press';
|
import { useLongPress } from 'use-long-press';
|
||||||
import { useSnapshot } from 'valtio';
|
import { useSnapshot } from 'valtio';
|
||||||
|
|
|
@ -11,6 +11,7 @@ import { useSnapshot } from 'valtio';
|
||||||
import floatingButtonUrl from '../assets/floating-button.svg';
|
import floatingButtonUrl from '../assets/floating-button.svg';
|
||||||
import multiColumnUrl from '../assets/multi-column.svg';
|
import multiColumnUrl from '../assets/multi-column.svg';
|
||||||
import tabMenuBarUrl from '../assets/tab-menu-bar.svg';
|
import tabMenuBarUrl from '../assets/tab-menu-bar.svg';
|
||||||
|
|
||||||
import { api } from '../utils/api';
|
import { api } from '../utils/api';
|
||||||
import showToast from '../utils/show-toast';
|
import showToast from '../utils/show-toast';
|
||||||
import states from '../utils/states';
|
import states from '../utils/states';
|
||||||
|
|
|
@ -14,7 +14,6 @@ import useScroll from '../utils/useScroll';
|
||||||
|
|
||||||
import Icon from './icon';
|
import Icon from './icon';
|
||||||
import Link from './link';
|
import Link from './link';
|
||||||
import Loader from './loader';
|
|
||||||
import NavMenu from './nav-menu';
|
import NavMenu from './nav-menu';
|
||||||
import Status from './status';
|
import Status from './status';
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { Menu, MenuItem } from '@szhsin/react-menu';
|
import { MenuItem } from '@szhsin/react-menu';
|
||||||
import { useEffect, useMemo, useRef, useState } from 'preact/hooks';
|
import { useEffect, useMemo, useRef, useState } from 'preact/hooks';
|
||||||
import { useParams, useSearchParams } from 'react-router-dom';
|
import { useParams, useSearchParams } from 'react-router-dom';
|
||||||
import { useSnapshot } from 'valtio';
|
import { useSnapshot } from 'valtio';
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
import {
|
import {
|
||||||
FocusableItem,
|
FocusableItem,
|
||||||
Menu,
|
|
||||||
MenuDivider,
|
MenuDivider,
|
||||||
MenuGroup,
|
MenuGroup,
|
||||||
MenuItem,
|
MenuItem,
|
||||||
|
|
|
@ -13,7 +13,6 @@ import Notification from '../components/notification';
|
||||||
import { api } from '../utils/api';
|
import { api } from '../utils/api';
|
||||||
import db from '../utils/db';
|
import db from '../utils/db';
|
||||||
import groupNotifications from '../utils/group-notifications';
|
import groupNotifications from '../utils/group-notifications';
|
||||||
import openCompose from '../utils/open-compose';
|
|
||||||
import states, { saveStatus } from '../utils/states';
|
import states, { saveStatus } from '../utils/states';
|
||||||
import { getCurrentAccountNS } from '../utils/store-utils';
|
import { getCurrentAccountNS } from '../utils/store-utils';
|
||||||
|
|
||||||
|
@ -49,24 +48,6 @@ function Home() {
|
||||||
headerEnd={<NotificationsLink />}
|
headerEnd={<NotificationsLink />}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
{/* <button
|
|
||||||
// hidden={scrollDirection === 'end' && !nearReachStart}
|
|
||||||
type="button"
|
|
||||||
id="compose-button"
|
|
||||||
onClick={(e) => {
|
|
||||||
if (e.shiftKey) {
|
|
||||||
const newWin = openCompose();
|
|
||||||
if (!newWin) {
|
|
||||||
alert('Looks like your browser is blocking popups.');
|
|
||||||
states.showCompose = true;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
states.showCompose = true;
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Icon icon="quill" size="xl" alt="Compose" />
|
|
||||||
</button> */}
|
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ import { useEffect, useRef, useState } from 'preact/hooks';
|
||||||
import { useSnapshot } from 'valtio';
|
import { useSnapshot } from 'valtio';
|
||||||
|
|
||||||
import logo from '../assets/logo.svg';
|
import logo from '../assets/logo.svg';
|
||||||
|
|
||||||
import Icon from '../components/icon';
|
import Icon from '../components/icon';
|
||||||
import Link from '../components/link';
|
import Link from '../components/link';
|
||||||
import RelativeTime from '../components/relative-time';
|
import RelativeTime from '../components/relative-time';
|
||||||
|
@ -481,6 +482,22 @@ function Settings({ onClose }) {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<p>
|
<p>
|
||||||
|
<a
|
||||||
|
href="https://github.com/sponsors/cheeaun"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
>
|
||||||
|
Sponsor
|
||||||
|
</a>{' '}
|
||||||
|
·{' '}
|
||||||
|
<a
|
||||||
|
href="https://www.buymeacoffee.com/cheeaun"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
>
|
||||||
|
Donate
|
||||||
|
</a>{' '}
|
||||||
|
·{' '}
|
||||||
<a
|
<a
|
||||||
href="https://github.com/cheeaun/phanpy/blob/main/PRIVACY.MD"
|
href="https://github.com/cheeaun/phanpy/blob/main/PRIVACY.MD"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
|
|
|
@ -14,7 +14,7 @@ import {
|
||||||
} from 'preact/hooks';
|
} from 'preact/hooks';
|
||||||
import { useHotkeys } from 'react-hotkeys-hook';
|
import { useHotkeys } from 'react-hotkeys-hook';
|
||||||
import { InView } from 'react-intersection-observer';
|
import { InView } from 'react-intersection-observer';
|
||||||
import { matchPath, useParams, useSearchParams } from 'react-router-dom';
|
import { matchPath, useSearchParams } from 'react-router-dom';
|
||||||
import { useDebouncedCallback } from 'use-debounce';
|
import { useDebouncedCallback } from 'use-debounce';
|
||||||
import { useSnapshot } from 'valtio';
|
import { useSnapshot } from 'valtio';
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { Menu, MenuItem } from '@szhsin/react-menu';
|
import { MenuItem } from '@szhsin/react-menu';
|
||||||
import { useMemo, useRef, useState } from 'preact/hooks';
|
import { useMemo, useRef, useState } from 'preact/hooks';
|
||||||
import { useNavigate, useParams } from 'react-router-dom';
|
import { useNavigate, useParams } from 'react-router-dom';
|
||||||
import { useSnapshot } from 'valtio';
|
import { useSnapshot } from 'valtio';
|
||||||
|
|
|
@ -7,6 +7,7 @@ import multiHashtagTimelineUrl from '../assets/features/multi-hashtag-timeline.j
|
||||||
import nestedCommentsThreadUrl from '../assets/features/nested-comments-thread.jpg';
|
import nestedCommentsThreadUrl from '../assets/features/nested-comments-thread.jpg';
|
||||||
import logoText from '../assets/logo-text.svg';
|
import logoText from '../assets/logo-text.svg';
|
||||||
import logo from '../assets/logo.svg';
|
import logo from '../assets/logo.svg';
|
||||||
|
|
||||||
import Link from '../components/link';
|
import Link from '../components/link';
|
||||||
import states from '../utils/states';
|
import states from '../utils/states';
|
||||||
import useTitle from '../utils/useTitle';
|
import useTitle from '../utils/useTitle';
|
||||||
|
|
|
@ -166,7 +166,7 @@ export function api({ instance, accessToken, accountID, account } = {}) {
|
||||||
instance,
|
instance,
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
throw new Error(`Access token ${accessToken} not found`);
|
throw new Error(`Access token not found`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,17 +1,31 @@
|
||||||
import { useRef } from 'preact/hooks';
|
import { useRef } from 'preact/hooks';
|
||||||
|
import { useDebouncedCallback } from 'use-debounce';
|
||||||
import useResizeObserver from 'use-resize-observer';
|
import useResizeObserver from 'use-resize-observer';
|
||||||
|
|
||||||
export default function useTruncated({ className = 'truncated' } = {}) {
|
export default function useTruncated({ className = 'truncated' } = {}) {
|
||||||
const ref = useRef();
|
const ref = useRef();
|
||||||
|
const onResize = useDebouncedCallback(
|
||||||
|
({ height }) => {
|
||||||
|
if (ref.current) {
|
||||||
|
const { scrollHeight } = ref.current;
|
||||||
|
let truncated = scrollHeight > height;
|
||||||
|
if (truncated) {
|
||||||
|
const { height: _height, maxHeight } = getComputedStyle(ref.current);
|
||||||
|
const computedHeight = parseInt(maxHeight || _height, 10);
|
||||||
|
truncated = scrollHeight > computedHeight;
|
||||||
|
}
|
||||||
|
ref.current.classList.toggle(className, truncated);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
300,
|
||||||
|
{
|
||||||
|
maxWait: 2000,
|
||||||
|
},
|
||||||
|
);
|
||||||
useResizeObserver({
|
useResizeObserver({
|
||||||
ref,
|
ref,
|
||||||
box: 'border-box',
|
box: 'border-box',
|
||||||
onResize: ({ height }) => {
|
onResize,
|
||||||
if (ref.current) {
|
|
||||||
const { scrollHeight } = ref.current;
|
|
||||||
ref.current.classList.toggle(className, scrollHeight > height);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
return ref;
|
return ref;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue