phanpy/assets/main-93nxKW6L.js.map

1 line
723 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"version":3,"file":"main-93nxKW6L.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 &amp;{' '}\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 &middot;{' '}\n <a\n href=\"https://www.buymeacoffee.com/cheeaun\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Donate\n </a>{' '}\n &middot;{' '}\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 &amp; 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&hellip;\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&hellip;\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&hellip;\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>&raquo;\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&nbsp;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 dont 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 &bull;\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&hellip;</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&hellip;\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&hellip;\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&hellip;</span>\n </MenuItem>\n <MenuItem\n onClick={() => {\n states.showSettings = true;\n }}\n >\n <Icon icon=\"gear\" size=\"l\" /> <span>Settings&hellip;</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&hellip;</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&hellip;\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&hellip;\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.\" : <>&hellip;</>}\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&hellip;</>\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 &bull;{' '}\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&hellip;\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 && <>&middot; </>}\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. &ldquo;mastodon.social&rdquo;</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 &bull;{' '}\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&hellip;{' '}\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 &middot;{' '}\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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"}