72efd76cea
SHA256:73b875c33e9e3a93fbdc31ad135730ebc8f2bf61e06f5185b0f831caa18f1b04
1 line
723 KiB
Plaintext
1 line
723 KiB
Plaintext
{"version":3,"file":"main-9vVntYq7.js","sources":["../../src/utils/usePageVisibility.js","../../src/components/background-service.jsx","../../src/components/compose-button.jsx","../../src/components/keyboard-shortcuts-help.jsx","../../src/pages/accounts.jsx","../../src/assets/logo.svg","../../src/utils/push-notifications.js","../../src/pages/settings.jsx","../../src/utils/focus-deck.jsx","../../src/utils/useLocationChange.js","../../src/components/list-add-edit.jsx","../../src/components/account-info.jsx","../../src/components/account-sheet.jsx","../../src/components/drafts.jsx","../../src/utils/relationships.js","../../src/components/generic-accounts.jsx","../../src/components/media-alt-modal.jsx","../../src/utils/color-utils.js","../../src/components/media-modal.jsx","../../src/assets/floating-button.svg","../../src/assets/multi-column.svg","../../src/assets/tab-menu-bar.svg","../../src/utils/followed-tags.js","../../src/components/AsyncText.jsx","../../src/components/shortcuts-settings.jsx","../../src/components/modals.jsx","../../src/components/follow-request-buttons.jsx","../../src/components/notification.jsx","../../src/components/notification-service.jsx","../../src/components/search-form.jsx","../../src/components/search-command.jsx","../../src/components/shortcuts.jsx","../../src/utils/timeline-utils.jsx","../../src/utils/useScroll.js","../../src/utils/useScrollFn.js","../../src/components/media-post.jsx","../../src/components/nav-menu.jsx","../../src/components/timeline.jsx","../../src/pages/account-statuses.jsx","../../src/pages/bookmarks.jsx","../../src/pages/favourites.jsx","../../src/pages/followed-hashtags.jsx","../../src/pages/following.jsx","../../src/pages/hashtag.jsx","../../src/pages/list.jsx","../../src/pages/mentions.jsx","../../src/utils/group-notifications.jsx","../../src/pages/notifications.jsx","../../src/pages/public.jsx","../../src/pages/search.jsx","../../src/pages/trending.jsx","../../src/components/columns.jsx","../../src/pages/home.jsx","../../src/utils/get-instance-status-url.js","../../src/pages/http-route.jsx","../../src/pages/lists.jsx","../../src/data/instances.json?url","../../src/utils/auth.js","../../src/pages/login.jsx","../../src/pages/status.jsx","../../src/pages/status-route.jsx","../../src/assets/features/boosts-carousel.jpg","../../src/assets/features/grouped-notifications.jpg","../../src/assets/features/multi-column.jpg","../../src/assets/features/multi-hashtag-timeline.jpg","../../src/assets/features/nested-comments-thread.jpg","../../src/assets/logo-text.svg","../../src/pages/welcome.jsx","../../src/utils/toast-alert.js","../../src/app.jsx","../../src/main.jsx"],"sourcesContent":["import { useEffect, useRef } from 'preact/hooks';\n\nexport default function usePageVisibility(fn = () => {}, deps = []) {\n const savedCallback = useRef(fn);\n useEffect(() => {\n savedCallback.current = fn;\n }, [deps]);\n\n useEffect(() => {\n const handleVisibilityChange = () => {\n const hidden = document.hidden || document.visibilityState === 'hidden';\n console.log('👀 Page visibility changed', hidden ? 'hidden' : 'visible');\n savedCallback.current(!hidden);\n };\n\n document.addEventListener('visibilitychange', handleVisibilityChange);\n return () =>\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n }, []);\n}\n","import { memo } from 'preact/compat';\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\n\nimport { api } from '../utils/api';\nimport showToast from '../utils/show-toast';\nimport states, { saveStatus } from '../utils/states';\nimport useInterval from '../utils/useInterval';\nimport usePageVisibility from '../utils/usePageVisibility';\n\nconst STREAMING_TIMEOUT = 1000 * 3; // 3 seconds\nconst POLL_INTERVAL = 15_000; // 15 seconds\n\nexport default memo(function BackgroundService({ isLoggedIn }) {\n // Notifications service\n // - WebSocket to receive notifications when page is visible\n const [visible, setVisible] = useState(true);\n usePageVisibility(setVisible);\n const checkLatestNotification = async (masto, instance, skipCheckMarkers) => {\n if (states.notificationsLast) {\n const notificationsIterator = masto.v1.notifications.list({\n limit: 1,\n sinceId: states.notificationsLast.id,\n });\n const { value: notifications } = await notificationsIterator.next();\n if (notifications?.length) {\n if (skipCheckMarkers) {\n states.notificationsShowNew = true;\n } else {\n let lastReadId;\n try {\n const markers = await masto.v1.markers.fetch({\n timeline: 'notifications',\n });\n lastReadId = markers?.notifications?.lastReadId;\n } catch (e) {}\n if (lastReadId) {\n states.notificationsShowNew = notifications[0].id !== lastReadId;\n } else {\n states.notificationsShowNew = true;\n }\n }\n }\n }\n };\n\n useEffect(() => {\n let sub;\n let pollNotifications;\n if (isLoggedIn && visible) {\n const { masto, streaming, instance } = api();\n (async () => {\n // 1. Get the latest notification\n await checkLatestNotification(masto, instance);\n\n let hasStreaming = false;\n // 2. Start streaming\n if (streaming) {\n pollNotifications = setTimeout(() => {\n (async () => {\n try {\n hasStreaming = true;\n sub = streaming.user.notification.subscribe();\n console.log('🎏 Streaming notification', sub);\n for await (const entry of sub) {\n if (!sub) break;\n if (!visible) break;\n console.log('🔔🔔 Notification entry', entry);\n if (entry.event === 'notification') {\n console.log('🔔🔔 Notification', entry);\n saveStatus(entry.payload, instance, {\n skipThreading: true,\n });\n }\n states.notificationsShowNew = true;\n }\n console.log('💥 Streaming notification loop STOPPED');\n } catch (e) {\n hasStreaming = false;\n console.error(e);\n }\n\n if (!hasStreaming) {\n console.log('🎏 Streaming failed, fallback to polling');\n pollNotifications = setInterval(() => {\n checkLatestNotification(masto, instance, true);\n }, POLL_INTERVAL);\n }\n })();\n }, STREAMING_TIMEOUT);\n }\n })();\n }\n return () => {\n sub?.unsubscribe?.();\n sub = null;\n clearTimeout(pollNotifications);\n clearInterval(pollNotifications);\n };\n }, [visible, isLoggedIn]);\n\n // Check for updates service\n const lastCheckDate = useRef();\n const checkForUpdates = () => {\n lastCheckDate.current = Date.now();\n console.log('✨ Check app update');\n fetch('./version.json')\n .then((r) => r.json())\n .then((info) => {\n if (info) states.appVersion = info;\n })\n .catch((e) => {\n console.error(e);\n });\n };\n useInterval(checkForUpdates, visible && 1000 * 60 * 30); // 30 minutes\n usePageVisibility((visible) => {\n if (visible) {\n if (!lastCheckDate.current) {\n checkForUpdates();\n } else {\n const diff = Date.now() - lastCheckDate.current;\n if (diff > 1000 * 60 * 60) {\n // 1 hour\n checkForUpdates();\n }\n }\n }\n });\n\n // Global keyboard shortcuts \"service\"\n useHotkeys('shift+alt+k', () => {\n const currentCloakMode = states.settings.cloakMode;\n states.settings.cloakMode = !currentCloakMode;\n showToast({\n text: `Cloak mode ${currentCloakMode ? 'disabled' : 'enabled'}`,\n });\n });\n\n return null;\n});\n","import { useHotkeys } from 'react-hotkeys-hook';\n\nimport openCompose from '../utils/open-compose';\nimport states from '../utils/states';\n\nimport Icon from './icon';\n\nexport default function ComposeButton() {\n function handleButton(e) {\n if (e.shiftKey) {\n const newWin = openCompose();\n\n if (!newWin) {\n states.showCompose = true;\n }\n } else {\n states.showCompose = true;\n }\n }\n\n useHotkeys('c, shift+c', handleButton, {\n ignoreEventWhen: (e) => {\n const hasModal = !!document.querySelector('#modal-container > *');\n return hasModal;\n },\n });\n\n return (\n <button type=\"button\" id=\"compose-button\" onClick={handleButton}>\n <Icon icon=\"quill\" size=\"xl\" alt=\"Compose\" />\n </button>\n );\n}\n","import './keyboard-shortcuts-help.css';\n\nimport { memo } from 'preact/compat';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport { useSnapshot } from 'valtio';\n\nimport states from '../utils/states';\n\nimport Icon from './icon';\nimport Modal from './modal';\n\nexport default memo(function KeyboardShortcutsHelp() {\n const snapStates = useSnapshot(states);\n\n function onClose() {\n states.showKeyboardShortcutsHelp = false;\n }\n\n useHotkeys(\n '?, shift+?',\n (e) => {\n console.log('help');\n states.showKeyboardShortcutsHelp = true;\n },\n {\n ignoreEventWhen: (e) => {\n const hasModal = !!document.querySelector('#modal-container > *');\n return hasModal;\n },\n },\n );\n\n return (\n !!snapStates.showKeyboardShortcutsHelp && (\n <Modal class=\"light\" onClose={onClose}>\n <div id=\"keyboard-shortcuts-help-container\" class=\"sheet\" tabindex=\"-1\">\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" />\n </button>\n <header>\n <h2>Keyboard shortcuts</h2>\n </header>\n <main>\n <table>\n {[\n {\n action: 'Keyboard shortcuts help',\n keys: <kbd>?</kbd>,\n },\n {\n action: 'Next post',\n keys: <kbd>j</kbd>,\n },\n {\n action: 'Previous post',\n keys: <kbd>k</kbd>,\n },\n {\n action: 'Skip carousel to next post',\n keys: (\n <>\n <kbd>Shift</kbd> + <kbd>j</kbd>\n </>\n ),\n },\n {\n action: 'Skip carousel to previous post',\n keys: (\n <>\n <kbd>Shift</kbd> + <kbd>k</kbd>\n </>\n ),\n },\n {\n action: 'Open post details',\n keys: (\n <>\n <kbd>Enter</kbd> or <kbd>o</kbd>\n </>\n ),\n },\n {\n action: (\n <>\n Expand content warning or\n <br />\n toggle expanded/collapsed thread\n </>\n ),\n keys: <kbd>x</kbd>,\n },\n {\n action: 'Close post or dialogs',\n keys: (\n <>\n <kbd>Esc</kbd> or <kbd>Backspace</kbd>\n </>\n ),\n },\n {\n action: 'Focus column in multi-column mode',\n keys: (\n <>\n <kbd>1</kbd> to <kbd>9</kbd>\n </>\n ),\n },\n {\n action: 'Compose new post',\n keys: <kbd>c</kbd>,\n },\n {\n action: 'Compose new post (new window)',\n className: 'insignificant',\n keys: (\n <>\n <kbd>Shift</kbd> + <kbd>c</kbd>\n </>\n ),\n },\n {\n action: 'Send post',\n keys: (\n <>\n <kbd>Ctrl</kbd> + <kbd>Enter</kbd> or <kbd>⌘</kbd> +{' '}\n <kbd>Enter</kbd>\n </>\n ),\n },\n {\n action: 'Search',\n keys: <kbd>/</kbd>,\n },\n {\n action: 'Reply',\n keys: <kbd>r</kbd>,\n },\n {\n action: 'Reply (new window)',\n className: 'insignificant',\n keys: (\n <>\n <kbd>Shift</kbd> + <kbd>r</kbd>\n </>\n ),\n },\n {\n action: 'Like (favourite)',\n keys: (\n <>\n <kbd>l</kbd> or <kbd>f</kbd>\n </>\n ),\n },\n {\n action: 'Boost',\n keys: (\n <>\n <kbd>Shift</kbd> + <kbd>b</kbd>\n </>\n ),\n },\n {\n action: 'Bookmark',\n keys: <kbd>d</kbd>,\n },\n {\n action: 'Toggle Cloak mode',\n keys: (\n <>\n <kbd>Shift</kbd> + <kbd>Alt</kbd> + <kbd>k</kbd>\n </>\n ),\n },\n ].map(({ action, className, keys }) => (\n <tr key={action}>\n <th class={className}>{action}</th>\n <td>{keys}</td>\n </tr>\n ))}\n </table>\n </main>\n </div>\n </Modal>\n )\n );\n});\n","import './accounts.css';\n\nimport { useAutoAnimate } from '@formkit/auto-animate/preact';\nimport { Menu, MenuDivider, MenuItem } from '@szhsin/react-menu';\nimport { useReducer } from 'preact/hooks';\n\nimport Avatar from '../components/avatar';\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport Menu2 from '../components/menu2';\nimport MenuConfirm from '../components/menu-confirm';\nimport NameText from '../components/name-text';\nimport { api } from '../utils/api';\nimport states from '../utils/states';\nimport store from '../utils/store';\n\nfunction Accounts({ onClose }) {\n const { masto } = api();\n // Accounts\n const accounts = store.local.getJSON('accounts');\n const currentAccount = store.session.get('currentAccount');\n const moreThanOneAccount = accounts.length > 1;\n\n const [_, reload] = useReducer((x) => x + 1, 0);\n const [accountsListParent] = useAutoAnimate();\n\n return (\n <div id=\"accounts-container\" class=\"sheet\" tabIndex=\"-1\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" />\n </button>\n )}\n <header class=\"header-grid\">\n <h2>Accounts</h2>\n </header>\n <main>\n <section>\n <ul class=\"accounts-list\" ref={accountsListParent}>\n {accounts.map((account, i) => {\n const isCurrent = account.info.id === currentAccount;\n const isDefault = i === 0; // first account is always default\n return (\n <li key={account.info.id}>\n <div>\n {moreThanOneAccount && (\n <span class={`current ${isCurrent ? 'is-current' : ''}`}>\n <Icon icon=\"check-circle\" alt=\"Current\" />\n </span>\n )}\n <Avatar\n url={account.info.avatarStatic}\n size=\"xxl\"\n onDblClick={async () => {\n if (isCurrent) {\n try {\n const info = await masto.v1.accounts\n .$select(account.info.id)\n .fetch();\n console.log('fetched account info', info);\n account.info = info;\n store.local.setJSON('accounts', accounts);\n reload();\n } catch (e) {}\n }\n }}\n />\n <NameText\n account={\n moreThanOneAccount\n ? {\n ...account.info,\n acct: /@/.test(account.info.acct)\n ? account.info.acct\n : `${account.info.acct}@${account.instanceURL}`,\n }\n : account.info\n }\n showAcct\n onClick={() => {\n if (isCurrent) {\n states.showAccount = `${account.info.username}@${account.instanceURL}`;\n } else {\n store.session.set('currentAccount', account.info.id);\n location.reload();\n }\n }}\n />\n </div>\n <div class=\"actions\">\n {isDefault && moreThanOneAccount && (\n <>\n <span class=\"tag\">Default</span>{' '}\n </>\n )}\n <Menu2\n align=\"end\"\n menuButton={\n <button\n type=\"button\"\n title=\"More\"\n class=\"plain more-button\"\n >\n <Icon icon=\"more\" size=\"l\" alt=\"More\" />\n </button>\n }\n >\n <MenuItem\n onClick={() => {\n states.showAccount = `${account.info.username}@${account.instanceURL}`;\n }}\n >\n <Icon icon=\"user\" />\n <span>View profile…</span>\n </MenuItem>\n <MenuDivider />\n {moreThanOneAccount && (\n <MenuItem\n disabled={isDefault}\n onClick={() => {\n // Move account to the top of the list\n accounts.splice(i, 1);\n accounts.unshift(account);\n store.local.setJSON('accounts', accounts);\n reload();\n }}\n >\n <Icon icon=\"check-circle\" />\n <span>Set as default</span>\n </MenuItem>\n )}\n <MenuConfirm\n subMenu\n confirmLabel={\n <>\n <Icon icon=\"exit\" />\n <span>Log out @{account.info.acct}?</span>\n </>\n }\n disabled={!isCurrent}\n menuItemClassName=\"danger\"\n onClick={() => {\n // const yes = confirm('Log out?');\n // if (!yes) return;\n accounts.splice(i, 1);\n store.local.setJSON('accounts', accounts);\n // location.reload();\n location.href = location.pathname || '/';\n }}\n >\n <Icon icon=\"exit\" />\n <span>Log out…</span>\n </MenuConfirm>\n </Menu2>\n </div>\n </li>\n );\n })}\n </ul>\n <p>\n <Link to=\"/login\" class=\"button plain2\" onClick={onClose}>\n <Icon icon=\"plus\" /> <span>Add an existing account</span>\n </Link>\n </p>\n {moreThanOneAccount && (\n <p>\n <small>\n Note: <i>Default</i> account will always be used for first load.\n Switched accounts will persist during the session.\n </small>\n </p>\n )}\n </section>\n </main>\n </div>\n );\n}\n\nexport default Accounts;\n","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20xml:space='preserve'%20fill-rule='evenodd'%20stroke-linejoin='round'%20stroke-miterlimit='2'%20clip-rule='evenodd'%20viewBox='0%200%2064%2064'%3e%3cpath%20fill='none'%20d='M0%200h63.994v63.994H0z'/%3e%3cpath%20fill='%23a4bff7'%20d='M37.774%2011.471c14.639%203.752%2019.034%2016.557%2015.889%2031.304-.696%203.261-2.563%206.661-6.356%208.693-3.204%201.717-8.07%202.537-15.338.55l-9.634-2.404C11.651%2046.992%208.378%2038.733%2010.027%2031.823c3.627-15.201%2015.543-23.48%2027.747-20.352Z'/%3e%3cpath%20fill='%23d8e7fe'%20d='M36.76%2015.429c12.289%203.15%2015.547%2014.114%2012.907%2026.493-.947%204.44-4.937%209.365-16.664%206.143l-9.684-2.417c-7.854-1.923-10.53-7.8-9.318-12.877%203.016-12.639%2012.611-19.943%2022.759-17.342Z'/%3e%3cpath%20fill='%236081e6'%20d='M27.471%2024.991c-1.457-.698-7.229%203.213-7.663%208.926-.182%202.39%204.55%203.237%205.071-.169.725-4.743%203.715-8.218%202.592-8.757Zm10.746%202.005c-2.083.327-.382%205.901-.595%2010.727-.123%202.8%204.388%203.464%204.703%202.011%201.098-5.073-2.066-13.058-4.108-12.738Z'/%3e%3c/svg%3e\"","// Utils for push notifications\nimport { api } from './api';\nimport { getCurrentAccount } from './store-utils';\n\n// Subscription is an object with the following structure:\n// {\n// data: {\n// alerts: {\n// admin: {\n// report: boolean,\n// signUp: boolean,\n// },\n// favourite: boolean,\n// follow: boolean,\n// mention: boolean,\n// poll: boolean,\n// reblog: boolean,\n// status: boolean,\n// update: boolean,\n// }\n// },\n// policy: \"all\" | \"followed\" | \"follower\" | \"none\",\n// subscription: {\n// endpoint: string,\n// keys: {\n// auth: string,\n// p256dh: string,\n// },\n// },\n// }\n\n// Back-end CRUD\n// =============\n\nfunction createBackendPushSubscription(subscription) {\n const { masto } = api();\n return masto.v1.push.subscription.create(subscription);\n}\n\nfunction fetchBackendPushSubscription() {\n const { masto } = api();\n return masto.v1.push.subscription.fetch();\n}\n\nfunction updateBackendPushSubscription(subscription) {\n const { masto } = api();\n return masto.v1.push.subscription.update(subscription);\n}\n\nfunction removeBackendPushSubscription() {\n const { masto } = api();\n return masto.v1.push.subscription.remove();\n}\n\n// Front-end\n// =========\n\nexport function isPushSupported() {\n return 'serviceWorker' in navigator && 'PushManager' in window;\n}\n\nexport function getRegistration() {\n // return navigator.serviceWorker.ready;\n return navigator.serviceWorker.getRegistration();\n}\n\nasync function getSubscription() {\n const registration = await getRegistration();\n const subscription = registration\n ? await registration.pushManager.getSubscription()\n : undefined;\n return { registration, subscription };\n}\n\nfunction urlBase64ToUint8Array(base64String) {\n const padding = '='.repeat((4 - (base64String.length % 4)) % 4);\n const base64 = `${base64String}${padding}`\n .replace(/-/g, '+')\n .replace(/_/g, '/');\n\n const rawData = window.atob(base64);\n const outputArray = new Uint8Array(rawData.length);\n\n for (let i = 0; i < rawData.length; ++i) {\n outputArray[i] = rawData.charCodeAt(i);\n }\n\n return outputArray;\n}\n\n// Front-end <-> back-end\n// ======================\n\nexport async function initSubscription() {\n if (!isPushSupported()) return;\n const { subscription } = await getSubscription();\n let backendSubscription = null;\n try {\n backendSubscription = await fetchBackendPushSubscription();\n } catch (err) {\n if (/(not found|unknown)/i.test(err.message)) {\n // No subscription found\n } else {\n // Other error\n throw err;\n }\n }\n console.log('INIT subscription', {\n subscription,\n backendSubscription,\n });\n\n // Check if the subscription changed\n if (backendSubscription && subscription) {\n const sameEndpoint = backendSubscription.endpoint === subscription.endpoint;\n const { vapidKey } = getCurrentAccount();\n const sameKey = backendSubscription.serverKey === vapidKey;\n if (!sameEndpoint) {\n throw new Error('Backend subscription endpoint changed');\n }\n if (sameKey) {\n // Subscription didn't change\n } else {\n // Subscription changed\n console.error('🔔 Subscription changed', {\n sameEndpoint,\n serverKey: backendSubscription.serverKey,\n vapIdKey: vapidKey,\n endpoint1: backendSubscription.endpoint,\n endpoint2: subscription.endpoint,\n sameKey,\n key1: backendSubscription.serverKey,\n key2: vapidKey,\n });\n throw new Error('Backend subscription key and vapid key changed');\n // Only unsubscribe from backend, not from browser\n // await removeBackendPushSubscription();\n // // Now let's resubscribe\n // // NOTE: I have no idea if this works\n // return await updateSubscription({\n // data: backendSubscription.data,\n // policy: backendSubscription.policy,\n // });\n }\n }\n\n if (subscription && !backendSubscription) {\n // check if account's vapidKey is same as subscription's applicationServerKey\n const { vapidKey } = getCurrentAccount();\n const { applicationServerKey } = subscription.options;\n const vapidKeyStr = urlBase64ToUint8Array(vapidKey).toString();\n const applicationServerKeyStr = new Uint8Array(\n applicationServerKey,\n ).toString();\n const sameKey = vapidKeyStr === applicationServerKeyStr;\n if (sameKey) {\n // Subscription didn't change\n } else {\n // Subscription changed\n console.error('🔔 Subscription changed', {\n vapidKeyStr,\n applicationServerKeyStr,\n sameKey,\n });\n // Unsubscribe since backend doesn't have a subscription\n await subscription.unsubscribe();\n throw new Error('Subscription key and vapid key changed');\n }\n }\n\n // Check if backend subscription returns 404\n // if (subscription && !backendSubscription) {\n // // Re-subscribe to backend\n // backendSubscription = await createBackendPushSubscription({\n // subscription,\n // data: {},\n // policy: 'all',\n // });\n // }\n\n return { subscription, backendSubscription };\n}\n\nexport async function updateSubscription({ data, policy }) {\n console.log('🔔 Updating subscription', { data, policy });\n if (!isPushSupported()) return;\n let { registration, subscription } = await getSubscription();\n let backendSubscription = null;\n\n if (subscription) {\n try {\n backendSubscription = await updateBackendPushSubscription({\n data,\n policy,\n });\n // TODO: save subscription in user settings\n } catch (error) {\n // Backend doesn't have a subscription for this user\n // Create a new one\n backendSubscription = await createBackendPushSubscription({\n subscription,\n data,\n policy,\n });\n // TODO: save subscription in user settings\n }\n } else {\n // User is not subscribed\n const { vapidKey } = getCurrentAccount();\n if (!vapidKey) throw new Error('No server key found');\n subscription = await registration.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: urlBase64ToUint8Array(vapidKey),\n });\n backendSubscription = await createBackendPushSubscription({\n subscription,\n data,\n policy,\n });\n // TODO: save subscription in user settings\n }\n\n return { subscription, backendSubscription };\n}\n\nexport async function removeSubscription() {\n if (!isPushSupported()) return;\n const { subscription } = await getSubscription();\n if (subscription) {\n await removeBackendPushSubscription();\n await subscription.unsubscribe();\n }\n}\n","import './settings.css';\n\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport logo from '../assets/logo.svg';\n\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport RelativeTime from '../components/relative-time';\nimport targetLanguages from '../data/lingva-target-languages';\nimport { api } from '../utils/api';\nimport getTranslateTargetLanguage from '../utils/get-translate-target-language';\nimport localeCode2Text from '../utils/localeCode2Text';\nimport {\n initSubscription,\n isPushSupported,\n removeSubscription,\n updateSubscription,\n} from '../utils/push-notifications';\nimport showToast from '../utils/show-toast';\nimport states from '../utils/states';\nimport store from '../utils/store';\n\nconst DEFAULT_TEXT_SIZE = 16;\nconst TEXT_SIZES = [15, 16, 17, 18, 19, 20];\nconst {\n PHANPY_WEBSITE: WEBSITE,\n PHANPY_PRIVACY_POLICY_URL: PRIVACY_POLICY_URL,\n PHANPY_IMG_ALT_API_URL: IMG_ALT_API_URL,\n} = import.meta.env;\n\nfunction Settings({ onClose }) {\n const snapStates = useSnapshot(states);\n const currentTheme = store.local.get('theme') || 'auto';\n const themeFormRef = useRef();\n const targetLanguage =\n snapStates.settings.contentTranslationTargetLanguage || null;\n const systemTargetLanguage = getTranslateTargetLanguage();\n const systemTargetLanguageText = localeCode2Text(systemTargetLanguage);\n const currentTextSize = store.local.get('textSize') || DEFAULT_TEXT_SIZE;\n\n const [prefs, setPrefs] = useState(store.account.get('preferences') || {});\n const { masto, authenticated, instance } = api();\n // Get preferences every time Settings is opened\n // NOTE: Disabled for now because I don't expect this to change often. Also for some reason, the /api/v1/preferences endpoint is cached for a while and return old prefs if refresh immediately after changing them.\n // useEffect(() => {\n // const { masto } = api();\n // (async () => {\n // try {\n // const preferences = await masto.v1.preferences.fetch();\n // setPrefs(preferences);\n // store.account.set('preferences', preferences);\n // } catch (e) {\n // // Silently fail\n // console.error(e);\n // }\n // })();\n // }, []);\n\n return (\n <div id=\"settings-container\" class=\"sheet\" tabIndex=\"-1\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" />\n </button>\n )}\n <header>\n <h2>Settings</h2>\n </header>\n <main>\n <section>\n <ul>\n <li>\n <div>\n <label>Appearance</label>\n </div>\n <div>\n <form\n ref={themeFormRef}\n onInput={(e) => {\n console.log(e);\n e.preventDefault();\n const formData = new FormData(themeFormRef.current);\n const theme = formData.get('theme');\n const html = document.documentElement;\n\n if (theme === 'auto') {\n html.classList.remove('is-light', 'is-dark');\n\n // Disable manual theme <meta>\n const $manualMeta = document.querySelector(\n 'meta[data-theme-setting=\"manual\"]',\n );\n if ($manualMeta) {\n $manualMeta.name = '';\n }\n // Enable auto theme <meta>s\n const $autoMetas = document.querySelectorAll(\n 'meta[data-theme-setting=\"auto\"]',\n );\n $autoMetas.forEach((m) => {\n m.name = 'theme-color';\n });\n } else {\n html.classList.toggle('is-light', theme === 'light');\n html.classList.toggle('is-dark', theme === 'dark');\n\n // Enable manual theme <meta>\n const $manualMeta = document.querySelector(\n 'meta[data-theme-setting=\"manual\"]',\n );\n if ($manualMeta) {\n $manualMeta.name = 'theme-color';\n $manualMeta.content =\n theme === 'light'\n ? $manualMeta.dataset.themeLightColor\n : $manualMeta.dataset.themeDarkColor;\n }\n // Disable auto theme <meta>s\n const $autoMetas = document.querySelectorAll(\n 'meta[data-theme-setting=\"auto\"]',\n );\n $autoMetas.forEach((m) => {\n m.name = '';\n });\n }\n document\n .querySelector('meta[name=\"color-scheme\"]')\n .setAttribute(\n 'content',\n theme === 'auto' ? 'dark light' : theme,\n );\n\n if (theme === 'auto') {\n store.local.del('theme');\n } else {\n store.local.set('theme', theme);\n }\n }}\n >\n <div class=\"radio-group\">\n <label>\n <input\n type=\"radio\"\n name=\"theme\"\n value=\"light\"\n defaultChecked={currentTheme === 'light'}\n />\n <span>Light</span>\n </label>\n <label>\n <input\n type=\"radio\"\n name=\"theme\"\n value=\"dark\"\n defaultChecked={currentTheme === 'dark'}\n />\n <span>Dark</span>\n </label>\n <label>\n <input\n type=\"radio\"\n name=\"theme\"\n value=\"auto\"\n defaultChecked={\n currentTheme !== 'light' && currentTheme !== 'dark'\n }\n />\n <span>Auto</span>\n </label>\n </div>\n </form>\n </div>\n </li>\n <li>\n <div>\n <label>Text size</label>\n </div>\n <div class=\"range-group\">\n <span style={{ fontSize: TEXT_SIZES[0] }}>A</span>{' '}\n <input\n type=\"range\"\n min={TEXT_SIZES[0]}\n max={TEXT_SIZES[TEXT_SIZES.length - 1]}\n step=\"1\"\n value={currentTextSize}\n list=\"sizes\"\n onChange={(e) => {\n const value = parseInt(e.target.value, 10);\n const html = document.documentElement;\n // set CSS variable\n html.style.setProperty('--text-size', `${value}px`);\n // save to local storage\n if (value === DEFAULT_TEXT_SIZE) {\n store.local.del('textSize');\n } else {\n store.local.set('textSize', e.target.value);\n }\n }}\n />{' '}\n <span style={{ fontSize: TEXT_SIZES[TEXT_SIZES.length - 1] }}>\n A\n </span>\n <datalist id=\"sizes\">\n {TEXT_SIZES.map((size) => (\n <option value={size} />\n ))}\n </datalist>\n </div>\n </li>\n </ul>\n </section>\n {authenticated && (\n <>\n <h3>Posting</h3>\n <section>\n <ul>\n <li>\n <div>\n <label for=\"posting-privacy-field\">\n Default visibility{' '}\n <Icon icon=\"cloud\" alt=\"Synced\" class=\"synced-icon\" />\n </label>\n </div>\n <div>\n <select\n id=\"posting-privacy-field\"\n value={prefs['posting:default:visibility'] || 'public'}\n onChange={(e) => {\n const { value } = e.target;\n (async () => {\n try {\n await masto.v1.accounts.updateCredentials({\n source: {\n privacy: value,\n },\n });\n setPrefs({\n ...prefs,\n 'posting:default:visibility': value,\n });\n store.account.set('preferences', {\n ...prefs,\n 'posting:default:visibility': value,\n });\n } catch (e) {\n alert('Failed to update posting privacy');\n console.error(e);\n }\n })();\n }}\n >\n <option value=\"public\">Public</option>\n <option value=\"unlisted\">Unlisted</option>\n <option value=\"private\">Followers only</option>\n </select>\n </div>\n </li>\n </ul>\n </section>\n <p class=\"section-postnote\">\n <Icon icon=\"cloud\" alt=\"Synced\" class=\"synced-icon\" />{' '}\n <small>\n Synced to your instance server's settings.{' '}\n <a\n href={`https://${instance}/`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Go to your instance ({instance}) for more settings.\n </a>\n </small>\n </p>\n </>\n )}\n <h3>Experiments</h3>\n <section>\n <ul>\n <li>\n <label>\n <input\n type=\"checkbox\"\n checked={snapStates.settings.autoRefresh}\n onChange={(e) => {\n states.settings.autoRefresh = e.target.checked;\n }}\n />{' '}\n Auto refresh timeline posts\n </label>\n </li>\n <li>\n <label>\n <input\n type=\"checkbox\"\n checked={snapStates.settings.boostsCarousel}\n onChange={(e) => {\n states.settings.boostsCarousel = e.target.checked;\n }}\n />{' '}\n Boosts carousel\n </label>\n </li>\n <li>\n <label>\n <input\n type=\"checkbox\"\n checked={snapStates.settings.contentTranslation}\n onChange={(e) => {\n const { checked } = e.target;\n states.settings.contentTranslation = checked;\n if (!checked) {\n states.settings.contentTranslationTargetLanguage = null;\n }\n }}\n />{' '}\n Post translation\n </label>\n <div\n class={`sub-section ${\n !snapStates.settings.contentTranslation\n ? 'more-insignificant'\n : ''\n }`}\n >\n <div>\n <label>\n Translate to{' '}\n <select\n value={targetLanguage || ''}\n disabled={!snapStates.settings.contentTranslation}\n onChange={(e) => {\n states.settings.contentTranslationTargetLanguage =\n e.target.value || null;\n }}\n >\n <option value=\"\">\n System language ({systemTargetLanguageText})\n </option>\n <option disabled>──────────</option>\n {targetLanguages.map((lang) => (\n <option value={lang.code}>{lang.name}</option>\n ))}\n </select>\n </label>\n </div>\n <hr />\n <p class=\"checkbox-fieldset\">\n Hide \"Translate\" button for\n {snapStates.settings.contentTranslationHideLanguages.length >\n 0 && (\n <>\n {' '}\n (\n {\n snapStates.settings.contentTranslationHideLanguages\n .length\n }\n )\n </>\n )}\n :\n <div class=\"checkbox-fields\">\n {targetLanguages.map((lang) => (\n <label>\n <input\n type=\"checkbox\"\n checked={snapStates.settings.contentTranslationHideLanguages.includes(\n lang.code,\n )}\n onChange={(e) => {\n const { checked } = e.target;\n if (checked) {\n states.settings.contentTranslationHideLanguages.push(\n lang.code,\n );\n } else {\n states.settings.contentTranslationHideLanguages =\n snapStates.settings.contentTranslationHideLanguages.filter(\n (code) => code !== lang.code,\n );\n }\n }}\n />{' '}\n {lang.name}\n </label>\n ))}\n </div>\n </p>\n <p class=\"insignificant\">\n <small>\n Note: This feature uses external translation services,\n powered by{' '}\n <a\n href=\"https://github.com/cheeaun/lingva-api\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Lingva API\n </a>{' '}\n &{' '}\n <a\n href=\"https://github.com/thedaviddelta/lingva-translate\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Lingva Translate\n </a>\n .\n </small>\n </p>\n <hr />\n <div>\n <label>\n <input\n type=\"checkbox\"\n checked={snapStates.settings.contentTranslationAutoInline}\n disabled={!snapStates.settings.contentTranslation}\n onChange={(e) => {\n states.settings.contentTranslationAutoInline =\n e.target.checked;\n }}\n />{' '}\n Auto inline translation\n </label>\n <p class=\"insignificant\">\n <small>\n Automatically show translation for posts in timeline. Only\n works for <b>short</b> posts without content warning,\n media and poll.\n </small>\n </p>\n </div>\n </div>\n </li>\n {!!IMG_ALT_API_URL && (\n <li>\n <label>\n <input\n type=\"checkbox\"\n checked={snapStates.settings.mediaAltGenerator}\n onChange={(e) => {\n states.settings.mediaAltGenerator = e.target.checked;\n }}\n />{' '}\n Image description generator{' '}\n <Icon icon=\"sparkles2\" class=\"more-insignificant\" />\n </label>\n <div class=\"sub-section insignificant\">\n <small>Only for new images while composing new posts.</small>\n </div>\n <div class=\"sub-section insignificant\">\n <small>\n Note: This feature uses external AI service, powered by{' '}\n <a\n href=\"https://github.com/cheeaun/img-alt-api\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n img-alt-api\n </a>\n . May not work well. Only for images and in English.\n </small>\n </div>\n </li>\n )}\n <li>\n <label>\n <input\n type=\"checkbox\"\n checked={snapStates.settings.cloakMode}\n onChange={(e) => {\n states.settings.cloakMode = e.target.checked;\n }}\n />{' '}\n Cloak mode{' '}\n <span class=\"insignificant\">\n (<samp>Text</samp> → <samp>████</samp>)\n </span>\n </label>\n <div class=\"sub-section insignificant\">\n <small>\n Replace text as blocks, useful when taking screenshots, for\n privacy reasons.\n </small>\n </div>\n </li>\n {authenticated && (\n <li>\n <button\n type=\"button\"\n class=\"light\"\n onClick={() => {\n states.showDrafts = true;\n states.showSettings = false;\n }}\n >\n Unsent drafts\n </button>\n </li>\n )}\n </ul>\n </section>\n {authenticated && <PushNotificationsSection onClose={onClose} />}\n <h3>About</h3>\n <section>\n <div\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n gap: 8,\n lineHeight: 1.25,\n alignItems: 'center',\n marginTop: 8,\n }}\n >\n <img\n src={logo}\n alt=\"\"\n width=\"64\"\n height=\"64\"\n style={{\n aspectRatio: '1/1',\n verticalAlign: 'middle',\n background: '#b7cdf9',\n borderRadius: 12,\n }}\n />\n <div>\n <b>Phanpy</b>{' '}\n <a\n href=\"https://hachyderm.io/@phanpy\"\n // target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={(e) => {\n e.preventDefault();\n states.showAccount = 'phanpy@hachyderm.io';\n }}\n >\n @phanpy\n </a>\n <br />\n <a\n href=\"https://github.com/cheeaun/phanpy\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Built\n </a>{' '}\n by{' '}\n <a\n href=\"https://mastodon.social/@cheeaun\"\n // target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={(e) => {\n e.preventDefault();\n states.showAccount = 'cheeaun@mastodon.social';\n }}\n >\n @cheeaun\n </a>\n </div>\n </div>\n <p>\n <a\n href=\"https://github.com/sponsors/cheeaun\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Sponsor\n </a>{' '}\n ·{' '}\n <a\n href=\"https://www.buymeacoffee.com/cheeaun\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Donate\n </a>{' '}\n ·{' '}\n <a\n href={PRIVACY_POLICY_URL}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Privacy Policy\n </a>\n </p>\n {__BUILD_TIME__ && (\n <p>\n {WEBSITE && (\n <>\n <span class=\"insignificant\">Site:</span>{' '}\n {WEBSITE.replace(/https?:\\/\\//g, '').replace(/\\/$/, '')}\n <br />\n </>\n )}\n <span class=\"insignificant\">Version:</span>{' '}\n <input\n type=\"text\"\n class=\"version-string\"\n readOnly\n size=\"18\" // Manually calculated here\n value={`${__BUILD_TIME__.slice(0, 10).replace(/-/g, '.')}${\n __COMMIT_HASH__ ? `.${__COMMIT_HASH__}` : ''\n }`}\n onClick={(e) => {\n e.target.select();\n // Copy to clipboard\n try {\n navigator.clipboard.writeText(e.target.value);\n showToast('Version string copied');\n } catch (e) {\n console.warn(e);\n showToast('Unable to copy version string');\n }\n }}\n />{' '}\n {!__FAKE_COMMIT_HASH__ && (\n <span class=\"ib insignificant\">\n (\n <a\n href={`https://github.com/cheeaun/phanpy/commit/${__COMMIT_HASH__}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <RelativeTime datetime={new Date(__BUILD_TIME__)} />\n </a>\n )\n </span>\n )}\n </p>\n )}\n </section>\n </main>\n </div>\n );\n}\n\nfunction PushNotificationsSection({ onClose }) {\n if (!isPushSupported()) return null;\n\n const { instance } = api();\n const [uiState, setUIState] = useState('default');\n const pushFormRef = useRef();\n const [allowNofitications, setAllowNotifications] = useState(false);\n const [needRelogin, setNeedRelogin] = useState(false);\n const previousPolicyRef = useRef();\n useEffect(() => {\n (async () => {\n setUIState('loading');\n try {\n const { subscription, backendSubscription } = await initSubscription();\n if (\n backendSubscription?.policy &&\n backendSubscription.policy !== 'none'\n ) {\n setAllowNotifications(true);\n const { alerts, policy } = backendSubscription;\n previousPolicyRef.current = policy;\n const { elements } = pushFormRef.current;\n const policyEl = elements.namedItem(policy);\n if (policyEl) policyEl.value = policy;\n // alerts is {}, iterate it\n Object.keys(alerts).forEach((alert) => {\n const el = elements.namedItem(alert);\n if (el?.type === 'checkbox') {\n el.checked = true;\n }\n });\n }\n setUIState('default');\n } catch (err) {\n console.warn(err);\n if (/outside.*authorized/i.test(err.message)) {\n setNeedRelogin(true);\n } else {\n alert(err?.message || err);\n }\n setUIState('error');\n }\n })();\n }, []);\n\n const isLoading = uiState === 'loading';\n\n return (\n <form\n ref={pushFormRef}\n onChange={() => {\n const values = Object.fromEntries(new FormData(pushFormRef.current));\n const allowNofitications = !!values['policy-allow'];\n const params = {\n policy: values.policy,\n data: {\n alerts: {\n mention: !!values.mention,\n favourite: !!values.favourite,\n reblog: !!values.reblog,\n follow: !!values.follow,\n follow_request: !!values.followRequest,\n poll: !!values.poll,\n update: !!values.update,\n status: !!values.status,\n },\n },\n };\n\n let alertsCount = 0;\n // Remove false values from data.alerts\n // API defaults to false anyway\n Object.keys(params.data.alerts).forEach((key) => {\n if (!params.data.alerts[key]) {\n delete params.data.alerts[key];\n } else {\n alertsCount++;\n }\n });\n const policyChanged = previousPolicyRef.current !== params.policy;\n\n console.log('PN Form', { values, allowNofitications, params });\n\n if (allowNofitications && alertsCount > 0) {\n if (policyChanged) {\n console.debug('Policy changed.');\n removeSubscription()\n .then(() => {\n updateSubscription(params);\n })\n .catch((err) => {\n console.warn(err);\n alert('Failed to update subscription. Please try again.');\n });\n } else {\n updateSubscription(params).catch((err) => {\n console.warn(err);\n alert('Failed to update subscription. Please try again.');\n });\n }\n } else {\n removeSubscription().catch((err) => {\n console.warn(err);\n alert('Failed to remove subscription. Please try again.');\n });\n }\n }}\n >\n <h3>Push Notifications (beta)</h3>\n <section>\n <ul>\n <li>\n <label>\n <input\n type=\"checkbox\"\n disabled={isLoading || needRelogin}\n name=\"policy-allow\"\n checked={allowNofitications}\n onChange={async (e) => {\n const { checked } = e.target;\n if (checked) {\n // Request permission\n const permission = await Notification.requestPermission();\n if (permission === 'granted') {\n setAllowNotifications(true);\n } else {\n setAllowNotifications(false);\n if (permission === 'denied') {\n alert(\n 'Push notifications are blocked. Please enable them in your browser settings.',\n );\n }\n }\n } else {\n setAllowNotifications(false);\n }\n }}\n />{' '}\n Allow from{' '}\n <select\n name=\"policy\"\n disabled={isLoading || needRelogin || !allowNofitications}\n >\n {[\n {\n value: 'all',\n label: 'anyone',\n },\n {\n value: 'followed',\n label: 'people I follow',\n },\n {\n value: 'follower',\n label: 'followers',\n },\n ].map((type) => (\n <option value={type.value}>{type.label}</option>\n ))}\n </select>\n </label>\n <div\n class=\"shazam-container no-animation\"\n style={{\n width: '100%',\n }}\n hidden={!allowNofitications}\n >\n <div class=\"shazam-container-inner\">\n <div class=\"sub-section\">\n <ul>\n {[\n {\n value: 'mention',\n label: 'Mentions',\n },\n {\n value: 'favourite',\n label: 'Likes',\n },\n {\n value: 'reblog',\n label: 'Boosts',\n },\n {\n value: 'follow',\n label: 'Follows',\n },\n {\n value: 'followRequest',\n label: 'Follow requests',\n },\n {\n value: 'poll',\n label: 'Polls',\n },\n {\n value: 'update',\n label: 'Post edits',\n },\n {\n value: 'status',\n label: 'New posts',\n },\n ].map((alert) => (\n <li>\n <label>\n <input type=\"checkbox\" name={alert.value} />{' '}\n {alert.label}\n </label>\n </li>\n ))}\n </ul>\n </div>\n </div>\n </div>\n {needRelogin && (\n <div class=\"sub-section\">\n <p>\n Push permission was not granted since your last login. You'll\n need to{' '}\n <Link to={`/login?instance=${instance}`} onClick={onClose}>\n <b>log in</b> again to grant push permission\n </Link>\n .\n </p>\n </div>\n )}\n </li>\n </ul>\n </section>\n <p class=\"section-postnote\">\n <small>\n NOTE: Push notifications only work for <b>one account</b>.\n </small>\n </p>\n </form>\n );\n}\n\nexport default Settings;\n","const focusDeck = () => {\n let timer = setTimeout(() => {\n const columns = document.getElementById('columns');\n if (columns) {\n // Focus first column\n // columns.querySelector('.deck-container')?.focus?.();\n } else {\n const modals = document.querySelectorAll('#modal-container > *');\n if (modals?.length) {\n // Focus last modal\n const modal = modals[modals.length - 1]; // last one\n const modalFocusElement =\n modal.querySelector('[tabindex=\"-1\"]') || modal;\n if (modalFocusElement) {\n modalFocusElement.focus();\n return;\n }\n }\n const backDrop = document.querySelector('.deck-backdrop');\n if (backDrop) return;\n // Focus last deck\n const pages = document.querySelectorAll('.deck-container');\n const page = pages[pages.length - 1]; // last one\n if (page && page.tabIndex === -1) {\n console.log('FOCUS', page);\n page.focus();\n }\n }\n }, 100);\n return () => clearTimeout(timer);\n};\n\nexport default focusDeck;\n","import { useEffect, useRef } from 'preact/hooks';\nimport { useLocation } from 'react-router-dom';\n\n// Hook that runs a callback when the location changes\n// Won't run on the first render\n\nexport default function useLocationChange(fn) {\n if (!fn) return;\n const location = useLocation();\n const currentLocationRef = useRef(location.pathname);\n useEffect(() => {\n // console.log('location', {\n // current: currentLocationRef.current,\n // next: location.pathname,\n // });\n if (\n currentLocationRef.current &&\n location.pathname !== currentLocationRef.current\n ) {\n fn?.();\n }\n }, [location.pathname, fn]);\n}\n","import { useEffect, useRef, useState } from 'preact/hooks';\n\nimport { api } from '../utils/api';\nimport supports from '../utils/supports';\n\nimport Icon from './icon';\nimport MenuConfirm from './menu-confirm';\n\nfunction ListAddEdit({ list, onClose }) {\n const { masto } = api();\n const [uiState, setUIState] = useState('default');\n const editMode = !!list;\n const nameFieldRef = useRef();\n const repliesPolicyFieldRef = useRef();\n const exclusiveFieldRef = useRef();\n useEffect(() => {\n if (editMode) {\n nameFieldRef.current.value = list.title;\n repliesPolicyFieldRef.current.value = list.repliesPolicy;\n if (exclusiveFieldRef.current) {\n exclusiveFieldRef.current.checked = list.exclusive;\n }\n }\n }, [editMode]);\n const supportsExclusive = supports('@mastodon/list-exclusive');\n\n return (\n <div class=\"sheet\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" />\n </button>\n )}{' '}\n <header>\n <h2>{editMode ? 'Edit list' : 'New list'}</h2>\n </header>\n <main>\n <form\n class=\"list-form\"\n onSubmit={(e) => {\n e.preventDefault(); // Get form values\n\n const formData = new FormData(e.target);\n const title = formData.get('title');\n const repliesPolicy = formData.get('replies_policy');\n const exclusive = formData.get('exclusive') === 'on';\n console.log({\n title,\n repliesPolicy,\n exclusive,\n });\n setUIState('loading');\n\n (async () => {\n try {\n let listResult;\n\n if (editMode) {\n listResult = await masto.v1.lists.$select(list.id).update({\n title,\n replies_policy: repliesPolicy,\n exclusive,\n });\n } else {\n listResult = await masto.v1.lists.create({\n title,\n replies_policy: repliesPolicy,\n exclusive,\n });\n }\n\n console.log(listResult);\n setUIState('default');\n onClose?.({\n state: 'success',\n list: listResult,\n });\n } catch (e) {\n console.error(e);\n setUIState('error');\n alert(\n editMode ? 'Unable to edit list.' : 'Unable to create list.',\n );\n }\n })();\n }}\n >\n <div class=\"list-form-row\">\n <label for=\"list-title\">\n Name{' '}\n <input\n ref={nameFieldRef}\n type=\"text\"\n id=\"list-title\"\n name=\"title\"\n required\n disabled={uiState === 'loading'}\n dir=\"auto\"\n />\n </label>\n </div>\n <div class=\"list-form-row\">\n <select\n ref={repliesPolicyFieldRef}\n name=\"replies_policy\"\n required\n disabled={uiState === 'loading'}\n >\n <option value=\"list\">Show replies to list members</option>\n <option value=\"followed\">Show replies to people I follow</option>\n <option value=\"none\">Don't show replies</option>\n </select>\n </div>\n {supportsExclusive && (\n <div class=\"list-form-row\">\n <label class=\"label-block\">\n <input\n ref={exclusiveFieldRef}\n type=\"checkbox\"\n name=\"exclusive\"\n disabled={uiState === 'loading'}\n />{' '}\n Hide posts on this list from Home/Following\n </label>\n </div>\n )}\n <div class=\"list-form-footer\">\n <button type=\"submit\" disabled={uiState === 'loading'}>\n {editMode ? 'Save' : 'Create'}\n </button>\n {editMode && (\n <MenuConfirm\n disabled={uiState === 'loading'}\n align=\"end\"\n menuItemClassName=\"danger\"\n confirmLabel=\"Delete this list?\"\n onClick={() => {\n // const yes = confirm('Delete this list?');\n // if (!yes) return;\n setUIState('loading');\n\n (async () => {\n try {\n await masto.v1.lists.$select(list.id).remove();\n setUIState('default');\n onClose?.({\n state: 'deleted',\n });\n } catch (e) {\n console.error(e);\n setUIState('error');\n alert('Unable to delete list.');\n }\n })();\n }}\n >\n <button\n type=\"button\"\n class=\"light danger\"\n disabled={uiState === 'loading'}\n >\n Delete…\n </button>\n </MenuConfirm>\n )}\n </div>\n </form>\n </main>\n </div>\n );\n}\n\nexport default ListAddEdit;\n","import './account-info.css';\n\nimport { Menu, MenuDivider, MenuItem, SubMenu } from '@szhsin/react-menu';\nimport {\n useCallback,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n useState,\n} from 'preact/hooks';\n\nimport { api } from '../utils/api';\nimport enhanceContent from '../utils/enhance-content';\nimport getHTMLText from '../utils/getHTMLText';\nimport handleContentLinks from '../utils/handle-content-links';\nimport niceDateTime from '../utils/nice-date-time';\nimport pmem from '../utils/pmem';\nimport shortenNumber from '../utils/shorten-number';\nimport showToast from '../utils/show-toast';\nimport states, { hideAllModals } from '../utils/states';\nimport store from '../utils/store';\nimport { updateAccount } from '../utils/store-utils';\n\nimport AccountBlock from './account-block';\nimport Avatar from './avatar';\nimport EmojiText from './emoji-text';\nimport Icon from './icon';\nimport Link from './link';\nimport ListAddEdit from './list-add-edit';\nimport Loader from './loader';\nimport Menu2 from './menu2';\nimport MenuConfirm from './menu-confirm';\nimport Modal from './modal';\nimport TranslationBlock from './translation-block';\n\nconst MUTE_DURATIONS = [\n 60 * 5, // 5 minutes\n 60 * 30, // 30 minutes\n 60 * 60, // 1 hour\n 60 * 60 * 6, // 6 hours\n 60 * 60 * 24, // 1 day\n 60 * 60 * 24 * 3, // 3 days\n 60 * 60 * 24 * 7, // 1 week\n 0, // forever\n];\nconst MUTE_DURATIONS_LABELS = {\n 0: 'Forever',\n 300: '5 minutes',\n 1_800: '30 minutes',\n 3_600: '1 hour',\n 21_600: '6 hours',\n 86_400: '1 day',\n 259_200: '3 days',\n 604_800: '1 week',\n};\n\nconst LIMIT = 80;\n\nconst ACCOUNT_INFO_MAX_AGE = 1000 * 60 * 10; // 10 mins\n\nfunction fetchFamiliarFollowers(currentID, masto) {\n return masto.v1.accounts.familiarFollowers.fetch({\n id: [currentID],\n });\n}\nconst memFetchFamiliarFollowers = pmem(fetchFamiliarFollowers, {\n maxAge: ACCOUNT_INFO_MAX_AGE,\n});\n\nasync function fetchPostingStats(accountID, masto) {\n const fetchStatuses = masto.v1.accounts\n .$select(accountID)\n .statuses.list({\n limit: 20,\n })\n .next();\n\n const { value: statuses } = await fetchStatuses;\n console.log('fetched statuses', statuses);\n const stats = {\n total: statuses.length,\n originals: 0,\n replies: 0,\n boosts: 0,\n };\n // Categories statuses by type\n // - Original posts (not replies to others)\n // - Threads (self-replies + 1st original post)\n // - Boosts (reblogs)\n // - Replies (not-self replies)\n statuses.forEach((status) => {\n if (status.reblog) {\n stats.boosts++;\n } else if (\n !!status.inReplyToId &&\n status.inReplyToAccountId !== status.account.id // Not self-reply\n ) {\n stats.replies++;\n } else {\n stats.originals++;\n }\n });\n\n // Count days since last post\n if (statuses.length) {\n stats.daysSinceLastPost = Math.ceil(\n (Date.now() - new Date(statuses[statuses.length - 1].createdAt)) /\n 86400000,\n );\n }\n\n console.log('posting stats', stats);\n return stats;\n}\nconst memFetchPostingStats = pmem(fetchPostingStats, {\n maxAge: ACCOUNT_INFO_MAX_AGE,\n});\n\nfunction AccountInfo({\n account,\n fetchAccount = () => {},\n standalone,\n instance,\n authenticated,\n}) {\n const { masto } = api({\n instance,\n });\n const { masto: currentMasto, instance: currentInstance } = api();\n const [uiState, setUIState] = useState('default');\n const isString = typeof account === 'string';\n const [info, setInfo] = useState(isString ? null : account);\n\n const sameCurrentInstance = useMemo(\n () => instance === currentInstance,\n [instance, currentInstance],\n );\n\n useEffect(() => {\n if (!isString) {\n setInfo(account);\n return;\n }\n setUIState('loading');\n (async () => {\n try {\n const info = await fetchAccount();\n states.accounts[`${info.id}@${instance}`] = info;\n setInfo(info);\n setUIState('default');\n } catch (e) {\n console.error(e);\n setInfo(null);\n setUIState('error');\n }\n })();\n }, [isString, account, fetchAccount]);\n\n const {\n acct,\n avatar,\n avatarStatic,\n bot,\n createdAt,\n displayName,\n emojis,\n fields,\n followersCount,\n followingCount,\n group,\n // header,\n // headerStatic,\n id,\n lastStatusAt,\n locked,\n note,\n statusesCount,\n url,\n username,\n memorial,\n moved,\n roles,\n } = info || {};\n let headerIsAvatar = false;\n let { header, headerStatic } = info || {};\n if (!header || /missing\\.png$/.test(header)) {\n if (avatar && !/missing\\.png$/.test(avatar)) {\n header = avatar;\n headerIsAvatar = true;\n if (avatarStatic && !/missing\\.png$/.test(avatarStatic)) {\n headerStatic = avatarStatic;\n }\n }\n }\n\n const isSelf = useMemo(\n () => id === store.session.get('currentAccount'),\n [id],\n );\n\n useEffect(() => {\n const infoHasEssentials = !!(\n info?.id &&\n info?.username &&\n info?.acct &&\n info?.avatar &&\n info?.avatarStatic &&\n info?.displayName &&\n info?.url\n );\n if (isSelf && instance && infoHasEssentials) {\n const accounts = store.local.getJSON('accounts');\n let updated = false;\n accounts.forEach((account) => {\n if (account.info.id === info.id && account.instanceURL === instance) {\n account.info = info;\n updated = true;\n }\n });\n if (updated) {\n console.log('Updated account info', info);\n store.local.setJSON('accounts', accounts);\n }\n }\n }, [isSelf, info, instance]);\n\n const accountInstance = useMemo(() => {\n if (!url) return null;\n const domain = new URL(url).hostname;\n return domain;\n }, [url]);\n\n const [headerCornerColors, setHeaderCornerColors] = useState([]);\n\n const followersIterator = useRef();\n const familiarFollowersCache = useRef([]);\n async function fetchFollowers(firstLoad) {\n if (firstLoad || !followersIterator.current) {\n followersIterator.current = masto.v1.accounts.$select(id).followers.list({\n limit: LIMIT,\n });\n }\n const results = await followersIterator.current.next();\n if (isSelf) return results;\n if (!sameCurrentInstance) return results;\n\n const { value } = results;\n let newValue = [];\n // On first load, fetch familiar followers, merge to top of results' `value`\n // Remove dups on every fetch\n if (firstLoad) {\n const familiarFollowers = await masto.v1.accounts.familiarFollowers.fetch(\n {\n id: [id],\n },\n );\n familiarFollowersCache.current = familiarFollowers[0].accounts;\n newValue = [\n ...familiarFollowersCache.current,\n ...value.filter(\n (account) =>\n !familiarFollowersCache.current.some(\n (familiar) => familiar.id === account.id,\n ),\n ),\n ];\n } else if (value?.length) {\n newValue = value.filter(\n (account) =>\n !familiarFollowersCache.current.some(\n (familiar) => familiar.id === account.id,\n ),\n );\n }\n\n return {\n ...results,\n value: newValue,\n };\n }\n\n const followingIterator = useRef();\n async function fetchFollowing(firstLoad) {\n if (firstLoad || !followingIterator.current) {\n followingIterator.current = masto.v1.accounts.$select(id).following.list({\n limit: LIMIT,\n });\n }\n const results = await followingIterator.current.next();\n return results;\n }\n\n const LinkOrDiv = standalone ? 'div' : Link;\n const accountLink = instance ? `/${instance}/a/${id}` : `/a/${id}`;\n\n const [familiarFollowers, setFamiliarFollowers] = useState([]);\n const [postingStats, setPostingStats] = useState();\n const [postingStatsUIState, setPostingStatsUIState] = useState('default');\n const hasPostingStats = !!postingStats?.total;\n\n const renderFamiliarFollowers = async (currentID) => {\n try {\n const followers = await memFetchFamiliarFollowers(\n currentID,\n currentMasto,\n );\n console.log('fetched familiar followers', followers);\n setFamiliarFollowers(\n followers[0].accounts.slice(0, FAMILIAR_FOLLOWERS_LIMIT),\n );\n } catch (e) {\n console.error(e);\n }\n };\n\n const renderPostingStats = async () => {\n if (!id) return;\n setPostingStatsUIState('loading');\n try {\n const stats = await memFetchPostingStats(id, masto);\n setPostingStats(stats);\n setPostingStatsUIState('default');\n } catch (e) {\n console.error(e);\n setPostingStatsUIState('error');\n }\n };\n\n const onRelationshipChange = useCallback(\n ({ relationship, currentID }) => {\n if (!relationship.following) {\n renderFamiliarFollowers(currentID);\n if (!standalone && statusesCount > 0) {\n // Only render posting stats if not standalone and has posts\n renderPostingStats();\n }\n }\n },\n [standalone, id, statusesCount],\n );\n\n return (\n <div\n tabIndex=\"-1\"\n class={`account-container ${uiState === 'loading' ? 'skeleton' : ''}`}\n style={{\n '--header-color-1': headerCornerColors[0],\n '--header-color-2': headerCornerColors[1],\n '--header-color-3': headerCornerColors[2],\n '--header-color-4': headerCornerColors[3],\n }}\n >\n {uiState === 'error' && (\n <div class=\"ui-state\">\n <p>Unable to load account.</p>\n <p>\n <a\n href={isString ? account : url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Go to account page <Icon icon=\"external\" />\n </a>\n </p>\n </div>\n )}\n {uiState === 'loading' ? (\n <>\n <header>\n <AccountBlock avatarSize=\"xxxl\" skeleton />\n </header>\n <main>\n <div class=\"note\">\n <p>███████ ████ ████</p>\n <p>████ ████████ ██████ █████████ ████ ██</p>\n </div>\n <div class=\"account-metadata-box\">\n <div class=\"profile-metadata\">\n <div class=\"profile-field\">\n <b class=\"more-insignificant\">███</b>\n <p>██████</p>\n </div>\n <div class=\"profile-field\">\n <b class=\"more-insignificant\">████</b>\n <p>███████████</p>\n </div>\n </div>\n <div class=\"stats\">\n <div>\n <span>██</span> Followers\n </div>\n <div>\n <span>██</span> Following\n </div>\n <div>\n <span>██</span> Posts\n </div>\n </div>\n </div>\n <div class=\"actions\">\n <span />\n <span class=\"buttons\">\n <button type=\"button\" title=\"More\" class=\"plain\" disabled>\n <Icon icon=\"more\" size=\"l\" alt=\"More\" />\n </button>\n </span>\n </div>\n </main>\n </>\n ) : (\n info && (\n <>\n {!!moved && (\n <div class=\"account-moved\">\n <p>\n <b>{displayName}</b> has indicated that their new account is\n now:\n </p>\n <AccountBlock\n account={moved}\n instance={instance}\n onClick={(e) => {\n e.stopPropagation();\n states.showAccount = moved;\n }}\n />\n </div>\n )}\n {!!header && !/missing\\.png$/.test(header) && (\n <img\n src={header}\n alt=\"\"\n class={`header-banner ${\n headerIsAvatar ? 'header-is-avatar' : ''\n }`}\n onError={(e) => {\n if (e.target.crossOrigin) {\n if (e.target.src !== headerStatic) {\n e.target.src = headerStatic;\n } else {\n e.target.removeAttribute('crossorigin');\n e.target.src = header;\n }\n } else if (e.target.src !== headerStatic) {\n e.target.src = headerStatic;\n } else {\n e.target.remove();\n }\n }}\n crossOrigin=\"anonymous\"\n onLoad={(e) => {\n e.target.classList.add('loaded');\n try {\n // Get color from four corners of image\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d', {\n willReadFrequently: true,\n });\n canvas.width = e.target.width;\n canvas.height = e.target.height;\n ctx.drawImage(e.target, 0, 0);\n // const colors = [\n // ctx.getImageData(0, 0, 1, 1).data,\n // ctx.getImageData(e.target.width - 1, 0, 1, 1).data,\n // ctx.getImageData(0, e.target.height - 1, 1, 1).data,\n // ctx.getImageData(\n // e.target.width - 1,\n // e.target.height - 1,\n // 1,\n // 1,\n // ).data,\n // ];\n // Get 10x10 pixels from corners, get average color from each\n const pixelDimension = 10;\n const colors = [\n ctx.getImageData(0, 0, pixelDimension, pixelDimension)\n .data,\n ctx.getImageData(\n e.target.width - pixelDimension,\n 0,\n pixelDimension,\n pixelDimension,\n ).data,\n ctx.getImageData(\n 0,\n e.target.height - pixelDimension,\n pixelDimension,\n pixelDimension,\n ).data,\n ctx.getImageData(\n e.target.width - pixelDimension,\n e.target.height - pixelDimension,\n pixelDimension,\n pixelDimension,\n ).data,\n ].map((data) => {\n let r = 0;\n let g = 0;\n let b = 0;\n let a = 0;\n for (let i = 0; i < data.length; i += 4) {\n r += data[i];\n g += data[i + 1];\n b += data[i + 2];\n a += data[i + 3];\n }\n const dataLength = data.length / 4;\n return [\n r / dataLength,\n g / dataLength,\n b / dataLength,\n a / dataLength,\n ];\n });\n const rgbColors = colors.map((color) => {\n const [r, g, b, a] = lightenRGB(color);\n return `rgba(${r}, ${g}, ${b}, ${a})`;\n });\n setHeaderCornerColors(rgbColors);\n console.log({ colors, rgbColors });\n } catch (e) {\n // Silently fail\n }\n }}\n />\n )}\n <header>\n <AccountBlock\n account={info}\n instance={instance}\n avatarSize=\"xxxl\"\n external={standalone}\n internal={!standalone}\n />\n </header>\n <div class=\"faux-header-bg\" aria-hidden=\"true\" />\n <main>\n {!!memorial && <span class=\"tag\">In Memoriam</span>}\n {!!bot && (\n <span class=\"tag\">\n <Icon icon=\"bot\" /> Automated\n </span>\n )}\n {!!group && (\n <span class=\"tag\">\n <Icon icon=\"group\" /> Group\n </span>\n )}\n {roles?.map((role) => (\n <span class=\"tag\">\n {role.name}\n {!!accountInstance && (\n <>\n {' '}\n <span class=\"more-insignificant\">{accountInstance}</span>\n </>\n )}\n </span>\n ))}\n <div\n class=\"note\"\n dir=\"auto\"\n onClick={handleContentLinks({\n instance: currentInstance,\n })}\n dangerouslySetInnerHTML={{\n __html: enhanceContent(note, { emojis }),\n }}\n />\n <div class=\"account-metadata-box\">\n {fields?.length > 0 && (\n <div class=\"profile-metadata\">\n {fields.map(({ name, value, verifiedAt }, i) => (\n <div\n class={`profile-field ${\n verifiedAt ? 'profile-verified' : ''\n }`}\n key={name + i}\n dir=\"auto\"\n >\n <b>\n <EmojiText text={name} emojis={emojis} />{' '}\n {!!verifiedAt && (\n <Icon icon=\"check-circle\" size=\"s\" />\n )}\n </b>\n <p\n dangerouslySetInnerHTML={{\n __html: enhanceContent(value, { emojis }),\n }}\n />\n </div>\n ))}\n </div>\n )}\n <div class=\"stats\">\n <LinkOrDiv\n tabIndex={0}\n to={accountLink}\n onClick={() => {\n // states.showAccount = false;\n setTimeout(() => {\n states.showGenericAccounts = {\n heading: 'Followers',\n fetchAccounts: fetchFollowers,\n instance,\n excludeRelationshipAttrs: isSelf\n ? ['followedBy']\n : [],\n };\n }, 0);\n }}\n >\n {!!familiarFollowers.length && (\n <span class=\"shazam-container-horizontal\">\n <span class=\"shazam-container-inner stats-avatars-bunch\">\n {familiarFollowers.map((follower) => (\n <Avatar\n url={follower.avatarStatic}\n size=\"s\"\n alt={`${follower.displayName} @${follower.acct}`}\n squircle={follower?.bot}\n />\n ))}\n </span>\n </span>\n )}\n <span title={followersCount}>\n {shortenNumber(followersCount)}\n </span>{' '}\n Followers\n </LinkOrDiv>\n <LinkOrDiv\n class=\"insignificant\"\n tabIndex={0}\n to={accountLink}\n onClick={() => {\n // states.showAccount = false;\n setTimeout(() => {\n states.showGenericAccounts = {\n heading: 'Following',\n fetchAccounts: fetchFollowing,\n instance,\n excludeRelationshipAttrs: isSelf ? ['following'] : [],\n };\n }, 0);\n }}\n >\n <span title={followingCount}>\n {shortenNumber(followingCount)}\n </span>{' '}\n Following\n <br />\n </LinkOrDiv>\n <LinkOrDiv\n class=\"insignificant\"\n to={accountLink}\n // onClick={\n // standalone\n // ? undefined\n // : () => {\n // hideAllModals();\n // }\n // }\n >\n <span title={statusesCount}>\n {shortenNumber(statusesCount)}\n </span>{' '}\n Posts\n </LinkOrDiv>\n {!!createdAt && (\n <div class=\"insignificant\">\n Joined{' '}\n <time datetime={createdAt}>\n {niceDateTime(createdAt, {\n hideTime: true,\n })}\n </time>\n </div>\n )}\n </div>\n </div>\n {!!postingStats && (\n <LinkOrDiv\n to={accountLink}\n class=\"account-metadata-box\"\n // onClick={() => {\n // states.showAccount = false;\n // }}\n >\n <div class=\"shazam-container\">\n <div class=\"shazam-container-inner\">\n {hasPostingStats ? (\n <div\n class=\"posting-stats\"\n title={`${Math.round(\n (postingStats.originals / postingStats.total) * 100,\n )}% original posts, ${Math.round(\n (postingStats.replies / postingStats.total) * 100,\n )}% replies, ${Math.round(\n (postingStats.boosts / postingStats.total) * 100,\n )}% boosts`}\n >\n <div>\n {postingStats.daysSinceLastPost < 365\n ? `Last ${postingStats.total} post${\n postingStats.total > 1 ? 's' : ''\n } in the past \n ${postingStats.daysSinceLastPost} day${\n postingStats.daysSinceLastPost > 1 ? 's' : ''\n }`\n : `\n Last ${postingStats.total} posts in the past year(s)\n `}\n </div>\n <div\n class=\"posting-stats-bar\"\n style={{\n // [originals | replies | boosts]\n '--originals-percentage': `${\n (postingStats.originals / postingStats.total) *\n 100\n }%`,\n '--replies-percentage': `${\n ((postingStats.originals +\n postingStats.replies) /\n postingStats.total) *\n 100\n }%`,\n }}\n />\n <div class=\"posting-stats-legends\">\n <span class=\"ib\">\n <span class=\"posting-stats-legend-item posting-stats-legend-item-originals\" />{' '}\n Original\n </span>{' '}\n <span class=\"ib\">\n <span class=\"posting-stats-legend-item posting-stats-legend-item-replies\" />{' '}\n Replies\n </span>{' '}\n <span class=\"ib\">\n <span class=\"posting-stats-legend-item posting-stats-legend-item-boosts\" />{' '}\n Boosts\n </span>\n </div>\n </div>\n ) : (\n <div class=\"posting-stats\">Post stats unavailable.</div>\n )}\n </div>\n </div>\n </LinkOrDiv>\n )}\n <div class=\"account-metadata-box\">\n <div\n class=\"shazam-container no-animation\"\n hidden={!!postingStats}\n >\n <div class=\"shazam-container-inner\">\n <button\n type=\"button\"\n class=\"posting-stats-button\"\n disabled={postingStatsUIState === 'loading'}\n onClick={() => {\n renderPostingStats();\n }}\n >\n <div\n class={`posting-stats-bar posting-stats-icon ${\n postingStatsUIState === 'loading' ? 'loading' : ''\n }`}\n style={{\n '--originals-percentage': '33%',\n '--replies-percentage': '66%',\n }}\n />\n View post stats{' '}\n {/* <Loader\n abrupt\n hidden={postingStatsUIState !== 'loading'}\n /> */}\n </button>\n </div>\n </div>\n </div>\n </main>\n <footer>\n <RelatedActions\n info={info}\n instance={instance}\n authenticated={authenticated}\n onRelationshipChange={onRelationshipChange}\n />\n </footer>\n </>\n )\n )}\n </div>\n );\n}\n\nconst FAMILIAR_FOLLOWERS_LIMIT = 3;\n\nfunction RelatedActions({\n info,\n instance,\n authenticated,\n onRelationshipChange = () => {},\n}) {\n if (!info) return null;\n const {\n masto: currentMasto,\n instance: currentInstance,\n authenticated: currentAuthenticated,\n } = api();\n const sameInstance = instance === currentInstance;\n\n const [relationshipUIState, setRelationshipUIState] = useState('default');\n const [relationship, setRelationship] = useState(null);\n\n const { id, acct, url, username, locked, lastStatusAt, note, fields, moved } =\n info;\n const accountID = useRef(id);\n\n const {\n following,\n showingReblogs,\n notifying,\n followedBy,\n blocking,\n blockedBy,\n muting,\n mutingNotifications,\n requested,\n domainBlocking,\n endorsed,\n note: privateNote,\n } = relationship || {};\n\n const [currentInfo, setCurrentInfo] = useState(null);\n const [isSelf, setIsSelf] = useState(false);\n\n useEffect(() => {\n if (info) {\n const currentAccount = store.session.get('currentAccount');\n let currentID;\n (async () => {\n if (sameInstance && authenticated) {\n currentID = id;\n } else if (!sameInstance && currentAuthenticated) {\n // Grab this account from my logged-in instance\n const acctHasInstance = info.acct.includes('@');\n try {\n const results = await currentMasto.v2.search.fetch({\n q: acctHasInstance ? info.acct : `${info.username}@${instance}`,\n type: 'accounts',\n limit: 1,\n resolve: true,\n });\n console.log('🥏 Fetched account from logged-in instance', results);\n if (results.accounts.length) {\n currentID = results.accounts[0].id;\n setCurrentInfo(results.accounts[0]);\n }\n } catch (e) {\n console.error(e);\n }\n }\n\n if (!currentID) return;\n\n if (currentAccount === currentID) {\n // It's myself!\n setIsSelf(true);\n return;\n }\n\n accountID.current = currentID;\n\n if (moved) return;\n\n setRelationshipUIState('loading');\n\n const fetchRelationships = currentMasto.v1.accounts.relationships.fetch(\n {\n id: [currentID],\n },\n );\n\n try {\n const relationships = await fetchRelationships;\n console.log('fetched relationship', relationships);\n setRelationshipUIState('default');\n\n if (relationships.length) {\n const relationship = relationships[0];\n setRelationship(relationship);\n onRelationshipChange({ relationship, currentID });\n }\n } catch (e) {\n console.error(e);\n setRelationshipUIState('error');\n }\n })();\n }\n }, [info, authenticated]);\n\n useEffect(() => {\n if (info && isSelf) {\n updateAccount(info);\n }\n }, [info, isSelf]);\n\n const loading = relationshipUIState === 'loading';\n\n const [showTranslatedBio, setShowTranslatedBio] = useState(false);\n const [showAddRemoveLists, setShowAddRemoveLists] = useState(false);\n const [showPrivateNoteModal, setShowPrivateNoteModal] = useState(false);\n\n return (\n <>\n <div class=\"actions\">\n <span>\n {followedBy ? (\n <span class=\"tag\">Follows you</span>\n ) : !!lastStatusAt ? (\n <small class=\"insignificant\">\n Last post:{' '}\n <span class=\"ib\">\n {niceDateTime(lastStatusAt, {\n hideTime: true,\n })}\n </span>\n </small>\n ) : (\n <span />\n )}\n {muting && <span class=\"tag danger\">Muted</span>}\n {blocking && <span class=\"tag danger\">Blocked</span>}\n </span>{' '}\n <span class=\"buttons\">\n {!!privateNote && (\n <button\n type=\"button\"\n class=\"private-note-tag\"\n title=\"Private note\"\n onClick={() => {\n setShowPrivateNoteModal(true);\n }}\n dir=\"auto\"\n >\n <span>{privateNote}</span>\n </button>\n )}\n <Menu2\n portal={{\n target: document.body,\n }}\n containerProps={{\n style: {\n // Higher than the backdrop\n zIndex: 1001,\n },\n }}\n align=\"center\"\n position=\"anchor\"\n overflow=\"auto\"\n menuButton={\n <button\n type=\"button\"\n title=\"More\"\n class=\"plain\"\n disabled={loading}\n >\n <Icon icon=\"more\" size=\"l\" alt=\"More\" />\n </button>\n }\n >\n {currentAuthenticated && !isSelf && (\n <>\n <MenuItem\n onClick={() => {\n states.showCompose = {\n draftStatus: {\n status: `@${currentInfo?.acct || acct} `,\n },\n };\n }}\n >\n <Icon icon=\"at\" />\n <span>Mention @{username}</span>\n </MenuItem>\n <MenuItem\n onClick={() => {\n setShowTranslatedBio(true);\n }}\n >\n <Icon icon=\"translate\" />\n <span>Translate bio</span>\n </MenuItem>\n <MenuItem\n onClick={() => {\n setShowPrivateNoteModal(true);\n }}\n >\n <Icon icon=\"pencil\" />\n <span>\n {privateNote ? 'Edit private note' : 'Add private note'}\n </span>\n </MenuItem>\n {/* Add/remove from lists is only possible if following the account */}\n {following && (\n <MenuItem\n onClick={() => {\n setShowAddRemoveLists(true);\n }}\n >\n <Icon icon=\"list\" />\n <span>Add/remove from Lists</span>\n </MenuItem>\n )}\n <MenuDivider />\n </>\n )}\n <MenuItem href={url} target=\"_blank\">\n <Icon icon=\"external\" />\n <small class=\"menu-double-lines\">{niceAccountURL(url)}</small>\n </MenuItem>\n <div class=\"menu-horizontal\">\n <MenuItem\n onClick={() => {\n // Copy url to clipboard\n try {\n navigator.clipboard.writeText(url);\n showToast('Link copied');\n } catch (e) {\n console.error(e);\n showToast('Unable to copy link');\n }\n }}\n >\n <Icon icon=\"link\" />\n <span>Copy</span>\n </MenuItem>\n {navigator?.share &&\n navigator?.canShare?.({\n url,\n }) && (\n <MenuItem\n onClick={() => {\n try {\n navigator.share({\n url,\n });\n } catch (e) {\n console.error(e);\n alert(\"Sharing doesn't seem to work.\");\n }\n }}\n >\n <Icon icon=\"share\" />\n <span>Share…</span>\n </MenuItem>\n )}\n </div>\n {!!relationship && (\n <>\n <MenuDivider />\n {muting ? (\n <MenuItem\n onClick={() => {\n setRelationshipUIState('loading');\n (async () => {\n try {\n const newRelationship = await currentMasto.v1.accounts\n .$select(currentInfo?.id || id)\n .unmute();\n console.log('unmuting', newRelationship);\n setRelationship(newRelationship);\n setRelationshipUIState('default');\n showToast(`Unmuted @${username}`);\n states.reloadGenericAccounts.id = 'mute';\n states.reloadGenericAccounts.counter++;\n } catch (e) {\n console.error(e);\n setRelationshipUIState('error');\n }\n })();\n }}\n >\n <Icon icon=\"unmute\" />\n <span>Unmute @{username}</span>\n </MenuItem>\n ) : (\n <SubMenu\n openTrigger=\"clickOnly\"\n direction=\"bottom\"\n overflow=\"auto\"\n shift={16}\n label={\n <>\n <Icon icon=\"mute\" />\n <span class=\"menu-grow\">Mute @{username}…</span>\n <span\n style={{\n textOverflow: 'clip',\n }}\n >\n <Icon icon=\"time\" />\n <Icon icon=\"chevron-right\" />\n </span>\n </>\n }\n >\n <div class=\"menu-wrap\">\n {MUTE_DURATIONS.map((duration) => (\n <MenuItem\n onClick={() => {\n setRelationshipUIState('loading');\n (async () => {\n try {\n const newRelationship =\n await currentMasto.v1.accounts\n .$select(currentInfo?.id || id)\n .mute({\n duration,\n });\n console.log('muting', newRelationship);\n setRelationship(newRelationship);\n setRelationshipUIState('default');\n showToast(\n `Muted @${username} for ${MUTE_DURATIONS_LABELS[duration]}`,\n );\n states.reloadGenericAccounts.id = 'mute';\n states.reloadGenericAccounts.counter++;\n } catch (e) {\n console.error(e);\n setRelationshipUIState('error');\n showToast(`Unable to mute @${username}`);\n }\n })();\n }}\n >\n {MUTE_DURATIONS_LABELS[duration]}\n </MenuItem>\n ))}\n </div>\n </SubMenu>\n )}\n <MenuConfirm\n subMenu\n confirm={!blocking}\n confirmLabel={\n <>\n <Icon icon=\"block\" />\n <span>Block @{username}?</span>\n </>\n }\n menuItemClassName=\"danger\"\n onClick={() => {\n // if (!blocking && !confirm(`Block @${username}?`)) {\n // return;\n // }\n setRelationshipUIState('loading');\n (async () => {\n try {\n if (blocking) {\n const newRelationship = await currentMasto.v1.accounts\n .$select(currentInfo?.id || id)\n .unblock();\n console.log('unblocking', newRelationship);\n setRelationship(newRelationship);\n setRelationshipUIState('default');\n showToast(`Unblocked @${username}`);\n } else {\n const newRelationship = await currentMasto.v1.accounts\n .$select(currentInfo?.id || id)\n .block();\n console.log('blocking', newRelationship);\n setRelationship(newRelationship);\n setRelationshipUIState('default');\n showToast(`Blocked @${username}`);\n }\n states.reloadGenericAccounts.id = 'block';\n states.reloadGenericAccounts.counter++;\n } catch (e) {\n console.error(e);\n setRelationshipUIState('error');\n if (blocking) {\n showToast(`Unable to unblock @${username}`);\n } else {\n showToast(`Unable to block @${username}`);\n }\n }\n })();\n }}\n >\n {blocking ? (\n <>\n <Icon icon=\"unblock\" />\n <span>Unblock @{username}</span>\n </>\n ) : (\n <>\n <Icon icon=\"block\" />\n <span>Block @{username}…</span>\n </>\n )}\n </MenuConfirm>\n {/* <MenuItem>\n <Icon icon=\"flag\" />\n <span>Report @{username}…</span>\n </MenuItem> */}\n </>\n )}\n </Menu2>\n {!relationship && relationshipUIState === 'loading' && (\n <Loader abrupt />\n )}\n {!!relationship && (\n <MenuConfirm\n confirm={following || requested}\n confirmLabel={\n <span>\n {requested\n ? 'Withdraw follow request?'\n : `Unfollow @${info.acct || info.username}?`}\n </span>\n }\n menuItemClassName=\"danger\"\n align=\"end\"\n disabled={loading}\n onClick={() => {\n setRelationshipUIState('loading');\n (async () => {\n try {\n let newRelationship;\n\n if (following || requested) {\n // const yes = confirm(\n // requested\n // ? 'Withdraw follow request?'\n // : `Unfollow @${info.acct || info.username}?`,\n // );\n\n // if (yes) {\n newRelationship = await currentMasto.v1.accounts\n .$select(accountID.current)\n .unfollow();\n // }\n } else {\n newRelationship = await currentMasto.v1.accounts\n .$select(accountID.current)\n .follow();\n }\n\n if (newRelationship) setRelationship(newRelationship);\n setRelationshipUIState('default');\n } catch (e) {\n alert(e);\n setRelationshipUIState('error');\n }\n })();\n }}\n >\n <button\n type=\"button\"\n class={`${following || requested ? 'light swap' : ''}`}\n data-swap-state={following || requested ? 'danger' : ''}\n disabled={loading}\n >\n {following ? (\n <>\n <span>Following</span>\n <span>Unfollow…</span>\n </>\n ) : requested ? (\n <>\n <span>Requested</span>\n <span>Withdraw…</span>\n </>\n ) : locked ? (\n <>\n <Icon icon=\"lock\" /> <span>Follow</span>\n </>\n ) : (\n 'Follow'\n )}\n </button>\n </MenuConfirm>\n )}\n </span>\n </div>\n {!!showTranslatedBio && (\n <Modal\n class=\"light\"\n onClose={() => {\n setShowTranslatedBio(false);\n }}\n >\n <TranslatedBioSheet\n note={note}\n fields={fields}\n onClose={() => setShowTranslatedBio(false)}\n />\n </Modal>\n )}\n {!!showAddRemoveLists && (\n <Modal\n class=\"light\"\n onClose={() => {\n setShowAddRemoveLists(false);\n }}\n >\n <AddRemoveListsSheet\n accountID={accountID.current}\n onClose={() => setShowAddRemoveLists(false)}\n />\n </Modal>\n )}\n {!!showPrivateNoteModal && (\n <Modal\n class=\"light\"\n onClose={() => {\n setShowPrivateNoteModal(false);\n }}\n >\n <PrivateNoteSheet\n account={info}\n note={privateNote}\n onRelationshipChange={(relationship) => {\n setRelationship(relationship);\n // onRelationshipChange({ relationship, currentID: accountID.current });\n }}\n onClose={() => setShowPrivateNoteModal(false)}\n />\n </Modal>\n )}\n </>\n );\n}\n\n// Apply more alpha if high luminence\nfunction lightenRGB([r, g, b]) {\n const luminence = 0.2126 * r + 0.7152 * g + 0.0722 * b;\n console.log('luminence', luminence);\n let alpha;\n if (luminence >= 220) {\n alpha = 1;\n } else if (luminence <= 50) {\n alpha = 0.1;\n } else {\n alpha = luminence / 255;\n }\n alpha = Math.min(1, alpha);\n return [r, g, b, alpha];\n}\n\nfunction niceAccountURL(url) {\n if (!url) return;\n const urlObj = new URL(url);\n const { host, pathname } = urlObj;\n const path = pathname.replace(/\\/$/, '').replace(/^\\//, '');\n return (\n <>\n <span class=\"more-insignificant\">{host}/</span>\n <wbr />\n <span>{path}</span>\n </>\n );\n}\n\nfunction TranslatedBioSheet({ note, fields, onClose }) {\n const fieldsText =\n fields\n ?.map(({ name, value }) => `${name}\\n${getHTMLText(value)}`)\n .join('\\n\\n') || '';\n\n const text = getHTMLText(note) + (fieldsText ? `\\n\\n${fieldsText}` : '');\n\n return (\n <div class=\"sheet\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" />\n </button>\n )}\n <header>\n <h2>Translated Bio</h2>\n </header>\n <main>\n <p\n style={{\n whiteSpace: 'pre-wrap',\n }}\n >\n {text}\n </p>\n <TranslationBlock forceTranslate text={text} />\n </main>\n </div>\n );\n}\n\nfunction AddRemoveListsSheet({ accountID, onClose }) {\n const { masto } = api();\n const [uiState, setUIState] = useState('default');\n const [lists, setLists] = useState([]);\n const [listsContainingAccount, setListsContainingAccount] = useState([]);\n const [reloadCount, reload] = useReducer((c) => c + 1, 0);\n\n useEffect(() => {\n setUIState('loading');\n (async () => {\n try {\n const lists = await masto.v1.lists.list();\n lists.sort((a, b) => a.title.localeCompare(b.title));\n const listsContainingAccount = await masto.v1.accounts\n .$select(accountID)\n .lists.list();\n console.log({ lists, listsContainingAccount });\n setLists(lists);\n setListsContainingAccount(listsContainingAccount);\n setUIState('default');\n } catch (e) {\n console.error(e);\n setUIState('error');\n }\n })();\n }, [reloadCount]);\n\n const [showListAddEditModal, setShowListAddEditModal] = useState(false);\n\n return (\n <div class=\"sheet\" id=\"list-add-remove-container\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" />\n </button>\n )}\n <header>\n <h2>Add/Remove from Lists</h2>\n </header>\n <main>\n {lists.length > 0 ? (\n <ul class=\"list-add-remove\">\n {lists.map((list) => {\n const inList = listsContainingAccount.some(\n (l) => l.id === list.id,\n );\n return (\n <li>\n <button\n type=\"button\"\n class={`light ${inList ? 'checked' : ''}`}\n disabled={uiState === 'loading'}\n onClick={() => {\n setUIState('loading');\n (async () => {\n try {\n if (inList) {\n await masto.v1.lists\n .$select(list.id)\n .accounts.remove({\n accountIds: [accountID],\n });\n } else {\n await masto.v1.lists\n .$select(list.id)\n .accounts.create({\n accountIds: [accountID],\n });\n }\n // setUIState('default');\n reload();\n } catch (e) {\n console.error(e);\n setUIState('error');\n alert(\n inList\n ? 'Unable to remove from list.'\n : 'Unable to add to list.',\n );\n }\n })();\n }}\n >\n <Icon icon=\"check-circle\" />\n <span>{list.title}</span>\n </button>\n </li>\n );\n })}\n </ul>\n ) : uiState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n ) : uiState === 'error' ? (\n <p class=\"ui-state\">Unable to load lists.</p>\n ) : (\n <p class=\"ui-state\">No lists.</p>\n )}\n <button\n type=\"button\"\n class=\"plain2\"\n onClick={() => setShowListAddEditModal(true)}\n disabled={uiState !== 'default'}\n >\n <Icon icon=\"plus\" size=\"l\" /> <span>New list</span>\n </button>\n </main>\n {showListAddEditModal && (\n <Modal\n class=\"light\"\n onClick={(e) => {\n if (e.target === e.currentTarget) {\n setShowListAddEditModal(false);\n }\n }}\n >\n <ListAddEdit\n list={showListAddEditModal?.list}\n onClose={(result) => {\n if (result.state === 'success') {\n reload();\n }\n setShowListAddEditModal(false);\n }}\n />\n </Modal>\n )}\n </div>\n );\n}\n\nfunction PrivateNoteSheet({\n account,\n note: initialNote,\n onRelationshipChange = () => {},\n onClose = () => {},\n}) {\n const { masto } = api();\n const [uiState, setUIState] = useState('default');\n const textareaRef = useRef(null);\n\n useEffect(() => {\n let timer;\n if (textareaRef.current && !initialNote) {\n timer = setTimeout(() => {\n textareaRef.current.focus?.();\n }, 100);\n }\n return () => {\n clearTimeout(timer);\n };\n }, []);\n\n return (\n <div class=\"sheet\" id=\"private-note-container\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" />\n </button>\n )}\n <header>\n <b>Private note about @{account?.username || account?.acct}</b>\n </header>\n <main>\n <form\n onSubmit={(e) => {\n e.preventDefault();\n const formData = new FormData(e.target);\n const note = formData.get('note');\n if (note?.trim() !== initialNote?.trim()) {\n setUIState('loading');\n (async () => {\n try {\n const newRelationship = await masto.v1.accounts\n .$select(account?.id)\n .note.create({\n comment: note,\n });\n console.log('updated relationship', newRelationship);\n setUIState('default');\n onRelationshipChange(newRelationship);\n onClose();\n } catch (e) {\n console.error(e);\n setUIState('error');\n alert(e?.message || 'Unable to update private note.');\n }\n })();\n }\n }}\n >\n <textarea\n ref={textareaRef}\n name=\"note\"\n disabled={uiState === 'loading'}\n >\n {initialNote}\n </textarea>\n <footer>\n <button\n type=\"button\"\n class=\"light\"\n disabled={uiState === 'loading'}\n onClick={() => {\n onClose?.();\n }}\n >\n Cancel\n </button>\n <span>\n <Loader abrupt hidden={uiState !== 'loading'} />\n <button disabled={uiState === 'loading'} type=\"submit\">\n Save & close\n </button>\n </span>\n </footer>\n </form>\n </main>\n </div>\n );\n}\n\nexport default AccountInfo;\n","import { useEffect } from 'preact/hooks';\n\nimport { api } from '../utils/api';\nimport states from '../utils/states';\nimport useLocationChange from '../utils/useLocationChange';\n\nimport AccountInfo from './account-info';\nimport Icon from './icon';\n\nfunction AccountSheet({ account, instance: propInstance, onClose }) {\n const { masto, instance, authenticated } = api({ instance: propInstance });\n const isString = typeof account === 'string';\n\n useEffect(() => {\n if (!isString) {\n states.accounts[`${account.id}@${instance}`] = account;\n }\n }, [account]);\n\n useLocationChange(onClose);\n\n return (\n <div\n class=\"sheet\"\n // onClick={(e) => {\n // const accountBlock = e.target.closest('.account-block');\n // if (accountBlock) {\n // onClose({\n // destination: 'account-statuses',\n // });\n // }\n // }}\n >\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close outer\" onClick={onClose}>\n <Icon icon=\"x\" />\n </button>\n )}\n <AccountInfo\n instance={instance}\n authenticated={authenticated}\n account={account}\n fetchAccount={async () => {\n if (isString) {\n try {\n const info = await masto.v1.accounts.lookup({\n acct: account,\n skip_webfinger: false,\n });\n return info;\n } catch (e) {\n const result = await masto.v2.search.fetch({\n q: account,\n type: 'accounts',\n limit: 1,\n resolve: authenticated,\n });\n if (result.accounts.length) {\n return result.accounts[0];\n } else if (/https?:\\/\\/[^/]+\\/@/.test(account)) {\n const accountURL = new URL(account);\n const acct = accountURL.pathname.replace(/^\\//, '');\n const result = await masto.v2.search.fetch({\n q: acct,\n type: 'accounts',\n limit: 1,\n resolve: authenticated,\n });\n if (result.accounts.length) {\n return result.accounts[0];\n }\n }\n }\n } else {\n return account;\n }\n }}\n />\n </div>\n );\n}\n\nexport default AccountSheet;\n","import './drafts.css';\n\nimport { useEffect, useMemo, useReducer, useState } from 'react';\n\nimport { api } from '../utils/api';\nimport db from '../utils/db';\nimport niceDateTime from '../utils/nice-date-time';\nimport states from '../utils/states';\nimport { getCurrentAccountNS } from '../utils/store-utils';\n\nimport Icon from './icon';\nimport Loader from './loader';\nimport MenuConfirm from './menu-confirm';\n\nfunction Drafts({ onClose }) {\n const { masto } = api();\n const [uiState, setUIState] = useState('default');\n const [drafts, setDrafts] = useState([]);\n const [reloadCount, reload] = useReducer((c) => c + 1, 0);\n\n useEffect(() => {\n setUIState('loading');\n (async () => {\n try {\n const keys = await db.drafts.keys();\n if (keys.length) {\n const ns = getCurrentAccountNS();\n const ownKeys = keys.filter((key) => key.startsWith(ns));\n if (ownKeys.length) {\n const drafts = await db.drafts.getMany(ownKeys);\n drafts.sort(\n (a, b) =>\n new Date(b.updatedAt).getTime() -\n new Date(a.updatedAt).getTime(),\n );\n setDrafts(drafts);\n } else {\n setDrafts([]);\n }\n } else {\n setDrafts([]);\n }\n setUIState('default');\n } catch (e) {\n console.error(e);\n setUIState('error');\n }\n })();\n }, [reloadCount]);\n\n const hasDrafts = drafts?.length > 0;\n\n return (\n <div class=\"sheet\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" />\n </button>\n )}\n <header>\n <h2>\n Unsent drafts <Loader abrupt hidden={uiState !== 'loading'} />\n </h2>\n {hasDrafts && (\n <div class=\"insignificant\">\n Looks like you have unsent drafts. Let's continue where you left\n off.\n </div>\n )}\n </header>\n <main>\n {hasDrafts ? (\n <>\n <ul class=\"drafts-list\">\n {drafts.map((draft) => {\n const { updatedAt, key, draftStatus, replyTo } = draft;\n const updatedAtDate = new Date(updatedAt);\n return (\n <li key={updatedAt}>\n <div class=\"mini-draft-meta\">\n <b>\n <Icon icon={replyTo ? 'reply' : 'quill'} size=\"s\" />{' '}\n <time>\n {!!replyTo && (\n <>\n @{replyTo.account.acct}\n <br />\n </>\n )}\n {niceDateTime(updatedAtDate)}\n </time>\n </b>\n <MenuConfirm\n confirmLabel={<span>Delete this draft?</span>}\n menuItemClassName=\"danger\"\n align=\"end\"\n disabled={uiState === 'loading'}\n onClick={() => {\n (async () => {\n try {\n // const yes = confirm('Delete this draft?');\n // if (yes) {\n await db.drafts.del(key);\n reload();\n // }\n } catch (e) {\n alert('Error deleting draft! Please try again.');\n }\n })();\n }}\n >\n <button\n type=\"button\"\n class=\"small light\"\n disabled={uiState === 'loading'}\n >\n Delete…\n </button>\n </MenuConfirm>\n </div>\n <button\n type=\"button\"\n disabled={uiState === 'loading'}\n class=\"draft-item\"\n onClick={async () => {\n // console.log({ draftStatus });\n let replyToStatus;\n if (replyTo) {\n setUIState('loading');\n try {\n replyToStatus = await masto.v1.statuses\n .$select(replyTo.id)\n .fetch();\n } catch (e) {\n console.error(e);\n alert('Error fetching reply-to status!');\n setUIState('default');\n return;\n }\n setUIState('default');\n }\n window.__COMPOSE__ = {\n draftStatus,\n replyToStatus,\n };\n states.showCompose = true;\n states.showDrafts = false;\n }}\n >\n <MiniDraft draft={draft} />\n </button>\n </li>\n );\n })}\n </ul>\n {drafts.length > 1 && (\n <p>\n <MenuConfirm\n confirmLabel={<span>Delete all drafts?</span>}\n menuItemClassName=\"danger\"\n disabled={uiState === 'loading'}\n onClick={() => {\n (async () => {\n // const yes = confirm('Delete all drafts?');\n // if (yes) {\n setUIState('loading');\n try {\n await db.drafts.delMany(\n drafts.map((draft) => draft.key),\n );\n setUIState('default');\n reload();\n } catch (e) {\n console.error(e);\n alert('Error deleting drafts! Please try again.');\n setUIState('error');\n }\n // }\n })();\n }}\n >\n <button\n type=\"button\"\n class=\"light danger\"\n disabled={uiState === 'loading'}\n >\n Delete all…\n </button>\n </MenuConfirm>\n </p>\n )}\n </>\n ) : (\n <p>No drafts found.</p>\n )}\n </main>\n </div>\n );\n}\n\nfunction MiniDraft({ draft }) {\n const { draftStatus, replyTo } = draft;\n const { status, spoilerText, poll, mediaAttachments } = draftStatus;\n const hasPoll = poll?.options?.length > 0;\n const hasMedia = mediaAttachments?.length > 0;\n const hasPollOrMedia = hasPoll || hasMedia;\n const firstImageMedia = useMemo(() => {\n if (!hasMedia) return;\n const image = mediaAttachments.find((media) => /image/.test(media.type));\n if (!image) return;\n const { file } = image;\n const objectURL = URL.createObjectURL(file);\n return objectURL;\n }, [hasMedia, mediaAttachments]);\n return (\n <>\n <div class=\"mini-draft\">\n {hasPollOrMedia && (\n <div\n class={`mini-draft-aside ${firstImageMedia ? 'has-image' : ''}`}\n style={\n firstImageMedia\n ? {\n '--bg-image': `url(${firstImageMedia})`,\n }\n : {}\n }\n >\n {hasPoll && <Icon icon=\"poll\" />}\n {hasMedia && (\n <span>\n <Icon icon=\"attachment\" />{' '}\n <small>{mediaAttachments?.length}</small>\n </span>\n )}\n </div>\n )}\n <div class=\"mini-draft-main\">\n {!!spoilerText && <div class=\"mini-draft-spoiler\">{spoilerText}</div>}\n {!!status && <div class=\"mini-draft-status\">{status}</div>}\n </div>\n </div>\n </>\n );\n}\n\nexport default Drafts;\n","import { api } from './api';\nimport store from './store';\n\nexport async function fetchRelationships(accounts, relationshipsMap = {}) {\n if (!accounts?.length) return;\n const { masto } = api();\n\n const currentAccount = store.session.get('currentAccount');\n const uniqueAccountIds = accounts.reduce((acc, a) => {\n // 1. Ignore duplicate accounts\n // 2. Ignore accounts that are already inside relationshipsMap\n // 3. Ignore currently logged in account\n if (\n !acc.includes(a.id) &&\n !relationshipsMap[a.id] &&\n a.id !== currentAccount\n ) {\n acc.push(a.id);\n }\n return acc;\n }, []);\n if (!uniqueAccountIds.length) return null;\n\n try {\n const relationships = await masto.v1.accounts.relationships.fetch({\n id: uniqueAccountIds,\n });\n const newRelationshipsMap = relationships.reduce((acc, r) => {\n acc[r.id] = r;\n return acc;\n }, {});\n return newRelationshipsMap;\n } catch (e) {\n console.error(e);\n // It's okay to fail\n return null;\n }\n}\n","import './generic-accounts.css';\n\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport { InView } from 'react-intersection-observer';\nimport { useSnapshot } from 'valtio';\n\nimport { api } from '../utils/api';\nimport { fetchRelationships } from '../utils/relationships';\nimport states from '../utils/states';\nimport useLocationChange from '../utils/useLocationChange';\n\nimport AccountBlock from './account-block';\nimport Icon from './icon';\nimport Loader from './loader';\n\nexport default function GenericAccounts({\n instance,\n excludeRelationshipAttrs = [],\n onClose = () => {},\n}) {\n const { masto, instance: currentInstance } = api();\n const isCurrentInstance = instance ? instance === currentInstance : true;\n const snapStates = useSnapshot(states);\n ``;\n const [uiState, setUIState] = useState('default');\n const [accounts, setAccounts] = useState([]);\n const [showMore, setShowMore] = useState(false);\n\n useLocationChange(onClose);\n\n if (!snapStates.showGenericAccounts) {\n return null;\n }\n\n const {\n id,\n heading,\n fetchAccounts,\n accounts: staticAccounts,\n showReactions,\n } = snapStates.showGenericAccounts;\n\n const [relationshipsMap, setRelationshipsMap] = useState({});\n\n const loadRelationships = async (accounts) => {\n if (!accounts?.length) return;\n if (!isCurrentInstance) return;\n const relationships = await fetchRelationships(accounts, relationshipsMap);\n if (relationships) {\n setRelationshipsMap({\n ...relationshipsMap,\n ...relationships,\n });\n }\n };\n\n const loadAccounts = (firstLoad) => {\n if (!fetchAccounts) return;\n if (firstLoad) setAccounts([]);\n setUIState('loading');\n (async () => {\n try {\n const { done, value } = await fetchAccounts(firstLoad);\n if (Array.isArray(value)) {\n if (firstLoad) {\n const accounts = [];\n for (let i = 0; i < value.length; i++) {\n const account = value[i];\n const theAccount = accounts.find(\n (a, j) => a.id === account.id && i !== j,\n );\n if (!theAccount) {\n accounts.push({\n _types: [],\n ...account,\n });\n } else {\n theAccount._types.push(...account._types);\n }\n }\n setAccounts(accounts);\n } else {\n // setAccounts((prev) => [...prev, ...value]);\n // Merge accounts by id and _types\n setAccounts((prev) => {\n const newAccounts = prev;\n for (const account of value) {\n const theAccount = newAccounts.find((a) => a.id === account.id);\n if (!theAccount) {\n newAccounts.push(account);\n } else {\n theAccount._types.push(...account._types);\n }\n }\n return newAccounts;\n });\n }\n setShowMore(!done);\n\n loadRelationships(value);\n } else {\n setShowMore(false);\n }\n setUIState('default');\n } catch (e) {\n console.error(e);\n setUIState('error');\n }\n })();\n };\n\n const firstLoad = useRef(true);\n useEffect(() => {\n if (staticAccounts?.length > 0) {\n setAccounts(staticAccounts);\n loadRelationships(staticAccounts);\n } else {\n loadAccounts(true);\n firstLoad.current = false;\n }\n }, [staticAccounts, fetchAccounts]);\n\n useEffect(() => {\n if (firstLoad.current) return;\n // reloadGenericAccounts contains value like {id: 'mute', counter: 1}\n // We only need to reload if the id matches\n if (snapStates.reloadGenericAccounts?.id === id) {\n loadAccounts(true);\n }\n }, [snapStates.reloadGenericAccounts.counter]);\n\n return (\n <div id=\"generic-accounts-container\" class=\"sheet\" tabindex=\"-1\">\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" />\n </button>\n <header>\n <h2>{heading || 'Accounts'}</h2>\n </header>\n <main>\n {accounts.length > 0 ? (\n <>\n <ul class=\"accounts-list\">\n {accounts.map((account) => {\n const relationship = relationshipsMap[account.id];\n const key = `${account.id}-${account._types?.length || ''}`;\n return (\n <li key={key}>\n {showReactions && account._types?.length > 0 && (\n <div class=\"reactions-block\">\n {account._types.map((type) => (\n <Icon\n icon={\n {\n reblog: 'rocket',\n favourite: 'heart',\n }[type]\n }\n class={`${type}-icon`}\n />\n ))}\n </div>\n )}\n <div class=\"account-relationships\">\n <AccountBlock\n account={account}\n showStats\n relationship={relationship}\n excludeRelationshipAttrs={excludeRelationshipAttrs}\n />\n </div>\n </li>\n );\n })}\n </ul>\n {uiState === 'default' ? (\n showMore ? (\n <InView\n onChange={(inView) => {\n if (inView) {\n loadAccounts();\n }\n }}\n >\n <button\n type=\"button\"\n class=\"plain block\"\n onClick={() => loadAccounts()}\n >\n Show more…\n </button>\n </InView>\n ) : (\n <p class=\"ui-state insignificant\">The end.</p>\n )\n ) : (\n uiState === 'loading' && (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n )\n )}\n </>\n ) : uiState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n ) : uiState === 'error' ? (\n <p class=\"ui-state\">Error loading accounts</p>\n ) : (\n <p class=\"ui-state insignificant\">Nothing to show</p>\n )}\n </main>\n </div>\n );\n}\n","import { Menu, MenuItem } from '@szhsin/react-menu';\nimport { useState } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport getTranslateTargetLanguage from '../utils/get-translate-target-language';\nimport localeMatch from '../utils/locale-match';\nimport { speak, supportsTTS } from '../utils/speech';\nimport states from '../utils/states';\n\nimport Icon from './icon';\nimport Menu2 from './menu2';\nimport TranslationBlock from './translation-block';\n\nexport default function MediaAltModal({ alt, lang, onClose }) {\n const snapStates = useSnapshot(states);\n const [forceTranslate, setForceTranslate] = useState(false);\n const targetLanguage = getTranslateTargetLanguage(true);\n const contentTranslationHideLanguages =\n snapStates.settings.contentTranslationHideLanguages || [];\n const differentLanguage =\n !!lang &&\n lang !== targetLanguage &&\n !localeMatch([lang], [targetLanguage]) &&\n !contentTranslationHideLanguages.find(\n (l) => lang === l || localeMatch([lang], [l]),\n );\n\n return (\n <div class=\"sheet\" tabindex=\"-1\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close outer\" onClick={onClose}>\n <Icon icon=\"x\" />\n </button>\n )}\n <header class=\"header-grid\">\n <h2>Media description</h2>\n <div class=\"header-side\">\n <Menu2\n align=\"end\"\n menuButton={\n <button type=\"button\" class=\"plain4\">\n <Icon icon=\"more\" alt=\"More\" size=\"xl\" />\n </button>\n }\n >\n <MenuItem\n disabled={forceTranslate}\n onClick={() => {\n setForceTranslate(true);\n }}\n >\n <Icon icon=\"translate\" />\n <span>Translate</span>\n </MenuItem>\n {supportsTTS && (\n <MenuItem\n onClick={() => {\n speak(alt, lang);\n }}\n >\n <Icon icon=\"speak\" />\n <span>Speak</span>\n </MenuItem>\n )}\n </Menu2>\n </div>\n </header>\n <main lang={lang} dir=\"auto\">\n <p\n style={{\n whiteSpace: 'pre-wrap',\n textWrap: 'pretty',\n }}\n >\n {alt}\n </p>\n {(differentLanguage || forceTranslate) && (\n <TranslationBlock\n forceTranslate={forceTranslate}\n sourceLanguage={lang}\n text={alt}\n />\n )}\n </main>\n </div>\n );\n}\n","// https://gist.github.com/earthbound19/e7fe15fdf8ca3ef814750a61bc75b5ce\nfunction clamp(value, min, max) {\n return Math.max(Math.min(value, max), min);\n}\n\nconst gammaToLinear = (c) =>\n c >= 0.04045 ? Math.pow((c + 0.055) / 1.055, 2.4) : c / 12.92;\nconst linearToGamma = (c) =>\n c >= 0.0031308 ? 1.055 * Math.pow(c, 1 / 2.4) - 0.055 : 12.92 * c;\n\nexport function rgb2oklab([r, g, b]) {\n r = gammaToLinear(r / 255);\n g = gammaToLinear(g / 255);\n b = gammaToLinear(b / 255);\n var l = 0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b;\n var m = 0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b;\n var s = 0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b;\n l = Math.cbrt(l);\n m = Math.cbrt(m);\n s = Math.cbrt(s);\n return [\n l * +0.2104542553 + m * +0.793617785 + s * -0.0040720468,\n l * +1.9779984951 + m * -2.428592205 + s * +0.4505937099,\n l * +0.0259040371 + m * +0.7827717662 + s * -0.808675766,\n ];\n}\n\nexport function oklab2rgb([L, a, b]) {\n var l = L + a * +0.3963377774 + b * +0.2158037573;\n var m = L + a * -0.1055613458 + b * -0.0638541728;\n var s = L + a * -0.0894841775 + b * -1.291485548;\n // The ** operator here cubes; same as l_*l_*l_ in the C++ example:\n l = l ** 3;\n m = m ** 3;\n s = s ** 3;\n var r = l * +4.0767416621 + m * -3.3077115913 + s * +0.2309699292;\n var g = l * -1.2684380046 + m * +2.6097574011 + s * -0.3413193965;\n var b = l * -0.0041960863 + m * -0.7034186147 + s * +1.707614701;\n // Convert linear RGB values returned from oklab math to sRGB for our use before returning them:\n r = 255 * linearToGamma(r);\n g = 255 * linearToGamma(g);\n b = 255 * linearToGamma(b);\n // OPTION: clamp r g and b values to the range 0-255; but if you use the values immediately to draw, JavaScript clamps them on use:\n r = clamp(r, 0, 255);\n g = clamp(g, 0, 255);\n b = clamp(b, 0, 255);\n // OPTION: round the values. May not be necessary if you use them immediately for rendering in JavaScript, as JavaScript (also) discards decimals on render:\n r = Math.round(r);\n g = Math.round(g);\n b = Math.round(b);\n return [r, g, b];\n}\n","import { MenuDivider, MenuItem } from '@szhsin/react-menu';\nimport { getBlurHashAverageColor } from 'fast-blurhash';\nimport {\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\n\nimport { oklab2rgb, rgb2oklab } from '../utils/color-utils';\nimport showToast from '../utils/show-toast';\nimport states from '../utils/states';\n\nimport Icon from './icon';\nimport Link from './link';\nimport Media from './media';\nimport Menu2 from './menu2';\nimport MenuLink from './menu-link';\n\nconst { PHANPY_IMG_ALT_API_URL: IMG_ALT_API_URL } = import.meta.env;\n\nfunction MediaModal({\n mediaAttachments,\n statusID,\n instance,\n lang,\n index = 0,\n onClose = () => {},\n}) {\n const [uiState, setUIState] = useState('default');\n const carouselRef = useRef(null);\n\n const [currentIndex, setCurrentIndex] = useState(index);\n const carouselFocusItem = useRef(null);\n useLayoutEffect(() => {\n carouselFocusItem.current?.scrollIntoView();\n\n // history.pushState({ mediaModal: true }, '');\n // const handlePopState = (e) => {\n // if (e.state?.mediaModal) {\n // onClose();\n // }\n // };\n // window.addEventListener('popstate', handlePopState);\n // return () => {\n // window.removeEventListener('popstate', handlePopState);\n // };\n }, []);\n const prevStatusID = useRef(statusID);\n useEffect(() => {\n const scrollLeft = index * carouselRef.current.clientWidth;\n const differentStatusID = prevStatusID.current !== statusID;\n if (differentStatusID) prevStatusID.current = statusID;\n carouselRef.current.scrollTo({\n left: scrollLeft,\n behavior: differentStatusID ? 'auto' : 'smooth',\n });\n carouselRef.current.focus();\n }, [index, statusID]);\n\n const [showControls, setShowControls] = useState(true);\n\n useEffect(() => {\n let handleSwipe = () => {\n onClose();\n };\n if (carouselRef.current) {\n carouselRef.current.addEventListener('swiped-down', handleSwipe);\n }\n return () => {\n if (carouselRef.current) {\n carouselRef.current.removeEventListener('swiped-down', handleSwipe);\n }\n };\n }, []);\n\n useHotkeys(\n 'esc',\n onClose,\n {\n ignoreEventWhen: (e) => {\n const hasModal = !!document.querySelector('#modal-container > *');\n return hasModal;\n },\n },\n [onClose],\n );\n\n useEffect(() => {\n let handleScroll = () => {\n const { clientWidth, scrollLeft } = carouselRef.current;\n const index = Math.round(scrollLeft / clientWidth);\n setCurrentIndex(index);\n };\n if (carouselRef.current) {\n carouselRef.current.addEventListener('scroll', handleScroll, {\n passive: true,\n });\n }\n return () => {\n if (carouselRef.current) {\n carouselRef.current.removeEventListener('scroll', handleScroll);\n }\n };\n }, []);\n\n useEffect(() => {\n let timer = setTimeout(() => {\n carouselRef.current?.focus?.();\n }, 100);\n return () => clearTimeout(timer);\n }, []);\n\n const mediaAccentColors = useMemo(() => {\n return mediaAttachments?.map((media) => {\n const { blurhash } = media;\n if (blurhash) {\n const averageColor = getBlurHashAverageColor(blurhash);\n const labAverageColor = rgb2oklab(averageColor);\n return oklab2rgb([0.6, labAverageColor[1], labAverageColor[2]]);\n }\n return null;\n });\n }, [mediaAttachments]);\n const mediaAccentGradient = useMemo(() => {\n const gap = 5;\n const range = 100 / mediaAccentColors.length;\n return (\n mediaAccentColors\n ?.map((color, i) => {\n const start = i * range + gap;\n const end = (i + 1) * range - gap;\n if (color) {\n return `\n rgba(${color?.join(',')}, 0.4) ${start}%,\n rgba(${color?.join(',')}, 0.4) ${end}%\n `;\n }\n\n return `\n transparent ${start}%,\n transparent ${end}%\n `;\n })\n ?.join(', ') || 'transparent'\n );\n }, [mediaAccentColors]);\n\n let toastRef = useRef(null);\n useEffect(() => {\n return () => {\n toastRef.current?.hideToast?.();\n };\n }, []);\n\n return (\n <div\n class={`media-modal-container media-modal-count-${mediaAttachments?.length}`}\n >\n <div\n ref={carouselRef}\n tabIndex=\"0\"\n data-swipe-threshold=\"44\"\n class=\"carousel\"\n onClick={(e) => {\n if (\n e.target.classList.contains('carousel-item') ||\n e.target.classList.contains('media') ||\n e.target.classList.contains('media-zoom')\n ) {\n onClose();\n }\n }}\n style={\n mediaAttachments.length > 1\n ? {\n backgroundAttachment: 'local',\n backgroundImage: `linear-gradient(\n to right, ${mediaAccentGradient})`,\n }\n : {}\n }\n >\n {mediaAttachments?.map((media, i) => {\n const accentColor =\n mediaAttachments.length === 1 ? mediaAccentColors[i] : null;\n return (\n <div\n class=\"carousel-item\"\n style={\n accentColor\n ? {\n '--accent-color': `rgb(${accentColor?.join(',')})`,\n '--accent-alpha-color': `rgba(${accentColor?.join(\n ',',\n )}, 0.4)`,\n }\n : {}\n }\n tabindex=\"0\"\n key={media.id}\n ref={i === currentIndex ? carouselFocusItem : null}\n onClick={(e) => {\n // console.log(e);\n // if (e.target !== e.currentTarget) {\n // setShowControls(!showControls);\n // }\n if (!e.target.classList.contains('media')) {\n setShowControls(!showControls);\n }\n }}\n >\n {!!media.description && (\n <button\n type=\"button\"\n class=\"media-alt\"\n hidden={!showControls}\n onClick={() => {\n states.showMediaAlt = {\n alt: media.description,\n lang,\n };\n }}\n >\n <span class=\"alt-badge\">ALT</span>\n <span class=\"media-alt-desc\" lang={lang} dir=\"auto\">\n {media.description}\n </span>\n </button>\n )}\n <Media media={media} showOriginal lang={lang} />\n </div>\n );\n })}\n </div>\n <div class=\"carousel-top-controls\" hidden={!showControls}>\n <span>\n <button\n type=\"button\"\n class=\"carousel-button\"\n onClick={() => onClose()}\n >\n <Icon icon=\"x\" />\n </button>\n </span>\n {mediaAttachments?.length > 1 ? (\n <span class=\"carousel-dots\">\n {mediaAttachments?.map((media, i) => (\n <button\n key={media.id}\n type=\"button\"\n disabled={i === currentIndex}\n class={`carousel-dot ${i === currentIndex ? 'active' : ''}`}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n carouselRef.current.scrollTo({\n left: carouselRef.current.clientWidth * i,\n behavior: 'smooth',\n });\n carouselRef.current.focus();\n }}\n >\n <Icon icon=\"round\" size=\"s\" />\n </button>\n ))}\n </span>\n ) : (\n <span />\n )}\n <span>\n <Menu2\n overflow=\"auto\"\n align=\"end\"\n position=\"anchor\"\n gap={4}\n menuClassName=\"glass-menu\"\n menuButton={\n <button type=\"button\" class=\"carousel-button\">\n <Icon icon=\"more\" alt=\"More\" />\n </button>\n }\n >\n <MenuLink\n href={\n mediaAttachments[currentIndex]?.remoteUrl ||\n mediaAttachments[currentIndex]?.url\n }\n class=\"carousel-button\"\n target=\"_blank\"\n title=\"Open original media in new window\"\n >\n <Icon icon=\"popout\" />\n <span>Open original media</span>\n </MenuLink>\n {import.meta.env.DEV && // Only dev for now\n !!states.settings.mediaAltGenerator &&\n !!IMG_ALT_API_URL &&\n !!mediaAttachments[currentIndex]?.url &&\n !mediaAttachments[currentIndex]?.description &&\n mediaAttachments[currentIndex]?.type === 'image' && (\n <>\n <MenuDivider />\n <MenuItem\n disabled={uiState === 'loading'}\n onClick={() => {\n setUIState('loading');\n toastRef.current = showToast({\n text: 'Attempting to describe image. Please wait...',\n duration: -1,\n });\n (async function () {\n try {\n const response = await fetch(\n `${IMG_ALT_API_URL}?image=${encodeURIComponent(\n mediaAttachments[currentIndex]?.url,\n )}`,\n ).then((r) => r.json());\n states.showMediaAlt = {\n alt: response.description,\n };\n } catch (e) {\n console.error(e);\n showToast('Failed to describe image');\n } finally {\n setUIState('default');\n toastRef.current?.hideToast?.();\n }\n })();\n }}\n >\n <Icon icon=\"sparkles2\" />\n <span>Describe image…</span>\n </MenuItem>\n </>\n )}\n </Menu2>{' '}\n <Link\n to={`${instance ? `/${instance}` : ''}/s/${statusID}${\n window.matchMedia('(min-width: calc(40em + 350px))').matches\n ? `?media=${currentIndex + 1}`\n : ''\n }`}\n class=\"button carousel-button media-post-link\"\n // onClick={() => {\n // // if small screen (not media query min-width 40em + 350px), run onClose\n // if (\n // !window.matchMedia('(min-width: calc(40em + 350px))').matches\n // ) {\n // onClose();\n // }\n // }}\n >\n <span class=\"button-label\">View post </span>»\n </Link>\n </span>\n </div>\n {mediaAttachments?.length > 1 && (\n <div class=\"carousel-controls\" hidden={!showControls}>\n <button\n type=\"button\"\n class=\"carousel-button\"\n hidden={currentIndex === 0}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n carouselRef.current.focus();\n carouselRef.current.scrollTo({\n left: carouselRef.current.clientWidth * (currentIndex - 1),\n behavior: 'smooth',\n });\n }}\n >\n <Icon icon=\"arrow-left\" />\n </button>\n <button\n type=\"button\"\n class=\"carousel-button\"\n hidden={currentIndex === mediaAttachments.length - 1}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n carouselRef.current.focus();\n carouselRef.current.scrollTo({\n left: carouselRef.current.clientWidth * (currentIndex + 1),\n behavior: 'smooth',\n });\n }}\n >\n <Icon icon=\"arrow-right\" />\n </button>\n </div>\n )}\n </div>\n );\n}\n\nexport default MediaModal;\n","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20fill='none'%20viewBox='0%200%2084%2062'%3e%3crect%20width='64'%20height='48'%20x='18'%20y='2'%20fill='%23fff'%20stroke='%23999'%20stroke-width='3'%20rx='4'/%3e%3crect%20width='32'%20height='48'%20x='2'%20y='12'%20fill='%23fff'%20stroke='%23999'%20stroke-width='3'%20rx='4'/%3e%3cpath%20fill='%234169E1'%20d='M14%2052a4%204%200%201%201-8%200%204%204%200%200%201%208%200Zm64-42a4%204%200%201%201-8%200%204%204%200%200%201%208%200Z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20fill='none'%20viewBox='0%200%2082%2062'%3e%3crect%20width='78'%20height='58'%20x='2'%20y='2'%20fill='%23999'%20fill-opacity='.3'%20stroke='%23999'%20stroke-width='3'%20rx='4'/%3e%3crect%20width='18'%20height='46'%20x='8'%20y='8'%20fill='%23fff'%20stroke='%23999'%20stroke-width='2'%20rx='1'/%3e%3crect%20width='18'%20height='46'%20x='32'%20y='8'%20fill='%23fff'%20stroke='%23999'%20stroke-width='2'%20rx='1'/%3e%3crect%20width='18'%20height='46'%20x='56'%20y='8'%20fill='%23fff'%20stroke='%23999'%20stroke-width='2'%20rx='1'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20fill='none'%20viewBox='0%200%2084%2062'%3e%3crect%20width='64'%20height='48'%20x='18'%20y='2'%20fill='%23fff'%20stroke='%23999'%20stroke-width='3'%20rx='4'/%3e%3cpath%20fill='%23999'%20fill-opacity='.3'%20d='M19%203h62v10H19z'/%3e%3cpath%20stroke='%234169E1'%20stroke-width='2'%20d='M43%208a2%202%200%201%201-4%200%202%202%200%200%201%204%200Z'/%3e%3cpath%20stroke='%23999'%20stroke-width='2'%20d='M52%208a2%202%200%201%201-4%200%202%202%200%200%201%204%200Zm9%200a2%202%200%201%201-4%200%202%202%200%200%201%204%200Z'/%3e%3crect%20width='32'%20height='48'%20x='2'%20y='12'%20fill='%23fff'%20stroke='%23999'%20stroke-width='3'%20rx='4'/%3e%3cpath%20fill='%23999'%20fill-opacity='.3'%20d='M3%2049h30v10H3z'/%3e%3cpath%20stroke='%234169E1'%20stroke-width='2'%20d='M11%2054a2%202%200%201%201-4%200%202%202%200%200%201%204%200Z'/%3e%3cpath%20stroke='%23999'%20stroke-width='2'%20d='M20%2054a2%202%200%201%201-4%200%202%202%200%200%201%204%200Zm9%200a2%202%200%201%201-4%200%202%202%200%200%201%204%200Z'/%3e%3c/svg%3e\"","import { api } from '../utils/api';\nimport store from '../utils/store';\n\nconst LIMIT = 200;\nconst MAX_FETCH = 10;\n\nexport async function fetchFollowedTags() {\n const { masto } = api();\n const iterator = masto.v1.followedTags.list({\n limit: LIMIT,\n });\n const tags = [];\n let fetchCount = 0;\n do {\n const { value, done } = await iterator.next();\n if (done || value?.length === 0) break;\n tags.push(...value);\n fetchCount++;\n } while (fetchCount < MAX_FETCH);\n tags.sort((a, b) => a.name.localeCompare(b.name));\n console.log(tags);\n\n if (tags.length) {\n setTimeout(() => {\n // Save to local storage, with saved timestamp\n store.account.set('followedTags', {\n tags,\n updatedAt: Date.now(),\n });\n }, 1);\n }\n\n return tags;\n}\n\nconst MAX_AGE = 24 * 60 * 60 * 1000; // 1 day\nexport async function getFollowedTags() {\n try {\n const { tags, updatedAt } = store.account.get('followedTags') || {};\n if (!tags?.length) return await fetchFollowedTags();\n if (Date.now() - updatedAt > MAX_AGE) {\n // Stale-while-revalidate\n fetchFollowedTags();\n return tags;\n }\n return tags;\n } catch (e) {\n return [];\n }\n}\n\nconst fauxDiv = document.createElement('div');\nexport const extractTagsFromStatus = (content) => {\n if (!content) return [];\n if (content.indexOf('#') === -1) return [];\n fauxDiv.innerHTML = content;\n const hashtagLinks = fauxDiv.querySelectorAll('a.hashtag');\n if (!hashtagLinks.length) return [];\n return Array.from(hashtagLinks).map((a) =>\n a.innerText.trim().replace(/^[^#]*#+/, ''),\n );\n};\n","import { useEffect, useState } from 'preact/hooks';\n\nfunction AsyncText({ children }) {\n if (typeof children === 'string') return children;\n const [text, setText] = useState('');\n useEffect(() => {\n Promise.resolve(children).then(setText);\n }, [children]);\n return text;\n}\n\nexport default AsyncText;\n","import './shortcuts-settings.css';\n\nimport { useAutoAnimate } from '@formkit/auto-animate/preact';\nimport {\n compressToEncodedURIComponent,\n decompressFromEncodedURIComponent,\n} from 'lz-string';\nimport { useEffect, useMemo, useRef, useState } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport floatingButtonUrl from '../assets/floating-button.svg';\nimport multiColumnUrl from '../assets/multi-column.svg';\nimport tabMenuBarUrl from '../assets/tab-menu-bar.svg';\n\nimport { api } from '../utils/api';\nimport { fetchFollowedTags } from '../utils/followed-tags';\nimport pmem from '../utils/pmem';\nimport showToast from '../utils/show-toast';\nimport states from '../utils/states';\n\nimport AsyncText from './AsyncText';\nimport Icon from './icon';\nimport MenuConfirm from './menu-confirm';\nimport Modal from './modal';\n\nexport const SHORTCUTS_LIMIT = 9;\n\nconst TYPES = [\n 'following',\n 'mentions',\n 'notifications',\n 'list',\n 'public',\n 'trending',\n 'search',\n 'hashtag',\n 'bookmarks',\n 'favourites',\n // NOTE: Hide for now\n // 'account-statuses', // Need @acct search first\n];\nconst TYPE_TEXT = {\n following: 'Home / Following',\n notifications: 'Notifications',\n list: 'List',\n public: 'Public (Local / Federated)',\n search: 'Search',\n 'account-statuses': 'Account',\n bookmarks: 'Bookmarks',\n favourites: 'Likes',\n hashtag: 'Hashtag',\n trending: 'Trending',\n mentions: 'Mentions',\n};\nconst TYPE_PARAMS = {\n list: [\n {\n text: 'List ID',\n name: 'id',\n },\n ],\n public: [\n {\n text: 'Local only',\n name: 'local',\n type: 'checkbox',\n },\n {\n text: 'Instance',\n name: 'instance',\n type: 'text',\n placeholder: 'Optional, e.g. mastodon.social',\n notRequired: true,\n },\n ],\n trending: [\n {\n text: 'Instance',\n name: 'instance',\n type: 'text',\n placeholder: 'Optional, e.g. mastodon.social',\n notRequired: true,\n },\n ],\n search: [\n {\n text: 'Search term',\n name: 'query',\n type: 'text',\n placeholder: 'Optional, unless for multi-column mode',\n notRequired: true,\n },\n ],\n 'account-statuses': [\n {\n text: '@',\n name: 'id',\n type: 'text',\n placeholder: 'cheeaun@mastodon.social',\n },\n ],\n hashtag: [\n {\n text: '#',\n name: 'hashtag',\n type: 'text',\n placeholder: 'e.g. PixelArt (Max 5, space-separated)',\n pattern: '[^#]+',\n },\n {\n text: 'Media only',\n name: 'media',\n type: 'checkbox',\n },\n {\n text: 'Instance',\n name: 'instance',\n type: 'text',\n placeholder: 'Optional, e.g. mastodon.social',\n notRequired: true,\n },\n ],\n};\nconst fetchListTitle = pmem(async ({ id }) => {\n const list = await api().masto.v1.lists.$select(id).fetch();\n return list.title;\n});\nconst fetchAccountTitle = pmem(async ({ id }) => {\n const account = await api().masto.v1.accounts.$select(id).fetch();\n return account.username || account.acct || account.displayName;\n});\nexport const SHORTCUTS_META = {\n following: {\n id: 'home',\n title: (_, index) => (index === 0 ? 'Home' : 'Following'),\n path: '/',\n icon: 'home',\n },\n mentions: {\n id: 'mentions',\n title: 'Mentions',\n path: '/mentions',\n icon: 'at',\n },\n notifications: {\n id: 'notifications',\n title: 'Notifications',\n path: '/notifications',\n icon: 'notification',\n },\n list: {\n id: 'list',\n title: fetchListTitle,\n path: ({ id }) => `/l/${id}`,\n icon: 'list',\n },\n public: {\n id: 'public',\n title: ({ local }) => (local ? 'Local' : 'Federated'),\n subtitle: ({ instance }) => instance || api().instance,\n path: ({ local, instance }) => `/${instance}/p${local ? '/l' : ''}`,\n icon: ({ local }) => (local ? 'building' : 'earth'),\n },\n trending: {\n id: 'trending',\n title: 'Trending',\n subtitle: ({ instance }) => instance || api().instance,\n path: ({ instance }) => `/${instance}/trending`,\n icon: 'chart',\n },\n search: {\n id: 'search',\n title: ({ query }) => (query ? `\"${query}\"` : 'Search'),\n path: ({ query }) =>\n query\n ? `/search?q=${encodeURIComponent(query)}&type=statuses`\n : '/search',\n icon: 'search',\n excludeViewMode: ({ query }) => (!query ? ['multi-column'] : []),\n },\n 'account-statuses': {\n id: 'account-statuses',\n title: fetchAccountTitle,\n path: ({ id }) => `/a/${id}`,\n icon: 'user',\n },\n bookmarks: {\n id: 'bookmarks',\n title: 'Bookmarks',\n path: '/b',\n icon: 'bookmark',\n },\n favourites: {\n id: 'favourites',\n title: 'Likes',\n path: '/f',\n icon: 'heart',\n },\n hashtag: {\n id: 'hashtag',\n title: ({ hashtag }) => hashtag,\n subtitle: ({ instance }) => instance || api().instance,\n path: ({ hashtag, instance, media }) =>\n `${instance ? `/${instance}` : ''}/t/${hashtag.split(/\\s+/).join('+')}${\n media ? '?media=1' : ''\n }`,\n icon: 'hashtag',\n },\n};\n\nfunction ShortcutsSettings({ onClose }) {\n const snapStates = useSnapshot(states);\n const { shortcuts } = snapStates;\n const [showForm, setShowForm] = useState(false);\n const [showImportExport, setShowImportExport] = useState(false);\n\n const [shortcutsListParent] = useAutoAnimate();\n\n return (\n <div id=\"shortcuts-settings-container\" class=\"sheet\" tabindex=\"-1\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" />\n </button>\n )}\n <header>\n <h2>\n <Icon icon=\"shortcut\" /> Shortcuts{' '}\n <sup\n style={{\n fontSize: 12,\n opacity: 0.5,\n textTransform: 'uppercase',\n }}\n >\n beta\n </sup>\n </h2>\n </header>\n <main>\n <p>Specify a list of shortcuts that'll appear as:</p>\n <div class=\"shortcuts-view-mode\">\n {[\n {\n value: 'float-button',\n label: 'Floating button',\n imgURL: floatingButtonUrl,\n },\n {\n value: 'tab-menu-bar',\n label: 'Tab/Menu bar',\n imgURL: tabMenuBarUrl,\n },\n {\n value: 'multi-column',\n label: 'Multi-column',\n imgURL: multiColumnUrl,\n },\n ].map(({ value, label, imgURL }) => {\n const checked =\n snapStates.settings.shortcutsViewMode === value ||\n (value === 'float-button' &&\n !snapStates.settings.shortcutsViewMode);\n return (\n <label key={value} class={checked ? 'checked' : ''}>\n <input\n type=\"radio\"\n name=\"shortcuts-view-mode\"\n value={value}\n checked={checked}\n onChange={(e) => {\n states.settings.shortcutsViewMode = e.target.value;\n }}\n />{' '}\n <img src={imgURL} alt=\"\" width=\"80\" height=\"58\" />{' '}\n <span>{label}</span>\n </label>\n );\n })}\n </div>\n {shortcuts.length > 0 ? (\n <ol class=\"shortcuts-list\" ref={shortcutsListParent}>\n {shortcuts.filter(Boolean).map((shortcut, i) => {\n // const key = i + Object.values(shortcut);\n const key = Object.values(shortcut).join('-');\n const { type } = shortcut;\n if (!SHORTCUTS_META[type]) return null;\n let { icon, title, subtitle, excludeViewMode } =\n SHORTCUTS_META[type];\n if (typeof title === 'function') {\n title = title(shortcut, i);\n }\n if (typeof subtitle === 'function') {\n subtitle = subtitle(shortcut, i);\n }\n if (typeof icon === 'function') {\n icon = icon(shortcut, i);\n }\n if (typeof excludeViewMode === 'function') {\n excludeViewMode = excludeViewMode(shortcut, i);\n }\n const excludedViewMode = excludeViewMode?.includes(\n snapStates.settings.shortcutsViewMode,\n );\n return (\n <li key={key}>\n <Icon icon={icon} />\n <span class=\"shortcut-text\">\n <AsyncText>{title}</AsyncText>\n {subtitle && (\n <>\n {' '}\n <small class=\"ib insignificant\">{subtitle}</small>\n </>\n )}\n {excludedViewMode && (\n <span class=\"tag\">\n Not available in current view mode\n </span>\n )}\n </span>\n <span class=\"shortcut-actions\">\n <button\n type=\"button\"\n class=\"plain small\"\n disabled={i === 0}\n onClick={() => {\n const shortcutsArr = Array.from(states.shortcuts);\n if (i > 0) {\n const temp = states.shortcuts[i - 1];\n shortcutsArr[i - 1] = shortcut;\n shortcutsArr[i] = temp;\n states.shortcuts = shortcutsArr;\n }\n }}\n >\n <Icon icon=\"arrow-up\" alt=\"Move up\" />\n </button>\n <button\n type=\"button\"\n class=\"plain small\"\n disabled={i === shortcuts.length - 1}\n onClick={() => {\n const shortcutsArr = Array.from(states.shortcuts);\n if (i < states.shortcuts.length - 1) {\n const temp = states.shortcuts[i + 1];\n shortcutsArr[i + 1] = shortcut;\n shortcutsArr[i] = temp;\n states.shortcuts = shortcutsArr;\n }\n }}\n >\n <Icon icon=\"arrow-down\" alt=\"Move down\" />\n </button>\n <button\n type=\"button\"\n class=\"plain small\"\n onClick={() => {\n setShowForm({\n shortcut,\n shortcutIndex: i,\n });\n }}\n >\n <Icon icon=\"pencil\" alt=\"Edit\" />\n </button>\n {/* <button\n type=\"button\"\n class=\"plain small\"\n onClick={() => {\n states.shortcuts.splice(i, 1);\n }}\n >\n <Icon icon=\"x\" alt=\"Remove\" />\n </button> */}\n </span>\n </li>\n );\n })}\n </ol>\n ) : (\n <div class=\"ui-state insignificant\">\n <p>No shortcuts yet. Tap on the Add shortcut button.</p>\n <p>\n Not sure what to add?\n <br />\n Try adding{' '}\n <a\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n states.shortcuts = [\n {\n type: 'following',\n },\n {\n type: 'notifications',\n },\n ];\n }}\n >\n Home / Following and Notifications\n </a>{' '}\n first.\n </p>\n </div>\n )}\n <p class=\"insignificant\">\n {shortcuts.length >= SHORTCUTS_LIMIT &&\n `Max ${SHORTCUTS_LIMIT} shortcuts`}\n </p>\n <p\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <button\n type=\"button\"\n class=\"light\"\n onClick={() => setShowImportExport(true)}\n >\n Import/export\n </button>\n <button\n type=\"button\"\n disabled={shortcuts.length >= SHORTCUTS_LIMIT}\n onClick={() => setShowForm(true)}\n >\n <Icon icon=\"plus\" /> <span>Add shortcut</span>\n </button>\n </p>\n </main>\n {showForm && (\n <Modal\n class=\"light\"\n onClick={(e) => {\n if (e.target === e.currentTarget) {\n setShowForm(false);\n }\n }}\n >\n <ShortcutForm\n shortcut={showForm.shortcut}\n shortcutIndex={showForm.shortcutIndex}\n onSubmit={({ result, mode }) => {\n console.log('onSubmit', result);\n if (mode === 'edit') {\n states.shortcuts[showForm.shortcutIndex] = result;\n } else {\n states.shortcuts.push(result);\n }\n }}\n onClose={() => setShowForm(false)}\n />\n </Modal>\n )}\n {showImportExport && (\n <Modal\n class=\"light\"\n onClick={(e) => {\n if (e.target === e.currentTarget) {\n setShowImportExport(false);\n }\n }}\n >\n <ImportExport\n shortcuts={shortcuts}\n onClose={() => setShowImportExport(false)}\n />\n </Modal>\n )}\n </div>\n );\n}\n\nconst FETCH_MAX_AGE = 1000 * 60; // 1 minute\nconst fetchLists = pmem(\n () => {\n const { masto } = api();\n return masto.v1.lists.list();\n },\n {\n maxAge: FETCH_MAX_AGE,\n },\n);\n\nconst FORM_NOTES = {\n search: `For multi-column mode, search term is required, else the column will not be shown.`,\n hashtag: 'Multiple hashtags are supported. Space-separated.',\n};\n\nfunction ShortcutForm({\n onSubmit,\n disabled,\n shortcut,\n shortcutIndex,\n onClose,\n}) {\n console.log('shortcut', shortcut);\n const editMode = !!shortcut;\n const [currentType, setCurrentType] = useState(shortcut?.type || null);\n const { masto } = api();\n\n const [uiState, setUIState] = useState('default');\n const [lists, setLists] = useState([]);\n const [followedHashtags, setFollowedHashtags] = useState([]);\n useEffect(() => {\n (async () => {\n if (currentType !== 'list') return;\n try {\n setUIState('loading');\n const lists = await fetchLists();\n lists.sort((a, b) => a.title.localeCompare(b.title));\n setLists(lists);\n setUIState('default');\n } catch (e) {\n console.error(e);\n setUIState('error');\n }\n })();\n\n (async () => {\n if (currentType !== 'hashtag') return;\n try {\n const tags = await fetchFollowedTags();\n setFollowedHashtags(tags);\n } catch (e) {\n console.error(e);\n }\n })();\n }, [currentType]);\n\n const formRef = useRef();\n useEffect(() => {\n if (editMode && currentType && TYPE_PARAMS[currentType]) {\n // Populate form\n const form = formRef.current;\n TYPE_PARAMS[currentType].forEach(({ name, type }) => {\n const input = form.querySelector(`[name=\"${name}\"]`);\n if (input && shortcut[name]) {\n if (type === 'checkbox') {\n input.checked = shortcut[name] === 'on' ? true : false;\n } else {\n input.value = shortcut[name];\n }\n }\n });\n }\n }, [editMode, currentType]);\n\n return (\n <div id=\"shortcut-settings-form\" class=\"sheet\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" />\n </button>\n )}\n <header>\n <h2>{editMode ? 'Edit' : 'Add'} shortcut</h2>\n </header>\n <main tabindex=\"-1\">\n <form\n ref={formRef}\n onSubmit={(e) => {\n // Construct a nice object from form\n e.preventDefault();\n const data = new FormData(e.target);\n const result = {};\n data.forEach((value, key) => {\n result[key] = value?.trim();\n if (key === 'instance') {\n // Remove protocol and trailing slash\n result[key] = result[key]\n .replace(/^https?:\\/\\//, '')\n .replace(/\\/+$/, '');\n // Remove @acct@ or acct@ from instance URL\n result[key] = result[key].replace(/^@?[^@]+@/, '');\n }\n });\n console.log('result', result);\n if (!result.type) return;\n onSubmit({\n result,\n mode: editMode ? 'edit' : 'add',\n });\n // Reset\n e.target.reset();\n setCurrentType(null);\n onClose?.();\n }}\n >\n <p>\n <label>\n <span>Timeline</span>\n <select\n required\n disabled={disabled}\n onChange={(e) => {\n setCurrentType(e.target.value);\n }}\n defaultValue={editMode ? shortcut.type : undefined}\n name=\"type\"\n >\n <option></option>\n {TYPES.map((type) => (\n <option value={type}>{TYPE_TEXT[type]}</option>\n ))}\n </select>\n </label>\n </p>\n {TYPE_PARAMS[currentType]?.map?.(\n ({ text, name, type, placeholder, pattern, notRequired }) => {\n if (currentType === 'list') {\n return (\n <p>\n <label>\n <span>List</span>\n <select\n name=\"id\"\n required={!notRequired}\n disabled={disabled || uiState === 'loading'}\n defaultValue={editMode ? shortcut.id : undefined}\n >\n {lists.map((list) => (\n <option value={list.id}>{list.title}</option>\n ))}\n </select>\n </label>\n </p>\n );\n }\n\n return (\n <p>\n <label>\n <span>{text}</span>{' '}\n <input\n type={type}\n switch={type === 'checkbox' || undefined}\n name={name}\n placeholder={placeholder}\n required={type === 'text' && !notRequired}\n disabled={disabled}\n list={\n currentType === 'hashtag'\n ? 'followed-hashtags-datalist'\n : null\n }\n autocorrect=\"off\"\n autocapitalize=\"off\"\n spellcheck={false}\n pattern={pattern}\n />\n {currentType === 'hashtag' &&\n followedHashtags.length > 0 && (\n <datalist id=\"followed-hashtags-datalist\">\n {followedHashtags.map((tag) => (\n <option value={tag.name} />\n ))}\n </datalist>\n )}\n </label>\n </p>\n );\n },\n )}\n {!!FORM_NOTES[currentType] && (\n <p class=\"form-note insignificant\">\n <Icon icon=\"info\" />\n {FORM_NOTES[currentType]}\n </p>\n )}\n <footer>\n <button\n type=\"submit\"\n class=\"block\"\n disabled={disabled || uiState === 'loading'}\n >\n {editMode ? 'Save' : 'Add'}\n </button>\n {editMode && (\n <button\n type=\"button\"\n class=\"light danger\"\n onClick={() => {\n states.shortcuts.splice(shortcutIndex, 1);\n onClose?.();\n }}\n >\n Remove\n </button>\n )}\n </footer>\n </form>\n </main>\n </div>\n );\n}\n\nfunction ImportExport({ shortcuts, onClose }) {\n const shortcutsStr = useMemo(() => {\n if (!shortcuts) return '';\n if (!shortcuts.filter(Boolean).length) return '';\n return compressToEncodedURIComponent(\n JSON.stringify(shortcuts.filter(Boolean)),\n );\n }, [shortcuts]);\n const [importShortcutStr, setImportShortcutStr] = useState('');\n const [importUIState, setImportUIState] = useState('default');\n const parsedImportShortcutStr = useMemo(() => {\n if (!importShortcutStr) {\n setImportUIState('default');\n return null;\n }\n try {\n const parsed = JSON.parse(\n decompressFromEncodedURIComponent(importShortcutStr),\n );\n // Very basic validation, I know\n if (!Array.isArray(parsed)) throw new Error('Not an array');\n setImportUIState('default');\n return parsed;\n } catch (err) {\n // Fallback to JSON string parsing\n // There's a chance that someone might want to import a JSON string instead of the compressed version\n try {\n const parsed = JSON.parse(importShortcutStr);\n if (!Array.isArray(parsed)) throw new Error('Not an array');\n setImportUIState('default');\n return parsed;\n } catch (err) {\n setImportUIState('error');\n return null;\n }\n }\n }, [importShortcutStr]);\n const hasCurrentSettings = states.shortcuts.length > 0;\n\n return (\n <div id=\"import-export-container\" class=\"sheet\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" />\n </button>\n )}\n <header>\n <h2>\n Import/Export <small class=\"ib insignificant\">Shortcuts</small>\n </h2>\n </header>\n <main tabindex=\"-1\">\n <section>\n <h3>\n <Icon icon=\"arrow-down-circle\" size=\"l\" class=\"insignificant\" />{' '}\n <span>Import</span>\n </h3>\n <p>\n <input\n type=\"text\"\n name=\"import\"\n placeholder=\"Paste shortcuts here\"\n class=\"block\"\n onInput={(e) => {\n setImportShortcutStr(e.target.value);\n }}\n />\n </p>\n {!!parsedImportShortcutStr &&\n Array.isArray(parsedImportShortcutStr) && (\n <>\n <p>\n <b>{parsedImportShortcutStr.length}</b> shortcut\n {parsedImportShortcutStr.length > 1 ? 's' : ''}{' '}\n <small class=\"insignificant\">\n ({importShortcutStr.length} characters)\n </small>\n </p>\n <ol class=\"import-settings-list\">\n {parsedImportShortcutStr.map((shortcut) => (\n <li>\n <span\n style={{\n opacity: shortcuts.some((s) =>\n // Compare all properties\n Object.keys(s).every(\n (key) => s[key] === shortcut[key],\n ),\n )\n ? 1\n : 0,\n }}\n >\n *\n </span>\n <span>\n {TYPE_TEXT[shortcut.type]}\n {shortcut.type === 'list' && ' ⚠️'}{' '}\n {TYPE_PARAMS[shortcut.type]?.map?.(\n ({ text, name, type }) =>\n shortcut[name] ? (\n <>\n <span class=\"tag collapsed insignificant\">\n {text}:{' '}\n {type === 'checkbox'\n ? shortcut[name] === 'on'\n ? '✅'\n : '❌'\n : shortcut[name]}\n </span>{' '}\n </>\n ) : null,\n )}\n </span>\n </li>\n ))}\n </ol>\n <p>\n <small>* Exists in current shortcuts</small>\n <br />\n <small>\n ⚠️ List may not work if it's from a different account.\n </small>\n </p>\n </>\n )}\n {importUIState === 'error' && (\n <p class=\"error\">\n <small>⚠️ Invalid settings format</small>\n </p>\n )}\n <p>\n {hasCurrentSettings && (\n <>\n <MenuConfirm\n confirmLabel=\"Append to current shortcuts?\"\n menuFooter={\n <div class=\"footer\">\n Only shortcuts that don’t exist in current shortcuts will\n be appended.\n </div>\n }\n onClick={() => {\n // states.shortcuts = [\n // ...states.shortcuts,\n // ...parsedImportShortcutStr,\n // ];\n // Append non-unique shortcuts only\n const nonUniqueShortcuts = parsedImportShortcutStr.filter(\n (shortcut) =>\n !states.shortcuts.some((s) =>\n // Compare all properties\n Object.keys(s).every(\n (key) => s[key] === shortcut[key],\n ),\n ),\n );\n if (!nonUniqueShortcuts.length) {\n showToast('No new shortcuts to import');\n return;\n }\n let newShortcuts = [\n ...states.shortcuts,\n ...nonUniqueShortcuts,\n ];\n const exceededLimit = newShortcuts.length > SHORTCUTS_LIMIT;\n if (exceededLimit) {\n // If exceeded, trim it\n newShortcuts = newShortcuts.slice(0, SHORTCUTS_LIMIT);\n }\n states.shortcuts = newShortcuts;\n showToast(\n exceededLimit\n ? `Shortcuts imported. Exceeded max ${SHORTCUTS_LIMIT}, so the rest are not imported.`\n : 'Shortcuts imported',\n );\n onClose?.();\n }}\n >\n <button\n type=\"button\"\n class=\"plain2\"\n disabled={!parsedImportShortcutStr}\n >\n Import & append…\n </button>\n </MenuConfirm>{' '}\n </>\n )}\n <MenuConfirm\n confirmLabel={\n hasCurrentSettings\n ? 'Override current shortcuts?'\n : 'Import shortcuts?'\n }\n menuItemClassName={hasCurrentSettings ? 'danger' : undefined}\n onClick={() => {\n states.shortcuts = parsedImportShortcutStr;\n showToast('Shortcuts imported');\n onClose?.();\n }}\n >\n <button\n type=\"button\"\n class=\"plain2\"\n disabled={!parsedImportShortcutStr}\n >\n {hasCurrentSettings ? 'or override…' : 'Import…'}\n </button>\n </MenuConfirm>\n </p>\n </section>\n <section>\n <h3>\n <Icon icon=\"arrow-up-circle\" size=\"l\" class=\"insignificant\" />{' '}\n <span>Export</span>\n </h3>\n <p>\n <input\n style={{ width: '100%' }}\n type=\"text\"\n value={shortcutsStr}\n readOnly\n onClick={(e) => {\n if (!e.target.value) return;\n e.target.select();\n // Copy url to clipboard\n try {\n navigator.clipboard.writeText(e.target.value);\n showToast('Shortcuts copied');\n } catch (e) {\n console.error(e);\n showToast('Unable to copy shortcuts');\n }\n }}\n />\n </p>\n <p>\n <button\n type=\"button\"\n class=\"plain2\"\n disabled={!shortcutsStr}\n onClick={() => {\n try {\n navigator.clipboard.writeText(shortcutsStr);\n showToast('Shortcut settings copied');\n } catch (e) {\n console.error(e);\n showToast('Unable to copy shortcut settings');\n }\n }}\n >\n <Icon icon=\"clipboard\" /> <span>Copy</span>\n </button>{' '}\n {navigator?.share &&\n navigator?.canShare?.({\n text: shortcutsStr,\n }) && (\n <button\n type=\"button\"\n class=\"plain2\"\n disabled={!shortcutsStr}\n onClick={() => {\n try {\n navigator.share({\n text: shortcutsStr,\n });\n } catch (e) {\n console.error(e);\n alert(\"Sharing doesn't seem to work.\");\n }\n }}\n >\n <Icon icon=\"share\" /> <span>Share</span>\n </button>\n )}{' '}\n {shortcutsStr.length > 0 && (\n <small class=\"insignificant\">\n {shortcutsStr.length} characters\n </small>\n )}\n </p>\n {!!shortcutsStr && (\n <details>\n <summary class=\"insignificant\">\n <small>Raw Shortcuts JSON</small>\n </summary>\n <textarea style={{ width: '100%' }} rows={10} readOnly>\n {JSON.stringify(shortcuts.filter(Boolean), null, 2)}\n </textarea>\n </details>\n )}\n </section>\n </main>\n </div>\n );\n}\n\nexport default ShortcutsSettings;\n","import { useLocation, useNavigate } from 'react-router-dom';\nimport { subscribe, useSnapshot } from 'valtio';\n\nimport Accounts from '../pages/accounts';\nimport Settings from '../pages/settings';\nimport focusDeck from '../utils/focus-deck';\nimport showToast from '../utils/show-toast';\nimport states from '../utils/states';\n\nimport AccountSheet from './account-sheet';\nimport Compose from './compose';\nimport Drafts from './drafts';\nimport GenericAccounts from './generic-accounts';\nimport MediaAltModal from './media-alt-modal';\nimport MediaModal from './media-modal';\nimport Modal from './modal';\nimport ShortcutsSettings from './shortcuts-settings';\n\nsubscribe(states, (changes) => {\n for (const [action, path, value, prevValue] of changes) {\n // When closing modal, focus on deck\n if (/^show/i.test(path) && !value) {\n focusDeck();\n }\n }\n});\n\nexport default function Modals() {\n const snapStates = useSnapshot(states);\n const navigate = useNavigate();\n const location = useLocation();\n\n return (\n <>\n {!!snapStates.showCompose && (\n <Modal>\n <Compose\n replyToStatus={\n typeof snapStates.showCompose !== 'boolean'\n ? snapStates.showCompose.replyToStatus\n : window.__COMPOSE__?.replyToStatus || null\n }\n editStatus={\n states.showCompose?.editStatus ||\n window.__COMPOSE__?.editStatus ||\n null\n }\n draftStatus={\n states.showCompose?.draftStatus ||\n window.__COMPOSE__?.draftStatus ||\n null\n }\n onClose={(results) => {\n const { newStatus, instance, type } = results || {};\n states.showCompose = false;\n window.__COMPOSE__ = null;\n if (newStatus) {\n states.reloadStatusPage++;\n showToast({\n text: {\n post: 'Post published. Check it out.',\n reply: 'Reply posted. Check it out.',\n edit: 'Post updated. Check it out.',\n }[type || 'post'],\n delay: 1000,\n duration: 10_000, // 10 seconds\n onClick: (toast) => {\n toast.hideToast();\n states.prevLocation = location;\n navigate(\n instance\n ? `/${instance}/s/${newStatus.id}`\n : `/s/${newStatus.id}`,\n );\n },\n });\n }\n }}\n />\n </Modal>\n )}\n {!!snapStates.showSettings && (\n <Modal\n onClose={() => {\n states.showSettings = false;\n }}\n >\n <Settings\n onClose={() => {\n states.showSettings = false;\n }}\n />\n </Modal>\n )}\n {!!snapStates.showAccounts && (\n <Modal\n onClose={() => {\n states.showAccounts = false;\n }}\n >\n <Accounts\n onClose={() => {\n states.showAccounts = false;\n }}\n />\n </Modal>\n )}\n {!!snapStates.showAccount && (\n <Modal\n class=\"light\"\n onClose={() => {\n states.showAccount = false;\n }}\n >\n <AccountSheet\n account={snapStates.showAccount?.account || snapStates.showAccount}\n instance={snapStates.showAccount?.instance}\n onClose={({ destination } = {}) => {\n states.showAccount = false;\n // states.showGenericAccounts = false;\n // if (destination) {\n // states.showAccounts = false;\n // }\n }}\n />\n </Modal>\n )}\n {!!snapStates.showDrafts && (\n <Modal\n onClose={() => {\n states.showDrafts = false;\n }}\n >\n <Drafts onClose={() => (states.showDrafts = false)} />\n </Modal>\n )}\n {!!snapStates.showMediaModal && (\n <Modal\n onClick={(e) => {\n if (\n e.target === e.currentTarget ||\n e.target.classList.contains('media')\n ) {\n states.showMediaModal = false;\n }\n }}\n >\n <MediaModal\n mediaAttachments={snapStates.showMediaModal.mediaAttachments}\n instance={snapStates.showMediaModal.instance}\n index={snapStates.showMediaModal.index}\n statusID={snapStates.showMediaModal.statusID}\n onClose={() => {\n states.showMediaModal = false;\n }}\n />\n </Modal>\n )}\n {!!snapStates.showShortcutsSettings && (\n <Modal\n class=\"light\"\n onClose={() => {\n states.showShortcutsSettings = false;\n }}\n >\n <ShortcutsSettings\n onClose={() => (states.showShortcutsSettings = false)}\n />\n </Modal>\n )}\n {!!snapStates.showGenericAccounts && (\n <Modal\n class=\"light\"\n onClose={() => {\n states.showGenericAccounts = false;\n }}\n >\n <GenericAccounts\n instance={snapStates.showGenericAccounts.instance}\n excludeRelationshipAttrs={\n snapStates.showGenericAccounts.excludeRelationshipAttrs\n }\n onClose={() => (states.showGenericAccounts = false)}\n />\n </Modal>\n )}\n {!!snapStates.showMediaAlt && (\n <Modal\n class=\"light\"\n onClose={(e) => {\n states.showMediaAlt = false;\n }}\n >\n <MediaAltModal\n alt={snapStates.showMediaAlt.alt || snapStates.showMediaAlt}\n lang={snapStates.showMediaAlt?.lang}\n onClose={() => {\n states.showMediaAlt = false;\n }}\n />\n </Modal>\n )}\n </>\n );\n}\n","import { useState } from 'preact/hooks';\n\nimport { api } from '../utils/api';\n\nimport Icon from './icon';\nimport Loader from './loader';\n\nfunction FollowRequestButtons({ accountID, onChange }) {\n const { masto } = api();\n const [uiState, setUIState] = useState('default');\n const [requestState, setRequestState] = useState(null); // accept, reject\n const [relationship, setRelationship] = useState(null);\n\n const hasRelationship = relationship !== null;\n\n return (\n <p class=\"follow-request-buttons\">\n <button\n type=\"button\"\n disabled={uiState === 'loading' || hasRelationship}\n onClick={() => {\n setUIState('loading');\n setRequestState('accept');\n (async () => {\n try {\n const rel = await masto.v1.followRequests\n .$select(accountID)\n .authorize();\n if (!rel?.followedBy) {\n throw new Error('Follow request not accepted');\n }\n setRelationship(rel);\n onChange();\n } catch (e) {\n console.error(e);\n }\n setUIState('default');\n })();\n }}\n >\n Accept\n </button>{' '}\n <button\n type=\"button\"\n disabled={uiState === 'loading' || hasRelationship}\n class=\"light danger\"\n onClick={() => {\n setUIState('loading');\n setRequestState('reject');\n (async () => {\n try {\n const rel = await masto.v1.followRequests\n .$select(accountID)\n .reject();\n if (rel?.followedBy) {\n throw new Error('Follow request not rejected');\n }\n setRelationship(rel);\n onChange();\n } catch (e) {\n console.error(e);\n setUIState('default');\n }\n })();\n }}\n >\n Reject\n </button>\n <span class=\"follow-request-states\">\n {hasRelationship && requestState ? (\n requestState === 'accept' ? (\n <Icon icon=\"check-circle\" alt=\"Accepted\" class=\"follow-accepted\" />\n ) : (\n <Icon icon=\"x-circle\" alt=\"Rejected\" class=\"follow-rejected\" />\n )\n ) : (\n <Loader hidden={uiState !== 'loading'} />\n )}\n </span>\n </p>\n );\n}\n\nexport default FollowRequestButtons;\n","import { Fragment } from 'preact';\nimport { memo } from 'preact/compat';\n\nimport shortenNumber from '../utils/shorten-number';\nimport states from '../utils/states';\nimport store from '../utils/store';\nimport useTruncated from '../utils/useTruncated';\n\nimport Avatar from './avatar';\nimport FollowRequestButtons from './follow-request-buttons';\nimport Icon from './icon';\nimport Link from './link';\nimport NameText from './name-text';\nimport RelativeTime from './relative-time';\nimport Status from './status';\n\nconst NOTIFICATION_ICONS = {\n mention: 'comment',\n status: 'notification',\n reblog: 'rocket',\n follow: 'follow',\n follow_request: 'follow-add',\n favourite: 'heart',\n poll: 'poll',\n update: 'pencil',\n 'admin.signup': 'account-edit',\n 'admin.report': 'account-warning',\n};\n\n/*\nNotification types\n==================\nmention = Someone mentioned you in their status\nstatus = Someone you enabled notifications for has posted a status\nreblog = Someone boosted one of your statuses\nfollow = Someone followed you\nfollow_request = Someone requested to follow you\nfavourite = Someone favourited one of your statuses\npoll = A poll you have voted in or created has ended\nupdate = A status you interacted with has been edited\nadmin.sign_up = Someone signed up (optionally sent to admins)\nadmin.report = A new report has been filed\n*/\n\nconst contentText = {\n mention: 'mentioned you in their post.',\n status: 'published a post.',\n reblog: 'boosted your post.',\n 'reblog+account': (count) => `boosted ${count} of your posts.`,\n reblog_reply: 'boosted your reply.',\n follow: 'followed you.',\n follow_request: 'requested to follow you.',\n favourite: 'liked your post.',\n 'favourite+account': (count) => `liked ${count} of your posts.`,\n favourite_reply: 'liked your reply.',\n poll: 'A poll you have voted in or created has ended.',\n 'poll-self': 'A poll you have created has ended.',\n 'poll-voted': 'A poll you have voted in has ended.',\n update: 'A post you interacted with has been edited.',\n 'favourite+reblog': 'boosted & liked your post.',\n 'favourite+reblog+account': (count) =>\n `boosted & liked ${count} of your posts.`,\n 'favourite+reblog_reply': 'boosted & liked your reply.',\n 'admin.sign_up': 'signed up.',\n 'admin.report': (targetAccount) => <>reported {targetAccount}</>,\n};\n\nconst AVATARS_LIMIT = 50;\n\nfunction Notification({\n notification,\n instance,\n isStatic,\n disableContextMenu,\n}) {\n const { id, status, account, report, _accounts, _statuses } = notification;\n let { type } = notification;\n\n // status = Attached when type of the notification is favourite, reblog, status, mention, poll, or update\n const actualStatus = status?.reblog || status;\n const actualStatusID = actualStatus?.id;\n\n const currentAccount = store.session.get('currentAccount');\n const isSelf = currentAccount === account?.id;\n const isVoted = status?.poll?.voted;\n const isReplyToOthers =\n !!status?.inReplyToAccountId &&\n status?.inReplyToAccountId !== currentAccount &&\n status?.account?.id === currentAccount;\n\n let favsCount = 0;\n let reblogsCount = 0;\n if (type === 'favourite+reblog') {\n for (const account of _accounts) {\n if (account._types?.includes('favourite')) {\n favsCount++;\n }\n if (account._types?.includes('reblog')) {\n reblogsCount++;\n }\n }\n if (!reblogsCount && favsCount) type = 'favourite';\n if (!favsCount && reblogsCount) type = 'reblog';\n }\n\n let text;\n if (type === 'poll') {\n text = contentText[isSelf ? 'poll-self' : isVoted ? 'poll-voted' : 'poll'];\n } else if (\n type === 'reblog' ||\n type === 'favourite' ||\n type === 'favourite+reblog'\n ) {\n if (_statuses?.length > 1) {\n text = contentText[`${type}+account`];\n } else if (isReplyToOthers) {\n text = contentText[`${type}_reply`];\n } else {\n text = contentText[type];\n }\n } else if (contentText[type]) {\n text = contentText[type];\n } else {\n // Anticipate unhandled notification types, possibly from Mastodon forks or non-Mastodon instances\n // This surfaces the error to the user, hoping that users will report it\n text = `[Unknown notification type: ${type}]`;\n }\n\n if (typeof text === 'function') {\n const count = _statuses?.length || _accounts?.length;\n if (count) {\n text = text(count);\n } else if (type === 'admin.report') {\n const targetAccount = report?.targetAccount;\n if (targetAccount) {\n text = text(<NameText account={targetAccount} showAvatar />);\n }\n }\n }\n\n if (type === 'mention' && !status) {\n // Could be deleted\n return null;\n }\n\n const formattedCreatedAt =\n notification.createdAt && new Date(notification.createdAt).toLocaleString();\n\n const genericAccountsHeading =\n {\n 'favourite+reblog': 'Boosted/Liked by…',\n favourite: 'Liked by…',\n reblog: 'Boosted by…',\n follow: 'Followed by…',\n }[type] || 'Accounts';\n const handleOpenGenericAccounts = () => {\n states.showGenericAccounts = {\n heading: genericAccountsHeading,\n accounts: _accounts,\n showReactions: type === 'favourite+reblog',\n excludeRelationshipAttrs: type === 'follow' ? ['followedBy'] : [],\n };\n };\n\n console.debug('RENDER Notification', notification.id);\n\n return (\n <div\n class={`notification notification-${type}`}\n data-notification-id={id}\n tabIndex=\"0\"\n >\n <div\n class={`notification-type notification-${type}`}\n title={formattedCreatedAt}\n >\n {type === 'favourite+reblog' ? (\n <>\n <Icon icon=\"rocket\" size=\"xl\" alt={type} class=\"reblog-icon\" />\n <Icon icon=\"heart\" size=\"xl\" alt={type} class=\"favourite-icon\" />\n </>\n ) : (\n <Icon\n icon={NOTIFICATION_ICONS[type] || 'notification'}\n size=\"xl\"\n alt={type}\n />\n )}\n </div>\n <div class=\"notification-content\">\n {type !== 'mention' && (\n <>\n <p>\n {!/poll|update/i.test(type) && (\n <>\n {_accounts?.length > 1 ? (\n <>\n <b tabIndex=\"0\" onClick={handleOpenGenericAccounts}>\n <span title={_accounts.length}>\n {shortenNumber(_accounts.length)}\n </span>{' '}\n people\n </b>{' '}\n </>\n ) : (\n <>\n <NameText account={account} showAvatar />{' '}\n </>\n )}\n </>\n )}\n {text}\n {type === 'mention' && (\n <span class=\"insignificant\">\n {' '}\n •{' '}\n <RelativeTime\n datetime={notification.createdAt}\n format=\"micro\"\n />\n </span>\n )}\n </p>\n {type === 'follow_request' && (\n <FollowRequestButtons accountID={account.id} />\n )}\n </>\n )}\n {_accounts?.length > 1 && (\n <p class=\"avatars-stack\">\n {_accounts.slice(0, AVATARS_LIMIT).map((account) => (\n <Fragment key={account.id}>\n <a\n key={account.id}\n href={account.url}\n rel=\"noopener noreferrer\"\n class=\"account-avatar-stack\"\n onClick={(e) => {\n e.preventDefault();\n states.showAccount = account;\n }}\n >\n <Avatar\n url={account.avatarStatic}\n size={\n _accounts.length <= 10\n ? 'xxl'\n : _accounts.length < 20\n ? 'xl'\n : _accounts.length < 30\n ? 'l'\n : _accounts.length < 40\n ? 'm'\n : 's' // My god, this person is popular!\n }\n key={account.id}\n alt={`${account.displayName} @${account.acct}`}\n squircle={account?.bot}\n />\n {type === 'favourite+reblog' && (\n <div class=\"account-sub-icons\">\n {account._types.map((type) => (\n <Icon\n icon={NOTIFICATION_ICONS[type]}\n size=\"s\"\n class={`${type}-icon`}\n />\n ))}\n </div>\n )}\n </a>{' '}\n </Fragment>\n ))}\n <button\n type=\"button\"\n class=\"small plain\"\n onClick={handleOpenGenericAccounts}\n >\n {_accounts.length > AVATARS_LIMIT &&\n `+${_accounts.length - AVATARS_LIMIT}`}\n <Icon icon=\"chevron-down\" />\n </button>\n </p>\n )}\n {_statuses?.length > 1 && (\n <ul class=\"notification-group-statuses\">\n {_statuses.map((status) => (\n <li key={status.id}>\n <TruncatedLink\n class={`status-link status-type-${type}`}\n to={\n instance ? `/${instance}/s/${status.id}` : `/s/${status.id}`\n }\n >\n <Status status={status} size=\"s\" />\n </TruncatedLink>\n </li>\n ))}\n </ul>\n )}\n {status && (!_statuses?.length || _statuses?.length <= 1) && (\n <TruncatedLink\n class={`status-link status-type-${type}`}\n to={\n instance\n ? `/${instance}/s/${actualStatusID}`\n : `/s/${actualStatusID}`\n }\n onContextMenu={\n !disableContextMenu\n ? (e) => {\n const post = e.target.querySelector('.status');\n if (post) {\n // Fire a custom event to open the context menu\n if (e.metaKey) return;\n e.preventDefault();\n post.dispatchEvent(\n new MouseEvent('contextmenu', {\n clientX: e.clientX,\n clientY: e.clientY,\n }),\n );\n }\n }\n : undefined\n }\n >\n {isStatic ? (\n <Status status={actualStatus} size=\"s\" />\n ) : (\n <Status statusID={actualStatusID} size=\"s\" />\n )}\n </TruncatedLink>\n )}\n </div>\n </div>\n );\n}\n\nfunction TruncatedLink(props) {\n const ref = useTruncated();\n return <Link {...props} data-read-more=\"Read more →\" ref={ref} />;\n}\n\nexport default memo(Notification);\n","import { memo } from 'preact/compat';\nimport { useLayoutEffect, useState } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport { api } from '../utils/api';\nimport states from '../utils/states';\nimport {\n getAccountByAccessToken,\n getCurrentAccount,\n} from '../utils/store-utils';\nimport usePageVisibility from '../utils/usePageVisibility';\n\nimport Icon from './icon';\nimport Link from './link';\nimport Modal from './modal';\nimport Notification from './notification';\n\n{\n if ('serviceWorker' in navigator) {\n console.log('👂👂👂 Listen to message');\n navigator.serviceWorker.addEventListener('message', (event) => {\n console.log('💥💥💥 Message event', event);\n const { type, id, accessToken } = event?.data || {};\n if (type === 'notification') {\n states.routeNotification = {\n id,\n accessToken,\n };\n }\n });\n }\n}\n\nexport default memo(function NotificationService() {\n if (!('serviceWorker' in navigator)) return null;\n\n const snapStates = useSnapshot(states);\n const { routeNotification } = snapStates;\n\n console.log('🛎️ Notification service', routeNotification);\n\n const { id, accessToken } = routeNotification || {};\n const [showNotificationSheet, setShowNotificationSheet] = useState(false);\n\n useLayoutEffect(() => {\n if (!id || !accessToken) return;\n const { instance: currentInstance } = api();\n const { masto, instance } = api({\n accessToken,\n });\n console.log('API', { accessToken, currentInstance, instance });\n const sameInstance = currentInstance === instance;\n const account = accessToken\n ? getAccountByAccessToken(accessToken)\n : getCurrentAccount();\n (async () => {\n const notification = await masto.v1.notifications.$select(id).fetch();\n if (notification && account) {\n console.log('🛎️ Notification', { id, notification, account });\n const accountInstance = account.instanceURL;\n const { type, status, account: notificationAccount } = notification;\n const hasModal = !!document.querySelector('#modal-container > *');\n const isFollow = type === 'follow' && !!notificationAccount?.id;\n const hasAccount = !!notificationAccount?.id;\n const hasStatus = !!status?.id;\n if (isFollow && sameInstance) {\n // Show account sheet, can handle different instances\n states.showAccount = {\n account: notificationAccount,\n instance: accountInstance,\n };\n } else if (hasModal || !sameInstance || (hasAccount && hasStatus)) {\n // Show sheet of notification, if\n // - there is a modal open\n // - the notification is from another instance\n // - the notification has both account and status, gives choice for users to go to account or status\n setShowNotificationSheet({\n id,\n account,\n notification,\n sameInstance,\n });\n } else {\n if (hasStatus) {\n // Go to status page\n location.hash = `/${currentInstance}/s/${status.id}`;\n } else if (isFollow) {\n // Go to profile page\n location.hash = `/${currentInstance}/a/${notificationAccount.id}`;\n } else {\n // Go to notifications page\n location.hash = '/notifications';\n }\n }\n } else {\n console.warn('🛎️ Notification not found', id);\n }\n })();\n }, [id, accessToken]);\n\n // useLayoutEffect(() => {\n // // Listen to message from service worker\n // const handleMessage = (event) => {\n // console.log('💥💥💥 Message event', event);\n // const { type, id, accessToken } = event?.data || {};\n // if (type === 'notification') {\n // states.routeNotification = {\n // id,\n // accessToken,\n // };\n // }\n // };\n // console.log('👂👂👂 Listen to message');\n // navigator.serviceWorker.addEventListener('message', handleMessage);\n // return () => {\n // console.log('👂👂👂 Remove listen to message');\n // navigator.serviceWorker.removeEventListener('message', handleMessage);\n // };\n // }, []);\n\n useLayoutEffect(() => {\n if (navigator?.clearAppBadge) {\n navigator.clearAppBadge();\n }\n }, []);\n usePageVisibility((visible) => {\n if (visible && navigator?.clearAppBadge) {\n console.log('🔰 Clear app badge');\n navigator.clearAppBadge();\n }\n });\n\n const onClose = () => {\n setShowNotificationSheet(false);\n states.routeNotification = null;\n\n // If url is #/notifications?id=123, go to #/notifications\n if (/\\/notifications\\?id=/i.test(location.hash)) {\n location.hash = '/notifications';\n }\n };\n\n if (showNotificationSheet) {\n const { id, account, notification, sameInstance } = showNotificationSheet;\n return (\n <Modal\n class=\"light\"\n onClick={(e) => {\n if (e.target === e.currentTarget) {\n onClose();\n }\n }}\n >\n <div class=\"sheet\" tabIndex=\"-1\">\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" />\n </button>\n <header>\n <b>Notification</b>\n </header>\n <main>\n {!sameInstance && (\n <p>This notification is from your other account.</p>\n )}\n <div\n class=\"notification-peek\"\n // style={{\n // pointerEvents: sameInstance ? '' : 'none',\n // }}\n onClick={(e) => {\n const { target } = e;\n // If button or links\n if (e.target.tagName === 'BUTTON' || e.target.tagName === 'A') {\n onClose();\n }\n }}\n >\n <Notification\n instance={account.instanceURL}\n notification={notification}\n isStatic\n />\n </div>\n <div\n style={{\n textAlign: 'end',\n }}\n >\n <Link to=\"/notifications\" class=\"button light\" onClick={onClose}>\n <span>View all notifications</span> <Icon icon=\"arrow-right\" />\n </Link>\n </div>\n </main>\n </div>\n </Modal>\n );\n }\n\n return null;\n});\n","import { forwardRef } from 'preact/compat';\nimport { useImperativeHandle, useRef, useState } from 'preact/hooks';\nimport { useSearchParams } from 'react-router-dom';\n\nimport { api } from '../utils/api';\n\nimport Icon from './icon';\nimport Link from './link';\n\nconst SearchForm = forwardRef((props, ref) => {\n const { instance } = api();\n const [searchParams, setSearchParams] = useSearchParams();\n const [searchMenuOpen, setSearchMenuOpen] = useState(false);\n const [query, setQuery] = useState(searchParams.get('q') || '');\n const type = searchParams.get('type');\n const formRef = useRef(null);\n\n const searchFieldRef = useRef(null);\n useImperativeHandle(ref, () => ({\n setValue: (value) => {\n setQuery(value);\n },\n focus: () => {\n searchFieldRef.current.focus();\n },\n select: () => {\n searchFieldRef.current.select();\n },\n blur: () => {\n searchFieldRef.current.blur();\n },\n }));\n\n return (\n <form\n ref={formRef}\n class=\"search-popover-container\"\n onSubmit={(e) => {\n e.preventDefault();\n\n const isSearchPage = /\\/search/.test(location.hash);\n if (isSearchPage) {\n if (query) {\n const params = {\n q: query,\n };\n if (type) params.type = type; // Preserve type\n setSearchParams(params);\n } else {\n setSearchParams({});\n }\n } else {\n if (query) {\n location.hash = `/search?q=${encodeURIComponent(query)}${\n type ? `&type=${type}` : ''\n }`;\n } else {\n location.hash = `/search`;\n }\n }\n\n props?.onSubmit?.(e);\n }}\n >\n <input\n ref={searchFieldRef}\n value={query}\n name=\"q\"\n type=\"search\"\n // autofocus\n placeholder=\"Search\"\n dir=\"auto\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n autocapitalize=\"off\"\n onSearch={(e) => {\n if (!e.target.value) {\n setSearchParams({});\n }\n }}\n onInput={(e) => {\n setQuery(e.target.value);\n setSearchMenuOpen(true);\n }}\n onFocus={() => {\n setSearchMenuOpen(true);\n }}\n onBlur={() => {\n setTimeout(() => {\n setSearchMenuOpen(false);\n }, 100);\n formRef.current\n ?.querySelector('.search-popover-item.focus')\n ?.classList.remove('focus');\n }}\n onKeyDown={(e) => {\n const { key } = e;\n switch (key) {\n case 'Escape':\n setSearchMenuOpen(false);\n break;\n case 'Down':\n case 'ArrowDown':\n e.preventDefault();\n if (searchMenuOpen) {\n const focusItem = formRef.current.querySelector(\n '.search-popover-item.focus',\n );\n if (focusItem) {\n let nextItem = focusItem.nextElementSibling;\n while (nextItem && nextItem.hidden) {\n nextItem = nextItem.nextElementSibling;\n }\n if (nextItem) {\n nextItem.classList.add('focus');\n const siblings = Array.from(\n nextItem.parentElement.children,\n ).filter((el) => el !== nextItem);\n siblings.forEach((el) => {\n el.classList.remove('focus');\n });\n }\n } else {\n const firstItem = formRef.current.querySelector(\n '.search-popover-item',\n );\n if (firstItem) {\n firstItem.classList.add('focus');\n }\n }\n }\n break;\n case 'Up':\n case 'ArrowUp':\n e.preventDefault();\n if (searchMenuOpen) {\n const focusItem = document.querySelector(\n '.search-popover-item.focus',\n );\n if (focusItem) {\n let prevItem = focusItem.previousElementSibling;\n while (prevItem && prevItem.hidden) {\n prevItem = prevItem.previousElementSibling;\n }\n if (prevItem) {\n prevItem.classList.add('focus');\n const siblings = Array.from(\n prevItem.parentElement.children,\n ).filter((el) => el !== prevItem);\n siblings.forEach((el) => {\n el.classList.remove('focus');\n });\n }\n } else {\n const lastItem = document.querySelector(\n '.search-popover-item:last-child',\n );\n if (lastItem) {\n lastItem.classList.add('focus');\n }\n }\n }\n break;\n case 'Enter':\n if (searchMenuOpen) {\n const focusItem = document.querySelector(\n '.search-popover-item.focus',\n );\n if (focusItem) {\n e.preventDefault();\n focusItem.click();\n }\n setSearchMenuOpen(false);\n props?.onSubmit?.(e);\n }\n break;\n }\n }}\n />\n <div class=\"search-popover\" hidden={!searchMenuOpen || !query}>\n {!!query &&\n [\n {\n label: (\n <>\n Posts with <q>{query}</q>\n </>\n ),\n to: `/search?q=${encodeURIComponent(query)}&type=statuses`,\n hidden: /^https?:/.test(query),\n },\n {\n label: (\n <>\n Posts tagged with <mark>#{query.replace(/^#/, '')}</mark>\n </>\n ),\n to: `/${instance}/t/${query.replace(/^#/, '')}`,\n hidden:\n /^@/.test(query) || /^https?:/.test(query) || /\\s/.test(query),\n top: /^#/.test(query),\n type: 'link',\n },\n {\n label: (\n <>\n Look up <mark>{query}</mark>\n </>\n ),\n to: `/${query}`,\n hidden: !/^https?:/.test(query),\n top: /^https?:/.test(query),\n type: 'link',\n },\n {\n label: (\n <>\n Accounts with <q>{query}</q>\n </>\n ),\n to: `/search?q=${encodeURIComponent(query)}&type=accounts`,\n },\n ]\n .sort((a, b) => {\n if (a.top && !b.top) return -1;\n if (!a.top && b.top) return 1;\n return 0;\n })\n .map(({ label, to, hidden, type }) => (\n <Link\n to={to}\n class=\"search-popover-item\"\n hidden={hidden}\n onClick={(e) => {\n props?.onSubmit?.(e);\n }}\n >\n <Icon\n icon={type === 'link' ? 'arrow-right' : 'search'}\n class=\"more-insignificant\"\n />\n <span>{label}</span>{' '}\n </Link>\n ))}\n </div>\n </form>\n );\n});\n\nexport default SearchForm;\n","import './search-command.css';\n\nimport { memo } from 'preact/compat';\nimport { useRef, useState } from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\n\nimport SearchForm from './search-form';\n\nexport default memo(function SearchCommand({ onClose = () => {} }) {\n const [showSearch, setShowSearch] = useState(false);\n const searchFormRef = useRef(null);\n\n useHotkeys(\n '/',\n (e) => {\n setShowSearch(true);\n setTimeout(() => {\n searchFormRef.current?.focus?.();\n searchFormRef.current?.select?.();\n }, 0);\n },\n {\n preventDefault: true,\n ignoreEventWhen: (e) => {\n const isSearchPage = /\\/search/.test(location.hash);\n const hasModal = !!document.querySelector('#modal-container > *');\n return isSearchPage || hasModal;\n },\n },\n );\n\n const closeSearch = () => {\n setShowSearch(false);\n onClose();\n };\n\n useHotkeys(\n 'esc',\n (e) => {\n searchFormRef.current?.blur?.();\n closeSearch();\n },\n {\n enabled: showSearch,\n enableOnFormTags: true,\n preventDefault: true,\n },\n );\n\n return (\n <div\n id=\"search-command-container\"\n hidden={!showSearch}\n onClick={(e) => {\n console.log(e);\n if (e.target === e.currentTarget) {\n closeSearch();\n }\n }}\n >\n <SearchForm\n ref={searchFormRef}\n onSubmit={() => {\n closeSearch();\n }}\n />\n </div>\n );\n});\n","import './shortcuts.css';\n\nimport { Menu, MenuItem } from '@szhsin/react-menu';\nimport { memo } from 'preact/compat';\nimport { useMemo, useRef } from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport { useNavigate } from 'react-router-dom';\nimport { useSnapshot } from 'valtio';\n\nimport { SHORTCUTS_META } from '../components/shortcuts-settings';\nimport { api } from '../utils/api';\nimport states from '../utils/states';\n\nimport AsyncText from './AsyncText';\nimport Icon from './icon';\nimport Link from './link';\nimport Menu2 from './menu2';\nimport MenuLink from './menu-link';\n\nfunction Shortcuts() {\n const { instance } = api();\n const snapStates = useSnapshot(states);\n const { shortcuts, settings } = snapStates;\n\n if (!shortcuts.length) {\n return null;\n }\n if (\n settings.shortcutsViewMode === 'multi-column' ||\n (!settings.shortcutsViewMode && settings.shortcutsColumnsMode)\n ) {\n return null;\n }\n\n const menuRef = useRef();\n\n const formattedShortcuts = useMemo(\n () =>\n shortcuts\n .map((pin, i) => {\n const { type, ...data } = pin;\n if (!SHORTCUTS_META[type]) return null;\n let { id, path, title, subtitle, icon } = SHORTCUTS_META[type];\n\n if (typeof id === 'function') {\n id = id(data, i);\n }\n if (typeof path === 'function') {\n path = path(\n {\n ...data,\n instance: data.instance || instance,\n },\n i,\n );\n }\n if (typeof title === 'function') {\n title = title(data, i);\n }\n if (typeof subtitle === 'function') {\n subtitle = subtitle(data, i);\n }\n if (typeof icon === 'function') {\n icon = icon(data, i);\n }\n\n return {\n id,\n path,\n title,\n subtitle,\n icon,\n };\n })\n .filter(Boolean),\n [shortcuts],\n );\n\n const navigate = useNavigate();\n useHotkeys(['1', '2', '3', '4', '5', '6', '7', '8', '9'], (e, handler) => {\n const index = parseInt(handler.keys[0], 10) - 1;\n if (index < formattedShortcuts.length) {\n const { path } = formattedShortcuts[index];\n if (path) {\n navigate(path);\n menuRef.current?.closeMenu?.();\n }\n }\n });\n\n return (\n <div id=\"shortcuts\">\n {snapStates.settings.shortcutsViewMode === 'tab-menu-bar' ? (\n <nav\n class=\"tab-bar\"\n onContextMenu={(e) => {\n e.preventDefault();\n states.showShortcutsSettings = true;\n }}\n >\n <ul>\n {formattedShortcuts.map(\n ({ id, path, title, subtitle, icon }, i) => {\n return (\n <li key={`${i}-${id}-${title}-${subtitle}-${path}`}>\n <Link\n class={subtitle ? 'has-subtitle' : ''}\n to={path}\n onClick={(e) => {\n if (e.target.classList.contains('is-active')) {\n e.preventDefault();\n const page = document.getElementById(`${id}-page`);\n console.log(id, page);\n if (page) {\n page.scrollTop = 0;\n const updatesButton =\n page.querySelector('.updates-button');\n if (updatesButton) {\n updatesButton.click();\n }\n }\n }\n }}\n >\n <Icon icon={icon} size=\"xl\" alt={title} />\n <span>\n <AsyncText>{title}</AsyncText>\n {subtitle && (\n <>\n <br />\n <small>{subtitle}</small>\n </>\n )}\n </span>\n </Link>\n </li>\n );\n },\n )}\n </ul>\n </nav>\n ) : (\n <Menu2\n instanceRef={menuRef}\n overflow=\"auto\"\n viewScroll=\"close\"\n menuClassName=\"glass-menu shortcuts-menu\"\n gap={8}\n position=\"anchor\"\n menuButton={\n <button\n type=\"button\"\n id=\"shortcuts-button\"\n class=\"plain\"\n onContextMenu={(e) => {\n e.preventDefault();\n states.showShortcutsSettings = true;\n }}\n onTransitionStart={(e) => {\n // Close menu if the button disappears\n try {\n const { target } = e;\n if (getComputedStyle(target).pointerEvents === 'none') {\n menuRef.current?.closeMenu?.();\n }\n } catch (e) {}\n }}\n >\n <Icon icon=\"shortcut\" size=\"xl\" alt=\"Shortcuts\" />\n </button>\n }\n >\n {formattedShortcuts.map(({ id, path, title, subtitle, icon }, i) => {\n return (\n <MenuLink\n to={path}\n key={`${i}-${id}-${title}-${subtitle}-${path}`}\n class=\"glass-menu-item\"\n >\n <Icon icon={icon} size=\"l\" />{' '}\n <span class=\"menu-grow\">\n <span>\n <AsyncText>{title}</AsyncText>\n </span>\n {subtitle && (\n <>\n {' '}\n <small class=\"more-insignificant\">{subtitle}</small>\n </>\n )}\n </span>\n <span class=\"menu-shortcut hide-until-focus-visible\">\n {i + 1}\n </span>\n </MenuLink>\n );\n })}\n </Menu2>\n )}\n </div>\n );\n}\n\nexport default memo(Shortcuts);\n","import { extractTagsFromStatus, getFollowedTags } from './followed-tags';\nimport { fetchRelationships } from './relationships';\nimport states, { statusKey } from './states';\nimport store from './store';\n\nexport function groupBoosts(values) {\n let newValues = [];\n let boostStash = [];\n let serialBoosts = 0;\n for (let i = 0; i < values.length; i++) {\n const item = values[i];\n if (item.reblog && !item.account?.group) {\n boostStash.push(item);\n serialBoosts++;\n } else {\n newValues.push(item);\n if (serialBoosts < 3) {\n serialBoosts = 0;\n }\n }\n }\n // if boostStash is more than quarter of values\n // or if there are 3 or more boosts in a row\n if (\n values.length > 10 &&\n (boostStash.length > values.length / 4 || serialBoosts >= 3)\n ) {\n // if boostStash is more than 3 quarter of values\n const boostStashID = boostStash.map((status) => status.id);\n if (boostStash.length > (values.length * 3) / 4) {\n // insert boost array at the end of specialHome list\n newValues = [\n ...newValues,\n { id: boostStashID, items: boostStash, type: 'boosts' },\n ];\n } else {\n // insert boosts array in the middle of specialHome list\n const half = Math.floor(newValues.length / 2);\n newValues = [\n ...newValues.slice(0, half),\n {\n id: boostStashID,\n items: boostStash,\n type: 'boosts',\n },\n ...newValues.slice(half),\n ];\n }\n return newValues;\n } else {\n return values;\n }\n}\n\nexport function dedupeBoosts(items, instance) {\n const boostedStatusIDs = store.account.get('boostedStatusIDs') || {};\n const filteredItems = items.filter((item) => {\n if (!item.reblog) return true;\n const statusKey = `${instance}-${item.reblog.id}`;\n const boosterID = boostedStatusIDs[statusKey];\n if (boosterID && boosterID !== item.id) {\n console.warn(\n `🚫 Duplicate boost by ${item.account.displayName}`,\n item,\n item.reblog,\n );\n return false;\n } else {\n boostedStatusIDs[statusKey] = item.id;\n }\n return true;\n });\n // Limit to 50\n const keys = Object.keys(boostedStatusIDs);\n if (keys.length > 50) {\n keys.slice(0, keys.length - 50).forEach((key) => {\n delete boostedStatusIDs[key];\n });\n }\n store.account.set('boostedStatusIDs', boostedStatusIDs);\n return filteredItems;\n}\n\nexport function groupContext(items) {\n const contexts = [];\n let contextIndex = 0;\n items.forEach((item) => {\n for (let i = 0; i < contexts.length; i++) {\n if (contexts[i].find((t) => t.id === item.id)) return;\n if (\n contexts[i].find((t) => t.id === item.inReplyToId) ||\n contexts[i].find((t) => t.inReplyToId === item.id)\n ) {\n contexts[i].push(item);\n return;\n }\n }\n const repliedItem = items.find((i) => i.id === item.inReplyToId);\n if (repliedItem) {\n contexts[contextIndex++] = [item, repliedItem];\n }\n });\n\n // Check for cross-item contexts\n // Merge contexts into one if they have a common item (same id)\n for (let i = 0; i < contexts.length; i++) {\n for (let j = i + 1; j < contexts.length; j++) {\n const commonItem = contexts[i].find((t) => contexts[j].includes(t));\n if (commonItem) {\n contexts[i] = [...contexts[i], ...contexts[j]];\n // Remove duplicate items\n contexts[i] = contexts[i].filter(\n (item, index, self) =>\n self.findIndex((t) => t.id === item.id) === index,\n );\n contexts.splice(j, 1);\n j--;\n }\n }\n }\n\n // Sort items by checking inReplyToId\n contexts.forEach((context) => {\n context.sort((a, b) => {\n if (!a.inReplyToId && !b.inReplyToId) {\n return new Date(a.createdAt) - new Date(b.createdAt);\n }\n if (a.inReplyToId === b.id) return 1;\n if (b.inReplyToId === a.id) return -1;\n if (!a.inReplyToId) return -1;\n if (!b.inReplyToId) return 1;\n return new Date(a.createdAt) - new Date(b.createdAt);\n });\n });\n\n // Tag items that has different author than first post's author\n contexts.forEach((context) => {\n const firstItemAccountID = context[0].account.id;\n context.forEach((item) => {\n if (item.account.id !== firstItemAccountID) {\n item._differentAuthor = true;\n }\n });\n });\n\n if (contexts.length) console.log('🧵 Contexts', contexts);\n\n const newItems = [];\n const appliedContextIndices = [];\n items.forEach((item) => {\n if (item.reblog) {\n newItems.push(item);\n return;\n }\n for (let i = 0; i < contexts.length; i++) {\n if (contexts[i].find((t) => t.id === item.id)) {\n if (appliedContextIndices.includes(i)) return;\n const contextItems = contexts[i];\n contextItems.sort((a, b) => {\n const aDate = new Date(a.createdAt);\n const bDate = new Date(b.createdAt);\n return aDate - bDate;\n });\n const firstItemAccountID = contextItems[0].account.id;\n newItems.push({\n id: contextItems.map((i) => i.id),\n items: contextItems,\n type: contextItems.every((it) => it.account.id === firstItemAccountID)\n ? 'thread'\n : 'conversation',\n });\n appliedContextIndices.push(i);\n return;\n }\n }\n newItems.push(item);\n });\n\n return newItems;\n}\n\nexport async function assignFollowedTags(items, instance) {\n const followedTags = await getFollowedTags(); // [{name: 'tag'}, {...}]\n if (!followedTags.length) return;\n const { statusFollowedTags } = states;\n console.log('statusFollowedTags', statusFollowedTags);\n const statusWithFollowedTags = [];\n items.forEach((item) => {\n if (item.reblog) return;\n const { id, content, tags = [] } = item;\n const sKey = statusKey(id, instance);\n if (statusFollowedTags[sKey]?.length) return;\n const extractedTags = extractTagsFromStatus(content);\n if (!extractedTags.length && !tags.length) return;\n const itemFollowedTags = followedTags.reduce((acc, tag) => {\n if (\n extractedTags.some((t) => t.toLowerCase() === tag.name.toLowerCase()) ||\n tags.some((t) => t.name.toLowerCase() === tag.name.toLowerCase())\n ) {\n acc.push(tag.name);\n }\n return acc;\n }, []);\n if (itemFollowedTags.length) {\n // statusFollowedTags[sKey] = itemFollowedTags;\n statusWithFollowedTags.push({\n item,\n sKey,\n followedTags: itemFollowedTags,\n });\n }\n });\n\n if (statusWithFollowedTags.length) {\n const accounts = statusWithFollowedTags.map((s) => s.item.account);\n const relationships = await fetchRelationships(accounts);\n if (!relationships) return;\n\n statusWithFollowedTags.forEach((s) => {\n const { item, sKey, followedTags } = s;\n const r = relationships[item.account.id];\n if (!r.following) {\n statusFollowedTags[sKey] = followedTags;\n }\n });\n }\n}\n\nexport function clearFollowedTagsState() {\n states.statusFollowedTags = {};\n}\n","import { useLayoutEffect, useState } from 'preact/hooks';\n\nexport default function useScroll({\n scrollableRef,\n distanceFromStart = 1, // ratio of clientHeight/clientWidth\n distanceFromEnd = 1, // ratio of clientHeight/clientWidth\n scrollThresholdStart = 10,\n scrollThresholdEnd = 10,\n direction = 'vertical',\n distanceFromStartPx: _distanceFromStartPx,\n distanceFromEndPx: _distanceFromEndPx,\n} = {}) {\n const [scrollDirection, setScrollDirection] = useState(null);\n const [reachStart, setReachStart] = useState(false);\n const [reachEnd, setReachEnd] = useState(false);\n const [nearReachStart, setNearReachStart] = useState(false);\n const [nearReachEnd, setNearReachEnd] = useState(false);\n const isVertical = direction === 'vertical';\n\n useLayoutEffect(() => {\n const scrollableElement = scrollableRef.current;\n if (!scrollableElement) return {};\n let previousScrollStart = isVertical\n ? scrollableElement.scrollTop\n : scrollableElement.scrollLeft;\n\n function onScroll() {\n const {\n scrollTop,\n scrollLeft,\n scrollHeight,\n scrollWidth,\n clientHeight,\n clientWidth,\n } = scrollableElement;\n const scrollStart = isVertical ? scrollTop : scrollLeft;\n const scrollDimension = isVertical ? scrollHeight : scrollWidth;\n const clientDimension = isVertical ? clientHeight : clientWidth;\n const scrollDistance = Math.abs(scrollStart - previousScrollStart);\n const distanceFromStartPx =\n _distanceFromStartPx ||\n Math.min(\n clientDimension * distanceFromStart,\n scrollDimension,\n scrollStart,\n );\n const distanceFromEndPx =\n _distanceFromEndPx ||\n Math.min(\n clientDimension * distanceFromEnd,\n scrollDimension,\n scrollDimension - scrollStart - clientDimension,\n );\n\n if (\n scrollDistance >=\n (previousScrollStart < scrollStart\n ? scrollThresholdEnd\n : scrollThresholdStart)\n ) {\n setScrollDirection(previousScrollStart < scrollStart ? 'end' : 'start');\n previousScrollStart = scrollStart;\n }\n\n setReachStart(scrollStart <= 0);\n setReachEnd(scrollStart + clientDimension >= scrollDimension);\n setNearReachStart(scrollStart <= distanceFromStartPx);\n setNearReachEnd(\n scrollStart + clientDimension >= scrollDimension - distanceFromEndPx,\n );\n }\n\n scrollableElement.addEventListener('scroll', onScroll, { passive: true });\n\n return () => scrollableElement.removeEventListener('scroll', onScroll);\n }, [\n distanceFromStart,\n distanceFromEnd,\n scrollThresholdStart,\n scrollThresholdEnd,\n ]);\n\n return {\n scrollDirection,\n reachStart,\n reachEnd,\n nearReachStart,\n nearReachEnd,\n init: () => {\n if (scrollableRef.current) {\n scrollableRef.current.dispatchEvent(new Event('scroll'));\n }\n },\n };\n}\n","import { useEffect, useLayoutEffect, useRef, useState } from 'preact/hooks';\nimport { useThrottledCallback } from 'use-debounce';\n\nexport default function useScrollFn(\n {\n scrollableRef,\n distanceFromStart = 1, // ratio of clientHeight/clientWidth\n distanceFromEnd = 1, // ratio of clientHeight/clientWidth\n scrollThresholdStart = 10,\n scrollThresholdEnd = 10,\n direction = 'vertical',\n distanceFromStartPx: _distanceFromStartPx,\n distanceFromEndPx: _distanceFromEndPx,\n init,\n } = {},\n callback,\n deps,\n) {\n if (!callback) return;\n const [scrollDirection, setScrollDirection] = useState(null);\n const [reachStart, setReachStart] = useState(false);\n const [reachEnd, setReachEnd] = useState(false);\n const [nearReachStart, setNearReachStart] = useState(false);\n const [nearReachEnd, setNearReachEnd] = useState(false);\n const isVertical = direction === 'vertical';\n const previousScrollStart = useRef(null);\n\n const onScroll = useThrottledCallback(() => {\n const scrollableElement = scrollableRef.current;\n const {\n scrollTop,\n scrollLeft,\n scrollHeight,\n scrollWidth,\n clientHeight,\n clientWidth,\n } = scrollableElement;\n const scrollStart = isVertical ? scrollTop : scrollLeft;\n const scrollDimension = isVertical ? scrollHeight : scrollWidth;\n const clientDimension = isVertical ? clientHeight : clientWidth;\n const scrollDistance = Math.abs(scrollStart - previousScrollStart.current);\n const distanceFromStartPx =\n _distanceFromStartPx ||\n Math.min(\n clientDimension * distanceFromStart,\n scrollDimension,\n scrollStart,\n );\n const distanceFromEndPx =\n _distanceFromEndPx ||\n Math.min(\n clientDimension * distanceFromEnd,\n scrollDimension,\n scrollDimension - scrollStart - clientDimension,\n );\n\n if (\n scrollDistance >=\n (previousScrollStart.current < scrollStart\n ? scrollThresholdEnd\n : scrollThresholdStart)\n ) {\n setScrollDirection(\n previousScrollStart.current < scrollStart ? 'end' : 'start',\n );\n previousScrollStart.current = scrollStart;\n }\n\n setReachStart(scrollStart <= 0);\n setReachEnd(scrollStart + clientDimension >= scrollDimension);\n setNearReachStart(scrollStart <= distanceFromStartPx);\n setNearReachEnd(\n scrollStart + clientDimension >= scrollDimension - distanceFromEndPx,\n );\n }, 500);\n\n useLayoutEffect(() => {\n const scrollableElement = scrollableRef.current;\n if (!scrollableElement) return {};\n previousScrollStart.current =\n scrollableElement[isVertical ? 'scrollTop' : 'scrollLeft'];\n\n scrollableElement.addEventListener('scroll', onScroll, { passive: true });\n\n return () => scrollableElement.removeEventListener('scroll', onScroll);\n }, [\n distanceFromStart,\n distanceFromEnd,\n scrollThresholdStart,\n scrollThresholdEnd,\n ]);\n\n useEffect(() => {\n callback({\n scrollDirection,\n reachStart,\n reachEnd,\n nearReachStart,\n nearReachEnd,\n });\n }, [\n scrollDirection,\n reachStart,\n reachEnd,\n nearReachStart,\n nearReachEnd,\n ...deps,\n ]);\n\n useEffect(() => {\n if (init && scrollableRef.current) {\n queueMicrotask(() => {\n scrollableRef.current.dispatchEvent(new Event('scroll'));\n });\n }\n }, [init]);\n\n // return {\n // scrollDirection,\n // reachStart,\n // reachEnd,\n // nearReachStart,\n // nearReachEnd,\n // init: () => {\n // if (scrollableRef.current) {\n // scrollableRef.current.dispatchEvent(new Event('scroll'));\n // }\n // },\n // };\n}\n","import './media-post.css';\n\nimport { memo } from 'preact/compat';\nimport { useContext, useMemo } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport FilterContext from '../utils/filter-context';\nimport { isFiltered } from '../utils/filters';\nimport states, { statusKey } from '../utils/states';\nimport store from '../utils/store';\n\nimport Media from './media';\n\nfunction MediaPost({\n class: className,\n statusID,\n status,\n instance,\n parent,\n // allowFilters,\n onMediaClick,\n}) {\n let sKey = statusKey(statusID, instance);\n const snapStates = useSnapshot(states);\n if (!status) {\n status = snapStates.statuses[sKey] || snapStates.statuses[statusID];\n sKey = statusKey(status?.id, instance);\n }\n if (!status) {\n return null;\n }\n\n const {\n account: {\n acct,\n avatar,\n avatarStatic,\n id: accountId,\n url: accountURL,\n displayName,\n username,\n emojis: accountEmojis,\n bot,\n group,\n },\n id,\n repliesCount,\n reblogged,\n reblogsCount,\n favourited,\n favouritesCount,\n bookmarked,\n poll,\n muted,\n sensitive,\n spoilerText,\n visibility, // public, unlisted, private, direct\n language,\n editedAt,\n filtered,\n card,\n createdAt,\n inReplyToId,\n inReplyToAccountId,\n content,\n mentions,\n mediaAttachments,\n reblog,\n uri,\n url,\n emojis,\n // Non-API props\n _deleted,\n _pinned,\n // _filtered,\n } = status;\n\n if (!mediaAttachments?.length) {\n return null;\n }\n\n const debugHover = (e) => {\n if (e.shiftKey) {\n console.log({\n ...status,\n });\n }\n };\n\n const currentAccount = useMemo(() => {\n return store.session.get('currentAccount');\n }, []);\n const isSelf = useMemo(() => {\n return currentAccount && currentAccount === accountId;\n }, [accountId, currentAccount]);\n\n const filterContext = useContext(FilterContext);\n const filterInfo = !isSelf && isFiltered(filtered, filterContext);\n\n if (filterInfo?.action === 'hide') {\n return null;\n }\n\n console.debug('RENDER Media post', id, status?.account.displayName);\n\n const hasSpoiler = sensitive;\n const readingExpandMedia = useMemo(() => {\n // default | show_all | hide_all\n const prefs = store.account.get('preferences') || {};\n return prefs['reading:expand:media'] || 'default';\n }, []);\n const showSpoilerMedia = readingExpandMedia === 'show_all';\n\n const Parent = parent || 'div';\n\n return mediaAttachments.map((media, i) => {\n const mediaKey = `${sKey}-${media.id}`;\n const filterTitleStr = filterInfo?.titlesStr;\n return (\n <Parent\n data-state-post-id={sKey}\n onMouseEnter={debugHover}\n key={mediaKey}\n data-spoiler-text={\n spoilerText || (sensitive ? 'Sensitive media' : undefined)\n }\n data-filtered-text={\n filterInfo\n ? `Filtered${filterTitleStr ? `: ${filterTitleStr}` : ''}`\n : undefined\n }\n class={`\n media-post\n ${filterInfo ? 'filtered' : ''}\n ${hasSpoiler ? 'has-spoiler' : ''}\n ${showSpoilerMedia ? 'show-media' : ''}\n `}\n >\n <Media\n class={className}\n media={media}\n lang={language}\n to={`/${instance}/s/${id}?media-only=${i + 1}`}\n onClick={\n onMediaClick ? (e) => onMediaClick(e, i, media, status) : undefined\n }\n />\n </Parent>\n );\n });\n}\n\nexport default memo(MediaPost);\n","import './nav-menu.css';\n\nimport { ControlledMenu, MenuDivider, MenuItem } from '@szhsin/react-menu';\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport { useLongPress } from 'use-long-press';\nimport { useSnapshot } from 'valtio';\n\nimport { api } from '../utils/api';\nimport safeBoundingBoxPadding from '../utils/safe-bounding-box-padding';\nimport states from '../utils/states';\nimport store from '../utils/store';\n\nimport Avatar from './avatar';\nimport Icon from './icon';\nimport MenuLink from './menu-link';\n\nfunction NavMenu(props) {\n const snapStates = useSnapshot(states);\n const { masto, instance, authenticated } = api();\n\n const [currentAccount, setCurrentAccount] = useState();\n const [moreThanOneAccount, setMoreThanOneAccount] = useState(false);\n\n useEffect(() => {\n const accounts = store.local.getJSON('accounts') || [];\n const acc = accounts.find(\n (account) => account.info.id === store.session.get('currentAccount'),\n );\n if (acc) setCurrentAccount(acc);\n setMoreThanOneAccount(accounts.length > 1);\n }, []);\n\n // Home = Following\n // But when in multi-column mode, Home becomes columns of anything\n // User may choose pin or not to pin Following\n // If user doesn't pin Following, we show it in the menu\n const showFollowing =\n (snapStates.settings.shortcutsViewMode === 'multi-column' ||\n (!snapStates.settings.shortcutsViewMode &&\n snapStates.settings.shortcutsColumnsMode)) &&\n !snapStates.shortcuts.find((pin) => pin.type === 'following');\n\n const bindLongPress = useLongPress(\n () => {\n states.showAccounts = true;\n },\n {\n threshold: 600,\n detect: 'touch',\n cancelOnMovement: true,\n },\n );\n\n const buttonRef = useRef();\n const [menuState, setMenuState] = useState(undefined);\n\n const boundingBoxPadding = safeBoundingBoxPadding([\n 0,\n 0,\n snapStates.settings.shortcutsViewMode === 'tab-menu-bar' ? 50 : 0,\n 0,\n ]);\n\n const mutesIterator = useRef();\n async function fetchMutes(firstLoad) {\n if (firstLoad || !mutesIterator.current) {\n mutesIterator.current = masto.v1.mutes.list({\n limit: 80,\n });\n }\n const results = await mutesIterator.current.next();\n return results;\n }\n\n const blocksIterator = useRef();\n async function fetchBlocks(firstLoad) {\n if (firstLoad || !blocksIterator.current) {\n blocksIterator.current = masto.v1.blocks.list({\n limit: 80,\n });\n }\n const results = await blocksIterator.current.next();\n return results;\n }\n\n return (\n <>\n <button\n ref={buttonRef}\n type=\"button\"\n class={`button plain nav-menu-button ${\n moreThanOneAccount ? 'with-avatar' : ''\n } ${open ? 'active' : ''}`}\n style={{ position: 'relative' }}\n onClick={() => {\n setMenuState((state) => (!state ? 'open' : undefined));\n }}\n onContextMenu={(e) => {\n e.preventDefault();\n states.showAccounts = true;\n }}\n {...bindLongPress()}\n >\n {moreThanOneAccount && (\n <Avatar\n url={\n currentAccount?.info?.avatar || currentAccount?.info?.avatarStatic\n }\n size=\"l\"\n squircle={currentAccount?.info?.bot}\n />\n )}\n <Icon icon=\"menu\" size={moreThanOneAccount ? 's' : 'l'} />\n </button>\n <ControlledMenu\n menuClassName=\"nav-menu\"\n state={menuState}\n anchorRef={buttonRef}\n onClose={() => {\n setMenuState(undefined);\n }}\n containerProps={{\n style: {\n zIndex: 10,\n },\n onClick: () => {\n setMenuState(undefined);\n },\n }}\n portal={{\n target: document.body,\n }}\n {...props}\n overflow=\"auto\"\n viewScroll=\"close\"\n position=\"anchor\"\n align=\"center\"\n boundingBoxPadding={boundingBoxPadding}\n unmountOnClose\n >\n {!!snapStates.appVersion?.commitHash &&\n __COMMIT_HASH__ !== snapStates.appVersion.commitHash && (\n <div class=\"top-menu\">\n <MenuItem\n onClick={() => {\n const yes = confirm('Reload page now to update?');\n if (yes) {\n (async () => {\n try {\n location.reload();\n } catch (e) {}\n })();\n }\n }}\n >\n <Icon icon=\"sparkles\" class=\"sparkle-icon\" size=\"l\" />{' '}\n <span>New update available…</span>\n </MenuItem>\n <MenuDivider />\n </div>\n )}\n <section>\n <MenuLink to=\"/\">\n <Icon icon=\"home\" size=\"l\" /> <span>Home</span>\n </MenuLink>\n {authenticated && (\n <>\n {showFollowing && (\n <MenuLink to=\"/following\">\n <Icon icon=\"following\" size=\"l\" /> <span>Following</span>\n </MenuLink>\n )}\n <MenuLink to=\"/mentions\">\n <Icon icon=\"at\" size=\"l\" /> <span>Mentions</span>\n </MenuLink>\n <MenuLink to=\"/notifications\">\n <Icon icon=\"notification\" size=\"l\" /> <span>Notifications</span>\n {snapStates.notificationsShowNew && (\n <sup title=\"New\" style={{ opacity: 0.5 }}>\n {' '}\n •\n </sup>\n )}\n </MenuLink>\n <MenuDivider />\n <MenuLink to=\"/l\">\n <Icon icon=\"list\" size=\"l\" /> <span>Lists</span>\n </MenuLink>\n <MenuLink to=\"/ft\">\n <Icon icon=\"hashtag\" size=\"l\" /> <span>Followed Hashtags</span>\n </MenuLink>\n <MenuLink to=\"/b\">\n <Icon icon=\"bookmark\" size=\"l\" /> <span>Bookmarks</span>\n </MenuLink>\n <MenuLink to=\"/f\">\n <Icon icon=\"heart\" size=\"l\" /> <span>Likes</span>\n </MenuLink>\n </>\n )}\n <MenuDivider />\n <MenuLink to={`/search`}>\n <Icon icon=\"search\" size=\"l\" /> <span>Search</span>\n </MenuLink>\n <MenuLink to={`/${instance}/p/l`}>\n <Icon icon=\"building\" size=\"l\" /> <span>Local</span>\n </MenuLink>\n <MenuLink to={`/${instance}/p`}>\n <Icon icon=\"earth\" size=\"l\" /> <span>Federated</span>\n </MenuLink>\n <MenuLink to={`/${instance}/trending`}>\n <Icon icon=\"chart\" size=\"l\" /> <span>Trending</span>\n </MenuLink>\n </section>\n <section>\n {authenticated ? (\n <>\n <MenuDivider />\n {currentAccount?.info?.id && (\n <MenuLink to={`/${instance}/a/${currentAccount.info.id}`}>\n <Icon icon=\"user\" size=\"l\" /> <span>Profile</span>\n </MenuLink>\n )}\n <MenuItem\n onClick={() => {\n states.showAccounts = true;\n }}\n >\n <Icon icon=\"group\" size=\"l\" /> <span>Accounts…</span>\n </MenuItem>\n <MenuItem\n onClick={() => {\n states.showGenericAccounts = {\n id: 'mute',\n heading: 'Muted users',\n fetchAccounts: fetchMutes,\n excludeRelationshipAttrs: ['muting'],\n };\n }}\n >\n <Icon icon=\"mute\" size=\"l\" /> Muted users…\n </MenuItem>\n <MenuItem\n onClick={() => {\n states.showGenericAccounts = {\n id: 'block',\n heading: 'Blocked users',\n fetchAccounts: fetchBlocks,\n excludeRelationshipAttrs: ['blocking'],\n };\n }}\n >\n <Icon icon=\"block\" size=\"l\" />\n Blocked users…\n </MenuItem>\n <MenuDivider className=\"divider-grow\" />\n <MenuItem\n onClick={() => {\n states.showKeyboardShortcutsHelp = true;\n }}\n >\n <Icon icon=\"keyboard\" size=\"l\" />{' '}\n <span>Keyboard shortcuts</span>\n </MenuItem>\n <MenuItem\n onClick={() => {\n states.showShortcutsSettings = true;\n }}\n >\n <Icon icon=\"shortcut\" size=\"l\" />{' '}\n <span>Shortcuts / Columns…</span>\n </MenuItem>\n <MenuItem\n onClick={() => {\n states.showSettings = true;\n }}\n >\n <Icon icon=\"gear\" size=\"l\" /> <span>Settings…</span>\n </MenuItem>\n </>\n ) : (\n <>\n <MenuDivider />\n <MenuLink to=\"/login\">\n <Icon icon=\"user\" size=\"l\" /> <span>Log in</span>\n </MenuLink>\n <MenuItem\n onClick={() => {\n states.showSettings = true;\n }}\n >\n <Icon icon=\"gear\" size=\"l\" /> <span>Settings…</span>\n </MenuItem>\n </>\n )}\n </section>\n </ControlledMenu>\n </>\n );\n}\n\nexport default NavMenu;\n","import { useCallback, useEffect, useRef, useState } from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport { InView } from 'react-intersection-observer';\nimport { useDebouncedCallback } from 'use-debounce';\nimport { useSnapshot } from 'valtio';\n\nimport FilterContext from '../utils/filter-context';\nimport { filteredItems, isFiltered } from '../utils/filters';\nimport states, { statusKey } from '../utils/states';\nimport statusPeek from '../utils/status-peek';\nimport { groupBoosts, groupContext } from '../utils/timeline-utils';\nimport useInterval from '../utils/useInterval';\nimport usePageVisibility from '../utils/usePageVisibility';\nimport useScroll from '../utils/useScroll';\nimport useScrollFn from '../utils/useScrollFn';\n\nimport Icon from './icon';\nimport Link from './link';\nimport MediaPost from './media-post';\nimport NavMenu from './nav-menu';\nimport Status from './status';\n\nconst scrollIntoViewOptions = {\n block: 'nearest',\n inline: 'center',\n behavior: 'smooth',\n};\n\nfunction Timeline({\n title,\n titleComponent,\n id,\n instance,\n emptyText,\n errorText,\n useItemID, // use statusID instead of status object, assuming it's already in states\n boostsCarousel,\n fetchItems = () => {},\n checkForUpdates = () => {},\n checkForUpdatesInterval = 15_000, // 15 seconds\n headerStart,\n headerEnd,\n timelineStart,\n // allowFilters,\n refresh,\n view,\n filterContext,\n showFollowedTags,\n}) {\n const snapStates = useSnapshot(states);\n const [items, setItems] = useState([]);\n const [uiState, setUIState] = useState('default');\n const [showMore, setShowMore] = useState(false);\n const [showNew, setShowNew] = useState(false);\n const [visible, setVisible] = useState(true);\n const scrollableRef = useRef();\n\n console.debug('RENDER Timeline', id, refresh);\n\n const allowGrouping = view !== 'media';\n const loadItems = useDebouncedCallback(\n (firstLoad) => {\n setShowNew(false);\n if (uiState === 'loading') return;\n setUIState('loading');\n (async () => {\n try {\n let { done, value } = await fetchItems(firstLoad);\n if (Array.isArray(value)) {\n // Avoid grouping for pinned posts\n const [pinnedPosts, otherPosts] = value.reduce(\n (acc, item) => {\n if (item._pinned) {\n acc[0].push(item);\n } else {\n acc[1].push(item);\n }\n return acc;\n },\n [[], []],\n );\n value = otherPosts;\n if (allowGrouping) {\n if (boostsCarousel) {\n value = groupBoosts(value);\n }\n value = groupContext(value);\n }\n if (pinnedPosts.length) {\n value = pinnedPosts.concat(value);\n }\n console.log(value);\n if (firstLoad) {\n setItems(value);\n } else {\n setItems((items) => [...items, ...value]);\n }\n if (!value.length) done = true;\n setShowMore(!done);\n } else {\n setShowMore(false);\n }\n setUIState('default');\n } catch (e) {\n console.error(e);\n setUIState('error');\n } finally {\n loadItems.cancel();\n }\n })();\n },\n 1500,\n {\n leading: true,\n trailing: false,\n },\n );\n\n const itemsSelector = '.timeline-item, .timeline-item-alt';\n\n const jRef = useHotkeys('j, shift+j', (_, handler) => {\n // focus on next status after active item\n const activeItem = document.activeElement.closest(itemsSelector);\n const activeItemRect = activeItem?.getBoundingClientRect();\n const allItems = Array.from(\n scrollableRef.current.querySelectorAll(itemsSelector),\n );\n if (\n activeItem &&\n activeItemRect.top < scrollableRef.current.clientHeight &&\n activeItemRect.bottom > 0\n ) {\n const activeItemIndex = allItems.indexOf(activeItem);\n let nextItem = allItems[activeItemIndex + 1];\n if (handler.shift) {\n // get next status that's not .timeline-item-alt\n nextItem = allItems.find(\n (item, index) =>\n index > activeItemIndex &&\n !item.classList.contains('timeline-item-alt'),\n );\n }\n if (nextItem) {\n nextItem.focus();\n nextItem.scrollIntoView(scrollIntoViewOptions);\n }\n } else {\n // If active status is not in viewport, get the topmost status-link in viewport\n const topmostItem = allItems.find((item) => {\n const itemRect = item.getBoundingClientRect();\n return itemRect.top >= 44 && itemRect.left >= 0; // 44 is the magic number for header height, not real\n });\n if (topmostItem) {\n topmostItem.focus();\n topmostItem.scrollIntoView(scrollIntoViewOptions);\n }\n }\n });\n\n const kRef = useHotkeys('k, shift+k', (_, handler) => {\n // focus on previous status after active item\n const activeItem = document.activeElement.closest(itemsSelector);\n const activeItemRect = activeItem?.getBoundingClientRect();\n const allItems = Array.from(\n scrollableRef.current.querySelectorAll(itemsSelector),\n );\n if (\n activeItem &&\n activeItemRect.top < scrollableRef.current.clientHeight &&\n activeItemRect.bottom > 0\n ) {\n const activeItemIndex = allItems.indexOf(activeItem);\n let prevItem = allItems[activeItemIndex - 1];\n if (handler.shift) {\n // get prev status that's not .timeline-item-alt\n prevItem = allItems.findLast(\n (item, index) =>\n index < activeItemIndex &&\n !item.classList.contains('timeline-item-alt'),\n );\n }\n if (prevItem) {\n prevItem.focus();\n prevItem.scrollIntoView(scrollIntoViewOptions);\n }\n } else {\n // If active status is not in viewport, get the topmost status-link in viewport\n const topmostItem = allItems.find((item) => {\n const itemRect = item.getBoundingClientRect();\n return itemRect.top >= 44 && itemRect.left >= 0; // 44 is the magic number for header height, not real\n });\n if (topmostItem) {\n topmostItem.focus();\n topmostItem.scrollIntoView(scrollIntoViewOptions);\n }\n }\n });\n\n const oRef = useHotkeys(['enter', 'o'], () => {\n // open active status\n const activeItem = document.activeElement.closest(itemsSelector);\n if (activeItem) {\n activeItem.click();\n }\n });\n\n // const {\n // scrollDirection,\n // nearReachStart,\n // nearReachEnd,\n // reachStart,\n // reachEnd,\n // } = useScroll({\n // scrollableRef,\n // distanceFromEnd: 2,\n // scrollThresholdStart: 44,\n // });\n const headerRef = useRef();\n // const [hiddenUI, setHiddenUI] = useState(false);\n const [nearReachStart, setNearReachStart] = useState(false);\n useScrollFn(\n {\n scrollableRef,\n distanceFromEnd: 2,\n scrollThresholdStart: 44,\n },\n ({\n scrollDirection,\n nearReachStart,\n nearReachEnd,\n reachStart,\n reachEnd,\n }) => {\n // setHiddenUI(scrollDirection === 'end' && !nearReachEnd);\n if (headerRef.current) {\n const hiddenUI = scrollDirection === 'end' && !nearReachStart;\n headerRef.current.hidden = hiddenUI;\n }\n setNearReachStart(nearReachStart);\n if (reachStart) {\n loadItems(true);\n }\n // else if (nearReachEnd || (reachEnd && showMore)) {\n // loadItems();\n // }\n },\n [],\n );\n\n useEffect(() => {\n scrollableRef.current?.scrollTo({ top: 0 });\n loadItems(true);\n }, []);\n useEffect(() => {\n loadItems(true);\n }, [refresh]);\n\n // useEffect(() => {\n // if (reachStart) {\n // loadItems(true);\n // }\n // }, [reachStart]);\n\n // useEffect(() => {\n // if (nearReachEnd || (reachEnd && showMore)) {\n // loadItems();\n // }\n // }, [nearReachEnd, showMore]);\n\n const prevView = useRef(view);\n useEffect(() => {\n if (prevView.current !== view) {\n prevView.current = view;\n setItems([]);\n }\n }, [view]);\n\n const loadOrCheckUpdates = useCallback(\n async ({ disableIdleCheck = false } = {}) => {\n const noPointers = scrollableRef.current\n ? getComputedStyle(scrollableRef.current).pointerEvents === 'none'\n : false;\n console.log('✨ Load or check updates', id, {\n autoRefresh: snapStates.settings.autoRefresh,\n scrollTop: scrollableRef.current.scrollTop,\n disableIdleCheck,\n idle: window.__IDLE__,\n inBackground: inBackground(),\n noPointers,\n });\n if (\n snapStates.settings.autoRefresh &&\n scrollableRef.current.scrollTop < 16 &&\n (disableIdleCheck || window.__IDLE__) &&\n !inBackground() &&\n !noPointers\n ) {\n console.log('✨ Load updates', id, snapStates.settings.autoRefresh);\n loadItems(true);\n } else {\n console.log('✨ Check updates', id, snapStates.settings.autoRefresh);\n const hasUpdate = await checkForUpdates();\n if (hasUpdate) {\n console.log('✨ Has new updates', id);\n setShowNew(true);\n }\n }\n },\n [id, loadItems, checkForUpdates, snapStates.settings.autoRefresh],\n );\n\n const lastHiddenTime = useRef();\n usePageVisibility(\n (visible) => {\n if (visible) {\n const timeDiff = Date.now() - lastHiddenTime.current;\n if (!lastHiddenTime.current || timeDiff > 1000 * 3) {\n // 3 seconds\n loadOrCheckUpdates({\n disableIdleCheck: true,\n });\n }\n } else {\n lastHiddenTime.current = Date.now();\n }\n setVisible(visible);\n },\n [checkForUpdates, loadOrCheckUpdates, snapStates.settings.autoRefresh],\n );\n\n // checkForUpdates interval\n useInterval(\n loadOrCheckUpdates,\n visible && !showNew\n ? checkForUpdatesInterval * (nearReachStart ? 1 : 2)\n : null,\n );\n\n // const hiddenUI = scrollDirection === 'end' && !nearReachStart;\n\n return (\n <FilterContext.Provider value={filterContext}>\n <div\n id={`${id}-page`}\n class=\"deck-container\"\n ref={(node) => {\n scrollableRef.current = node;\n jRef.current = node;\n kRef.current = node;\n oRef.current = node;\n }}\n tabIndex=\"-1\"\n >\n <div class=\"timeline-deck deck\">\n <header\n ref={headerRef}\n // hidden={hiddenUI}\n onClick={(e) => {\n if (!e.target.closest('a, button')) {\n scrollableRef.current?.scrollTo({\n top: 0,\n behavior: 'smooth',\n });\n }\n }}\n onDblClick={(e) => {\n if (!e.target.closest('a, button')) {\n loadItems(true);\n }\n }}\n class={uiState === 'loading' ? 'loading' : ''}\n >\n <div class=\"header-grid\">\n <div class=\"header-side\">\n <NavMenu />\n {headerStart !== null && headerStart !== undefined ? (\n headerStart\n ) : (\n <Link to=\"/\" class=\"button plain home-button\">\n <Icon icon=\"home\" size=\"l\" />\n </Link>\n )}\n </div>\n {title && (titleComponent ? titleComponent : <h1>{title}</h1>)}\n <div class=\"header-side\">\n {/* <Loader hidden={uiState !== 'loading'} /> */}\n {!!headerEnd && headerEnd}\n </div>\n </div>\n {items.length > 0 &&\n uiState !== 'loading' &&\n // !hiddenUI &&\n showNew && (\n <button\n class=\"updates-button shiny-pill\"\n type=\"button\"\n onClick={() => {\n loadItems(true);\n scrollableRef.current?.scrollTo({\n top: 0,\n behavior: 'smooth',\n });\n }}\n >\n <Icon icon=\"arrow-up\" /> New posts\n </button>\n )}\n </header>\n {!!timelineStart && (\n <div\n class={`timeline-start ${uiState === 'loading' ? 'loading' : ''}`}\n >\n {timelineStart}\n </div>\n )}\n {!!items.length ? (\n <>\n <ul class={`timeline ${view ? `timeline-${view}` : ''}`}>\n {items.map((status) => (\n <TimelineItem\n status={status}\n instance={instance}\n useItemID={useItemID}\n // allowFilters={allowFilters}\n filterContext={filterContext}\n key={status.id + status?._pinned + view}\n view={view}\n showFollowedTags={showFollowedTags}\n />\n ))}\n {showMore &&\n uiState === 'loading' &&\n (view === 'media' ? null : (\n <>\n <li\n style={{\n height: '20vh',\n }}\n >\n <Status skeleton />\n </li>\n <li\n style={{\n height: '25vh',\n }}\n >\n <Status skeleton />\n </li>\n </>\n ))}\n </ul>\n {uiState === 'default' &&\n (showMore ? (\n <InView\n root={scrollableRef.current}\n rootMargin={`0px 0px ${screen.height * 1.5}px 0px`}\n onChange={(inView) => {\n if (inView) {\n loadItems();\n }\n }}\n >\n <button\n type=\"button\"\n class=\"plain block\"\n onClick={() => loadItems()}\n style={{ marginBlockEnd: '6em' }}\n >\n Show more…\n </button>\n </InView>\n ) : (\n <p class=\"ui-state insignificant\">The end.</p>\n ))}\n </>\n ) : uiState === 'loading' ? (\n <ul class=\"timeline\">\n {Array.from({ length: 5 }).map((_, i) =>\n view === 'media' ? (\n <div\n style={{\n height: '50vh',\n }}\n />\n ) : (\n <li key={i}>\n <Status skeleton />\n </li>\n ),\n )}\n </ul>\n ) : (\n uiState !== 'error' && <p class=\"ui-state\">{emptyText}</p>\n )}\n {uiState === 'error' && (\n <p class=\"ui-state\">\n {errorText}\n <br />\n <br />\n <button type=\"button\" onClick={() => loadItems(!items.length)}>\n Try again\n </button>\n </p>\n )}\n </div>\n </div>\n </FilterContext.Provider>\n );\n}\n\nfunction TimelineItem({\n status,\n instance,\n useItemID,\n // allowFilters,\n filterContext,\n view,\n showFollowedTags,\n}) {\n const { id: statusID, reblog, items, type, _pinned } = status;\n if (_pinned) useItemID = false;\n const actualStatusID = reblog?.id || statusID;\n const url = instance\n ? `/${instance}/s/${actualStatusID}`\n : `/s/${actualStatusID}`;\n let title = '';\n if (type === 'boosts') {\n title = `${items.length} Boosts`;\n } else if (type === 'pinned') {\n title = 'Pinned posts';\n }\n const isCarousel = type === 'boosts' || type === 'pinned';\n if (items) {\n const fItems = filteredItems(items, filterContext);\n if (isCarousel) {\n // Here, we don't hide filtered posts, but we sort them last\n fItems.sort((a, b) => {\n // if (a._filtered && !b._filtered) {\n // return 1;\n // }\n // if (!a._filtered && b._filtered) {\n // return -1;\n // }\n const aFiltered = isFiltered(a.filtered, filterContext);\n const bFiltered = isFiltered(b.filtered, filterContext);\n if (aFiltered && !bFiltered) {\n return 1;\n }\n if (!aFiltered && bFiltered) {\n return -1;\n }\n return 0;\n });\n return (\n <li key={`timeline-${statusID}`} class=\"timeline-item-carousel\">\n <StatusCarousel title={title} class={`${type}-carousel`}>\n {fItems.map((item) => {\n const { id: statusID, reblog, _pinned } = item;\n const actualStatusID = reblog?.id || statusID;\n const url = instance\n ? `/${instance}/s/${actualStatusID}`\n : `/s/${actualStatusID}`;\n if (_pinned) useItemID = false;\n return (\n <li key={statusID}>\n <Link class=\"status-carousel-link timeline-item-alt\" to={url}>\n {useItemID ? (\n <Status\n statusID={statusID}\n instance={instance}\n size=\"s\"\n contentTextWeight\n enableCommentHint\n // allowFilters={allowFilters}\n />\n ) : (\n <Status\n status={item}\n instance={instance}\n size=\"s\"\n contentTextWeight\n enableCommentHint\n // allowFilters={allowFilters}\n />\n )}\n </Link>\n </li>\n );\n })}\n </StatusCarousel>\n </li>\n );\n }\n const manyItems = fItems.length > 3;\n return fItems.map((item, i) => {\n const { id: statusID, _differentAuthor } = item;\n const url = instance ? `/${instance}/s/${statusID}` : `/s/${statusID}`;\n const isMiddle = i > 0 && i < fItems.length - 1;\n const isSpoiler = item.sensitive && !!item.spoilerText;\n const showCompact =\n (!_differentAuthor && isSpoiler && i > 0) ||\n (manyItems &&\n isMiddle &&\n (type === 'thread' ||\n (type === 'conversation' &&\n !_differentAuthor &&\n !fItems[i - 1]._differentAuthor &&\n !fItems[i + 1]._differentAuthor)));\n const isStart = i === 0;\n const isEnd = i === fItems.length - 1;\n return (\n <li\n key={`timeline-${statusID}`}\n class={`timeline-item-container timeline-item-container-type-${type} timeline-item-container-${\n isStart ? 'start' : isEnd ? 'end' : 'middle'\n } ${_differentAuthor ? 'timeline-item-diff-author' : ''}`}\n >\n <Link class=\"status-link timeline-item\" to={url}>\n {showCompact ? (\n <TimelineStatusCompact status={item} instance={instance} />\n ) : useItemID ? (\n <Status\n statusID={statusID}\n instance={instance}\n enableCommentHint={isEnd}\n showFollowedTags={showFollowedTags}\n // allowFilters={allowFilters}\n />\n ) : (\n <Status\n status={item}\n instance={instance}\n enableCommentHint={isEnd}\n showFollowedTags={showFollowedTags}\n // allowFilters={allowFilters}\n />\n )}\n </Link>\n </li>\n );\n });\n }\n\n const itemKey = `timeline-${statusID + _pinned}`;\n\n if (view === 'media') {\n return useItemID ? (\n <MediaPost\n class=\"timeline-item\"\n parent=\"li\"\n key={itemKey}\n statusID={statusID}\n instance={instance}\n // allowFilters={allowFilters}\n />\n ) : (\n <MediaPost\n class=\"timeline-item\"\n parent=\"li\"\n key={itemKey}\n status={status}\n instance={instance}\n // allowFilters={allowFilters}\n />\n );\n }\n\n return (\n <li key={itemKey}>\n <Link class=\"status-link timeline-item\" to={url}>\n {useItemID ? (\n <Status\n statusID={statusID}\n instance={instance}\n enableCommentHint\n showFollowedTags={showFollowedTags}\n // allowFilters={allowFilters}\n />\n ) : (\n <Status\n status={status}\n instance={instance}\n enableCommentHint\n showFollowedTags={showFollowedTags}\n // allowFilters={allowFilters}\n />\n )}\n </Link>\n </li>\n );\n}\n\nfunction StatusCarousel({ title, class: className, children }) {\n const carouselRef = useRef();\n // const { reachStart, reachEnd, init } = useScroll({\n // scrollableRef: carouselRef,\n // direction: 'horizontal',\n // });\n const startButtonRef = useRef();\n const endButtonRef = useRef();\n // useScrollFn(\n // {\n // scrollableRef: carouselRef,\n // direction: 'horizontal',\n // init: true,\n // },\n // ({ reachStart, reachEnd }) => {\n // if (startButtonRef.current) startButtonRef.current.disabled = reachStart;\n // if (endButtonRef.current) endButtonRef.current.disabled = reachEnd;\n // },\n // [],\n // );\n // useEffect(() => {\n // init?.();\n // }, []);\n\n const [render, setRender] = useState(false);\n useEffect(() => {\n setTimeout(() => {\n setRender(true);\n }, 1);\n }, []);\n\n return (\n <div class={`status-carousel ${className}`}>\n <header>\n <h3>{title}</h3>\n <span>\n <button\n ref={startButtonRef}\n type=\"button\"\n class=\"small plain2\"\n // disabled={reachStart}\n onClick={() => {\n carouselRef.current?.scrollBy({\n left: -Math.min(320, carouselRef.current?.offsetWidth),\n behavior: 'smooth',\n });\n }}\n >\n <Icon icon=\"chevron-left\" />\n </button>{' '}\n <button\n ref={endButtonRef}\n type=\"button\"\n class=\"small plain2\"\n // disabled={reachEnd}\n onClick={() => {\n carouselRef.current?.scrollBy({\n left: Math.min(320, carouselRef.current?.offsetWidth),\n behavior: 'smooth',\n });\n }}\n >\n <Icon icon=\"chevron-right\" />\n </button>\n </span>\n </header>\n <ul ref={carouselRef}>\n <InView\n class=\"status-carousel-beacon\"\n onChange={(inView) => {\n if (startButtonRef.current)\n startButtonRef.current.disabled = inView;\n }}\n />\n {children[0]}\n {render && children.slice(1)}\n <InView\n class=\"status-carousel-beacon\"\n onChange={(inView) => {\n if (endButtonRef.current) endButtonRef.current.disabled = inView;\n }}\n />\n </ul>\n </div>\n );\n}\n\nfunction TimelineStatusCompact({ status, instance }) {\n const snapStates = useSnapshot(states);\n const { id, visibility } = status;\n const statusPeekText = statusPeek(status);\n const sKey = statusKey(id, instance);\n return (\n <article\n class={`status compact-thread ${\n visibility === 'direct' ? 'visibility-direct' : ''\n }`}\n tabindex=\"-1\"\n >\n {!!snapStates.statusThreadNumber[sKey] ? (\n <div class=\"status-thread-badge\">\n <Icon icon=\"thread\" size=\"s\" />\n {snapStates.statusThreadNumber[sKey]\n ? ` ${snapStates.statusThreadNumber[sKey]}/X`\n : ''}\n </div>\n ) : (\n <div class=\"status-thread-badge\">\n <Icon icon=\"thread\" size=\"s\" />\n </div>\n )}\n <div class=\"content-compact\" title={statusPeekText}>\n {statusPeekText}\n {status.sensitive && status.spoilerText && (\n <>\n {' '}\n <span class=\"spoiler-badge\">\n <Icon icon=\"eye-close\" size=\"s\" />\n </span>\n </>\n )}\n </div>\n </article>\n );\n}\n\nfunction inBackground() {\n return !!document.querySelector('.deck-backdrop, #modal-container > *');\n}\n\nexport default Timeline;\n","import { MenuItem } from '@szhsin/react-menu';\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'preact/hooks';\nimport { useParams, useSearchParams } from 'react-router-dom';\nimport { useSnapshot } from 'valtio';\n\nimport AccountInfo from '../components/account-info';\nimport EmojiText from '../components/emoji-text';\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport Menu2 from '../components/menu2';\nimport Timeline from '../components/timeline';\nimport { api } from '../utils/api';\nimport pmem from '../utils/pmem';\nimport showToast from '../utils/show-toast';\nimport states from '../utils/states';\nimport { saveStatus } from '../utils/states';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 20;\nconst MIN_YEAR = 1983;\nconst MIN_YEAR_MONTH = `${MIN_YEAR}-01`; // Birth of the Internet\n\nconst supportsInputMonth = (() => {\n try {\n const input = document.createElement('input');\n input.setAttribute('type', 'month');\n return input.type === 'month';\n } catch (e) {\n return false;\n }\n})();\n\nasync function _isSearchEnabled(instance) {\n const { masto } = api({ instance });\n const results = await masto.v2.search.fetch({\n q: 'from:me',\n type: 'statuses',\n limit: 1,\n });\n return !!results?.statuses?.length;\n}\nconst isSearchEnabled = pmem(_isSearchEnabled);\n\nfunction AccountStatuses() {\n const snapStates = useSnapshot(states);\n const { id, ...params } = useParams();\n const [searchParams, setSearchParams] = useSearchParams();\n const month = searchParams.get('month');\n const excludeReplies = !searchParams.get('replies');\n const excludeBoosts = !!searchParams.get('boosts');\n const tagged = searchParams.get('tagged');\n const media = !!searchParams.get('media');\n const { masto, instance, authenticated } = api({ instance: params.instance });\n const { masto: currentMasto, instance: currentInstance } = api();\n const accountStatusesIterator = useRef();\n\n const allSearchParams = [month, excludeReplies, excludeBoosts, tagged, media];\n const [account, setAccount] = useState();\n const searchOffsetRef = useRef(0);\n useEffect(() => {\n searchOffsetRef.current = 0;\n }, allSearchParams);\n\n const sameCurrentInstance = useMemo(\n () => instance === currentInstance,\n [instance, currentInstance],\n );\n const [searchEnabled, setSearchEnabled] = useState(false);\n useEffect(() => {\n // Only enable for current logged-in instance\n // Most remote instances don't allow unauthenticated searches\n if (!sameCurrentInstance) return;\n if (!account?.acct) return;\n (async () => {\n const enabled = await isSearchEnabled(instance);\n console.log({ enabled });\n setSearchEnabled(enabled);\n })();\n }, [instance, sameCurrentInstance, account?.acct]);\n\n async function fetchAccountStatuses(firstLoad) {\n const isValidMonth = /^\\d{4}-[01]\\d$/.test(month);\n const isValidYear = month?.split?.('-')?.[0] >= MIN_YEAR;\n if (isValidMonth && isValidYear) {\n if (!account) {\n return {\n value: [],\n done: true,\n };\n }\n const [_year, _month] = month.split('-');\n const monthIndex = parseInt(_month, 10) - 1;\n // YYYY-MM (no day)\n // Search options:\n // - from:account\n // - after:YYYY-MM-DD (non-inclusive)\n // - before:YYYY-MM-DD (non-inclusive)\n\n // Last day of previous month\n const after = new Date(_year, monthIndex, 0);\n const afterStr = `${after.getFullYear()}-${(after.getMonth() + 1)\n .toString()\n .padStart(2, '0')}-${after.getDate().toString().padStart(2, '0')}`;\n // First day of next month\n const before = new Date(_year, monthIndex + 1, 1);\n const beforeStr = `${before.getFullYear()}-${(before.getMonth() + 1)\n .toString()\n .padStart(2, '0')}-${before.getDate().toString().padStart(2, '0')}`;\n console.log({\n month,\n _year,\n _month,\n monthIndex,\n after,\n before,\n afterStr,\n beforeStr,\n });\n\n let limit;\n if (firstLoad) {\n limit = LIMIT + 1;\n searchOffsetRef.current = 0;\n } else {\n limit = LIMIT + searchOffsetRef.current + 1;\n searchOffsetRef.current += LIMIT;\n }\n\n const searchResults = await masto.v2.search.fetch({\n q: `from:${account.acct} after:${afterStr} before:${beforeStr}`,\n type: 'statuses',\n limit,\n offset: searchOffsetRef.current,\n });\n if (searchResults?.statuses?.length) {\n const value = searchResults.statuses.slice(0, LIMIT);\n value.forEach((item) => {\n saveStatus(item, instance);\n });\n const done = searchResults.statuses.length <= LIMIT;\n return { value, done };\n } else {\n return { value: [], done: true };\n }\n }\n\n const results = [];\n if (firstLoad) {\n const { value } = await masto.v1.accounts\n .$select(id)\n .statuses.list({\n pinned: true,\n })\n .next();\n if (value?.length && !tagged && !media) {\n const pinnedStatuses = value.map((status) => {\n saveStatus(status, instance);\n return {\n ...status,\n _pinned: true,\n };\n });\n if (pinnedStatuses.length >= 3) {\n const pinnedStatusesIds = pinnedStatuses.map((status) => status.id);\n results.push({\n id: pinnedStatusesIds,\n items: pinnedStatuses,\n type: 'pinned',\n });\n } else {\n results.push(...pinnedStatuses);\n }\n }\n }\n if (firstLoad || !accountStatusesIterator.current) {\n accountStatusesIterator.current = masto.v1.accounts\n .$select(id)\n .statuses.list({\n limit: LIMIT,\n exclude_replies: excludeReplies,\n exclude_reblogs: excludeBoosts,\n only_media: media,\n tagged,\n });\n }\n const { value, done } = await accountStatusesIterator.current.next();\n if (value?.length) {\n results.push(...value);\n\n value.forEach((item) => {\n saveStatus(item, instance);\n });\n }\n return {\n value: results,\n done,\n };\n }\n\n const [featuredTags, setFeaturedTags] = useState([]);\n useTitle(\n account?.acct\n ? `${account?.displayName ? account.displayName + ' ' : ''}@${\n account.acct\n }${\n !excludeReplies\n ? ' (+ Replies)'\n : excludeBoosts\n ? ' (- Boosts)'\n : tagged\n ? ` (#${tagged})`\n : media\n ? ' (Media)'\n : month\n ? ` (${new Date(month).toLocaleString('default', {\n month: 'long',\n year: 'numeric',\n })})`\n : ''\n }`\n : 'Account posts',\n '/:instance?/a/:id',\n );\n\n const fetchAccountPromiseRef = useRef();\n const fetchAccount = useCallback(() => {\n const fetchPromise =\n fetchAccountPromiseRef.current || masto.v1.accounts.$select(id).fetch();\n fetchAccountPromiseRef.current = fetchPromise;\n return fetchPromise;\n }, [id, masto]);\n\n useEffect(() => {\n (async () => {\n try {\n const acc = await fetchAccount();\n console.log(acc);\n setAccount(acc);\n } catch (e) {\n console.error(e);\n }\n try {\n const featuredTags = await masto.v1.accounts\n .$select(id)\n .featuredTags.list();\n console.log({ featuredTags });\n setFeaturedTags(featuredTags);\n } catch (e) {\n console.error(e);\n }\n })();\n }, [id]);\n\n const { displayName, acct, emojis } = account || {};\n\n const accountInfoMemo = useMemo(() => {\n const cachedAccount = snapStates.accounts[`${id}@${instance}`];\n return (\n <AccountInfo\n instance={instance}\n account={cachedAccount || id}\n fetchAccount={fetchAccount}\n authenticated={authenticated}\n standalone\n />\n );\n }, [id, instance, authenticated, fetchAccount]);\n\n const filterBarRef = useRef();\n const TimelineStart = useMemo(() => {\n const filtered =\n !excludeReplies || excludeBoosts || tagged || media || !!month;\n\n return (\n <>\n {accountInfoMemo}\n <div\n class=\"filter-bar\"\n ref={filterBarRef}\n style={{\n position: 'relative',\n }}\n >\n {filtered ? (\n <Link\n to={`/${instance}/a/${id}`}\n class=\"insignificant filter-clear\"\n title=\"Clear filters\"\n key=\"clear-filters\"\n >\n <Icon icon=\"x\" size=\"l\" />\n </Link>\n ) : (\n <Icon icon=\"filter\" class=\"insignificant\" size=\"l\" />\n )}\n <Link\n to={`/${instance}/a/${id}${excludeReplies ? '?replies=1' : ''}`}\n onClick={() => {\n if (excludeReplies) {\n showToast('Showing post with replies');\n }\n }}\n class={excludeReplies ? '' : 'is-active'}\n >\n + Replies\n </Link>\n <Link\n to={`/${instance}/a/${id}${excludeBoosts ? '' : '?boosts=0'}`}\n onClick={() => {\n if (!excludeBoosts) {\n showToast('Showing posts without boosts');\n }\n }}\n class={!excludeBoosts ? '' : 'is-active'}\n >\n - Boosts\n </Link>\n <Link\n to={`/${instance}/a/${id}${media ? '' : '?media=1'}`}\n onClick={() => {\n if (!media) {\n showToast('Showing posts with media');\n }\n }}\n class={media ? 'is-active' : ''}\n >\n Media\n </Link>\n {featuredTags.map((tag) => (\n <Link\n key={tag.id}\n to={`/${instance}/a/${id}${\n tagged === tag.name\n ? ''\n : `?tagged=${encodeURIComponent(tag.name)}`\n }`}\n onClick={() => {\n if (tagged !== tag.name) {\n showToast(`Showing posts tagged with #${tag.name}`);\n }\n }}\n class={tagged === tag.name ? 'is-active' : ''}\n >\n <span>\n <span class=\"more-insignificant\">#</span>\n {tag.name}\n </span>\n {\n // The count differs based on instance 😅\n }\n {/* <span class=\"filter-count\">{tag.statusesCount}</span> */}\n </Link>\n ))}\n {searchEnabled &&\n (supportsInputMonth ? (\n <label class={`filter-field ${month ? 'is-active' : ''}`}>\n <Icon icon=\"month\" size=\"l\" />\n <input\n type=\"month\"\n disabled={!account?.acct}\n value={month || ''}\n min={MIN_YEAR_MONTH}\n max={new Date().toISOString().slice(0, 7)}\n onInput={(e) => {\n const { value, validity } = e.currentTarget;\n if (!validity.valid) return;\n setSearchParams(\n value\n ? {\n month: value,\n }\n : {},\n );\n const [year, month] = value.split('-');\n const monthIndex = parseInt(month, 10) - 1;\n const date = new Date(year, monthIndex);\n showToast(\n `Showing posts in ${date.toLocaleString('default', {\n month: 'long',\n year: 'numeric',\n })}`,\n );\n }}\n />\n </label>\n ) : (\n // Fallback to <select> for month and <input type=\"number\"> for year\n <MonthPicker\n class={`filter-field ${month ? 'is-active' : ''}`}\n disabled={!account?.acct}\n value={month || ''}\n min={MIN_YEAR_MONTH}\n max={new Date().toISOString().slice(0, 7)}\n onInput={(e) => {\n const { value, validity } = e;\n if (!validity.valid) return;\n setSearchParams(\n value\n ? {\n month: value,\n }\n : {},\n );\n }}\n />\n ))}\n </div>\n </>\n );\n }, [\n id,\n instance,\n authenticated,\n featuredTags,\n searchEnabled,\n ...allSearchParams,\n ]);\n\n useEffect(() => {\n // Focus on .is-active\n const active = filterBarRef.current?.querySelector('.is-active');\n if (active) {\n console.log('active', active, active.offsetLeft);\n filterBarRef.current.scrollTo({\n behavior: 'smooth',\n left:\n active.offsetLeft -\n (filterBarRef.current.offsetWidth - active.offsetWidth) / 2,\n });\n }\n }, [featuredTags, searchEnabled, ...allSearchParams]);\n\n const accountInstance = useMemo(() => {\n if (!account?.url) return null;\n const domain = new URL(account.url).hostname;\n return domain;\n }, [account]);\n const sameInstance = instance === accountInstance;\n const allowSwitch = !!account && !sameInstance;\n\n return (\n <Timeline\n key={id}\n title={`${account?.acct ? '@' + account.acct : 'Posts'}`}\n titleComponent={\n <h1\n class=\"header-double-lines header-account\"\n // onClick={() => {\n // states.showAccount = {\n // account,\n // instance,\n // };\n // }}\n >\n <b>\n <EmojiText text={displayName} emojis={emojis} />\n </b>\n <div>\n <span>@{acct}</span>\n </div>\n </h1>\n }\n id=\"account-statuses\"\n instance={instance}\n emptyText=\"Nothing to see here yet.\"\n errorText=\"Unable to load posts\"\n fetchItems={fetchAccountStatuses}\n useItemID\n view={media ? 'media' : undefined}\n boostsCarousel={snapStates.settings.boostsCarousel}\n timelineStart={TimelineStart}\n refresh={[\n excludeReplies,\n excludeBoosts,\n tagged,\n media,\n month + account?.acct,\n ].toString()}\n headerEnd={\n <Menu2\n portal\n // setDownOverflow\n overflow=\"auto\"\n viewScroll=\"close\"\n position=\"anchor\"\n menuButton={\n <button type=\"button\" class=\"plain\">\n <Icon icon=\"more\" size=\"l\" />\n </button>\n }\n >\n <MenuItem\n disabled={!allowSwitch}\n onClick={() => {\n (async () => {\n try {\n const { masto } = api({\n instance: accountInstance,\n });\n const acc = await masto.v1.accounts.lookup({\n acct: account.acct,\n });\n const { id } = acc;\n location.hash = `/${accountInstance}/a/${id}`;\n } catch (e) {\n console.error(e);\n alert('Unable to fetch account info');\n }\n })();\n }}\n >\n <Icon icon=\"transfer\" />{' '}\n <small class=\"menu-double-lines\">\n Switch to account's instance (<b>{accountInstance}</b>)\n </small>\n </MenuItem>\n {!sameCurrentInstance && (\n <MenuItem\n onClick={() => {\n (async () => {\n try {\n const acc = await currentMasto.v1.accounts.lookup({\n acct: account.acct + '@' + instance,\n });\n const { id } = acc;\n location.hash = `/${currentInstance}/a/${id}`;\n } catch (e) {\n console.error(e);\n alert('Unable to fetch account info');\n }\n })();\n }}\n >\n <Icon icon=\"transfer\" />{' '}\n <small class=\"menu-double-lines\">\n Switch to my instance (<b>{currentInstance}</b>)\n </small>\n </MenuItem>\n )}\n </Menu2>\n }\n />\n );\n}\n\nfunction MonthPicker(props) {\n const {\n class: className,\n disabled,\n value,\n min,\n max,\n onInput = () => {},\n } = props;\n const [_year, _month] = value?.split('-') || [];\n const monthFieldRef = useRef();\n const yearFieldRef = useRef();\n\n const checkValidity = (month, year) => {\n const [minYear, minMonth] = min?.split('-') || [];\n const [maxYear, maxMonth] = max?.split('-') || [];\n if (year < minYear) return false;\n if (year > maxYear) return false;\n if (year === minYear && month < minMonth) return false;\n if (year === maxYear && month > maxMonth) return false;\n return true;\n };\n\n return (\n <div class={className}>\n <Icon icon=\"month\" size=\"l\" />\n <select\n ref={monthFieldRef}\n disabled={disabled}\n value={_month || ''}\n onInput={(e) => {\n const { value: month } = e.currentTarget;\n const year = yearFieldRef.current.value;\n if (!checkValidity(month, year))\n return {\n value: '',\n validity: {\n valid: false,\n },\n };\n onInput({\n value: month ? `${year}-${month}` : '',\n validity: {\n valid: true,\n },\n });\n }}\n >\n <option value=\"\">Month</option>\n <option disabled>-----</option>\n {Array.from({ length: 12 }, (_, i) => (\n <option\n value={\n // Month is 1-indexed\n (i + 1).toString().padStart(2, '0')\n }\n key={i}\n >\n {new Date(0, i).toLocaleString('default', {\n month: 'long',\n })}\n </option>\n ))}\n </select>{' '}\n <input\n ref={yearFieldRef}\n type=\"number\"\n disabled={disabled}\n value={_year || new Date().getFullYear()}\n min={min?.slice(0, 4) || MIN_YEAR}\n max={max?.slice(0, 4) || new Date().getFullYear()}\n onInput={(e) => {\n const { value: year, validity } = e.currentTarget;\n const month = monthFieldRef.current.value;\n if (!validity.valid || !checkValidity(month, year))\n return {\n value: '',\n validity: {\n valid: false,\n },\n };\n onInput({\n value: year ? `${year}-${month}` : '',\n validity: {\n valid: true,\n },\n });\n }}\n style={{\n width: '4.5em',\n }}\n />\n </div>\n );\n}\n\nexport default AccountStatuses;\n","import { useRef } from 'preact/hooks';\n\nimport Timeline from '../components/timeline';\nimport { api } from '../utils/api';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 20;\n\nfunction Bookmarks() {\n useTitle('Bookmarks', '/b');\n const { masto, instance } = api();\n const bookmarksIterator = useRef();\n async function fetchBookmarks(firstLoad) {\n if (firstLoad || !bookmarksIterator.current) {\n bookmarksIterator.current = masto.v1.bookmarks.list({ limit: LIMIT });\n }\n return await bookmarksIterator.current.next();\n }\n\n return (\n <Timeline\n title=\"Bookmarks\"\n id=\"bookmarks\"\n emptyText=\"No bookmarks yet. Go bookmark something!\"\n errorText=\"Unable to load bookmarks\"\n instance={instance}\n fetchItems={fetchBookmarks}\n />\n );\n}\n\nexport default Bookmarks;\n","import { useRef } from 'preact/hooks';\n\nimport Timeline from '../components/timeline';\nimport { api } from '../utils/api';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 20;\n\nfunction Favourites() {\n useTitle('Likes', '/f');\n const { masto, instance } = api();\n const favouritesIterator = useRef();\n async function fetchFavourites(firstLoad) {\n if (firstLoad || !favouritesIterator.current) {\n favouritesIterator.current = masto.v1.favourites.list({ limit: LIMIT });\n }\n return await favouritesIterator.current.next();\n }\n\n return (\n <Timeline\n title=\"Likes\"\n id=\"favourites\"\n emptyText=\"No likes yet. Go like something!\"\n errorText=\"Unable to load likes\"\n instance={instance}\n fetchItems={fetchFavourites}\n />\n );\n}\n\nexport default Favourites;\n","import { useEffect, useState } from 'preact/hooks';\n\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport NavMenu from '../components/nav-menu';\nimport { api } from '../utils/api';\nimport { fetchFollowedTags } from '../utils/followed-tags';\nimport useTitle from '../utils/useTitle';\n\nfunction FollowedHashtags() {\n const { masto, instance } = api();\n useTitle(`Followed Hashtags`, `/ft`);\n const [uiState, setUIState] = useState('default');\n\n const [followedHashtags, setFollowedHashtags] = useState([]);\n useEffect(() => {\n setUIState('loading');\n (async () => {\n try {\n const tags = await fetchFollowedTags();\n setFollowedHashtags(tags);\n setUIState('default');\n } catch (e) {\n console.error(e);\n setUIState('error');\n }\n })();\n }, []);\n\n return (\n <div id=\"followed-hashtags-page\" class=\"deck-container\" tabIndex=\"-1\">\n <div class=\"timeline-deck deck\">\n <header>\n <div class=\"header-grid\">\n <div class=\"header-side\">\n <NavMenu />\n <Link to=\"/\" class=\"button plain\">\n <Icon icon=\"home\" size=\"l\" />\n </Link>\n </div>\n <h1>Followed Hashtags</h1>\n <div class=\"header-side\" />\n </div>\n </header>\n <main>\n {followedHashtags.length > 0 ? (\n <ul class=\"link-list\">\n {followedHashtags.map((tag) => (\n <li>\n <Link\n to={\n instance ? `/${instance}/t/${tag.name}` : `/t/${tag.name}`\n }\n >\n <Icon icon=\"hashtag\" /> <span>{tag.name}</span>\n </Link>\n </li>\n ))}\n </ul>\n ) : uiState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n ) : uiState === 'error' ? (\n <p class=\"ui-state\">Unable to load followed hashtags.</p>\n ) : (\n <p class=\"ui-state\">No hashtags followed yet.</p>\n )}\n </main>\n </div>\n </div>\n );\n}\n\nexport default FollowedHashtags;\n","import { useEffect, useRef } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport Timeline from '../components/timeline';\nimport { api } from '../utils/api';\nimport { filteredItems } from '../utils/filters';\nimport states from '../utils/states';\nimport { getStatus, saveStatus } from '../utils/states';\nimport {\n assignFollowedTags,\n clearFollowedTagsState,\n dedupeBoosts,\n} from '../utils/timeline-utils';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 20;\n\nfunction Following({ title, path, id, ...props }) {\n useTitle(title || 'Following', path || '/following');\n const { masto, streaming, instance } = api();\n const snapStates = useSnapshot(states);\n const homeIterator = useRef();\n const latestItem = useRef();\n\n console.debug('RENDER Following', title, id);\n\n async function fetchHome(firstLoad) {\n if (firstLoad || !homeIterator.current) {\n homeIterator.current = masto.v1.timelines.home.list({ limit: LIMIT });\n }\n const results = await homeIterator.current.next();\n let { value } = results;\n if (value?.length) {\n let latestItemChanged = false;\n if (firstLoad) {\n if (value[0].id !== latestItem.current) {\n latestItemChanged = true;\n }\n latestItem.current = value[0].id;\n console.log('First load', latestItem.current);\n }\n\n // value = filteredItems(value, 'home');\n value.forEach((item) => {\n saveStatus(item, instance);\n });\n value = dedupeBoosts(value, instance);\n if (firstLoad && latestItemChanged) clearFollowedTagsState();\n assignFollowedTags(value, instance);\n\n // ENFORCE sort by datetime (Latest first)\n value.sort((a, b) => {\n const aDate = new Date(a.createdAt);\n const bDate = new Date(b.createdAt);\n return bDate - aDate;\n });\n }\n return {\n ...results,\n value,\n };\n }\n\n async function checkForUpdates() {\n try {\n const results = await masto.v1.timelines.home\n .list({\n limit: 5,\n since_id: latestItem.current,\n })\n .next();\n let { value } = results;\n console.log('checkForUpdates', latestItem.current, value);\n if (value?.length) {\n latestItem.current = value[0].id;\n value = dedupeBoosts(value, instance);\n value = filteredItems(value, 'home');\n if (value.some((item) => !item.reblog)) {\n return true;\n }\n }\n return false;\n } catch (e) {\n return false;\n }\n }\n\n useEffect(() => {\n let sub;\n (async () => {\n if (streaming) {\n sub = streaming.user.subscribe();\n console.log('🎏 Streaming user', sub);\n for await (const entry of sub) {\n if (!sub) break;\n if (entry.event === 'status.update') {\n const status = entry.payload;\n console.log(`🔄 Status ${status.id} updated`);\n saveStatus(status, instance);\n } else if (entry.event === 'delete') {\n const statusID = entry.payload;\n console.log(`❌ Status ${statusID} deleted`);\n // delete states.statuses[statusID];\n const s = getStatus(statusID, instance);\n if (s) s._deleted = true;\n }\n }\n console.log('💥 Streaming user loop STOPPED');\n }\n })();\n return () => {\n sub?.unsubscribe?.();\n sub = null;\n };\n }, [streaming]);\n\n return (\n <Timeline\n title={title || 'Following'}\n id={id || 'following'}\n emptyText=\"Nothing to see here.\"\n errorText=\"Unable to load posts.\"\n instance={instance}\n fetchItems={fetchHome}\n checkForUpdates={checkForUpdates}\n useItemID\n boostsCarousel={snapStates.settings.boostsCarousel}\n {...props}\n // allowFilters\n filterContext=\"home\"\n showFollowedTags\n />\n );\n}\n\nexport default Following;\n","import {\n FocusableItem,\n MenuDivider,\n MenuGroup,\n MenuHeader,\n MenuItem,\n} from '@szhsin/react-menu';\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport { useNavigate, useParams, useSearchParams } from 'react-router-dom';\n\nimport Icon from '../components/icon';\nimport Menu2 from '../components/menu2';\nimport MenuConfirm from '../components/menu-confirm';\nimport { SHORTCUTS_LIMIT } from '../components/shortcuts-settings';\nimport Timeline from '../components/timeline';\nimport { api } from '../utils/api';\nimport { filteredItems } from '../utils/filters';\nimport showToast from '../utils/show-toast';\nimport states from '../utils/states';\nimport { saveStatus } from '../utils/states';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 20;\n\n// Limit is 4 per \"mode\"\n// https://github.com/mastodon/mastodon/issues/15194\n// Hard-coded https://github.com/mastodon/mastodon/blob/19614ba2477f3d12468f5ec251ce1cc5f8c6210c/app/models/tag_feed.rb#L4\nconst TAGS_LIMIT_PER_MODE = 4;\nconst TOTAL_TAGS_LIMIT = TAGS_LIMIT_PER_MODE + 1;\n\nfunction Hashtags({ media: mediaView, columnMode, ...props }) {\n // const navigate = useNavigate();\n let { hashtag, ...params } = columnMode ? {} : useParams();\n if (props.hashtag) hashtag = props.hashtag;\n let hashtags = hashtag.trim().split(/[\\s+]+/);\n hashtags.sort();\n hashtag = hashtags[0];\n const [searchParams, setSearchParams] = useSearchParams();\n const media = mediaView || !!searchParams.get('media');\n const linkParams = media ? '?media=1' : '';\n\n const { masto, instance, authenticated } = api({\n instance: props?.instance || params.instance,\n });\n const {\n masto: currentMasto,\n instance: currentInstance,\n authenticated: currentAuthenticated,\n } = api();\n const hashtagTitle = hashtags.map((t) => `#${t}`).join(' ');\n const hashtagPostTitle = media ? ` (Media only)` : '';\n const title = instance\n ? `${hashtagTitle}${hashtagPostTitle} on ${instance}`\n : `${hashtagTitle}${hashtagPostTitle}`;\n useTitle(title, `/:instance?/t/:hashtag`);\n const latestItem = useRef();\n\n // const hashtagsIterator = useRef();\n const maxID = useRef(undefined);\n async function fetchHashtags(firstLoad) {\n // if (firstLoad || !hashtagsIterator.current) {\n // hashtagsIterator.current = masto.v1.timelines.tag.$select(hashtag).list({\n // limit: LIMIT,\n // any: hashtags.slice(1),\n // });\n // }\n // const results = await hashtagsIterator.current.next();\n\n // NOTE: Temporary fix for listHashtag not persisting `any` in subsequent calls.\n const results = await masto.v1.timelines.tag\n .$select(hashtag)\n .list({\n limit: LIMIT,\n any: hashtags.slice(1),\n maxId: firstLoad ? undefined : maxID.current,\n onlyMedia: media,\n })\n .next();\n let { value } = results;\n if (value?.length) {\n if (firstLoad) {\n latestItem.current = value[0].id;\n }\n\n // value = filteredItems(value, 'public');\n value.forEach((item) => {\n saveStatus(item, instance, {\n skipThreading: media, // If media view, no need to form threads\n });\n });\n\n maxID.current = value[value.length - 1].id;\n }\n return {\n ...results,\n value,\n };\n }\n\n async function checkForUpdates() {\n try {\n const results = await masto.v1.timelines.tag\n .$select(hashtag)\n .list({\n limit: 1,\n any: hashtags.slice(1),\n since_id: latestItem.current,\n onlyMedia: media,\n })\n .next();\n let { value } = results;\n value = filteredItems(value, 'public');\n if (value?.length) {\n return true;\n }\n return false;\n } catch (e) {\n return false;\n }\n }\n\n const [followUIState, setFollowUIState] = useState('default');\n const [info, setInfo] = useState();\n // Get hashtag info\n useEffect(() => {\n (async () => {\n try {\n const info = await masto.v1.tags.$select(hashtag).fetch();\n console.log(info);\n setInfo(info);\n } catch (e) {\n console.error(e);\n }\n })();\n }, [hashtag]);\n\n const reachLimit = hashtags.length >= TOTAL_TAGS_LIMIT;\n\n return (\n <Timeline\n key={instance + hashtagTitle}\n title={title}\n titleComponent={\n !!instance && (\n <h1 class=\"header-double-lines\">\n <b>{hashtagTitle}</b>\n <div>{instance}</div>\n </h1>\n )\n }\n id=\"hashtag\"\n instance={instance}\n emptyText=\"No one has posted anything with this tag yet.\"\n errorText=\"Unable to load posts with this tag\"\n fetchItems={fetchHashtags}\n checkForUpdates={checkForUpdates}\n useItemID\n view={media ? 'media' : undefined}\n refresh={media}\n // allowFilters\n filterContext=\"public\"\n headerEnd={\n <Menu2\n portal\n setDownOverflow\n overflow=\"auto\"\n viewScroll=\"close\"\n position=\"anchor\"\n menuButton={\n <button type=\"button\" class=\"plain\">\n <Icon icon=\"more\" size=\"l\" />\n </button>\n }\n >\n {!!info && hashtags.length === 1 && (\n <>\n <MenuConfirm\n subMenu\n confirm={info.following}\n confirmLabel={`Unfollow #${hashtag}?`}\n disabled={followUIState === 'loading' || !authenticated}\n onClick={() => {\n setFollowUIState('loading');\n if (info.following) {\n // const yes = confirm(`Unfollow #${hashtag}?`);\n // if (!yes) {\n // setFollowUIState('default');\n // return;\n // }\n masto.v1.tags\n .$select(hashtag)\n .unfollow()\n .then(() => {\n setInfo({ ...info, following: false });\n showToast(`Unfollowed #${hashtag}`);\n })\n .catch((e) => {\n alert(e);\n console.error(e);\n })\n .finally(() => {\n setFollowUIState('default');\n });\n } else {\n masto.v1.tags\n .$select(hashtag)\n .follow()\n .then(() => {\n setInfo({ ...info, following: true });\n showToast(`Followed #${hashtag}`);\n })\n .catch((e) => {\n alert(e);\n console.error(e);\n })\n .finally(() => {\n setFollowUIState('default');\n });\n }\n }}\n >\n {info.following ? (\n <>\n <Icon icon=\"check-circle\" /> <span>Following…</span>\n </>\n ) : (\n <>\n <Icon icon=\"plus\" /> <span>Follow</span>\n </>\n )}\n </MenuConfirm>\n <MenuDivider />\n </>\n )}\n <MenuHeader className=\"plain\">Filters</MenuHeader>\n <MenuItem\n type=\"checkbox\"\n checked={!!media}\n onClick={() => {\n if (media) {\n searchParams.delete('media');\n } else {\n searchParams.set('media', '1');\n }\n setSearchParams(searchParams);\n }}\n >\n <Icon icon=\"check-circle\" />{' '}\n <span class=\"menu-grow\">Media only</span>\n </MenuItem>\n <MenuDivider />\n <FocusableItem className=\"menu-field\" disabled={reachLimit}>\n {({ ref }) => (\n <form\n onSubmit={(e) => {\n e.preventDefault();\n const newHashtag = e.target[0].value?.trim?.();\n // Use includes but need to be case insensitive\n if (\n newHashtag &&\n !hashtags.some(\n (t) => t.toLowerCase() === newHashtag.toLowerCase(),\n )\n ) {\n hashtags.push(newHashtag);\n hashtags.sort();\n // navigate(\n // instance\n // ? `/${instance}/t/${hashtags.join('+')}`\n // : `/t/${hashtags.join('+')}`,\n // );\n location.hash = instance\n ? `/${instance}/t/${hashtags.join('+')}`\n : `/t/${hashtags.join('+')}${linkParams}`;\n }\n }}\n >\n <Icon icon=\"hashtag\" />\n <input\n ref={ref}\n type=\"text\"\n placeholder={\n reachLimit ? `Max ${TOTAL_TAGS_LIMIT} tags` : 'Add hashtag'\n }\n required\n autocorrect=\"off\"\n autocapitalize=\"off\"\n spellcheck={false}\n // no spaces, no hashtags\n pattern=\"[^#][^\\s#]+[^#]\"\n disabled={reachLimit}\n />\n </form>\n )}\n </FocusableItem>\n <MenuGroup takeOverflow>\n {hashtags.map((t, i) => (\n <MenuItem\n key={t}\n disabled={hashtags.length === 1}\n onClick={(e) => {\n hashtags.splice(i, 1);\n hashtags.sort();\n // navigate(\n // instance\n // ? `/${instance}/t/${hashtags.join('+')}`\n // : `/t/${hashtags.join('+')}`,\n // );\n location.hash = instance\n ? `/${instance}/t/${hashtags.join('+')}${linkParams}`\n : `/t/${hashtags.join('+')}${linkParams}`;\n }}\n >\n <Icon icon=\"x\" alt=\"Remove hashtag\" class=\"danger-icon\" />\n <span>\n <span class=\"more-insignificant\">#</span>\n {t}\n </span>\n </MenuItem>\n ))}\n </MenuGroup>\n <MenuDivider />\n <MenuItem\n disabled={!currentAuthenticated}\n onClick={() => {\n if (states.shortcuts.length >= SHORTCUTS_LIMIT) {\n alert(\n `Max ${SHORTCUTS_LIMIT} shortcuts reached. Unable to add shortcut.`,\n );\n return;\n }\n const shortcut = {\n type: 'hashtag',\n hashtag: hashtags.join(' '),\n instance,\n media: media ? 'on' : undefined,\n };\n // Check if already exists\n const exists = states.shortcuts.some(\n (s) =>\n s.type === shortcut.type &&\n s.hashtag\n .split(/[\\s+]+/)\n .sort()\n .join(' ') ===\n shortcut.hashtag\n .split(/[\\s+]+/)\n .sort()\n .join(' ') &&\n (s.instance ? s.instance === shortcut.instance : true) &&\n (s.media ? !!s.media === !!shortcut.media : true),\n );\n if (exists) {\n alert('This shortcut already exists');\n } else {\n states.shortcuts.push(shortcut);\n showToast(`Hashtag shortcut added`);\n }\n }}\n >\n <Icon icon=\"shortcut\" /> <span>Add to Shorcuts</span>\n </MenuItem>\n <MenuItem\n onClick={() => {\n let newInstance = prompt(\n 'Enter a new instance e.g. \"mastodon.social\"',\n );\n if (!/\\./.test(newInstance)) {\n if (newInstance) alert('Invalid instance');\n return;\n }\n if (newInstance) {\n newInstance = newInstance.toLowerCase().trim();\n // navigate(`/${newInstance}/t/${hashtags.join('+')}`);\n location.hash = `/${newInstance}/t/${hashtags.join(\n '+',\n )}${linkParams}`;\n }\n }}\n >\n <Icon icon=\"bus\" /> <span>Go to another instance…</span>\n </MenuItem>\n {currentInstance !== instance && (\n <MenuItem\n onClick={() => {\n location.hash = `/${currentInstance}/t/${hashtags.join(\n '+',\n )}${linkParams}`;\n }}\n >\n <Icon icon=\"bus\" />{' '}\n <small class=\"menu-double-lines\">\n Go to my instance (<b>{currentInstance}</b>)\n </small>\n </MenuItem>\n )}\n </Menu2>\n }\n />\n );\n}\n\nexport default Hashtags;\n","import './lists.css';\n\nimport { Menu, MenuItem } from '@szhsin/react-menu';\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport { InView } from 'react-intersection-observer';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { useSnapshot } from 'valtio';\n\nimport AccountBlock from '../components/account-block';\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport ListAddEdit from '../components/list-add-edit';\nimport Menu2 from '../components/menu2';\nimport MenuConfirm from '../components/menu-confirm';\nimport Modal from '../components/modal';\nimport Timeline from '../components/timeline';\nimport { api } from '../utils/api';\nimport { filteredItems } from '../utils/filters';\nimport states, { saveStatus } from '../utils/states';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 20;\n\nfunction List(props) {\n const snapStates = useSnapshot(states);\n const { masto, instance } = api();\n const id = props?.id || useParams()?.id;\n // const navigate = useNavigate();\n const latestItem = useRef();\n // const [reloadCount, reload] = useReducer((c) => c + 1, 0);\n\n const listIterator = useRef();\n async function fetchList(firstLoad) {\n if (firstLoad || !listIterator.current) {\n listIterator.current = masto.v1.timelines.list.$select(id).list({\n limit: LIMIT,\n });\n }\n const results = await listIterator.current.next();\n let { value } = results;\n if (value?.length) {\n if (firstLoad) {\n latestItem.current = value[0].id;\n }\n\n // value = filteredItems(value, 'home');\n value.forEach((item) => {\n saveStatus(item, instance);\n });\n }\n return {\n ...results,\n value,\n };\n }\n\n async function checkForUpdates() {\n try {\n const results = await masto.v1.timelines.list.$select(id).list({\n limit: 1,\n since_id: latestItem.current,\n });\n let { value } = results;\n value = filteredItems(value, 'home');\n if (value?.length) {\n return true;\n }\n return false;\n } catch (e) {\n return false;\n }\n }\n\n const [list, setList] = useState({ title: 'List' });\n // const [title, setTitle] = useState(`List`);\n useTitle(list.title, `/l/:id`);\n useEffect(() => {\n (async () => {\n try {\n const list = await masto.v1.lists.$select(id).fetch();\n setList(list);\n // setTitle(list.title);\n } catch (e) {\n console.error(e);\n }\n })();\n }, [id]);\n\n const [showListAddEditModal, setShowListAddEditModal] = useState(false);\n const [showManageMembersModal, setShowManageMembersModal] = useState(false);\n\n return (\n <>\n <Timeline\n key={id}\n title={list.title}\n id=\"list\"\n emptyText=\"Nothing yet.\"\n errorText=\"Unable to load posts.\"\n instance={instance}\n fetchItems={fetchList}\n checkForUpdates={checkForUpdates}\n useItemID\n boostsCarousel={snapStates.settings.boostsCarousel}\n // allowFilters\n filterContext=\"home\"\n // refresh={reloadCount}\n headerStart={\n <Link to=\"/l\" class=\"button plain\">\n <Icon icon=\"list\" size=\"l\" />\n </Link>\n }\n headerEnd={\n <Menu2\n portal\n setDownOverflow\n overflow=\"auto\"\n viewScroll=\"close\"\n position=\"anchor\"\n menuButton={\n <button type=\"button\" class=\"plain\">\n <Icon icon=\"more\" size=\"l\" />\n </button>\n }\n >\n <MenuItem\n onClick={() =>\n setShowListAddEditModal({\n list,\n })\n }\n >\n <Icon icon=\"pencil\" size=\"l\" />\n <span>Edit</span>\n </MenuItem>\n <MenuItem onClick={() => setShowManageMembersModal(true)}>\n <Icon icon=\"group\" size=\"l\" />\n <span>Manage members</span>\n </MenuItem>\n </Menu2>\n }\n />\n {showListAddEditModal && (\n <Modal\n class=\"light\"\n onClick={(e) => {\n if (e.target === e.currentTarget) {\n setShowListAddEditModal(false);\n }\n }}\n >\n <ListAddEdit\n list={showListAddEditModal?.list}\n onClose={(result) => {\n if (result.state === 'success' && result.list) {\n setList(result.list);\n // reload();\n } else if (result.state === 'deleted') {\n // navigate('/l');\n location.hash = '/l';\n }\n setShowListAddEditModal(false);\n }}\n />\n </Modal>\n )}\n {showManageMembersModal && (\n <Modal\n class=\"light\"\n onClick={(e) => {\n if (e.target === e.currentTarget) {\n setShowManageMembersModal(false);\n }\n }}\n >\n <ListManageMembers\n listID={id}\n onClose={() => setShowManageMembersModal(false)}\n />\n </Modal>\n )}\n </>\n );\n}\n\nconst MEMBERS_LIMIT = 40;\nfunction ListManageMembers({ listID, onClose }) {\n // Show list of members with [Remove] button\n // API only returns 40 members at a time, so this need to be paginated with infinite scroll\n // Show [Add] button after removing a member\n const { masto, instance } = api();\n const [members, setMembers] = useState([]);\n const [uiState, setUIState] = useState('default');\n const [showMore, setShowMore] = useState(false);\n\n const membersIterator = useRef();\n\n async function fetchMembers(firstLoad) {\n setShowMore(false);\n setUIState('loading');\n (async () => {\n try {\n if (firstLoad || !membersIterator.current) {\n membersIterator.current = masto.v1.lists\n .$select(listID)\n .accounts.list({\n limit: MEMBERS_LIMIT,\n });\n }\n const results = await membersIterator.current.next();\n let { done, value } = results;\n if (value?.length) {\n if (firstLoad) {\n setMembers(value);\n } else {\n setMembers(members.concat(value));\n }\n setShowMore(!done);\n } else {\n setShowMore(false);\n }\n setUIState('default');\n } catch (e) {\n setUIState('error');\n }\n })();\n }\n\n useEffect(() => {\n fetchMembers(true);\n }, []);\n\n return (\n <div class=\"sheet\" id=\"list-manage-members-container\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" />\n </button>\n )}\n <header>\n <h2>Manage members</h2>\n </header>\n <main>\n <ul>\n {members.map((member) => (\n <li key={member.id}>\n <AccountBlock account={member} instance={instance} />\n <RemoveAddButton account={member} listID={listID} />\n </li>\n ))}\n {showMore && uiState === 'default' && (\n <InView as=\"li\" onChange={(inView) => inView && fetchMembers()}>\n <button type=\"button\" class=\"light block\" onClick={fetchMembers}>\n Show more…\n </button>\n </InView>\n )}\n </ul>\n </main>\n </div>\n );\n}\n\nfunction RemoveAddButton({ account, listID }) {\n const { masto } = api();\n const [uiState, setUIState] = useState('default');\n const [removed, setRemoved] = useState(false);\n\n return (\n <MenuConfirm\n confirm={!removed}\n confirmLabel={<span>Remove @{account.username} from list?</span>}\n align=\"end\"\n menuItemClassName=\"danger\"\n onClick={() => {\n if (removed) {\n setUIState('loading');\n (async () => {\n try {\n await masto.v1.lists.$select(listID).accounts.create({\n accountIds: [account.id],\n });\n setUIState('default');\n setRemoved(false);\n } catch (e) {\n setUIState('error');\n }\n })();\n } else {\n // const yes = confirm(`Remove ${account.username} from this list?`);\n // if (!yes) return;\n setUIState('loading');\n\n (async () => {\n try {\n await masto.v1.lists.$select(listID).accounts.remove({\n accountIds: [account.id],\n });\n setUIState('default');\n setRemoved(true);\n } catch (e) {\n setUIState('error');\n }\n })();\n }\n }}\n >\n <button\n type=\"button\"\n class={`light ${removed ? '' : 'danger'}`}\n disabled={uiState === 'loading'}\n >\n {removed ? 'Add' : 'Remove…'}\n </button>\n </MenuConfirm>\n );\n}\n\nexport default List;\n","import { useMemo, useRef, useState } from 'preact/hooks';\nimport { useSearchParams } from 'react-router-dom';\n\nimport Link from '../components/link';\nimport Timeline from '../components/timeline';\nimport { api } from '../utils/api';\nimport { saveStatus } from '../utils/states';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 20;\nconst emptySearchParams = new URLSearchParams();\n\nfunction Mentions({ columnMode, ...props }) {\n const { masto, instance } = api();\n const [searchParams] = columnMode ? [emptySearchParams] : useSearchParams();\n const [stateType, setStateType] = useState(null);\n const type = props?.type || searchParams.get('type') || stateType;\n useTitle(`Mentions${type === 'private' ? ' (Private)' : ''}`, '/mentions');\n\n const mentionsIterator = useRef();\n const latestItem = useRef();\n\n async function fetchMentions(firstLoad) {\n if (firstLoad || !mentionsIterator.current) {\n mentionsIterator.current = masto.v1.notifications.list({\n limit: LIMIT,\n types: ['mention'],\n });\n }\n const results = await mentionsIterator.current.next();\n let { value } = results;\n if (value?.length) {\n if (firstLoad) {\n latestItem.current = value[0].id;\n console.log('First load', latestItem.current);\n }\n\n value.forEach(({ status: item }) => {\n saveStatus(item, instance);\n });\n }\n return {\n ...results,\n value: value?.map((item) => item.status),\n };\n }\n\n const conversationsIterator = useRef();\n const latestConversationItem = useRef();\n async function fetchConversations(firstLoad) {\n if (firstLoad || !conversationsIterator.current) {\n conversationsIterator.current = masto.v1.conversations.list({\n limit: LIMIT,\n });\n }\n const results = await conversationsIterator.current.next();\n let { value } = results;\n value = value?.filter((item) => item.lastStatus);\n if (value?.length) {\n if (firstLoad) {\n latestConversationItem.current = value[0].lastStatus.id;\n console.log('First load', latestConversationItem.current);\n }\n\n value.forEach(({ lastStatus: item }) => {\n saveStatus(item, instance);\n });\n }\n console.log('results', results);\n return {\n ...results,\n value: value?.map((item) => item.lastStatus),\n };\n }\n\n function fetchItems(...args) {\n if (type === 'private') {\n return fetchConversations(...args);\n }\n return fetchMentions(...args);\n }\n\n async function checkForUpdates() {\n if (type === 'private') {\n try {\n const results = await masto.v1.conversations\n .list({\n limit: 1,\n since_id: latestConversationItem.current,\n })\n .next();\n let { value } = results;\n console.log(\n 'checkForUpdates PRIVATE',\n latestConversationItem.current,\n value,\n );\n if (value?.length) {\n latestConversationItem.current = value[0].lastStatus.id;\n return true;\n }\n return false;\n } catch (e) {\n return false;\n }\n } else {\n try {\n const results = await masto.v1.notifications\n .list({\n limit: 1,\n types: ['mention'],\n since_id: latestItem.current,\n })\n .next();\n let { value } = results;\n console.log('checkForUpdates ALL', latestItem.current, value);\n if (value?.length) {\n latestItem.current = value[0].id;\n return true;\n }\n return false;\n } catch (e) {\n return false;\n }\n }\n }\n\n const TimelineStart = useMemo(() => {\n return (\n <div class=\"filter-bar centered\">\n <Link\n to=\"/mentions\"\n class={!type ? 'is-active' : ''}\n onClick={(e) => {\n if (columnMode) {\n e.preventDefault();\n setStateType(null);\n }\n }}\n >\n All\n </Link>\n <Link\n to=\"/mentions?type=private\"\n class={type === 'private' ? 'is-active' : ''}\n onClick={(e) => {\n if (columnMode) {\n e.preventDefault();\n setStateType('private');\n }\n }}\n >\n Private\n </Link>\n </div>\n );\n }, [type]);\n\n return (\n <Timeline\n title=\"Mentions\"\n id=\"mentions\"\n emptyText=\"No one mentioned you :(\"\n errorText=\"Unable to load mentions.\"\n instance={instance}\n fetchItems={fetchItems}\n checkForUpdates={checkForUpdates}\n useItemID\n timelineStart={TimelineStart}\n refresh={type}\n />\n );\n}\n\nexport default Mentions;\n","// This is like very lame \"type-checking\" lol\nconst notificationTypeKeys = {\n mention: ['account', 'status'],\n status: ['account', 'status'],\n reblog: ['account', 'status'],\n follow: ['account'],\n follow_request: ['account'],\n favourite: ['account', 'status'],\n poll: ['status'],\n update: ['status'],\n};\nfunction fixNotifications(notifications) {\n return notifications.filter((notification) => {\n const { type, id, createdAt } = notification;\n if (!type) {\n console.warn('Notification missing type', notification);\n return false;\n }\n if (!id || !createdAt) {\n console.warn('Notification missing id or createdAt', notification);\n // Continue processing this despite missing id or createdAt\n }\n const keys = notificationTypeKeys[type];\n if (keys?.length) {\n return keys.every((key) => !!notification[key]);\n }\n return true; // skip other types\n });\n}\n\nfunction groupNotifications(notifications) {\n // Filter out invalid notifications\n notifications = fixNotifications(notifications);\n\n // Create new flat list of notifications\n // Combine sibling notifications based on type and status id\n // Concat all notification.account into an array of _accounts\n const notificationsMap = {};\n const cleanNotifications = [];\n for (let i = 0, j = 0; i < notifications.length; i++) {\n const notification = notifications[i];\n const { id, status, account, type, createdAt } = notification;\n const date = createdAt ? new Date(createdAt).toLocaleDateString() : '';\n let virtualType = type;\n if (type === 'favourite' || type === 'reblog') {\n virtualType = 'favourite+reblog';\n }\n const key = `${status?.id}-${virtualType}-${date}`;\n const mappedNotification = notificationsMap[key];\n if (virtualType === 'follow_request') {\n cleanNotifications[j++] = notification;\n } else if (mappedNotification?.account) {\n const mappedAccount = mappedNotification._accounts.find(\n (a) => a.id === account.id,\n );\n if (mappedAccount) {\n mappedAccount._types.push(type);\n mappedAccount._types.sort().reverse();\n mappedNotification.id += `-${id}`;\n } else {\n account._types = [type];\n mappedNotification._accounts.push(account);\n mappedNotification.id += `-${id}`;\n }\n } else {\n account._types = [type];\n let n = (notificationsMap[key] = {\n ...notification,\n type: virtualType,\n _accounts: [account],\n });\n cleanNotifications[j++] = n;\n }\n }\n\n // 2nd pass to group \"favourite+reblog\"-type notifications by account if _accounts.length <= 1\n // This means one acount has favourited and reblogged the multiple statuses\n // The grouped notification\n // - type: \"favourite+reblog+account\"\n // - _statuses: [status, status, ...]\n const notificationsMap2 = {};\n const cleanNotifications2 = [];\n for (let i = 0, j = 0; i < cleanNotifications.length; i++) {\n const notification = cleanNotifications[i];\n const { id, account, _accounts, type, createdAt } = notification;\n const date = createdAt ? new Date(createdAt).toLocaleDateString() : '';\n if (type === 'favourite+reblog' && account && _accounts.length === 1) {\n const key = `${account?.id}-${type}-${date}`;\n const mappedNotification = notificationsMap2[key];\n if (mappedNotification) {\n mappedNotification._statuses.push(notification.status);\n mappedNotification.id += `-${id}`;\n } else {\n let n = (notificationsMap2[key] = {\n ...notification,\n type,\n _statuses: [notification.status],\n });\n cleanNotifications2[j++] = n;\n }\n } else {\n cleanNotifications2[j++] = notification;\n }\n }\n\n console.log({ notifications, cleanNotifications, cleanNotifications2 });\n\n // return cleanNotifications;\n return cleanNotifications2;\n}\n\nexport default groupNotifications;\n","import './notifications.css';\n\nimport { Fragment } from 'preact';\nimport { memo } from 'preact/compat';\nimport { useCallback, useEffect, useRef, useState } from 'preact/hooks';\nimport { InView } from 'react-intersection-observer';\nimport { useSearchParams } from 'react-router-dom';\nimport { useSnapshot } from 'valtio';\nimport { subscribeKey } from 'valtio/utils';\n\nimport AccountBlock from '../components/account-block';\nimport FollowRequestButtons from '../components/follow-request-buttons';\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport NavMenu from '../components/nav-menu';\nimport Notification from '../components/notification';\nimport { api } from '../utils/api';\nimport enhanceContent from '../utils/enhance-content';\nimport groupNotifications from '../utils/group-notifications';\nimport handleContentLinks from '../utils/handle-content-links';\nimport niceDateTime from '../utils/nice-date-time';\nimport { getRegistration } from '../utils/push-notifications';\nimport shortenNumber from '../utils/shorten-number';\nimport states, { saveStatus } from '../utils/states';\nimport { getCurrentInstance } from '../utils/store-utils';\nimport usePageVisibility from '../utils/usePageVisibility';\nimport useScroll from '../utils/useScroll';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 30; // 30 is the maximum limit :(\nconst emptySearchParams = new URLSearchParams();\n\nfunction Notifications({ columnMode }) {\n useTitle('Notifications', '/notifications');\n const { masto, instance } = api();\n const snapStates = useSnapshot(states);\n const [uiState, setUIState] = useState('default');\n const [searchParams] = columnMode ? [emptySearchParams] : useSearchParams();\n const notificationID = searchParams.get('id');\n const notificationAccessToken = searchParams.get('access_token');\n const [showMore, setShowMore] = useState(false);\n const [onlyMentions, setOnlyMentions] = useState(false);\n const scrollableRef = useRef();\n const { nearReachEnd, scrollDirection, reachStart, nearReachStart } =\n useScroll({\n scrollableRef,\n });\n const hiddenUI = scrollDirection === 'end' && !nearReachStart;\n const [followRequests, setFollowRequests] = useState([]);\n const [announcements, setAnnouncements] = useState([]);\n\n console.debug('RENDER Notifications');\n\n const notificationsIterator = useRef();\n async function fetchNotifications(firstLoad) {\n if (firstLoad || !notificationsIterator.current) {\n // Reset iterator\n notificationsIterator.current = masto.v1.notifications.list({\n limit: LIMIT,\n excludeTypes: ['follow_request'],\n });\n }\n const allNotifications = await notificationsIterator.current.next();\n const notifications = allNotifications.value;\n\n if (notifications?.length) {\n notifications.forEach((notification) => {\n saveStatus(notification.status, instance, {\n skipThreading: true,\n });\n });\n\n const groupedNotifications = groupNotifications(notifications);\n\n if (firstLoad) {\n states.notificationsLast = notifications[0];\n states.notifications = groupedNotifications;\n\n // Update last read marker\n masto.v1.markers\n .create({\n notifications: {\n lastReadId: notifications[0].id,\n },\n })\n .catch(() => {});\n } else {\n states.notifications.push(...groupedNotifications);\n }\n }\n\n states.notificationsShowNew = false;\n states.notificationsLastFetchTime = Date.now();\n return allNotifications;\n }\n\n async function fetchFollowRequests() {\n // Note: no pagination here yet because this better be on a separate page. Should be rare use-case???\n try {\n return await masto.v1.followRequests.list({\n limit: 80,\n });\n } catch (e) {\n // Silently fail\n return [];\n }\n }\n\n const loadFollowRequests = () => {\n setUIState('loading');\n (async () => {\n try {\n const requests = await fetchFollowRequests();\n setFollowRequests(requests);\n setUIState('default');\n } catch (e) {\n setUIState('error');\n }\n })();\n };\n\n async function fetchAnnouncements() {\n try {\n return await masto.v1.announcements.list();\n } catch (e) {\n // Silently fail\n return [];\n }\n }\n\n const loadNotifications = (firstLoad) => {\n setShowNew(false);\n setUIState('loading');\n (async () => {\n try {\n const fetchNotificationsPromise = fetchNotifications(firstLoad);\n\n if (firstLoad) {\n fetchAnnouncements()\n .then((announcements) => {\n announcements.sort((a, b) => {\n // Sort by updatedAt first, then createdAt\n const aDate = new Date(a.updatedAt || a.createdAt);\n const bDate = new Date(b.updatedAt || b.createdAt);\n return bDate - aDate;\n });\n setAnnouncements(announcements);\n })\n .catch(() => {});\n\n fetchFollowRequests()\n .then((requests) => {\n setFollowRequests(requests);\n })\n .catch(() => {});\n }\n\n const { done } = await fetchNotificationsPromise;\n setShowMore(!done);\n\n setUIState('default');\n } catch (e) {\n setUIState('error');\n }\n })();\n };\n\n useEffect(() => {\n loadNotifications(true);\n }, []);\n useEffect(() => {\n if (reachStart) {\n loadNotifications(true);\n }\n }, [reachStart]);\n\n // useEffect(() => {\n // if (nearReachEnd && showMore) {\n // loadNotifications();\n // }\n // }, [nearReachEnd, showMore]);\n\n const [showNew, setShowNew] = useState(false);\n\n const loadUpdates = useCallback(\n ({ disableIdleCheck = false } = {}) => {\n if (uiState === 'loading') {\n return;\n }\n console.log('✨ Load updates', {\n autoRefresh: snapStates.settings.autoRefresh,\n scrollTop: scrollableRef.current?.scrollTop,\n inBackground: inBackground(),\n disableIdleCheck,\n });\n if (\n snapStates.settings.autoRefresh &&\n scrollableRef.current?.scrollTop < 16 &&\n (disableIdleCheck || window.__IDLE__) &&\n !inBackground()\n ) {\n loadNotifications(true);\n }\n },\n [snapStates.notificationsShowNew, snapStates.settings.autoRefresh, uiState],\n );\n // useEffect(loadUpdates, [snapStates.notificationsShowNew]);\n\n const lastHiddenTime = useRef();\n usePageVisibility((visible) => {\n let unsub;\n if (visible) {\n const timeDiff = Date.now() - lastHiddenTime.current;\n if (!lastHiddenTime.current || timeDiff > 1000 * 3) {\n // 3 seconds\n loadUpdates({\n disableIdleCheck: true,\n });\n } else {\n lastHiddenTime.current = Date.now();\n }\n unsub = subscribeKey(states, 'notificationsShowNew', (v) => {\n if (v) {\n loadUpdates();\n }\n setShowNew(v);\n });\n }\n return () => {\n unsub?.();\n };\n });\n\n const todayDate = new Date();\n const yesterdayDate = new Date(todayDate - 24 * 60 * 60 * 1000);\n let currentDay = new Date();\n const showTodayEmpty = !snapStates.notifications.some(\n (notification) =>\n new Date(notification.createdAt).toDateString() ===\n todayDate.toDateString(),\n );\n\n const announcementsListRef = useRef();\n\n useEffect(() => {\n if (notificationID) {\n states.routeNotification = {\n id: notificationID,\n accessToken: atob(notificationAccessToken),\n };\n }\n }, [notificationID, notificationAccessToken]);\n\n // useEffect(() => {\n // if (uiState === 'default') {\n // (async () => {\n // try {\n // const registration = await getRegistration();\n // if (registration?.getNotifications) {\n // const notifications = await registration.getNotifications();\n // console.log('🔔 Push notifications', notifications);\n // // Close all notifications?\n // // notifications.forEach((notification) => {\n // // notification.close();\n // // });\n // }\n // } catch (e) {}\n // })();\n // }\n // }, [uiState]);\n\n return (\n <div\n id=\"notifications-page\"\n class=\"deck-container\"\n ref={scrollableRef}\n tabIndex=\"-1\"\n >\n <div class={`timeline-deck deck ${onlyMentions ? 'only-mentions' : ''}`}>\n <header\n hidden={hiddenUI}\n onClick={(e) => {\n if (!e.target.closest('a, button')) {\n scrollableRef.current?.scrollTo({ top: 0, behavior: 'smooth' });\n }\n }}\n class={uiState === 'loading' ? 'loading' : ''}\n >\n <div class=\"header-grid\">\n <div class=\"header-side\">\n <NavMenu />\n <Link to=\"/\" class=\"button plain\">\n <Icon icon=\"home\" size=\"l\" alt=\"Home\" />\n </Link>\n </div>\n <h1>Notifications</h1>\n <div class=\"header-side\">\n {/* <Loader hidden={uiState !== 'loading'} /> */}\n </div>\n </div>\n {showNew && uiState !== 'loading' && (\n <button\n class=\"updates-button shiny-pill\"\n type=\"button\"\n onClick={() => {\n loadNotifications(true);\n scrollableRef.current?.scrollTo({\n top: 0,\n behavior: 'smooth',\n });\n }}\n >\n <Icon icon=\"arrow-up\" /> New notifications\n </button>\n )}\n </header>\n {announcements.length > 0 && (\n <div class=\"shazam-container\">\n <div class=\"shazam-container-inner\">\n <details class=\"announcements\">\n <summary>\n <span>\n <Icon icon=\"announce\" class=\"announcement-icon\" size=\"l\" />{' '}\n <b>Announcement{announcements.length > 1 ? 's' : ''}</b>{' '}\n <small class=\"insignificant\">{instance}</small>\n </span>\n {announcements.length > 1 && (\n <span class=\"announcements-nav-buttons\">\n {announcements.map((announcement, index) => (\n <button\n type=\"button\"\n class=\"plain2 small\"\n onClick={() => {\n announcementsListRef.current?.children[\n index\n ].scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n });\n }}\n >\n {index + 1}\n </button>\n ))}\n </span>\n )}\n </summary>\n <ul\n class={`announcements-list-${\n announcements.length > 1 ? 'multiple' : 'single'\n }`}\n ref={announcementsListRef}\n >\n {announcements.map((announcement) => (\n <li>\n <AnnouncementBlock announcement={announcement} />\n </li>\n ))}\n </ul>\n </details>\n </div>\n </div>\n )}\n {followRequests.length > 0 && (\n <div class=\"follow-requests\">\n <h2 class=\"timeline-header\">Follow requests</h2>\n {followRequests.length > 5 ? (\n <details>\n <summary>{followRequests.length} follow requests</summary>\n <ul>\n {followRequests.map((account) => (\n <li key={account.id}>\n <AccountBlock account={account} />\n <FollowRequestButtons\n accountID={account.id}\n onChange={() => {\n // loadFollowRequests();\n // loadNotifications(true);\n }}\n />\n </li>\n ))}\n </ul>\n </details>\n ) : (\n <ul>\n {followRequests.map((account) => (\n <li key={account.id}>\n <AccountBlock account={account} />\n <FollowRequestButtons\n accountID={account.id}\n onChange={() => {\n // loadFollowRequests();\n // loadNotifications(true);\n }}\n />\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n <div id=\"mentions-option\">\n <label>\n <input\n type=\"checkbox\"\n checked={onlyMentions}\n onChange={(e) => {\n setOnlyMentions(e.target.checked);\n }}\n />{' '}\n Only mentions\n </label>\n </div>\n <h2 class=\"timeline-header\">Today</h2>\n {showTodayEmpty && !!snapStates.notifications.length && (\n <p class=\"ui-state insignificant\">\n {uiState === 'default' ? \"You're all caught up.\" : <>…</>}\n </p>\n )}\n {snapStates.notifications.length ? (\n <>\n {snapStates.notifications\n // This is leaked from Notifications popover\n .filter((n) => n.type !== 'follow_request')\n .map((notification) => {\n if (onlyMentions && notification.type !== 'mention') {\n return null;\n }\n const notificationDay = new Date(notification.createdAt);\n const differentDay =\n notificationDay.toDateString() !== currentDay.toDateString();\n if (differentDay) {\n currentDay = notificationDay;\n }\n // if notificationDay is yesterday, show \"Yesterday\"\n // if notificationDay is before yesterday, show date\n const heading =\n notificationDay.toDateString() ===\n yesterdayDate.toDateString()\n ? 'Yesterday'\n : niceDateTime(currentDay, {\n hideTime: true,\n });\n return (\n <Fragment key={notification.id}>\n {differentDay && <h2 class=\"timeline-header\">{heading}</h2>}\n <Notification\n instance={instance}\n notification={notification}\n key={notification.id}\n />\n </Fragment>\n );\n })}\n </>\n ) : (\n <>\n {uiState === 'loading' && (\n <>\n <ul class=\"timeline flat\">\n {Array.from({ length: 5 }).map((_, i) => (\n <li class=\"notification skeleton\">\n <div class=\"notification-type\">\n <Icon icon=\"notification\" size=\"xl\" />\n </div>\n <div class=\"notification-content\">\n <p>███████████ ████</p>\n </div>\n </li>\n ))}\n </ul>\n </>\n )}\n {uiState === 'error' && (\n <p class=\"ui-state\">\n Unable to load notifications\n <br />\n <br />\n <button type=\"button\" onClick={() => loadNotifications(true)}>\n Try again\n </button>\n </p>\n )}\n </>\n )}\n {showMore && (\n <InView\n onChange={(inView) => {\n if (inView) {\n loadNotifications();\n }\n }}\n >\n <button\n type=\"button\"\n class=\"plain block\"\n disabled={uiState === 'loading'}\n onClick={() => loadNotifications()}\n style={{ marginBlockEnd: '6em' }}\n >\n {uiState === 'loading' ? (\n <Loader abrupt />\n ) : (\n <>Show more…</>\n )}\n </button>\n </InView>\n )}\n </div>\n </div>\n );\n}\n\nfunction inBackground() {\n return !!document.querySelector('.deck-backdrop, #modal-container > *');\n}\n\nfunction AnnouncementBlock({ announcement }) {\n const { instance } = api();\n const { contact } = getCurrentInstance();\n const contactAccount = contact?.account;\n const {\n id,\n content,\n startsAt,\n endsAt,\n published,\n allDay,\n publishedAt,\n updatedAt,\n read,\n mentions,\n statuses,\n tags,\n emojis,\n reactions,\n } = announcement;\n\n const publishedAtDate = new Date(publishedAt);\n const publishedDateText = niceDateTime(publishedAtDate);\n const updatedAtDate = new Date(updatedAt);\n const updatedAtText = niceDateTime(updatedAtDate);\n\n return (\n <div class=\"announcement-block\">\n <AccountBlock account={contactAccount} />\n <div\n class=\"announcement-content\"\n onClick={handleContentLinks({ mentions, instance })}\n dangerouslySetInnerHTML={{\n __html: enhanceContent(content, {\n emojis,\n }),\n }}\n />\n <p class=\"insignificant\">\n <time datetime={publishedAtDate.toISOString()}>\n {niceDateTime(publishedAtDate)}\n </time>\n {updatedAt && updatedAtText !== publishedDateText && (\n <>\n {' '}\n •{' '}\n <span class=\"ib\">\n Updated{' '}\n <time datetime={updatedAtDate.toISOString()}>\n {niceDateTime(updatedAtDate)}\n </time>\n </span>\n </>\n )}\n </p>\n <div class=\"announcement-reactions\" hidden>\n {reactions.map((reaction) => {\n const { name, count, me, staticUrl, url } = reaction;\n return (\n <button type=\"button\" class={`plain4 small ${me ? 'reacted' : ''}`}>\n {url || staticUrl ? (\n <img src={url || staticUrl} alt={name} width=\"16\" height=\"16\" />\n ) : (\n <span>{name}</span>\n )}{' '}\n <span class=\"count\">{shortenNumber(count)}</span>\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n\nexport default memo(Notifications);\n","import { Menu, MenuDivider, MenuItem } from '@szhsin/react-menu';\nimport { useRef } from 'preact/hooks';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { useSnapshot } from 'valtio';\n\nimport Icon from '../components/icon';\nimport Menu2 from '../components/menu2';\nimport Timeline from '../components/timeline';\nimport { api } from '../utils/api';\nimport { filteredItems } from '../utils/filters';\nimport states from '../utils/states';\nimport { saveStatus } from '../utils/states';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 20;\n\nfunction Public({ local, columnMode, ...props }) {\n const snapStates = useSnapshot(states);\n const isLocal = !!local;\n const params = columnMode ? {} : useParams();\n const { masto, instance } = api({\n instance: props?.instance || params.instance,\n });\n const { masto: currentMasto, instance: currentInstance } = api();\n const title = `${isLocal ? 'Local' : 'Federated'} timeline (${instance})`;\n useTitle(title, isLocal ? `/:instance?/p/l` : `/:instance?/p`);\n // const navigate = useNavigate();\n const latestItem = useRef();\n\n const publicIterator = useRef();\n async function fetchPublic(firstLoad) {\n if (firstLoad || !publicIterator.current) {\n publicIterator.current = masto.v1.timelines.public.list({\n limit: LIMIT,\n local: isLocal,\n });\n }\n const results = await publicIterator.current.next();\n let { value } = results;\n if (value?.length) {\n if (firstLoad) {\n latestItem.current = value[0].id;\n }\n\n // value = filteredItems(value, 'public');\n value.forEach((item) => {\n saveStatus(item, instance);\n });\n }\n return {\n ...results,\n value,\n };\n }\n\n async function checkForUpdates() {\n try {\n const results = await masto.v1.timelines.public\n .list({\n limit: 1,\n local: isLocal,\n since_id: latestItem.current,\n })\n .next();\n let { value } = results;\n value = filteredItems(value, 'public');\n if (value?.length) {\n return true;\n }\n return false;\n } catch (e) {\n return false;\n }\n }\n\n return (\n <Timeline\n key={instance + isLocal}\n title={title}\n titleComponent={\n <h1 class=\"header-double-lines\">\n <b>{isLocal ? 'Local timeline' : 'Federated timeline'}</b>\n <div>{instance}</div>\n </h1>\n }\n id=\"public\"\n instance={instance}\n emptyText=\"No one has posted anything yet.\"\n errorText=\"Unable to load posts\"\n fetchItems={fetchPublic}\n checkForUpdates={checkForUpdates}\n useItemID\n headerStart={<></>}\n boostsCarousel={snapStates.settings.boostsCarousel}\n // allowFilters\n filterContext=\"public\"\n headerEnd={\n <Menu2\n portal\n // setDownOverflow\n overflow=\"auto\"\n viewScroll=\"close\"\n position=\"anchor\"\n menuButton={\n <button type=\"button\" class=\"plain\">\n <Icon icon=\"more\" size=\"l\" />\n </button>\n }\n >\n <MenuItem href={isLocal ? `/#/${instance}/p` : `/#/${instance}/p/l`}>\n {isLocal ? (\n <>\n <Icon icon=\"transfer\" /> <span>Switch to Federated</span>\n </>\n ) : (\n <>\n <Icon icon=\"transfer\" /> <span>Switch to Local</span>\n </>\n )}\n </MenuItem>\n <MenuDivider />\n <MenuItem\n onClick={() => {\n let newInstance = prompt(\n 'Enter a new instance e.g. \"mastodon.social\"',\n );\n if (!/\\./.test(newInstance)) {\n if (newInstance) alert('Invalid instance');\n return;\n }\n if (newInstance) {\n newInstance = newInstance.toLowerCase().trim();\n // navigate(isLocal ? `/${newInstance}/p/l` : `/${newInstance}/p`);\n location.hash = isLocal\n ? `/${newInstance}/p/l`\n : `/${newInstance}/p`;\n }\n }}\n >\n <Icon icon=\"bus\" /> <span>Go to another instance…</span>\n </MenuItem>\n {currentInstance !== instance && (\n <MenuItem\n onClick={() => {\n location.hash = isLocal\n ? `/${currentInstance}/p/l`\n : `/${currentInstance}/p`;\n }}\n >\n <Icon icon=\"bus\" />{' '}\n <small class=\"menu-double-lines\">\n Go to my instance (<b>{currentInstance}</b>)\n </small>\n </MenuItem>\n )}\n </Menu2>\n }\n />\n );\n}\n\nexport default Public;\n","import './search.css';\n\nimport { useAutoAnimate } from '@formkit/auto-animate/preact';\nimport { useEffect, useLayoutEffect, useRef, useState } from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport { InView } from 'react-intersection-observer';\nimport { useParams, useSearchParams } from 'react-router-dom';\n\nimport AccountBlock from '../components/account-block';\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport NavMenu from '../components/nav-menu';\nimport SearchForm from '../components/search-form';\nimport Status from '../components/status';\nimport { api } from '../utils/api';\nimport { fetchRelationships } from '../utils/relationships';\nimport shortenNumber from '../utils/shorten-number';\nimport usePageVisibility from '../utils/usePageVisibility';\nimport useTitle from '../utils/useTitle';\n\nconst SHORT_LIMIT = 5;\nconst LIMIT = 40;\nconst emptySearchParams = new URLSearchParams();\n\nfunction Search({ columnMode, ...props }) {\n const params = columnMode ? {} : useParams();\n const { masto, instance, authenticated } = api({\n instance: params.instance,\n });\n const [uiState, setUIState] = useState('default');\n const [searchParams] = columnMode ? [emptySearchParams] : useSearchParams();\n const searchFormRef = useRef();\n const q = props?.query || searchParams.get('q');\n const type = columnMode\n ? 'statuses'\n : props?.type || searchParams.get('type');\n useTitle(\n q\n ? `Search: ${q}${\n type\n ? ` (${\n {\n statuses: 'Posts',\n accounts: 'Accounts',\n hashtags: 'Hashtags',\n }[type]\n })`\n : ''\n }`\n : 'Search',\n `/search`,\n );\n\n const [showMore, setShowMore] = useState(false);\n const offsetRef = useRef(0);\n useEffect(() => {\n offsetRef.current = 0;\n }, [q, type]);\n\n const scrollableRef = useRef();\n useLayoutEffect(() => {\n scrollableRef.current?.scrollTo?.(0, 0);\n }, [q, type]);\n\n const [statusResults, setStatusResults] = useState([]);\n const [accountResults, setAccountResults] = useState([]);\n const [hashtagResults, setHashtagResults] = useState([]);\n useEffect(() => {\n setStatusResults([]);\n setAccountResults([]);\n setHashtagResults([]);\n }, [q]);\n const setTypeResultsFunc = {\n statuses: setStatusResults,\n accounts: setAccountResults,\n hashtags: setHashtagResults,\n };\n\n const [relationshipsMap, setRelationshipsMap] = useState({});\n const loadRelationships = async (accounts) => {\n if (!accounts?.length) return;\n const relationships = await fetchRelationships(accounts, relationshipsMap);\n if (relationships) {\n setRelationshipsMap({\n ...relationshipsMap,\n ...relationships,\n });\n }\n };\n\n function loadResults(firstLoad) {\n if (firstLoad) {\n offsetRef.current = 0;\n }\n\n if (!firstLoad && !authenticated) {\n // Search results pagination is only available to authenticated users\n return;\n }\n\n setUIState('loading');\n if (firstLoad && !type) {\n setStatusResults(statusResults.slice(0, SHORT_LIMIT));\n setAccountResults(accountResults.slice(0, SHORT_LIMIT));\n setHashtagResults(hashtagResults.slice(0, SHORT_LIMIT));\n }\n\n (async () => {\n const params = {\n q,\n resolve: authenticated,\n limit: SHORT_LIMIT,\n };\n if (type) {\n params.limit = LIMIT;\n params.type = type;\n if (authenticated) params.offset = offsetRef.current;\n }\n\n try {\n const results = await masto.v2.search.fetch(params);\n console.log(results);\n if (type) {\n if (firstLoad) {\n setTypeResultsFunc[type](results[type]);\n const length = results[type]?.length;\n offsetRef.current = LIMIT;\n setShowMore(!!length);\n } else {\n setTypeResultsFunc[type]((prev) => [...prev, ...results[type]]);\n const length = results[type]?.length;\n offsetRef.current = offsetRef.current + LIMIT;\n setShowMore(!!length);\n }\n } else {\n setStatusResults(results.statuses || []);\n setAccountResults(results.accounts || []);\n setHashtagResults(results.hashtags || []);\n offsetRef.current = 0;\n setShowMore(false);\n }\n loadRelationships(results.accounts);\n\n setUIState('default');\n } catch (err) {\n console.error(err);\n setUIState('error');\n }\n })();\n }\n\n const lastHiddenTime = useRef();\n usePageVisibility((visible) => {\n const reachStart = scrollableRef.current?.scrollTop === 0;\n if (visible && reachStart) {\n const timeDiff = Date.now() - lastHiddenTime.current;\n if (!lastHiddenTime.current || timeDiff > 1000 * 3) {\n // 3 seconds\n loadResults(true);\n } else {\n lastHiddenTime.current = Date.now();\n }\n }\n });\n\n useEffect(() => {\n searchFormRef.current?.setValue?.(q || '');\n if (q) {\n loadResults(true);\n } else {\n searchFormRef.current?.focus?.();\n }\n }, [q, type, instance]);\n\n useHotkeys(\n '/',\n (e) => {\n searchFormRef.current?.focus?.();\n },\n {\n preventDefault: true,\n },\n );\n\n const [filterBarParent] = useAutoAnimate();\n\n return (\n <div id=\"search-page\" class=\"deck-container\" ref={scrollableRef}>\n <div class=\"timeline-deck deck\">\n <header class={uiState === 'loading' ? 'loading' : ''}>\n <div class=\"header-grid\">\n <div class=\"header-side\">\n <NavMenu />\n </div>\n <SearchForm ref={searchFormRef} />\n <div class=\"header-side\">\n <button\n type=\"button\"\n class=\"plain\"\n onClick={() => {\n loadResults(true);\n }}\n disabled={uiState === 'loading'}\n >\n <Icon icon=\"search\" size=\"l\" />\n </button>\n </div>\n </div>\n </header>\n <main>\n {!!q && !columnMode && (\n <div\n ref={filterBarParent}\n class={`filter-bar ${uiState === 'loading' ? 'loading' : ''}`}\n >\n {!!type && (\n <Link to={`/search${q ? `?q=${encodeURIComponent(q)}` : ''}`}>\n ‹ All\n </Link>\n )}\n {[\n {\n label: 'Accounts',\n type: 'accounts',\n to: `/search?q=${encodeURIComponent(q)}&type=accounts`,\n },\n {\n label: 'Hashtags',\n type: 'hashtags',\n to: `/search?q=${encodeURIComponent(q)}&type=hashtags`,\n },\n {\n label: 'Posts',\n type: 'statuses',\n to: `/search?q=${encodeURIComponent(q)}&type=statuses`,\n },\n ]\n .sort((a, b) => {\n if (a.type === type) return -1;\n if (b.type === type) return 1;\n return 0;\n })\n .map((link) => (\n <Link to={link.to} key={link.type}>\n {link.label}\n </Link>\n ))}\n </div>\n )}\n {!!q ? (\n <>\n {(!type || type === 'accounts') && (\n <>\n {type !== 'accounts' && (\n <h2 class=\"timeline-header\">Accounts</h2>\n )}\n {accountResults.length > 0 ? (\n <>\n <ul class=\"timeline flat accounts-list\">\n {accountResults.map((account) => (\n <li key={account.id}>\n <AccountBlock\n account={account}\n instance={instance}\n showStats\n relationship={relationshipsMap[account.id]}\n />\n </li>\n ))}\n </ul>\n {type !== 'accounts' && (\n <div class=\"ui-state\">\n <Link\n class=\"plain button\"\n to={`/search?q=${q}&type=accounts`}\n >\n See more accounts <Icon icon=\"arrow-right\" />\n </Link>\n </div>\n )}\n </>\n ) : (\n !type &&\n (uiState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n ) : (\n <p class=\"ui-state\">No accounts found.</p>\n ))\n )}\n </>\n )}\n {(!type || type === 'hashtags') && (\n <>\n {type !== 'hashtags' && (\n <h2 class=\"timeline-header\">Hashtags</h2>\n )}\n {hashtagResults.length > 0 ? (\n <>\n <ul class=\"link-list hashtag-list\">\n {hashtagResults.map((hashtag) => {\n const { name, history } = hashtag;\n const total = history?.reduce?.(\n (acc, cur) => acc + +cur.uses,\n 0,\n );\n return (\n <li key={`${name}-${total}`}>\n <Link\n to={\n instance\n ? `/${instance}/t/${name}`\n : `/t/${name}`\n }\n >\n <Icon icon=\"hashtag\" />\n <span>{name}</span>\n {!!total && (\n <span class=\"count\">\n {shortenNumber(total)}\n </span>\n )}\n </Link>\n </li>\n );\n })}\n </ul>\n {type !== 'hashtags' && (\n <div class=\"ui-state\">\n <Link\n class=\"plain button\"\n to={`/search?q=${q}&type=hashtags`}\n >\n See more hashtags <Icon icon=\"arrow-right\" />\n </Link>\n </div>\n )}\n </>\n ) : (\n !type &&\n (uiState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n ) : (\n <p class=\"ui-state\">No hashtags found.</p>\n ))\n )}\n </>\n )}\n {(!type || type === 'statuses') && (\n <>\n {type !== 'statuses' && (\n <h2 class=\"timeline-header\">Posts</h2>\n )}\n {statusResults.length > 0 ? (\n <>\n <ul class=\"timeline\">\n {statusResults.map((status) => (\n <li key={status.id}>\n <Link\n class=\"status-link\"\n to={\n instance\n ? `/${instance}/s/${status.id}`\n : `/s/${status.id}`\n }\n >\n <Status status={status} />\n </Link>\n </li>\n ))}\n </ul>\n {type !== 'statuses' && (\n <div class=\"ui-state\">\n <Link\n class=\"plain button\"\n to={`/search?q=${q}&type=statuses`}\n >\n See more posts <Icon icon=\"arrow-right\" />\n </Link>\n </div>\n )}\n </>\n ) : (\n !type &&\n (uiState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n ) : (\n <p class=\"ui-state\">No posts found.</p>\n ))\n )}\n </>\n )}\n {!!type &&\n (uiState === 'default' ? (\n showMore ? (\n <InView\n onChange={(inView) => {\n if (inView) {\n loadResults();\n }\n }}\n >\n <button\n type=\"button\"\n class=\"plain block\"\n onClick={() => loadResults()}\n style={{ marginBlockEnd: '6em' }}\n >\n Show more…\n </button>\n </InView>\n ) : (\n <p class=\"ui-state insignificant\">The end.</p>\n )\n ) : (\n uiState === 'loading' && (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n )\n ))}\n </>\n ) : uiState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n ) : (\n <p class=\"ui-state\">\n Enter your search term or paste a URL above to get started.\n </p>\n )}\n </main>\n </div>\n </div>\n );\n}\n\nexport default Search;\n","import './trending.css';\n\nimport { MenuItem } from '@szhsin/react-menu';\nimport { getBlurHashAverageColor } from 'fast-blurhash';\nimport { useMemo, useRef, useState } from 'preact/hooks';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { useSnapshot } from 'valtio';\n\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport Menu2 from '../components/menu2';\nimport RelativeTime from '../components/relative-time';\nimport Timeline from '../components/timeline';\nimport { api } from '../utils/api';\nimport { oklab2rgb, rgb2oklab } from '../utils/color-utils';\nimport { filteredItems } from '../utils/filters';\nimport pmem from '../utils/pmem';\nimport shortenNumber from '../utils/shorten-number';\nimport states from '../utils/states';\nimport { saveStatus } from '../utils/states';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 20;\n\nconst fetchLinks = pmem(\n (masto) => {\n return masto.v1.trends.links.list().next();\n },\n {\n // News last much longer\n maxAge: 10 * 60 * 1000, // 10 minutes\n },\n);\n\nfunction Trending({ columnMode, ...props }) {\n const snapStates = useSnapshot(states);\n const params = columnMode ? {} : useParams();\n const { masto, instance } = api({\n instance: props?.instance || params.instance,\n });\n const { masto: currentMasto, instance: currentInstance } = api();\n const title = `Trending (${instance})`;\n useTitle(title, `/:instance?/trending`);\n // const navigate = useNavigate();\n const latestItem = useRef();\n\n const [hashtags, setHashtags] = useState([]);\n const [links, setLinks] = useState([]);\n const trendIterator = useRef();\n async function fetchTrend(firstLoad) {\n if (firstLoad || !trendIterator.current) {\n trendIterator.current = masto.v1.trends.statuses.list({\n limit: LIMIT,\n });\n\n // Get hashtags\n try {\n const iterator = masto.v1.trends.tags.list();\n const { value: tags } = await iterator.next();\n console.log('tags', tags);\n if (tags?.length) {\n setHashtags(tags);\n }\n } catch (e) {\n console.error(e);\n }\n\n // Get links\n try {\n const { value } = await fetchLinks(masto);\n // 4 types available: link, photo, video, rich\n // Only want links for now\n const links = value?.filter?.((link) => link.type === 'link');\n console.log('links', links);\n if (links?.length) {\n setLinks(links);\n }\n } catch (e) {\n console.error(e);\n }\n }\n const results = await trendIterator.current.next();\n let { value } = results;\n if (value?.length) {\n if (firstLoad) {\n latestItem.current = value[0].id;\n }\n\n // value = filteredItems(value, 'public'); // Might not work here\n value.forEach((item) => {\n saveStatus(item, instance);\n });\n }\n return {\n ...results,\n value,\n };\n }\n\n async function checkForUpdates() {\n try {\n const results = await masto.v1.trends.statuses\n .list({\n limit: 1,\n // NOT SUPPORTED\n // since_id: latestItem.current,\n })\n .next();\n let { value } = results;\n value = filteredItems(value, 'public');\n if (value?.length && value[0].id !== latestItem.current) {\n latestItem.current = value[0].id;\n return true;\n }\n return false;\n } catch (e) {\n return false;\n }\n }\n\n const TimelineStart = useMemo(() => {\n return (\n <>\n {!!hashtags.length && (\n <div class=\"filter-bar expandable\">\n <Icon icon=\"chart\" class=\"insignificant\" size=\"l\" />\n {hashtags.map((tag, i) => {\n const { name, history } = tag;\n const total = history.reduce((acc, cur) => acc + +cur.uses, 0);\n return (\n <Link to={`/${instance}/t/${name}`} key={name}>\n <span>\n <span class=\"more-insignificant\">#</span>\n {name}\n </span>\n <span class=\"filter-count\">{shortenNumber(total)}</span>\n </Link>\n );\n })}\n </div>\n )}\n {!!links.length && (\n <div class=\"links-bar\">\n <header>\n <h3>Trending News</h3>\n </header>\n {links.map((link) => {\n const {\n authorName,\n authorUrl,\n blurhash,\n description,\n height,\n image,\n imageDescription,\n language,\n providerName,\n providerUrl,\n publishedAt,\n title,\n url,\n width,\n } = link;\n const domain = new URL(url).hostname\n .replace(/^www\\./, '')\n .replace(/\\/$/, '');\n let accentColor;\n if (blurhash) {\n const averageColor = getBlurHashAverageColor(blurhash);\n const labAverageColor = rgb2oklab(averageColor);\n accentColor = oklab2rgb([\n 0.6,\n labAverageColor[1],\n labAverageColor[2],\n ]);\n }\n\n return (\n <a\n key={url}\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={\n accentColor\n ? {\n '--accent-color': `rgb(${accentColor.join(',')})`,\n '--accent-alpha-color': `rgba(${accentColor.join(\n ',',\n )}, 0.4)`,\n }\n : {}\n }\n >\n <article>\n <figure>\n <img\n src={image}\n alt={imageDescription}\n width={width}\n height={height}\n loading=\"lazy\"\n />\n </figure>\n <div class=\"article-body\">\n <header>\n <div class=\"article-meta\">\n <span class=\"domain\">{domain}</span>{' '}\n {!!publishedAt && <>· </>}\n {!!publishedAt && (\n <>\n <RelativeTime\n datetime={publishedAt}\n format=\"micro\"\n />\n </>\n )}\n </div>\n {!!title && (\n <h1 class=\"title\" lang={language} dir=\"auto\">\n {title}\n </h1>\n )}\n </header>\n {!!description && (\n <p class=\"description\" lang={language} dir=\"auto\">\n {description}\n </p>\n )}\n </div>\n </article>\n </a>\n );\n })}\n </div>\n )}\n </>\n );\n }, [hashtags, links]);\n\n return (\n <Timeline\n key={instance}\n title={title}\n titleComponent={\n <h1 class=\"header-double-lines\">\n <b>Trending</b>\n <div>{instance}</div>\n </h1>\n }\n id=\"trending\"\n instance={instance}\n emptyText=\"No trending posts.\"\n errorText=\"Unable to load posts\"\n fetchItems={fetchTrend}\n checkForUpdates={checkForUpdates}\n checkForUpdatesInterval={5 * 60 * 1000} // 5 minutes\n useItemID\n headerStart={<></>}\n boostsCarousel={snapStates.settings.boostsCarousel}\n // allowFilters\n filterContext=\"public\"\n timelineStart={TimelineStart}\n headerEnd={\n <Menu2\n portal\n // setDownOverflow\n overflow=\"auto\"\n viewScroll=\"close\"\n position=\"anchor\"\n menuButton={\n <button type=\"button\" class=\"plain\">\n <Icon icon=\"more\" size=\"l\" />\n </button>\n }\n >\n <MenuItem\n onClick={() => {\n let newInstance = prompt(\n 'Enter a new instance e.g. \"mastodon.social\"',\n );\n if (!/\\./.test(newInstance)) {\n if (newInstance) alert('Invalid instance');\n return;\n }\n if (newInstance) {\n newInstance = newInstance.toLowerCase().trim();\n // navigate(`/${newInstance}/trending`);\n location.hash = `/${newInstance}/trending`;\n }\n }}\n >\n <Icon icon=\"bus\" /> <span>Go to another instance…</span>\n </MenuItem>\n {currentInstance !== instance && (\n <MenuItem\n onClick={() => {\n location.hash = `/${currentInstance}/trending`;\n }}\n >\n <Icon icon=\"bus\" />{' '}\n <small class=\"menu-double-lines\">\n Go to my instance (<b>{currentInstance}</b>)\n </small>\n </MenuItem>\n )}\n </Menu2>\n }\n />\n );\n}\n\nexport default Trending;\n","import { useHotkeys } from 'react-hotkeys-hook';\nimport { useSnapshot } from 'valtio';\n\nimport Bookmarks from '../pages/bookmarks';\nimport Favourites from '../pages/favourites';\nimport Following from '../pages/following';\nimport Hashtag from '../pages/hashtag';\nimport List from '../pages/list';\nimport Mentions from '../pages/mentions';\nimport Notifications from '../pages/notifications';\nimport Public from '../pages/public';\nimport Search from '../pages/search';\nimport Trending from '../pages/trending';\nimport states from '../utils/states';\nimport useTitle from '../utils/useTitle';\n\nfunction Columns() {\n useTitle('Home', '/');\n const snapStates = useSnapshot(states);\n const { shortcuts } = snapStates;\n\n console.debug('RENDER Columns', shortcuts);\n\n const components = shortcuts.map((shortcut) => {\n if (!shortcut) return null;\n const { type, ...params } = shortcut;\n const Component = {\n following: Following,\n notifications: Notifications,\n list: List,\n public: Public,\n bookmarks: Bookmarks,\n favourites: Favourites,\n hashtag: Hashtag,\n mentions: Mentions,\n trending: Trending,\n search: Search,\n }[type];\n if (!Component) return null;\n // Don't show Search column with no query, for now\n if (type === 'search' && !params.query) return null;\n return (\n <Component key={type + JSON.stringify(params)} {...params} columnMode />\n );\n });\n\n useHotkeys(['1', '2', '3', '4', '5', '6', '7', '8', '9'], (e, handler) => {\n try {\n const index = parseInt(handler.keys[0], 10) - 1;\n document.querySelectorAll('#columns > *')[index].focus();\n } catch (e) {\n console.error(e);\n }\n });\n\n return (\n <div\n id=\"columns\"\n onContextMenu={(e) => {\n // If right-click on header, but not links or buttons\n if (\n e.target.closest('.deck > header') &&\n !e.target.closest('a') &&\n !e.target.closest('button')\n ) {\n e.preventDefault();\n states.showShortcutsSettings = true;\n }\n }}\n >\n {components}\n </div>\n );\n}\n\nexport default Columns;\n","import './notifications-menu.css';\n\nimport { ControlledMenu } from '@szhsin/react-menu';\nimport { memo } from 'preact/compat';\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport Columns from '../components/columns';\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport Notification from '../components/notification';\nimport { api } from '../utils/api';\nimport db from '../utils/db';\nimport groupNotifications from '../utils/group-notifications';\nimport states, { saveStatus } from '../utils/states';\nimport { getCurrentAccountNS } from '../utils/store-utils';\n\nimport Following from './following';\n\nfunction Home() {\n const snapStates = useSnapshot(states);\n useEffect(() => {\n (async () => {\n const keys = await db.drafts.keys();\n if (keys.length) {\n const ns = getCurrentAccountNS();\n const ownKeys = keys.filter((key) => key.startsWith(ns));\n if (ownKeys.length) {\n states.showDrafts = true;\n }\n }\n })();\n }, []);\n\n return (\n <>\n {(snapStates.settings.shortcutsViewMode === 'multi-column' ||\n (!snapStates.settings.shortcutsViewMode &&\n snapStates.settings.shortcutsColumnsMode)) &&\n !!snapStates.shortcuts?.length ? (\n <Columns />\n ) : (\n <Following\n title=\"Home\"\n path=\"/\"\n id=\"home\"\n headerStart={false}\n headerEnd={<NotificationsLink />}\n />\n )}\n </>\n );\n}\n\nfunction NotificationsLink() {\n const snapStates = useSnapshot(states);\n const notificationLinkRef = useRef();\n const [menuState, setMenuState] = useState(undefined);\n return (\n <>\n <Link\n ref={notificationLinkRef}\n to=\"/notifications\"\n class={`button plain notifications-button ${\n snapStates.notificationsShowNew ? 'has-badge' : ''\n } ${menuState || ''}`}\n onClick={(e) => {\n e.stopPropagation();\n if (window.matchMedia('(min-width: calc(40em))').matches) {\n e.preventDefault();\n setMenuState((state) => (!state ? 'open' : undefined));\n }\n }}\n >\n <Icon icon=\"notification\" size=\"l\" alt=\"Notifications\" />\n </Link>\n <NotificationsMenu\n state={menuState}\n anchorRef={notificationLinkRef}\n onClose={() => setMenuState(undefined)}\n />\n </>\n );\n}\n\nconst NOTIFICATIONS_LIMIT = 30;\nconst NOTIFICATIONS_DISPLAY_LIMIT = 5;\nfunction NotificationsMenu({ anchorRef, state, onClose }) {\n const { masto, instance } = api();\n const snapStates = useSnapshot(states);\n const [uiState, setUIState] = useState('default');\n\n const notificationsIterator = masto.v1.notifications.list({\n limit: NOTIFICATIONS_LIMIT,\n });\n\n async function fetchNotifications() {\n const allNotifications = await notificationsIterator.next();\n const notifications = allNotifications.value;\n\n if (notifications?.length) {\n notifications.forEach((notification) => {\n saveStatus(notification.status, instance, {\n skipThreading: true,\n });\n });\n\n const groupedNotifications = groupNotifications(notifications);\n\n states.notificationsLast = notifications[0];\n states.notifications = groupedNotifications;\n\n // Update last read marker\n masto.v1.markers\n .create({\n notifications: {\n lastReadId: notifications[0].id,\n },\n })\n .catch(() => {});\n }\n\n states.notificationsShowNew = false;\n states.notificationsLastFetchTime = Date.now();\n return allNotifications;\n }\n\n const [hasFollowRequests, setHasFollowRequests] = useState(false);\n function fetchFollowRequests() {\n return masto.v1.followRequests.list({\n limit: 1,\n });\n }\n\n function loadNotifications() {\n setUIState('loading');\n (async () => {\n try {\n await fetchNotifications();\n const followRequests = await fetchFollowRequests();\n setHasFollowRequests(!!followRequests?.length);\n setUIState('default');\n } catch (e) {\n setUIState('error');\n }\n })();\n }\n\n useEffect(() => {\n if (state === 'open') loadNotifications();\n }, [state]);\n\n return (\n <ControlledMenu\n menuClassName=\"notifications-menu\"\n state={state}\n anchorRef={anchorRef}\n onClose={onClose}\n portal={{\n target: document.body,\n }}\n overflow=\"auto\"\n viewScroll=\"close\"\n position=\"anchor\"\n align=\"center\"\n boundingBoxPadding=\"8 8 8 8\"\n >\n <header>\n <h2>Notifications</h2>\n </header>\n <main>\n {snapStates.notifications.length ? (\n <>\n {snapStates.notifications\n .slice(0, NOTIFICATIONS_DISPLAY_LIMIT)\n .map((notification) => (\n <Notification\n key={notification.id}\n instance={instance}\n notification={notification}\n disableContextMenu\n />\n ))}\n </>\n ) : uiState === 'loading' ? (\n <div class=\"ui-state\">\n <Loader abrupt />\n </div>\n ) : (\n uiState === 'error' && (\n <div class=\"ui-state\">\n <p>Unable to fetch notifications.</p>\n <p>\n <button type=\"button\" onClick={loadNotifications}>\n Try again\n </button>\n </p>\n </div>\n )\n )}\n </main>\n <footer>\n <Link to=\"/mentions\" class=\"button plain\">\n <Icon icon=\"at\" /> <span>Mentions</span>\n </Link>\n <Link to=\"/notifications\" class=\"button plain2\">\n {hasFollowRequests ? (\n <>\n <span class=\"tag collapsed\">New</span>{' '}\n <span>Follow Requests</span>\n </>\n ) : (\n <b>See all</b>\n )}{' '}\n <Icon icon=\"arrow-right\" />\n </Link>\n </footer>\n </ControlledMenu>\n );\n}\n\nexport default memo(Home);\n","// export const statusRegex = /\\/@([^@\\/]+)@?([^\\/]+)?\\/([^\\/]+)\\/?$/i;\n// export const statusNoteRegex = /\\/notes\\/([^\\/]+)\\/?$/i;\n\nconst statusPostRegexes = [\n /^\\/@[^@\\/]+\\/(?:statuses|posts)\\/([^\\/]+)/i, // GoToSocial, Takahe\n /\\/notes\\/([^\\/]+)/i, // Misskey, Firefish\n /^\\/(?:notice|objects)\\/([a-z0-9-]+)/i, // Pleroma\n /\\/@[^@\\/]+@?[^\\/]+?\\/([^\\/]+)/i, // Mastodon\n];\n\nexport function getInstanceStatusObject(url) {\n // Regex /:username/:id, where username = @username or @username@domain, id = anything\n const { hostname, pathname } = new URL(url);\n // const [, username, domain, id] = pathname.match(statusRegex) || [];\n for (const regex of statusPostRegexes) {\n const [, id] = pathname.match(regex) || [];\n console.log(pathname, regex, id);\n if (id) {\n return {\n instance: hostname,\n id,\n };\n }\n }\n return {};\n}\n\nfunction getInstanceStatusURL(url) {\n const { instance, id } = getInstanceStatusObject(url);\n if (instance && id) {\n return `/${instance}/s/${id}`;\n }\n return null;\n}\n\nexport default getInstanceStatusURL;\n","import { useLayoutEffect, useState } from 'preact/hooks';\nimport { useLocation } from 'react-router-dom';\n\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport { api } from '../utils/api';\nimport getInstanceStatusURL, {\n getInstanceStatusObject,\n} from '../utils/get-instance-status-url';\n\nexport default function HttpRoute() {\n const location = useLocation();\n const url = location.pathname.replace(/^\\//, '');\n const statusObject = getInstanceStatusObject(url);\n // const statusURL = getInstanceStatusURL(url);\n const statusURL = statusObject?.instance\n ? `/${statusObject.instance}/s/${statusObject.id}`\n : null;\n const [uiState, setUIState] = useState('loading');\n\n useLayoutEffect(() => {\n setUIState('loading');\n (async () => {\n // Check if status returns 200\n try {\n const { instance, id } = statusObject;\n const { masto } = api({ instance });\n const status = await masto.v1.statuses.$select(id).fetch();\n if (status) {\n window.location.hash = statusURL + '?view=full';\n return;\n }\n } catch (e) {}\n\n // Fallback to search\n {\n const { masto: currentMasto, instance: currentInstance } = api();\n const result = await currentMasto.v2.search.fetch({\n q: url,\n type: 'statuses',\n limit: 1,\n resolve: true,\n });\n if (result.statuses.length) {\n const status = result.statuses[0];\n window.location.hash = `/${currentInstance}/s/${status.id}?view=full`;\n } else {\n // Fallback to original URL, which will probably show error\n window.location.hash = statusURL + '?view=full';\n }\n }\n })();\n }, [statusURL]);\n\n return (\n <div class=\"ui-state\" tabIndex=\"-1\">\n {uiState === 'loading' ? (\n <>\n <Loader abrupt />\n <h2>Resolving…</h2>\n <p>\n <a href={url} target=\"_blank\" rel=\"noopener noreferrer\">\n {url}\n </a>\n </p>\n </>\n ) : (\n <>\n <h2>Unable to resolve URL</h2>\n <p>\n <a href={url} target=\"_blank\" rel=\"noopener noreferrer\">\n {url}\n </a>\n </p>\n </>\n )}\n <hr />\n <p>\n <Link to=\"/\">Go home</Link>\n </p>\n </div>\n );\n}\n","import './lists.css';\n\nimport { useEffect, useReducer, useRef, useState } from 'preact/hooks';\n\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport ListAddEdit from '../components/list-add-edit';\nimport Loader from '../components/loader';\nimport Modal from '../components/modal';\nimport NavMenu from '../components/nav-menu';\nimport { api } from '../utils/api';\nimport useTitle from '../utils/useTitle';\n\nfunction Lists() {\n const { masto } = api();\n useTitle(`Lists`, `/l`);\n const [uiState, setUIState] = useState('default');\n\n const [reloadCount, reload] = useReducer((c) => c + 1, 0);\n const [lists, setLists] = useState([]);\n useEffect(() => {\n setUIState('loading');\n (async () => {\n try {\n const lists = await masto.v1.lists.list();\n lists.sort((a, b) => a.title.localeCompare(b.title));\n console.log(lists);\n setLists(lists);\n setUIState('default');\n } catch (e) {\n console.error(e);\n setUIState('error');\n }\n })();\n }, [reloadCount]);\n\n const [showListAddEditModal, setShowListAddEditModal] = useState(false);\n\n return (\n <div id=\"lists-page\" class=\"deck-container\" tabIndex=\"-1\">\n <div class=\"timeline-deck deck\">\n <header>\n <div class=\"header-grid\">\n <div class=\"header-side\">\n <NavMenu />\n <Link to=\"/\" class=\"button plain\">\n <Icon icon=\"home\" size=\"l\" />\n </Link>\n </div>\n <h1>Lists</h1>\n <div class=\"header-side\">\n <button\n type=\"button\"\n class=\"plain\"\n onClick={() => setShowListAddEditModal(true)}\n >\n <Icon icon=\"plus\" size=\"l\" alt=\"New list\" />\n </button>\n </div>\n </div>\n </header>\n <main>\n {lists.length > 0 ? (\n <ul class=\"link-list\">\n {lists.map((list) => (\n <li>\n <Link to={`/l/${list.id}`}>\n <span>\n <Icon icon=\"list\" /> <span>{list.title}</span>\n </span>\n {/* <button\n type=\"button\"\n class=\"plain\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setShowListAddEditModal({\n list,\n });\n }}\n >\n <Icon icon=\"pencil\" />\n </button> */}\n </Link>\n </li>\n ))}\n </ul>\n ) : uiState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader />\n </p>\n ) : uiState === 'error' ? (\n <p class=\"ui-state\">Unable to load lists.</p>\n ) : (\n <p class=\"ui-state\">No lists yet.</p>\n )}\n </main>\n </div>\n {showListAddEditModal && (\n <Modal\n class=\"light\"\n onClick={(e) => {\n if (e.target === e.currentTarget) {\n setShowListAddEditModal(false);\n }\n }}\n >\n <ListAddEdit\n list={showListAddEditModal?.list}\n onClose={(result) => {\n if (result.state === 'success') {\n reload();\n }\n setShowListAddEditModal(false);\n }}\n />\n </Modal>\n )}\n </div>\n );\n}\n\nexport default Lists;\n","export default \"__VITE_ASSET__Y_wpqkTO__\"","const { PHANPY_CLIENT_NAME: CLIENT_NAME, PHANPY_WEBSITE: WEBSITE } = import.meta\n .env;\n\nconst SCOPES = 'read write follow push';\n\nexport async function registerApplication({ instanceURL }) {\n const registrationParams = new URLSearchParams({\n client_name: CLIENT_NAME,\n redirect_uris: location.origin + location.pathname,\n scopes: SCOPES,\n website: WEBSITE,\n });\n const registrationResponse = await fetch(\n `https://${instanceURL}/api/v1/apps`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: registrationParams.toString(),\n },\n );\n const registrationJSON = await registrationResponse.json();\n console.log({ registrationJSON });\n return registrationJSON;\n}\n\nexport async function getAuthorizationURL({ instanceURL, client_id }) {\n const authorizationParams = new URLSearchParams({\n client_id,\n scope: SCOPES,\n redirect_uri: location.origin + location.pathname,\n // redirect_uri: 'urn:ietf:wg:oauth:2.0:oob',\n response_type: 'code',\n });\n const authorizationURL = `https://${instanceURL}/oauth/authorize?${authorizationParams.toString()}`;\n return authorizationURL;\n}\n\nexport async function getAccessToken({\n instanceURL,\n client_id,\n client_secret,\n code,\n}) {\n const params = new URLSearchParams({\n client_id,\n client_secret,\n redirect_uri: location.origin + location.pathname,\n grant_type: 'authorization_code',\n code,\n scope: SCOPES,\n });\n const tokenResponse = await fetch(`https://${instanceURL}/oauth/token`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: params.toString(),\n });\n const tokenJSON = await tokenResponse.json();\n console.log({ tokenJSON });\n return tokenJSON;\n}\n","import './login.css';\n\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport { useSearchParams } from 'react-router-dom';\n\nimport logo from '../assets/logo.svg';\n\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport instancesListURL from '../data/instances.json?url';\nimport { getAuthorizationURL, registerApplication } from '../utils/auth';\nimport store from '../utils/store';\nimport useTitle from '../utils/useTitle';\n\nconst { PHANPY_DEFAULT_INSTANCE: DEFAULT_INSTANCE } = import.meta.env;\n\nfunction Login() {\n useTitle('Log in');\n const instanceURLRef = useRef();\n const cachedInstanceURL = store.local.get('instanceURL');\n const [uiState, setUIState] = useState('default');\n const [searchParams] = useSearchParams();\n const instance = searchParams.get('instance');\n const submit = searchParams.get('submit');\n const [instanceText, setInstanceText] = useState(\n instance || cachedInstanceURL?.toLowerCase() || '',\n );\n\n const [instancesList, setInstancesList] = useState([]);\n useEffect(() => {\n (async () => {\n try {\n const res = await fetch(instancesListURL);\n const data = await res.json();\n setInstancesList(data);\n } catch (e) {\n // Silently fail\n console.error(e);\n }\n })();\n }, []);\n\n // useEffect(() => {\n // if (cachedInstanceURL) {\n // instanceURLRef.current.value = cachedInstanceURL.toLowerCase();\n // }\n // }, []);\n\n const submitInstance = (instanceURL) => {\n if (!instanceURL) return;\n store.local.set('instanceURL', instanceURL);\n\n (async () => {\n setUIState('loading');\n try {\n const { client_id, client_secret, vapid_key } =\n await registerApplication({\n instanceURL,\n });\n\n if (client_id && client_secret) {\n store.session.set('clientID', client_id);\n store.session.set('clientSecret', client_secret);\n store.session.set('vapidKey', vapid_key);\n\n location.href = await getAuthorizationURL({\n instanceURL,\n client_id,\n });\n } else {\n alert('Failed to register application');\n }\n setUIState('default');\n } catch (e) {\n console.error(e);\n setUIState('error');\n }\n })();\n };\n\n const cleanInstanceText = instanceText\n ? instanceText\n .replace(/^https?:\\/\\//, '') // Remove protocol from instance URL\n .replace(/\\/+$/, '') // Remove trailing slash\n .replace(/^@?[^@]+@/, '') // Remove @?acct@\n .trim()\n : null;\n const instanceTextLooksLikeDomain =\n /[^\\s\\r\\n\\t\\/\\\\]+\\.[^\\s\\r\\n\\t\\/\\\\]+/.test(cleanInstanceText) &&\n !/[\\s\\/\\\\@]/.test(cleanInstanceText);\n\n const instancesSuggestions = cleanInstanceText\n ? instancesList\n .filter((instance) => instance.includes(instanceText))\n .sort((a, b) => {\n // Move text that starts with instanceText to the start\n const aStartsWith = a\n .toLowerCase()\n .startsWith(instanceText.toLowerCase());\n const bStartsWith = b\n .toLowerCase()\n .startsWith(instanceText.toLowerCase());\n if (aStartsWith && !bStartsWith) return -1;\n if (!aStartsWith && bStartsWith) return 1;\n return 0;\n })\n .slice(0, 10)\n : [];\n\n const selectedInstanceText = instanceTextLooksLikeDomain\n ? cleanInstanceText\n : instancesSuggestions?.length\n ? instancesSuggestions[0]\n : instanceText\n ? instancesList.find((instance) => instance.includes(instanceText))\n : null;\n\n const onSubmit = (e) => {\n e.preventDefault();\n // const { elements } = e.target;\n // let instanceURL = elements.instanceURL.value.toLowerCase();\n // // Remove protocol from instance URL\n // instanceURL = instanceURL.replace(/^https?:\\/\\//, '').replace(/\\/+$/, '');\n // // Remove @acct@ or acct@ from instance URL\n // instanceURL = instanceURL.replace(/^@?[^@]+@/, '');\n // if (!/\\./.test(instanceURL)) {\n // instanceURL = instancesList.find((instance) =>\n // instance.includes(instanceURL),\n // );\n // }\n // submitInstance(instanceURL);\n submitInstance(selectedInstanceText);\n };\n\n if (submit) {\n useEffect(() => {\n submitInstance(instance || selectedInstanceText);\n }, []);\n }\n\n return (\n <main id=\"login\" style={{ textAlign: 'center' }}>\n <form onSubmit={onSubmit}>\n <h1>\n <img src={logo} alt=\"\" width=\"80\" height=\"80\" />\n <br />\n Log in\n </h1>\n <label>\n <p>Instance</p>\n <input\n value={instanceText}\n required\n type=\"text\"\n class=\"large\"\n id=\"instanceURL\"\n ref={instanceURLRef}\n disabled={uiState === 'loading'}\n // list=\"instances-list\"\n autocorrect=\"off\"\n autocapitalize=\"off\"\n autocomplete=\"off\"\n spellcheck={false}\n placeholder=\"instance domain\"\n onInput={(e) => {\n setInstanceText(e.target.value);\n }}\n />\n {instancesSuggestions?.length > 0 ? (\n <ul id=\"instances-suggestions\">\n {instancesSuggestions.map((instance, i) => (\n <li>\n <button\n type=\"button\"\n class=\"plain5\"\n onClick={() => {\n submitInstance(instance);\n }}\n >\n {instance}\n </button>\n </li>\n ))}\n </ul>\n ) : (\n <div id=\"instances-eg\">e.g. “mastodon.social”</div>\n )}\n {/* <datalist id=\"instances-list\">\n {instancesList.map((instance) => (\n <option value={instance} />\n ))}\n </datalist> */}\n </label>\n {uiState === 'error' && (\n <p class=\"error\">\n Failed to log in. Please try again or another instance.\n </p>\n )}\n <div>\n <button\n disabled={\n uiState === 'loading' || !instanceText || !selectedInstanceText\n }\n >\n {selectedInstanceText\n ? `Continue with ${selectedInstanceText}`\n : 'Continue'}\n </button>{' '}\n </div>\n <Loader hidden={uiState !== 'loading'} />\n <hr />\n {!DEFAULT_INSTANCE && (\n <p>\n <a href=\"https://joinmastodon.org/servers\" target=\"_blank\">\n Don't have an account? Create one!\n </a>\n </p>\n )}\n <p>\n <Link to=\"/\">Go home</Link>\n </p>\n </form>\n </main>\n );\n}\n\nexport default Login;\n","import './status.css';\n\nimport { Menu, MenuDivider, MenuHeader, MenuItem } from '@szhsin/react-menu';\nimport debounce from 'just-debounce-it';\nimport pRetry from 'p-retry';\nimport { memo } from 'preact/compat';\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport { InView } from 'react-intersection-observer';\nimport { matchPath, useSearchParams } from 'react-router-dom';\nimport { useDebouncedCallback } from 'use-debounce';\nimport { useSnapshot } from 'valtio';\n\nimport Avatar from '../components/avatar';\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport MediaModal from '../components/media-modal';\nimport Menu2 from '../components/menu2';\nimport NameText from '../components/name-text';\nimport RelativeTime from '../components/relative-time';\nimport Status from '../components/status';\nimport { api } from '../utils/api';\nimport htmlContentLength from '../utils/html-content-length';\nimport shortenNumber from '../utils/shorten-number';\nimport states, {\n getStatus,\n saveStatus,\n statusKey,\n threadifyStatus,\n} from '../utils/states';\nimport statusPeek from '../utils/status-peek';\nimport { getCurrentAccount } from '../utils/store-utils';\nimport useScroll from '../utils/useScroll';\nimport useTitle from '../utils/useTitle';\n\nimport getInstanceStatusURL from './../utils/get-instance-status-url';\n\nconst LIMIT = 40;\nconst SUBCOMMENTS_OPEN_ALL_LIMIT = 10;\nconst MAX_WEIGHT = 5;\n\nlet cachedRepliesToggle = {};\nlet cachedStatusesMap = {};\nlet scrollPositions = {};\nfunction resetScrollPosition(id) {\n delete cachedStatusesMap[id];\n delete scrollPositions[id];\n}\n\nconst scrollIntoViewOptions = {\n block: 'nearest',\n inline: 'center',\n behavior: 'smooth',\n};\n\n// Select all statuses except those inside collapsed details/summary\n// Hat-tip to @AmeliaBR@front-end.social\n// https://front-end.social/@AmeliaBR/109784776146144471\nconst STATUSES_SELECTOR =\n '.status-link:not(details:not([open]) > summary ~ *, details:not([open]) > summary ~ * *), .status-focus:not(details:not([open]) > summary ~ *, details:not([open]) > summary ~ * *)';\n\nconst STATUS_URL_REGEX = /\\/s\\//i;\n\nfunction StatusPage(params) {\n const { id } = params;\n const { masto, instance } = api({ instance: params.instance });\n const snapStates = useSnapshot(states);\n const [searchParams, setSearchParams] = useSearchParams();\n const mediaParam = searchParams.get('media');\n const mediaOnlyParam = searchParams.get('media-only');\n const mediaIndex = parseInt(mediaParam || mediaOnlyParam, 10);\n let showMedia = mediaIndex > 0;\n const mediaStatusID = searchParams.get('mediaStatusID');\n const mediaStatus = getStatus(mediaStatusID, instance);\n if (mediaStatusID && !mediaStatus) {\n showMedia = false;\n }\n const showMediaOnly = showMedia && !!mediaOnlyParam;\n\n const sKey = statusKey(id, instance);\n const [heroStatus, setHeroStatus] = useState(states.statuses[sKey]);\n useEffect(() => {\n if (states.statuses[sKey]) {\n setHeroStatus(states.statuses[sKey]);\n }\n }, [sKey]);\n\n const closeLink = useMemo(() => {\n const { prevLocation } = states;\n const pathname =\n (prevLocation?.pathname || '') + (prevLocation?.search || '');\n const matchStatusPath =\n matchPath('/:instance/s/:id', pathname) || matchPath('/s/:id', pathname);\n if (!pathname || matchStatusPath) {\n return '/';\n }\n return pathname;\n }, []);\n\n useEffect(() => {\n if (!heroStatus && showMedia) {\n (async () => {\n try {\n const status = await masto.v1.statuses.$select(id).fetch();\n saveStatus(status, instance);\n setHeroStatus(status);\n } catch (err) {\n console.error(err);\n alert('Unable to load post.');\n location.hash = closeLink;\n }\n })();\n }\n }, [showMedia]);\n\n const mediaAttachments = mediaStatusID\n ? mediaStatus?.mediaAttachments\n : heroStatus?.mediaAttachments;\n\n const handleMediaClose = useCallback(() => {\n if (\n !window.matchMedia('(min-width: calc(40em + 350px))').matches &&\n snapStates.prevLocation\n ) {\n history.back();\n } else {\n if (showMediaOnly) {\n location.hash = closeLink;\n } else {\n searchParams.delete('media');\n searchParams.delete('mediaStatusID');\n setSearchParams(searchParams);\n }\n }\n }, [showMediaOnly, closeLink, snapStates.prevLocation]);\n\n useEffect(() => {\n let timer = setTimeout(() => {\n // carouselRef.current?.focus?.();\n const $carousel = document.querySelector('.carousel');\n if ($carousel) {\n $carousel.focus();\n }\n }, 100);\n return () => clearTimeout(timer);\n }, [showMediaOnly]);\n\n return (\n <div class=\"deck-backdrop\">\n {showMedia ? (\n mediaAttachments?.length ? (\n <MediaModal\n mediaAttachments={mediaAttachments}\n statusID={mediaStatusID || id}\n instance={instance}\n lang={heroStatus?.language}\n index={mediaIndex - 1}\n onClose={handleMediaClose}\n />\n ) : (\n <div class=\"media-modal-container loading\">\n <Loader abrupt />\n </div>\n )\n ) : (\n <Link to={closeLink} />\n )}\n {!showMediaOnly && (\n <StatusThread\n id={id}\n instance={params.instance}\n closeLink={closeLink}\n />\n )}\n </div>\n );\n}\n\nfunction StatusThread({ id, closeLink = '/', instance: propInstance }) {\n const [searchParams, setSearchParams] = useSearchParams();\n const mediaParam = searchParams.get('media');\n const mediaStatusID = searchParams.get('mediaStatusID');\n const showMedia = parseInt(mediaParam, 10) > 0;\n const firstLoad = useRef(\n !states.prevLocation &&\n (history.length === 1 ||\n ('navigation' in window && navigation?.entries?.()?.length === 1)),\n );\n const [viewMode, setViewMode] = useState(\n searchParams.get('view') || firstLoad.current ? 'full' : null,\n );\n const translate = !!parseInt(searchParams.get('translate'));\n const { masto, instance } = api({ instance: propInstance });\n const {\n masto: currentMasto,\n instance: currentInstance,\n authenticated,\n } = api();\n const sameInstance = instance === currentInstance;\n const snapStates = useSnapshot(states);\n const [statuses, setStatuses] = useState([]);\n const [uiState, setUIState] = useState('default');\n const heroStatusRef = useRef();\n const sKey = statusKey(id, instance);\n const totalDescendants = useRef(0);\n\n const scrollableRef = useRef();\n useEffect(() => {\n scrollableRef.current?.focus();\n }, []);\n useEffect(() => {\n const onScroll = debounce(() => {\n // console.log('onScroll');\n if (!scrollableRef.current) return;\n const { scrollTop } = scrollableRef.current;\n if (uiState !== 'loading') {\n scrollPositions[id] = scrollTop;\n }\n }, 50);\n scrollableRef.current?.addEventListener('scroll', onScroll, {\n passive: true,\n });\n onScroll();\n return () => {\n onScroll.cancel();\n scrollableRef.current?.removeEventListener('scroll', onScroll);\n };\n }, [id, uiState !== 'loading']);\n\n const scrollOffsets = useRef();\n const initContext = ({ reloadHero } = {}) => {\n console.debug('initContext', id);\n setUIState('loading');\n let heroTimer;\n\n const cachedStatuses = cachedStatusesMap[id];\n if (cachedStatuses) {\n // Case 1: It's cached, let's restore them to make it snappy\n const reallyCachedStatuses = cachedStatuses.filter(\n (s) => states.statuses[sKey],\n // Some are not cached in the global state, so we need to filter them out\n );\n setStatuses(reallyCachedStatuses);\n } else {\n // const heroIndex = statuses.findIndex((s) => s.id === id);\n // if (heroIndex !== -1) {\n // // Case 2: It's in current statuses. Slice off all descendant statuses after the hero status to be safe\n // const slicedStatuses = statuses.slice(0, heroIndex + 1);\n // setStatuses(slicedStatuses);\n // } else {\n // Case 3: Not cached and not in statuses, let's start from scratch\n setStatuses([{ id }]);\n // }\n }\n\n (async () => {\n const heroFetch = () =>\n pRetry(() => masto.v1.statuses.$select(id).fetch(), {\n retries: 4,\n });\n const contextFetch = pRetry(\n () => masto.v1.statuses.$select(id).context.fetch(),\n {\n retries: 8,\n },\n );\n\n const hasStatus = !!snapStates.statuses[sKey];\n let heroStatus = snapStates.statuses[sKey];\n if (hasStatus && !reloadHero) {\n console.debug('Hero status is cached');\n } else {\n try {\n heroStatus = await heroFetch();\n saveStatus(heroStatus, instance);\n // Give time for context to appear\n await new Promise((resolve) => {\n setTimeout(resolve, 100);\n });\n } catch (e) {\n console.error(e);\n setUIState('error');\n return;\n }\n }\n\n try {\n const context = await contextFetch;\n const { ancestors, descendants } = context;\n\n totalDescendants.current = descendants?.length || 0;\n\n const missingStatuses = new Set();\n ancestors.forEach((status) => {\n saveStatus(status, instance, {\n skipThreading: true,\n });\n if (\n status.inReplyToId &&\n !ancestors.find((s) => s.id === status.inReplyToId)\n ) {\n missingStatuses.add(status.inReplyToId);\n }\n });\n const ancestorsIsThread = ancestors.every(\n (s) => s.account.id === heroStatus.account.id,\n );\n const nestedDescendants = [];\n descendants.forEach((status) => {\n saveStatus(status, instance, {\n skipThreading: true,\n });\n\n if (\n status.inReplyToId &&\n !descendants.find((s) => s.id === status.inReplyToId) &&\n status.inReplyToId !== heroStatus.id\n ) {\n missingStatuses.add(status.inReplyToId);\n }\n\n if (status.inReplyToAccountId === status.account.id) {\n // If replying to self, it's part of the thread, level 1\n nestedDescendants.push(status);\n } else if (status.inReplyToId === heroStatus.id) {\n // If replying to the hero status, it's a reply, level 1\n nestedDescendants.push(status);\n } else if (\n !status.inReplyToAccountId &&\n nestedDescendants.find((s) => s.id === status.inReplyToId) &&\n status.account.id === heroStatus.account.id\n ) {\n // If replying to hero's own statuses, it's part of the thread, level 1\n nestedDescendants.push(status);\n } else {\n // If replying to someone else, it's a reply to a reply, level 2\n const parent = descendants.find((s) => s.id === status.inReplyToId);\n if (parent) {\n if (!parent.__replies) {\n parent.__replies = [];\n }\n parent.__replies.push(status);\n } else {\n // If no parent, something is wrong\n console.warn('No parent found for', status);\n }\n }\n });\n\n console.log({ ancestors, descendants, nestedDescendants });\n if (missingStatuses.size) {\n console.error('Missing statuses', [...missingStatuses]);\n }\n\n function expandReplies(_replies) {\n return _replies?.map((_r) => ({\n id: _r.id,\n account: _r.account,\n repliesCount: _r.repliesCount,\n content: _r.content,\n weight: calcStatusWeight(_r),\n replies: expandReplies(_r.__replies),\n }));\n }\n\n const allStatuses = [\n ...ancestors.map((s) => ({\n id: s.id,\n ancestor: true,\n isThread: ancestorsIsThread,\n accountID: s.account.id,\n account: s.account,\n repliesCount: s.repliesCount,\n weight: calcStatusWeight(s),\n })),\n {\n id,\n accountID: heroStatus.account.id,\n weight: calcStatusWeight(heroStatus),\n },\n ...nestedDescendants.map((s) => ({\n id: s.id,\n account: s.account,\n accountID: s.account.id,\n descendant: true,\n thread: s.account.id === heroStatus.account.id,\n weight: calcStatusWeight(s),\n replies: expandReplies(s.__replies),\n })),\n ];\n\n setUIState('default');\n scrollOffsets.current = {\n offsetTop: heroStatusRef.current?.offsetTop,\n scrollTop: scrollableRef.current?.scrollTop,\n };\n\n // Set limit to hero's index\n const heroLimit = allStatuses.findIndex((s) => s.id === id);\n if (heroLimit >= limit) {\n setLimit(heroLimit + 1);\n }\n\n console.log({ allStatuses });\n setStatuses(allStatuses);\n cachedStatusesMap[id] = allStatuses;\n\n // Let's threadify this one\n // Note that all non-hero statuses will trigger saveStatus which will threadify them too\n // By right, at this point, all descendant statuses should be cached\n threadifyStatus(heroStatus, instance);\n } catch (e) {\n console.error(e);\n setUIState('error');\n }\n })();\n\n return () => {\n clearTimeout(heroTimer);\n };\n };\n\n useEffect(initContext, [id, masto]);\n useEffect(() => {\n if (!statuses.length) return;\n console.debug('STATUSES', statuses);\n const scrollPosition = scrollPositions[id];\n console.debug('scrollPosition', scrollPosition);\n if (!!scrollPosition) {\n console.debug('Case 1', {\n id,\n scrollPosition,\n });\n scrollableRef.current.scrollTop = scrollPosition;\n } else if (scrollOffsets.current) {\n const newScrollOffsets = {\n offsetTop: heroStatusRef.current?.offsetTop,\n scrollTop: scrollableRef.current?.scrollTop,\n };\n const newScrollTop =\n newScrollOffsets.offsetTop -\n scrollOffsets.current.offsetTop +\n newScrollOffsets.scrollTop;\n console.debug('Case 2', {\n scrollOffsets: scrollOffsets.current,\n newScrollOffsets,\n newScrollTop,\n statuses: [...statuses],\n });\n scrollableRef.current.scrollTop = newScrollTop;\n } else if (statuses.length === 1) {\n console.debug('Case 3', {\n id,\n });\n scrollableRef.current.scrollTop = 0;\n }\n\n // RESET\n scrollOffsets.current = null;\n }, [statuses]);\n\n useEffect(() => {\n if (snapStates.reloadStatusPage <= 0) return;\n // Delete the cache for the context\n (async () => {\n try {\n const { instanceURL } = getCurrentAccount();\n const contextURL = `https://${instanceURL}/api/v1/statuses/${id}/context`;\n console.log('Clear cache', contextURL);\n const apiCache = await caches.open('api');\n await apiCache.delete(contextURL, { ignoreVary: true });\n\n return initContext({\n reloadHero: true,\n });\n } catch (e) {\n console.error(e);\n }\n })();\n }, [snapStates.reloadStatusPage]);\n\n useEffect(() => {\n return () => {\n // RESET\n scrollPositions = {};\n states.reloadStatusPage = 0;\n cachedStatusesMap = {};\n cachedRepliesToggle = {};\n statusWeightCache.clear();\n };\n }, []);\n\n const heroStatus = snapStates.statuses[sKey] || snapStates.statuses[id];\n const heroDisplayName = useMemo(() => {\n // Remove shortcodes from display name\n if (!heroStatus) return '';\n const { account } = heroStatus;\n const div = document.createElement('div');\n div.innerHTML = account.displayName;\n return div.innerText.trim();\n }, [heroStatus]);\n const heroContentText = useMemo(() => {\n if (!heroStatus) return '';\n let text = statusPeek(heroStatus);\n if (text.length > 64) {\n // \"The title should ideally be less than 64 characters in length\"\n // https://www.w3.org/Provider/Style/TITLE.html\n text = text.slice(0, 64) + '…';\n }\n return text;\n }, [heroStatus]);\n useTitle(\n heroDisplayName && heroContentText\n ? `${heroDisplayName}: \"${heroContentText}\"`\n : 'Status',\n '/:instance?/s/:id',\n );\n\n const postInstance = useMemo(() => {\n if (!heroStatus) return;\n const { url } = heroStatus;\n if (!url) return;\n return new URL(url).hostname;\n }, [heroStatus]);\n const postSameInstance = useMemo(() => {\n if (!postInstance) return;\n return postInstance === instance;\n }, [postInstance, instance]);\n\n const [limit, setLimit] = useState(LIMIT);\n const showMore = useMemo(() => {\n // return number of statuses to show\n return statuses.length - limit;\n }, [statuses.length, limit]);\n\n const hasDescendants = statuses.some((s) => s.descendant);\n const ancestors = statuses.filter((s) => s.ancestor);\n\n const [heroInView, setHeroInView] = useState(true);\n const heroPointer = useMemo(() => {\n // get top offset of heroStatus\n if (!heroStatusRef.current || heroInView) return null;\n const { top } = heroStatusRef.current.getBoundingClientRect();\n return top > 0 ? 'down' : 'up';\n }, [heroInView]);\n\n useHotkeys(\n 'esc',\n () => {\n location.hash = closeLink;\n },\n {\n // If media is open, esc to close media first\n // Else close the status page\n enabled: !showMedia,\n ignoreEventWhen: (e) => {\n const hasModal = !!document.querySelector('#modal-container > *');\n return hasModal;\n },\n },\n );\n // For backspace, will always close both media and status page\n useHotkeys('backspace', () => {\n location.hash = closeLink;\n });\n\n useHotkeys('j', () => {\n const activeStatus = document.activeElement.closest(\n '.status-link, .status-focus',\n );\n const activeStatusRect = activeStatus?.getBoundingClientRect();\n const allStatusLinks = Array.from(\n scrollableRef.current.querySelectorAll(STATUSES_SELECTOR),\n );\n console.log({ allStatusLinks });\n if (\n activeStatus &&\n activeStatusRect.top < scrollableRef.current.clientHeight &&\n activeStatusRect.bottom > 0\n ) {\n const activeStatusIndex = allStatusLinks.indexOf(activeStatus);\n let nextStatus = allStatusLinks[activeStatusIndex + 1];\n if (nextStatus) {\n nextStatus.focus();\n nextStatus.scrollIntoView(scrollIntoViewOptions);\n }\n } else {\n // If active status is not in viewport, get the topmost status-link in viewport\n const topmostStatusLink = allStatusLinks.find((statusLink) => {\n const statusLinkRect = statusLink.getBoundingClientRect();\n return statusLinkRect.top >= 44 && statusLinkRect.left >= 0; // 44 is the magic number for header height, not real\n });\n if (topmostStatusLink) {\n topmostStatusLink.focus();\n topmostStatusLink.scrollIntoView(scrollIntoViewOptions);\n }\n }\n });\n\n useHotkeys('k', () => {\n const activeStatus = document.activeElement.closest(\n '.status-link, .status-focus',\n );\n const activeStatusRect = activeStatus?.getBoundingClientRect();\n const allStatusLinks = Array.from(\n scrollableRef.current.querySelectorAll(STATUSES_SELECTOR),\n );\n if (\n activeStatus &&\n activeStatusRect.top < scrollableRef.current.clientHeight &&\n activeStatusRect.bottom > 0\n ) {\n const activeStatusIndex = allStatusLinks.indexOf(activeStatus);\n let prevStatus = allStatusLinks[activeStatusIndex - 1];\n if (prevStatus) {\n prevStatus.focus();\n prevStatus.scrollIntoView(scrollIntoViewOptions);\n }\n } else {\n // If active status is not in viewport, get the topmost status-link in viewport\n const topmostStatusLink = allStatusLinks.find((statusLink) => {\n const statusLinkRect = statusLink.getBoundingClientRect();\n return statusLinkRect.top >= 44 && statusLinkRect.left >= 0; // 44 is the magic number for header height, not real\n });\n if (topmostStatusLink) {\n topmostStatusLink.focus();\n topmostStatusLink.scrollIntoView(scrollIntoViewOptions);\n }\n }\n });\n\n // NOTE: I'm not sure if 'x' is the best shortcut for this, might change it later\n // IDEA: x is for expand\n useHotkeys('x', () => {\n const activeStatus = document.activeElement.closest(\n '.status-link, .status-focus',\n );\n if (activeStatus) {\n const details = activeStatus.nextElementSibling;\n if (details && details.tagName.toLowerCase() === 'details') {\n details.open = !details.open;\n }\n }\n });\n\n const [reachTopPost, setReachTopPost] = useState(false);\n // const { nearReachStart } = useScroll({\n // scrollableRef,\n // distanceFromStartPx: 16,\n // });\n\n const initialPageState = useRef(showMedia ? 'media+status' : 'status');\n\n const handleMediaClick = useCallback(\n (e, i, media, status) => {\n e.preventDefault();\n e.stopPropagation();\n setSearchParams({\n media: i + 1,\n mediaStatusID: status.id,\n });\n },\n [id],\n );\n\n const handleStatusLinkClick = useCallback((e, status) => {\n resetScrollPosition(status.id);\n }, []);\n\n useEffect(() => {\n let timer;\n if (mediaStatusID && showMedia) {\n timer = setTimeout(() => {\n const status = scrollableRef.current?.querySelector(\n `.status-link[href*=\"/${mediaStatusID}\"]`,\n );\n if (status) {\n status.scrollIntoView(scrollIntoViewOptions);\n }\n }, 400); // After CSS transition\n }\n return () => {\n clearTimeout(timer);\n };\n }, [mediaStatusID, showMedia]);\n\n const renderStatus = useCallback(\n (status, i) => {\n const {\n id: statusID,\n ancestor,\n isThread,\n descendant,\n thread,\n replies,\n repliesCount,\n weight,\n } = status;\n const isHero = statusID === id;\n // const StatusParent = useCallback(\n // (props) =>\n // isThread || thread || ancestor ? (\n // <Link\n // class=\"status-link\"\n // to={\n // instance ? `/${instance}/s/${statusID}` : `/s/${statusID}`\n // }\n // onClick={() => {\n // resetScrollPosition(statusID);\n // }}\n // {...props}\n // />\n // ) : (\n // <div class=\"status-focus\" tabIndex={0} {...props} />\n // ),\n // [isThread, thread],\n // );\n return (\n <li\n key={statusID}\n ref={isHero ? heroStatusRef : null}\n class={`${ancestor ? 'ancestor' : ''} ${\n descendant ? 'descendant' : ''\n } ${thread ? 'thread' : ''} ${isHero ? 'hero' : ''}`}\n >\n {isHero ? (\n <>\n <InView\n threshold={0.1}\n onChange={(inView) => {\n queueMicrotask(() => {\n requestAnimationFrame(() => {\n setHeroInView(inView);\n });\n });\n }}\n class=\"status-focus\"\n tabIndex={0}\n >\n <Status\n statusID={statusID}\n instance={instance}\n withinContext\n size=\"l\"\n enableTranslate\n forceTranslate={translate}\n />\n </InView>\n {uiState !== 'loading' && !authenticated ? (\n <div class=\"post-status-banner\">\n <p>\n You're not logged in. Interactions (reply, boost, etc) are\n not possible.\n </p>\n <Link to=\"/login\" class=\"button\">\n Log in\n </Link>\n </div>\n ) : (\n !sameInstance && (\n <div class=\"post-status-banner\">\n <p>\n This post is from another instance (<b>{instance}</b>).\n Interactions (reply, boost, etc) are not possible.\n </p>\n <button\n type=\"button\"\n disabled={uiState === 'loading'}\n onClick={() => {\n setUIState('loading');\n (async () => {\n try {\n const results = await currentMasto.v2.search.fetch({\n q: heroStatus.url,\n type: 'statuses',\n resolve: true,\n limit: 1,\n });\n if (results.statuses.length) {\n const status = results.statuses[0];\n location.hash = currentInstance\n ? `/${currentInstance}/s/${status.id}`\n : `/s/${status.id}`;\n } else {\n throw new Error('No results');\n }\n } catch (e) {\n setUIState('default');\n alert('Error: ' + e);\n console.error(e);\n }\n })();\n }}\n >\n <Icon icon=\"transfer\" /> Switch to my instance to enable\n interactions\n </button>\n </div>\n )\n )}\n </>\n ) : (\n // <StatusParent>\n <Link\n class=\"status-link\"\n to={instance ? `/${instance}/s/${statusID}` : `/s/${statusID}`}\n onClick={() => {\n resetScrollPosition(statusID);\n }}\n >\n <InView\n skip={i !== 0 || !ancestor}\n threshold={0.5}\n onChange={(inView) => {\n queueMicrotask(() => {\n requestAnimationFrame(() => {\n setReachTopPost(inView);\n });\n });\n }}\n >\n <Status\n statusID={statusID}\n instance={instance}\n withinContext\n size={thread || ancestor ? 'm' : 's'}\n enableTranslate\n onMediaClick={handleMediaClick}\n onStatusLinkClick={handleStatusLinkClick}\n />\n </InView>\n {ancestor && repliesCount > 1 && (\n <div class=\"replies-link\">\n <Icon icon=\"comment2\" />{' '}\n <span title={repliesCount}>\n {shortenNumber(repliesCount)}\n </span>\n </div>\n )}{' '}\n {/* {replies?.length > LIMIT && (\n <div class=\"replies-link\">\n <Icon icon=\"comment\" />{' '}\n <span title={replies.length}>\n {shortenNumber(replies.length)}\n </span>\n </div>\n )} */}\n {/* </StatusParent> */}\n </Link>\n )}\n {descendant && replies?.length > 0 && (\n <SubComments\n instance={instance}\n replies={replies}\n hasParentThread={thread}\n level={1}\n accWeight={weight}\n openAll={totalDescendants.current < SUBCOMMENTS_OPEN_ALL_LIMIT}\n />\n )}\n {uiState === 'loading' &&\n isHero &&\n !!heroStatus?.repliesCount &&\n !hasDescendants && (\n <div class=\"status-loading\">\n <Loader />\n </div>\n )}\n {uiState === 'error' &&\n isHero &&\n !!heroStatus?.repliesCount &&\n !hasDescendants && (\n <div class=\"status-error\">\n Unable to load replies.\n <br />\n <button\n type=\"button\"\n class=\"plain\"\n onClick={() => {\n states.reloadStatusPage++;\n }}\n >\n Try again\n </button>\n </div>\n )}\n </li>\n );\n },\n [\n id,\n instance,\n uiState,\n authenticated,\n sameInstance,\n translate,\n handleMediaClick,\n handleStatusLinkClick,\n hasDescendants,\n ],\n );\n\n const prevLocationIsStatusPage = useMemo(() => {\n // Navigation API\n if ('navigation' in window && navigation?.entries) {\n const prevEntry = navigation.entries()[navigation.currentEntry.index - 1];\n if (prevEntry?.url) {\n return STATUS_URL_REGEX.test(prevEntry.url);\n }\n }\n return STATUS_URL_REGEX.test(states.prevLocation?.pathname);\n }, [sKey]);\n\n const moreStatusesKeys = useMemo(() => {\n if (!showMore) return [];\n const ids = [];\n function getIDs(status) {\n ids.push(status.id);\n if (status.replies) {\n status.replies.forEach(getIDs);\n }\n }\n statuses.slice(limit).forEach(getIDs);\n return ids.map((id) => statusKey(id, instance));\n }, [showMore, statuses, limit, instance]);\n\n return (\n <div\n tabIndex=\"-1\"\n ref={scrollableRef}\n class={`status-deck deck contained ${\n statuses.length > 1 ? 'padded-bottom' : ''\n } ${\n initialPageState.current === 'status' && !firstLoad.current\n ? 'slide-in'\n : ''\n } ${viewMode ? `deck-view-${viewMode}` : ''}`}\n onAnimationEnd={(e) => {\n // Fix the bounce effect when switching viewMode\n // `slide-in` animation kicks in when switching viewMode\n if (initialPageState.current === 'status') {\n // e.target.classList.remove('slide-in');\n initialPageState.current = null;\n }\n }}\n >\n <header\n class={`${uiState === 'loading' ? 'loading' : ''}`}\n onDblClick={(e) => {\n // reload statuses\n states.reloadStatusPage++;\n }}\n >\n {/* <div>\n <Link class=\"button plain deck-close\" href={closeLink}>\n <Icon icon=\"chevron-left\" size=\"xl\" />\n </Link>\n </div> */}\n <div class=\"header-grid header-grid-2\">\n <h1>\n {prevLocationIsStatusPage && (\n <button\n type=\"button\"\n class=\"plain deck-back\"\n onClick={() => {\n history.back();\n }}\n >\n <Icon icon=\"chevron-left\" size=\"xl\" />\n </button>\n )}\n {!heroInView && heroStatus && uiState !== 'loading' ? (\n <>\n <span class=\"hero-heading\">\n <NameText\n account={heroStatus.account}\n instance={instance}\n showAvatar\n short\n />{' '}\n <span class=\"insignificant\">\n •{' '}\n <RelativeTime\n datetime={heroStatus.createdAt}\n format=\"micro\"\n />\n </span>\n </span>{' '}\n <button\n type=\"button\"\n class=\"ancestors-indicator light small\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n heroStatusRef.current.scrollIntoView({\n behavior: 'smooth',\n block: 'start',\n });\n }}\n title=\"Go to main post\"\n >\n <Icon\n icon={heroPointer === 'down' ? 'arrow-down' : 'arrow-up'}\n />\n </button>\n </>\n ) : (\n <>\n Post{' '}\n <button\n type=\"button\"\n class=\"ancestors-indicator light small\"\n onClick={(e) => {\n // Scroll to top\n e.preventDefault();\n e.stopPropagation();\n scrollableRef.current.scrollTo({\n top: 0,\n behavior: 'smooth',\n });\n }}\n hidden={!ancestors.length || reachTopPost}\n title={`${ancestors.length} posts above ‒ Go to top`}\n >\n <Icon icon=\"arrow-up\" />\n {ancestors\n .filter(\n (a, i, arr) =>\n arr.findIndex((b) => b.accountID === a.accountID) === i,\n )\n .slice(0, 3)\n .map((ancestor) => (\n <Avatar\n key={ancestor.account.id}\n url={ancestor.account.avatar}\n alt={ancestor.account.displayName}\n />\n ))}\n {/* <Icon icon=\"comment\" />{' '} */}\n {ancestors.length > 3 && (\n <>\n {' '}\n <span class=\"insignificant\">\n {shortenNumber(ancestors.length)}\n </span>\n </>\n )}\n </button>\n </>\n )}\n </h1>\n <div class=\"header-side\">\n <button\n type=\"button\"\n class=\"plain4 button-switch-view\"\n style={{\n display: viewMode === 'full' ? '' : 'none',\n }}\n onClick={() => {\n setViewMode(null);\n searchParams.delete('media');\n searchParams.delete('media-only');\n searchParams.delete('view');\n setSearchParams(searchParams);\n }}\n title=\"Switch to Side Peek view\"\n >\n <Icon icon=\"layout4\" size=\"l\" />\n </button>\n <Menu2\n align=\"end\"\n portal={{\n // Need this, else the menu click will cause scroll jump\n target: scrollableRef.current,\n }}\n menuButton={\n <button type=\"button\" class=\"button plain4\">\n <Icon icon=\"more\" alt=\"Actions\" size=\"xl\" />\n </button>\n }\n >\n <MenuItem\n disabled={uiState === 'loading'}\n onClick={() => {\n states.reloadStatusPage++;\n }}\n >\n <Icon icon=\"refresh\" />\n <span>Refresh</span>\n </MenuItem>\n <MenuItem\n className=\"menu-switch-view\"\n onClick={() => {\n setViewMode(viewMode === 'full' ? null : 'full');\n searchParams.delete('media');\n searchParams.delete('media-only');\n if (viewMode === 'full') {\n searchParams.delete('view');\n } else {\n searchParams.set('view', 'full');\n }\n setSearchParams(searchParams);\n }}\n >\n <Icon\n icon={\n {\n '': 'layout5',\n full: 'layout4',\n }[viewMode || '']\n }\n />\n <span>\n Switch to {viewMode === 'full' ? 'Side Peek' : 'Full'} view\n </span>\n </MenuItem>\n <MenuItem\n onClick={() => {\n // Click all buttons with class .spoiler but not .spoiling\n const buttons = Array.from(\n scrollableRef.current.querySelectorAll(\n '.spoiler-button:not(.spoiling), .spoiler-media-button:not(.spoiling)',\n ),\n );\n buttons.forEach((button) => {\n button.click();\n });\n }}\n >\n <Icon icon=\"eye-open\" /> <span>Show all sensitive content</span>\n </MenuItem>\n <MenuDivider />\n <MenuHeader className=\"plain\">Experimental</MenuHeader>\n <MenuItem\n disabled={!postInstance || postSameInstance}\n onClick={() => {\n const statusURL = getInstanceStatusURL(heroStatus.url);\n if (statusURL) {\n location.hash = statusURL;\n } else {\n alert('Unable to switch');\n }\n }}\n >\n <Icon icon=\"transfer\" />\n <small class=\"menu-double-lines\">\n Switch to post's instance\n {postInstance ? (\n <>\n {' '}\n (<b>{postInstance}</b>)\n </>\n ) : (\n ''\n )}\n </small>\n </MenuItem>\n </Menu2>\n <Link class=\"button plain deck-close\" to={closeLink}>\n <Icon icon=\"x\" size=\"xl\" />\n </Link>\n </div>\n </div>\n </header>\n {!!statuses.length && heroStatus ? (\n <ul\n class={`timeline flat contextual grow ${\n uiState === 'loading' ? 'loading' : ''\n }`}\n >\n {statuses.slice(0, limit).map(renderStatus)}\n {showMore > 0 && (\n <li>\n <button\n type=\"button\"\n class=\"plain block show-more\"\n disabled={uiState === 'loading'}\n onClick={() => setLimit((l) => l + LIMIT)}\n style={{ marginBlockEnd: '6em' }}\n data-state-post-ids={moreStatusesKeys.join(' ')}\n >\n <div class=\"ib avatars-bunch\">\n {/* show avatars for first 5 statuses */}\n {statuses.slice(limit, limit + 5).map((status) => (\n <Avatar\n key={status.id}\n url={status.account.avatarStatic}\n // title={`${status.avatar.displayName} (@${status.avatar.acct})`}\n />\n ))}\n </div>{' '}\n <div class=\"ib\">\n Show more…{' '}\n <span class=\"tag\">\n {showMore > LIMIT ? `${LIMIT}+` : showMore}\n </span>\n </div>\n </button>\n </li>\n )}\n </ul>\n ) : (\n <>\n {uiState === 'loading' && (\n <ul class=\"timeline flat contextual grow loading\">\n <li>\n <Status skeleton size=\"l\" />\n </li>\n </ul>\n )}\n {uiState === 'error' && (\n <p class=\"ui-state\">\n Unable to load post\n <br />\n <br />\n <button\n type=\"button\"\n onClick={() => {\n states.reloadStatusPage++;\n }}\n >\n Try again\n </button>\n </p>\n )}\n </>\n )}\n </div>\n );\n}\n\nfunction SubComments({\n replies,\n instance,\n hasParentThread,\n level,\n accWeight,\n openAll,\n}) {\n const [searchParams, setSearchParams] = useSearchParams();\n\n // Total comments count, including sub-replies\n const diveDeep = (replies) => {\n return replies.reduce((acc, reply) => {\n const { repliesCount, replies } = reply;\n const count = replies?.length || repliesCount;\n return acc + count + diveDeep(replies || []);\n }, 0);\n };\n const totalComments = replies.length + diveDeep(replies);\n const sameCount = replies.length === totalComments;\n\n // Get the first 3 accounts, unique by id\n const accounts = replies\n .map((r) => r.account)\n .filter((a, i, arr) => arr.findIndex((b) => b.id === a.id) === i)\n .slice(0, 3);\n\n const totalWeight = useMemo(() => {\n return replies?.reduce((acc, reply) => {\n return acc + reply?.weight;\n }, accWeight);\n }, [accWeight, replies?.length]);\n\n let open = false;\n if (openAll) {\n open = true;\n } else if (totalWeight <= MAX_WEIGHT) {\n open = true;\n } else if (!hasParentThread && totalComments === 1) {\n const shortReply = calcStatusWeight(replies[0]) < 2;\n if (shortReply) open = true;\n }\n const openBefore = cachedRepliesToggle[replies[0].id];\n\n const handleMediaClick = useCallback((e, i, media, status) => {\n e.preventDefault();\n e.stopPropagation();\n setSearchParams({\n media: i + 1,\n mediaStatusID: status.id,\n });\n }, []);\n\n const detailsRef = useRef();\n useLayoutEffect(() => {\n function handleScroll(e) {\n e.target.dataset.scrollLeft = e.target.scrollLeft;\n }\n detailsRef.current?.addEventListener('scroll', handleScroll, {\n passive: true,\n });\n return () => {\n detailsRef.current?.removeEventListener('scroll', handleScroll);\n };\n }, []);\n\n return (\n <details\n ref={detailsRef}\n class=\"replies\"\n open={openBefore || open}\n onToggle={(e) => {\n const { open } = e.target;\n // use first reply as ID\n cachedRepliesToggle[replies[0].id] = open;\n }}\n style={{\n '--comments-level': level,\n }}\n data-comments-level={level}\n data-comments-level-overflow={level > 4}\n >\n <summary class=\"replies-summary\" hidden={open}>\n <span class=\"avatars\">\n {accounts.map((a) => (\n <Avatar\n key={a.id}\n url={a.avatarStatic}\n title={`${a.displayName} @${a.username}`}\n squircle={a?.bot}\n />\n ))}\n </span>\n <b>\n <span title={replies.length}>{shortenNumber(replies.length)}</span>{' '}\n repl\n {replies.length === 1 ? 'y' : 'ies'}\n </b>\n {!sameCount && totalComments > 1 && (\n <>\n {' '}\n ·{' '}\n <span>\n <span title={totalComments}>{shortenNumber(totalComments)}</span>{' '}\n comment\n {totalComments === 1 ? '' : 's'}\n </span>\n </>\n )}\n </summary>\n <ul>\n {replies.map((r) => (\n <li key={r.id}>\n <Link\n class=\"status-link\"\n to={instance ? `/${instance}/s/${r.id}` : `/s/${r.id}`}\n onClick={() => {\n resetScrollPosition(r.id);\n }}\n >\n {/* <div class=\"status-focus\" tabIndex={0}> */}\n <Status\n statusID={r.id}\n instance={instance}\n withinContext\n size=\"s\"\n enableTranslate\n onMediaClick={handleMediaClick}\n />\n {!r.replies?.length && r.repliesCount > 0 && (\n <div class=\"replies-link\">\n <Icon icon=\"comment2\" />{' '}\n <span title={r.repliesCount}>\n {shortenNumber(r.repliesCount)}\n </span>\n </div>\n )}\n {/* </div> */}\n </Link>\n {r.replies?.length && (\n <SubComments\n instance={instance}\n replies={r.replies}\n level={level + 1}\n accWeight={!open ? r.weight : totalWeight}\n openAll={openAll}\n />\n )}\n </li>\n ))}\n </ul>\n </details>\n );\n}\n\nconst MEDIA_VIRTUAL_LENGTH = 140;\nconst POLL_VIRTUAL_LENGTH = 35;\nconst CARD_VIRTUAL_LENGTH = 70;\nconst WEIGHT_SEGMENT = 140;\nconst statusWeightCache = new Map();\nfunction calcStatusWeight(status) {\n const cachedWeight = statusWeightCache.get(status.id);\n if (cachedWeight) return cachedWeight;\n const { spoilerText, content, mediaAttachments, poll, card } = status;\n const length = htmlContentLength(spoilerText + content);\n const mediaLength = mediaAttachments?.length ? MEDIA_VIRTUAL_LENGTH : 0;\n const pollLength = (poll?.options?.length || 0) * POLL_VIRTUAL_LENGTH;\n const cardLength =\n card && (mediaAttachments?.length || poll?.options?.length)\n ? 0\n : CARD_VIRTUAL_LENGTH;\n const totalLength = length + mediaLength + pollLength + cardLength;\n const weight = totalLength / WEIGHT_SEGMENT;\n statusWeightCache.set(status.id, weight);\n return weight;\n}\n\nexport default memo(StatusPage);\n","import { useParams } from 'react-router-dom';\n\nimport Status from './status';\n\nexport default function StatusRoute() {\n const params = useParams();\n const { id, instance } = params;\n return <Status id={id} instance={instance} />;\n}\n","export default \"__VITE_ASSET__W5CngKHO__\"","export default \"__VITE_ASSET__vmqRZ5q5__\"","export default \"__VITE_ASSET__DFAo1Udm__\"","export default \"__VITE_ASSET__D2_o1n6___\"","export default \"__VITE_ASSET__ySLnBMku__\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20xml:space='preserve'%20fill-rule='evenodd'%20stroke-linejoin='round'%20stroke-miterlimit='2'%20clip-rule='evenodd'%20viewBox='0%200%20102%2028'%3e%3cpath%20fill='none'%20d='M0%200h101.5v27.5H0z'/%3e%3cg%20fill-rule='nonzero'%3e%3cpath%20fill='url(%23a)'%20d='M2.32%2021.85c1.4%200%202.21-.85%202.21-2.3v-4.64H8.5c4.45%200%207.54-2.9%207.54-7.24%200-4.35-2.98-7.24-7.32-7.24h-6.4C.93.43.11%201.28.11%202.73v16.82c0%201.45.82%202.3%202.21%202.3Zm2.21-10.4V3.94h3c2.54%200%204%201.34%204%203.75s-1.47%203.76-4%203.76h-3Z'/%3e%3cpath%20fill='url(%23b)'%20d='M20.52%2021.88c1.25%200%202.13-.76%202.13-2.23v-7.04c0-2.07%201.2-3.49%203.21-3.49%201.95%200%202.95%201.23%202.95%203.25v7.28c0%201.47.89%202.23%202.13%202.23%201.26%200%202.14-.76%202.14-2.23v-8.18c0-3.64-1.99-5.9-5.48-5.9-2.38%200-4.1%201.12-4.93%203.1h-.09V2.3c0-1.38-.78-2.2-2.1-2.2-1.31%200-2.1.82-2.1%202.2v17.34c0%201.47.9%202.23%202.14%202.23Z'/%3e%3cpath%20fill='url(%23c)'%20d='M40.45%2021.82c1.96%200%203.93-.98%204.8-2.65h.1v.8c.08%201.27.89%201.91%202.05%201.91%201.21%200%202.08-.73%202.08-2.15v-8.95c0-3.17-2.63-5.25-6.65-5.25-3.26%200-5.78%201.16-6.5%203.04-.15.32-.23.63-.23.96%200%20.97.75%201.64%201.79%201.64.69%200%201.23-.26%201.7-.79.95-1.23%201.74-1.65%203.04-1.65%201.62%200%202.64.85%202.64%202.31v1.04l-3.95.24c-3.93.23-6.13%201.88-6.13%204.74%200%202.83%202.27%204.76%205.26%204.76Zm1.4-3.09c-1.43%200-2.4-.73-2.4-1.9%200-1.12.91-1.83%202.51-1.95l3.31-.2v1.14c0%201.7-1.54%202.91-3.41%202.91Z'/%3e%3cpath%20fill='url(%23d)'%20d='M54.37%2021.88c1.26%200%202.14-.76%202.14-2.23v-7.09c0-2.03%201.21-3.44%203.13-3.44s2.89%201.17%202.89%203.22v7.31c0%201.47.88%202.23%202.14%202.23%201.24%200%202.13-.76%202.13-2.23v-8.2c0-3.68-1.96-5.87-5.45-5.87-2.41%200-4%201.07-4.83%203.01h-.09v-.87c0-1.35-.85-2.17-2.14-2.17-1.28%200-2.06.82-2.06%202.15v11.95c0%201.47.9%202.23%202.14%202.23Z'/%3e%3cpath%20fill='url(%23e)'%20d='M71.65%2027.17c1.26%200%202.14-.76%202.14-2.23v-6h.09a5.15%205.15%200%200%200%204.88%202.88c3.92%200%206.35-3.05%206.35-8.1%200-5.07-2.44-8.1-6.43-8.1a5.12%205.12%200%200%200-4.86%202.99h-.09v-.85c0-1.45-.88-2.21-2.1-2.21-1.24%200-2.11.76-2.11%202.2v17.2c0%201.46.89%202.22%202.13%202.22Zm5.6-8.8c-2.1%200-3.47-1.8-3.47-4.65%200-2.81%201.37-4.67%203.47-4.67%202.14%200%203.49%201.83%203.49%204.67%200%202.86-1.35%204.66-3.5%204.66Z'/%3e%3cpath%20fill='url(%23f)'%20d='M89.61%2027.39c3.44%200%205.26-1.5%206.73-5.55l4.81-13.1a4%204%200%200%200%20.24-1.26c0-1.13-.85-1.93-2.08-1.93-1.1%200-1.71.51-2.07%201.7l-3.4%2010.9h-.08L90.35%207.28c-.36-1.25-.94-1.73-2.07-1.73-1.26%200-2.21.83-2.21%201.99%200%20.35.09.82.25%201.26l5%2013.21-.21.56c-.52%201.1-1.32%201.42-2.07%201.42l-.75-.01c-.96%200-1.56.54-1.56%201.4%200%201.29%201%202%202.88%202Z'/%3e%3c/g%3e%3cdefs%3e%3cradialGradient%20id='a'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='rotate(28.51%20.06%20.22)%20scale(57.6252)'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20offset='0'%20stop-color='%23a4bff7'/%3e%3cstop%20offset='1'%20stop-color='%236081e6'/%3e%3c/radialGradient%3e%3cradialGradient%20id='b'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='rotate(28.51%20.06%20.22)%20scale(57.6252)'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20offset='0'%20stop-color='%23a4bff7'/%3e%3cstop%20offset='1'%20stop-color='%236081e6'/%3e%3c/radialGradient%3e%3cradialGradient%20id='c'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='rotate(28.51%20.06%20.22)%20scale(57.6252)'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20offset='0'%20stop-color='%23a4bff7'/%3e%3cstop%20offset='1'%20stop-color='%236081e6'/%3e%3c/radialGradient%3e%3cradialGradient%20id='d'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='rotate(28.51%20.06%20.22)%20scale(57.6252)'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20offset='0'%20stop-color='%23a4bff7'/%3e%3cstop%20offset='1'%20stop-color='%236081e6'/%3e%3c/radialGradient%3e%3cradialGradient%20id='e'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='rotate(28.51%20.06%20.22)%20scale(57.6252)'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20offset='0'%20stop-color='%23a4bff7'/%3e%3cstop%20offset='1'%20stop-color='%236081e6'/%3e%3c/radialGradient%3e%3cradialGradient%20id='f'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='rotate(28.51%20.06%20.22)%20scale(57.6252)'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20offset='0'%20stop-color='%23a4bff7'/%3e%3cstop%20offset='1'%20stop-color='%236081e6'/%3e%3c/radialGradient%3e%3c/defs%3e%3c/svg%3e\"","import './welcome.css';\n\nimport boostsCarouselUrl from '../assets/features/boosts-carousel.jpg';\nimport groupedNotificationsUrl from '../assets/features/grouped-notifications.jpg';\nimport multiColumnUrl from '../assets/features/multi-column.jpg';\nimport multiHashtagTimelineUrl from '../assets/features/multi-hashtag-timeline.jpg';\nimport nestedCommentsThreadUrl from '../assets/features/nested-comments-thread.jpg';\nimport logoText from '../assets/logo-text.svg';\nimport logo from '../assets/logo.svg';\n\nimport Link from '../components/link';\nimport states from '../utils/states';\nimport useTitle from '../utils/useTitle';\n\nconst {\n PHANPY_DEFAULT_INSTANCE: DEFAULT_INSTANCE,\n PHANPY_WEBSITE: WEBSITE,\n PHANPY_PRIVACY_POLICY_URL: PRIVACY_POLICY_URL,\n PHANPY_DEFAULT_INSTANCE_REGISTRATION_URL: DEFAULT_INSTANCE_REGISTRATION_URL,\n} = import.meta.env;\nconst appSite = WEBSITE\n ? WEBSITE.replace(/https?:\\/\\//g, '').replace(/\\/$/, '')\n : null;\nconst appVersion = __BUILD_TIME__\n ? `${__BUILD_TIME__.slice(0, 10).replace(/-/g, '.')}${\n __COMMIT_HASH__ ? `.${__COMMIT_HASH__}` : ''\n }`\n : null;\n\nfunction Welcome() {\n useTitle(null, ['/', '/welcome']);\n return (\n <main id=\"welcome\">\n <div class=\"hero-container\">\n <div class=\"hero-content\">\n <h1>\n <img\n src={logo}\n alt=\"\"\n width=\"160\"\n height=\"160\"\n style={{\n aspectRatio: '1/1',\n marginBlockEnd: -16,\n }}\n />\n <img src={logoText} alt=\"Phanpy\" width=\"200\" />\n </h1>\n <p class=\"desc\">A minimalistic opinionated Mastodon web client.</p>\n <p>\n <Link\n to={\n DEFAULT_INSTANCE\n ? `/login?instance=${DEFAULT_INSTANCE}&submit=1`\n : '/login'\n }\n class=\"button\"\n >\n {DEFAULT_INSTANCE ? 'Log in' : 'Log in with Mastodon'}\n </Link>\n </p>\n {DEFAULT_INSTANCE && DEFAULT_INSTANCE_REGISTRATION_URL && (\n <p>\n <a href={DEFAULT_INSTANCE_REGISTRATION_URL} class=\"button plain5\">\n Sign up\n </a>\n </p>\n )}\n {!DEFAULT_INSTANCE && (\n <p class=\"insignificant\">\n <small>\n Connect your existing Mastodon/Fediverse account.\n <br />\n Your credentials are not stored on this server.\n </small>\n </p>\n )}\n </div>\n {(appSite || appVersion) && (\n <p class=\"app-site-version\">\n <small>\n {appSite} {appVersion}\n </small>\n </p>\n )}\n <p>\n <a href=\"https://github.com/cheeaun/phanpy\" target=\"_blank\">\n Built\n </a>{' '}\n by{' '}\n <a\n href=\"https://mastodon.social/@cheeaun\"\n target=\"_blank\"\n onClick={(e) => {\n e.preventDefault();\n states.showAccount = 'cheeaun@mastodon.social';\n }}\n >\n @cheeaun\n </a>\n .{' '}\n <a href={PRIVACY_POLICY_URL} target=\"_blank\">\n Privacy Policy\n </a>\n .\n </p>\n </div>\n <div id=\"why-container\">\n <div class=\"sections\">\n <section>\n <img\n src={boostsCarouselUrl}\n alt=\"Screenshot of Boosts Carousel\"\n loading=\"lazy\"\n />\n <h4>Boosts Carousel</h4>\n <p>\n Visually separate original posts and re-shared posts (boosted\n posts).\n </p>\n </section>\n <section>\n <img\n src={nestedCommentsThreadUrl}\n alt=\"Screenshot of nested comments thread\"\n loading=\"lazy\"\n />\n <h4>Nested comments thread</h4>\n <p>Effortlessly follow conversations. Semi-collapsible replies.</p>\n </section>\n <section>\n <img\n src={groupedNotificationsUrl}\n alt=\"Screenshot of grouped notifications\"\n loading=\"lazy\"\n />\n <h4>Grouped notifications</h4>\n <p>\n Similar notifications are grouped and collapsed to reduce clutter.\n </p>\n </section>\n <section>\n <img\n src={multiColumnUrl}\n alt=\"Screenshot of multi-column UI\"\n loading=\"lazy\"\n />\n <h4>Single or multi-column</h4>\n <p>\n By default, single column for zen-mode seekers. Configurable\n multi-column for power users.\n </p>\n </section>\n <section>\n <img\n src={multiHashtagTimelineUrl}\n alt=\"Screenshot of multi-hashtag timeline with a form to add more hashtags\"\n loading=\"lazy\"\n />\n <h4>Multi-hashtag timeline</h4>\n <p>Up to 5 hashtags combined into a single timeline.</p>\n </section>\n </div>\n </div>\n </main>\n );\n}\n\nexport default Welcome;\n","// Replace alert() with toastify-js\nimport Toastify from 'toastify-js';\n\nconst nativeAlert = window.alert;\nif (!window.__nativeAlert) window.__nativeAlert = nativeAlert;\n\nwindow.alert = function (message) {\n console.debug(\n 'ALERT: This is a custom alert() function. Native alert() is still available as window.__nativeAlert()',\n );\n // If Error object, show the message\n if (message instanceof Error && message?.message) {\n message = message.message;\n }\n // If not string, stringify it\n if (typeof message !== 'string') {\n message = JSON.stringify(message);\n }\n\n const toast = Toastify({\n text: message,\n className: 'alert',\n gravity: 'top',\n position: 'center',\n duration: 10_000,\n offset: {\n y: 48,\n },\n onClick: () => {\n toast.hideToast();\n },\n });\n toast.showToast();\n};\n","import './app.css';\n\nimport debounce from 'just-debounce-it';\nimport {\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'preact/hooks';\nimport { matchPath, Route, Routes, useLocation } from 'react-router-dom';\nimport 'swiped-events';\nimport { subscribe } from 'valtio';\n\nimport BackgroundService from './components/background-service';\nimport ComposeButton from './components/compose-button';\nimport { ICONS } from './components/icon';\nimport KeyboardShortcutsHelp from './components/keyboard-shortcuts-help';\nimport Loader from './components/loader';\nimport Modals from './components/modals';\nimport NotificationService from './components/notification-service';\nimport SearchCommand from './components/search-command';\nimport Shortcuts from './components/shortcuts';\nimport NotFound from './pages/404';\nimport AccountStatuses from './pages/account-statuses';\nimport Bookmarks from './pages/bookmarks';\nimport Favourites from './pages/favourites';\nimport FollowedHashtags from './pages/followed-hashtags';\nimport Following from './pages/following';\nimport Hashtag from './pages/hashtag';\nimport Home from './pages/home';\nimport HttpRoute from './pages/http-route';\nimport List from './pages/list';\nimport Lists from './pages/lists';\nimport Login from './pages/login';\nimport Mentions from './pages/mentions';\nimport Notifications from './pages/notifications';\nimport Public from './pages/public';\nimport Search from './pages/search';\nimport StatusRoute from './pages/status-route';\nimport Trending from './pages/trending';\nimport Welcome from './pages/welcome';\nimport {\n api,\n initAccount,\n initClient,\n initInstance,\n initPreferences,\n} from './utils/api';\nimport { getAccessToken } from './utils/auth';\nimport focusDeck from './utils/focus-deck';\nimport states, { initStates, statusKey } from './utils/states';\nimport store from './utils/store';\nimport { getCurrentAccount } from './utils/store-utils';\nimport './utils/toast-alert';\n\nwindow.__STATES__ = states;\nwindow.__STATES_STATS__ = () => {\n const keys = [\n 'statuses',\n 'accounts',\n 'spoilers',\n 'unfurledLinks',\n 'statusQuotes',\n ];\n const counts = {};\n keys.forEach((key) => {\n counts[key] = Object.keys(states[key]).length;\n });\n console.warn('STATE stats', counts);\n\n const { statuses } = states;\n const unmountedPosts = [];\n for (const key in statuses) {\n const $post = document.querySelector(\n `[data-state-post-id~=\"${key}\"], [data-state-post-ids~=\"${key}\"]`,\n );\n if (!$post) {\n unmountedPosts.push(key);\n }\n }\n console.warn('Unmounted posts', unmountedPosts.length, unmountedPosts);\n};\n\n// Experimental \"garbage collection\" for states\n// Every 15 minutes\n// Only posts for now\nsetInterval(() => {\n if (!window.__IDLE__) return;\n const { statuses, unfurledLinks, notifications } = states;\n let keysCount = 0;\n const { instance } = api();\n for (const key in statuses) {\n if (!window.__IDLE__) break;\n try {\n const $post = document.querySelector(\n `[data-state-post-id~=\"${key}\"], [data-state-post-ids~=\"${key}\"]`,\n );\n const postInNotifications = notifications.some(\n (n) => key === statusKey(n.status?.id, instance),\n );\n if (!$post && !postInNotifications) {\n delete states.statuses[key];\n delete states.statusQuotes[key];\n for (const link in unfurledLinks) {\n const unfurled = unfurledLinks[link];\n const sKey = statusKey(unfurled.id, unfurled.instance);\n if (sKey === key) {\n delete states.unfurledLinks[link];\n break;\n }\n }\n keysCount++;\n }\n } catch (e) {}\n }\n if (keysCount) {\n console.info(`GC: Removed ${keysCount} keys`);\n }\n}, 15 * 60 * 1000);\n\n// Preload icons\n// There's probably a better way to do this\n// Related: https://github.com/vitejs/vite/issues/10600\nsetTimeout(() => {\n for (const icon in ICONS) {\n queueMicrotask(() => {\n if (Array.isArray(ICONS[icon])) {\n ICONS[icon][0]?.();\n } else {\n ICONS[icon]?.();\n }\n });\n }\n}, 5000);\n\n(() => {\n window.__IDLE__ = true;\n const nonIdleEvents = [\n 'mousemove',\n 'mousedown',\n 'resize',\n 'keydown',\n 'touchstart',\n 'pointerdown',\n 'pointermove',\n 'wheel',\n ];\n const setIdle = () => {\n window.__IDLE__ = true;\n };\n const IDLE_TIME = 3_000; // 3 seconds\n const debouncedSetIdle = debounce(setIdle, IDLE_TIME);\n const onNonIdle = () => {\n window.__IDLE__ = false;\n debouncedSetIdle();\n };\n nonIdleEvents.forEach((event) => {\n window.addEventListener(event, onNonIdle, {\n passive: true,\n capture: true,\n });\n });\n window.addEventListener('blur', setIdle, {\n passive: true,\n });\n // When cursor leaves the window, set idle\n document.documentElement.addEventListener(\n 'mouseleave',\n (e) => {\n if (!e.relatedTarget && !e.toElement) {\n setIdle();\n }\n },\n {\n passive: true,\n },\n );\n // document.addEventListener(\n // 'visibilitychange',\n // () => {\n // if (document.visibilityState === 'visible') {\n // onNonIdle();\n // }\n // },\n // {\n // passive: true,\n // },\n // );\n})();\n\n// Possible fix for iOS PWA theme-color bug\n// It changes when loading web pages in \"webview\"\nconst isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent);\nif (isIOS) {\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'visible') {\n const theme = store.local.get('theme');\n let $meta;\n if (theme) {\n // Get current meta\n $meta = document.querySelector(\n `meta[name=\"theme-color\"][data-theme-setting=\"manual\"]`,\n );\n if ($meta) {\n const color = $meta.content;\n const tempColor =\n theme === 'light'\n ? $meta.dataset.themeLightColorTemp\n : $meta.dataset.themeDarkColorTemp;\n $meta.content = tempColor || '';\n setTimeout(() => {\n $meta.content = color;\n }, 10);\n }\n } else {\n // Get current color scheme\n const colorScheme = window.matchMedia('(prefers-color-scheme: dark)')\n .matches\n ? 'dark'\n : 'light';\n // Get current theme-color\n $meta = document.querySelector(\n `meta[name=\"theme-color\"][media*=\"${colorScheme}\"]`,\n );\n if ($meta) {\n const color = $meta.dataset.content;\n const tempColor = $meta.dataset.contentTemp;\n $meta.content = tempColor || '';\n setTimeout(() => {\n $meta.content = color;\n }, 10);\n }\n }\n }\n });\n}\n\n{\n const theme = store.local.get('theme');\n // If there's a theme, it's NOT auto\n if (theme) {\n // dark | light\n document.documentElement.classList.add(`is-${theme}`);\n document\n .querySelector('meta[name=\"color-scheme\"]')\n .setAttribute('content', theme || 'dark light');\n\n // Enable manual theme <meta>\n const $manualMeta = document.querySelector(\n 'meta[data-theme-setting=\"manual\"]',\n );\n if ($manualMeta) {\n $manualMeta.name = 'theme-color';\n $manualMeta.content =\n theme === 'light'\n ? $manualMeta.dataset.themeLightColor\n : $manualMeta.dataset.themeDarkColor;\n }\n // Disable auto theme <meta>s\n const $autoMetas = document.querySelectorAll(\n 'meta[data-theme-setting=\"auto\"]',\n );\n $autoMetas.forEach((m) => {\n m.name = '';\n });\n }\n const textSize = store.local.get('textSize');\n if (textSize) {\n document.documentElement.style.setProperty('--text-size', `${textSize}px`);\n }\n}\n\nsubscribe(states, (changes) => {\n for (const [action, path, value, prevValue] of changes) {\n // Change #app dataset based on settings.shortcutsViewMode\n if (path.join('.') === 'settings.shortcutsViewMode') {\n const $app = document.getElementById('app');\n if ($app) {\n $app.dataset.shortcutsViewMode = states.shortcuts?.length ? value : '';\n }\n }\n\n // Add/Remove cloak class to body\n if (path.join('.') === 'settings.cloakMode') {\n const $body = document.body;\n $body.classList.toggle('cloak', value);\n }\n }\n});\n\nfunction App() {\n const [isLoggedIn, setIsLoggedIn] = useState(false);\n const [uiState, setUIState] = useState('loading');\n\n useEffect(() => {\n const instanceURL = store.local.get('instanceURL');\n const code = decodeURIComponent(\n (window.location.search.match(/code=([^&]+)/) || [, ''])[1],\n );\n\n if (code) {\n console.log({ code });\n // Clear the code from the URL\n window.history.replaceState(\n {},\n document.title,\n window.location.pathname || '/',\n );\n\n const clientID = store.session.get('clientID');\n const clientSecret = store.session.get('clientSecret');\n const vapidKey = store.session.get('vapidKey');\n\n (async () => {\n setUIState('loading');\n const { access_token: accessToken } = await getAccessToken({\n instanceURL,\n client_id: clientID,\n client_secret: clientSecret,\n code,\n });\n\n const client = initClient({ instance: instanceURL, accessToken });\n await Promise.allSettled([\n initInstance(client, instanceURL),\n initAccount(client, instanceURL, accessToken, vapidKey),\n ]);\n initStates();\n initPreferences(client);\n\n setIsLoggedIn(true);\n setUIState('default');\n })();\n } else {\n window.__IGNORE_GET_ACCOUNT_ERROR__ = true;\n const account = getCurrentAccount();\n if (account) {\n store.session.set('currentAccount', account.info.id);\n const { client } = api({ account });\n const { instance } = client;\n // console.log('masto', masto);\n initStates();\n initPreferences(client);\n setUIState('loading');\n (async () => {\n try {\n await initInstance(client, instance);\n } catch (e) {\n } finally {\n setIsLoggedIn(true);\n setUIState('default');\n }\n })();\n } else {\n setUIState('default');\n }\n }\n }, []);\n\n let location = useLocation();\n states.currentLocation = location.pathname;\n // useLayoutEffect(() => {\n // states.currentLocation = location.pathname;\n // }, [location.pathname]);\n\n useEffect(focusDeck, [location, isLoggedIn]);\n\n if (/\\/https?:/.test(location.pathname)) {\n return <HttpRoute />;\n }\n\n return (\n <>\n <PrimaryRoutes isLoggedIn={isLoggedIn} loading={uiState === 'loading'} />\n <SecondaryRoutes isLoggedIn={isLoggedIn} />\n {uiState === 'default' && (\n <Routes>\n <Route path=\"/:instance?/s/:id\" element={<StatusRoute />} />\n </Routes>\n )}\n {isLoggedIn && <ComposeButton />}\n {isLoggedIn && <Shortcuts />}\n <Modals />\n {isLoggedIn && <NotificationService />}\n <BackgroundService isLoggedIn={isLoggedIn} />\n {uiState !== 'loading' && <SearchCommand onClose={focusDeck} />}\n <KeyboardShortcutsHelp />\n </>\n );\n}\n\nfunction PrimaryRoutes({ isLoggedIn, loading }) {\n const location = useLocation();\n const nonRootLocation = useMemo(() => {\n const { pathname } = location;\n return !/^\\/(login|welcome)/.test(pathname);\n }, [location]);\n\n return (\n <Routes location={nonRootLocation || location}>\n <Route\n path=\"/\"\n element={\n isLoggedIn ? (\n <Home />\n ) : loading ? (\n <Loader id=\"loader-root\" />\n ) : (\n <Welcome />\n )\n }\n />\n <Route path=\"/login\" element={<Login />} />\n <Route path=\"/welcome\" element={<Welcome />} />\n </Routes>\n );\n}\n\nfunction getPrevLocation() {\n return states.prevLocation || null;\n}\nfunction SecondaryRoutes({ isLoggedIn }) {\n // const snapStates = useSnapshot(states);\n const location = useLocation();\n // const prevLocation = snapStates.prevLocation;\n const backgroundLocation = useRef(getPrevLocation());\n\n const isModalPage = useMemo(() => {\n return (\n matchPath('/:instance/s/:id', location.pathname) ||\n matchPath('/s/:id', location.pathname)\n );\n }, [location.pathname, matchPath]);\n if (isModalPage) {\n if (!backgroundLocation.current)\n backgroundLocation.current = getPrevLocation();\n } else {\n backgroundLocation.current = null;\n }\n console.debug({\n backgroundLocation: backgroundLocation.current,\n location,\n });\n\n return (\n <Routes location={backgroundLocation.current || location}>\n {isLoggedIn && (\n <>\n <Route path=\"/notifications\" element={<Notifications />} />\n <Route path=\"/mentions\" element={<Mentions />} />\n <Route path=\"/following\" element={<Following />} />\n <Route path=\"/b\" element={<Bookmarks />} />\n <Route path=\"/f\" element={<Favourites />} />\n <Route path=\"/l\">\n <Route index element={<Lists />} />\n <Route path=\":id\" element={<List />} />\n </Route>\n <Route path=\"/ft\" element={<FollowedHashtags />} />\n </>\n )}\n <Route path=\"/:instance?/t/:hashtag\" element={<Hashtag />} />\n <Route path=\"/:instance?/a/:id\" element={<AccountStatuses />} />\n <Route path=\"/:instance?/p\">\n <Route index element={<Public />} />\n <Route path=\"l\" element={<Public local />} />\n </Route>\n <Route path=\"/:instance?/trending\" element={<Trending />} />\n <Route path=\"/:instance?/search\" element={<Search />} />\n {/* <Route path=\"/:anything\" element={<NotFound />} /> */}\n </Routes>\n );\n}\n\nexport { App };\n","import './index.css';\n\nimport './cloak-mode.css';\n\nimport { render } from 'preact';\nimport { HashRouter } from 'react-router-dom';\n\nimport { App } from './app';\n\nif (import.meta.env.DEV) {\n import('preact/debug');\n}\n\n// AbortSignal.timeout polyfill\n// Temporary fix from https://github.com/mo/abortcontroller-polyfill/issues/73#issuecomment-1541180943\n// Incorrect implementation, but should be good enough for now\nif ('AbortSignal' in window) {\n AbortSignal.timeout =\n AbortSignal.timeout ||\n ((duration) => {\n const controller = new AbortController();\n setTimeout(() => controller.abort(), duration);\n return controller.signal;\n });\n}\n\nrender(\n <HashRouter>\n <App />\n </HashRouter>,\n document.getElementById('app'),\n);\n\n// Storage cleanup\nsetTimeout(() => {\n try {\n // Clean up iconify localStorage\n Object.keys(localStorage).forEach((key) => {\n if (key.startsWith('iconify')) {\n localStorage.removeItem(key);\n }\n });\n Object.keys(sessionStorage).forEach((key) => {\n if (key.startsWith('iconify')) {\n sessionStorage.removeItem(key);\n }\n });\n\n // Clean up old settings key\n localStorage.removeItem('settings:boostsCarousel');\n } catch (e) {}\n}, 5000);\n\nwindow.__CLOAK__ = () => {\n document.body.classList.toggle('cloak');\n};\n"],"names":["usePageVisibility","fn","deps","savedCallback","useRef","useEffect","current","handleVisibilityChange","hidden","document","visibilityState","console","STREAMING_TIMEOUT","POLL_INTERVAL","BackgroundService","memo","isLoggedIn","visible","setVisible","useState","checkLatestNotification","masto","instance","skipCheckMarkers","states","notificationsLast","notificationsIterator","v1","notifications","list","limit","sinceId","id","value","next","length","notificationsShowNew","lastReadId","markers","fetch","timeline","sub","pollNotifications","streaming","api","hasStreaming","setTimeout","user","notification","subscribe","log","entry","_a","checkForUpdates","clearTimeout","clearInterval","r","info","visible2","lastCheckDate","useHotkeys","currentCloakMode","Date","diff","ComposeButton","handleButton","e","shiftKey","openCompose","showCompose","ignoreEventWhen","querySelector","_jsx","type","onClick","children","Icon","icon","size","alt","KeyboardShortcutsHelp","snapStates","useSnapshot","onClose","showKeyboardShortcutsHelp","hasModal","Modal","class","tabindex","action","keys","_jsxs","_Fragment","className","map","Accounts","accounts","store","local","getJSON","currentAccount","session","get","moreThanOneAccount","_","reload","useReducer","x","accountsListParent","useAutoAnimate","tabIndex","ref","account","i","isCurrent","isDefault","Avatar","url","avatarStatic","onDblClick","$select","NameText","test","showAcct","set","Menu2","align","menuButton","title","MenuItem","MenuDivider","disabled","splice","MenuConfirm","subMenu","confirmLabel","menuItemClassName","href","Link","to","logo","createBackendPushSubscription","subscription","push","create","fetchBackendPushSubscription","updateBackendPushSubscription","update","removeBackendPushSubscription","remove","isPushSupported","navigator","window","getRegistration","serviceWorker","getSubscription","registration","pushManager","undefined","urlBase64ToUint8Array","base64String","padding","repeat","base64","replace","rawData","atob","outputArray","Uint8Array","charCodeAt","initSubscription","backendSubscription","err","message","sameEndpoint","vapidKey","sameKey","getCurrentAccount","applicationServerKey","vapidKeyStr","applicationServerKeyStr","updateSubscription","data","policy","removeSubscription","userVisibleOnly","define_import_meta_env_default","focusDeck","timer","columns","getElementById","modals","querySelectorAll","modal","modalFocusElement","focus","backDrop","pages","page","useLocationChange","location","useLocation","currentLocationRef","pathname","ListAddEdit","uiState","setUIState","editMode","nameFieldRef","repliesPolicyFieldRef","exclusiveFieldRef","repliesPolicy","checked","exclusive","supportsExclusive","supports","onSubmit","preventDefault","formData","FormData","target","listResult","replies_policy","alert","MUTE_DURATIONS","MUTE_DURATIONS_LABELS","LIMIT","ACCOUNT_INFO_MAX_AGE","fetchFamiliarFollowers","currentID","familiarFollowers","memFetchFamiliarFollowers","pmem","maxAge","fetchPostingStats","accountID","fetchStatuses","statuses","total","originals","replies","status","stats","boosts","memFetchPostingStats","fetchAccount","standalone","authenticated","currentMasto","currentInstance","isString","useMemo","setInfo","sameCurrentInstance","info2","acct","avatar","bot","createdAt","displayName","emojis","fields","group","lastStatusAt","locked","note","statusesCount","username","memorial","moved","roles","header","headerStatic","headerIsAvatar","isSelf","infoHasEssentials","account2","updated","forEach","headerCornerColors","setHeaderCornerColors","followersIterator","domain","fetchFollowers","firstLoad","familiarFollowersCache","results","familiarFollowers2","newValue","familiar","followingIterator","LinkOrDiv","accountLink","postingStats","setPostingStats","renderFamiliarFollowers","setFamiliarFollowers","postingStatsUIState","setPostingStatsUIState","hasPostingStats","followers","renderPostingStats","onRelationshipChange","AccountBlock","src","canvas","add","pixelDimension","createElement","ctx","g","b","width","height","drawImage","colors","getImageData","a","dataLength","color","lightenRGB","rgbColors","avatarSize","external","role","accountInstance","handleContentLinks","enhanceContent","verifiedAt","__html","EmojiText","name","follower","heading","fetchAccounts","excludeRelationshipAttrs","shortenNumber","followersCount","fetchFollowing","followingCount","niceDateTime","FAMILIAR_FOLLOWERS_LIMIT","currentAuthenticated","relationship","privateNote","following","showingReblogs","notifying","followedBy","blocking","blockedBy","muting","mutingNotifications","requested","domainBlocking","endorsed","currentInfo","setIsSelf","q","fetchRelationships","relationships","setRelationshipUIState","relationship2","updateAccount","setRelationship","loading","relationshipUIState","showTranslatedBio","setShowPrivateNoteModal","showAddRemoveLists","showPrivateNoteModal","dir","setShowTranslatedBio","setShowAddRemoveLists","showToast","clipboard","share","newRelationship","openTrigger","duration","label","counter","Loader","confirm","AddRemoveListsSheet","PrivateNoteSheet","luminence","alpha","urlObj","host","path","TranslatedBioSheet","fieldsText","Math","getHTMLText","text","lists","setLists","listsContainingAccount","setListsContainingAccount","c","style","listsContainingAccount2","lists2","reloadCount","showListAddEditModal","setShowListAddEditModal","sort","l","inList","accountIds","result","abrupt","textareaRef","initialNote","e2","trim","AccountSheet","propInstance","AccountInfo","lookup","skip_webfinger","v2","search","resolve","URL","Drafts","drafts","setDrafts","db","ns","getCurrentAccountNS","ownKeys","filter","key","startsWith","getMany","updatedAt","getTime","hasDrafts","draft","draftStatus","replyTo","updatedAtDate","replyToStatus","MiniDraft","poll","spoilerText","mediaAttachments","hasPoll","options","hasMedia","firstImageMedia","media","image","file","objectURL","createObjectURL","hasPollOrMedia","relationshipsMap","uniqueAccountIds","reduce","acc","includes","GenericAccounts","isCurrentInstance","setAccounts","showMore","setShowMore","showGenericAccounts","staticAccounts","showReactions","setRelationshipsMap","loadRelationships","loadAccounts","done","Array","isArray","theAccount","find","j","_types","prev","newAccounts","reloadGenericAccounts","_b","reblog","favourite","showStats","InView","MediaAltModal","lang","forceTranslate","setForceTranslate","targetLanguage","getTranslateTargetLanguage","contentTranslationHideLanguages","settings","differentLanguage","localeMatch","supportsTTS","speak","whiteSpace","textWrap","TranslationBlock","sourceLanguage","clamp","min","max","gammaToLinear","pow","linearToGamma","rgb2oklab","m","s","cbrt","oklab2rgb","L","round","floatingButtonUrl","multiColumnUrl$1","tabMenuBarUrl","MAX_FETCH","fetchFollowedTags","iterator","followedTags","tags","fetchCount","localeCompare","MAX_AGE","getFollowedTags","fauxDiv","extractTagsFromStatus","content","hashtagLinks","AsyncText","setText","Promise","then","SHORTCUTS_LIMIT","TYPES","TYPE_TEXT","public","bookmarks","favourites","hashtag","trending","mentions","TYPE_PARAMS","placeholder","notRequired","pattern","fetchListTitle","fetchAccountTitle","SHORTCUTS_META","index","subtitle","query","encodeURIComponent","excludeViewMode","split","join","ShortcutsSettings","shortcuts","showForm","setShowForm","showImportExport","setShowImportExport","shortcutsListParent","fontSize","opacity","textTransform","imgURL","multiColumnUrl","shortcutsViewMode","onChange","Boolean","shortcut","Object","values","excludedViewMode","shortcutsArr","from","temp","shortcutIndex","display","justifyContent","alignItems","currentTarget","ShortcutForm","mode","ImportExport","FETCH_MAX_AGE","fetchLists","FORM_NOTES","setFollowedHashtags","currentType","form","formRef","input","setCurrentType","required","defaultValue","switch","autocorrect","followedHashtags","tag","shortcutsStr","compressToEncodedURIComponent","importUIState","setImportUIState","parsedImportShortcutStr","importShortcutStr","parsed","parse","hasCurrentSettings","onInput","nonUniqueShortcuts","every","exceededLimit","newShortcuts","changes","prevValue","Modals","navigate","useNavigate","Compose","__COMPOSE__","editStatus","newStatus","reloadStatusPage","post","reply","edit","delay","toast","hideToast","prevLocation","showSettings","Settings","showAccounts","showAccount","destination","showDrafts","showMediaModal","classList","contains","MediaModal","statusID","showShortcutsSettings","showMediaAlt","FollowRequestButtons","requestState","setRequestState","hasRelationship","rel","followRequests","authorize","Error","NOTIFICATION_ICONS","mention","follow","follow_request","contentText","count","reblog_reply","favourite_reply","targetAccount","AVATARS_LIMIT","Notification","isStatic","disableContextMenu","report","_accounts","_statuses","actualStatus","actualStatusID","isVoted","voted","isReplyToOthers","inReplyToAccountId","favsCount","reblogsCount","showAvatar","formattedCreatedAt","toLocaleString","genericAccountsHeading","handleOpenGenericAccounts","debug","RelativeTime","datetime","format","Fragment","type2","status2","Status","TruncatedLink","onContextMenu","dispatchEvent","clientX","clientY","props","useTruncated","event","accessToken","NotificationService","routeNotification","useLayoutEffect","sameInstance","notificationAccount","hasAccount","hash","warn","id2","setShowNotificationSheet","showNotificationSheet","tagName","instanceURL","SearchForm","forwardRef","searchParams","setSearchParams","useSearchParams","searchMenuOpen","setSearchMenuOpen","setQuery","searchFieldRef","useImperativeHandle","setValue","select","blur","params","autocomplete","autocapitalize","onSearch","onFocus","onBlur","onKeyDown","focusItem","nextItem","nextElementSibling","parentElement","el","firstItem","prevItem","previousElementSibling","lastItem","click","top","SearchCommand","showSearch","setShowSearch","searchFormRef","isSearchPage","closeSearch","enabled","enableOnFormTags","Shortcuts","shortcutsColumnsMode","menuRef","formattedShortcuts","pin","handler","parseInt","closeMenu","updatesButton","instanceRef","overflow","viewScroll","menuClassName","gap","position","MenuLink","groupBoosts","newValues","boostStash","serialBoosts","item","boostStashID","items","half","floor","slice","dedupeBoosts","boostedStatusIDs","filteredItems","statusKey","boosterID","statusKey2","groupContext","contexts","contextIndex","t","repliedItem","self","context","inReplyToId","firstItemAccountID","newItems","appliedContextIndices","contextItems","aDate","bDate","i2","assignFollowedTags","statusFollowedTags","statusWithFollowedTags","sKey","extractedTags","itemFollowedTags","clearFollowedTagsState","useScroll","scrollableRef","distanceFromStart","distanceFromEnd","scrollThresholdStart","scrollThresholdEnd","direction","distanceFromStartPx","_distanceFromStartPx","distanceFromEndPx","_distanceFromEndPx","scrollDirection","setScrollDirection","reachStart","setReachStart","reachEnd","setReachEnd","nearReachStart","setNearReachStart","nearReachEnd","setNearReachEnd","isVertical","scrollableElement","previousScrollStart","scrollTop","scrollLeft","onScroll","scrollHeight","scrollWidth","clientHeight","clientWidth","scrollStart","scrollDimension","clientDimension","scrollDistance","abs","addEventListener","passive","removeEventListener","init","Event","useScrollFn","callback","useThrottledCallback","queueMicrotask","MediaPost","parent","onMediaClick","accountId","accountURL","accountEmojis","repliesCount","reblogged","favourited","favouritesCount","bookmarked","muted","sensitive","visibility","language","editedAt","filtered","card","uri","_deleted","_pinned","debugHover","filterContext","useContext","FilterContext","isFiltered","filterInfo","hasSpoiler","readingExpandMedia","prefs","filterTitleStr","titlesStr","showSpoilerMedia","Media","NavMenu","setCurrentAccount","setMoreThanOneAccount","showFollowing","bindLongPress","useLongPress","threshold","detect","cancelOnMovement","buttonRef","menuState","setMenuState","boundingBoxPadding","safeBoundingBoxPadding","mutesIterator","fetchMutes","mutes","blocksIterator","fetchBlocks","blocks","open","state","squircle","ControlledMenu","anchorRef","containerProps","zIndex","portal","body","unmountOnClose","appVersion","commitHash","__COMMIT_HASH__","scrollIntoViewOptions","block","inline","behavior","Timeline","titleComponent","emptyText","errorText","useItemID","boostsCarousel","fetchItems","checkForUpdatesInterval","headerStart","headerEnd","timelineStart","refresh","view","showFollowedTags","setItems","showNew","setShowNew","allowGrouping","loadItems","useDebouncedCallback","otherPosts","pinnedPosts","items2","itemsSelector","jRef","activeItem","activeItemRect","closest","getBoundingClientRect","allItems","activeItemIndex","indexOf","itemRect","topmostItem","kRef","findLast","oRef","nearReachStart2","headerRef","hiddenUI","prevView","useCallback","disableIdleCheck","loadOrCheckUpdates","inBackground","noPointers","__IDLE__","timeDiff","hasUpdate","useInterval","lastHiddenTime","node","TimelineItem","inView","aFiltered","bFiltered","isCarousel","fItems","StatusCarousel","statusID2","reblog2","actualStatusID2","url2","_pinned2","manyItems","_differentAuthor","isMiddle","isSpoiler","showCompact","isStart","isEnd","itemKey","enableCommentHint","setRender","startButtonRef","render","carouselRef","left","endButtonRef","statusPeekText","statusPeek","statusThreadNumber","MIN_YEAR","MIN_YEAR_MONTH","supportsInputMonth","setAttribute","_isSearchEnabled","isSearchEnabled","AccountStatuses","useParams","month","excludeReplies","excludeBoosts","tagged","accountStatusesIterator","allSearchParams","setAccount","searchOffsetRef","searchEnabled","setSearchEnabled","isValidMonth","_year","_month","monthIndex","after","afterStr","before","beforeStr","searchResults","saveStatus","value2","offset","pinnedStatuses","pinnedStatusesIds","exclude_replies","fetchPromise","fetchAccountPromiseRef","setFeaturedTags","useTitle","cachedAccount","featuredTags","accountInfoMemo","filterBarRef","TimelineStart","month2","date","year","validity","valid","active","allowSwitch","offsetLeft","fetchAccountStatuses","masto2","monthFieldRef","checkValidity","minYear","maxYear","maxMonth","minMonth","yearFieldRef","Bookmarks","bookmarksIterator","fetchBookmarks","Favourites","favouritesIterator","fetchFavourites","FollowedHashtags","Following","homeIterator","latestItem","latestItemChanged","payload","fetchHome","TAGS_LIMIT_PER_MODE","TOTAL_TAGS_LIMIT","Hashtags","mediaView","columnMode","hashtags","linkParams","hashtagTitle","hashtagPostTitle","maxID","fetchHashtags","timelines","any","maxId","onlyMedia","skipThreading","since_id","followUIState","setFollowUIState","reachLimit","setDownOverflow","catch","finally","MenuHeader","FocusableItem","newHashtag","MenuGroup","exists","some","newInstance","List","listIterator","fetchList","setList","showManageMembersModal","setShowManageMembersModal","ListManageMembers","MEMBERS_LIMIT","listID","members","setMembers","membersIterator","fetchMembers","member","as","RemoveAddButton","removed","setRemoved","emptySearchParams","URLSearchParams","Mentions","stateType","setStateType","mentionsIterator","fetchMentions","types","conversationsIterator","latestConversationItem","lastStatus","fetchConversations","args","notificationTypeKeys","fixNotifications","groupNotifications","notificationsMap","cleanNotifications","virtualType","mappedNotification","mappedAccount","n","cleanNotifications2","notificationsMap2","Notifications","notificationID","notificationAccessToken","onlyMentions","setOnlyMentions","setFollowRequests","announcements","setAnnouncements","excludeTypes","allNotifications","groupedNotifications","notificationsLastFetchTime","fetchFollowRequests","loadFollowRequests","requests","fetchAnnouncements","loadNotifications","fetchNotificationsPromise","fetchNotifications","announcements2","loadUpdates","autoRefresh","unsub","v","subscribeKey","yesterdayDate","todayDate","currentDay","showTodayEmpty","announcementsListRef","announcement","AnnouncementBlock","notificationDay","differentDay","contact","contactAccount","startsAt","allDay","publishedAt","endsAt","published","read","reactions","publishedAtDate","publishedDateText","updatedAtText","dangerouslySetInnerHTML","staticUrl","me","reaction","Public","isLocal","publicIterator","fetchPublic","prompt","toLowerCase","SHORT_LIMIT","Search","offsetRef","scrollTo","statusResults","setStatusResults","accountResults","setAccountResults","hashtagResults","setHashtagResults","setTypeResultsFunc","loadResults","filterBarParent","link","history","fetchLinks","trends","links","Trending","setHashtags","setLinks","trendIterator","fetchTrend","links2","cur","description","authorName","authorUrl","blurhash","imageDescription","providerName","providerUrl","accentColor","averageColor","labAverageColor","title2","Columns","components","Hashtag","Component","error","Home","NotificationsLink","notificationLinkRef","stopPropagation","matchMedia","matches","NotificationsMenu","NOTIFICATIONS_LIMIT","NOTIFICATIONS_DISPLAY_LIMIT","now","hasFollowRequests","setHasFollowRequests","statusPostRegexes","getInstanceStatusObject","hostname","regex","match","getInstanceStatusURL","HttpRoute","statusObject","statusURL","Lists","instancesListURL","SUBCOMMENTS_OPEN_ALL_LIMIT","MAX_WEIGHT","cachedRepliesToggle","cachedStatusesMap","scrollPositions","resetScrollPosition","STATUSES_SELECTOR","STATUS_URL_REGEX","StatusPage","mediaParam","mediaOnlyParam","mediaIndex","showMedia","mediaStatusID","mediaStatus","getStatus","showMediaOnly","heroStatus","setHeroStatus","closeLink","matchStatusPath","matchPath","handleMediaClose","delete","$carousel","StatusThread","navigation","translate","setStatuses","heroStatusRef","totalDescendants","debounce","scrollOffsets","reloadHero","heroTimer","cachedStatuses","reallyCachedStatuses","heroFetch","pRetry","contextFetch","hasStatus","heroStatus2","_replies","_r","expandReplies","weight","descendants","missingStatuses","ancestors2","ancestors","ancestorsIsThread","nestedDescendants","__replies","ancestor","isThread","allStatuses","offsetTop","heroLimit","setLimit","scrollPosition","threadifyStatus","newScrollTop","newScrollOffsets","contextURL","initContext","statusWeightCache","div","apiCache","heroDisplayName","heroContentText","postInstance","hasDescendants","innerHTML","postSameInstance","activeStatus","activeStatusRect","activeStatusIndex","nextStatus","statusLink","heroInView","heroPointer","statusLinkRect","topmostStatusLink","allStatusLinks","prevStatus","details","reachTopPost","initialPageState","handleMediaClick","renderStatus","descendant","thread","isHero","setReachTopPost","setHeroInView","requestAnimationFrame","handleStatusLinkClick","SubComments","skip","prevEntry","ids","getIDs","openAll","viewMode","prevLocationIsStatusPage","entries","moreStatusesKeys","arr","setViewMode","button","buttons","level","diveDeep","replies2","replies3","totalComments","accWeight","totalWeight","calcStatusWeight","openBefore","hasParentThread","detailsRef","handleScroll","sameCount","open2","shortReply","dataset","MEDIA_VIRTUAL_LENGTH","CARD_VIRTUAL_LENGTH","WEIGHT_SEGMENT","cachedWeight","htmlContentLength","mediaLength","pollLength","POLL_VIRTUAL_LENGTH","cardLength","StatusRoute","boostsCarouselUrl","groupedNotificationsUrl","multiHashtagTimelineUrl","nestedCommentsThreadUrl","logoText","nativeAlert","__nativeAlert","Toastify","gravity","y","__STATES__","__STATES_STATS__","counts","unmountedPosts","setInterval","unfurledLinks","$post","postInNotifications","unfurled","keysCount","ICONS","nonIdleEvents","setIdle","debouncedSetIdle","onNonIdle","documentElement","isIOS","theme","$meta","tempColor","colorScheme","$manualMeta","themeDarkColor","$autoMetas","textSize","setProperty","$app","$body","setIsLoggedIn","code","decodeURIComponent","clientID","clientSecret","initPreferences","client","initInstance","initStates","PrimaryRoutes","Routes","Route","nonRootLocation","Welcome","element","backgroundLocation","getPrevLocation","isModalPage","timeout","AbortSignal","controller","AbortController","abort","signal","HashRouter","App","localStorage","removeItem","sessionStorage","__CLOAK__","toggle"],"mappings":"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"} |