1 line
1.3 MiB
1 line
1.3 MiB
{"version":3,"file":"main-CknXn6mi.js","sources":["../../node_modules/just-debounce-it/index.mjs","../../node_modules/swiped-events/src/swiped-events.js","../../src/utils/usePageVisibility.js","../../src/components/background-service.jsx","../../src/components/compose-button.jsx","../../src/components/keyboard-shortcuts-help.jsx","../../node_modules/@formkit/auto-animate/index.mjs","../../node_modules/@formkit/auto-animate/preact/index.mjs","../../src/utils/oauth-pkce.js","../../src/utils/auth.js","../../src/pages/accounts.jsx","../../src/assets/logo.svg","../../src/components/lang-selector.jsx","../../src/utils/push-notifications.js","../../src/pages/settings.jsx","../../src/utils/focus-deck.js","../../src/utils/useLocationChange.js","../../src/utils/lists.js","../../src/components/list-exclusive-badge.jsx","../../src/components/list-add-edit.jsx","../../src/components/account-info.jsx","../../src/components/account-sheet.jsx","../../src/components/drafts.jsx","../../src/components/embed-modal.jsx","../../src/components/generic-accounts.jsx","../../src/components/media-alt-modal.jsx","../../node_modules/chroma-js/src/utils/limit.js","../../node_modules/chroma-js/src/utils/type.js","../../node_modules/chroma-js/src/utils/unpack.js","../../node_modules/chroma-js/src/utils/index.js","../../node_modules/chroma-js/src/utils/multiply-matrices.js","../../node_modules/chroma-js/src/io/lab/lab-constants.js","../../node_modules/chroma-js/src/io/lab/lab2rgb.js","../../node_modules/chroma-js/src/io/oklab/oklab2rgb.js","../../node_modules/chroma-js/src/io/lab/rgb2lab.js","../../node_modules/chroma-js/src/io/oklab/rgb2oklab.js","../../node_modules/chroma-js/src/io/lch/lch2lab.js","../../node_modules/chroma-js/src/io/oklch/oklch2rgb.js","../../node_modules/chroma-js/src/io/lch/lab2lch.js","../../node_modules/chroma-js/src/io/oklch/rgb2oklch.js","../../src/components/media-modal.jsx","../../src/components/report-modal.jsx","../../node_modules/lz-string/libs/lz-string.js","../../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.js","../../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/annual-report.jsx","../../src/pages/bookmarks.jsx","../../src/assets/features/catch-up.png","../../src/pages/catchup.jsx","../../src/pages/favourites.jsx","../../src/pages/filters.jsx","../../src/pages/followed-hashtags.jsx","../../src/pages/following.jsx","../../src/pages/hashtag.jsx","../../src/pages/list.jsx","../../src/utils/group-notifications.js","../../src/pages/mentions.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/pages/login.jsx","../../src/pages/scheduled-posts.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":["var functionDebounce = debounce;\n\nfunction debounce(fn, wait, callFirst) {\n var timeout = null;\n var debouncedFn = null;\n\n var clear = function() {\n if (timeout) {\n clearTimeout(timeout);\n\n debouncedFn = null;\n timeout = null;\n }\n };\n\n var flush = function() {\n var call = debouncedFn;\n clear();\n\n if (call) {\n call();\n }\n };\n\n var debounceWrapper = function() {\n if (!wait) {\n return fn.apply(this, arguments);\n }\n\n var context = this;\n var args = arguments;\n var callNow = callFirst && !timeout;\n clear();\n\n debouncedFn = function() {\n fn.apply(context, args);\n };\n\n timeout = setTimeout(function() {\n timeout = null;\n\n if (!callNow) {\n var call = debouncedFn;\n debouncedFn = null;\n\n return call();\n }\n }, wait);\n\n if (callNow) {\n return debouncedFn();\n }\n };\n\n debounceWrapper.cancel = clear;\n debounceWrapper.flush = flush;\n\n return debounceWrapper;\n}\n\nexport {functionDebounce as default};\n","/*!\n * swiped-events.js - v@version@\n * Pure JavaScript swipe events\n * https://github.com/john-doherty/swiped-events\n * @inspiration https://stackoverflow.com/questions/16348031/disable-scrolling-when-touch-moving-certain-element\n * @author John Doherty <www.johndoherty.info>\n * @license MIT\n */\n(function (window, document) {\n\n 'use strict';\n\n // patch CustomEvent to allow constructor creation (IE/Chrome)\n if (typeof window.CustomEvent !== 'function') {\n\n window.CustomEvent = function (event, params) {\n\n params = params || { bubbles: false, cancelable: false, detail: undefined };\n\n var evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n return evt;\n };\n\n window.CustomEvent.prototype = window.Event.prototype;\n }\n\n document.addEventListener('touchstart', handleTouchStart, false);\n document.addEventListener('touchmove', handleTouchMove, false);\n document.addEventListener('touchend', handleTouchEnd, false);\n\n var xDown = null;\n var yDown = null;\n var xDiff = null;\n var yDiff = null;\n var timeDown = null;\n var startEl = null;\n var touchCount = 0;\n\n /**\n * Fires swiped event if swipe detected on touchend\n * @param {object} e - browser event object\n * @returns {void}\n */\n function handleTouchEnd(e) {\n\n // if the user released on a different target, cancel!\n if (startEl !== e.target) return;\n\n var swipeThreshold = parseInt(getNearestAttribute(startEl, 'data-swipe-threshold', '20'), 10); // default 20 units\n var swipeUnit = getNearestAttribute(startEl, 'data-swipe-unit', 'px'); // default px\n var swipeTimeout = parseInt(getNearestAttribute(startEl, 'data-swipe-timeout', '500'), 10); // default 500ms\n var timeDiff = Date.now() - timeDown;\n var eventType = '';\n var changedTouches = e.changedTouches || e.touches || [];\n\n if (swipeUnit === 'vh') {\n swipeThreshold = Math.round((swipeThreshold / 100) * document.documentElement.clientHeight); // get percentage of viewport height in pixels\n }\n if (swipeUnit === 'vw') {\n swipeThreshold = Math.round((swipeThreshold / 100) * document.documentElement.clientWidth); // get percentage of viewport height in pixels\n }\n\n if (Math.abs(xDiff) > Math.abs(yDiff)) { // most significant\n if (Math.abs(xDiff) > swipeThreshold && timeDiff < swipeTimeout) {\n if (xDiff > 0) {\n eventType = 'swiped-left';\n }\n else {\n eventType = 'swiped-right';\n }\n }\n }\n else if (Math.abs(yDiff) > swipeThreshold && timeDiff < swipeTimeout) {\n if (yDiff > 0) {\n eventType = 'swiped-up';\n }\n else {\n eventType = 'swiped-down';\n }\n }\n\n if (eventType !== '') {\n\n var eventData = {\n dir: eventType.replace(/swiped-/, ''),\n touchType: (changedTouches[0] || {}).touchType || 'direct',\n fingers: touchCount, // Number of fingers used\n xStart: parseInt(xDown, 10),\n xEnd: parseInt((changedTouches[0] || {}).clientX || -1, 10),\n yStart: parseInt(yDown, 10),\n yEnd: parseInt((changedTouches[0] || {}).clientY || -1, 10)\n };\n\n // fire `swiped` event event on the element that started the swipe\n startEl.dispatchEvent(new CustomEvent('swiped', { bubbles: true, cancelable: true, detail: eventData }));\n\n // fire `swiped-dir` event on the element that started the swipe\n startEl.dispatchEvent(new CustomEvent(eventType, { bubbles: true, cancelable: true, detail: eventData }));\n }\n\n // reset values\n xDown = null;\n yDown = null;\n timeDown = null;\n }\n /**\n * Records current location on touchstart event\n * @param {object} e - browser event object\n * @returns {void}\n */\n function handleTouchStart(e) {\n\n // if the element has data-swipe-ignore=\"true\" we stop listening for swipe events\n if (e.target.getAttribute('data-swipe-ignore') === 'true') return;\n\n startEl = e.target;\n\n timeDown = Date.now();\n xDown = e.touches[0].clientX;\n yDown = e.touches[0].clientY;\n xDiff = 0;\n yDiff = 0;\n touchCount = e.touches.length;\n }\n\n /**\n * Records location diff in px on touchmove event\n * @param {object} e - browser event object\n * @returns {void}\n */\n function handleTouchMove(e) {\n\n if (!xDown || !yDown) return;\n\n var xUp = e.touches[0].clientX;\n var yUp = e.touches[0].clientY;\n\n xDiff = xDown - xUp;\n yDiff = yDown - yUp;\n }\n\n /**\n * Gets attribute off HTML element or nearest parent\n * @param {object} el - HTML element to retrieve attribute from\n * @param {string} attributeName - name of the attribute\n * @param {any} defaultValue - default value to return if no match found\n * @returns {any} attribute value or defaultValue\n */\n function getNearestAttribute(el, attributeName, defaultValue) {\n\n // walk up the dom tree looking for attributeName\n while (el && el !== document.documentElement) {\n\n var attributeValue = el.getAttribute(attributeName);\n\n if (attributeValue) {\n return attributeValue;\n }\n\n el = el.parentNode;\n }\n\n return defaultValue;\n }\n\n}(window, document));\n","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 { useLingui } from '@lingui/react/macro';\nimport { 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 = 20_000; // 20 seconds\n\nexport default memo(function BackgroundService({ isLoggedIn }) {\n const { t } = useLingui();\n\n // Notifications service\n // - WebSocket to receive notifications when page is visible\n const [visible, setVisible] = useState(true);\n const visibleTimeout = useRef();\n usePageVisibility((visible) => {\n clearTimeout(visibleTimeout.current);\n if (visible) {\n setVisible(true);\n } else {\n visibleTimeout.current = setTimeout(() => {\n setVisible(false);\n }, POLL_INTERVAL);\n }\n });\n\n const checkLatestNotification = async (masto, instance, skipCheckMarkers) => {\n if (states.notificationsLast) {\n const notificationsIterator = masto.v1.notifications\n .list({\n limit: 1,\n sinceId: states.notificationsLast.id,\n })\n .values();\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 streamTimeout;\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 streamTimeout = 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(streamTimeout);\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(\n 'shift+alt+k',\n (e) => {\n // Need modifers check due to useKey: true\n if (!e.shiftKey || !e.altKey) return;\n\n const currentCloakMode = states.settings.cloakMode;\n states.settings.cloakMode = !currentCloakMode;\n showToast({\n text: currentCloakMode ? t`Cloak mode disabled` : t`Cloak mode enabled`,\n });\n },\n {\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey,\n },\n );\n\n return null;\n});\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { ControlledMenu, MenuDivider, MenuItem } from '@szhsin/react-menu';\nimport { useCallback, useEffect, useRef, useState } from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport { useLongPress } from 'use-long-press';\nimport { useSnapshot } from 'valtio';\n\nimport { api } from '../utils/api';\nimport niceDateTime from '../utils/nice-date-time';\nimport openCompose from '../utils/open-compose';\nimport openOSK from '../utils/open-osk';\nimport pmem from '../utils/pmem';\nimport safeBoundingBoxPadding from '../utils/safe-bounding-box-padding';\nimport showCompose from '../utils/show-compose';\nimport states from '../utils/states';\nimport statusPeek from '../utils/status-peek';\nimport { getCurrentAccountID } from '../utils/store-utils';\n\nimport Icon from './icon';\nimport Loader from './loader';\nimport MenuLink from './menu-link';\nimport RelativeTime from './relative-time';\nimport SubMenu2 from './submenu2';\n\n// Function to fetch the latest posts from the current user\n// Use pmem to memoize fetch results for 1 minute\nconst fetchLatestPostsMemoized = pmem(\n async (masto, currentAccountID) => {\n const statusesIterator = masto.v1.accounts\n .$select(currentAccountID)\n .statuses.list({\n limit: 3,\n exclude_replies: true,\n exclude_reblogs: true,\n })\n .values();\n const { value } = await statusesIterator.next();\n return value || [];\n },\n { maxAge: 60000 },\n); // 1 minute cache\n\nexport default function ComposeButton() {\n const { t } = useLingui();\n const snapStates = useSnapshot(states);\n const { masto } = api();\n\n // Context menu state\n const [menuOpen, setMenuOpen] = useState(false);\n const [latestPosts, setLatestPosts] = useState([]);\n const [loadingPosts, setLoadingPosts] = useState(false);\n const buttonRef = useRef(null);\n const menuRef = useRef(null);\n\n const columnMode = snapStates.settings.shortcutsViewMode === 'multi-column';\n\n function handleButton(e) {\n // useKey will even listen to Shift\n // e.g. press Shift (without c) will trigger this 😱\n if (e.key && e.key.toLowerCase() !== 'c') return;\n\n if (snapStates.composerState.minimized) {\n states.composerState.minimized = false;\n openOSK();\n return;\n }\n\n const composeDataElements = document.querySelectorAll('data.compose-data');\n // If there's a lot of them, ignore\n const opts =\n !columnMode && composeDataElements.length === 1\n ? JSON.parse(composeDataElements[0].value)\n : undefined;\n\n if (e.shiftKey) {\n const newWin = openCompose(opts);\n\n if (!newWin) {\n states.showCompose = opts || true;\n }\n } else {\n openOSK();\n states.showCompose = opts || true;\n }\n }\n\n useHotkeys('c, shift+c', handleButton, {\n useKey: true,\n ignoreEventWhen: (e) => {\n const hasModal = !!document.querySelector('#modal-container > *');\n return hasModal || e.metaKey || e.ctrlKey || e.altKey;\n },\n });\n\n // Setup longpress handler to open context menu\n const bindLongPress = useLongPress(\n () => {\n setMenuOpen(true);\n },\n {\n threshold: 600,\n },\n );\n\n const fetchLatestPosts = useCallback(async () => {\n try {\n setLoadingPosts(true);\n const currentAccountID = getCurrentAccountID();\n if (!currentAccountID) {\n return;\n }\n const posts = await fetchLatestPostsMemoized(masto, currentAccountID);\n setLatestPosts(posts);\n } catch (error) {\n } finally {\n setLoadingPosts(false);\n }\n }, [masto]);\n\n // Function to handle opening the compose window to reply to a post\n const handleReplyToPost = useCallback((post) => {\n showCompose({\n replyToStatus: post,\n });\n setMenuOpen(false);\n }, []);\n\n useEffect(() => {\n if (menuOpen) {\n fetchLatestPosts();\n }\n }, [fetchLatestPosts, menuOpen]);\n\n return (\n <>\n <button\n ref={buttonRef}\n type=\"button\"\n id=\"compose-button\"\n onClick={handleButton}\n onContextMenu={(e) => {\n e.preventDefault();\n setMenuOpen(true);\n }}\n {...bindLongPress()}\n class={`${snapStates.composerState.minimized ? 'min' : ''} ${\n snapStates.composerState.publishing ? 'loading' : ''\n } ${snapStates.composerState.publishingError ? 'error' : ''}`}\n >\n <Icon icon=\"quill\" size=\"xl\" alt={t`Compose`} />\n </button>\n <ControlledMenu\n ref={menuRef}\n state={menuOpen ? 'open' : undefined}\n anchorRef={buttonRef}\n onClose={() => setMenuOpen(false)}\n direction=\"top\"\n gap={8} // Add gap between menu and button\n unmountOnClose\n portal={{\n target: document.body,\n }}\n boundingBoxPadding={safeBoundingBoxPadding()}\n containerProps={{\n style: {\n zIndex: 19,\n },\n onClick: () => {\n menuRef.current?.closeMenu?.();\n },\n }}\n submenuOpenDelay={600}\n >\n <MenuLink to=\"/sp\">\n <Icon icon=\"schedule\" />{' '}\n <span>\n <Trans>Scheduled Posts</Trans>\n </span>\n </MenuLink>\n <MenuDivider />\n <SubMenu2\n align=\"end\"\n direction=\"top\"\n shift={-8}\n disabled={loadingPosts || latestPosts.length === 0}\n label={\n <>\n <Icon icon=\"comment\" />{' '}\n <span className=\"menu-grow\">\n <Trans>Add to thread</Trans>\n </span>\n {loadingPosts ? '…' : <Icon icon=\"chevron-right\" />}\n </>\n }\n >\n {latestPosts.length > 0 &&\n latestPosts.map((post) => {\n const createdDate = new Date(post.createdAt);\n const isWithinDay =\n new Date().getTime() - createdDate.getTime() < 86400000;\n\n return (\n <MenuItem key={post.id} onClick={() => handleReplyToPost(post)}>\n <small>\n <div class=\"menu-post-text\">{statusPeek(post)}</div>\n <span className=\"more-insignificant\">\n {/* Show relative time if within a day */}\n {isWithinDay && (\n <>\n <RelativeTime datetime={createdDate} format=\"micro\" />{' '}\n ‒{' '}\n </>\n )}\n <time\n className=\"created\"\n dateTime={createdDate.toISOString()}\n title={createdDate.toLocaleString()}\n >\n {niceDateTime(post.createdAt)}\n </time>\n </span>\n </small>\n </MenuItem>\n );\n })}\n </SubMenu2>\n </ControlledMenu>\n </>\n );\n}\n","import './keyboard-shortcuts-help.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\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 { t } = useLingui();\n const snapStates = useSnapshot(states);\n\n function onClose() {\n states.showKeyboardShortcutsHelp = false;\n }\n\n useHotkeys(\n '?',\n () => {\n console.log('help');\n states.showKeyboardShortcutsHelp = true;\n },\n {\n useKey: true,\n ignoreEventWhen: (e) => {\n const isCatchUpPage = /\\/catchup/i.test(location.hash);\n return isCatchUpPage || e.metaKey || e.ctrlKey || e.altKey;\n // const hasModal = !!document.querySelector('#modal-container > *');\n // return hasModal;\n },\n },\n );\n\n return (\n !!snapStates.showKeyboardShortcutsHelp && (\n <Modal 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\" alt={t`Close`} />\n </button>\n <header>\n <h2>\n <Trans>Keyboard shortcuts</Trans>\n </h2>\n </header>\n <main>\n <table>\n <tbody>\n {[\n {\n action: t`Keyboard shortcuts help`,\n keys: <kbd>?</kbd>,\n },\n {\n action: t`Next post`,\n keys: <kbd>j</kbd>,\n },\n {\n action: t`Previous post`,\n keys: <kbd>k</kbd>,\n },\n {\n action: t`Skip carousel to next post`,\n keys: (\n <Trans>\n <kbd>Shift</kbd> + <kbd>j</kbd>\n </Trans>\n ),\n },\n {\n action: t`Skip carousel to previous post`,\n keys: (\n <Trans>\n <kbd>Shift</kbd> + <kbd>k</kbd>\n </Trans>\n ),\n },\n {\n action: t`Load new posts`,\n keys: <kbd>.</kbd>,\n },\n {\n action: t`Open post details`,\n keys: (\n <Trans>\n <kbd>Enter</kbd> or <kbd>o</kbd>\n </Trans>\n ),\n },\n {\n action: (\n <Trans>\n Expand content warning or\n <br />\n toggle expanded/collapsed thread\n </Trans>\n ),\n keys: <kbd>x</kbd>,\n },\n {\n action: t`Close post or dialogs`,\n keys: (\n <Trans>\n <kbd>Esc</kbd> or <kbd>Backspace</kbd>\n </Trans>\n ),\n },\n {\n action: t`Focus column in multi-column mode`,\n keys: (\n <Trans>\n <kbd>1</kbd> to <kbd>9</kbd>\n </Trans>\n ),\n },\n {\n action: t`Focus next column in multi-column mode`,\n keys: <kbd>]</kbd>,\n },\n {\n action: t`Focus previous column in multi-column mode`,\n keys: <kbd>[</kbd>,\n },\n {\n action: t`Compose new post`,\n keys: <kbd>c</kbd>,\n },\n {\n action: t`Compose new post (new window)`,\n className: 'insignificant',\n keys: (\n <Trans>\n <kbd>Shift</kbd> + <kbd>c</kbd>\n </Trans>\n ),\n },\n {\n action: t`Send post`,\n keys: (\n <Trans>\n <kbd>Ctrl</kbd> + <kbd>Enter</kbd> or <kbd>⌘</kbd> +{' '}\n <kbd>Enter</kbd>\n </Trans>\n ),\n },\n {\n action: t`Search`,\n keys: <kbd>/</kbd>,\n },\n {\n action: t`Reply`,\n keys: <kbd>r</kbd>,\n },\n {\n action: t`Reply (new window)`,\n className: 'insignificant',\n keys: (\n <Trans>\n <kbd>Shift</kbd> + <kbd>r</kbd>\n </Trans>\n ),\n },\n {\n action: t`Like (favourite)`,\n keys: (\n <Trans>\n <kbd>l</kbd> or <kbd>f</kbd>\n </Trans>\n ),\n },\n {\n action: t`Boost`,\n keys: (\n <Trans>\n <kbd>Shift</kbd> + <kbd>b</kbd>\n </Trans>\n ),\n },\n {\n action: t`Bookmark`,\n keys: <kbd>d</kbd>,\n },\n {\n action: t`Toggle Cloak mode`,\n keys: (\n <Trans>\n <kbd>Shift</kbd> + <kbd>Alt</kbd> + <kbd>k</kbd>\n </Trans>\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 </tbody>\n </table>\n </main>\n </div>\n </Modal>\n )\n );\n});\n","/**\n * A set of all the parents currently being observe. This is the only non weak\n * registry.\n */\nconst parents = new Set();\n/**\n * Element coordinates that is constantly kept up to date.\n */\nconst coords = new WeakMap();\n/**\n * Siblings of elements that have been removed from the dom.\n */\nconst siblings = new WeakMap();\n/**\n * Animations that are currently running.\n */\nconst animations = new WeakMap();\n/**\n * A map of existing intersection observers used to track element movements.\n */\nconst intersections = new WeakMap();\n/**\n * Intervals for automatically checking the position of elements occasionally.\n */\nconst intervals = new WeakMap();\n/**\n * The configuration options for each group of elements.\n */\nconst options = new WeakMap();\n/**\n * Debounce counters by id, used to debounce calls to update positions.\n */\nconst debounces = new WeakMap();\n/**\n * All parents that are currently enabled are tracked here.\n */\nconst enabled = new WeakSet();\n/**\n * The document used to calculate transitions.\n */\nlet root;\n/**\n * The root’s XY scroll positions.\n */\nlet scrollX = 0;\nlet scrollY = 0;\n/**\n * Used to sign an element as the target.\n */\nconst TGT = \"__aa_tgt\";\n/**\n * Used to sign an element as being part of a removal.\n */\nconst DEL = \"__aa_del\";\n/**\n * Used to sign an element as being \"new\". When an element is removed from the\n * dom, but may cycle back in we can sign it with new to ensure the next time\n * it is recognized we consider it new.\n */\nconst NEW = \"__aa_new\";\n/**\n * Callback for handling all mutations.\n * @param mutations - A mutation list\n */\nconst handleMutations = (mutations) => {\n const elements = getElements(mutations);\n // If elements is \"false\" that means this mutation that should be ignored.\n if (elements) {\n elements.forEach((el) => animate(el));\n }\n};\n/**\n *\n * @param entries - Elements that have been resized.\n */\nconst handleResizes = (entries) => {\n entries.forEach((entry) => {\n if (entry.target === root)\n updateAllPos();\n if (coords.has(entry.target))\n updatePos(entry.target);\n });\n};\n/**\n * Observe this elements position.\n * @param el - The element to observe the position of.\n */\nfunction observePosition(el) {\n const oldObserver = intersections.get(el);\n oldObserver === null || oldObserver === void 0 ? void 0 : oldObserver.disconnect();\n let rect = coords.get(el);\n let invocations = 0;\n const buffer = 5;\n if (!rect) {\n rect = getCoords(el);\n coords.set(el, rect);\n }\n const { offsetWidth, offsetHeight } = root;\n const rootMargins = [\n rect.top - buffer,\n offsetWidth - (rect.left + buffer + rect.width),\n offsetHeight - (rect.top + buffer + rect.height),\n rect.left - buffer,\n ];\n const rootMargin = rootMargins\n .map((px) => `${-1 * Math.floor(px)}px`)\n .join(\" \");\n const observer = new IntersectionObserver(() => {\n ++invocations > 1 && updatePos(el);\n }, {\n root,\n threshold: 1,\n rootMargin,\n });\n observer.observe(el);\n intersections.set(el, observer);\n}\n/**\n * Update the exact position of a given element.\n * @param el - An element to update the position of.\n */\nfunction updatePos(el) {\n clearTimeout(debounces.get(el));\n const optionsOrPlugin = getOptions(el);\n const delay = isPlugin(optionsOrPlugin) ? 500 : optionsOrPlugin.duration;\n debounces.set(el, setTimeout(async () => {\n const currentAnimation = animations.get(el);\n try {\n await (currentAnimation === null || currentAnimation === void 0 ? void 0 : currentAnimation.finished);\n coords.set(el, getCoords(el));\n observePosition(el);\n }\n catch {\n // ignore errors as the `.finished` promise is rejected when animations were cancelled\n }\n }, delay));\n}\n/**\n * Updates all positions that are currently being tracked.\n */\nfunction updateAllPos() {\n clearTimeout(debounces.get(root));\n debounces.set(root, setTimeout(() => {\n parents.forEach((parent) => forEach(parent, (el) => lowPriority(() => updatePos(el))));\n }, 100));\n}\n/**\n * Its possible for a quick scroll or other fast events to get past the\n * intersection observer, so occasionally we need want \"cold-poll\" for the\n * latests and greatest position. We try to do this in the most non-disruptive\n * fashion possible. First we only do this ever couple seconds, staggard by a\n * random offset.\n * @param el - Element\n */\nfunction poll(el) {\n setTimeout(() => {\n intervals.set(el, setInterval(() => lowPriority(updatePos.bind(null, el)), 2000));\n }, Math.round(2000 * Math.random()));\n}\n/**\n * Perform some operation that is non critical at some point.\n * @param callback\n */\nfunction lowPriority(callback) {\n if (typeof requestIdleCallback === \"function\") {\n requestIdleCallback(() => callback());\n }\n else {\n requestAnimationFrame(() => callback());\n }\n}\n/**\n * The mutation observer responsible for watching each root element.\n */\nlet mutations;\n/**\n * A resize observer, responsible for recalculating elements on resize.\n */\nlet resize;\n/**\n * Ensure the browser is supported.\n */\nconst supportedBrowser = typeof window !== \"undefined\" && \"ResizeObserver\" in window;\n/**\n * If this is in a browser, initialize our Web APIs\n */\nif (supportedBrowser) {\n root = document.documentElement;\n mutations = new MutationObserver(handleMutations);\n resize = new ResizeObserver(handleResizes);\n window.addEventListener(\"scroll\", () => {\n scrollY = window.scrollY;\n scrollX = window.scrollX;\n });\n resize.observe(root);\n}\n/**\n * Retrieves all the elements that may have been affected by the last mutation\n * including ones that have been removed and are no longer in the DOM.\n * @param mutations - A mutation list.\n * @returns\n */\nfunction getElements(mutations) {\n const observedNodes = mutations.reduce((nodes, mutation) => {\n return [\n ...nodes,\n ...Array.from(mutation.addedNodes),\n ...Array.from(mutation.removedNodes),\n ];\n }, []);\n // Short circuit if _only_ comment nodes are observed\n const onlyCommentNodesObserved = observedNodes.every((node) => node.nodeName === \"#comment\");\n if (onlyCommentNodesObserved)\n return false;\n return mutations.reduce((elements, mutation) => {\n // Short circuit if we find a purposefully deleted node.\n if (elements === false)\n return false;\n if (mutation.target instanceof Element) {\n target(mutation.target);\n if (!elements.has(mutation.target)) {\n elements.add(mutation.target);\n for (let i = 0; i < mutation.target.children.length; i++) {\n const child = mutation.target.children.item(i);\n if (!child)\n continue;\n if (DEL in child) {\n return false;\n }\n target(mutation.target, child);\n elements.add(child);\n }\n }\n if (mutation.removedNodes.length) {\n for (let i = 0; i < mutation.removedNodes.length; i++) {\n const child = mutation.removedNodes[i];\n if (DEL in child) {\n return false;\n }\n if (child instanceof Element) {\n elements.add(child);\n target(mutation.target, child);\n siblings.set(child, [\n mutation.previousSibling,\n mutation.nextSibling,\n ]);\n }\n }\n }\n }\n return elements;\n }, new Set());\n}\n/**\n * Assign the target to an element.\n * @param el - The root element\n * @param child\n */\nfunction target(el, child) {\n if (!child && !(TGT in el))\n Object.defineProperty(el, TGT, { value: el });\n else if (child && !(TGT in child))\n Object.defineProperty(child, TGT, { value: el });\n}\n/**\n * Determines what kind of change took place on the given element and then\n * performs the proper animation based on that.\n * @param el - The specific element to animate.\n */\nfunction animate(el) {\n var _a;\n const isMounted = el.isConnected;\n const preExisting = coords.has(el);\n if (isMounted && siblings.has(el))\n siblings.delete(el);\n if (animations.has(el)) {\n (_a = animations.get(el)) === null || _a === void 0 ? void 0 : _a.cancel();\n }\n if (NEW in el) {\n add(el);\n }\n else if (preExisting && isMounted) {\n remain(el);\n }\n else if (preExisting && !isMounted) {\n remove(el);\n }\n else {\n add(el);\n }\n}\n/**\n * Removes all non-digits from a string and casts to a number.\n * @param str - A string containing a pixel value.\n * @returns\n */\nfunction raw(str) {\n return Number(str.replace(/[^0-9.\\-]/g, \"\"));\n}\n/**\n * Get the scroll offset of elements\n * @param el - Element\n * @returns\n */\nfunction getScrollOffset(el) {\n let p = el.parentElement;\n while (p) {\n if (p.scrollLeft || p.scrollTop) {\n return { x: p.scrollLeft, y: p.scrollTop };\n }\n p = p.parentElement;\n }\n return { x: 0, y: 0 };\n}\n/**\n * Get the coordinates of elements adjusted for scroll position.\n * @param el - Element\n * @returns\n */\nfunction getCoords(el) {\n const rect = el.getBoundingClientRect();\n const { x, y } = getScrollOffset(el);\n return {\n top: rect.top + y,\n left: rect.left + x,\n width: rect.width,\n height: rect.height,\n };\n}\n/**\n * Returns the width/height that the element should be transitioned between.\n * This takes into account box-sizing.\n * @param el - Element being animated\n * @param oldCoords - Old set of Coordinates coordinates\n * @param newCoords - New set of Coordinates coordinates\n * @returns\n */\nfunction getTransitionSizes(el, oldCoords, newCoords) {\n let widthFrom = oldCoords.width;\n let heightFrom = oldCoords.height;\n let widthTo = newCoords.width;\n let heightTo = newCoords.height;\n const styles = getComputedStyle(el);\n const sizing = styles.getPropertyValue(\"box-sizing\");\n if (sizing === \"content-box\") {\n const paddingY = raw(styles.paddingTop) +\n raw(styles.paddingBottom) +\n raw(styles.borderTopWidth) +\n raw(styles.borderBottomWidth);\n const paddingX = raw(styles.paddingLeft) +\n raw(styles.paddingRight) +\n raw(styles.borderRightWidth) +\n raw(styles.borderLeftWidth);\n widthFrom -= paddingX;\n widthTo -= paddingX;\n heightFrom -= paddingY;\n heightTo -= paddingY;\n }\n return [widthFrom, widthTo, heightFrom, heightTo].map(Math.round);\n}\n/**\n * Retrieves animation options for the current element.\n * @param el - Element to retrieve options for.\n * @returns\n */\nfunction getOptions(el) {\n return TGT in el && options.has(el[TGT])\n ? options.get(el[TGT])\n : { duration: 250, easing: \"ease-in-out\" };\n}\n/**\n * Returns the target of a given animation (generally the parent).\n * @param el - An element to check for a target\n * @returns\n */\nfunction getTarget(el) {\n if (TGT in el)\n return el[TGT];\n return undefined;\n}\n/**\n * Checks if animations are enabled or disabled for a given element.\n * @param el - Any element\n * @returns\n */\nfunction isEnabled(el) {\n const target = getTarget(el);\n return target ? enabled.has(target) : false;\n}\n/**\n * Iterate over the children of a given parent.\n * @param parent - A parent element\n * @param callback - A callback\n */\nfunction forEach(parent, ...callbacks) {\n callbacks.forEach((callback) => callback(parent, options.has(parent)));\n for (let i = 0; i < parent.children.length; i++) {\n const child = parent.children.item(i);\n if (child) {\n callbacks.forEach((callback) => callback(child, options.has(child)));\n }\n }\n}\n/**\n * Always return tuple to provide consistent interface\n */\nfunction getPluginTuple(pluginReturn) {\n if (Array.isArray(pluginReturn))\n return pluginReturn;\n return [pluginReturn];\n}\n/**\n * Determine if config is plugin\n */\nfunction isPlugin(config) {\n return typeof config === \"function\";\n}\n/**\n * The element in question is remaining in the DOM.\n * @param el - Element to flip\n * @returns\n */\nfunction remain(el) {\n const oldCoords = coords.get(el);\n const newCoords = getCoords(el);\n if (!isEnabled(el))\n return coords.set(el, newCoords);\n let animation;\n if (!oldCoords)\n return;\n const pluginOrOptions = getOptions(el);\n if (typeof pluginOrOptions !== \"function\") {\n const deltaX = oldCoords.left - newCoords.left;\n const deltaY = oldCoords.top - newCoords.top;\n const [widthFrom, widthTo, heightFrom, heightTo] = getTransitionSizes(el, oldCoords, newCoords);\n const start = {\n transform: `translate(${deltaX}px, ${deltaY}px)`,\n };\n const end = {\n transform: `translate(0, 0)`,\n };\n if (widthFrom !== widthTo) {\n start.width = `${widthFrom}px`;\n end.width = `${widthTo}px`;\n }\n if (heightFrom !== heightTo) {\n start.height = `${heightFrom}px`;\n end.height = `${heightTo}px`;\n }\n animation = el.animate([start, end], {\n duration: pluginOrOptions.duration,\n easing: pluginOrOptions.easing,\n });\n }\n else {\n const [keyframes] = getPluginTuple(pluginOrOptions(el, \"remain\", oldCoords, newCoords));\n animation = new Animation(keyframes);\n animation.play();\n }\n animations.set(el, animation);\n coords.set(el, newCoords);\n animation.addEventListener(\"finish\", updatePos.bind(null, el));\n}\n/**\n * Adds the element with a transition.\n * @param el - Animates the element being added.\n */\nfunction add(el) {\n if (NEW in el)\n delete el[NEW];\n const newCoords = getCoords(el);\n coords.set(el, newCoords);\n const pluginOrOptions = getOptions(el);\n if (!isEnabled(el))\n return;\n let animation;\n if (typeof pluginOrOptions !== \"function\") {\n animation = el.animate([\n { transform: \"scale(.98)\", opacity: 0 },\n { transform: \"scale(0.98)\", opacity: 0, offset: 0.5 },\n { transform: \"scale(1)\", opacity: 1 },\n ], {\n duration: pluginOrOptions.duration * 1.5,\n easing: \"ease-in\",\n });\n }\n else {\n const [keyframes] = getPluginTuple(pluginOrOptions(el, \"add\", newCoords));\n animation = new Animation(keyframes);\n animation.play();\n }\n animations.set(el, animation);\n animation.addEventListener(\"finish\", updatePos.bind(null, el));\n}\n/**\n * Clean up after removing an element from the dom.\n * @param el - Element being removed\n * @param styles - Optional styles that should be removed from the element.\n */\nfunction cleanUp(el, styles) {\n var _a;\n el.remove();\n coords.delete(el);\n siblings.delete(el);\n animations.delete(el);\n (_a = intersections.get(el)) === null || _a === void 0 ? void 0 : _a.disconnect();\n setTimeout(() => {\n if (DEL in el)\n delete el[DEL];\n Object.defineProperty(el, NEW, { value: true, configurable: true });\n if (styles && el instanceof HTMLElement) {\n for (const style in styles) {\n el.style[style] = \"\";\n }\n }\n }, 0);\n}\n/**\n * Animates the removal of an element.\n * @param el - Element to remove\n */\nfunction remove(el) {\n var _a;\n if (!siblings.has(el) || !coords.has(el))\n return;\n const [prev, next] = siblings.get(el);\n Object.defineProperty(el, DEL, { value: true, configurable: true });\n const finalX = window.scrollX;\n const finalY = window.scrollY;\n if (next && next.parentNode && next.parentNode instanceof Element) {\n next.parentNode.insertBefore(el, next);\n }\n else if (prev && prev.parentNode) {\n prev.parentNode.appendChild(el);\n }\n else {\n (_a = getTarget(el)) === null || _a === void 0 ? void 0 : _a.appendChild(el);\n }\n if (!isEnabled(el))\n return cleanUp(el);\n const [top, left, width, height] = deletePosition(el);\n const optionsOrPlugin = getOptions(el);\n const oldCoords = coords.get(el);\n if (finalX !== scrollX || finalY !== scrollY) {\n adjustScroll(el, finalX, finalY, optionsOrPlugin);\n }\n let animation;\n let styleReset = {\n position: \"absolute\",\n top: `${top}px`,\n left: `${left}px`,\n width: `${width}px`,\n height: `${height}px`,\n margin: \"0\",\n pointerEvents: \"none\",\n transformOrigin: \"center\",\n zIndex: \"100\",\n };\n if (!isPlugin(optionsOrPlugin)) {\n Object.assign(el.style, styleReset);\n animation = el.animate([\n {\n transform: \"scale(1)\",\n opacity: 1,\n },\n {\n transform: \"scale(.98)\",\n opacity: 0,\n },\n ], { duration: optionsOrPlugin.duration, easing: \"ease-out\" });\n }\n else {\n const [keyframes, options] = getPluginTuple(optionsOrPlugin(el, \"remove\", oldCoords));\n if ((options === null || options === void 0 ? void 0 : options.styleReset) !== false) {\n styleReset = (options === null || options === void 0 ? void 0 : options.styleReset) || styleReset;\n Object.assign(el.style, styleReset);\n }\n animation = new Animation(keyframes);\n animation.play();\n }\n animations.set(el, animation);\n animation.addEventListener(\"finish\", cleanUp.bind(null, el, styleReset));\n}\n/**\n * If the element being removed is at the very bottom of the page, and the\n * the page was scrolled into a space being \"made available\" by the element\n * that was removed, the page scroll will have jumped up some amount. We need\n * to offset the jump by the amount that the page was \"automatically\" scrolled\n * up. We can do this by comparing the scroll position before and after the\n * element was removed, and then offsetting by that amount.\n *\n * @param el - The element being deleted\n * @param finalX - The final X scroll position\n * @param finalY - The final Y scroll position\n * @param optionsOrPlugin - The options or plugin\n * @returns\n */\nfunction adjustScroll(el, finalX, finalY, optionsOrPlugin) {\n const scrollDeltaX = scrollX - finalX;\n const scrollDeltaY = scrollY - finalY;\n const scrollBefore = document.documentElement.style.scrollBehavior;\n const scrollBehavior = getComputedStyle(root).scrollBehavior;\n if (scrollBehavior === \"smooth\") {\n document.documentElement.style.scrollBehavior = \"auto\";\n }\n window.scrollTo(window.scrollX + scrollDeltaX, window.scrollY + scrollDeltaY);\n if (!el.parentElement)\n return;\n const parent = el.parentElement;\n let lastHeight = parent.clientHeight;\n let lastWidth = parent.clientWidth;\n const startScroll = performance.now();\n // Here we use a manual scroll animation to keep the element using the same\n // easing and timing as the parent’s scroll animation.\n function smoothScroll() {\n requestAnimationFrame(() => {\n if (!isPlugin(optionsOrPlugin)) {\n const deltaY = lastHeight - parent.clientHeight;\n const deltaX = lastWidth - parent.clientWidth;\n if (startScroll + optionsOrPlugin.duration > performance.now()) {\n window.scrollTo({\n left: window.scrollX - deltaX,\n top: window.scrollY - deltaY,\n });\n lastHeight = parent.clientHeight;\n lastWidth = parent.clientWidth;\n smoothScroll();\n }\n else {\n document.documentElement.style.scrollBehavior = scrollBefore;\n }\n }\n });\n }\n smoothScroll();\n}\n/**\n * Determines the position of the element being removed.\n * @param el - The element being deleted\n * @returns\n */\nfunction deletePosition(el) {\n const oldCoords = coords.get(el);\n const [width, , height] = getTransitionSizes(el, oldCoords, getCoords(el));\n let offsetParent = el.parentElement;\n while (offsetParent &&\n (getComputedStyle(offsetParent).position === \"static\" ||\n offsetParent instanceof HTMLBodyElement)) {\n offsetParent = offsetParent.parentElement;\n }\n if (!offsetParent)\n offsetParent = document.body;\n const parentStyles = getComputedStyle(offsetParent);\n const parentCoords = coords.get(offsetParent) || getCoords(offsetParent);\n const top = Math.round(oldCoords.top - parentCoords.top) -\n raw(parentStyles.borderTopWidth);\n const left = Math.round(oldCoords.left - parentCoords.left) -\n raw(parentStyles.borderLeftWidth);\n return [top, left, width, height];\n}\n/**\n * A function that automatically adds animation effects to itself and its\n * immediate children. Specifically it adds effects for adding, moving, and\n * removing DOM elements.\n * @param el - A parent element to add animations to.\n * @param options - An optional object of options.\n */\nfunction autoAnimate(el, config = {}) {\n if (mutations && resize) {\n const mediaQuery = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n const isDisabledDueToReduceMotion = mediaQuery.matches &&\n !isPlugin(config) &&\n !config.disrespectUserMotionPreference;\n if (!isDisabledDueToReduceMotion) {\n enabled.add(el);\n if (getComputedStyle(el).position === \"static\") {\n Object.assign(el.style, { position: \"relative\" });\n }\n forEach(el, updatePos, poll, (element) => resize === null || resize === void 0 ? void 0 : resize.observe(element));\n if (isPlugin(config)) {\n options.set(el, config);\n }\n else {\n options.set(el, { duration: 250, easing: \"ease-in-out\", ...config });\n }\n mutations.observe(el, { childList: true });\n parents.add(el);\n }\n }\n return Object.freeze({\n parent: el,\n enable: () => {\n enabled.add(el);\n },\n disable: () => {\n enabled.delete(el);\n },\n isEnabled: () => enabled.has(el),\n });\n}\n/**\n * The vue directive.\n */\nconst vAutoAnimate = {\n mounted: (el, binding) => {\n autoAnimate(el, binding.value || {});\n },\n // ignore ssr see #96:\n getSSRProps: () => ({}),\n};\n\nexport { autoAnimate as default, getTransitionSizes, vAutoAnimate };\n","import { useRef, useState, useEffect } from 'preact/hooks';\nimport autoAnimate from '../index.mjs';\n\n/**\n * AutoAnimate hook for adding dead-simple transitions and animations to preact.\n * @param options - Auto animate options or a plugin\n * @returns\n */\nfunction useAutoAnimate(options) {\n const element = useRef(null);\n const [controller, setController] = useState();\n const setEnabled = (enabled) => {\n if (controller) {\n enabled ? controller.enable() : controller.disable();\n }\n };\n useEffect(() => {\n if (element.current instanceof HTMLElement)\n setController(autoAnimate(element.current, options || {}));\n }, []);\n return [element, setEnabled];\n}\n\nexport { useAutoAnimate };\n","function dec2hex(dec) {\n return ('0' + dec.toString(16)).slice(-2);\n}\nexport function verifier() {\n var array = new Uint32Array(56 / 2);\n window.crypto.getRandomValues(array);\n return Array.from(array, dec2hex).join('');\n}\nfunction sha256(plain) {\n // returns promise ArrayBuffer\n const encoder = new TextEncoder();\n const data = encoder.encode(plain);\n return window.crypto.subtle.digest('SHA-256', data);\n}\nfunction base64urlencode(a) {\n let str = '';\n const bytes = new Uint8Array(a);\n const len = bytes.byteLength;\n for (var i = 0; i < len; i++) {\n str += String.fromCharCode(bytes[i]);\n }\n return btoa(str).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\nexport async function generateCodeChallenge(v) {\n const hashed = await sha256(v);\n return base64urlencode(hashed);\n}\n\n// If /.well-known/oauth-authorization-server exists and code_challenge_methods_supported includes \"S256\", means support PKCE\nexport async function supportsPKCE({ instanceURL }) {\n if (!instanceURL) return false;\n try {\n const res = await fetch(\n `https://${instanceURL}/.well-known/oauth-authorization-server`,\n );\n if (!res.ok || res.status !== 200) return false;\n const json = await res.json();\n if (json.code_challenge_methods_supported?.includes('S256')) return true;\n return false;\n } catch (e) {\n return false;\n }\n}\n\n// For debugging\nwindow.__generateCodeChallenge = generateCodeChallenge;\n","import { generateCodeChallenge, verifier } from './oauth-pkce';\n\nconst {\n DEV,\n PHANPY_CLIENT_NAME: CLIENT_NAME,\n PHANPY_WEBSITE: WEBSITE,\n} = import.meta.env;\n\nconst SCOPES = 'read write follow push';\n\n/*\n PHANPY_WEBSITE is set to the default official site.\n It's used in pre-built releases, so there's no way to change it dynamically\n without rebuilding.\n Therefore, we can't use it as redirect_uri.\n We only use PHANPY_WEBSITE if it's \"same\" as current location URL.\n \n Very basic check based on location.hostname for now\n*/\nconst sameSite = WEBSITE\n ? WEBSITE.toLowerCase().includes(location.hostname)\n : false;\nconst currentLocation = location.origin + location.pathname;\nconst REDIRECT_URI = DEV || !sameSite ? currentLocation : WEBSITE;\n\nexport async function registerApplication({ instanceURL }) {\n const registrationParams = new URLSearchParams({\n client_name: CLIENT_NAME,\n redirect_uris: REDIRECT_URI,\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 getPKCEAuthorizationURL({\n instanceURL,\n client_id,\n forceLogin = false,\n}) {\n const codeVerifier = verifier();\n const codeChallenge = await generateCodeChallenge(codeVerifier);\n const params = new URLSearchParams({\n client_id,\n code_challenge_method: 'S256',\n code_challenge: codeChallenge,\n redirect_uri: REDIRECT_URI,\n response_type: 'code',\n scope: SCOPES,\n });\n if (forceLogin) params.append('force_login', true);\n const authorizationURL = `https://${instanceURL}/oauth/authorize?${params.toString()}`;\n return [authorizationURL, codeVerifier];\n}\n\nexport async function getAuthorizationURL({\n instanceURL,\n client_id,\n forceLogin = false,\n}) {\n const authorizationParams = new URLSearchParams({\n client_id,\n scope: SCOPES,\n redirect_uri: REDIRECT_URI,\n // redirect_uri: 'urn:ietf:wg:oauth:2.0:oob',\n response_type: 'code',\n });\n if (forceLogin) authorizationParams.append('force_login', true);\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 code_verifier,\n}) {\n const params = new URLSearchParams({\n client_id,\n redirect_uri: REDIRECT_URI,\n grant_type: 'authorization_code',\n code,\n // scope: SCOPES, // Not needed\n // client_secret,\n // code_verifier,\n });\n if (client_secret) {\n params.append('client_secret', client_secret);\n }\n if (code_verifier) {\n params.append('code_verifier', code_verifier);\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\nexport async function revokeAccessToken({\n instanceURL,\n client_id,\n client_secret,\n token,\n}) {\n try {\n const params = new URLSearchParams({\n client_id,\n client_secret,\n token,\n });\n\n const revokeResponse = await fetch(`https://${instanceURL}/oauth/revoke`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: params.toString(),\n keepalive: true,\n });\n\n return revokeResponse.ok;\n } catch (error) {\n console.erro('Error revoking token', error);\n return false;\n }\n}\n","import './accounts.css';\n\nimport { useAutoAnimate } from '@formkit/auto-animate/preact';\nimport { Trans, useLingui } from '@lingui/react/macro';\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 MenuConfirm from '../components/menu-confirm';\nimport MenuLink from '../components/menu-link';\nimport Menu2 from '../components/menu2';\nimport NameText from '../components/name-text';\nimport RelativeTime from '../components/relative-time';\nimport { api } from '../utils/api';\nimport { revokeAccessToken } from '../utils/auth';\nimport niceDateTime from '../utils/nice-date-time';\nimport states from '../utils/states';\nimport store from '../utils/store';\nimport {\n getAccounts,\n getCurrentAccountID,\n saveAccounts,\n setCurrentAccountID,\n} from '../utils/store-utils';\n\nconst isStandalone = window.matchMedia('(display-mode: standalone)').matches;\n\nfunction Accounts({ onClose }) {\n const { t } = useLingui();\n const { masto } = api();\n // Accounts\n const accounts = getAccounts();\n const currentAccount = getCurrentAccountID();\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\" alt={t`Close`} />\n </button>\n )}\n <header class=\"header-grid\">\n <h2>\n <Trans>Accounts</Trans>\n </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={t`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 saveAccounts(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 setCurrentAccountID(account.info.id);\n location.reload();\n }\n }}\n />\n </div>\n <div class=\"actions\">\n {isDefault && moreThanOneAccount && (\n <>\n <span class=\"tag\">\n <Trans>Default</Trans>\n </span>{' '}\n </>\n )}\n <Menu2\n align=\"end\"\n menuButton={\n <button type=\"button\" class=\"plain more-button\">\n <Icon icon=\"more\" size=\"l\" alt={t`More`} />\n </button>\n }\n >\n {moreThanOneAccount && (\n <>\n <MenuItem\n disabled={isCurrent}\n onClick={() => {\n setCurrentAccountID(account.info.id);\n location.reload();\n }}\n >\n <Icon icon=\"transfer\" />{' '}\n <Trans>Switch to this account</Trans>\n </MenuItem>\n {!isStandalone && !isCurrent && (\n <MenuLink\n href={`./?account=${account.info.id}`}\n target=\"_blank\"\n >\n <Icon icon=\"external\" />\n <span>\n <Trans>Switch in new tab/window</Trans>\n </span>\n </MenuLink>\n )}\n <MenuDivider />\n </>\n )}\n <MenuItem\n onClick={() => {\n states.showAccount = `${account.info.username}@${account.instanceURL}`;\n }}\n >\n <Icon icon=\"user\" />\n <span>\n <Trans>View profile…</Trans>\n </span>\n </MenuItem>\n <MenuDivider />\n {moreThanOneAccount && (\n <>\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 saveAccounts(accounts);\n reload();\n }}\n >\n <Icon icon=\"check-circle\" />\n <span>\n <Trans>Set as default</Trans>\n </span>\n </MenuItem>\n <MenuItem\n disabled={i <= 1}\n onClick={() => {\n // Move account one position up\n accounts.splice(i, 1);\n accounts.splice(i - 1, 0, account);\n saveAccounts(accounts);\n reload();\n }}\n >\n <Icon icon=\"arrow-up\" />\n <span>\n <Trans>Move up</Trans>\n </span>\n </MenuItem>\n <MenuItem\n disabled={i === 0 || i === accounts.length - 1}\n onClick={() => {\n // Move account one position down\n accounts.splice(i, 1);\n accounts.splice(i + 1, 0, account);\n saveAccounts(accounts);\n reload();\n }}\n >\n <Icon icon=\"arrow-down\" />\n <span>\n <Trans>Move down</Trans>\n </span>\n </MenuItem>\n <MenuDivider />\n </>\n )}\n <MenuConfirm\n subMenu\n confirmLabel={\n <>\n <Icon icon=\"exit\" />\n <span>\n <Trans>\n Log out{' '}\n <span class=\"bidi-isolate\">\n @{account.info.acct}\n </span>\n ?\n </Trans>\n </span>\n </>\n }\n disabled={!isCurrent}\n menuItemClassName=\"danger\"\n onClick={async () => {\n // const yes = confirm('Log out?');\n // if (!yes) return;\n await revokeAccessToken({\n instanceURL: account.instanceURL,\n client_id: account.clientId,\n client_secret: account.clientSecret,\n token: account.accessToken,\n });\n accounts.splice(i, 1);\n saveAccounts(accounts);\n // location.reload();\n location.href = location.pathname || '/';\n }}\n >\n <Icon icon=\"exit\" />\n <span>\n <Trans>Log out…</Trans>\n </span>\n </MenuConfirm>\n {!!account?.createdAt && (\n <div class=\"footer\">\n <Icon icon=\"account-add\" />\n <span>\n <Trans>\n Connected on {niceDateTime(account.createdAt)} (\n <RelativeTime datetime={account.createdAt} />)\n </Trans>\n </span>\n </div>\n )}\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\" />{' '}\n <span>\n <Trans>Add an existing account</Trans>\n </span>\n </Link>\n </p>\n {moreThanOneAccount && (\n <p>\n <small>\n <Trans>\n Note: <i>Default</i> account will always be used for first\n load. Switched accounts will persist during the session.\n </Trans>\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\"","import { useLingui } from '@lingui/react';\nimport { useMemo } from 'preact/hooks';\n\nimport { CATALOGS, DEFAULT_LANG, DEV_LOCALES, LOCALES } from '../locales';\nimport { activateLang } from '../utils/lang';\nimport localeCode2Text from '../utils/localeCode2Text';\nimport store from '../utils/store';\n\nconst regionMaps = {\n 'zh-CN': 'zh-Hans',\n 'zh-TW': 'zh-Hant',\n 'pt-BR': 'pt-BR',\n};\n\nexport default function LangSelector() {\n const { i18n } = useLingui();\n\n // Sorted on render, so the order won't suddenly change based on current locale\n const populatedLocales = useMemo(() => {\n return LOCALES.map((lang) => {\n // Don't need regions for now, it makes text too noisy\n // Wait till there's too many languages and there are regional clashes\n const regionlessCode = regionMaps[lang] || lang.replace(/-[a-z]+$/i, '');\n\n const native = localeCode2Text({\n code: regionlessCode,\n locale: lang,\n fallback: CATALOGS.find((c) => c.code === lang)?.nativeName,\n });\n\n // Not used when rendering because it'll change based on current locale\n // Only used for sorting on render\n const _common = localeCode2Text({\n code: regionlessCode,\n locale: i18n.locale,\n fallback: CATALOGS.find((c) => c.code === lang)?.name,\n });\n\n return {\n code: lang,\n regionlessCode,\n _common,\n native,\n };\n }).sort((a, b) => {\n // Sort by common name\n const order = a._common.localeCompare(b._common, i18n.locale);\n if (order !== 0) return order;\n // Sort by code (fallback)\n if (a.code < b.code) return -1;\n if (a.code > b.code) return 1;\n return 0;\n });\n }, []);\n\n return (\n <label class=\"lang-selector\">\n 🌐{' '}\n <select\n class=\"small\"\n value={i18n.locale || DEFAULT_LANG}\n onChange={(e) => {\n store.local.set('lang', e.target.value);\n activateLang(e.target.value);\n }}\n >\n {populatedLocales.map(({ code, regionlessCode, native }) => {\n // Common name changes based on current locale\n const common = localeCode2Text({\n code: regionlessCode,\n locale: i18n.locale,\n fallback: CATALOGS.find((c) => c.code === code)?.name,\n });\n const showCommon = !!common && common !== native;\n return (\n <option\n value={code}\n data-regionless-code={regionlessCode}\n key={code}\n >\n {showCommon ? `${native} - ${common}` : native}\n </option>\n );\n })}\n {(import.meta.env.DEV || import.meta.env.PHANPY_SHOW_DEV_LOCALES) && (\n <optgroup label=\"🚧 Development (<50% translated)\">\n {DEV_LOCALES.map((code) => {\n if (code === 'pseudo-LOCALE') {\n return (\n <>\n <hr />\n <option value={code} key={code}>\n Pseudolocalization (test)\n </option>\n </>\n );\n }\n const nativeName = CATALOGS.find(\n (c) => c.code === code,\n )?.nativeName;\n const completion = CATALOGS.find(\n (c) => c.code === code,\n )?.completion;\n return (\n <option value={code} key={code}>\n {nativeName || code} ‎[{completion}%]\n </option>\n );\n })}\n </optgroup>\n )}\n </select>\n </label>\n );\n}\n","// Utils for push notifications\nimport { api } from './api';\nimport { getVapidKey } 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 = getVapidKey();\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 = getVapidKey();\n if (vapidKey) {\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 } else {\n console.warn('No vapidKey found');\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 = getVapidKey();\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 { Plural, Trans, useLingui } from '@lingui/react/macro';\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 LangSelector from '../components/lang-selector';\nimport Link from '../components/link';\nimport RelativeTime from '../components/relative-time';\nimport languages from '../data/translang-languages';\nimport { api, getPreferences, setPreferences } from '../utils/api';\nimport getTranslateTargetLanguage from '../utils/get-translate-target-language';\nimport localeCode2Text from '../utils/localeCode2Text';\nimport prettyBytes from '../utils/pretty-bytes';\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';\nimport { getAPIVersions, getVapidKey } from '../utils/store-utils';\n\nconst DEFAULT_TEXT_SIZE = 16;\nconst TEXT_SIZES = [14, 15, 16, 17, 18, 19, 20];\nconst {\n PHANPY_WEBSITE: WEBSITE,\n PHANPY_PRIVACY_POLICY_URL: PRIVACY_POLICY_URL,\n PHANPY_TRANSLANG_INSTANCES: TRANSLANG_INSTANCES,\n PHANPY_IMG_ALT_API_URL: IMG_ALT_API_URL,\n PHANPY_GIPHY_API_KEY: GIPHY_API_KEY,\n} = import.meta.env;\n\nconst targetLanguages = Object.entries(languages.tl).map(([code, name]) => ({\n code,\n name,\n}));\n\nconst TRANSLATION_API_NAME = 'TransLang API';\n\nfunction Settings({ onClose }) {\n const { t } = useLingui();\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(getPreferences());\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 const [expTabBarV2, setExpTabBarV2] = useState(\n store.local.get('experiments-tabBarV2') ?? false,\n );\n\n return (\n <div\n id=\"settings-container\"\n class=\"sheet\"\n tabIndex=\"-1\"\n style={{\n '--current-text-size': `${currentTextSize}px`,\n }}\n >\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}\n <header>\n <h2>\n <Trans>Settings</Trans>\n </h2>\n </header>\n <main>\n <section>\n <ul>\n <li>\n <div>\n <label>\n <Trans>Appearance</Trans>\n </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>\n <Trans>Light</Trans>\n </span>\n </label>\n <label>\n <input\n type=\"radio\"\n name=\"theme\"\n value=\"dark\"\n defaultChecked={currentTheme === 'dark'}\n />\n <span>\n <Trans>Dark</Trans>\n </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>\n <Trans>Auto</Trans>\n </span>\n </label>\n </div>\n </form>\n </div>\n </li>\n <li>\n <div>\n <label>\n <Trans>Text size</Trans>\n </label>\n </div>\n <div class=\"range-group\">\n <span style={{ fontSize: TEXT_SIZES[0] }}>\n <Trans comment=\"Preview of one character, in smallest size\">\n A\n </Trans>\n </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 <Trans comment=\"Preview of one character, in largest size\">\n A\n </Trans>\n </span>\n <datalist id=\"sizes\">\n {TEXT_SIZES.map((size) => (\n <option value={size} />\n ))}\n </datalist>\n </div>\n </li>\n <li>\n <span>\n <label>\n <Trans>Display language</Trans>\n </label>\n <br />\n <small>\n <a\n href=\"https://crowdin.com/project/phanpy\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n <Trans>Volunteer translations</Trans>\n </a>\n </small>\n </span>\n <LangSelector />\n </li>\n </ul>\n </section>\n {authenticated && (\n <>\n <h3>\n <Trans>Posting</Trans>\n </h3>\n <section>\n <ul>\n <li>\n <div>\n <label for=\"posting-privacy-field\">\n <Trans>Default visibility</Trans>{' '}\n <Icon icon=\"cloud\" alt={t`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 setPreferences({\n ...prefs,\n 'posting:default:visibility': value,\n });\n } catch (e) {\n alert(t`Failed to update posting privacy`);\n console.error(e);\n }\n })();\n }}\n >\n <option value=\"public\">\n <Trans>Public</Trans>\n </option>\n <option value=\"unlisted\">\n <Trans>Unlisted</Trans>\n </option>\n <option value=\"private\">\n <Trans>Followers only</Trans>\n </option>\n </select>\n </div>\n </li>\n </ul>\n </section>\n <p class=\"section-postnote\">\n <Icon icon=\"cloud\" alt={t`Synced`} class=\"synced-icon\" />{' '}\n <small>\n <Trans>\n Synced to your instance server's settings.{' '}\n <a\n href={`https://${instance}/`}\n target=\"_blank\"\n rel=\"noopener\"\n >\n Go to your instance ({instance}) for more settings.\n </a>\n </Trans>\n </small>\n </p>\n </>\n )}\n <h3>\n <Trans>Experiments</Trans>\n </h3>\n <section>\n <ul>\n <li class=\"block\">\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 <Trans>Auto refresh timeline posts</Trans>\n </label>\n </li>\n <li class=\"block\">\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 <Trans>Boosts carousel</Trans>\n </label>\n </li>\n {!!TRANSLANG_INSTANCES && (\n <li class=\"block\">\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 <Trans>Post translation</Trans>\n </label>\n <div\n class={`sub-section ${\n !snapStates.settings.contentTranslation\n ? 'more-insignificant'\n : ''\n }`}\n >\n <div>\n <label>\n <Trans>Translate to </Trans>{' '}\n <select\n value={targetLanguage || ''}\n disabled={!snapStates.settings.contentTranslation}\n style={{ width: '10em' }}\n onChange={(e) => {\n states.settings.contentTranslationTargetLanguage =\n e.target.value || null;\n }}\n >\n <option value=\"\">\n <Trans>\n System language ({systemTargetLanguageText})\n </Trans>\n </option>\n <option disabled>──────────</option>\n {targetLanguages.map((lang) => {\n const common = localeCode2Text({\n code: lang.code,\n fallback: lang.name,\n });\n const native = localeCode2Text({\n code: lang.code,\n locale: lang.code,\n });\n const showCommon = native && common !== native;\n return (\n <option value={lang.code}>\n {showCommon ? `${native} - ${common}` : common}\n </option>\n );\n })}\n </select>\n </label>\n </div>\n <hr />\n <div class=\"checkbox-fieldset\">\n <Plural\n value={\n snapStates.settings.contentTranslationHideLanguages\n .length\n }\n _0={`Hide \"Translate\" button for:`}\n other={`Hide \"Translate\" button for (#):`}\n />\n <div class=\"checkbox-fields\">\n {targetLanguages.map((lang) => {\n const common = localeCode2Text({\n code: lang.code,\n fallback: lang.name,\n });\n const native = localeCode2Text({\n code: lang.code,\n locale: lang.code,\n });\n const showCommon = native && common !== native;\n return (\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 {showCommon ? (\n <span>\n {native}{' '}\n <span class=\"insignificant ib\">- {common}</span>\n </span>\n ) : (\n common\n )}\n </label>\n );\n })}\n </div>\n </div>\n <p class=\"insignificant\">\n <small>\n <Trans>\n Note: This feature uses external translation services,\n powered by{' '}\n <a\n href=\"https://github.com/cheeaun/translang-api\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n {TRANSLATION_API_NAME}\n </a>\n .\n </Trans>\n </small>\n </p>\n <hr />\n <div>\n <label>\n <input\n type=\"checkbox\"\n checked={\n snapStates.settings.contentTranslationAutoInline\n }\n disabled={!snapStates.settings.contentTranslation}\n onChange={(e) => {\n states.settings.contentTranslationAutoInline =\n e.target.checked;\n }}\n />{' '}\n <Trans>Auto inline translation</Trans>\n </label>\n <p class=\"insignificant\">\n <small>\n <Trans>\n Automatically show translation for posts in timeline.\n Only works for <b>short</b> posts without content\n warning, media and poll.\n </Trans>\n </small>\n </p>\n </div>\n </div>\n </li>\n )}\n {!!GIPHY_API_KEY && authenticated && (\n <li class=\"block\">\n <label>\n <input\n type=\"checkbox\"\n checked={snapStates.settings.composerGIFPicker}\n onChange={(e) => {\n states.settings.composerGIFPicker = e.target.checked;\n }}\n />{' '}\n <Trans>GIF Picker for composer</Trans>\n </label>\n <div class=\"sub-section insignificant\">\n <small>\n <Trans>\n Note: This feature uses external GIF search service,\n powered by{' '}\n <a\n href=\"https://developers.giphy.com/\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n GIPHY\n </a>\n . G-rated (suitable for viewing by all ages), tracking\n parameters are stripped, referrer information is omitted\n from requests, but search queries and IP address\n information will still reach their servers.\n </Trans>\n </small>\n </div>\n </li>\n )}\n {!!IMG_ALT_API_URL && authenticated && (\n <li class=\"block\">\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 <Trans>Image description generator</Trans>{' '}\n <Icon icon=\"sparkles2\" class=\"more-insignificant\" />\n </label>\n <div class=\"sub-section insignificant\">\n <small>\n <Trans>\n Only for new images while composing new posts.\n </Trans>\n </small>\n </div>\n <div class=\"sub-section insignificant\">\n <small>\n <Trans>\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\"\n >\n img-alt-api\n </a>\n . May not work well. Only for images and in English.\n </Trans>\n </small>\n </div>\n </li>\n )}\n {authenticated && getAPIVersions()?.mastodon >= 2 && (\n <li class=\"block\">\n <label>\n <input\n type=\"checkbox\"\n checked={snapStates.settings.groupedNotificationsAlpha}\n onChange={(e) => {\n states.settings.groupedNotificationsAlpha =\n e.target.checked;\n }}\n />{' '}\n <Trans>Server-side grouped notifications</Trans>\n </label>\n <div class=\"sub-section insignificant\">\n <small>\n <Trans>\n Alpha-stage feature. Potentially improved grouping window\n but basic grouping logic.\n </Trans>\n </small>\n </div>\n </li>\n )}\n {authenticated && (\n <li class=\"block\">\n <label>\n <input\n type=\"checkbox\"\n checked={\n snapStates.settings.shortcutSettingsCloudImportExport\n }\n onChange={(e) => {\n states.settings.shortcutSettingsCloudImportExport =\n e.target.checked;\n }}\n />{' '}\n <Trans>\"Cloud\" import/export for shortcuts settings</Trans>{' '}\n <Icon icon=\"cloud\" class=\"more-insignificant\" />\n </label>\n <div class=\"sub-section insignificant\">\n <small>\n <Trans>\n ⚠️⚠️⚠️ Very experimental.\n <br />\n Stored in your own profile’s notes. Profile (private)\n notes are mainly used for other profiles, and hidden for\n own profile.\n </Trans>\n </small>\n </div>\n <div class=\"sub-section insignificant\">\n <small>\n <Trans>\n Note: This feature uses currently-logged-in instance\n server API.\n </Trans>\n </small>\n </div>\n </li>\n )}\n <li class=\"block\">\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 <Trans>\n Cloak mode{' '}\n <span class=\"insignificant\">\n (<samp>Text</samp> → <samp>████</samp>)\n </span>\n </Trans>\n </label>\n <div class=\"sub-section insignificant\">\n <small>\n <Trans>\n Replace text as blocks, useful when taking screenshots, for\n privacy reasons.\n </Trans>\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 <Trans>Unsent drafts</Trans>\n </button>\n </li>\n )}\n </ul>\n </section>\n {authenticated && <PushNotificationsSection onClose={onClose} />}\n <h3>\n <Trans>About</Trans>\n </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\"\n onClick={(e) => {\n e.preventDefault();\n states.showAccount = 'phanpy@hachyderm.io';\n }}\n >\n @phanpy\n </a>\n <br />\n <Trans>\n <a\n href=\"https://github.com/cheeaun/phanpy\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n Built\n </a>{' '}\n by{' '}\n <a\n href=\"https://mastodon.social/@cheeaun\"\n // target=\"_blank\"\n rel=\"noopener\"\n onClick={(e) => {\n e.preventDefault();\n states.showAccount = 'cheeaun@mastodon.social';\n }}\n >\n @cheeaun\n </a>\n </Trans>\n </div>\n </div>\n <p>\n <a\n href=\"https://github.com/sponsors/cheeaun\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n <Trans>Sponsor</Trans>\n </a>{' '}\n ·{' '}\n <a\n href=\"https://www.buymeacoffee.com/cheeaun\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n <Trans>Donate</Trans>\n </a>{' '}\n ·{' '}\n <a\n href=\"https://patreon.com/cheeaun\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n Patreon\n </a>{' '}\n ·{' '}\n <a\n href=\"https://github.com/cheeaun/phanpy/blob/main/CHANGELOG.md\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n <Trans>What's new</Trans>\n </a>{' '}\n ·{' '}\n <a href={PRIVACY_POLICY_URL} target=\"_blank\" rel=\"noopener\">\n <Trans>Privacy Policy</Trans>\n </a>\n </p>\n {__BUILD_TIME__ && (\n <p>\n {WEBSITE && (\n <>\n <Trans>\n <span class=\"insignificant\">Site:</span>{' '}\n {WEBSITE.replace(/https?:\\/\\//g, '').replace(/\\/$/, '')}\n </Trans>\n <br />\n </>\n )}\n <Trans>\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(t`Version string copied`);\n } catch (e) {\n console.warn(e);\n showToast(t`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\"\n >\n <RelativeTime datetime={new Date(__BUILD_TIME__)} />\n </a>\n )\n </span>\n )}\n </Trans>\n </p>\n )}\n </section>\n {(import.meta.env.DEV || import.meta.env.PHANPY_DEV) && (\n <details class=\"debug-info\">\n <summary></summary>\n <p class=\"side\">\n <Link\n to=\"/_sandbox\"\n onClick={onClose}\n class=\"button plain6 small\"\n >\n Sandbox\n </Link>\n </p>\n <p>Debugging</p>\n <p>\n <b>Vapid key</b>: {getVapidKey()}\n </p>\n {__BENCH_RESULTS?.size > 0 && (\n <ul>\n {Array.from(__BENCH_RESULTS.entries()).map(\n ([name, duration]) => (\n <li>\n <b>{name}</b>: {duration}ms\n </li>\n ),\n )}\n </ul>\n )}\n <p>Service Worker Cache</p>\n <button\n type=\"button\"\n class=\"plain2 small\"\n onClick={async () => alert(await getCachesKeys())}\n >\n Show keys count\n </button>{' '}\n <button\n type=\"button\"\n class=\"plain2 small\"\n onClick={async () => alert(await getCachesSize())}\n >\n Show cache size\n </button>{' '}\n <button\n type=\"button\"\n class=\"plain2 small\"\n onClick={() => {\n const key = prompt('Enter cache key');\n if (!key) return;\n try {\n clearCacheKey(key);\n } catch (e) {\n alert(e);\n }\n }}\n >\n Clear cache key\n </button>{' '}\n <button\n type=\"button\"\n class=\"plain2 small\"\n onClick={() => {\n try {\n clearCaches();\n } catch (e) {\n alert(e);\n }\n }}\n >\n Clear all caches\n </button>\n <p>Temporary Experiments</p>\n <label>\n <input\n type=\"checkbox\"\n checked={expTabBarV2}\n onChange={(e) => {\n const { checked } = e.target;\n document.body.classList.toggle('exp-tab-bar-v2', checked);\n setExpTabBarV2(checked);\n if (checked) {\n store.local.set('experiments-tabBarV2', true);\n } else {\n store.local.del('experiments-tabBarV2');\n }\n }}\n />{' '}\n Tab bar v2\n </label>\n </details>\n )}\n </main>\n </div>\n );\n}\n\nasync function getCachesKeys() {\n const keys = await caches.keys();\n const total = {};\n for (const key of keys) {\n const cache = await caches.open(key);\n const k = await cache.keys();\n total[key] = k.length;\n }\n return total;\n}\n\nasync function getCachesSize() {\n const keys = await caches.keys();\n let total = {};\n let TOTAL = 0;\n for (const key of keys) {\n const cache = await caches.open(key);\n const k = await cache.keys();\n for (const item of k) {\n try {\n const response = await cache.match(item);\n const blob = await response.blob();\n total[key] = (total[key] || 0) + blob.size;\n TOTAL += blob.size;\n } catch (e) {\n alert('Failed to get cache size for ' + item);\n alert(e);\n }\n }\n }\n return {\n ...Object.fromEntries(\n Object.entries(total).map(([k, v]) => [k, prettyBytes(v)]),\n ),\n TOTAL: prettyBytes(TOTAL),\n };\n}\n\nfunction clearCacheKey(key) {\n return caches.delete(key);\n}\n\nasync function clearCaches() {\n const keys = await caches.keys();\n for (const key of keys) {\n await caches.delete(key);\n }\n}\n\nfunction PushNotificationsSection({ onClose }) {\n const { t } = useLingui();\n if (!isPushSupported()) return null;\n\n const { instance } = api();\n const [uiState, setUIState] = useState('default');\n const pushFormRef = useRef();\n const [allowNotifications, 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 console.log('backendSubscription', 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.entries(alerts).forEach(([alert, value]) => {\n const el = elements.namedItem(alert);\n if (el?.type === 'checkbox') {\n el.checked = !!value;\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 setTimeout(() => {\n const values = Object.fromEntries(new FormData(pushFormRef.current));\n const allowNotifications = !!values['policy-allow'];\n const params = {\n data: {\n policy: values.policy,\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 =\n previousPolicyRef.current !== params.data.policy;\n\n console.log('PN Form', {\n values,\n allowNotifications: allowNotifications,\n params,\n });\n\n if (allowNotifications && 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(t`Failed to update subscription. Please try again.`);\n });\n } else {\n updateSubscription(params).catch((err) => {\n console.warn(err);\n alert(t`Failed to update subscription. Please try again.`);\n });\n }\n } else {\n removeSubscription().catch((err) => {\n console.warn(err);\n alert(t`Failed to remove subscription. Please try again.`);\n });\n }\n }, 100);\n }}\n >\n <h3>\n <Trans>Push Notifications (beta)</Trans>\n </h3>\n <section>\n <ul>\n <li>\n <label>\n <input\n type=\"checkbox\"\n disabled={isLoading || needRelogin}\n name=\"policy-allow\"\n checked={allowNotifications}\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 t`Push notifications are blocked. Please enable them in your browser settings.`,\n );\n }\n }\n } else {\n setAllowNotifications(false);\n }\n }}\n />{' '}\n <Trans>\n Allow from{' '}\n <select\n name=\"policy\"\n disabled={isLoading || needRelogin || !allowNotifications}\n >\n {[\n {\n value: 'all',\n label: t`anyone`,\n },\n {\n value: 'followed',\n label: t`people I follow`,\n },\n {\n value: 'follower',\n label: t`followers`,\n },\n ].map((type) => (\n <option value={type.value}>{type.label}</option>\n ))}\n </select>\n </Trans>\n </label>\n <div\n class=\"shazam-container no-animation\"\n style={{\n width: '100%',\n }}\n hidden={!allowNotifications}\n >\n <div class=\"shazam-container-inner\">\n <div class=\"sub-section\">\n <ul>\n {[\n {\n value: 'mention',\n label: t`Mentions`,\n },\n {\n value: 'favourite',\n label: t`Likes`,\n },\n {\n value: 'reblog',\n label: t`Boosts`,\n },\n {\n value: 'follow',\n label: t`Follows`,\n },\n {\n value: 'followRequest',\n label: t`Follow requests`,\n },\n {\n value: 'poll',\n label: t`Polls`,\n },\n {\n value: 'update',\n label: t`Post edits`,\n },\n {\n value: 'status',\n label: t`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 <Trans>\n Push permission was not granted since your last login.\n You'll need to{' '}\n <Link to={`/login?instance=${instance}`} onClick={onClose}>\n <b>log in</b> again to grant push permission\n </Link>\n .\n </Trans>\n </p>\n </div>\n )}\n </li>\n </ul>\n </section>\n <p class=\"section-postnote\">\n <small>\n <Trans>\n NOTE: Push notifications only work for <b>one account</b>.\n </Trans>\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 focused column\n const focusedColumn = columns.querySelector('.deck-container.focus');\n if (focusedColumn) {\n focusedColumn.focus();\n } else {\n // Focus first column within viewport\n const firstVisibleColumn = Array.from(\n columns.querySelectorAll('.deck-container'),\n ).find((column) => {\n const columnRect = column.getBoundingClientRect();\n return columnRect.left >= 0;\n });\n if (firstVisibleColumn) {\n firstVisibleColumn.focus();\n } else {\n // Focus first column\n columns.querySelector('.deck-container')?.focus?.();\n }\n }\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 { api } from './api';\nimport pmem from './pmem';\nimport store from './store';\n\nconst FETCH_MAX_AGE = 1000 * 60; // 1 minute\nconst MAX_AGE = 24 * 60 * 60 * 1000; // 1 day\n\nexport const fetchLists = pmem(\n async () => {\n const { masto } = api();\n const lists = await masto.v1.lists.list();\n lists.sort((a, b) => a.title.localeCompare(b.title));\n\n if (lists.length) {\n setTimeout(() => {\n // Save to local storage, with saved timestamp\n store.account.set('lists', {\n lists,\n updatedAt: Date.now(),\n });\n }, 1);\n }\n\n return lists;\n },\n {\n maxAge: FETCH_MAX_AGE,\n },\n);\n\nexport async function getLists() {\n try {\n const { lists, updatedAt } = store.account.get('lists') || {};\n if (!lists?.length) return await fetchLists();\n if (Date.now() - updatedAt > MAX_AGE) {\n // Stale-while-revalidate\n fetchLists();\n return lists;\n }\n return lists;\n } catch (e) {\n return [];\n }\n}\n\nexport const fetchList = pmem(\n (id) => {\n const { masto } = api();\n return masto.v1.lists.$select(id).fetch();\n },\n {\n maxAge: FETCH_MAX_AGE,\n },\n);\n\nexport async function getList(id) {\n const { lists } = store.account.get('lists') || {};\n console.log({ lists });\n if (lists?.length) {\n const theList = lists.find((l) => l.id === id);\n if (theList) return theList;\n }\n try {\n return fetchList(id);\n } catch (e) {\n return null;\n }\n}\n\nexport async function getListTitle(id) {\n const list = await getList(id);\n return list?.title || '';\n}\n\nexport function addListStore(list) {\n const { lists } = store.account.get('lists') || {};\n if (lists?.length) {\n lists.push(list);\n lists.sort((a, b) => a.title.localeCompare(b.title));\n store.account.set('lists', {\n lists,\n updatedAt: Date.now(),\n });\n }\n}\n\nexport function updateListStore(list) {\n const { lists } = store.account.get('lists') || {};\n if (lists?.length) {\n const index = lists.findIndex((l) => l.id === list.id);\n if (index !== -1) {\n lists[index] = list;\n lists.sort((a, b) => a.title.localeCompare(b.title));\n store.account.set('lists', {\n lists,\n updatedAt: Date.now(),\n });\n }\n }\n}\n\nexport function deleteListStore(listID) {\n const { lists } = store.account.get('lists') || {};\n if (lists?.length) {\n const index = lists.findIndex((l) => l.id === listID);\n if (index !== -1) {\n lists.splice(index, 1);\n store.account.set('lists', {\n lists,\n updatedAt: Date.now(),\n });\n }\n }\n}\n","import './list-exclusive-badge.css';\n\nimport { useLingui } from '@lingui/react/macro';\n\nimport Icon from './icon';\n\nfunction ListExclusiveBadge({ insignificant }) {\n const { t } = useLingui();\n return (\n <Icon\n icon=\"filter\"\n size=\"xs\"\n class={`list-exclusive-badge ${insignificant ? 'insignificant' : ''}`}\n title={t`Posts on this list are hidden from Home/Following`}\n />\n );\n}\n\nexport default ListExclusiveBadge;\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { useEffect, useRef, useState } from 'preact/hooks';\n\nimport { api } from '../utils/api';\nimport { addListStore, deleteListStore, updateListStore } from '../utils/lists';\nimport supports from '../utils/supports';\n\nimport Icon from './icon';\nimport ListExclusiveBadge from './list-exclusive-badge';\nimport MenuConfirm from './menu-confirm';\n\nfunction ListAddEdit({ list, onClose }) {\n const { t } = useLingui();\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 =\n supports('@mastodon/list-exclusive') ||\n supports('@gotosocial/list-exclusive');\n\n return (\n <div class=\"sheet\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}{' '}\n <header>\n <h2>{editMode ? t`Edit list` : t`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\n setTimeout(() => {\n if (editMode) {\n updateListStore(listResult);\n } else {\n addListStore(listResult);\n }\n }, 1);\n } catch (e) {\n console.error(e);\n setUIState('error');\n alert(\n editMode\n ? t`Unable to edit list.`\n : t`Unable to create list.`,\n );\n }\n })();\n }}\n >\n <div class=\"list-form-row\">\n <label for=\"list-title\">\n <Trans>Name</Trans>{' '}\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\">\n <Trans>Show replies to list members</Trans>\n </option>\n <option value=\"followed\">\n <Trans>Show replies to people I follow</Trans>\n </option>\n <option value=\"none\">\n <Trans>Don't show replies</Trans>\n </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 <ListExclusiveBadge insignificant />{' '}\n <Trans>Hide posts on this list from Home/Following</Trans>\n </label>\n </div>\n )}\n <div class=\"list-form-footer\">\n <button type=\"submit\" disabled={uiState === 'loading'}>\n {editMode ? t`Save` : t`Create`}\n </button>\n {editMode && (\n <MenuConfirm\n disabled={uiState === 'loading'}\n align=\"end\"\n menuItemClassName=\"danger\"\n confirmLabel={t`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 setTimeout(() => {\n deleteListStore(list.id);\n }, 1);\n } catch (e) {\n console.error(e);\n setUIState('error');\n alert(t`Unable to delete list.`);\n }\n })();\n }}\n >\n <button\n type=\"button\"\n class=\"light danger\"\n disabled={uiState === 'loading'}\n >\n <Trans>Delete…</Trans>\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 { msg, plural } from '@lingui/core/macro';\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { MenuDivider, MenuItem } from '@szhsin/react-menu';\nimport {\n useCallback,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n useState,\n} from 'preact/hooks';\nimport punycode from 'punycode/';\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 i18nDuration from '../utils/i18n-duration';\nimport { getLists } from '../utils/lists';\nimport niceDateTime from '../utils/nice-date-time';\nimport pmem from '../utils/pmem';\nimport { fetchRelationships } from '../utils/relationships';\nimport shortenNumber from '../utils/shorten-number';\nimport showCompose from '../utils/show-compose';\nimport showToast from '../utils/show-toast';\nimport states from '../utils/states';\nimport store from '../utils/store';\nimport {\n getAccounts,\n getCurrentAccountID,\n saveAccounts,\n updateAccount,\n} from '../utils/store-utils';\nimport supports from '../utils/supports';\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 MenuConfirm from './menu-confirm';\nimport Menu2 from './menu2';\nimport Modal from './modal';\nimport SubMenu2 from './submenu2';\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 60 * 60 * 24 * 30, // 30 days\n 0, // forever\n];\nconst MUTE_DURATIONS_LABELS = {\n 0: msg`Forever`,\n 300: i18nDuration(5, 'minute'),\n 1_800: i18nDuration(30, 'minute'),\n 3_600: i18nDuration(1, 'hour'),\n 21_600: i18nDuration(6, 'hour'),\n 86_400: i18nDuration(1, 'day'),\n 259_200: i18nDuration(3, 'day'),\n 604_800: i18nDuration(1, 'week'),\n 2592_000: i18nDuration(30, 'day'),\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 .values()\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\nconst ENDORSEMENTS_LIMIT = 80;\n\nfunction AccountInfo({\n account,\n fetchAccount = () => {},\n standalone,\n instance,\n authenticated,\n showEndorsements = false,\n}) {\n const { i18n, t } = useLingui();\n const { masto, authenticated: currentAuthenticated } = 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 hideCollections,\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(() => id === getCurrentAccountID(), [id]);\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 = getAccounts();\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 saveAccounts(accounts);\n }\n }\n }, [isSelf, info, instance]);\n\n const accountInstance = useMemo(() => {\n if (!url) return null;\n const hostname = URL.parse(url)?.hostname;\n if (!hostname) return null;\n const domain = punycode.toUnicode(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\n .$select(id)\n .followers.list({\n limit: LIMIT,\n })\n .values();\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 let familiarFollowers = [];\n try {\n familiarFollowers = await masto.v1.accounts.familiarFollowers.fetch({\n id: [id],\n });\n } catch (e) {}\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\n .$select(id)\n .following.list({\n limit: LIMIT,\n })\n .values();\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 const onProfileUpdate = useCallback(\n (newAccount) => {\n if (newAccount.id === id) {\n console.log('Updated account info', newAccount);\n setInfo(newAccount);\n states.accounts[`${newAccount.id}@${instance}`] = newAccount;\n }\n },\n [id, instance],\n );\n\n const isStringURL = isString && account && /^https?:\\/\\//.test(account);\n\n const [showEditProfile, setShowEditProfile] = useState(false);\n\n const [renderEndorsements, setRenderEndorsements] = useState(false);\n\n return (\n <>\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>\n <Trans>Unable to load account.</Trans>\n </p>\n {isString ? (\n <p>\n {isStringURL ? (\n <a href={account} target=\"_blank\" rel=\"noopener\">\n {account}\n </a>\n ) : (\n <code class=\"insignificant\">{account}</code>\n )}\n </p>\n ) : (\n <p>\n <a href={url} target=\"_blank\" rel=\"noopener\">\n <Trans>Go to account page</Trans> <Icon icon=\"external\" />\n </a>\n </p>\n )}\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> <Trans>Followers</Trans>\n </div>\n <div>\n <span>██</span>{' '}\n <Trans id=\"following.stats\">Following</Trans>\n </div>\n <div>\n <span>██</span> <Trans>Posts</Trans>\n </div>\n </div>\n </div>\n <div class=\"actions\">\n <span />\n <span class=\"buttons\">\n <button type=\"button\" class=\"plain\" disabled>\n <Icon icon=\"more\" size=\"l\" alt={t`More`} />\n </button>\n </span>\n </div>\n </main>\n </>\n ) : (\n info && (\n <>\n {!!moved && (\n <div class=\"account-moved\">\n <p>\n <Trans>\n <b>{displayName}</b> has indicated that their new account\n is now:\n </Trans>\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 = window.OffscreenCanvas\n ? new OffscreenCanvas(1, 1)\n : 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.imageSmoothingEnabled = false;\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 {standalone ? (\n <Menu2\n shift={\n window.matchMedia('(min-width: calc(40em))').matches\n ? 114\n : 64\n }\n menuButton={\n <div>\n <AccountBlock\n account={info}\n instance={instance}\n avatarSize=\"xxxl\"\n onClick={() => {}}\n />\n </div>\n }\n >\n <div class=\"szh-menu__header\">\n <AccountHandleInfo acct={acct} instance={instance} />\n </div>\n <MenuItem\n onClick={() => {\n const handleWithInstance = acct.includes('@')\n ? `@${acct}`\n : `@${acct}@${instance}`;\n try {\n navigator.clipboard.writeText(handleWithInstance);\n showToast(t`Handle copied`);\n } catch (e) {\n console.error(e);\n showToast(t`Unable to copy handle`);\n }\n }}\n >\n <Icon icon=\"link\" />\n <span>\n <Trans>Copy handle</Trans>\n </span>\n </MenuItem>\n <MenuItem href={url} target=\"_blank\">\n <Icon icon=\"external\" />\n <span>\n <Trans>Go to original profile page</Trans>\n </span>\n </MenuItem>\n <MenuDivider />\n <MenuItem\n onClick={() => {\n states.showMediaModal = {\n mediaAttachments: [\n {\n type: 'image',\n url: avatarStatic,\n },\n ],\n };\n }}\n >\n <Icon icon=\"user\" />\n <span>\n <Trans>View profile image</Trans>\n </span>\n </MenuItem>\n {!!headerStatic && !headerIsAvatar && (\n <MenuItem\n onClick={() => {\n states.showMediaModal = {\n mediaAttachments: [\n {\n type: 'image',\n url: headerStatic,\n },\n ],\n };\n }}\n >\n <Icon icon=\"media\" />\n <span>\n <Trans>View profile header</Trans>\n </span>\n </MenuItem>\n )}\n {currentAuthenticated &&\n isSelf &&\n supports('@mastodon/profile-edit') && (\n <>\n <MenuDivider />\n <MenuItem\n onClick={() => {\n setShowEditProfile(true);\n }}\n >\n <Icon icon=\"pencil\" />\n <span>\n <Trans>Edit profile</Trans>\n </span>\n </MenuItem>\n </>\n )}\n </Menu2>\n ) : (\n <AccountBlock\n account={info}\n instance={instance}\n avatarSize=\"xxxl\"\n internal\n />\n )}\n </header>\n <div class=\"faux-header-bg\" aria-hidden=\"true\" />\n <main>\n {!!memorial && (\n <span class=\"tag\">\n <Trans>In Memoriam</Trans>\n </span>\n )}\n {!!bot && (\n <span class=\"tag\">\n <Icon icon=\"bot\" /> <Trans>Automated</Trans>\n </span>\n )}\n {!!group && (\n <span class=\"tag\">\n <Icon icon=\"group\" /> <Trans>Group</Trans>\n </span>\n )}\n {roles?.map((role) => (\n <span class=\"tag\">\n {role.name}\n {!!accountInstance && (\n <>\n {' '}\n <span class=\"more-insignificant\">\n {accountInstance}\n </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\n icon=\"check-circle\"\n size=\"s\"\n alt={t`Verified`}\n />\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 id: 'followers',\n heading: t`Followers`,\n fetchAccounts: fetchFollowers,\n instance,\n excludeRelationshipAttrs: isSelf\n ? ['followedBy']\n : [],\n blankCopy: hideCollections\n ? t`This user has chosen to not make this information available.`\n : undefined,\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 <Trans>Followers</Trans>\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: t({\n id: 'following.stats',\n message: 'Following',\n }),\n fetchAccounts: fetchFollowing,\n instance,\n excludeRelationshipAttrs: isSelf\n ? ['following']\n : [],\n blankCopy: hideCollections\n ? t`This user has chosen to not make this information available.`\n : undefined,\n };\n }, 0);\n }}\n >\n <span title={followingCount}>\n {shortenNumber(followingCount)}\n </span>{' '}\n <Trans id=\"following.stats\">Following</Trans>\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 <Trans>Posts</Trans>\n </LinkOrDiv>\n {!!createdAt && (\n <div class=\"insignificant\">\n <Trans>\n Joined{' '}\n <time datetime={createdAt}>\n {niceDateTime(createdAt, {\n hideTime: true,\n })}\n </time>\n </Trans>\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={t`${(\n postingStats.originals / postingStats.total\n ).toLocaleString(i18n.locale || undefined, {\n style: 'percent',\n })} original posts, ${(\n postingStats.replies / postingStats.total\n ).toLocaleString(i18n.locale || undefined, {\n style: 'percent',\n })} replies, ${(\n postingStats.boosts / postingStats.total\n ).toLocaleString(i18n.locale || undefined, {\n style: 'percent',\n })} boosts`}\n >\n <div>\n {postingStats.daysSinceLastPost < 365\n ? plural(postingStats.total, {\n one: plural(\n postingStats.daysSinceLastPost,\n {\n one: `Last 1 post in the past 1 day`,\n other: `Last 1 post in the past ${postingStats.daysSinceLastPost} days`,\n },\n ),\n other: plural(\n postingStats.daysSinceLastPost,\n {\n one: `Last ${postingStats.total} posts in the past 1 day`,\n other: `Last ${postingStats.total} posts in the past ${postingStats.daysSinceLastPost} days`,\n },\n ),\n })\n : plural(postingStats.total, {\n one: 'Last 1 post in the past year(s)',\n other: `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 /\n 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 <Trans>Original</Trans>\n </span>{' '}\n <span class=\"ib\">\n <span class=\"posting-stats-legend-item posting-stats-legend-item-replies\" />{' '}\n <Trans>Replies</Trans>\n </span>{' '}\n <span class=\"ib\">\n <span class=\"posting-stats-legend-item posting-stats-legend-item-boosts\" />{' '}\n <Trans>Boosts</Trans>\n </span>\n </div>\n </div>\n ) : (\n <div class=\"posting-stats\">\n <Trans>Post stats unavailable.</Trans>\n </div>\n )}\n </div>\n </div>\n </LinkOrDiv>\n )}\n {!moved && (\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 <Trans>View post stats</Trans>{' '}\n {/* <Loader\n abrupt\n hidden={postingStatsUIState !== 'loading'}\n /> */}\n </button>\n </div>\n </div>\n </div>\n )}\n </main>\n <footer>\n <RelatedActions\n info={info}\n instance={instance}\n standalone={standalone}\n authenticated={authenticated}\n onRelationshipChange={onRelationshipChange}\n onProfileUpdate={onProfileUpdate}\n setShowEditProfile={setShowEditProfile}\n showEndorsements={showEndorsements}\n renderEndorsements={renderEndorsements}\n setRenderEndorsements={setRenderEndorsements}\n />\n </footer>\n <Endorsements\n accountID={id}\n info={info}\n open={renderEndorsements}\n onlyOpenIfHasEndorsements={\n renderEndorsements === 'onlyOpenIfHasEndorsements'\n }\n />\n </>\n )\n )}\n </div>\n {!!showEditProfile && (\n <Modal\n onClose={() => {\n setShowEditProfile(false);\n }}\n >\n <EditProfileSheet\n onClose={({ state, account } = {}) => {\n setShowEditProfile(false);\n if (state === 'success' && account) {\n onProfileUpdate(account);\n }\n }}\n />\n </Modal>\n )}\n </>\n );\n}\n\nconst FAMILIAR_FOLLOWERS_LIMIT = 3;\n\nfunction RelatedActions({\n info,\n instance,\n standalone,\n authenticated,\n onRelationshipChange = () => {},\n onProfileUpdate = () => {},\n setShowEditProfile = () => {},\n showEndorsements = false,\n renderEndorsements = false,\n setRenderEndorsements = () => {},\n}) {\n if (!info) return null;\n const { _, t } = useLingui();\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 const acctWithInstance = acct.includes('@') ? acct : `${acct}@${instance}`;\n\n const supportsEndorsements = supports('@mastodon/endorsements');\n\n useEffect(() => {\n if (info) {\n const currentAccount = getCurrentAccountID();\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.list({\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 const [lists, setLists] = useState([]);\n\n return (\n <>\n <div class=\"actions\">\n <span>\n {followedBy ? (\n <span class=\"tag\">\n <Trans>Follows you</Trans>\n </span>\n ) : !!lastStatusAt ? (\n <small class=\"insignificant\">\n <Trans>\n Last post:{' '}\n <span class=\"ib\">\n {niceDateTime(lastStatusAt, {\n hideTime: true,\n })}\n </span>\n </Trans>\n </small>\n ) : (\n <span />\n )}\n {muting && (\n <span class=\"tag danger\">\n <Trans>Muted</Trans>\n </span>\n )}\n {blocking && (\n <span class=\"tag danger\">\n <Trans>Blocked</Trans>\n </span>\n )}\n </span>{' '}\n <span class=\"buttons\">\n {!!privateNote && (\n <button\n type=\"button\"\n class=\"private-note-tag\"\n title={t`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 type=\"button\" class=\"plain\" disabled={loading}>\n <Icon icon=\"more\" size=\"l\" alt={t`More`} />\n </button>\n }\n onMenuChange={(e) => {\n if (following && e.open) {\n // Fetch lists that have this account\n (async () => {\n try {\n const lists = await currentMasto.v1.accounts\n .$select(accountID.current)\n .lists.list();\n console.log('fetched account lists', lists);\n setLists(lists);\n } catch (e) {\n console.error(e);\n }\n })();\n }\n }}\n >\n {currentAuthenticated && !isSelf ? (\n <>\n <MenuItem\n onClick={() => {\n showCompose({\n draftStatus: {\n status: `@${currentInfo?.acct || acct} `,\n },\n });\n }}\n >\n <Icon icon=\"at\" />\n <span>\n <Trans>\n Mention <span class=\"bidi-isolate\">@{username}</span>\n </Trans>\n </span>\n </MenuItem>\n <MenuItem\n onClick={() => {\n setShowTranslatedBio(true);\n }}\n >\n <Icon icon=\"translate\" />\n <span>\n <Trans>Translate bio</Trans>\n </span>\n </MenuItem>\n {supports('@mastodon/profile-private-note') && (\n <MenuItem\n onClick={() => {\n setShowPrivateNoteModal(true);\n }}\n >\n <Icon icon=\"pencil\" />\n <span>\n {privateNote ? t`Edit private note` : t`Add private note`}\n </span>\n </MenuItem>\n )}\n {following && !!relationship && (\n <>\n <MenuItem\n onClick={() => {\n setRelationshipUIState('loading');\n (async () => {\n try {\n const rel = await currentMasto.v1.accounts\n .$select(accountID.current)\n .follow({\n notify: !notifying,\n });\n if (rel) setRelationship(rel);\n setRelationshipUIState('default');\n showToast(\n rel.notifying\n ? t`Notifications enabled for @${username}'s posts.`\n : t` Notifications disabled for @${username}'s posts.`,\n );\n } catch (e) {\n alert(e);\n setRelationshipUIState('error');\n }\n })();\n }}\n >\n <Icon icon=\"notification\" />\n <span>\n {notifying\n ? t`Disable notifications`\n : t`Enable notifications`}\n </span>\n </MenuItem>\n <MenuItem\n onClick={() => {\n setRelationshipUIState('loading');\n (async () => {\n try {\n const rel = await currentMasto.v1.accounts\n .$select(accountID.current)\n .follow({\n reblogs: !showingReblogs,\n });\n if (rel) setRelationship(rel);\n setRelationshipUIState('default');\n showToast(\n rel.showingReblogs\n ? t`Boosts from @${username} enabled.`\n : t`Boosts from @${username} disabled.`,\n );\n } catch (e) {\n alert(e);\n setRelationshipUIState('error');\n }\n })();\n }}\n >\n <Icon icon=\"rocket\" />\n <span>\n {showingReblogs ? t`Disable boosts` : t`Enable boosts`}\n </span>\n </MenuItem>\n </>\n )}\n {supportsEndorsements && following && (\n <MenuItem\n onClick={() => {\n setRelationshipUIState('loading');\n (async () => {\n try {\n if (endorsed) {\n const newRelationship =\n await currentMasto.v1.accounts\n .$select(currentInfo?.id || id)\n .unpin();\n setRelationship(newRelationship);\n setRelationshipUIState('default');\n showToast(\n t`@${username} is no longer featured on your profile.`,\n );\n } else {\n const newRelationship =\n await currentMasto.v1.accounts\n .$select(currentInfo?.id || id)\n .pin();\n setRelationship(newRelationship);\n setRelationshipUIState('default');\n showToast(\n t`@${username} is now featured on your profile.`,\n );\n }\n } catch (e) {\n console.error(e);\n setRelationshipUIState('error');\n if (endorsed) {\n showToast(\n t`Unable to unfeature @${username} on your profile.`,\n );\n } else {\n showToast(\n t`Unable to feature @${username} on your profile.`,\n );\n }\n }\n })();\n }}\n >\n <Icon icon=\"endorsement\" />\n {endorsed\n ? t`Don't feature on profile`\n : t`Feature on profile`}\n </MenuItem>\n )}\n {showEndorsements &&\n supportsEndorsements &&\n !renderEndorsements && (\n <MenuItem onClick={() => setRenderEndorsements(true)}>\n <Icon icon=\"endorsement\" />\n <span>\n <Trans>Show featured profiles</Trans>\n </span>\n </MenuItem>\n )}\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 {lists.length ? (\n <>\n <small class=\"menu-grow\">\n <Trans>Add/Remove from Lists</Trans>\n <br />\n <span class=\"more-insignificant\">\n {lists.map((list) => list.title).join(', ')}\n </span>\n </small>\n <small class=\"more-insignificant\">{lists.length}</small>\n </>\n ) : (\n <span>\n <Trans>Add/Remove from Lists</Trans>\n </span>\n )}\n </MenuItem>\n )}\n <MenuDivider />\n </>\n ) : (\n supportsEndorsements &&\n !renderEndorsements && (\n <>\n <MenuItem onClick={() => setRenderEndorsements(true)}>\n <Icon icon=\"endorsement\" />\n Show featured profiles\n </MenuItem>\n <MenuDivider />\n </>\n )\n )}\n <MenuItem\n onClick={() => {\n const handle = `@${currentInfo?.acct || acctWithInstance}`;\n try {\n navigator.clipboard.writeText(handle);\n showToast(t`Handle copied`);\n } catch (e) {\n console.error(e);\n showToast(t`Unable to copy handle`);\n }\n }}\n >\n <Icon icon=\"copy\" />\n <small>\n <Trans>Copy handle</Trans>\n <br />\n <span class=\"more-insignificant bidi-isolate\">\n @{currentInfo?.acct || acctWithInstance}\n </span>\n </small>\n </MenuItem>\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(t`Link copied`);\n } catch (e) {\n console.error(e);\n showToast(t`Unable to copy link`);\n }\n }}\n >\n <Icon icon=\"link\" />\n <span>\n <Trans>Copy</Trans>\n </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(t`Sharing doesn't seem to work.`);\n }\n }}\n >\n <Icon icon=\"share\" />\n <span>\n <Trans>Share…</Trans>\n </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(t`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>\n <Trans>\n Unmute <span class=\"bidi-isolate\">@{username}</span>\n </Trans>\n </span>\n </MenuItem>\n ) : (\n <SubMenu2\n menuClassName=\"menu-blur\"\n openTrigger=\"clickOnly\"\n direction=\"bottom\"\n overflow=\"auto\"\n shift={16}\n label={\n <>\n <Icon icon=\"mute\" />\n <span class=\"menu-grow\">\n <Trans>\n Mute <span class=\"bidi-isolate\">@{username}</span>…\n </Trans>\n </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 t`Muted @${username} for ${\n typeof MUTE_DURATIONS_LABELS[duration] ===\n 'function'\n ? MUTE_DURATIONS_LABELS[duration]()\n : _(MUTE_DURATIONS_LABELS[duration])\n }`,\n );\n states.reloadGenericAccounts.id = 'mute';\n states.reloadGenericAccounts.counter++;\n } catch (e) {\n console.error(e);\n setRelationshipUIState('error');\n showToast(t`Unable to mute @${username}`);\n }\n })();\n }}\n >\n {typeof MUTE_DURATIONS_LABELS[duration] === 'function'\n ? MUTE_DURATIONS_LABELS[duration]()\n : _(MUTE_DURATIONS_LABELS[duration])}\n </MenuItem>\n ))}\n </div>\n </SubMenu2>\n )}\n {followedBy && (\n <MenuConfirm\n subMenu\n menuItemClassName=\"danger\"\n confirmLabel={\n <>\n <Icon icon=\"user-x\" />\n <span>\n <Trans>\n Remove <span class=\"bidi-isolate\">@{username}</span>{' '}\n from followers?\n </Trans>\n </span>\n </>\n }\n onClick={() => {\n setRelationshipUIState('loading');\n (async () => {\n try {\n const newRelationship = await currentMasto.v1.accounts\n .$select(currentInfo?.id || id)\n .removeFromFollowers();\n console.log(\n 'removing from followers',\n newRelationship,\n );\n setRelationship(newRelationship);\n setRelationshipUIState('default');\n showToast(t`@${username} removed from followers`);\n states.reloadGenericAccounts.id = 'followers';\n states.reloadGenericAccounts.counter++;\n } catch (e) {\n console.error(e);\n setRelationshipUIState('error');\n }\n })();\n }}\n >\n <Icon icon=\"user-x\" />\n <span>\n <Trans>Remove follower…</Trans>\n </span>\n </MenuConfirm>\n )}\n <MenuConfirm\n subMenu\n confirm={!blocking}\n confirmLabel={\n <>\n <Icon icon=\"block\" />\n <span>\n <Trans>\n Block <span class=\"bidi-isolate\">@{username}</span>?\n </Trans>\n </span>\n </>\n }\n itemProps={{\n className: 'danger',\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(t`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(t`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(t`Unable to unblock @${username}`);\n } else {\n showToast(t`Unable to block @${username}`);\n }\n }\n })();\n }}\n >\n {blocking ? (\n <>\n <Icon icon=\"unblock\" />\n <span>\n <Trans>\n Unblock <span class=\"bidi-isolate\">@{username}</span>\n </Trans>\n </span>\n </>\n ) : (\n <>\n <Icon icon=\"block\" />\n <span>\n <Trans>\n Block <span class=\"bidi-isolate\">@{username}</span>…\n </Trans>\n </span>\n </>\n )}\n </MenuConfirm>\n <MenuItem\n className=\"danger\"\n onClick={() => {\n states.showReportModal = {\n account: currentInfo || info,\n };\n }}\n >\n <Icon icon=\"flag\" />\n <span>\n <Trans>\n Report <span class=\"bidi-isolate\">@{username}</span>…\n </Trans>\n </span>\n </MenuItem>\n </>\n )}\n {currentAuthenticated &&\n isSelf &&\n standalone &&\n supports('@mastodon/profile-edit') && (\n <>\n <MenuDivider />\n <MenuItem\n onClick={() => {\n setShowEditProfile(true);\n }}\n >\n <Icon icon=\"pencil\" />\n <span>\n <Trans>Edit profile</Trans>\n </span>\n </MenuItem>\n </>\n )}\n {import.meta.env.DEV && currentAuthenticated && isSelf && (\n <>\n <MenuDivider />\n <MenuItem\n onClick={async () => {\n const relationships =\n await currentMasto.v1.accounts.relationships.fetch({\n id: [accountID.current],\n });\n const { note } = relationships[0] || {};\n if (note) {\n alert(note);\n console.log(note);\n }\n }}\n >\n <Icon icon=\"pencil\" />\n <span>See note</span>\n </MenuItem>\n </>\n )}\n </Menu2>\n {!relationship && relationshipUIState === 'loading' && (\n <Loader abrupt />\n )}\n {!!relationship && !moved && (\n <MenuConfirm\n confirm={following || requested}\n confirmLabel={\n <span>\n {requested\n ? t`Withdraw follow request?`\n : t`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) {\n setRelationship(newRelationship);\n\n // Show endorsements if start following\n if (newRelationship.following) {\n setRenderEndorsements('onlyOpenIfHasEndorsements');\n }\n }\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>\n <Trans>Following</Trans>\n </span>\n <span>\n <Trans>Unfollow…</Trans>\n </span>\n </>\n ) : requested ? (\n <>\n <span>\n <Trans>Requested</Trans>\n </span>\n <span>\n <Trans>Withdraw…</Trans>\n </span>\n </>\n ) : locked ? (\n <>\n <Icon icon=\"lock\" />{' '}\n <span>\n <Trans>Follow</Trans>\n </span>\n </>\n ) : (\n t`Follow`\n )}\n </button>\n </MenuConfirm>\n )}\n </span>\n </div>\n {!!showTranslatedBio && (\n <Modal\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 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 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 = URL.parse(url);\n if (!urlObj) return;\n const { host, pathname } = urlObj;\n const path = pathname.replace(/\\/$/, '').replace(/^\\//, '');\n return (\n <>\n <span class=\"more-insignificant\">{punycode.toUnicode(host)}/</span>\n <wbr />\n <span>{path}</span>\n </>\n );\n}\n\nfunction TranslatedBioSheet({ note, fields, onClose }) {\n const { t } = useLingui();\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\" alt={t`Close`} />\n </button>\n )}\n <header>\n <h2>\n <Trans>Translated Bio</Trans>\n </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 { t } = useLingui();\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 getLists();\n setLists(lists);\n const listsContainingAccount = await masto.v1.accounts\n .$select(accountID)\n .lists.list();\n console.log({ lists, listsContainingAccount });\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\" alt={t`Close`} />\n </button>\n )}\n <header>\n <h2>\n <Trans>Add/Remove from Lists</Trans>\n </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 ? t`Unable to remove from list.`\n : t`Unable to add to list.`,\n );\n }\n })();\n }}\n >\n <Icon icon=\"check-circle\" alt=\"☑️\" />\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\">\n <Trans>Unable to load lists.</Trans>\n </p>\n ) : (\n <p class=\"ui-state\">\n <Trans>No lists.</Trans>\n </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\" />{' '}\n <span>\n <Trans>New list</Trans>\n </span>\n </button>\n </main>\n {showListAddEditModal && (\n <Modal\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 { t } = useLingui();\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\" alt={t`Close`} />\n </button>\n )}\n <header>\n <b>\n <Trans>\n Private note about{' '}\n <span class=\"bidi-isolate\">\n @{account?.username || account?.acct}\n </span>\n </Trans>\n </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 || t`Unable to update private note.`);\n }\n })();\n }\n }}\n >\n <textarea\n ref={textareaRef}\n name=\"note\"\n disabled={uiState === 'loading'}\n dir=\"auto\"\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 <Trans>Cancel</Trans>\n </button>\n <span>\n <Loader abrupt hidden={uiState !== 'loading'} />\n <button disabled={uiState === 'loading'} type=\"submit\">\n <Trans>Save & close</Trans>\n </button>\n </span>\n </footer>\n </form>\n </main>\n </div>\n );\n}\n\nconst SUPPORTED_IMAGE_FORMATS = [\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n];\nconst SUPPORTED_IMAGE_FORMATS_STR = SUPPORTED_IMAGE_FORMATS.join(',');\n\nfunction EditProfileSheet({ onClose = () => {} }) {\n const { t } = useLingui();\n const { masto } = api();\n const [uiState, setUIState] = useState('loading');\n const [account, setAccount] = useState(null);\n const [headerPreview, setHeaderPreview] = useState(null);\n const [avatarPreview, setAvatarPreview] = useState(null);\n\n useEffect(() => {\n (async () => {\n try {\n const acc = await masto.v1.accounts.verifyCredentials();\n setAccount(acc);\n setUIState('default');\n } catch (e) {\n console.error(e);\n setUIState('error');\n }\n })();\n }, []);\n\n console.log('EditProfileSheet', account);\n const { displayName, source, avatar, header } = account || {};\n const { note, fields } = source || {};\n const fieldsAttributesRef = useRef(null);\n\n const avatarMediaAttachments = [\n ...(avatar ? [{ type: 'image', url: avatar }] : []),\n ...(avatarPreview ? [{ type: 'image', url: avatarPreview }] : []),\n ];\n const headerMediaAttachments = [\n ...(header ? [{ type: 'image', url: header }] : []),\n ...(headerPreview ? [{ type: 'image', url: headerPreview }] : []),\n ];\n\n return (\n <div class=\"sheet\" id=\"edit-profile-container\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}\n <header>\n <b>\n <Trans>Edit profile</Trans>\n </b>\n </header>\n <main>\n {uiState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n ) : (\n <form\n onSubmit={(e) => {\n e.preventDefault();\n const formData = new FormData(e.target);\n const header = formData.get('header');\n const avatar = formData.get('avatar');\n const displayName = formData.get('display_name');\n const note = formData.get('note');\n const fieldsAttributesFields =\n fieldsAttributesRef.current.querySelectorAll(\n 'input[name^=\"fields_attributes\"]',\n );\n const fieldsAttributes = [];\n fieldsAttributesFields.forEach((field) => {\n const name = field.name;\n const [_, index, key] =\n name.match(/fields_attributes\\[(\\d+)\\]\\[(.+)\\]/) || [];\n const value = field.value ? field.value.trim() : '';\n if (index && key && value) {\n if (!fieldsAttributes[index]) fieldsAttributes[index] = {};\n fieldsAttributes[index][key] = value;\n }\n });\n // Fill in the blanks\n fieldsAttributes.forEach((field) => {\n if (field.name && !field.value) {\n field.value = '';\n }\n });\n\n (async () => {\n try {\n const newAccount = await masto.v1.accounts.updateCredentials({\n header,\n avatar,\n displayName,\n note,\n fieldsAttributes,\n });\n console.log('updated account', newAccount);\n onClose?.({\n state: 'success',\n account: newAccount,\n });\n } catch (e) {\n console.error(e);\n alert(e?.message || t`Unable to update profile.`);\n }\n })();\n }}\n >\n <div class=\"edit-profile-media-container\">\n <label>\n <Trans>Header picture</Trans>{' '}\n <input\n type=\"file\"\n name=\"header\"\n accept={SUPPORTED_IMAGE_FORMATS_STR}\n onChange={(e) => {\n const file = e.target.files[0];\n if (file) {\n const blob = URL.createObjectURL(file);\n setHeaderPreview(blob);\n }\n }}\n />\n </label>\n <div class=\"edit-profile-media-field\">\n {header ? (\n <div\n class=\"edit-media\"\n tabIndex=\"0\"\n onClick={() => {\n states.showMediaModal = {\n mediaAttachments: headerMediaAttachments,\n mediaIndex: 0,\n };\n }}\n >\n <img src={header} alt=\"\" />\n </div>\n ) : (\n <div class=\"edit-media\"></div>\n )}\n {headerPreview && (\n <>\n <Icon icon=\"arrow-right\" />\n <div\n class=\"edit-media\"\n tabIndex=\"0\"\n onClick={() => {\n states.showMediaModal = {\n mediaAttachments: headerMediaAttachments,\n mediaIndex: 1,\n };\n }}\n >\n <img src={headerPreview} alt=\"\" />\n </div>\n </>\n )}\n </div>\n </div>\n <div class=\"edit-profile-media-container\">\n <label>\n <Trans>Profile picture</Trans>{' '}\n <input\n type=\"file\"\n name=\"avatar\"\n accept={SUPPORTED_IMAGE_FORMATS_STR}\n onChange={(e) => {\n const file = e.target.files[0];\n if (file) {\n const blob = URL.createObjectURL(file);\n setAvatarPreview(blob);\n }\n }}\n />\n </label>\n <div class=\"edit-profile-media-field\">\n {avatar ? (\n <div\n class=\"edit-media\"\n tabIndex=\"0\"\n onClick={() => {\n states.showMediaModal = {\n mediaAttachments: avatarMediaAttachments,\n mediaIndex: 0,\n };\n }}\n >\n <img src={avatar} alt=\"\" />\n </div>\n ) : (\n <div class=\"edit-media\"></div>\n )}\n {avatarPreview && (\n <>\n <Icon icon=\"arrow-right\" />\n <div\n class=\"edit-media\"\n tabIndex=\"0\"\n onClick={() => {\n states.showMediaModal = {\n mediaAttachments: avatarMediaAttachments,\n mediaIndex: 1,\n };\n }}\n >\n <img src={avatarPreview} alt=\"\" />\n </div>\n </>\n )}\n </div>\n </div>\n <p>\n <label>\n <Trans>Name</Trans>{' '}\n <input\n type=\"text\"\n name=\"display_name\"\n defaultValue={displayName}\n maxLength={30}\n disabled={uiState === 'loading'}\n dir=\"auto\"\n />\n </label>\n </p>\n <p>\n <label>\n <Trans>Bio</Trans>\n <textarea\n defaultValue={note}\n name=\"note\"\n maxLength={500}\n rows=\"5\"\n disabled={uiState === 'loading'}\n dir=\"auto\"\n />\n </label>\n </p>\n {/* Table for fields; name and values are in fields, min 4 rows */}\n <p>\n <Trans>Extra fields</Trans>\n </p>\n <table ref={fieldsAttributesRef}>\n <thead>\n <tr>\n <th>\n <Trans>Label</Trans>\n </th>\n <th>\n <Trans>Content</Trans>\n </th>\n </tr>\n </thead>\n <tbody>\n {Array.from({ length: Math.max(4, fields.length) }).map(\n (_, i) => {\n const { name = '', value = '' } = fields[i] || {};\n return (\n <FieldsAttributesRow\n key={i}\n name={name}\n value={value}\n index={i}\n disabled={uiState === 'loading'}\n />\n );\n },\n )}\n </tbody>\n </table>\n <footer>\n <button\n type=\"button\"\n class=\"light\"\n disabled={uiState === 'loading'}\n onClick={() => {\n onClose?.();\n }}\n >\n <Trans>Cancel</Trans>\n </button>\n <button type=\"submit\" disabled={uiState === 'loading'}>\n <Trans>Save</Trans>\n </button>\n </footer>\n </form>\n )}\n </main>\n </div>\n );\n}\n\nfunction FieldsAttributesRow({ name, value, disabled, index: i }) {\n const [hasValue, setHasValue] = useState(!!value);\n return (\n <tr>\n <td>\n <input\n type=\"text\"\n name={`fields_attributes[${i}][name]`}\n defaultValue={name}\n disabled={disabled}\n maxLength={255}\n required={hasValue}\n dir=\"auto\"\n />\n </td>\n <td>\n <input\n type=\"text\"\n name={`fields_attributes[${i}][value]`}\n defaultValue={value}\n disabled={disabled}\n maxLength={255}\n onChange={(e) => setHasValue(!!e.currentTarget.value)}\n dir=\"auto\"\n />\n </td>\n </tr>\n );\n}\n\nfunction AccountHandleInfo({ acct, instance }) {\n // acct = username or username@server\n let [username, server] = acct.split('@');\n if (!server) server = instance;\n const encodedAcct = punycode.toASCII(acct);\n return (\n <div class=\"handle-info\">\n <span class=\"handle-handle\" title={encodedAcct}>\n <b class=\"handle-username\">{username}</b>\n <span class=\"handle-at\">@</span>\n <b class=\"handle-server\">{server}</b>\n </span>\n <div class=\"handle-legend\">\n <span class=\"ib\">\n <span class=\"handle-legend-icon username\" /> <Trans>username</Trans>\n </span>{' '}\n <span class=\"ib\">\n <span class=\"handle-legend-icon server\" />{' '}\n <Trans>server domain name</Trans>\n </span>\n </div>\n </div>\n );\n}\n\nfunction Endorsements({\n accountID: id,\n info,\n open = false,\n onlyOpenIfHasEndorsements = false,\n}) {\n const { masto } = api();\n const endorsementsContainer = useRef();\n const [endorsementsUIState, setEndorsementsUIState] = useState('default');\n const [endorsements, setEndorsements] = useState([]);\n const [relationshipsMap, setRelationshipsMap] = useState({});\n useEffect(() => {\n if (!supports('@mastodon/endorsements')) return;\n if (!open) return;\n (async () => {\n setEndorsementsUIState('loading');\n try {\n const accounts = await masto.v1.accounts.$select(id).endorsements.list({\n limit: ENDORSEMENTS_LIMIT,\n });\n console.log({ endorsements: accounts });\n if (!accounts.length) {\n setEndorsementsUIState('default');\n return;\n }\n setEndorsements(accounts);\n setEndorsementsUIState('default');\n setTimeout(() => {\n endorsementsContainer.current.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n });\n }, 300);\n\n const relationships = await fetchRelationships(\n accounts,\n relationshipsMap,\n );\n if (relationships) {\n setRelationshipsMap(relationships);\n }\n } catch (e) {\n console.error(e);\n setEndorsementsUIState('error');\n }\n })();\n }, [open, id]);\n\n const reallyOpen = onlyOpenIfHasEndorsements\n ? open && endorsements.length > 0\n : open;\n\n if (!reallyOpen) return null;\n\n return (\n <div class=\"shazam-container\">\n <div class=\"shazam-container-inner\">\n <div class=\"endorsements-container\" ref={endorsementsContainer}>\n <h3>\n <Trans>Profiles featured by @{info.username}</Trans>\n </h3>\n {endorsementsUIState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n ) : endorsements.length > 0 ? (\n <ul\n class={`endorsements ${\n endorsements.length > 10 ? 'expanded' : ''\n }`}\n >\n {endorsements.map((account) => (\n <li>\n <AccountBlock\n key={account.id}\n account={account}\n showStats\n avatarSize=\"xxl\"\n relationship={relationshipsMap[account.id]}\n />\n </li>\n ))}\n </ul>\n ) : (\n <p class=\"ui-state insignificant\">\n <Trans>No featured profiles.</Trans>\n </p>\n )}\n </div>\n </div>\n </div>\n );\n}\n\nexport default AccountInfo;\n","import { useLingui } from '@lingui/react/macro';\nimport { 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 { t } = useLingui();\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\" alt={t`Close`} />\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.list({\n q: account,\n type: 'accounts',\n limit: authenticated ? 1 : 11, // Magic number\n resolve: authenticated,\n });\n if (result.accounts.length) {\n const accountWithSameString = result.accounts.find(\n (a) => a.url === account || account.startsWith(a.url),\n );\n if (accountWithSameString) {\n return accountWithSameString;\n }\n }\n if (/^https?:\\/\\/[^/]+\\/@[^/]+$/.test(account)) {\n const accountURL = URL.parse(account);\n if (accountURL) {\n const { hostname, pathname } = accountURL;\n const acct =\n pathname.replace(/^\\//, '').replace(/\\/$/, '') +\n '@' +\n hostname;\n const result = await masto.v2.search.list({\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 }\n } else {\n return account;\n }\n }}\n />\n </div>\n );\n}\n\nexport default AccountSheet;\n","import './drafts.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\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 { t } = useLingui();\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\" alt={t`Close`} />\n </button>\n )}\n <header>\n <h2>\n <Trans>Unsent drafts</Trans>{' '}\n <Loader abrupt hidden={uiState !== 'loading'} />\n </h2>\n {hasDrafts && (\n <div class=\"insignificant\">\n <Trans>\n Looks like you have unsent drafts. Let's continue where you left\n off.\n </Trans>\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 <span class=\"bidi-isolate\">\n @{replyTo.account.acct}\n </span>\n <br />\n </>\n )}\n {niceDateTime(updatedAtDate)}\n </time>\n </b>\n <MenuConfirm\n confirmLabel={\n <span>\n <Trans>Delete this draft?</Trans>\n </span>\n }\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(t`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 <Trans>Delete…</Trans>\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(t`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={\n <span>\n <Trans>Delete all drafts?</Trans>\n </span>\n }\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(t`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 <Trans>Delete all…</Trans>\n </button>\n </MenuConfirm>\n </p>\n )}\n </>\n ) : (\n <p>\n <Trans>No drafts found.</Trans>\n </p>\n )}\n </main>\n </div>\n );\n}\n\nfunction MiniDraft({ draft }) {\n const { t } = useLingui();\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\" alt={t`Poll`} />}\n {hasMedia && (\n <span>\n <Icon icon=\"attachment\" alt={t`Media`} />{' '}\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 './embed-modal.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\n\nimport Icon from './icon';\n\nfunction EmbedModal({ html, url, width, height, onClose = () => {} }) {\n const { t } = useLingui();\n return (\n <div class=\"embed-modal-container\">\n <div class=\"top-controls\">\n <button type=\"button\" class=\"light\" onClick={() => onClose()}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n {url && (\n <a href={url} target=\"_blank\" rel=\"noopener\" class=\"button plain\">\n <span>\n <Trans>Open in new window</Trans>\n </span>{' '}\n <Icon icon=\"external\" />\n </a>\n )}\n </div>\n <div\n class=\"embed-content\"\n dangerouslySetInnerHTML={{ __html: html }}\n style={{\n '--width': width + 'px',\n '--height': height + 'px',\n '--aspect-ratio': `${width}/${height}`,\n }}\n />\n </div>\n );\n}\n\nexport default EmbedModal;\n","import './generic-accounts.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\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 Link from './link';\nimport Loader from './loader';\nimport Status from './status';\n\nexport default function GenericAccounts({\n instance,\n excludeRelationshipAttrs = [],\n postID,\n onClose = () => {},\n blankCopy,\n}) {\n const { t } = useLingui();\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 [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 [accounts, setAccounts] = useState(\n staticAccounts?.length ? staticAccounts : [],\n );\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 && !accounts?.length) 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 (accounts?.length > 0) {\n // setAccounts(staticAccounts);\n if (fetchAccounts) {\n loadAccounts(true);\n firstLoad.current = false;\n } else {\n loadRelationships(accounts);\n }\n } else {\n loadAccounts(true);\n firstLoad.current = false;\n }\n }, [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 const post = states.statuses[postID];\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\" alt={t`Close`} />\n </button>\n <header>\n <h2>{heading || t`Accounts`}</h2>\n </header>\n <main>\n {post && (\n <Link\n to={`/${instance || currentInstance}/s/${post.id}`}\n class=\"post-preview\"\n >\n <Status status={post} size=\"s\" readOnly />\n </Link>\n )}\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 <Trans>Show more…</Trans>\n </button>\n </InView>\n ) : (\n <p class=\"ui-state insignificant\">\n <Trans>The end.</Trans>\n </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\">\n <Trans>Error loading accounts</Trans>\n </p>\n ) : (\n <p class=\"ui-state insignificant\">\n {blankCopy || t`Nothing to show`}\n </p>\n )}\n </main>\n </div>\n );\n}\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { Menu, MenuItem } from '@szhsin/react-menu';\nimport { useEffect, 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\nconst FORCE_TRANSLATE_LIMIT = 140;\n\nexport default function MediaAltModal({ alt, lang, onClose }) {\n const { t } = useLingui();\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 useEffect(() => {\n const isShortAlt = alt?.length > 0 && alt?.length <= FORCE_TRANSLATE_LIMIT;\n if (differentLanguage && isShortAlt) {\n setForceTranslate(true);\n }\n }, [differentLanguage, alt]);\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\" alt={t`Close`} />\n </button>\n )}\n <header class=\"header-grid\">\n <h2>\n <Trans>Media description</Trans>\n </h2>\n <div class=\"header-side\">\n <Menu2\n align=\"end\"\n menuButton={\n <button type=\"button\" class=\"plain4\">\n <Icon icon=\"more\" alt={t`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>\n <Trans>Translate</Trans>\n </span>\n </MenuItem>\n {supportsTTS && (\n <MenuItem\n onClick={() => {\n speak(alt, lang);\n }}\n >\n <Icon icon=\"speak\" />\n <span>\n <Trans>Speak</Trans>\n </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","const { min, max } = Math;\n\nexport default (x, low = 0, high = 1) => {\n return min(max(low, x), high);\n};\n","// ported from jQuery's $.type\nconst classToType = {};\nfor (let name of [\n 'Boolean',\n 'Number',\n 'String',\n 'Function',\n 'Array',\n 'Date',\n 'RegExp',\n 'Undefined',\n 'Null'\n]) {\n classToType[`[object ${name}]`] = name.toLowerCase();\n}\nexport default function (obj) {\n return classToType[Object.prototype.toString.call(obj)] || 'object';\n}\n","import type from './type.js';\n\nexport default (args, keyOrder = null) => {\n // if called with more than 3 arguments, we return the arguments\n if (args.length >= 3) return Array.prototype.slice.call(args);\n // with less than 3 args we check if first arg is object\n // and use the keyOrder string to extract and sort properties\n if (type(args[0]) == 'object' && keyOrder) {\n return keyOrder\n .split('')\n .filter((k) => args[0][k] !== undefined)\n .map((k) => args[0][k]);\n }\n // otherwise we just return the first argument\n // (which we suppose is an array of args)\n return args[0].slice(0);\n};\n","const { PI, min, max } = Math;\n\nconst rnd2 = (a) => Math.round(a * 100) / 100;\nconst rnd3 = (a) => Math.round(a * 100) / 100;\n\nexport { default as clip_rgb } from './clip_rgb.js';\nexport { default as limit } from './limit.js';\nexport { default as type } from './type.js';\nexport { default as unpack } from './unpack.js';\nexport { default as last } from './last.js';\n\nconst TWOPI = PI * 2;\nconst PITHIRD = PI / 3;\nconst DEG2RAD = PI / 180;\nconst RAD2DEG = 180 / PI;\n\n/**\n * Reverse the first three elements of an array\n *\n * @param {any[]} arr\n * @returns {any[]}\n */\nfunction reverse3(arr) {\n return [...arr.slice(0, 3).reverse(), ...arr.slice(3)];\n}\n\nexport { PI, TWOPI, PITHIRD, DEG2RAD, RAD2DEG, min, max, rnd2, rnd3, reverse3 };\n","// from https://www.w3.org/TR/css-color-4/multiply-matrices.js\nexport default function multiplyMatrices(A, B) {\n let m = A.length;\n\n if (!Array.isArray(A[0])) {\n // A is vector, convert to [[a, b, c, ...]]\n A = [A];\n }\n\n if (!Array.isArray(B[0])) {\n // B is vector, convert to [[a], [b], [c], ...]]\n B = B.map((x) => [x]);\n }\n\n let p = B[0].length;\n let B_cols = B[0].map((_, i) => B.map((x) => x[i])); // transpose B\n let product = A.map((row) =>\n B_cols.map((col) => {\n if (!Array.isArray(row)) {\n return col.reduce((a, c) => a + c * row, 0);\n }\n\n return row.reduce((a, c, i) => a + c * (col[i] || 0), 0);\n })\n );\n\n if (m === 1) {\n product = product[0]; // Avoid [[a, b, c, ...]]\n }\n\n if (p === 1) {\n return product.map((x) => x[0]); // Avoid [[a], [b], [c], ...]]\n }\n\n return product;\n}\n","const labConstants = {\n // Corresponds roughly to RGB brighter/darker\n Kn: 18,\n\n // D65 standard referent\n labWhitePoint: 'd65',\n Xn: 0.95047,\n Yn: 1,\n Zn: 1.08883,\n\n t0: 0.137931034, // 4 / 29\n t1: 0.206896552, // 6 / 29\n t2: 0.12841855, // 3 * t1 * t1\n t3: 0.008856452, // t1 * t1 * t1,\n\n kE: 216.0 / 24389.0,\n kKE: 8.0,\n kK: 24389.0 / 27.0,\n\n RefWhiteRGB: {\n // sRGB\n X: 0.95047,\n Y: 1,\n Z: 1.08883\n },\n\n MtxRGB2XYZ: {\n m00: 0.4124564390896922,\n m01: 0.21267285140562253,\n m02: 0.0193338955823293,\n m10: 0.357576077643909,\n m11: 0.715152155287818,\n m12: 0.11919202588130297,\n m20: 0.18043748326639894,\n m21: 0.07217499330655958,\n m22: 0.9503040785363679\n },\n\n MtxXYZ2RGB: {\n m00: 3.2404541621141045,\n m01: -0.9692660305051868,\n m02: 0.055643430959114726,\n m10: -1.5371385127977166,\n m11: 1.8760108454466942,\n m12: -0.2040259135167538,\n m20: -0.498531409556016,\n m21: 0.041556017530349834,\n m22: 1.0572251882231791\n },\n\n // used in rgb2xyz\n As: 0.9414285350000001,\n Bs: 1.040417467,\n Cs: 1.089532651,\n\n MtxAdaptMa: {\n m00: 0.8951,\n m01: -0.7502,\n m02: 0.0389,\n m10: 0.2664,\n m11: 1.7135,\n m12: -0.0685,\n m20: -0.1614,\n m21: 0.0367,\n m22: 1.0296\n },\n\n MtxAdaptMaI: {\n m00: 0.9869929054667123,\n m01: 0.43230526972339456,\n m02: -0.008528664575177328,\n m10: -0.14705425642099013,\n m11: 0.5183602715367776,\n m12: 0.04004282165408487,\n m20: 0.15996265166373125,\n m21: 0.0492912282128556,\n m22: 0.9684866957875502\n }\n};\n\nexport default labConstants;\n\n// taken from https://de.mathworks.com/help/images/ref/whitepoint.html\nconst ILLUMINANTS = new Map([\n // ASTM E308-01\n ['a', [1.0985, 0.35585]],\n // Wyszecki & Stiles, p. 769\n ['b', [1.0985, 0.35585]],\n // C ASTM E308-01\n ['c', [0.98074, 1.18232]],\n // D50 (ASTM E308-01)\n ['d50', [0.96422, 0.82521]],\n // D55 (ASTM E308-01)\n ['d55', [0.95682, 0.92149]],\n // D65 (ASTM E308-01)\n ['d65', [0.95047, 1.08883]],\n // E (ASTM E308-01)\n ['e', [1, 1, 1]],\n // F2 (ASTM E308-01)\n ['f2', [0.99186, 0.67393]],\n // F7 (ASTM E308-01)\n ['f7', [0.95041, 1.08747]],\n // F11 (ASTM E308-01)\n ['f11', [1.00962, 0.6435]],\n ['icc', [0.96422, 0.82521]]\n]);\n\nexport function setLabWhitePoint(name) {\n const ill = ILLUMINANTS.get(String(name).toLowerCase());\n if (!ill) {\n throw new Error('unknown Lab illuminant ' + name);\n }\n labConstants.labWhitePoint = name;\n labConstants.Xn = ill[0];\n labConstants.Zn = ill[1];\n}\n\nexport function getLabWhitePoint() {\n return labConstants.labWhitePoint;\n}\n","import LAB_CONSTANTS from './lab-constants.js';\nimport { unpack } from '../../utils/index.js';\n\n/*\n * L* [0..100]\n * a [-100..100]\n * b [-100..100]\n */\nconst lab2rgb = (...args) => {\n args = unpack(args, 'lab');\n const [L, a, b] = args;\n const [x, y, z] = lab2xyz(L, a, b);\n const [r, g, b_] = xyz2rgb(x, y, z);\n return [r, g, b_, args.length > 3 ? args[3] : 1];\n};\n\nconst lab2xyz = (L, a, b) => {\n const { kE, kK, kKE, Xn, Yn, Zn } = LAB_CONSTANTS;\n\n const fy = (L + 16.0) / 116.0;\n const fx = 0.002 * a + fy;\n const fz = fy - 0.005 * b;\n\n const fx3 = fx * fx * fx;\n const fz3 = fz * fz * fz;\n\n const xr = fx3 > kE ? fx3 : (116.0 * fx - 16.0) / kK;\n const yr = L > kKE ? Math.pow((L + 16.0) / 116.0, 3.0) : L / kK;\n const zr = fz3 > kE ? fz3 : (116.0 * fz - 16.0) / kK;\n\n const x = xr * Xn;\n const y = yr * Yn;\n const z = zr * Zn;\n\n return [x, y, z];\n};\n\nconst compand = (linear) => {\n /* sRGB */\n const sign = Math.sign(linear);\n linear = Math.abs(linear);\n return (\n (linear <= 0.0031308\n ? linear * 12.92\n : 1.055 * Math.pow(linear, 1.0 / 2.4) - 0.055) * sign\n );\n};\n\nconst xyz2rgb = (x, y, z) => {\n const { MtxAdaptMa, MtxAdaptMaI, MtxXYZ2RGB, RefWhiteRGB, Xn, Yn, Zn } =\n LAB_CONSTANTS;\n\n const As = Xn * MtxAdaptMa.m00 + Yn * MtxAdaptMa.m10 + Zn * MtxAdaptMa.m20;\n const Bs = Xn * MtxAdaptMa.m01 + Yn * MtxAdaptMa.m11 + Zn * MtxAdaptMa.m21;\n const Cs = Xn * MtxAdaptMa.m02 + Yn * MtxAdaptMa.m12 + Zn * MtxAdaptMa.m22;\n\n const Ad =\n RefWhiteRGB.X * MtxAdaptMa.m00 +\n RefWhiteRGB.Y * MtxAdaptMa.m10 +\n RefWhiteRGB.Z * MtxAdaptMa.m20;\n const Bd =\n RefWhiteRGB.X * MtxAdaptMa.m01 +\n RefWhiteRGB.Y * MtxAdaptMa.m11 +\n RefWhiteRGB.Z * MtxAdaptMa.m21;\n const Cd =\n RefWhiteRGB.X * MtxAdaptMa.m02 +\n RefWhiteRGB.Y * MtxAdaptMa.m12 +\n RefWhiteRGB.Z * MtxAdaptMa.m22;\n\n const X1 =\n (x * MtxAdaptMa.m00 + y * MtxAdaptMa.m10 + z * MtxAdaptMa.m20) *\n (Ad / As);\n const Y1 =\n (x * MtxAdaptMa.m01 + y * MtxAdaptMa.m11 + z * MtxAdaptMa.m21) *\n (Bd / Bs);\n const Z1 =\n (x * MtxAdaptMa.m02 + y * MtxAdaptMa.m12 + z * MtxAdaptMa.m22) *\n (Cd / Cs);\n\n const X2 =\n X1 * MtxAdaptMaI.m00 + Y1 * MtxAdaptMaI.m10 + Z1 * MtxAdaptMaI.m20;\n const Y2 =\n X1 * MtxAdaptMaI.m01 + Y1 * MtxAdaptMaI.m11 + Z1 * MtxAdaptMaI.m21;\n const Z2 =\n X1 * MtxAdaptMaI.m02 + Y1 * MtxAdaptMaI.m12 + Z1 * MtxAdaptMaI.m22;\n\n const r = compand(\n X2 * MtxXYZ2RGB.m00 + Y2 * MtxXYZ2RGB.m10 + Z2 * MtxXYZ2RGB.m20\n );\n const g = compand(\n X2 * MtxXYZ2RGB.m01 + Y2 * MtxXYZ2RGB.m11 + Z2 * MtxXYZ2RGB.m21\n );\n const b = compand(\n X2 * MtxXYZ2RGB.m02 + Y2 * MtxXYZ2RGB.m12 + Z2 * MtxXYZ2RGB.m22\n );\n\n return [r * 255, g * 255, b * 255];\n};\n\nexport default lab2rgb;\nexport { xyz2rgb };\n","import { unpack } from '../../utils/index.js';\nimport multiplyMatrices from '../../utils/multiply-matrices.js';\nimport { xyz2rgb } from '../lab/lab2rgb.js';\n\nconst oklab2rgb = (...args) => {\n args = unpack(args, 'lab');\n const [L, a, b, ...rest] = args;\n const [X, Y, Z] = OKLab_to_XYZ([L, a, b]);\n const [r, g, b_] = xyz2rgb(X, Y, Z);\n return [r, g, b_, ...(rest.length > 0 && rest[0] < 1 ? [rest[0]] : [])];\n};\n\n// from https://www.w3.org/TR/css-color-4/#color-conversion-code\nfunction OKLab_to_XYZ(OKLab) {\n // Given OKLab, convert to XYZ relative to D65\n var LMStoXYZ = [\n [1.2268798758459243, -0.5578149944602171, 0.2813910456659647],\n [-0.0405757452148008, 1.112286803280317, -0.0717110580655164],\n [-0.0763729366746601, -0.4214933324022432, 1.5869240198367816]\n ];\n var OKLabtoLMS = [\n [1.0, 0.3963377773761749, 0.2158037573099136],\n [1.0, -0.1055613458156586, -0.0638541728258133],\n [1.0, -0.0894841775298119, -1.2914855480194092]\n ];\n\n var LMSnl = multiplyMatrices(OKLabtoLMS, OKLab);\n return multiplyMatrices(\n LMStoXYZ,\n LMSnl.map((c) => c ** 3)\n );\n}\n\nexport default oklab2rgb;\n","import LAB_CONSTANTS from './lab-constants.js';\nimport { unpack } from '../../utils/index.js';\n\nconst rgb2lab = (...args) => {\n const [r, g, b, ...rest] = unpack(args, 'rgb');\n const [x, y, z] = rgb2xyz(r, g, b);\n const [L, a, b_] = xyz2lab(x, y, z);\n return [L, a, b_, ...(rest.length > 0 && rest[0] < 1 ? [rest[0]] : [])];\n};\n\nfunction xyz2lab(x, y, z) {\n const { Xn, Yn, Zn, kE, kK } = LAB_CONSTANTS;\n const xr = x / Xn;\n const yr = y / Yn;\n const zr = z / Zn;\n\n const fx = xr > kE ? Math.pow(xr, 1.0 / 3.0) : (kK * xr + 16.0) / 116.0;\n const fy = yr > kE ? Math.pow(yr, 1.0 / 3.0) : (kK * yr + 16.0) / 116.0;\n const fz = zr > kE ? Math.pow(zr, 1.0 / 3.0) : (kK * zr + 16.0) / 116.0;\n\n return [116.0 * fy - 16.0, 500.0 * (fx - fy), 200.0 * (fy - fz)];\n}\n\nfunction gammaAdjustSRGB(companded) {\n const sign = Math.sign(companded);\n companded = Math.abs(companded);\n const linear =\n companded <= 0.04045\n ? companded / 12.92\n : Math.pow((companded + 0.055) / 1.055, 2.4);\n return linear * sign;\n}\n\nconst rgb2xyz = (r, g, b) => {\n // normalize and gamma adjust\n r = gammaAdjustSRGB(r / 255);\n g = gammaAdjustSRGB(g / 255);\n b = gammaAdjustSRGB(b / 255);\n\n const { MtxRGB2XYZ, MtxAdaptMa, MtxAdaptMaI, Xn, Yn, Zn, As, Bs, Cs } =\n LAB_CONSTANTS;\n\n let x = r * MtxRGB2XYZ.m00 + g * MtxRGB2XYZ.m10 + b * MtxRGB2XYZ.m20;\n let y = r * MtxRGB2XYZ.m01 + g * MtxRGB2XYZ.m11 + b * MtxRGB2XYZ.m21;\n let z = r * MtxRGB2XYZ.m02 + g * MtxRGB2XYZ.m12 + b * MtxRGB2XYZ.m22;\n\n const Ad = Xn * MtxAdaptMa.m00 + Yn * MtxAdaptMa.m10 + Zn * MtxAdaptMa.m20;\n const Bd = Xn * MtxAdaptMa.m01 + Yn * MtxAdaptMa.m11 + Zn * MtxAdaptMa.m21;\n const Cd = Xn * MtxAdaptMa.m02 + Yn * MtxAdaptMa.m12 + Zn * MtxAdaptMa.m22;\n\n let X = x * MtxAdaptMa.m00 + y * MtxAdaptMa.m10 + z * MtxAdaptMa.m20;\n let Y = x * MtxAdaptMa.m01 + y * MtxAdaptMa.m11 + z * MtxAdaptMa.m21;\n let Z = x * MtxAdaptMa.m02 + y * MtxAdaptMa.m12 + z * MtxAdaptMa.m22;\n\n X *= Ad / As;\n Y *= Bd / Bs;\n Z *= Cd / Cs;\n\n x = X * MtxAdaptMaI.m00 + Y * MtxAdaptMaI.m10 + Z * MtxAdaptMaI.m20;\n y = X * MtxAdaptMaI.m01 + Y * MtxAdaptMaI.m11 + Z * MtxAdaptMaI.m21;\n z = X * MtxAdaptMaI.m02 + Y * MtxAdaptMaI.m12 + Z * MtxAdaptMaI.m22;\n\n return [x, y, z];\n};\n\nexport default rgb2lab;\nexport { rgb2xyz };\n","import { unpack } from '../../utils/index.js';\nimport multiplyMatrices from '../../utils/multiply-matrices.js';\nimport { rgb2xyz } from '../lab/rgb2lab.js';\n\nconst rgb2oklab = (...args) => {\n const [r, g, b, ...rest] = unpack(args, 'rgb');\n const xyz = rgb2xyz(r, g, b);\n const oklab = XYZ_to_OKLab(xyz);\n return [...oklab, ...(rest.length > 0 && rest[0] < 1 ? [rest[0]] : [])];\n};\n\n// from https://www.w3.org/TR/css-color-4/#color-conversion-code\nfunction XYZ_to_OKLab(XYZ) {\n // Given XYZ relative to D65, convert to OKLab\n const XYZtoLMS = [\n [0.819022437996703, 0.3619062600528904, -0.1288737815209879],\n [0.0329836539323885, 0.9292868615863434, 0.0361446663506424],\n [0.0481771893596242, 0.2642395317527308, 0.6335478284694309]\n ];\n const LMStoOKLab = [\n [0.210454268309314, 0.7936177747023054, -0.0040720430116193],\n [1.9779985324311684, -2.4285922420485799, 0.450593709617411],\n [0.0259040424655478, 0.7827717124575296, -0.8086757549230774]\n ];\n\n const LMS = multiplyMatrices(XYZtoLMS, XYZ);\n // JavaScript Math.cbrt returns a sign-matched cube root\n // beware if porting to other languages\n // especially if tempted to use a general power function\n return multiplyMatrices(\n LMStoOKLab,\n LMS.map((c) => Math.cbrt(c))\n );\n // L in range [0,1]. For use in CSS, multiply by 100 and add a percent\n}\n\nexport default rgb2oklab;\n","import { unpack, DEG2RAD } from '../../utils/index.js';\nconst { sin, cos } = Math;\n\nconst lch2lab = (...args) => {\n /*\n Convert from a qualitative parameter h and a quantitative parameter l to a 24-bit pixel.\n These formulas were invented by David Dalrymple to obtain maximum contrast without going\n out of gamut if the parameters are in the range 0-1.\n\n A saturation multiplier was added by Gregor Aisch\n */\n let [l, c, h] = unpack(args, 'lch');\n if (isNaN(h)) h = 0;\n h = h * DEG2RAD;\n return [l, cos(h) * c, sin(h) * c];\n};\n\nexport default lch2lab;\n","import { unpack } from '../../utils/index.js';\nimport lch2lab from '../lch/lch2lab.js';\nimport oklab2rgb from '../oklab/oklab2rgb.js';\n\nconst oklch2rgb = (...args) => {\n args = unpack(args, 'lch');\n const [l, c, h, ...rest] = args;\n const [L, a, b_] = lch2lab(l, c, h);\n const [r, g, b] = oklab2rgb(L, a, b_);\n return [r, g, b, ...(rest.length > 0 && rest[0] < 1 ? [rest[0]] : [])];\n};\n\nexport default oklch2rgb;\n","import { unpack, RAD2DEG } from '../../utils/index.js';\nconst { sqrt, atan2, round } = Math;\n\nconst lab2lch = (...args) => {\n const [l, a, b] = unpack(args, 'lab');\n const c = sqrt(a * a + b * b);\n let h = (atan2(b, a) * RAD2DEG + 360) % 360;\n if (round(c * 10000) === 0) h = Number.NaN;\n return [l, c, h];\n};\n\nexport default lab2lch;\n","import { unpack } from '../../utils/index.js';\nimport rgb2oklab from '../oklab/rgb2oklab.js';\nimport lab2lch from '../lch/lab2lch.js';\n\nconst rgb2oklch = (...args) => {\n const [r, g, b, ...rest] = unpack(args, 'rgb');\n const [l, a, b_] = rgb2oklab(r, g, b);\n const [L, c, h] = lab2lch(l, a, b_);\n return [L, c, h, ...(rest.length > 0 && rest[0] < 1 ? [rest[0]] : [])];\n};\n\nexport default rgb2oklch;\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { 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 { oklch2rgb, rgb2oklch } from '../utils/color-utils';\nimport isRTL from '../utils/is-rtl';\nimport showToast from '../utils/show-toast';\nimport states from '../utils/states';\nimport store from '../utils/store';\n\nimport Icon from './icon';\nimport Link from './link';\nimport Media from './media';\nimport MenuLink from './menu-link';\nimport Menu2 from './menu2';\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 { t } = useLingui();\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.focus();\n carouselRef.current.scrollTo({\n left: scrollLeft * (isRTL() ? -1 : 1),\n behavior: differentStatusID ? 'auto' : 'smooth',\n });\n }, [index, statusID]);\n\n const [showControls, setShowControls] = useState(true);\n\n useEffect(() => {\n let handleSwipe = (e) => {\n onClose(e, currentIndex, mediaAttachments, carouselRef);\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 }, [currentIndex, mediaAttachments]);\n\n useHotkeys(\n 'esc',\n (e) => {\n onClose(e, currentIndex, mediaAttachments, carouselRef);\n },\n {\n ignoreEventWhen: (e) => {\n const hasModal = !!document.querySelector('#modal-container > *');\n return hasModal || e.metaKey || e.ctrlKey || e.altKey || e.shiftKey;\n },\n useKey: true,\n },\n [onClose, currentIndex, mediaAttachments],\n );\n\n useEffect(() => {\n let handleScroll = () => {\n const { clientWidth, scrollLeft } = carouselRef.current;\n const index = Math.round(Math.abs(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 mediaOkColors = useMemo(() => {\n return mediaAttachments?.map((media) => {\n const { blurhash } = media;\n if (blurhash) {\n const averageColor = getBlurHashAverageColor(blurhash);\n return rgb2oklch(averageColor);\n }\n return null;\n });\n }, [mediaAttachments]);\n const mediaAccentColors = useMemo(() => {\n return mediaOkColors?.map((okColor) => {\n if (okColor) {\n return {\n light: oklch2rgb([0.95, 0.01, okColor[2]]),\n dark: oklch2rgb([0.35, 0.01, okColor[2]]),\n default: oklch2rgb([0.6, okColor[1], okColor[2]]),\n };\n }\n return null;\n });\n });\n const mediaAccentGradients = useMemo(() => {\n const gap = 5;\n const range = 100 / mediaAccentColors.length;\n const colors = mediaAccentColors.map((color, i) => {\n const start = i * range + gap;\n const end = (i + 1) * range - gap;\n if (color?.light && color?.dark) {\n return {\n light: `\n rgb(${color.light?.join(',')}) ${start}%, \n rgb(${color.light?.join(',')}) ${end}%\n `,\n dark: `\n rgb(${color.dark?.join(',')}) ${start}%, \n rgb(${color.dark?.join(',')}) ${end}%\n `,\n };\n }\n\n return {\n light: `\n transparent ${start}%, \n transparent ${end}%\n `,\n dark: `\n transparent ${start}%, \n transparent ${end}%\n `,\n };\n });\n const lightGradient = colors.map((color) => color.light).join(', ');\n const darkGradient = colors.map((color) => color.dark).join(', ');\n return {\n light: lightGradient,\n dark: darkGradient,\n };\n }, [mediaAccentColors]);\n\n let toastRef = useRef(null);\n useEffect(() => {\n return () => {\n toastRef.current?.hideToast?.();\n };\n }, []);\n\n useLayoutEffect(() => {\n const currentColor = mediaAccentColors[currentIndex];\n let $meta;\n let metaColor;\n if (currentColor) {\n const theme = store.local.get('theme');\n if (theme) {\n const mediaColor = `rgb(${currentColor[theme].join(',')})`;\n console.log({ mediaColor });\n $meta = document.querySelector(\n `meta[name=\"theme-color\"][data-theme-setting=\"manual\"]`,\n );\n if ($meta) {\n metaColor = $meta.content;\n $meta.content = mediaColor;\n }\n } else {\n const colorScheme = window.matchMedia('(prefers-color-scheme: dark)')\n .matches\n ? 'dark'\n : 'light';\n const mediaColor = `rgb(${currentColor[colorScheme].join(',')})`;\n console.log({ mediaColor });\n $meta = document.querySelector(\n `meta[name=\"theme-color\"][media*=\"${colorScheme}\"]`,\n );\n if ($meta) {\n metaColor = $meta.content;\n $meta.content = mediaColor;\n }\n }\n }\n return () => {\n // Reset meta color\n if ($meta && metaColor) {\n $meta.content = metaColor;\n }\n };\n }, [currentIndex, mediaAccentColors]);\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(e, currentIndex, mediaAttachments, carouselRef);\n }\n }}\n style={\n mediaAttachments.length > 1\n ? {\n backgroundAttachment: 'local',\n '--accent-gradient-light': mediaAccentGradients?.light,\n '--accent-gradient-dark': mediaAccentGradients?.dark,\n // backgroundImage: `linear-gradient(\n // to ${isRTL() ? 'left' : '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.default.join(',')})`,\n '--accent-light-color': `rgb(${accentColor.light?.join(\n ',',\n )})`,\n '--accent-dark-color': `rgb(${accentColor.dark?.join(\n ',',\n )})`,\n '--accent-alpha-color': `rgba(${accentColor.default.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={(e) =>\n onClose(e, currentIndex, mediaAttachments, carouselRef)\n }\n >\n <Icon icon=\"x\" alt={t`Close`} />\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 const left =\n carouselRef.current.clientWidth * i * (isRTL() ? -1 : 1);\n carouselRef.current.focus();\n carouselRef.current.scrollTo({ left, behavior: 'smooth' });\n }}\n >\n <Icon icon=\"round\" size=\"s\" alt=\"⸱\" />\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={t`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={t`Open original media in new window`}\n >\n <Icon icon=\"popout\" />\n <span>\n <Trans>Open original media</Trans>\n </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: t`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(t`Failed to describe image`);\n } finally {\n setUIState('default');\n toastRef.current?.hideToast?.();\n }\n })();\n }}\n >\n <Icon icon=\"sparkles2\" />\n <span>\n <Trans>Describe image…</Trans>\n </span>\n </MenuItem>\n </>\n )}\n </Menu2>{' '}\n {!!statusID && (\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\">\n <Trans>View post</Trans>{' '}\n </span>\n »\n </Link>\n )}\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:\n carouselRef.current.clientWidth *\n (currentIndex - 1) *\n (isRTL() ? -1 : 1),\n behavior: 'smooth',\n });\n }}\n >\n <Icon icon=\"arrow-left\" alt={t`Previous`} />\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:\n carouselRef.current.clientWidth *\n (currentIndex + 1) *\n (isRTL() ? -1 : 1),\n behavior: 'smooth',\n });\n }}\n >\n <Icon icon=\"arrow-right\" alt={t`Next`} />\n </button>\n </div>\n )}\n </div>\n );\n}\n\nexport default MediaModal;\n","import './report-modal.css';\n\nimport { msg } from '@lingui/core/macro';\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { Fragment } from 'preact';\nimport { useMemo, useRef, useState } from 'preact/hooks';\n\nimport { api } from '../utils/api';\nimport localeMatch from '../utils/locale-match';\nimport showToast from '../utils/show-toast';\nimport { getCurrentInstance } from '../utils/store-utils';\n\nimport AccountBlock from './account-block';\nimport Icon from './icon';\nimport Loader from './loader';\nimport Status from './status';\n\n// NOTE: `dislike` hidden for now, it's actually not used for reporting\n// Mastodon shows another screen for unfollowing, muting or blocking instead of reporting\n\nconst CATEGORIES = [/*'dislike' ,*/ 'spam', 'legal', 'violation', 'other'];\n// `violation` will be set if there are `rule_ids[]`\n\nconst CATEGORIES_INFO = {\n // dislike: {\n // label: 'Dislike',\n // description: 'Not something you want to see',\n // },\n spam: {\n label: msg`Spam`,\n description: msg`Malicious links, fake engagement, or repetitive replies`,\n },\n legal: {\n label: msg`Illegal`,\n description: msg`Violates the law of your or the server's country`,\n },\n violation: {\n label: msg`Server rule violation`,\n description: msg`Breaks specific server rules`,\n stampLabel: msg`Violation`,\n },\n other: {\n label: msg`Other`,\n description: msg`Issue doesn't fit other categories`,\n excludeStamp: true,\n },\n};\n\nfunction findMatchingLanguage(rule, currentLang) {\n if (!rule.translations || !currentLang) return null;\n const availableLanguages = Object.keys(rule.translations);\n if (!availableLanguages?.length) return null;\n\n let matchedLang = localeMatch([currentLang], availableLanguages, null);\n if (!matchedLang) {\n // localeMatch fails if there are keys like zhCn, zhTw\n // Convert them something like zh-CN first, try again\n // Detect uppercase, then split by dash\n const normalizedLanguages = availableLanguages.map((lang) => {\n const parts = lang.split(/(?=[A-Z])/);\n return parts\n .map((part, i) => (i === 0 ? part : part.toLowerCase()))\n .join('-');\n });\n matchedLang = localeMatch([currentLang], normalizedLanguages, null);\n }\n\n // If matchedLang has dash, convert back to original format\n // E.g. zh-cn to zhCn\n if (matchedLang && matchedLang.includes('-')) {\n const [lang, region] = matchedLang.split('-');\n matchedLang = lang + region.charAt(0).toUpperCase() + region.slice(1);\n }\n\n return matchedLang;\n}\n\nfunction translateRules(rules, currentLang) {\n if (!rules?.length) return [];\n if (!currentLang) return rules;\n return rules.map((rule) => {\n const matchedLang = findMatchingLanguage(rule, currentLang);\n return {\n ...rule,\n _translatedText: rule.translations?.[matchedLang]?.text || null,\n };\n });\n}\n\nfunction ReportModal({ account, post, onClose }) {\n const { _, t, i18n } = useLingui();\n const { masto } = api();\n const [uiState, setUIState] = useState('default');\n const [username, domain] = account.acct.split('@');\n\n const [translatedRules, currentDomain] = useMemo(() => {\n const { rules, domain } = getCurrentInstance();\n const rawRules = rules || [];\n return [translateRules(rawRules, i18n.locale), domain];\n }, [i18n.locale]);\n\n const [selectedCategory, setSelectedCategory] = useState(null);\n const [showRules, setShowRules] = useState(false);\n\n const rulesRef = useRef(null);\n const [hasRules, setHasRules] = useState(false);\n\n return (\n <div class=\"report-modal-container\">\n <div class=\"top-controls\">\n <h1>{post ? t`Report Post` : t`Report @${username}`}</h1>\n <button\n type=\"button\"\n class=\"plain4 small\"\n disabled={uiState === 'loading'}\n onClick={() => onClose()}\n >\n <Icon icon=\"x\" size=\"xl\" alt={t`Close`} />\n </button>\n </div>\n <main>\n <div class=\"report-preview\">\n {post ? (\n <Status status={post} size=\"s\" previewMode />\n ) : (\n <AccountBlock\n account={account}\n avatarSize=\"xxl\"\n useAvatarStatic\n showStats\n showActivity\n />\n )}\n </div>\n {!!selectedCategory &&\n !CATEGORIES_INFO[selectedCategory].excludeStamp && (\n <span\n class=\"rubber-stamp\"\n key={selectedCategory}\n aria-hidden=\"true\"\n >\n {_(\n CATEGORIES_INFO[selectedCategory].stampLabel ||\n _(CATEGORIES_INFO[selectedCategory].label),\n )}\n <small>\n <Trans>Pending review</Trans>\n </small>\n </span>\n )}\n <form\n onSubmit={(e) => {\n e.preventDefault();\n\n const formData = new FormData(e.target);\n const entries = Object.fromEntries(formData.entries());\n console.log('ENTRIES', entries);\n\n let { category, comment, forward } = entries;\n if (!comment) comment = undefined;\n if (forward === 'on') forward = true;\n const ruleIds =\n category === 'violation'\n ? Object.entries(entries)\n .filter(([key]) => key.startsWith('rule_ids'))\n .map(([key, value]) => value)\n : undefined;\n\n const params = {\n category,\n comment,\n forward,\n ruleIds,\n };\n console.log('PARAMS', params);\n\n setUIState('loading');\n (async () => {\n try {\n await masto.v1.reports.create({\n accountId: account.id,\n statusIds: post?.id ? [post.id] : undefined,\n category,\n comment,\n ruleIds,\n forward,\n });\n setUIState('success');\n showToast(post ? t`Post reported` : t`Profile reported`);\n onClose();\n } catch (error) {\n console.error(error);\n setUIState('error');\n showToast(\n error?.message ||\n (post\n ? t`Unable to report post`\n : t`Unable to report profile`),\n );\n }\n })();\n }}\n >\n <p>\n {post\n ? t`What's the issue with this post?`\n : t`What's the issue with this profile?`}\n </p>\n <section class=\"report-categories\">\n {CATEGORIES.map((category) =>\n category === 'violation' && !translatedRules?.length ? null : (\n <Fragment key={category}>\n <label class=\"report-category\">\n <input\n type=\"radio\"\n name=\"category\"\n value={category}\n required\n disabled={uiState === 'loading'}\n onChange={(e) => {\n setSelectedCategory(e.target.value);\n setShowRules(e.target.value === 'violation');\n }}\n />\n <span>\n {_(CATEGORIES_INFO[category].label)} \n <small class=\"ib insignificant\">\n {_(CATEGORIES_INFO[category].description)}\n </small>\n </span>\n </label>\n {category === 'violation' && !!translatedRules?.length && (\n <div\n class=\"shazam-container no-animation\"\n hidden={!showRules}\n >\n <div class=\"shazam-container-inner\">\n <div class=\"report-rules\" ref={rulesRef}>\n {translatedRules.map((rule, i) => (\n <label class=\"report-rule\" key={rule.id}>\n <input\n type=\"checkbox\"\n name={`rule_ids[${i}]`}\n value={rule.id}\n required={showRules && !hasRules}\n disabled={uiState === 'loading'}\n onChange={(e) => {\n const { checked } = e.target;\n if (checked) {\n setHasRules(true);\n } else {\n const checkedInputs =\n rulesRef.current.querySelectorAll(\n 'input:checked',\n );\n if (!checkedInputs.length) {\n setHasRules(false);\n }\n }\n }}\n />\n <span>{rule._translatedText || rule.text}</span>\n </label>\n ))}\n </div>\n </div>\n </div>\n )}\n </Fragment>\n ),\n )}\n </section>\n <section class=\"report-comment\">\n <p>\n <label for=\"report-comment\">\n <Trans>Additional info</Trans>\n </label>\n </p>\n <textarea\n maxlength=\"1000\"\n rows=\"1\"\n name=\"comment\"\n id=\"report-comment\"\n disabled={uiState === 'loading'}\n required={!post} // Required if not reporting a post\n />\n </section>\n {!!domain && domain !== currentDomain && (\n <section>\n <p>\n <label>\n <input\n type=\"checkbox\"\n switch\n name=\"forward\"\n disabled={uiState === 'loading'}\n />{' '}\n <span>\n <Trans>\n Forward to <i>{domain}</i>\n </Trans>\n </span>\n </label>\n </p>\n </section>\n )}\n <footer>\n <button type=\"submit\" disabled={uiState === 'loading'}>\n <Trans>Send Report</Trans>\n </button>{' '}\n <button\n type=\"submit\"\n class=\"plain2\"\n disabled={uiState === 'loading'}\n onClick={async () => {\n try {\n await masto.v1.accounts.$select(account.id).mute(); // Infinite duration\n showToast(t`Muted ${username}`);\n } catch (e) {\n console.error(e);\n showToast(t`Unable to mute ${username}`);\n }\n // onSubmit will still run\n }}\n >\n <Trans>\n Send Report <small class=\"ib\">+ Mute profile</small>\n </Trans>\n </button>{' '}\n <button\n type=\"submit\"\n class=\"plain2\"\n disabled={uiState === 'loading'}\n onClick={async () => {\n try {\n await masto.v1.accounts.$select(account.id).block();\n showToast(t`Blocked ${username}`);\n } catch (e) {\n console.error(e);\n showToast(t`Unable to block ${username}`);\n }\n // onSubmit will still run\n }}\n >\n <Trans>\n Send Report <small class=\"ib\">+ Block profile</small>\n </Trans>\n </button>\n <Loader hidden={uiState !== 'loading'} />\n </footer>\n </form>\n </main>\n </div>\n );\n}\n\nexport default ReportModal;\n","// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>\n// This work is free. You can redistribute it and/or modify it\n// under the terms of the WTFPL, Version 2\n// For more information see LICENSE.txt or http://www.wtfpl.net/\n//\n// For more information, the home page:\n// http://pieroxy.net/blog/pages/lz-string/testing.html\n//\n// LZ-based compression algorithm, version 1.4.5\nvar LZString = (function() {\n\n// private property\nvar f = String.fromCharCode;\nvar keyStrBase64 = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\nvar keyStrUriSafe = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$\";\nvar baseReverseDic = {};\n\nfunction getBaseValue(alphabet, character) {\n if (!baseReverseDic[alphabet]) {\n baseReverseDic[alphabet] = {};\n for (var i=0 ; i<alphabet.length ; i++) {\n baseReverseDic[alphabet][alphabet.charAt(i)] = i;\n }\n }\n return baseReverseDic[alphabet][character];\n}\n\nvar LZString = {\n compressToBase64 : function (input) {\n if (input == null) return \"\";\n var res = LZString._compress(input, 6, function(a){return keyStrBase64.charAt(a);});\n switch (res.length % 4) { // To produce valid Base64\n default: // When could this happen ?\n case 0 : return res;\n case 1 : return res+\"===\";\n case 2 : return res+\"==\";\n case 3 : return res+\"=\";\n }\n },\n\n decompressFromBase64 : function (input) {\n if (input == null) return \"\";\n if (input == \"\") return null;\n return LZString._decompress(input.length, 32, function(index) { return getBaseValue(keyStrBase64, input.charAt(index)); });\n },\n\n compressToUTF16 : function (input) {\n if (input == null) return \"\";\n return LZString._compress(input, 15, function(a){return f(a+32);}) + \" \";\n },\n\n decompressFromUTF16: function (compressed) {\n if (compressed == null) return \"\";\n if (compressed == \"\") return null;\n return LZString._decompress(compressed.length, 16384, function(index) { return compressed.charCodeAt(index) - 32; });\n },\n\n //compress into uint8array (UCS-2 big endian format)\n compressToUint8Array: function (uncompressed) {\n var compressed = LZString.compress(uncompressed);\n var buf=new Uint8Array(compressed.length*2); // 2 bytes per character\n\n for (var i=0, TotalLen=compressed.length; i<TotalLen; i++) {\n var current_value = compressed.charCodeAt(i);\n buf[i*2] = current_value >>> 8;\n buf[i*2+1] = current_value % 256;\n }\n return buf;\n },\n\n //decompress from uint8array (UCS-2 big endian format)\n decompressFromUint8Array:function (compressed) {\n if (compressed===null || compressed===undefined){\n return LZString.decompress(compressed);\n } else {\n var buf=new Array(compressed.length/2); // 2 bytes per character\n for (var i=0, TotalLen=buf.length; i<TotalLen; i++) {\n buf[i]=compressed[i*2]*256+compressed[i*2+1];\n }\n\n var result = [];\n buf.forEach(function (c) {\n result.push(f(c));\n });\n return LZString.decompress(result.join(''));\n\n }\n\n },\n\n\n //compress into a string that is already URI encoded\n compressToEncodedURIComponent: function (input) {\n if (input == null) return \"\";\n return LZString._compress(input, 6, function(a){return keyStrUriSafe.charAt(a);});\n },\n\n //decompress from an output of compressToEncodedURIComponent\n decompressFromEncodedURIComponent:function (input) {\n if (input == null) return \"\";\n if (input == \"\") return null;\n input = input.replace(/ /g, \"+\");\n return LZString._decompress(input.length, 32, function(index) { return getBaseValue(keyStrUriSafe, input.charAt(index)); });\n },\n\n compress: function (uncompressed) {\n return LZString._compress(uncompressed, 16, function(a){return f(a);});\n },\n _compress: function (uncompressed, bitsPerChar, getCharFromInt) {\n if (uncompressed == null) return \"\";\n var i, value,\n context_dictionary= {},\n context_dictionaryToCreate= {},\n context_c=\"\",\n context_wc=\"\",\n context_w=\"\",\n context_enlargeIn= 2, // Compensate for the first entry which should not count\n context_dictSize= 3,\n context_numBits= 2,\n context_data=[],\n context_data_val=0,\n context_data_position=0,\n ii;\n\n for (ii = 0; ii < uncompressed.length; ii += 1) {\n context_c = uncompressed.charAt(ii);\n if (!Object.prototype.hasOwnProperty.call(context_dictionary,context_c)) {\n context_dictionary[context_c] = context_dictSize++;\n context_dictionaryToCreate[context_c] = true;\n }\n\n context_wc = context_w + context_c;\n if (Object.prototype.hasOwnProperty.call(context_dictionary,context_wc)) {\n context_w = context_wc;\n } else {\n if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate,context_w)) {\n if (context_w.charCodeAt(0)<256) {\n for (i=0 ; i<context_numBits ; i++) {\n context_data_val = (context_data_val << 1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n }\n value = context_w.charCodeAt(0);\n for (i=0 ; i<8 ; i++) {\n context_data_val = (context_data_val << 1) | (value&1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = value >> 1;\n }\n } else {\n value = 1;\n for (i=0 ; i<context_numBits ; i++) {\n context_data_val = (context_data_val << 1) | value;\n if (context_data_position ==bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = 0;\n }\n value = context_w.charCodeAt(0);\n for (i=0 ; i<16 ; i++) {\n context_data_val = (context_data_val << 1) | (value&1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = value >> 1;\n }\n }\n context_enlargeIn--;\n if (context_enlargeIn == 0) {\n context_enlargeIn = Math.pow(2, context_numBits);\n context_numBits++;\n }\n delete context_dictionaryToCreate[context_w];\n } else {\n value = context_dictionary[context_w];\n for (i=0 ; i<context_numBits ; i++) {\n context_data_val = (context_data_val << 1) | (value&1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = value >> 1;\n }\n\n\n }\n context_enlargeIn--;\n if (context_enlargeIn == 0) {\n context_enlargeIn = Math.pow(2, context_numBits);\n context_numBits++;\n }\n // Add wc to the dictionary.\n context_dictionary[context_wc] = context_dictSize++;\n context_w = String(context_c);\n }\n }\n\n // Output the code for w.\n if (context_w !== \"\") {\n if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate,context_w)) {\n if (context_w.charCodeAt(0)<256) {\n for (i=0 ; i<context_numBits ; i++) {\n context_data_val = (context_data_val << 1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n }\n value = context_w.charCodeAt(0);\n for (i=0 ; i<8 ; i++) {\n context_data_val = (context_data_val << 1) | (value&1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = value >> 1;\n }\n } else {\n value = 1;\n for (i=0 ; i<context_numBits ; i++) {\n context_data_val = (context_data_val << 1) | value;\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = 0;\n }\n value = context_w.charCodeAt(0);\n for (i=0 ; i<16 ; i++) {\n context_data_val = (context_data_val << 1) | (value&1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = value >> 1;\n }\n }\n context_enlargeIn--;\n if (context_enlargeIn == 0) {\n context_enlargeIn = Math.pow(2, context_numBits);\n context_numBits++;\n }\n delete context_dictionaryToCreate[context_w];\n } else {\n value = context_dictionary[context_w];\n for (i=0 ; i<context_numBits ; i++) {\n context_data_val = (context_data_val << 1) | (value&1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = value >> 1;\n }\n\n\n }\n context_enlargeIn--;\n if (context_enlargeIn == 0) {\n context_enlargeIn = Math.pow(2, context_numBits);\n context_numBits++;\n }\n }\n\n // Mark the end of the stream\n value = 2;\n for (i=0 ; i<context_numBits ; i++) {\n context_data_val = (context_data_val << 1) | (value&1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = value >> 1;\n }\n\n // Flush the last char\n while (true) {\n context_data_val = (context_data_val << 1);\n if (context_data_position == bitsPerChar-1) {\n context_data.push(getCharFromInt(context_data_val));\n break;\n }\n else context_data_position++;\n }\n return context_data.join('');\n },\n\n decompress: function (compressed) {\n if (compressed == null) return \"\";\n if (compressed == \"\") return null;\n return LZString._decompress(compressed.length, 32768, function(index) { return compressed.charCodeAt(index); });\n },\n\n _decompress: function (length, resetValue, getNextValue) {\n var dictionary = [],\n next,\n enlargeIn = 4,\n dictSize = 4,\n numBits = 3,\n entry = \"\",\n result = [],\n i,\n w,\n bits, resb, maxpower, power,\n c,\n data = {val:getNextValue(0), position:resetValue, index:1};\n\n for (i = 0; i < 3; i += 1) {\n dictionary[i] = i;\n }\n\n bits = 0;\n maxpower = Math.pow(2,2);\n power=1;\n while (power!=maxpower) {\n resb = data.val & data.position;\n data.position >>= 1;\n if (data.position == 0) {\n data.position = resetValue;\n data.val = getNextValue(data.index++);\n }\n bits |= (resb>0 ? 1 : 0) * power;\n power <<= 1;\n }\n\n switch (next = bits) {\n case 0:\n bits = 0;\n maxpower = Math.pow(2,8);\n power=1;\n while (power!=maxpower) {\n resb = data.val & data.position;\n data.position >>= 1;\n if (data.position == 0) {\n data.position = resetValue;\n data.val = getNextValue(data.index++);\n }\n bits |= (resb>0 ? 1 : 0) * power;\n power <<= 1;\n }\n c = f(bits);\n break;\n case 1:\n bits = 0;\n maxpower = Math.pow(2,16);\n power=1;\n while (power!=maxpower) {\n resb = data.val & data.position;\n data.position >>= 1;\n if (data.position == 0) {\n data.position = resetValue;\n data.val = getNextValue(data.index++);\n }\n bits |= (resb>0 ? 1 : 0) * power;\n power <<= 1;\n }\n c = f(bits);\n break;\n case 2:\n return \"\";\n }\n dictionary[3] = c;\n w = c;\n result.push(c);\n while (true) {\n if (data.index > length) {\n return \"\";\n }\n\n bits = 0;\n maxpower = Math.pow(2,numBits);\n power=1;\n while (power!=maxpower) {\n resb = data.val & data.position;\n data.position >>= 1;\n if (data.position == 0) {\n data.position = resetValue;\n data.val = getNextValue(data.index++);\n }\n bits |= (resb>0 ? 1 : 0) * power;\n power <<= 1;\n }\n\n switch (c = bits) {\n case 0:\n bits = 0;\n maxpower = Math.pow(2,8);\n power=1;\n while (power!=maxpower) {\n resb = data.val & data.position;\n data.position >>= 1;\n if (data.position == 0) {\n data.position = resetValue;\n data.val = getNextValue(data.index++);\n }\n bits |= (resb>0 ? 1 : 0) * power;\n power <<= 1;\n }\n\n dictionary[dictSize++] = f(bits);\n c = dictSize-1;\n enlargeIn--;\n break;\n case 1:\n bits = 0;\n maxpower = Math.pow(2,16);\n power=1;\n while (power!=maxpower) {\n resb = data.val & data.position;\n data.position >>= 1;\n if (data.position == 0) {\n data.position = resetValue;\n data.val = getNextValue(data.index++);\n }\n bits |= (resb>0 ? 1 : 0) * power;\n power <<= 1;\n }\n dictionary[dictSize++] = f(bits);\n c = dictSize-1;\n enlargeIn--;\n break;\n case 2:\n return result.join('');\n }\n\n if (enlargeIn == 0) {\n enlargeIn = Math.pow(2, numBits);\n numBits++;\n }\n\n if (dictionary[c]) {\n entry = dictionary[c];\n } else {\n if (c === dictSize) {\n entry = w + w.charAt(0);\n } else {\n return null;\n }\n }\n result.push(entry);\n\n // Add w+entry[0] to the dictionary.\n dictionary[dictSize++] = w + entry.charAt(0);\n enlargeIn--;\n\n w = entry;\n\n if (enlargeIn == 0) {\n enlargeIn = Math.pow(2, numBits);\n numBits++;\n }\n\n }\n }\n};\n return LZString;\n})();\n\nif (typeof define === 'function' && define.amd) {\n define(function () { return LZString; });\n} else if( typeof module !== 'undefined' && module != null ) {\n module.exports = LZString\n} else if( typeof angular !== 'undefined' && angular != null ) {\n angular.module('LZString', [])\n .factory('LZString', function () {\n return LZString;\n });\n}\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\n .list({\n limit: LIMIT,\n })\n .values();\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 { msg, t } from '@lingui/core/macro';\nimport { Plural, Trans, useLingui } from '@lingui/react/macro';\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 { getLists, getListTitle } from '../utils/lists';\nimport pmem from '../utils/pmem';\nimport showToast from '../utils/show-toast';\nimport states from '../utils/states';\nimport store from '../utils/store';\nimport { getCurrentAccountID } from '../utils/store-utils';\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: msg`Home / Following`,\n notifications: msg`Notifications`,\n list: msg`Lists`,\n public: msg`Public (Local / Federated)`,\n search: msg`Search`,\n 'account-statuses': msg`Account`,\n bookmarks: msg`Bookmarks`,\n favourites: msg`Likes`,\n hashtag: msg`Hashtag`,\n trending: msg`Trending`,\n mentions: msg`Mentions`,\n};\nconst TYPE_PARAMS = {\n list: [\n {\n text: msg`List ID`,\n name: 'id',\n notRequired: true,\n },\n ],\n public: [\n {\n text: msg`Local only`,\n name: 'local',\n type: 'checkbox',\n },\n {\n text: msg`Instance`,\n name: 'instance',\n type: 'text',\n placeholder: msg`Optional, e.g. mastodon.social`,\n notRequired: true,\n },\n ],\n trending: [\n {\n text: msg`Instance`,\n name: 'instance',\n type: 'text',\n placeholder: msg`Optional, e.g. mastodon.social`,\n notRequired: true,\n },\n ],\n search: [\n {\n text: msg`Search term`,\n name: 'query',\n type: 'text',\n placeholder: msg`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: msg`e.g. PixelArt (Max 5, space-separated)`,\n pattern: '[^#]+',\n },\n {\n text: msg`Media only`,\n name: 'media',\n type: 'checkbox',\n },\n {\n text: msg`Instance`,\n name: 'instance',\n type: 'text',\n placeholder: msg`Optional, e.g. mastodon.social`,\n notRequired: true,\n },\n ],\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) =>\n index === 0\n ? t`Home`\n : t({ id: 'following.title', message: 'Following' }),\n path: '/',\n icon: 'home',\n },\n mentions: {\n id: 'mentions',\n title: msg`Mentions`,\n path: '/mentions',\n icon: 'at',\n },\n notifications: {\n id: 'notifications',\n title: msg`Notifications`,\n path: '/notifications',\n icon: 'notification',\n },\n list: {\n id: ({ id }) => (id ? 'list' : 'lists'),\n title: ({ id }) => (id ? getListTitle(id) : t`Lists`),\n path: ({ id }) => (id ? `/l/${id}` : '/l'),\n icon: 'list',\n excludeViewMode: ({ id }) => (!id ? ['multi-column'] : []),\n },\n public: {\n id: 'public',\n title: ({ local }) => (local ? t`Local` : t`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: msg`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}”` : t`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: msg`Bookmarks`,\n path: '/b',\n icon: 'bookmark',\n },\n favourites: {\n id: 'favourites',\n title: msg`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 { _ } = useLingui();\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\" alt={t`Close`} />\n </button>\n )}\n <header>\n <h2>\n <Icon icon=\"shortcut\" /> <Trans>Shortcuts</Trans>{' '}\n <sup\n style={{\n fontSize: 12,\n opacity: 0.5,\n textTransform: 'uppercase',\n }}\n >\n <Trans>beta</Trans>\n </sup>\n </h2>\n </header>\n <main>\n <p>\n <Trans>Specify a list of shortcuts that'll appear as:</Trans>\n </p>\n <div class=\"shortcuts-view-mode\">\n {[\n {\n value: 'float-button',\n label: t`Floating button`,\n imgURL: floatingButtonUrl,\n },\n {\n value: 'tab-menu-bar',\n label: t`Tab/Menu bar`,\n imgURL: tabMenuBarUrl,\n },\n {\n value: 'multi-column',\n label: t`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 <>\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 } else {\n title = _(title);\n }\n if (typeof subtitle === 'function') {\n subtitle = subtitle(shortcut, i);\n } else {\n subtitle = _(subtitle);\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 <Trans>Not available in current view mode</Trans>\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={t`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={t`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={t`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 {shortcuts.length === 1 &&\n snapStates.settings.shortcutsViewMode !== 'float-button' && (\n <div class=\"ui-state insignificant\">\n <Icon icon=\"info\" />{' '}\n <small>\n <Trans>\n Add more than one shortcut/column to make this work.\n </Trans>\n </small>\n </div>\n )}\n </>\n ) : (\n <div class=\"ui-state insignificant\">\n <p>\n {snapStates.settings.shortcutsViewMode === 'multi-column'\n ? t`No columns yet. Tap on the Add column button.`\n : t`No shortcuts yet. Tap on the Add shortcut button.`}\n </p>\n <p>\n <Trans>\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 </Trans>\n </p>\n </div>\n )}\n <p class=\"insignificant\">\n {shortcuts.length >= SHORTCUTS_LIMIT &&\n (snapStates.settings.shortcutsViewMode === 'multi-column'\n ? t`Max ${SHORTCUTS_LIMIT} columns`\n : t`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 <Trans>Import/export</Trans>\n </button>\n <button\n type=\"button\"\n disabled={shortcuts.length >= SHORTCUTS_LIMIT}\n onClick={() => setShowForm(true)}\n >\n <Icon icon=\"plus\" />{' '}\n <span>\n {snapStates.settings.shortcutsViewMode === 'multi-column'\n ? t`Add column…`\n : t`Add shortcut…`}\n </span>\n </button>\n </p>\n </main>\n {showForm && (\n <Modal\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 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 FORM_NOTES = {\n list: msg`Specific list is optional. For multi-column mode, list is required, else the column will not be shown.`,\n search: msg`For multi-column mode, search term is required, else the column will not be shown.`,\n hashtag: msg`Multiple hashtags are supported. Space-separated.`,\n};\n\nfunction ShortcutForm({\n onSubmit,\n disabled,\n shortcut,\n shortcutIndex,\n onClose,\n}) {\n const { _ } = useLingui();\n console.log('shortcut', shortcut);\n const editMode = !!shortcut;\n const [currentType, setCurrentType] = useState(shortcut?.type || null);\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 getLists();\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\" alt={t`Close`} />\n </button>\n )}\n <header>\n <h2>{editMode ? t`Edit shortcut` : t`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>\n <Trans>Timeline</Trans>\n </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 dir=\"auto\"\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>\n <Trans>List</Trans>\n </span>\n <select\n name=\"id\"\n required={!notRequired}\n disabled={disabled || uiState === 'loading'}\n defaultValue={editMode ? shortcut.id : undefined}\n dir=\"auto\"\n >\n <option value=\"\"></option>\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 dir=\"auto\"\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 ? t`Save` : t`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 <Trans>Remove</Trans>\n </button>\n )}\n </footer>\n </form>\n </main>\n </div>\n );\n}\n\nfunction ImportExport({ shortcuts, onClose }) {\n const { _ } = useLingui();\n const { masto } = api();\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 const shortcutsImportFieldRef = useRef();\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\" alt={t`Close`} />\n </button>\n )}\n <header>\n <h2>\n <Trans>\n Import/Export <small class=\"ib insignificant\">Shortcuts</small>\n </Trans>\n </h2>\n </header>\n <main tabindex=\"-1\">\n <section>\n <h3>\n <Icon icon=\"arrow-down-circle\" size=\"l\" class=\"insignificant\" />{' '}\n <span>\n <Trans>Import</Trans>\n </span>\n </h3>\n <p class=\"field-button\">\n <input\n ref={shortcutsImportFieldRef}\n type=\"text\"\n name=\"import\"\n placeholder={t`Paste shortcuts here`}\n class=\"block\"\n onInput={(e) => {\n setImportShortcutStr(e.target.value);\n }}\n dir=\"auto\"\n />\n {states.settings.shortcutSettingsCloudImportExport && (\n <button\n type=\"button\"\n class=\"plain2 small\"\n disabled={importUIState === 'cloud-downloading'}\n onClick={async () => {\n setImportUIState('cloud-downloading');\n const currentAccount = getCurrentAccountID();\n showToast(\n t`Downloading saved shortcuts from instance server…`,\n );\n try {\n const relationships =\n await masto.v1.accounts.relationships.fetch({\n id: [currentAccount],\n });\n const relationship = relationships[0];\n if (relationship) {\n const { note = '' } = relationship;\n if (\n /<phanpy-shortcuts-settings>(.*)<\\/phanpy-shortcuts-settings>/.test(\n note,\n )\n ) {\n const settings = note.match(\n /<phanpy-shortcuts-settings>(.*)<\\/phanpy-shortcuts-settings>/,\n )[1];\n const { v, dt, data } = JSON.parse(settings);\n shortcutsImportFieldRef.current.value = data;\n shortcutsImportFieldRef.current.dispatchEvent(\n new Event('input'),\n );\n }\n }\n setImportUIState('default');\n } catch (e) {\n console.error(e);\n setImportUIState('error');\n showToast(t`Unable to download shortcuts`);\n }\n }}\n title={t`Download shortcuts from instance server`}\n >\n <Icon icon=\"cloud\" />\n <Icon icon=\"arrow-down\" />\n </button>\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>\n <Trans>* Exists in current shortcuts</Trans>\n </small>\n <br />\n <small>\n ⚠️{' '}\n <Trans>\n List may not work if it's from a different account.\n </Trans>\n </small>\n </p>\n </>\n )}\n {importUIState === 'error' && (\n <p class=\"error\">\n <small>\n ⚠️ <Trans>Invalid settings format</Trans>\n </small>\n </p>\n )}\n <p>\n {hasCurrentSettings && (\n <>\n <MenuConfirm\n confirmLabel={t`Append to current shortcuts?`}\n menuFooter={\n <div class=\"footer\">\n <Trans>\n Only shortcuts that don’t exist in current shortcuts\n will be appended.\n </Trans>\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(t`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 ? t`Shortcuts imported. Exceeded max ${SHORTCUTS_LIMIT}, so the rest are not imported.`\n : t`Shortcuts imported`,\n );\n onClose?.();\n }}\n >\n <button\n type=\"button\"\n class=\"plain2\"\n disabled={!parsedImportShortcutStr}\n >\n <Trans>Import & append…</Trans>\n </button>\n </MenuConfirm>{' '}\n </>\n )}\n <MenuConfirm\n confirmLabel={\n hasCurrentSettings\n ? t`Override current shortcuts?`\n : t`Import shortcuts?`\n }\n menuItemClassName={hasCurrentSettings ? 'danger' : undefined}\n onClick={() => {\n states.shortcuts = parsedImportShortcutStr;\n showToast(t`Shortcuts imported`);\n onClose?.();\n }}\n >\n <button\n type=\"button\"\n class=\"plain2\"\n disabled={!parsedImportShortcutStr}\n >\n {hasCurrentSettings ? t`or override…` : t`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>\n <Trans>Export</Trans>\n </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(t`Shortcuts copied`);\n } catch (e) {\n console.error(e);\n showToast(t`Unable to copy shortcuts`);\n }\n }}\n dir=\"auto\"\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(t`Shortcut settings copied`);\n } catch (e) {\n console.error(e);\n showToast(t`Unable to copy shortcut settings`);\n }\n }}\n >\n <Icon icon=\"clipboard\" />{' '}\n <span>\n <Trans>Copy</Trans>\n </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(t`Sharing doesn't seem to work.`);\n }\n }}\n >\n <Icon icon=\"share\" />{' '}\n <span>\n <Trans>Share</Trans>\n </span>\n </button>\n )}{' '}\n {states.settings.shortcutSettingsCloudImportExport && (\n <button\n type=\"button\"\n class=\"plain2\"\n disabled={importUIState === 'cloud-uploading'}\n onClick={async () => {\n setImportUIState('cloud-uploading');\n const currentAccount = getCurrentAccountID();\n try {\n const relationships =\n await masto.v1.accounts.relationships.fetch({\n id: [currentAccount],\n });\n const relationship = relationships[0];\n if (relationship) {\n const { note = '' } = relationship;\n // const newNote = `${note}\\n\\n\\n$<phanpy-shortcuts-settings>{shortcutsStr}</phanpy-shortcuts-settings>`;\n let newNote = '';\n const settingsJSON = JSON.stringify({\n v: '1', // version\n dt: Date.now(), // datetime stamp\n data: shortcutsStr, // shortcuts settings string\n });\n if (\n /<phanpy-shortcuts-settings>(.*)<\\/phanpy-shortcuts-settings>/.test(\n note,\n )\n ) {\n newNote = note.replace(\n /<phanpy-shortcuts-settings>(.*)<\\/phanpy-shortcuts-settings>/,\n `<phanpy-shortcuts-settings>${settingsJSON}</phanpy-shortcuts-settings>`,\n );\n } else {\n newNote = `${note}\\n\\n\\n<phanpy-shortcuts-settings>${settingsJSON}</phanpy-shortcuts-settings>`;\n }\n showToast(t`Saving shortcuts to instance server…`);\n await masto.v1.accounts\n .$select(currentAccount)\n .note.create({\n comment: newNote,\n });\n setImportUIState('default');\n showToast(t`Shortcuts saved`);\n }\n } catch (e) {\n console.error(e);\n setImportUIState('error');\n showToast(t`Unable to save shortcuts`);\n }\n }}\n title={t`Sync to instance server`}\n >\n <Icon icon=\"cloud\" />\n <Icon icon=\"arrow-up\" />\n </button>\n )}{' '}\n {shortcutsStr.length > 0 && (\n <small class=\"insignificant ib\">\n <Plural\n value={shortcutsStr.length}\n one=\"# character\"\n other=\"# characters\"\n />\n </small>\n )}\n </p>\n {!!shortcutsStr && (\n <details>\n <summary class=\"insignificant\">\n <small>\n <Trans>Raw Shortcuts JSON</Trans>\n </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 {states.settings.shortcutSettingsCloudImportExport && (\n <footer>\n <p>\n <Icon icon=\"cloud\" />{' '}\n <Trans>\n Import/export settings from/to instance server (Very\n experimental)\n </Trans>\n </p>\n </footer>\n )}\n </main>\n </div>\n );\n}\n\nexport default ShortcutsSettings;\n","import { useLingui } from '@lingui/react/macro';\nimport { useEffect } from 'preact/hooks';\nimport { 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 ComposeSuspense, { preload } from './compose-suspense';\nimport Drafts from './drafts';\nimport EmbedModal from './embed-modal';\nimport GenericAccounts from './generic-accounts';\nimport MediaAltModal from './media-alt-modal';\nimport MediaModal from './media-modal';\nimport Modal from './modal';\nimport ReportModal from './report-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 { t } = useLingui();\n const snapStates = useSnapshot(states);\n const navigate = useNavigate();\n const location = useLocation();\n\n useEffect(() => {\n setTimeout(preload, 1000);\n }, []);\n\n return (\n <>\n {!!snapStates.showCompose && (\n <Modal\n class={`solid ${snapStates.composerState.minimized ? 'min' : ''}`}\n minimized={!!snapStates.composerState.minimized}\n >\n <ComposeSuspense\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, scheduledAt } = results || {};\n states.showCompose = false;\n window.__COMPOSE__ = null;\n if (newStatus) {\n states.reloadStatusPage++;\n if (scheduledAt) states.reloadScheduledPosts++;\n showToast({\n text: {\n post: scheduledAt\n ? t`Post scheduled`\n : t`Post published. Check it out.`,\n reply: scheduledAt\n ? t`Reply scheduled`\n : t`Reply posted. Check it out.`,\n edit: t`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 if (scheduledAt) {\n navigate('/sp');\n } else {\n navigate(\n instance\n ? `/${instance}/s/${newStatus.id}`\n : `/s/${newStatus.id}`,\n );\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 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.mediaIndex}\n statusID={snapStates.showMediaModal.statusID}\n onClose={() => {\n states.showMediaModal = false;\n }}\n />\n </Modal>\n )}\n {!!snapStates.showShortcutsSettings && (\n <Modal\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 onClose={() => {\n states.showGenericAccounts = false;\n }}\n >\n <GenericAccounts\n instance={snapStates.showGenericAccounts.instance}\n excludeRelationshipAttrs={\n snapStates.showGenericAccounts.excludeRelationshipAttrs\n }\n postID={snapStates.showGenericAccounts.postID}\n onClose={() => (states.showGenericAccounts = false)}\n blankCopy={snapStates.showGenericAccounts.blankCopy}\n />\n </Modal>\n )}\n {!!snapStates.showMediaAlt && (\n <Modal\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 {!!snapStates.showEmbedModal && (\n <Modal\n class=\"solid\"\n onClose={() => {\n states.showEmbedModal = false;\n }}\n >\n <EmbedModal\n html={snapStates.showEmbedModal.html}\n url={snapStates.showEmbedModal.url}\n width={snapStates.showEmbedModal.width}\n height={snapStates.showEmbedModal.height}\n onClose={() => {\n states.showEmbedModal = false;\n }}\n />\n </Modal>\n )}\n {!!snapStates.showReportModal && (\n <Modal\n onClose={() => {\n states.showReportModal = false;\n }}\n >\n <ReportModal\n account={snapStates.showReportModal.account}\n post={snapStates.showReportModal.post}\n onClose={() => {\n states.showReportModal = false;\n }}\n />\n </Modal>\n )}\n </>\n );\n}\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { 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 { t } = useLingui();\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 <Trans>Accept</Trans>\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 <Trans>Reject</Trans>\n </button>\n <span class=\"follow-request-states\">\n {hasRelationship && requestState ? (\n requestState === 'accept' ? (\n <Icon\n icon=\"check-circle\"\n alt={t`Accepted`}\n class=\"follow-accepted\"\n />\n ) : (\n <Icon icon=\"x-circle\" alt={t`Rejected`} class=\"follow-rejected\" />\n )\n ) : (\n <Loader hidden={uiState !== 'loading'} />\n )}\n </span>\n </p>\n );\n}\n\nexport default FollowRequestButtons;\n","import { msg, t } from '@lingui/core/macro';\nimport { Plural, Select, Trans, useLingui } from '@lingui/react/macro';\nimport { Fragment } from 'preact';\nimport { memo } from 'preact/compat';\n\nimport { api } from '../utils/api';\nimport { isFiltered } from '../utils/filters';\nimport shortenNumber from '../utils/shorten-number';\nimport states, { statusKey } from '../utils/states';\nimport { getCurrentAccountID } from '../utils/store-utils';\nimport useTruncated from '../utils/useTruncated';\n\nimport Avatar from './avatar';\nimport CustomEmoji from './custom-emoji';\nimport FollowRequestButtons from './follow-request-buttons';\nimport Icon from './icon';\nimport Link from './link';\nimport NameText from './name-text';\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 severed_relationships: 'heart-break',\n moderation_warning: 'alert',\n emoji_reaction: 'emoji2',\n 'pleroma:emoji_reaction': 'emoji2',\n annual_report: 'celebrate',\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\nsevered_relationships = Severed relationships\nmoderation_warning = Moderation warning\n*/\n\nfunction emojiText({ account, emoji, emoji_url }) {\n let url;\n let staticUrl;\n if (typeof emoji_url === 'string') {\n url = emoji_url;\n } else {\n url = emoji_url?.url;\n staticUrl = emoji_url?.staticUrl;\n }\n const emojiObject = url ? (\n <CustomEmoji url={url} staticUrl={staticUrl} alt={emoji} />\n ) : (\n emoji\n );\n return (\n <Trans>\n {account} reacted to your post with {emojiObject}\n </Trans>\n );\n}\n\nconst contentText = {\n status: ({ account }) => <Trans>{account} published a post.</Trans>,\n reblog: ({\n count,\n account,\n postsCount,\n postType,\n components: { Subject },\n }) => (\n <Plural\n value={count}\n _1={\n <Plural\n value={postsCount}\n _1={\n <Select\n value={postType}\n _reply={<Trans>{account} boosted your reply.</Trans>}\n other={<Trans>{account} boosted your post.</Trans>}\n />\n }\n other={\n <Trans>\n {account} boosted {postsCount} of your posts.\n </Trans>\n }\n />\n }\n other={\n <Select\n value={postType}\n _reply={\n <Trans>\n <Subject clickable={count > 1}>\n <span title={count}>{shortenNumber(count)}</span> people\n </Subject>{' '}\n boosted your reply.\n </Trans>\n }\n other={\n <Trans>\n <Subject clickable={count > 1}>\n <span title={count}>{shortenNumber(count)}</span> people\n </Subject>{' '}\n boosted your post.\n </Trans>\n }\n />\n }\n />\n ),\n follow: ({ account, count, components: { Subject } }) => (\n <Plural\n value={count}\n _1={<Trans>{account} followed you.</Trans>}\n other={\n <Trans>\n <Subject clickable={count > 1}>\n <span title={count}>{shortenNumber(count)}</span> people\n </Subject>{' '}\n followed you.\n </Trans>\n }\n />\n ),\n follow_request: ({ account }) => (\n <Trans>{account} requested to follow you.</Trans>\n ),\n favourite: ({\n account,\n count,\n postsCount,\n postType,\n components: { Subject },\n }) => (\n <Plural\n value={count}\n _1={\n <Plural\n value={postsCount}\n _1={\n <Select\n value={postType}\n _reply={<Trans>{account} liked your reply.</Trans>}\n other={<Trans>{account} liked your post.</Trans>}\n />\n }\n other={\n <Trans>\n {account} liked {postsCount} of your posts.\n </Trans>\n }\n />\n }\n other={\n <Select\n value={postType}\n _reply={\n <Trans>\n <Subject clickable={count > 1}>\n <span title={count}>{shortenNumber(count)}</span> people\n </Subject>{' '}\n liked your reply.\n </Trans>\n }\n other={\n <Trans>\n <Subject clickable={count > 1}>\n <span title={count}>{shortenNumber(count)}</span> people\n </Subject>{' '}\n liked your post.\n </Trans>\n }\n />\n }\n />\n ),\n poll: () => t`A poll you have voted in or created has ended.`,\n 'poll-self': () => t`A poll you have created has ended.`,\n 'poll-voted': () => t`A poll you have voted in has ended.`,\n update: () => t`A post you interacted with has been edited.`,\n 'favourite+reblog': ({\n count,\n account,\n postsCount,\n postType,\n components: { Subject },\n }) => (\n <Plural\n value={count}\n _1={\n <Plural\n value={postsCount}\n _1={\n <Select\n value={postType}\n _reply={<Trans>{account} boosted & liked your reply.</Trans>}\n other={<Trans>{account} boosted & liked your post.</Trans>}\n />\n }\n other={\n <Trans>\n {account} boosted & liked {postsCount} of your posts.\n </Trans>\n }\n />\n }\n other={\n <Select\n value={postType}\n _reply={\n <Trans>\n <Subject clickable={count > 1}>\n <span title={count}>{shortenNumber(count)}</span> people\n </Subject>{' '}\n boosted & liked your reply.\n </Trans>\n }\n other={\n <Trans>\n <Subject clickable={count > 1}>\n <span title={count}>{shortenNumber(count)}</span> people\n </Subject>{' '}\n boosted & liked your post.\n </Trans>\n }\n />\n }\n />\n ),\n 'admin.sign_up': ({ account }) => <Trans>{account} signed up.</Trans>,\n 'admin.report': ({ account, targetAccount }) => (\n <Trans>\n {account} reported {targetAccount}\n </Trans>\n ),\n severed_relationships: ({ name }) => (\n <Trans>\n Lost connections with <i>{name}</i>.\n </Trans>\n ),\n moderation_warning: () => (\n <b>\n <Trans>Moderation warning</Trans>\n </b>\n ),\n emoji_reaction: emojiText,\n 'pleroma:emoji_reaction': emojiText,\n annual_report: ({ year }) => <Trans>Your {year} #Wrapstodon is here!</Trans>,\n};\n\n// account_suspension, domain_block, user_domain_block\nconst SEVERED_RELATIONSHIPS_TEXT = {\n account_suspension: ({ from, targetName }) => (\n <Trans>\n An admin from <i>{from}</i> has suspended <i>{targetName}</i>, which means\n you can no longer receive updates from them or interact with them.\n </Trans>\n ),\n domain_block: ({ from, targetName, followersCount, followingCount }) => (\n <Trans>\n An admin from <i>{from}</i> has blocked <i>{targetName}</i>. Affected\n followers: {followersCount}, followings: {followingCount}.\n </Trans>\n ),\n user_domain_block: ({ targetName, followersCount, followingCount }) => (\n <Trans>\n You have blocked <i>{targetName}</i>. Removed followers: {followersCount},\n followings: {followingCount}.\n </Trans>\n ),\n};\n\nconst MODERATION_WARNING_TEXT = {\n none: msg`Your account has received a moderation warning.`,\n disable: msg`Your account has been disabled.`,\n mark_statuses_as_sensitive: msg`Some of your posts have been marked as sensitive.`,\n delete_statuses: msg`Some of your posts have been deleted.`,\n sensitive: msg`Your posts will be marked as sensitive from now on.`,\n silence: msg`Your account has been limited.`,\n suspend: msg`Your account has been suspended.`,\n};\n\nconst AVATARS_LIMIT = 30;\n\nfunction Notification({\n notification,\n instance,\n isStatic,\n disableContextMenu,\n}) {\n const { _ } = useLingui();\n const { masto } = api();\n const {\n id,\n status,\n account,\n report,\n event,\n moderation_warning,\n annualReport,\n // Client-side grouped notification\n _ids,\n _accounts,\n _statuses,\n _groupKeys,\n // Server-side grouped notification\n sampleAccounts,\n notificationsCount,\n groupKey,\n _notificationsCount,\n _sampleAccountsCount,\n } = notification;\n let { type } = notification;\n\n if (type === 'mention' && !status) {\n // Could be deleted\n return null;\n }\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 = getCurrentAccountID();\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 if (_accounts) {\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 }\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 (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 = t`[Unknown notification type: ${type}]`;\n }\n\n const Subject = ({ clickable, ...props }) =>\n clickable ? (\n <b tabIndex=\"0\" onClick={handleOpenGenericAccounts} {...props} />\n ) : (\n <b {...props} />\n );\n\n const diffCount =\n notificationsCount > 0 && notificationsCount > sampleAccounts?.length;\n const expandAccounts = diffCount ? 'remote' : 'local';\n\n if (typeof text === 'function') {\n const count =\n (type === 'favourite' || type === 'reblog') && notificationsCount\n ? diffCount\n ? notificationsCount\n : sampleAccounts?.length\n : _accounts?.length || sampleAccounts?.length || (account ? 1 : 0);\n const postsCount = _statuses?.length || (status ? 1 : 0);\n if (type === 'admin.report') {\n const targetAccount = report?.targetAccount;\n if (targetAccount) {\n text = text({\n account: <NameText account={account} showAvatar />,\n targetAccount: <NameText account={targetAccount} showAvatar />,\n });\n }\n } else if (type === 'severed_relationships') {\n const targetName = event?.targetName;\n if (targetName) {\n text = text({ name: targetName });\n }\n } else if (\n (type === 'emoji_reaction' || type === 'pleroma:emoji_reaction') &&\n notification.emoji\n ) {\n const emojiURL =\n notification.emoji_url || // This is string\n status?.emojis?.find?.(\n (emoji) =>\n emoji?.shortcode ===\n notification.emoji.replace(/^:/, '').replace(/:$/, ''),\n ); // Emoji object instead of string\n text = text({\n account: <NameText account={account} showAvatar />,\n emoji: notification.emoji,\n emojiURL,\n });\n } else if (type === 'annual_report') {\n text = text({\n ...notification.annualReport,\n });\n } else {\n text = text({\n account: account ? (\n <NameText account={account} showAvatar />\n ) : (\n sampleAccounts?.[0] && (\n <NameText account={sampleAccounts[0]} showAvatar />\n )\n ),\n count,\n postsCount,\n postType: isReplyToOthers ? 'reply' : 'post',\n components: { Subject },\n });\n }\n }\n\n const formattedCreatedAt =\n notification.createdAt && new Date(notification.createdAt).toLocaleString();\n\n const genericAccountsHeading =\n {\n 'favourite+reblog': t`Boosted/Liked by…`,\n favourite: t`Liked by…`,\n reblog: t`Boosted by…`,\n follow: t`Followed by…`,\n }[type] || t`Accounts`;\n const handleOpenGenericAccounts = () => {\n states.showGenericAccounts = {\n heading: genericAccountsHeading,\n accounts: _accounts,\n showReactions: type === 'favourite+reblog',\n excludeRelationshipAttrs: type === 'follow' ? ['followedBy'] : [],\n postID: statusKey(actualStatusID, instance),\n };\n };\n\n console.debug('RENDER Notification', notification.id);\n\n // If there's a status and filter action is 'hide', then the notification is hidden\n if (!!status?.filtered) {\n const isOwnPost = status?.account?.id === currentAccount;\n const filterInfo = isFiltered(status.filtered, 'notifications');\n if (!isSelf && !isOwnPost && filterInfo?.action === 'hide') {\n return null;\n }\n }\n\n return (\n <div\n class={`notification notification-${type}`}\n data-notification-id={_ids || id}\n data-group-key={_groupKeys?.join(' ') || groupKey}\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 === 'favourite+reblog' ||\n type === 'favourite' ||\n type === 'reblog') && (\n <>\n 💥 {type} {expandAccounts}{' '}\n <mark>\n N{_notificationsCount?.join(',')} + A\n {_sampleAccountsCount?.join(',')}\n </mark>{' '}\n ‒{' '}\n <mark>\n N{notificationsCount} + A{sampleAccounts?.length}\n </mark>\n </>\n )} */}\n {type !== 'mention' && (\n <>\n <p>{text}</p>\n {type === 'follow_request' && (\n <FollowRequestButtons accountID={account.id} />\n )}\n {type === 'severed_relationships' && (\n <div>\n {SEVERED_RELATIONSHIPS_TEXT[event.type]({\n from: instance,\n ...event,\n })}\n <br />\n <a\n href={`https://${instance}/severed_relationships`}\n target=\"_blank\"\n rel=\"noopener\"\n >\n <Trans>\n Learn more <Icon icon=\"external\" size=\"s\" />\n </Trans>\n </a>\n .\n </div>\n )}\n {type === 'moderation_warning' && !!moderation_warning && (\n <div>\n {_(MODERATION_WARNING_TEXT[moderation_warning.action]())}\n <br />\n <a\n href={`/disputes/strikes/${moderation_warning.id}`}\n target=\"_blank\"\n rel=\"noopener\"\n >\n <Trans>\n Learn more <Icon icon=\"external\" size=\"s\" />\n </Trans>\n </a>\n </div>\n )}\n {type === 'annual_report' && (\n <div>\n <Link to={`/annual_report/${annualReport?.year}`}>\n <Trans>View #Wrapstodon</Trans>\n </Link>\n </div>\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\"\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 : 'l'\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 {(type === 'favourite+reblog' ||\n type === 'favourite' ||\n type === 'reblog') &&\n expandAccounts === 'remote' ? (\n <button\n type=\"button\"\n class=\"small plain\"\n data-group-keys={_groupKeys?.join(' ')}\n onClick={() => {\n states.showGenericAccounts = {\n heading: genericAccountsHeading,\n accounts: _accounts,\n fetchAccounts: async () => {\n const keyAccounts = await Promise.allSettled(\n _groupKeys.map(async (gKey) => {\n const iterator = masto.v2.notifications\n .$select(gKey)\n .accounts.list()\n .values();\n return [gKey, (await iterator.next()).value];\n }),\n );\n const accounts = [];\n for (const keyAccount of keyAccounts) {\n const [key, _accounts] = keyAccount.value;\n const type = /^favourite/.test(key)\n ? 'favourite'\n : /^reblog/.test(key)\n ? 'reblog'\n : null;\n if (!type) continue;\n for (const account of _accounts) {\n const theAccount = accounts.find(\n (a) => a.id === account.id,\n );\n if (theAccount) {\n theAccount._types.push(type);\n } else {\n account._types = [type];\n accounts.push(account);\n }\n }\n }\n return {\n done: true,\n value: accounts,\n };\n },\n showReactions: type === 'favourite+reblog',\n postID: statusKey(actualStatusID, instance),\n };\n }}\n >\n +\n {(type === 'favourite' || type === 'reblog') &&\n notificationsCount - _accounts.length}\n <Icon icon=\"chevron-down\" />\n </button>\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 )}\n </p>\n )}\n {!_accounts?.length && sampleAccounts?.length > 1 && (\n <p class=\"avatars-stack\">\n {sampleAccounts.map((account) => (\n <Fragment key={account.id}>\n <a\n key={account.id}\n href={account.url}\n rel=\"noopener\"\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=\"xxl\"\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 {notificationsCount > sampleAccounts.length && (\n <Link\n to={\n instance ? `/${instance}/s/${status.id}` : `/s/${status.id}`\n }\n class=\"button small plain centered\"\n >\n +{notificationsCount - sampleAccounts.length}\n <Icon icon=\"chevron-right\" />\n </Link>\n )}\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\n status={status}\n size=\"s\"\n previewMode\n allowContextMenu\n allowFilters\n />\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\n status={actualStatus}\n size=\"s\"\n readOnly\n allowContextMenu\n allowFilters\n />\n ) : (\n <Status\n statusID={actualStatusID}\n size=\"s\"\n readOnly\n allowContextMenu\n allowFilters\n />\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={t`Read more →`} ref={ref} />;\n}\n\nexport default memo(Notification, (oldProps, newProps) => {\n return oldProps.notification?.id === newProps.notification?.id;\n});\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { 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 const { t } = useLingui();\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 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\" alt={t`Close`} />\n </button>\n <header>\n <b>\n <Trans>Notification</Trans>\n </b>\n </header>\n <main>\n {!sameInstance && (\n <p>\n <Trans>This notification is from your other account.</Trans>\n </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>\n <Trans>View all notifications</Trans>\n </span>{' '}\n <Icon icon=\"arrow-right\" />\n </Link>\n </div>\n </main>\n </div>\n </Modal>\n );\n }\n\n return null;\n});\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { 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 { t } = useLingui();\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={t`Search`}\n dir=\"auto\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n autocapitalize=\"off\"\n spellCheck=\"false\"\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 formRef.current\n ?.querySelector('.search-popover-item')\n ?.classList.add('focus');\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 <Link\n to={`/search?q=${encodeURIComponent(query)}`}\n class=\"search-popover-item focus\"\n onClick={(e) => {\n props?.onSubmit?.(e);\n }}\n >\n <Icon icon=\"search\" />\n <span>{query}</span>\n </Link>\n )} */}\n {!!query &&\n [\n {\n label: (\n <Trans>\n {query}{' '}\n <small class=\"insignificant\">\n ‒ accounts, hashtags & posts\n </small>\n </Trans>\n ),\n to: `/search?q=${encodeURIComponent(query)}`,\n top: !type && !/\\s/.test(query),\n hidden: !!type,\n },\n {\n label: (\n <Trans>\n Posts with <q>{query}</q>\n </Trans>\n ),\n to: `/search?q=${encodeURIComponent(query)}&type=statuses`,\n hidden: /^https?:/.test(query),\n top: /\\s/.test(query),\n icon: 'document',\n queryType: 'statuses',\n },\n {\n label: (\n <Trans>\n Posts tagged with <mark>#{query.replace(/^#/, '')}</mark>\n </Trans>\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 icon: 'hashtag',\n queryType: 'hashtags',\n },\n {\n label: (\n <Trans>\n Look up <mark>{query}</mark>\n </Trans>\n ),\n to: `/${query}`,\n hidden: !/^https?:/.test(query),\n top: /^https?:/.test(query),\n type: 'link',\n },\n {\n label: (\n <Trans>\n Accounts with <q>{query}</q>\n </Trans>\n ),\n to: `/search?q=${encodeURIComponent(query)}&type=accounts`,\n icon: 'group',\n queryType: 'accounts',\n },\n ]\n .sort((a, b) => {\n if (type) {\n if (a.queryType === type) return -1;\n if (b.queryType === type) return 1;\n }\n if (a.top && !b.top) return -1;\n if (!a.top && b.top) return 1;\n return 0;\n })\n .filter(({ hidden }) => !hidden)\n .map(({ label, to, icon, type }, i) => (\n <Link\n to={to}\n class={`search-popover-item ${i === 0 ? 'focus' : ''}`}\n // hidden={hidden}\n onClick={(e) => {\n console.log('onClick', e);\n props?.onSubmit?.(e);\n }}\n >\n <Icon\n icon={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 ['Slash', '/'],\n (e) => {\n setShowSearch(true);\n setTimeout(() => {\n searchFormRef.current?.focus?.();\n searchFormRef.current?.select?.();\n }, 0);\n },\n {\n useKey: true,\n preventDefault: true,\n ignoreEventWhen: (e) => {\n const isSearchPage = /\\/search/.test(location.hash);\n const hasModal = !!document.querySelector('#modal-container > *');\n return (\n isSearchPage ||\n hasModal ||\n e.metaKey ||\n e.ctrlKey ||\n e.altKey ||\n e.shiftKey\n );\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 useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\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 { Trans, useLingui } from '@lingui/react/macro';\nimport { MenuDivider } from '@szhsin/react-menu';\nimport { memo } from 'preact/compat';\nimport { useEffect, useRef, useState } 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 { getLists } from '../utils/lists';\nimport states from '../utils/states';\n\nimport AsyncText from './AsyncText';\nimport Icon from './icon';\nimport Link from './link';\nimport ListExclusiveBadge from './list-exclusive-badge';\nimport MenuLink from './menu-link';\nimport Menu2 from './menu2';\nimport SubMenu2 from './submenu2';\n\nfunction Shortcuts() {\n const { t, _ } = useLingui();\n const { instance } = api();\n const snapStates = useSnapshot(states);\n const { shortcuts, settings } = snapStates;\n\n if (!shortcuts.length) {\n return null;\n }\n const isMultiColumnMode =\n settings.shortcutsViewMode === 'multi-column' ||\n (!settings.shortcutsViewMode && settings.shortcutsColumnsMode);\n\n const menuRef = useRef();\n const tabBarRef = useRef();\n\n const hasLists = useRef(false);\n const formattedShortcuts = 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 } else {\n title = _(title);\n }\n if (typeof subtitle === 'function') {\n subtitle = subtitle(data, i);\n } else {\n subtitle = _(subtitle);\n }\n if (typeof icon === 'function') {\n icon = icon(data, i);\n }\n\n if (id === 'lists') {\n hasLists.current = true;\n }\n\n return {\n id,\n path,\n title,\n subtitle,\n icon,\n };\n })\n .filter(Boolean);\n\n // Auto-scroll to active tab on first render\n useEffect(() => {\n if (\n snapStates.settings.shortcutsViewMode === 'tab-menu-bar' &&\n tabBarRef.current\n ) {\n const timeoutId = setTimeout(() => {\n const activeTab = tabBarRef.current?.querySelector('.is-active');\n if (activeTab) {\n activeTab.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'center',\n });\n }\n }, 100);\n\n return () => clearTimeout(timeoutId);\n }\n }, []);\n\n const navigate = useNavigate();\n useHotkeys(\n ['1', '2', '3', '4', '5', '6', '7', '8', '9'],\n (e) => {\n const index = parseInt(e.key, 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 enabled: !isMultiColumnMode,\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n },\n );\n\n const [lists, setLists] = useState([]);\n\n if (isMultiColumnMode) {\n return null;\n }\n\n return (\n <div id=\"shortcuts\">\n {snapStates.settings.shortcutsViewMode === 'tab-menu-bar' ? (\n <nav\n ref={tabBarRef}\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 onMenuChange={(e) => {\n if (e.open && hasLists.current) {\n getLists().then(setLists);\n }\n }}\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={t`Shortcuts`} />\n </button>\n }\n >\n {formattedShortcuts.map(({ id, path, title, subtitle, icon }, i) => {\n if (id === 'lists') {\n return (\n <SubMenu2\n menuClassName=\"glass-menu\"\n overflow=\"auto\"\n gap={-8}\n label={\n <>\n <Icon icon={icon} size=\"l\" />\n <span class=\"menu-grow\">\n <AsyncText>{title}</AsyncText>\n </span>\n <Icon icon=\"chevron-right\" />\n </>\n }\n >\n <MenuLink to=\"/l\">\n <span>\n <Trans>All Lists</Trans>\n </span>\n </MenuLink>\n <MenuDivider />\n {lists?.map((list) => (\n <MenuLink key={list.id} to={`/l/${list.id}`}>\n <span>\n {list.title}\n {list.exclusive && (\n <>\n {' '}\n <ListExclusiveBadge />\n </>\n )}\n </span>\n </MenuLink>\n ))}\n </SubMenu2>\n );\n }\n\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 { api } from './api';\nimport { extractTagsFromStatus, getFollowedTags } from './followed-tags';\nimport pmem from './pmem';\nimport { fetchRelationships } from './relationships';\nimport states, { saveStatus, statusKey } from './states';\nimport store from './store';\nimport supports from './supports';\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, instance) {\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 const inReplyToIds = [];\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\n // PREPARE FOR REPLY HINTS\n if (item.inReplyToId && item.inReplyToAccountId !== item.account.id) {\n const sKey = statusKey(item.id, instance);\n if (!states.statusReply[sKey]) {\n // If it's a reply and not a thread\n inReplyToIds.push({\n sKey,\n inReplyToId: item.inReplyToId,\n });\n // queueMicrotask(async () => {\n // try {\n // const { masto } = api({ instance });\n // // const replyToStatus = await masto.v1.statuses\n // // .$select(item.inReplyToId)\n // // .fetch();\n // const replyToStatus = await fetchStatus(item.inReplyToId, masto);\n // saveStatus(replyToStatus, instance, {\n // skipThreading: true,\n // skipUnfurling: true,\n // });\n // states.statusReply[sKey] = {\n // id: replyToStatus.id,\n // instance,\n // };\n // } catch (e) {\n // // Silently fail\n // console.error(e);\n // }\n // });\n }\n }\n\n newItems.push(item);\n });\n\n // FETCH AND SHOW REPLY HINTS\n if (inReplyToIds?.length) {\n queueMicrotask(() => {\n const { masto } = api({ instance });\n console.log('REPLYHINT', inReplyToIds);\n\n // Fallback if batch fetch fails or returns nothing or not supported\n async function fallbackFetch() {\n for (let i = 0; i < inReplyToIds.length; i++) {\n const { sKey, inReplyToId } = inReplyToIds[i];\n try {\n const replyToStatus = await fetchStatus(inReplyToId, masto);\n saveStatus(replyToStatus, instance, {\n skipThreading: true,\n });\n states.statusReply[sKey] = {\n id: replyToStatus.id,\n instance,\n };\n // Pause 1s\n await new Promise((resolve) => setTimeout(resolve, 1000));\n } catch (e) {\n // Silently fail\n console.error(e);\n }\n }\n }\n\n if (supports('@mastodon/fetch-multiple-statuses')) {\n // This is batch fetching yooo, woot\n // Limit 20, returns 422 if exceeded https://github.com/mastodon/mastodon/pull/27871\n const ids = inReplyToIds.map(({ inReplyToId }) => inReplyToId);\n (async () => {\n try {\n const replyToStatuses = await masto.v1.statuses.list({ id: ids });\n if (replyToStatuses?.length) {\n for (const replyToStatus of replyToStatuses) {\n saveStatus(replyToStatus, instance, {\n skipThreading: true,\n });\n const sKey = inReplyToIds.find(\n ({ inReplyToId }) => inReplyToId === replyToStatus.id,\n )?.sKey;\n if (sKey) {\n states.statusReply[sKey] = {\n id: replyToStatus.id,\n instance,\n };\n }\n }\n } else {\n fallbackFetch();\n }\n } catch (e) {\n // Silently fail\n console.error(e);\n fallbackFetch();\n }\n })();\n } else {\n fallbackFetch();\n }\n });\n }\n\n return newItems;\n}\n\nconst fetchStatus = pmem((statusID, masto) => {\n return masto.v1.statuses.$select(statusID).fetch();\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 && !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 const scrollDirection = useRef(null);\n\n const onScroll = useThrottledCallback(() => {\n // let scrollDirection = null;\n let reachStart = false;\n let reachEnd = false;\n let nearReachStart = false;\n let nearReachEnd = false;\n\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 scrollDirection.current =\n previousScrollStart.current < scrollStart ? 'end' : 'start';\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 reachStart = scrollStart <= 0;\n reachEnd = scrollStart + clientDimension >= scrollDimension;\n nearReachStart = scrollStart <= distanceFromStartPx;\n nearReachEnd =\n scrollStart + clientDimension >= scrollDimension - distanceFromEndPx;\n\n callback({\n scrollDirection: scrollDirection.current,\n reachStart,\n reachEnd,\n nearReachStart,\n nearReachEnd,\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 ...deps,\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 { Trans, useLingui } from '@lingui/react/macro';\nimport { memo } from 'preact/compat';\nimport { useContext, useMemo } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport { getPreferences } from '../utils/api';\nimport FilterContext from '../utils/filter-context';\nimport { isFiltered } from '../utils/filters';\nimport states, { statusKey } from '../utils/states';\nimport store from '../utils/store';\nimport { getCurrentAccountID } from '../utils/store-utils';\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 const { t } = useLingui();\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 getCurrentAccountID();\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 prefs = getPreferences();\n const readingExpandMedia =\n prefs['reading:expand:media']?.toLowerCase() || 'default';\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 ? t`Sensitive media` : undefined)\n }\n data-filtered-text={\n filterInfo\n ? filterTitleStr\n ? t`Filtered: ${filterTitleStr}`\n : t`Filtered`\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 { Trans, useLingui } from '@lingui/react/macro';\nimport { ControlledMenu, MenuDivider, MenuItem } from '@szhsin/react-menu';\nimport { memo } from 'preact/compat';\nimport { useEffect, useMemo, useRef, useState } from 'preact/hooks';\nimport { useLongPress } from 'use-long-press';\nimport { useSnapshot } from 'valtio';\n\nimport { api } from '../utils/api';\nimport { getLists } from '../utils/lists';\nimport safeBoundingBoxPadding from '../utils/safe-bounding-box-padding';\nimport states from '../utils/states';\nimport store from '../utils/store';\nimport { getAccounts, getCurrentAccountID } from '../utils/store-utils';\nimport supports from '../utils/supports';\n\nimport Avatar from './avatar';\nimport Icon from './icon';\nimport ListExclusiveBadge from './list-exclusive-badge';\nimport MenuLink from './menu-link';\nimport SubMenu2 from './submenu2';\n\nfunction NavMenu(props) {\n const { t } = useLingui();\n const snapStates = useSnapshot(states);\n const { masto, instance, authenticated } = api();\n\n const [currentAccount, moreThanOneAccount] = useMemo(() => {\n const accounts = getAccounts();\n const acc =\n accounts.find((account) => account.info.id === getCurrentAccountID()) ||\n accounts[0];\n return [acc, 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\n .list({\n limit: 80,\n })\n .values();\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\n .list({\n limit: 80,\n })\n .values();\n }\n const results = await blocksIterator.current.next();\n return results;\n }\n\n const buttonClickTS = useRef();\n return (\n <>\n <button\n ref={buttonRef}\n type=\"button\"\n class={`button plain nav-menu-button ${\n moreThanOneAccount ? 'with-avatar' : ''\n } ${menuState === 'open' ? 'active' : ''}`}\n style={{ position: 'relative' }}\n onClick={() => {\n buttonClickTS.current = Date.now();\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'} alt={t`Menu`} />\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 if (Date.now() - buttonClickTS.current < 300) {\n return;\n }\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(t`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>\n <Trans>New update available…</Trans>\n </span>\n </MenuItem>\n <MenuDivider />\n </div>\n )}\n <section>\n <MenuLink to=\"/\">\n <Icon icon=\"home\" size=\"l\" />{' '}\n <span>\n <Trans>Home</Trans>\n </span>\n </MenuLink>\n {authenticated ? (\n <>\n {showFollowing && (\n <MenuLink to=\"/following\">\n <Icon icon=\"following\" size=\"l\" />{' '}\n <span>\n <Trans id=\"following.title\">Following</Trans>\n </span>\n </MenuLink>\n )}\n <MenuLink to=\"/catchup\">\n <Icon icon=\"history2\" size=\"l\" />\n <span>\n <Trans>Catch-up</Trans>\n </span>\n </MenuLink>\n {supports('@mastodon/mentions') && (\n <MenuLink to=\"/mentions\">\n <Icon icon=\"at\" size=\"l\" />{' '}\n <span>\n <Trans>Mentions</Trans>\n </span>\n </MenuLink>\n )}\n <MenuLink to=\"/notifications\">\n <Icon icon=\"notification\" size=\"l\" />{' '}\n <span>\n <Trans>Notifications</Trans>\n </span>\n {snapStates.notificationsShowNew && (\n <sup title={t`New`} style={{ opacity: 0.5 }}>\n {' '}\n •\n </sup>\n )}\n </MenuLink>\n <MenuDivider />\n {currentAccount?.info?.id && (\n <MenuLink to={`/${instance}/a/${currentAccount.info.id}`}>\n <Icon icon=\"user\" size=\"l\" />{' '}\n <span>\n <Trans>Profile</Trans>\n </span>\n </MenuLink>\n )}\n <ListMenu menuState={menuState} />\n <MenuLink to=\"/b\">\n <Icon icon=\"bookmark\" size=\"l\" />{' '}\n <span>\n <Trans>Bookmarks</Trans>\n </span>\n </MenuLink>\n <SubMenu2\n menuClassName=\"nav-submenu\"\n overflow=\"auto\"\n gap={-8}\n label={\n <>\n <Icon icon=\"more\" size=\"l\" />\n <span class=\"menu-grow\">\n <Trans>More…</Trans>\n </span>\n <Icon icon=\"chevron-right\" />\n </>\n }\n >\n <MenuLink to=\"/f\">\n <Icon icon=\"heart\" size=\"l\" />{' '}\n <span>\n <Trans>Likes</Trans>\n </span>\n </MenuLink>\n <MenuLink to=\"/fh\">\n <Icon icon=\"hashtag\" size=\"l\" />{' '}\n <span>\n <Trans>Followed Hashtags</Trans>\n </span>\n </MenuLink>\n <MenuLink to=\"/sp\">\n <Icon icon=\"schedule\" size=\"l\" />{' '}\n <span>\n <Trans>Scheduled Posts</Trans>\n </span>\n </MenuLink>\n <MenuDivider />\n {supports('@mastodon/filters') && (\n <MenuLink to=\"/ft\">\n <Icon icon=\"filters\" size=\"l\" />{' '}\n <span>\n <Trans>Filters</Trans>\n </span>\n </MenuLink>\n )}\n <MenuItem\n onClick={() => {\n states.showGenericAccounts = {\n id: 'mute',\n heading: t`Muted users`,\n fetchAccounts: fetchMutes,\n excludeRelationshipAttrs: ['muting'],\n };\n }}\n >\n <Icon icon=\"mute\" size=\"l\" />{' '}\n <span>\n <Trans>Muted users…</Trans>\n </span>\n </MenuItem>\n <MenuItem\n onClick={() => {\n states.showGenericAccounts = {\n id: 'block',\n heading: t`Blocked users`,\n fetchAccounts: fetchBlocks,\n excludeRelationshipAttrs: ['blocking'],\n };\n }}\n >\n <Icon icon=\"block\" size=\"l\" />{' '}\n <span>\n <Trans>Blocked users…</Trans>\n </span>\n </MenuItem>{' '}\n </SubMenu2>\n <MenuDivider />\n <MenuItem\n onClick={() => {\n states.showAccounts = true;\n }}\n >\n <Icon icon=\"group\" size=\"l\" />{' '}\n <span>\n <Trans>Accounts…</Trans>\n </span>\n </MenuItem>\n </>\n ) : (\n <>\n <MenuDivider />\n <MenuLink to=\"/login\">\n <Icon icon=\"user\" size=\"l\" />{' '}\n <span>\n <Trans>Log in</Trans>\n </span>\n </MenuLink>\n </>\n )}\n </section>\n <section>\n <MenuDivider />\n <MenuLink to={`/search`}>\n <Icon icon=\"search\" size=\"l\" />{' '}\n <span>\n <Trans>Search</Trans>\n </span>\n </MenuLink>\n <MenuLink to={`/${instance}/trending`}>\n <Icon icon=\"chart\" size=\"l\" />{' '}\n <span>\n <Trans>Trending</Trans>\n </span>\n </MenuLink>\n <MenuLink to={`/${instance}/p/l`}>\n <Icon icon=\"building\" size=\"l\" />{' '}\n <span>\n <Trans>Local</Trans>\n </span>\n </MenuLink>\n <MenuLink to={`/${instance}/p`}>\n <Icon icon=\"earth\" size=\"l\" />{' '}\n <span>\n <Trans>Federated</Trans>\n </span>\n </MenuLink>\n {authenticated ? (\n <>\n <MenuDivider className=\"divider-grow\" />\n <MenuItem\n onClick={() => {\n states.showKeyboardShortcutsHelp = true;\n }}\n >\n <Icon icon=\"keyboard\" size=\"l\" />{' '}\n <span>\n <Trans>Keyboard shortcuts</Trans>\n </span>\n </MenuItem>\n <MenuItem\n onClick={() => {\n states.showShortcutsSettings = true;\n }}\n >\n <Icon icon=\"shortcut\" size=\"l\" />{' '}\n <span>\n <Trans>Shortcuts / Columns…</Trans>\n </span>\n </MenuItem>\n <MenuItem\n onClick={() => {\n states.showSettings = true;\n }}\n >\n <Icon icon=\"gear\" size=\"l\" />{' '}\n <span>\n <Trans>Settings…</Trans>\n </span>\n </MenuItem>\n </>\n ) : (\n <>\n <MenuDivider />\n <MenuItem\n onClick={() => {\n states.showSettings = true;\n }}\n >\n <Icon icon=\"gear\" size=\"l\" />{' '}\n <span>\n <Trans>Settings…</Trans>\n </span>\n </MenuItem>\n </>\n )}\n </section>\n </ControlledMenu>\n </>\n );\n}\n\nfunction ListMenu({ menuState }) {\n const supportsLists = supports('@mastodon/lists');\n const [lists, setLists] = useState([]);\n useEffect(() => {\n if (!supportsLists) return;\n if (menuState === 'open') {\n getLists().then(setLists);\n }\n }, [menuState, supportsLists]);\n\n return lists.length > 0 ? (\n <SubMenu2\n menuClassName=\"nav-submenu\"\n overflow=\"auto\"\n gap={-8}\n label={\n <>\n <Icon icon=\"list\" size=\"l\" />\n <span class=\"menu-grow\">\n <Trans>Lists</Trans>\n </span>\n <Icon icon=\"chevron-right\" />\n </>\n }\n >\n <MenuLink to=\"/l\">\n <span>\n <Trans>All Lists</Trans>\n </span>\n </MenuLink>\n {lists?.length > 0 && (\n <>\n <MenuDivider />\n {lists.map((list) => (\n <MenuLink key={list.id} to={`/l/${list.id}`}>\n <span>\n {list.title}\n {list.exclusive && (\n <>\n {' '}\n <ListExclusiveBadge />\n </>\n )}\n </span>\n </MenuLink>\n ))}\n </>\n )}\n </SubMenu2>\n ) : (\n supportsLists && (\n <MenuLink to=\"/l\">\n <Icon icon=\"list\" size=\"l\" />\n <span>\n <Trans>Lists</Trans>\n </span>\n </MenuLink>\n )\n );\n}\n\nexport default memo(NavMenu);\n","import { plural } from '@lingui/core/macro';\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { memo } from 'preact/compat';\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} 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 isRTL from '../utils/is-rtl';\nimport showToast from '../utils/show-toast';\nimport states, { statusKey } from '../utils/states';\nimport statusPeek from '../utils/status-peek';\nimport { isMediaFirstInstance } from '../utils/store-utils';\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: 'start',\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 showReplyParent,\n clearWhenRefresh,\n}) {\n const { t } = useLingui();\n const snapStates = useSnapshot(states);\n const [items, setItems] = useState([]);\n const [uiState, setUIState] = useState('start');\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 __BENCHMARK.start(`timeline-${id}-load`);\n\n const mediaFirst = useMemo(() => isMediaFirstInstance(), []);\n\n const allowGrouping = view !== 'media';\n const loadItemsTS = useRef(0); // Ensures only one loadItems at a time\n const loadItems = useDebouncedCallback(\n (firstLoad) => {\n setShowNew(false);\n // if (uiState === 'loading') return;\n setUIState('loading');\n (async () => {\n try {\n const ts = (loadItemsTS.current = Date.now());\n let { done, value } = await fetchItems(firstLoad);\n if (ts !== loadItemsTS.current) return;\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, instance);\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 __BENCHMARK.end(`timeline-${id}-load`);\n } catch (e) {\n console.error(e);\n setUIState('error');\n if (firstLoad && !items.length && errorText) {\n showToast(errorText);\n }\n } finally {\n loadItems.cancel();\n }\n })();\n },\n 1_000,\n {\n leading: true,\n // trailing: false,\n },\n );\n\n const itemsSelector = '.timeline-item, .timeline-item-alt';\n\n const jRef = useHotkeys(\n 'j, shift+j',\n (e, handler) => {\n // Fix bug: shift+j is fired even when j is pressed due to useKey: true\n if (e.shiftKey !== handler.shift) return;\n\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 ).filter((item) => !!item.offsetHeight);\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 useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey,\n },\n );\n\n const kRef = useHotkeys(\n 'k, shift+k',\n (e, handler) => {\n // Fix bug: shift+k is fired even when k is pressed due to useKey: true\n if (e.shiftKey !== handler.shift) return;\n\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 ).filter((item) => !!item.offsetHeight);\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 useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey,\n },\n );\n\n const oRef = useHotkeys(\n ['enter', 'o'],\n () => {\n // open active status\n const activeItem = document.activeElement;\n if (activeItem?.matches(itemsSelector)) {\n activeItem.click();\n }\n },\n {\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n },\n );\n\n const showNewPostsIndicator =\n items.length > 0 && uiState !== 'loading' && showNew;\n const handleLoadNewPosts = useCallback(() => {\n if (showNewPostsIndicator) loadItems(true);\n scrollableRef.current?.scrollTo({\n top: 0,\n behavior: 'smooth',\n });\n }, [loadItems, showNewPostsIndicator]);\n const dotRef = useHotkeys('.', handleLoadNewPosts, {\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\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 const firstLoad = useRef(true);\n useEffect(() => {\n if (firstLoad.current) {\n firstLoad.current = false;\n return;\n }\n if (clearWhenRefresh && items?.length) {\n loadItems.cancel?.();\n setItems([]);\n }\n loadItems(true);\n }, [clearWhenRefresh, 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 mediaFirst ? 'deck-container-media-first' : ''\n }`}\n ref={(node) => {\n scrollableRef.current = node;\n jRef.current = node;\n kRef.current = node;\n oRef.current = node;\n dotRef.current = node;\n }}\n tabIndex=\"-1\"\n onClick={(e) => {\n // If click on timeline item, unhide header\n if (\n headerRef.current &&\n e.target.closest('.timeline-item, .timeline-item-alt')\n ) {\n setTimeout(() => {\n headerRef.current.hidden = false;\n }, 250);\n }\n }}\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\" alt={t`Home`} />\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 {showNewPostsIndicator && (\n <button\n class=\"updates-button shiny-pill\"\n type=\"button\"\n onClick={handleLoadNewPosts}\n >\n <Icon icon=\"arrow-up\" /> <Trans>New posts</Trans>\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 showReplyParent={showReplyParent}\n mediaFirst={mediaFirst}\n />\n ))}\n {showMore &&\n uiState === 'loading' &&\n (view === 'media' ? null : (\n <>\n <li\n style={{\n height: '20vh',\n }}\n >\n <Status skeleton mediaFirst={mediaFirst} />\n </li>\n <li\n style={{\n height: '25vh',\n }}\n >\n <Status skeleton mediaFirst={mediaFirst} />\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 <Trans>Show more…</Trans>\n </button>\n </InView>\n ) : (\n <p class=\"ui-state insignificant\">\n <Trans>The end.</Trans>\n </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 mediaFirst={mediaFirst} />\n </li>\n ),\n )}\n </ul>\n ) : (\n uiState !== 'error' &&\n uiState !== 'start' && <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 <Trans>Try again</Trans>\n </button>\n </p>\n )}\n </div>\n </div>\n </FilterContext.Provider>\n );\n}\n\nconst TimelineItem = memo(\n ({\n status,\n instance,\n useItemID,\n // allowFilters,\n filterContext,\n view,\n showFollowedTags,\n showReplyParent,\n mediaFirst,\n }) => {\n const { t } = useLingui();\n console.debug('RENDER TimelineItem', status.id);\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\n if (items) {\n let fItems = filteredItems(items, filterContext);\n let title = '';\n if (type === 'boosts') {\n title = plural(fItems.length, {\n one: '# Boost',\n other: '# Boosts',\n });\n } else if (type === 'pinned') {\n title = t`Pinned posts`;\n }\n const isCarousel = type === 'boosts' || type === 'pinned';\n if (isCarousel) {\n const filteredItemsIDs = new Set();\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 && aFiltered?.action !== 'blur') {\n filteredItemsIDs.add(a.id);\n }\n if (bFiltered && bFiltered?.action !== 'blur') {\n filteredItemsIDs.add(b.id);\n }\n if (aFiltered && !bFiltered) {\n return 1;\n }\n if (!aFiltered && bFiltered) {\n return -1;\n }\n return 0;\n });\n\n if (filteredItemsIDs.size >= 2) {\n const GROUP_SIZE = 5;\n // If 2 or more, group filtered items into one, limit to GROUP_SIZE in a group\n const unfiltered = [];\n const filtered = [];\n fItems.forEach((item) => {\n if (filteredItemsIDs.has(item.id)) {\n filtered.push(item);\n } else {\n unfiltered.push(item);\n }\n });\n const filteredItems = [];\n for (let i = 0; i < filtered.length; i += GROUP_SIZE) {\n filteredItems.push({\n _grouped: true,\n posts: filtered.slice(i, i + GROUP_SIZE),\n });\n }\n fItems = unfiltered.concat(filteredItems);\n }\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, _grouped } = item;\n if (_grouped) {\n return (\n <li key={statusID} class=\"timeline-item-carousel-group\">\n {item.posts.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 <Link\n class=\"status-carousel-link timeline-item-alt\"\n to={url}\n >\n {useItemID ? (\n <Status\n statusID={statusID}\n instance={instance}\n size=\"s\"\n />\n ) : (\n <Status\n status={item}\n instance={instance}\n size=\"s\"\n />\n )}\n </Link>\n );\n })}\n </li>\n );\n }\n\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\n class=\"status-carousel-link timeline-item-alt\"\n to={url}\n >\n {useItemID ? (\n <Status\n statusID={statusID}\n instance={instance}\n size=\"s\"\n contentTextWeight\n enableCommentHint\n // allowFilters={allowFilters}\n mediaFirst={mediaFirst}\n />\n ) : (\n <Status\n status={item}\n instance={instance}\n size=\"s\"\n contentTextWeight\n enableCommentHint\n // allowFilters={allowFilters}\n mediaFirst={mediaFirst}\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\n status={item}\n instance={instance}\n filterContext={filterContext}\n />\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 showReplyParent={showReplyParent}\n // allowFilters={allowFilters}\n mediaFirst={mediaFirst}\n />\n ) : (\n <Status\n status={status}\n instance={instance}\n enableCommentHint\n showFollowedTags={showFollowedTags}\n showReplyParent={showReplyParent}\n // allowFilters={allowFilters}\n mediaFirst={mediaFirst}\n />\n )}\n </Link>\n </li>\n );\n },\n (oldProps, newProps) => {\n const oldID = (oldProps.status?.id || '').toString();\n const newID = (newProps.status?.id || '').toString();\n return (\n oldID === newID &&\n oldProps.instance === newProps.instance &&\n oldProps.view === newProps.view\n );\n },\n);\n\nfunction StatusCarousel({ title, class: className, children }) {\n const { t } = useLingui();\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 const left =\n Math.min(320, carouselRef.current?.offsetWidth) *\n (isRTL() ? 1 : -1);\n carouselRef.current?.scrollBy({\n left,\n behavior: 'smooth',\n });\n }}\n >\n <Icon icon=\"chevron-left\" alt={t`Previous`} />\n </button>{' '}\n <button\n ref={endButtonRef}\n type=\"button\"\n class=\"small plain2\"\n // disabled={reachEnd}\n onClick={() => {\n const left =\n Math.min(320, carouselRef.current?.offsetWidth) *\n (isRTL() ? -1 : 1);\n carouselRef.current?.scrollBy({\n left,\n behavior: 'smooth',\n });\n }}\n >\n <Icon icon=\"chevron-right\" alt={t`Next`} />\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, filterContext }) {\n const { t } = useLingui();\n const snapStates = useSnapshot(states);\n const { id, visibility, language } = status;\n const statusPeekText = statusPeek(status);\n const sKey = statusKey(id, instance);\n const filterInfo = isFiltered(status.filtered, filterContext);\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\" alt={t`Thread`} />\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\" alt={t`Thread`} />\n </div>\n )}\n <div\n class=\"content-compact\"\n title={statusPeekText}\n lang={language}\n dir=\"auto\"\n >\n {!!filterInfo && filterInfo?.action !== 'blur' ? (\n <b\n class=\"status-filtered-badge badge-meta horizontal\"\n title={filterInfo?.titlesStr || ''}\n >\n {filterInfo?.titlesStr ? (\n <Trans>\n <span>Filtered</span>: <span>{filterInfo.titlesStr}</span>\n </Trans>\n ) : (\n <span>\n <Trans>Filtered</Trans>\n </span>\n )}\n </b>\n ) : (\n <>\n {statusPeekText}\n {status.sensitive && status.spoilerText && (\n <>\n {' '}\n <span class=\"spoiler-badge\">\n <Icon icon=\"eye-close\" size=\"s\" alt={t`Content warning`} />\n </span>\n </>\n )}\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 { Trans, useLingui } from '@lingui/react/macro';\nimport { MenuItem } from '@szhsin/react-menu';\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'preact/hooks';\nimport punycode from 'punycode/';\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, { saveStatus } from '../utils/states';\nimport { isMediaFirstInstance } from '../utils/store-utils';\nimport supports from '../utils/supports';\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.list({\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 { i18n, t } = useLingui();\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 mediaFirst = useMemo(() => isMediaFirstInstance(), []);\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.list({\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 let results = [];\n if (firstLoad) {\n const { value } = await masto.v1.accounts\n .$select(id)\n .statuses.list({\n pinned: true,\n })\n .values()\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 || undefined,\n tagged,\n })\n .values();\n }\n const { value, done } = await accountStatusesIterator.current.next();\n if (value?.length) {\n if (!supports('@mastodon/pinned-posts')) {\n // Check if value is same as pinned post (results)\n // If the index for every post is the same, means API might not support pinned posts\n // TODO: This is a really weird check, fix this at some point\n if (results.length) {\n let pinnedStatusesIds = [];\n if (results[0]?.type === 'pinned') {\n pinnedStatusesIds = results[0].id;\n } else {\n pinnedStatusesIds = results\n .filter((status) => status._pinned)\n .map((status) => status.id);\n }\n const containsAllPinned = pinnedStatusesIds.every((postId) =>\n value.some((status) => status.id === postId),\n );\n if (containsAllPinned) {\n // Remove pinned posts\n results = [];\n }\n }\n }\n\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 let title = t`Account posts`;\n if (account?.acct) {\n const acctDisplay = (/@/.test(account.acct) ? '' : '@') + account.acct;\n const accountDisplay = account?.displayName\n ? `${account.displayName} (${acctDisplay})`\n : `${acctDisplay}`;\n if (!excludeReplies) {\n title = t`${accountDisplay} (+ Replies)`;\n } else if (excludeBoosts) {\n title = t`${accountDisplay} (- Boosts)`;\n } else if (tagged) {\n title = t`${accountDisplay} (#${tagged})`;\n } else if (media) {\n title = t`${accountDisplay} (Media)`;\n } else if (month) {\n const monthYear = new Date(month).toLocaleString(i18n.locale, {\n month: 'long',\n year: 'numeric',\n });\n title = t`${accountDisplay} (${monthYear})`;\n } else {\n title = accountDisplay;\n }\n }\n useTitle(title, '/:instance?/a/:id');\n\n const fetchAccount = useCallback(() => {\n return memFetchAccount(id, masto);\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 // No need, because the whole filter bar is hidden\n // TODO: Revisit this\n if (!mediaFirst) {\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 })();\n }, [id, mediaFirst]);\n\n const { displayName, acct, emojis } = account || {};\n\n const filterBarRef = useRef();\n const TimelineStart = useMemo(() => {\n const filtered =\n !excludeReplies || excludeBoosts || tagged || media || !!month;\n const cachedAccount = snapStates.accounts[`${id}@${instance}`];\n\n return (\n <>\n <AccountInfo\n instance={instance}\n account={cachedAccount || id}\n fetchAccount={fetchAccount}\n authenticated={authenticated}\n standalone\n showEndorsements\n />\n {!mediaFirst && (\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={t`Clear filters`}\n key=\"clear-filters\"\n >\n <Icon icon=\"x\" size=\"l\" alt={t`Clear`} />\n </Link>\n ) : (\n <Icon\n icon=\"filter\"\n class=\"insignificant\"\n size=\"l\"\n alt={t`Filters`}\n />\n )}\n <Link\n to={`/${instance}/a/${id}${excludeReplies ? '?replies=1' : ''}`}\n onClick={() => {\n if (excludeReplies) {\n showToast(t`Showing post with replies`);\n }\n }}\n class={excludeReplies ? '' : 'is-active'}\n >\n <Trans>+ Replies</Trans>\n </Link>\n <Link\n to={`/${instance}/a/${id}${excludeBoosts ? '' : '?boosts=0'}`}\n onClick={() => {\n if (!excludeBoosts) {\n showToast(t`Showing posts without boosts`);\n }\n }}\n class={!excludeBoosts ? '' : 'is-active'}\n >\n <Trans>- Boosts</Trans>\n </Link>\n <Link\n to={`/${instance}/a/${id}${media ? '' : '?media=1'}`}\n onClick={() => {\n if (!media) {\n showToast(t`Showing posts with media`);\n }\n }}\n class={media ? 'is-active' : ''}\n >\n <Trans>Media</Trans>\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(t`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 t`Showing posts in ${date.toLocaleString(i18n.locale, {\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 }, [\n id,\n instance,\n authenticated,\n featuredTags,\n fetchAccount,\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 = URL.parse(account.url)?.hostname;\n return domain;\n }, [account]);\n const sameInstance = instance === accountInstance;\n const allowSwitch = !!account && !sameInstance;\n\n return (\n <>\n <Timeline\n key={id}\n title={`${account?.acct ? '@' + account.acct : t`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 class=\"bidi-isolate\">@{acct}</span>\n </div>\n </h1>\n }\n id=\"account-statuses\"\n instance={instance}\n emptyText={t`Nothing to see here yet.`}\n errorText={t`Unable to load posts`}\n fetchItems={fetchAccountStatuses}\n useItemID\n view={media || mediaFirst ? '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\" alt={t`More`} />\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(t`Unable to fetch account info`);\n }\n })();\n }}\n >\n <Icon icon=\"transfer\" />{' '}\n <small class=\"menu-double-lines\">\n <Trans>\n Switch to account's instance{' '}\n {accountInstance ? (\n <>\n {' '}\n (<b>{punycode.toUnicode(accountInstance)}</b>)\n </>\n ) : null}\n </Trans>\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(t`Unable to fetch account info`);\n }\n })();\n }}\n >\n <Icon icon=\"transfer\" />{' '}\n <small class=\"menu-double-lines\">\n <Trans>\n Switch to my instance (<b>{currentInstance}</b>)\n </Trans>\n </small>\n </MenuItem>\n )}\n </Menu2>\n }\n />\n {acct && (\n <data\n class=\"compose-data\"\n value={JSON.stringify({\n draftStatus: {\n status: `@${acct} `,\n },\n })}\n />\n )}\n </>\n );\n}\n\nfunction MonthPicker(props) {\n const { i18n } = useLingui();\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=\"\">\n <Trans>Month</Trans>\n </option>\n <option disabled>-----</option>\n {Array.from({ length: 12 }, (_, i) => (\n <option\n value={\n // Month is 1-indexed\n (i + 1)\n .toString()\n .padStart(2, '0')\n }\n key={i}\n >\n {new Date(0, i).toLocaleString(i18n.locale, {\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\nfunction fetchAccount(id, masto) {\n return masto.v1.accounts.$select(id).fetch();\n}\nconst memFetchAccount = pmem(fetchAccount, {\n maxAge: 30 * 60 * 1000, // 30 minutes\n});\n\nexport default AccountStatuses;\n","import './annual-report.css';\n\nimport { Trans } from '@lingui/react/macro';\nimport { useEffect, useState } from 'preact/hooks';\nimport { useParams } from 'react-router-dom';\n\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport NameText from '../components/name-text';\nimport Status from '../components/status';\nimport { api } from '../utils/api';\nimport useTitle from '../utils/useTitle';\n\nexport default function AnnualReport() {\n const params = useParams();\n const { year } = params;\n useTitle(year ? `Annual Report: ${year}` : 'Annual Report');\n const { masto, instance } = api();\n const [results, setResults] = useState(null);\n const [uiState, setUIState] = useState('default');\n\n useEffect(() => {\n if (year) {\n (async () => {\n setUIState('loading');\n const results = await masto.v1.annualReports.$select(year).fetch();\n console.log('REPORT', results);\n setResults(results);\n setUIState('default');\n })();\n }\n }, [year]);\n\n const { accounts, annualReports, statuses } = results || {};\n const report = annualReports?.find((report) => report.year == year)?.data;\n\n const datePlaceholder = new Date();\n\n return (\n <div id=\"annual-report-page\" class=\"deck-container\" tabIndex=\"-1\">\n <div class=\"report\">\n <h1>{year} #Wrapstodon</h1>\n {uiState === 'loading' && (\n <p>\n <Loader abrupt /> <Trans>Loading…</Trans>\n </p>\n )}\n {!!report && (\n <dl>\n {Object.entries(report).map(([key, value]) => (\n <>\n <dt>{key}</dt>\n <dd class={`report-${key}`}>\n {Array.isArray(value) ? (\n <table>\n <thead>\n <tr>\n {Object.entries(value[0]).map(([key, value]) => (\n <th\n class={\n key !== 'month' && typeof value === 'number'\n ? 'number'\n : ''\n }\n >\n {key}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {value.map((item) => (\n <tr>\n {Object.entries(item).map(([k, value]) => (\n <td\n class={\n k !== 'month' && typeof value === 'number'\n ? 'number'\n : ''\n }\n >\n {value &&\n /(accountId)/i.test(k) &&\n /^(mostRebloggedAccounts|commonlyInteractedWithAccounts)$/i.test(\n key,\n ) ? (\n <NameText\n account={accounts?.find(\n (a) => a.id === value,\n )}\n showAvatar\n />\n ) : k === 'month' ? (\n datePlaceholder.setMonth(value - 1) &&\n datePlaceholder.toLocaleString(undefined, {\n month: 'long',\n })\n ) : typeof value === 'number' ? (\n value.toLocaleString()\n ) : (\n value\n )}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n ) : typeof value === 'object' ? (\n /^(topStatuses)$/i.test(key) ? (\n <dl>\n {Object.entries(value).map(([k, value]) => (\n <>\n <dt>{k}</dt>\n <dd>\n {value && (\n <Link to={`/${instance}/s/${value}`}>\n <Status\n status={statuses?.find(\n (s) => s.id === value,\n )}\n size=\"s\"\n readOnly\n />\n </Link>\n )}\n </dd>\n </>\n ))}\n </dl>\n ) : (\n <table>\n <tbody>\n {Object.entries(value).map(([k, value]) => (\n <tr>\n <th>{k}</th>\n <td\n class={\n typeof value === 'number' ? 'number' : ''\n }\n >\n {value}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n )\n ) : typeof value === 'string' ? (\n value\n ) : (\n // Last resort\n JSON.stringify(value, null, 2)\n )}\n </dd>\n </>\n ))}\n </dl>\n )}\n </div>\n <hr />\n <p style={{ textAlign: 'center' }}>\n <Link to=\"/\">\n <Trans>Go home</Trans>\n </Link>\n </p>\n </div>\n );\n}\n","import { useLingui } from '@lingui/react/macro';\nimport { 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 const { t } = useLingui();\n useTitle(t`Bookmarks`, '/bookmarks');\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\n .list({ limit: LIMIT })\n .values();\n }\n return await bookmarksIterator.current.next();\n }\n\n return (\n <Timeline\n title={t`Bookmarks`}\n id=\"bookmarks\"\n emptyText={t`No bookmarks yet. Go bookmark something!`}\n errorText={t`Unable to load bookmarks.`}\n instance={instance}\n fetchItems={fetchBookmarks}\n />\n );\n}\n\nexport default Bookmarks;\n","export default \"__VITE_ASSET__BL_1JinT__\"","import '../components/links-bar.css';\nimport './catchup.css';\n\nimport autoAnimate from '@formkit/auto-animate';\nimport { msg, select } from '@lingui/core/macro';\nimport { Plural, Trans, useLingui } from '@lingui/react/macro';\nimport { getBlurHashAverageColor } from 'fast-blurhash';\nimport { Fragment } from 'preact';\nimport { memo } from 'preact/compat';\nimport {\n useCallback,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n useState,\n} from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport { useSearchParams } from 'react-router-dom';\nimport { uid } from 'uid/single';\n\nimport catchupUrl from '../assets/features/catch-up.png';\n\nimport Avatar from '../components/avatar';\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport Modal from '../components/modal';\nimport NameText from '../components/name-text';\nimport NavMenu from '../components/nav-menu';\nimport RelativeTime from '../components/relative-time';\nimport { api, getPreferences } from '../utils/api';\nimport { oklab2rgb, rgb2oklab } from '../utils/color-utils';\nimport db from '../utils/db';\nimport emojifyText from '../utils/emojify-text';\nimport { isFiltered } from '../utils/filters';\nimport getDomain from '../utils/get-domain';\nimport htmlContentLength from '../utils/html-content-length';\nimport mem from '../utils/mem';\nimport niceDateTime from '../utils/nice-date-time';\nimport shortenNumber from '../utils/shorten-number';\nimport showToast from '../utils/show-toast';\nimport states, { statusKey } from '../utils/states';\nimport statusPeek from '../utils/status-peek';\nimport store from '../utils/store';\nimport { getCurrentAccountID, getCurrentAccountNS } from '../utils/store-utils';\nimport supports from '../utils/supports';\nimport { assignFollowedTags } from '../utils/timeline-utils';\nimport useTitle from '../utils/useTitle';\n\nconst FILTER_CONTEXT = 'home';\n\nconst RANGES = [\n { label: msg`last 1 hour`, value: 1 },\n { label: msg`last 2 hours`, value: 2 },\n { label: msg`last 3 hours`, value: 3 },\n { label: msg`last 4 hours`, value: 4 },\n { label: msg`last 5 hours`, value: 5 },\n { label: msg`last 6 hours`, value: 6 },\n { label: msg`last 7 hours`, value: 7 },\n { label: msg`last 8 hours`, value: 8 },\n { label: msg`last 9 hours`, value: 9 },\n { label: msg`last 10 hours`, value: 10 },\n { label: msg`last 11 hours`, value: 11 },\n { label: msg`last 12 hours`, value: 12 },\n { label: msg`beyond 12 hours`, value: 13 },\n];\n\nconst FILTER_KEYS = {\n original: msg`Original`,\n replies: msg`Replies`,\n boosts: msg`Boosts`,\n followedTags: msg`Followed tags`,\n groups: msg`Groups`,\n filtered: msg`Filtered`,\n};\nconst FILTER_SORTS = [\n 'createdAt',\n 'repliesCount',\n 'favouritesCount',\n 'reblogsCount',\n 'density',\n];\nconst FILTER_GROUPS = [null, 'account'];\n\nconst DTF = mem(\n (locale) =>\n new Intl.DateTimeFormat(locale || undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n }),\n);\n\nfunction Catchup() {\n const { i18n, _, t } = useLingui();\n const dtf = DTF(i18n.locale);\n\n useTitle(`Catch-up`, '/catchup');\n const { masto, instance } = api();\n const [searchParams, setSearchParams] = useSearchParams();\n const id = searchParams.get('id');\n const [uiState, setUIState] = useState('start');\n const [showTopLinks, setShowTopLinks] = useState(false);\n\n const currentAccount = useMemo(() => {\n return getCurrentAccountID();\n }, []);\n const isSelf = (accountID) => accountID === currentAccount;\n\n const supportsPixelfed = supports('@pixelfed/home-include-reblogs');\n\n async function fetchHome({ maxCreatedAt }) {\n const maxCreatedAtDate = maxCreatedAt ? new Date(maxCreatedAt) : null;\n console.debug('fetchHome', maxCreatedAtDate);\n const allResults = [];\n const homeIterable = masto.v1.timelines.home.list({ limit: 40 });\n const homeIterator = homeIterable.values();\n mainloop: while (true) {\n try {\n if (supportsPixelfed && homeIterable.params) {\n if (typeof homeIterable.params === 'string') {\n homeIterable.params += '&include_reblogs=true';\n } else {\n homeIterable.params.include_reblogs = true;\n }\n }\n const results = await homeIterator.next();\n const { value } = results;\n if (value?.length) {\n // This ignores maxCreatedAt filter, but it's ok for now\n await assignFollowedTags(value, instance);\n let addedResults = false;\n for (let i = 0; i < value.length; i++) {\n const item = value[i];\n const createdAtDate = new Date(item.createdAt);\n if (!maxCreatedAtDate || createdAtDate >= maxCreatedAtDate) {\n // Filtered\n const selfPost = isSelf(\n item.reblog?.account?.id || item.account.id,\n );\n const filterInfo =\n !selfPost &&\n isFiltered(\n item.reblog?.filtered || item.filtered,\n FILTER_CONTEXT,\n );\n if (filterInfo?.action === 'hide') continue;\n item._filtered = filterInfo;\n\n // Followed tags\n const sKey = statusKey(item.id, instance);\n item._followedTags = states.statusFollowedTags[sKey]\n ? [...states.statusFollowedTags[sKey]]\n : [];\n\n allResults.push(item);\n addedResults = true;\n } else {\n // Don't immediately stop, still add the other items that might still be within range\n // break mainloop;\n }\n // Only stop when ALL items are outside of range\n if (!addedResults) {\n break mainloop;\n }\n }\n } else {\n break mainloop;\n }\n // Pause 1s\n await new Promise((resolve) => setTimeout(resolve, 1000));\n } catch (e) {\n console.error(e);\n break mainloop;\n }\n }\n\n // Post-process all results\n // 1. Threadify - tag 1st-post in a thread\n allResults.forEach((status) => {\n if (status?.inReplyToId) {\n const replyToStatus = allResults.find(\n (s) => s.id === status.inReplyToId,\n );\n if (replyToStatus && !replyToStatus.inReplyToId) {\n replyToStatus._thread = true;\n }\n }\n });\n\n return allResults;\n }\n\n const [posts, setPosts] = useState([]);\n const catchupRangeRef = useRef();\n const catchupLastRef = useRef();\n const NS = useMemo(() => getCurrentAccountNS(), []);\n const handleCatchupClick = useCallback(async ({ duration } = {}) => {\n const now = Date.now();\n const maxCreatedAt = duration ? now - duration : null;\n setUIState('loading');\n const results = await fetchHome({ maxCreatedAt });\n // Namespaced by account ID\n // Possible conflict if ID matches between different accounts from different instances\n const catchupID = `${NS}-${uid()}`;\n try {\n await db.catchup.set(catchupID, {\n id: catchupID,\n posts: results,\n count: results.length,\n startAt: maxCreatedAt,\n endAt: now,\n });\n setSearchParams({ id: catchupID });\n } catch (e) {\n console.error(e, results);\n }\n }, []);\n\n useEffect(() => {\n if (id) {\n (async () => {\n const catchup = await db.catchup.get(id);\n if (catchup) {\n catchup.posts.sort((a, b) => (a.createdAt > b.createdAt ? 1 : -1));\n setPosts(catchup.posts);\n setUIState('results');\n }\n })();\n } else if (uiState === 'results') {\n setPosts([]);\n setUIState('start');\n }\n }, [id]);\n\n const [reloadCatchupsCount, reloadCatchups] = useReducer((c) => c + 1, 0);\n const [lastCatchupEndAt, setLastCatchupEndAt] = useState(null);\n const [prevCatchups, setPrevCatchups] = useState([]);\n useEffect(() => {\n (async () => {\n try {\n const catchups = await db.catchup.keys();\n if (catchups.length) {\n const ns = getCurrentAccountNS();\n const ownKeys = catchups.filter((key) => key.startsWith(`${ns}-`));\n if (ownKeys.length) {\n let ownCatchups = await db.catchup.getMany(ownKeys);\n ownCatchups.sort((a, b) => b.endAt - a.endAt);\n\n // Split to 1st 3 last catchups, and the rest\n let lastCatchups = ownCatchups.slice(0, 3);\n let restCatchups = ownCatchups.slice(3);\n\n const trimmedCatchups = lastCatchups.map((c) => {\n const { id, count, startAt, endAt } = c;\n return {\n id,\n count,\n startAt,\n endAt,\n };\n });\n setPrevCatchups(trimmedCatchups);\n setLastCatchupEndAt(lastCatchups[0].endAt);\n\n // GC time\n ownCatchups = null;\n lastCatchups = null;\n\n queueMicrotask(() => {\n if (restCatchups.length) {\n // delete them\n db.catchup\n .delMany(restCatchups.map((c) => c.id))\n .then(() => {\n // GC time\n restCatchups = null;\n })\n .catch((e) => {\n console.error(e);\n });\n }\n });\n\n return;\n }\n }\n } catch (e) {\n console.error(e);\n }\n setPrevCatchups([]);\n })();\n }, [reloadCatchupsCount]);\n useEffect(() => {\n if (uiState === 'start') {\n reloadCatchups();\n }\n }, [uiState === 'start']);\n\n const [filterCounts, links] = useMemo(() => {\n let filtered = 0,\n groups = 0,\n boosts = 0,\n replies = 0,\n followedTags = 0,\n original = 0;\n const links = {};\n for (const post of posts) {\n if (post._filtered && post._filtered?.action !== 'blur') {\n filtered++;\n post.__FILTER = 'filtered';\n } else if (post.group) {\n groups++;\n post.__FILTER = 'groups';\n } else if (post.reblog) {\n boosts++;\n post.__FILTER = 'boosts';\n } else if (post._followedTags?.length) {\n followedTags++;\n post.__FILTER = 'followedTags';\n } else if (\n post.inReplyToId &&\n post.inReplyToAccountId !== post.account?.id\n ) {\n replies++;\n post.__FILTER = 'replies';\n } else {\n original++;\n post.__FILTER = 'original';\n }\n\n const thePost = post.reblog || post;\n if (\n post.__FILTER !== 'filtered' &&\n thePost.card?.url &&\n thePost.card?.image &&\n thePost.card?.type === 'link'\n ) {\n const { card, favouritesCount, reblogsCount } = thePost;\n let { url } = card;\n url = url.replace(/\\/$/, '');\n if (!links[url]) {\n links[url] = {\n postID: thePost.id,\n card,\n shared: 1,\n sharers: [post.account],\n likes: favouritesCount,\n boosts: reblogsCount,\n };\n } else {\n if (links[url].sharers.find((a) => a.id === post.account.id)) {\n continue;\n }\n links[url].shared++;\n links[url].sharers.push(post.account);\n if (links[url].postID !== thePost.id) {\n links[url].likes += favouritesCount;\n links[url].boosts += reblogsCount;\n }\n }\n }\n }\n\n let topLinks = [];\n for (const link in links) {\n topLinks.push({\n url: link,\n ...links[link],\n });\n }\n topLinks.sort((a, b) => {\n if (a.shared > b.shared) return -1;\n if (a.shared < b.shared) return 1;\n if (a.boosts > b.boosts) return -1;\n if (a.boosts < b.boosts) return 1;\n if (a.likes > b.likes) return -1;\n if (a.likes < b.likes) return 1;\n return 0;\n });\n\n // Slice links to shared > 1 but min 10 links\n if (topLinks.length > 10) {\n linksLoop: for (let i = 10; i < topLinks.length; i++) {\n const { shared } = topLinks[i];\n if (shared <= 1) {\n topLinks = topLinks.slice(0, i);\n break linksLoop;\n }\n }\n }\n\n return [\n {\n filtered,\n groups,\n boosts,\n replies,\n followedTags,\n original,\n },\n topLinks,\n ];\n }, [posts]);\n\n const [selectedFilterCategory, setSelectedFilterCategory] = useState('all');\n const [selectedAuthor, setSelectedAuthor] = useState(null);\n\n const [range, setRange] = useState(1);\n\n const [sortBy, setSortBy] = useState('createdAt');\n const [sortOrder, setSortOrder] = useState('asc');\n const [groupBy, setGroupBy] = useState(null);\n\n const [filteredPosts, authors, authorCounts] = useMemo(() => {\n const authorsHash = {};\n const authorCountsMap = new Map();\n\n let filteredPosts = posts.filter((post) => {\n const postFilterMatches =\n selectedFilterCategory === 'all' ||\n post.__FILTER === selectedFilterCategory;\n\n if (postFilterMatches) {\n authorsHash[post.account.id] = post.account;\n authorCountsMap.set(\n post.account.id,\n (authorCountsMap.get(post.account.id) || 0) + 1,\n );\n }\n\n return postFilterMatches;\n });\n\n // Deduplicate boosts\n const boostedPosts = {};\n filteredPosts.forEach((post) => {\n if (post.reblog) {\n if (boostedPosts[post.reblog.id]) {\n if (boostedPosts[post.reblog.id].__BOOSTERS) {\n boostedPosts[post.reblog.id].__BOOSTERS.add(post.account);\n } else {\n boostedPosts[post.reblog.id].__BOOSTERS = new Set([post.account]);\n }\n post.__HIDDEN = true;\n } else {\n boostedPosts[post.reblog.id] = post;\n }\n }\n });\n\n if (selectedAuthor && authorCountsMap.has(selectedAuthor)) {\n filteredPosts = filteredPosts.filter(\n (post) =>\n post.account.id === selectedAuthor ||\n [...(post.__BOOSTERS || [])].find((a) => a.id === selectedAuthor),\n );\n }\n\n return [filteredPosts, authorsHash, Object.fromEntries(authorCountsMap)];\n }, [selectedFilterCategory, selectedAuthor, posts]);\n\n const filteredPostsMap = useMemo(() => {\n const map = {};\n filteredPosts.forEach((post) => {\n map[post.id] = post;\n });\n return map;\n }, [filteredPosts]);\n\n const authorCountsList = useMemo(\n () =>\n Object.keys(authorCounts).sort(\n (a, b) => authorCounts[b] - authorCounts[a],\n ),\n [authorCounts],\n );\n\n const sortedFilteredPosts = useMemo(() => {\n const authorIndices = {};\n authorCountsList.forEach((authorID, index) => {\n authorIndices[authorID] = index;\n });\n return filteredPosts\n .filter((post) => !post.__HIDDEN)\n .sort((a, b) => {\n if (groupBy === 'account') {\n const aAccountID = a.account.id;\n const bAccountID = b.account.id;\n const aIndex = authorIndices[aAccountID];\n const bIndex = authorIndices[bAccountID];\n const order = aIndex - bIndex;\n if (order !== 0) {\n return order;\n }\n }\n if (sortBy !== 'createdAt') {\n a = a.reblog || a;\n b = b.reblog || b;\n if (sortBy !== 'density' && a[sortBy] === b[sortBy]) {\n return a.createdAt > b.createdAt ? 1 : -1;\n }\n }\n if (sortBy === 'density') {\n const aDensity = postDensity(a);\n const bDensity = postDensity(b);\n if (sortOrder === 'asc') {\n return aDensity > bDensity ? 1 : -1;\n } else {\n return bDensity > aDensity ? 1 : -1;\n }\n }\n if (sortOrder === 'asc') {\n return a[sortBy] > b[sortBy] ? 1 : -1;\n } else {\n return b[sortBy] > a[sortBy] ? 1 : -1;\n }\n });\n }, [filteredPosts, sortBy, sortOrder, groupBy, authorCountsList]);\n\n const prevGroup = useRef(null);\n\n const authorsListParent = useRef(null);\n const autoAnimated = useRef(false);\n useEffect(() => {\n if (posts.length > 100 || autoAnimated.current) return;\n if (authorsListParent.current) {\n autoAnimate(authorsListParent.current, {\n duration: 200,\n });\n autoAnimated.current = true;\n }\n }, [posts, authorsListParent]);\n\n const postsBarType = posts.length > 160 ? '3d' : '2d';\n\n const postsBar = useMemo(() => {\n if (postsBarType !== '2d') return null;\n return posts.map((post) => {\n // If part of filteredPosts\n const isFiltered = filteredPostsMap[post.id];\n return (\n <span\n key={post.id}\n class={`post-dot ${isFiltered ? 'post-dot-highlight' : ''}`}\n />\n );\n });\n }, [filteredPostsMap]);\n\n const postsBins = useMemo(() => {\n if (postsBarType !== '3d') return null;\n if (!posts?.length) return null;\n const bins = binByTime(posts, 'createdAt', 320);\n return bins.map((posts, i) => {\n return (\n <div class=\"posts-bin\" key={i}>\n {posts.map((post) => {\n const isFiltered = filteredPostsMap[post.id];\n return (\n <span\n key={post.id}\n class={`post-dot ${isFiltered ? 'post-dot-highlight' : ''}`}\n />\n );\n })}\n </div>\n );\n });\n }, [filteredPostsMap]);\n\n const scrollableRef = useRef(null);\n\n // if range value exceeded lastCatchupEndAt, show error\n const lastCatchupRange = useMemo(() => {\n // return hour, not ms\n if (!lastCatchupEndAt) return null;\n return (Date.now() - lastCatchupEndAt) / 1000 / 60 / 60;\n }, [lastCatchupEndAt, range]);\n\n useEffect(() => {\n if (uiState !== 'results') return;\n const authorUsername =\n selectedAuthor && authors[selectedAuthor]\n ? authors[selectedAuthor].username\n : '';\n const sortOrderIndex = sortOrder === 'asc' ? 0 : 1;\n const groupByText = {\n account: 'authors',\n };\n let toast = showToast({\n duration: 5_000, // 5 seconds\n // Note: I'm sorry, translators\n text: t`Showing ${select(selectedFilterCategory, {\n all: 'all posts',\n original: 'original posts',\n replies: 'replies',\n boosts: 'boosts',\n followedTags: 'followed tags',\n groups: 'groups',\n filtered: 'filtered posts',\n })}, ${select(sortBy, {\n createdAt: select(sortOrder, {\n asc: 'oldest',\n desc: 'latest',\n }),\n reblogsCount: select(sortOrder, {\n asc: 'fewest boosts',\n desc: 'most boosts',\n }),\n favouritesCount: select(sortOrder, {\n asc: 'fewest likes',\n desc: 'most likes',\n }),\n repliesCount: select(sortOrder, {\n asc: 'fewest replies',\n desc: 'most replies',\n }),\n density: select(sortOrder, { asc: 'least dense', desc: 'most dense' }),\n })} first${select(groupBy, {\n account: ', grouped by authors',\n other: '',\n })}`,\n });\n return () => {\n toast?.hideToast?.();\n };\n }, [\n uiState,\n selectedFilterCategory,\n selectedAuthor,\n sortBy,\n sortOrder,\n groupBy,\n authors,\n ]);\n\n useEffect(() => {\n if (selectedAuthor) {\n if (authors[selectedAuthor]) {\n // Check if author is visible and within the scrollable area viewport\n const authorElement = authorsListParent.current.querySelector(\n `[data-author=\"${selectedAuthor}\"]`,\n );\n const scrollableRect =\n authorsListParent.current?.getBoundingClientRect();\n const authorRect = authorElement?.getBoundingClientRect();\n console.log({\n sLeft: scrollableRect.left,\n sRight: scrollableRect.right,\n aLeft: authorRect.left,\n aRight: authorRect.right,\n });\n if (\n authorRect.left < scrollableRect.left ||\n authorRect.right > scrollableRect.right\n ) {\n authorElement.scrollIntoView({\n block: 'nearest',\n inline: 'center',\n behavior: 'smooth',\n });\n } else if (authorRect.top < 0) {\n authorElement.scrollIntoView({\n block: 'nearest',\n inline: 'nearest',\n behavior: 'smooth',\n });\n }\n }\n }\n }, [selectedAuthor, authors]);\n\n const [showHelp, setShowHelp] = useState(false);\n\n const itemsSelector = '.catchup-list > li > a';\n const jRef = useHotkeys(\n 'j',\n () => {\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 const nextItem = allItems[activeItemIndex + 1];\n if (nextItem) {\n nextItem.focus();\n nextItem.scrollIntoView({\n block: 'center',\n inline: 'center',\n behavior: 'smooth',\n });\n }\n } else {\n const topmostItem = allItems.find((item) => {\n const itemRect = item.getBoundingClientRect();\n return itemRect.top >= 0;\n });\n if (topmostItem) {\n topmostItem.focus();\n topmostItem.scrollIntoView({\n block: 'nearest',\n inline: 'center',\n behavior: 'smooth',\n });\n }\n }\n },\n {\n useKey: true,\n preventDefault: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n },\n );\n\n const kRef = useHotkeys(\n 'k',\n () => {\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 (prevItem) {\n prevItem.focus();\n prevItem.scrollIntoView({\n block: 'center',\n inline: 'center',\n behavior: 'smooth',\n });\n }\n } else {\n const topmostItem = allItems.find((item) => {\n const itemRect = item.getBoundingClientRect();\n return itemRect.top >= 44 && itemRect.left >= 0;\n });\n if (topmostItem) {\n topmostItem.focus();\n topmostItem.scrollIntoView({\n block: 'nearest',\n inline: 'center',\n behavior: 'smooth',\n });\n }\n }\n },\n {\n useKey: true,\n preventDefault: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n },\n );\n\n const hlRef = useHotkeys(\n 'h, l',\n (_, handler) => {\n // Go next/prev selectedAuthor in authorCountsList list\n const key = handler.keys[0];\n if (selectedAuthor) {\n const index = authorCountsList.indexOf(selectedAuthor);\n if (key === 'h') {\n if (index > 0 && index < authorCountsList.length) {\n setSelectedAuthor(authorCountsList[index - 1]);\n scrollableRef.current?.focus();\n }\n } else if (key === 'l') {\n if (index < authorCountsList.length - 1 && index >= 0) {\n setSelectedAuthor(authorCountsList[index + 1]);\n scrollableRef.current?.focus();\n }\n }\n } else if (key === 'l') {\n setSelectedAuthor(authorCountsList[0]);\n scrollableRef.current?.focus();\n }\n },\n {\n useKey: true,\n preventDefault: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n enableOnFormTags: ['input'],\n },\n );\n\n const escRef = useHotkeys(\n 'esc',\n () => {\n setSelectedAuthor(null);\n scrollableRef.current?.focus();\n },\n {\n preventDefault: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n enableOnFormTags: ['input'],\n useKey: true,\n },\n );\n\n const dotRef = useHotkeys(\n '.',\n () => {\n scrollableRef.current?.scrollTo({\n top: 0,\n behavior: 'smooth',\n });\n },\n {\n useKey: true,\n preventDefault: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n enableOnFormTags: ['input'],\n },\n );\n\n const handleArrowKeys = useCallback((e) => {\n const activeElement = document.activeElement;\n const isRadio =\n activeElement?.tagName === 'INPUT' && activeElement.type === 'radio';\n const isArrowKeys =\n e.key === 'ArrowDown' ||\n e.key === 'ArrowUp' ||\n e.key === 'ArrowLeft' ||\n e.key === 'ArrowRight';\n if (isArrowKeys && isRadio) {\n // Note: page scroll won't trigger on first arrow key press due to this. Subsequent presses will.\n activeElement.blur();\n return;\n }\n }, []);\n\n return (\n <div\n ref={(node) => {\n scrollableRef.current = node;\n jRef.current = node;\n kRef.current = node;\n hlRef.current = node;\n escRef.current = node;\n dotRef.current = node;\n }}\n id=\"catchup-page\"\n class=\"deck-container\"\n tabIndex=\"-1\"\n >\n <div class=\"timeline-deck deck wide\">\n <header\n class={`${uiState === 'loading' ? 'loading' : ''}`}\n onClick={(e) => {\n if (!e.target.closest('a, button')) {\n scrollableRef.current?.scrollTo({\n top: 0,\n behavior: 'smooth',\n });\n }\n }}\n >\n <div class=\"header-grid\">\n <div class=\"header-side\">\n <NavMenu />\n {uiState === 'results' && (\n <Link to=\"/catchup\" class=\"button plain\">\n <Icon icon=\"history2\" size=\"l\" alt={t`Catch-up`} />\n </Link>\n )}\n {uiState === 'start' && (\n <Link to=\"/\" class=\"button plain\">\n <Icon icon=\"home\" size=\"l\" alt={t`Home`} />\n </Link>\n )}\n </div>\n <h1>\n {uiState !== 'start' && (\n <Trans>\n Catch-up <sup>beta</sup>\n </Trans>\n )}\n </h1>\n <div class=\"header-side\">\n {uiState !== 'start' && uiState !== 'loading' && (\n <button\n type=\"button\"\n class=\"plain\"\n onClick={() => {\n setShowHelp(true);\n }}\n >\n <Trans>Help</Trans>\n </button>\n )}\n </div>\n </div>\n </header>\n <main onKeyDown={handleArrowKeys}>\n {uiState === 'start' && (\n <div class=\"catchup-start\">\n <h1>\n <Trans>\n Catch-up <sup>beta</sup>\n </Trans>\n </h1>\n <details>\n <summary>\n <Trans>What is this?</Trans>\n </summary>\n <p>\n <Trans>\n Catch-up is a separate timeline for your followings,\n offering a high-level view at a glance, with a simple,\n email-inspired interface to effortlessly sort and filter\n through posts.\n </Trans>\n </p>\n <img\n src={catchupUrl}\n width=\"1200\"\n height=\"900\"\n alt={t`Preview of Catch-up UI`}\n />\n <p>\n <button\n type=\"button\"\n onClick={(e) => {\n e.target.closest('details').open = false;\n }}\n >\n <Trans>Let's catch up</Trans>\n </button>\n </p>\n </details>\n <p>\n <Trans>Let's catch up on the posts from your followings.</Trans>\n </p>\n <p>\n <b>\n <Trans>Show me all posts from…</Trans>\n </b>\n </p>\n <div class=\"catchup-form\">\n <input\n ref={catchupRangeRef}\n type=\"range\"\n value={range}\n min={RANGES[0].value}\n max={RANGES[RANGES.length - 1].value}\n step=\"1\"\n list=\"catchup-ranges\"\n onChange={(e) => setRange(+e.target.value)}\n />{' '}\n <span\n style={{\n width: '8em',\n }}\n >\n {_(RANGES[range - 1].label)}\n <br />\n <small class=\"insignificant\">\n {range == RANGES[RANGES.length - 1].value\n ? t`until the max`\n : niceDateTime(\n new Date(Date.now() - range * 60 * 60 * 1000),\n )}\n </small>\n </span>\n <datalist id=\"catchup-ranges\">\n {RANGES.map(({ label, value }) => (\n <option value={value} label={_(label)} />\n ))}\n </datalist>{' '}\n <button\n type=\"button\"\n onClick={() => {\n if (range < RANGES[RANGES.length - 1].value) {\n let duration;\n if (\n range === RANGES[RANGES.length - 1].value &&\n catchupLastRef.current?.checked\n ) {\n duration = Date.now() - lastCatchupEndAt;\n } else {\n duration = range * 60 * 60 * 1000;\n }\n handleCatchupClick({ duration });\n } else {\n handleCatchupClick();\n }\n }}\n >\n <Trans>Catch up</Trans>\n </button>\n </div>\n {lastCatchupRange && range > lastCatchupRange ? (\n <p class=\"catchup-info\">\n <Icon icon=\"info\" />{' '}\n <Trans>Overlaps with your last catch-up</Trans>\n </p>\n ) : range === RANGES[RANGES.length - 1].value &&\n lastCatchupEndAt ? (\n <p class=\"catchup-info\">\n <label>\n <input\n type=\"checkbox\"\n switch\n checked\n ref={catchupLastRef}\n />{' '}\n <Trans>\n Until the last catch-up (\n {dtf.format(new Date(lastCatchupEndAt))})\n </Trans>\n </label>\n </p>\n ) : null}\n <p class=\"insignificant\">\n <small>\n <Trans>\n Note: your instance might only show a maximum of 800 posts\n in the Home timeline regardless of the time range. Could be\n less or more.\n </Trans>\n </small>\n </p>\n {!!prevCatchups?.length && (\n <div class=\"catchup-prev\">\n <p>\n <Trans>Previously…</Trans>\n </p>\n <ul>\n {prevCatchups.map((pc) => (\n <li key={pc.id}>\n <Link to={`/catchup?id=${pc.id}`}>\n <Icon icon=\"history2\" />{' '}\n <span>\n {pc.startAt\n ? dtf.formatRange(\n new Date(pc.startAt),\n new Date(pc.endAt),\n )\n : `… – ${dtf.format(new Date(pc.endAt))}`}\n </span>\n </Link>{' '}\n <span>\n <small class=\"ib insignificant\">\n <Plural\n value={pc.count}\n one=\"# post\"\n other=\"# posts\"\n />\n </small>{' '}\n <button\n type=\"button\"\n class=\"light danger small\"\n onClick={async () => {\n const yes = confirm(t`Remove this catch-up?`);\n if (yes) {\n let st = showToast(\n t`Removing Catch-up ${pc.id}`,\n );\n await db.catchup.del(pc.id);\n st?.hideToast?.();\n showToast(t`Catch-up ${pc.id} removed`);\n reloadCatchups();\n }\n }}\n >\n <Icon icon=\"x\" alt={t`Remove`} />\n </button>\n </span>\n </li>\n ))}\n </ul>\n {prevCatchups.length >= 3 && (\n <p>\n <small>\n <Trans>\n Note: Only max 3 will be stored. The rest will be\n automatically removed.\n </Trans>\n </small>\n </p>\n )}\n </div>\n )}\n </div>\n )}\n {uiState === 'loading' && (\n <div class=\"ui-state catchup-start\">\n <Loader abrupt />\n <p class=\"insignificant\">\n <Trans>Fetching posts…</Trans>\n </p>\n <p class=\"insignificant\">\n <Trans>This might take a while.</Trans>\n </p>\n </div>\n )}\n {uiState === 'results' && (\n <>\n <div class=\"catchup-header\">\n {posts.length > 0 && (\n <p>\n <b class=\"ib\">\n {dtf.formatRange(\n new Date(posts[0].createdAt),\n new Date(posts[posts.length - 1].createdAt),\n )}\n </b>\n </p>\n )}\n <aside>\n <button\n hidden={\n selectedFilterCategory === 'all' &&\n !selectedAuthor &&\n sortBy === 'createdAt' &&\n sortOrder === 'asc'\n }\n type=\"button\"\n class=\"plain4 small\"\n onClick={() => {\n setSelectedFilterCategory('all');\n setSelectedAuthor(null);\n setSortBy('createdAt');\n setGroupBy(null);\n setSortOrder('asc');\n }}\n >\n <Trans>Reset filters</Trans>\n </button>\n {links?.length > 0 && (\n <button\n type=\"button\"\n class=\"plain small\"\n onClick={() => setShowTopLinks(!showTopLinks)}\n >\n <Trans>Top links</Trans>{' '}\n <Icon\n icon=\"chevron-down\"\n style={{\n transform: showTopLinks\n ? 'rotate(180deg)'\n : 'rotate(0deg)',\n }}\n />\n </button>\n )}\n </aside>\n </div>\n <div class=\"shazam-container no-animation\" hidden={!showTopLinks}>\n <div class=\"shazam-container-inner\">\n <div class=\"catchup-top-links links-bar\">\n {links.map((link) => {\n const { card, shared, sharers, likes, boosts } = link;\n const {\n blurhash,\n title,\n description,\n url,\n image,\n imageDescription,\n language,\n width,\n height,\n publishedAt,\n } = card;\n const domain = getDomain(url);\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\"\n class=\"link-block\"\n style={\n accentColor\n ? {\n '--accent-color': `rgb(${accentColor.join(\n ',',\n )})`,\n '--accent-alpha-color': `rgba(${accentColor.join(\n ',',\n )}, 0.4)`,\n }\n : {}\n }\n >\n <article>\n <figure>\n <img\n src={image}\n alt={imageDescription}\n width={width}\n height={height}\n loading=\"lazy\"\n />\n </figure>\n <div class=\"article-body\">\n <header>\n <div class=\"article-meta\">\n <span class=\"domain\">{domain}</span>{' '}\n {!!publishedAt && <>· </>}\n {!!publishedAt && (\n <>\n <RelativeTime\n datetime={publishedAt}\n format=\"micro\"\n />\n </>\n )}\n </div>\n {!!title && (\n <h1\n class=\"title\"\n lang={language}\n dir=\"auto\"\n title={title}\n >\n {title}\n </h1>\n )}\n </header>\n {!!description && (\n <p\n class=\"description\"\n lang={language}\n dir=\"auto\"\n title={description}\n >\n {description}\n </p>\n )}\n <hr />\n <p\n style={{\n whiteSpace: 'nowrap',\n }}\n >\n <Trans>\n Shared by{' '}\n {sharers.map((s) => {\n const { avatarStatic, displayName } = s;\n return (\n <button\n type=\"button\"\n class=\"plain\"\n style={{\n padding: 0,\n }}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n // Reset and filter to author\n const { id } = s;\n setSelectedAuthor(id);\n setSelectedFilterCategory('all');\n }}\n >\n <Avatar\n url={avatarStatic}\n size=\"s\"\n alt={displayName}\n />\n </button>\n );\n })}\n </Trans>\n </p>\n </div>\n </article>\n </a>\n );\n })}\n </div>\n </div>\n </div>\n {posts.length >= 5 &&\n (postsBarType === '3d' ? (\n <div class=\"catchup-posts-viz-time-bar\">{postsBins}</div>\n ) : (\n <div class=\"catchup-posts-viz-bar\">{postsBar}</div>\n ))}\n {posts.length >= 2 && (\n <div class=\"catchup-filters\">\n <label class=\"filter-cat\">\n <input\n type=\"radio\"\n name=\"filter-cat\"\n checked={selectedFilterCategory.toLowerCase() === 'all'}\n onChange={() => {\n setSelectedFilterCategory('all');\n }}\n />\n <Trans>All</Trans> <span class=\"count\">{posts.length}</span>\n </label>\n {Object.entries(FILTER_KEYS).map(\n ([key, label]) =>\n !!filterCounts[key] && (\n <label\n class=\"filter-cat\"\n key={_(label)}\n title={\n ((filterCounts[key] / posts.length) * 100).toFixed(\n 2,\n ) + '%'\n }\n >\n <input\n type=\"radio\"\n name=\"filter-cat\"\n checked={\n selectedFilterCategory.toLowerCase() ===\n key.toLowerCase()\n }\n onChange={() => {\n setSelectedFilterCategory(key);\n if (key === 'boosts') {\n setSortBy('reblogsCount');\n setSortOrder('desc');\n setGroupBy(null);\n }\n // setSelectedAuthor(null);\n }}\n />\n {_(label)}{' '}\n <span class=\"count\">{filterCounts[key]}</span>\n </label>\n ),\n )}\n </div>\n )}\n {posts.length >= 2 && !!authorCounts && (\n <div\n class=\"catchup-filters authors-filters\"\n ref={authorsListParent}\n >\n {authorCountsList.map((author) => (\n <label\n class=\"filter-author\"\n data-author={author}\n key={`${author}-${authorCounts[author]}`}\n // Preact messed up the order sometimes, need additional key besides just `author`\n // https://github.com/preactjs/preact/issues/2849\n >\n <input\n type=\"radio\"\n name=\"filter-author\"\n checked={selectedAuthor === author}\n onChange={() => {\n setSelectedAuthor(author);\n // setGroupBy(null);\n }}\n onClick={() => {\n if (selectedAuthor === author) {\n setSelectedAuthor(null);\n }\n }}\n />\n <Avatar\n url={\n authors[author].avatarStatic || authors[author].avatar\n }\n size=\"xxl\"\n alt={`${authors[author].displayName} (@${authors[author].acct})`}\n />{' '}\n <span class=\"count\">{authorCounts[author]}</span>\n <span class=\"username\">{authors[author].username}</span>\n </label>\n ))}\n {authorCountsList.length > 5 && (\n <small\n key=\"authors-count\"\n style={{\n whiteSpace: 'nowrap',\n paddingInline: '1em',\n opacity: 0.33,\n }}\n >\n <Plural\n value={authorCountsList.length}\n one=\"# author\"\n other=\"# authors\"\n />\n </small>\n )}\n </div>\n )}\n {posts.length >= 2 && (\n <div class=\"catchup-filters\">\n <span class=\"filter-label\">\n <Trans>Sort</Trans>\n </span>{' '}\n <fieldset class=\"radio-field-group\">\n {FILTER_SORTS.map((key) => (\n <label\n class=\"filter-sort\"\n key={key}\n onClick={(e) => {\n if (sortBy === key) {\n e.preventDefault();\n e.stopPropagation();\n setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc');\n }\n }}\n >\n <input\n type=\"radio\"\n name=\"filter-sort-cat\"\n checked={sortBy === key}\n onChange={() => {\n setSortBy(key);\n const order = /(replies|favourites|reblogs)/.test(\n key,\n )\n ? 'desc'\n : 'asc';\n setSortOrder(order);\n }}\n />\n {\n {\n createdAt: t`Date`,\n repliesCount: t`Replies`,\n favouritesCount: t`Likes`,\n reblogsCount: t`Boosts`,\n density: t`Density`,\n }[key]\n }\n {sortBy === key && (sortOrder === 'asc' ? ' ↑' : ' ↓')}\n </label>\n ))}\n </fieldset>\n {/* <fieldset class=\"radio-field-group\">\n {['asc', 'desc'].map((key) => (\n <label class=\"filter-sort\" key={key}>\n <input\n type=\"radio\"\n name=\"filter-sort-dir\"\n checked={sortOrder === key}\n onChange={() => {\n setSortOrder(key);\n }}\n />\n {key === 'asc' ? '↑' : '↓'}\n </label>\n ))}\n </fieldset> */}\n <span class=\"filter-label\">\n <Trans id=\"group.filter\">Group</Trans>\n </span>{' '}\n <fieldset class=\"radio-field-group\">\n {FILTER_GROUPS.map((key) => (\n <label class=\"filter-group\" key={key || 'none'}>\n <input\n type=\"radio\"\n name=\"filter-group\"\n checked={groupBy === key}\n onChange={() => {\n setGroupBy(key);\n }}\n disabled={key === 'account' && selectedAuthor}\n />\n {{\n account: t`Authors`,\n }[key] || t`None`}\n </label>\n ))}\n </fieldset>\n {\n selectedAuthor && authorCountsList.length > 1 ? (\n <button\n type=\"button\"\n class=\"plain6 small\"\n onClick={() => {\n setSelectedAuthor(null);\n }}\n style={{\n whiteSpace: 'nowrap',\n }}\n >\n <Trans>Show all authors</Trans>\n </button>\n ) : null\n // <button\n // type=\"button\"\n // class=\"plain4 small\"\n // onClick={() => {}}\n // >\n // Group by authors\n // </button>\n }\n </div>\n )}\n <ul\n class={`catchup-list catchup-filter-${\n selectedFilterCategory || ''\n } ${sortBy ? `catchup-sort-${sortBy}` : ''} ${\n selectedAuthor && authors[selectedAuthor]\n ? `catchup-selected-author`\n : ''\n } ${groupBy ? `catchup-group-${groupBy}` : ''}`}\n >\n {sortedFilteredPosts.map((post, i) => {\n const id = post.reblog?.id || post.id;\n let showSeparator = false;\n if (groupBy === 'account') {\n if (\n prevGroup.current &&\n post.account.id !== prevGroup.current &&\n i > 0\n ) {\n showSeparator = true;\n }\n prevGroup.current = post.account.id;\n }\n return (\n <Fragment key={`${post.id}-${showSeparator}`}>\n {showSeparator && <li class=\"separator\" />}\n <IntersectionPostLineItem\n to={`/${instance}/s/${id}`}\n post={post}\n root={scrollableRef.current}\n />\n </Fragment>\n );\n })}\n </ul>\n <footer>\n {filteredPosts.length > 5 && (\n <p>\n {selectedFilterCategory === 'boosts'\n ? t`You don't have to read everything.`\n : t`That's all.`}{' '}\n <button\n type=\"button\"\n class=\"textual\"\n onClick={() => {\n scrollableRef.current.scrollTop = 0;\n }}\n >\n <Trans>Back to top</Trans>\n </button>\n .\n </p>\n )}\n </footer>\n </>\n )}\n </main>\n </div>\n {showHelp && (\n <Modal onClose={() => setShowHelp(false)}>\n <div class=\"sheet\" id=\"catchup-help-sheet\">\n <button\n type=\"button\"\n class=\"sheet-close\"\n onClick={() => setShowHelp(false)}\n >\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n <header>\n <h2>\n <Trans>Help</Trans>\n </h2>\n </header>\n <main>\n <dl>\n <dt>\n <Trans>Top links</Trans>\n </dt>\n <dd>\n <Trans>\n Links shared by followings, sorted by shared counts, boosts\n and likes.\n </Trans>\n </dd>\n <dt>\n <Trans>Sort: Density</Trans>\n </dt>\n <dd>\n <Trans>\n Posts are sorted by information density or depth. Shorter\n posts are \"lighter\" while longer posts are \"heavier\". Posts\n with photos are \"heavier\" than posts without photos.\n </Trans>\n </dd>\n <dt>\n <Trans>Group: Authors</Trans>\n </dt>\n <dd>\n <Trans>\n Posts are grouped by authors, sorted by posts count per\n author.\n </Trans>\n </dd>\n <dt>\n <Trans>Keyboard shortcuts</Trans>\n </dt>\n {/* <dd>\n <kbd>j</kbd>: <Trans>Next post</Trans>\n </dd>\n <dd>\n <kbd>k</kbd>: <Trans>Previous post</Trans>\n </dd>\n <dd>\n <kbd>l</kbd>: <Trans>Next author</Trans>\n </dd>\n <dd>\n <kbd>h</kbd>: <Trans>Previous author</Trans>\n </dd>\n <dd>\n <kbd>Enter</kbd>: <Trans>Open post details</Trans>\n </dd>\n <dd>\n <kbd>.</kbd>: <Trans>Scroll to top</Trans>\n </dd> */}\n <dd>\n <table>\n <tbody>\n <tr>\n <td>\n <Trans>Next post</Trans>\n </td>\n <td>\n <kbd>j</kbd>\n </td>\n </tr>\n <tr>\n <td>\n <Trans>Previous post</Trans>\n </td>\n <td>\n <kbd>k</kbd>\n </td>\n </tr>\n <tr>\n <td>\n <Trans>Next author</Trans>\n </td>\n <td>\n <kbd>l</kbd>\n </td>\n </tr>\n <tr>\n <td>\n <Trans>Previous author</Trans>\n </td>\n <td>\n <kbd>h</kbd>\n </td>\n </tr>\n <tr>\n <td>\n <Trans>Open post details</Trans>\n </td>\n <td>\n <kbd>Enter</kbd>\n </td>\n </tr>\n <tr>\n <td>\n <Trans>Scroll to top</Trans>\n </td>\n <td>\n <kbd>.</kbd>\n </td>\n </tr>\n </tbody>\n </table>\n </dd>\n </dl>\n </main>\n </div>\n </Modal>\n )}\n </div>\n );\n}\n\nconst PostLine = memo(\n function ({ post }) {\n const {\n id,\n account,\n group,\n reblog,\n inReplyToId,\n inReplyToAccountId,\n _followedTags: isFollowedTags,\n _filtered: filterInfo,\n visibility,\n __BOOSTERS,\n } = post;\n const isReplyTo = inReplyToId && inReplyToAccountId !== account.id;\n const isFiltered = !!filterInfo && filterInfo?.action !== 'blur';\n\n const debugHover = (e) => {\n if (e.shiftKey) {\n console.log({\n ...post,\n });\n }\n };\n\n return (\n <article\n class={`post-line ${\n group\n ? 'group'\n : reblog\n ? 'reblog'\n : isFollowedTags?.length\n ? 'followed-tags'\n : ''\n } ${isReplyTo ? 'reply-to' : ''} ${\n isFiltered ? 'filtered' : ''\n } visibility-${visibility}`}\n onMouseEnter={debugHover}\n >\n <span class=\"post-author\">\n {reblog ? (\n <span class=\"post-reblog-avatar\">\n <Avatar\n url={account.avatarStatic || account.avatar}\n squircle={account.bot}\n />\n {__BOOSTERS?.size > 0\n ? [...__BOOSTERS].map((b) => (\n <Avatar url={b.avatarStatic || b.avatar} squircle={b.bot} />\n ))\n : ''}{' '}\n <Icon icon=\"rocket\" />{' '}\n {/* <Avatar\n url={reblog.account.avatarStatic || reblog.account.avatar}\n squircle={reblog.account.bot}\n /> */}\n <NameText account={reblog.account} showAvatar />\n </span>\n ) : (\n <NameText account={account} showAvatar />\n )}\n </span>\n <PostPeek post={reblog || post} filterInfo={filterInfo} />\n <span class=\"post-meta\">\n <PostStats post={reblog || post} />{' '}\n <RelativeTime\n datetime={new Date(reblog?.createdAt || post.createdAt)}\n format=\"micro\"\n />\n </span>\n </article>\n );\n },\n (oldProps, newProps) => {\n return oldProps?.post?.id === newProps?.post?.id;\n },\n);\n\nconst IntersectionPostLineItem = ({ root, to, ...props }) => {\n const ref = useRef();\n const [show, setShow] = useState(false);\n useEffect(() => {\n const observer = new IntersectionObserver(\n (entries) => {\n const entry = entries[0];\n if (entry.isIntersecting) {\n queueMicrotask(() => setShow(true));\n observer.unobserve(ref.current);\n }\n },\n {\n root,\n rootMargin: `${Math.max(320, screen.height * 0.75)}px`,\n },\n );\n if (ref.current) observer.observe(ref.current);\n return () => {\n if (ref.current) observer.unobserve(ref.current);\n };\n }, []);\n\n return show ? (\n <li>\n <Link to={to}>\n <PostLine {...props} />\n </Link>\n </li>\n ) : (\n <li ref={ref} style={{ height: '4em' }} />\n );\n};\n\n// A media speak a thousand words\nconst MEDIA_DENSITY = 8;\nconst CARD_DENSITY = 8;\nfunction postDensity(post) {\n const { spoilerText, content, poll, mediaAttachments, card } = post;\n const pollContent = poll?.options?.length\n ? poll.options.reduce((acc, cur) => acc + cur.title, '')\n : '';\n const density =\n (spoilerText.length + htmlContentLength(content) + pollContent.length) /\n 140 +\n (mediaAttachments?.length\n ? MEDIA_DENSITY * mediaAttachments.length\n : card?.image\n ? CARD_DENSITY\n : 0);\n return density;\n}\n\nconst MEDIA_SIZE = 48;\n\nfunction PostPeek({ post, filterInfo }) {\n const { t } = useLingui();\n const {\n spoilerText,\n sensitive,\n content,\n emojis,\n poll,\n mediaAttachments,\n card,\n inReplyToId,\n inReplyToAccountId,\n account,\n _thread,\n } = post;\n const isThread =\n (inReplyToId && inReplyToAccountId === account.id) || !!_thread;\n\n const prefs = getPreferences();\n const readingExpandSpoilers = !!prefs['reading:expand:spoilers'];\n // const readingExpandSpoilers = true;\n const showMedia =\n readingExpandSpoilers ||\n (!spoilerText && !sensitive && filterInfo?.action !== 'blur');\n const postText = content ? statusPeek(post) : '';\n\n const showPostContent = !spoilerText || readingExpandSpoilers;\n\n return (\n <div class=\"post-peek\" title={!spoilerText ? postText : ''}>\n <span class=\"post-peek-content\">\n {isThread && !showPostContent && (\n <>\n <span class=\"post-peek-tag post-peek-thread\">Thread</span>{' '}\n </>\n )}\n {!!filterInfo && filterInfo?.action !== 'blur' ? (\n <span class=\"post-peek-filtered\">\n {/* Filtered{filterInfo?.titlesStr ? `: ${filterInfo.titlesStr}` : ''} */}\n {filterInfo?.titlesStr\n ? t`Filtered: ${filterInfo.titlesStr}`\n : t`Filtered`}\n </span>\n ) : (\n <>\n {!!spoilerText && (\n <span class=\"post-peek-spoiler\">\n <Icon\n icon={`${readingExpandSpoilers ? 'eye-open' : 'eye-close'}`}\n />{' '}\n {spoilerText}\n </span>\n )}\n {showPostContent && (\n <div class=\"post-peek-html\">\n {isThread && (\n <>\n <span class=\"post-peek-tag post-peek-thread\">\n <Trans>Thread</Trans>\n </span>{' '}\n </>\n )}\n {!!content && (\n <div\n dangerouslySetInnerHTML={{\n __html: emojifyText(content, emojis),\n }}\n />\n )}\n {!!poll?.options?.length &&\n poll.options.map((o) => (\n <div>\n {poll.multiple ? '▪️' : '•'} {o.title}\n </div>\n ))}\n {!content &&\n mediaAttachments?.length === 1 &&\n mediaAttachments[0].description && (\n <>\n <span class=\"post-peek-tag post-peek-alt\">ALT</span>{' '}\n <div>{mediaAttachments[0].description}</div>\n </>\n )}\n </div>\n )}\n </>\n )}\n </span>\n {(!filterInfo || filterInfo?.action === 'blur') && (\n <span class=\"post-peek-post-content\">\n {!!poll && (\n <span class=\"post-peek-tag post-peek-poll\">\n <Icon icon=\"poll\" size=\"s\" />\n <Trans>Poll</Trans>\n </span>\n )}\n {!!mediaAttachments?.length\n ? mediaAttachments.map((m) => {\n const mediaURL = m.previewUrl || m.url;\n const remoteMediaURL = m.previewRemoteUrl || m.remoteUrl;\n const width = m.meta?.original\n ? m.meta.original.width\n : m.meta?.small?.width || m.meta?.original?.width;\n const height = m.meta?.original\n ? m.meta.original.height\n : m.meta?.small?.height || m.meta?.original?.height;\n return (\n <span key={m.id} class=\"post-peek-media\">\n {{\n image:\n (mediaURL || remoteMediaURL) && showMedia ? (\n <img\n src={mediaURL}\n width={MEDIA_SIZE}\n height={MEDIA_SIZE}\n alt={m.description}\n loading=\"lazy\"\n onError={(e) => {\n const { src } = e.target;\n if (src === mediaURL) {\n e.target.src = remoteMediaURL;\n }\n }}\n style={{\n '--anim-duration': `${Math.min(\n Math.max(Math.max(width, height) / 100, 5),\n 120,\n )}s`,\n }}\n />\n ) : (\n <span class=\"post-peek-faux-media\">🖼</span>\n ),\n gifv:\n (mediaURL || remoteMediaURL) && showMedia ? (\n <img\n src={mediaURL}\n width={MEDIA_SIZE}\n height={MEDIA_SIZE}\n alt={m.description}\n loading=\"lazy\"\n onError={(e) => {\n const { src } = e.target;\n if (src === mediaURL) {\n e.target.src = remoteMediaURL;\n }\n }}\n />\n ) : (\n <span class=\"post-peek-faux-media\">🎞️</span>\n ),\n video:\n (mediaURL || remoteMediaURL) && showMedia ? (\n <img\n src={mediaURL}\n width={MEDIA_SIZE}\n height={MEDIA_SIZE}\n alt={m.description}\n loading=\"lazy\"\n onError={(e) => {\n const { src } = e.target;\n if (src === mediaURL) {\n e.target.src = remoteMediaURL;\n }\n }}\n />\n ) : (\n <span class=\"post-peek-faux-media\">📹</span>\n ),\n audio: <span class=\"post-peek-faux-media\">🎵</span>,\n }[m.type] || null}\n </span>\n );\n })\n : !!card &&\n card.image &&\n showMedia && (\n <span\n class={`post-peek-media post-peek-card card-${\n card.type || ''\n }`}\n >\n {card.image ? (\n <img\n src={card.image}\n width={MEDIA_SIZE}\n height={MEDIA_SIZE}\n alt={\n card.title || card.description || card.imageDescription\n }\n loading=\"lazy\"\n style={{\n '--anim-duration':\n card.width &&\n card.height &&\n `${Math.min(\n Math.max(\n Math.max(card.width, card.height) / 100,\n 5,\n ),\n 120,\n )}s`,\n }}\n />\n ) : (\n <span class=\"post-peek-faux-media\">🔗</span>\n )}\n </span>\n )}\n </span>\n )}\n </div>\n );\n}\n\nfunction PostStats({ post }) {\n const { t } = useLingui();\n const { reblogsCount, repliesCount, favouritesCount } = post;\n return (\n <span class=\"post-stats\">\n {repliesCount > 0 && (\n <span class=\"post-stat-replies\">\n <Icon icon=\"comment2\" size=\"s\" alt={t`Replies`} />{' '}\n {shortenNumber(repliesCount)}\n </span>\n )}\n {favouritesCount > 0 && (\n <span class=\"post-stat-likes\">\n <Icon icon=\"heart\" size=\"s\" alt={t`Likes`} />{' '}\n {shortenNumber(favouritesCount)}\n </span>\n )}\n {reblogsCount > 0 && (\n <span class=\"post-stat-boosts\">\n <Icon icon=\"rocket\" size=\"s\" alt={t`Boosts`} />{' '}\n {shortenNumber(reblogsCount)}\n </span>\n )}\n </span>\n );\n}\n\nfunction binByTime(data, key, numBins) {\n // Extract dates from data objects\n const dates = data.map((item) => new Date(item[key]));\n\n // Find minimum and maximum dates directly (avoiding Math.min/max)\n const minDate = dates.reduce(\n (acc, date) => (date < acc ? date : acc),\n dates[0],\n );\n const maxDate = dates.reduce(\n (acc, date) => (date > acc ? date : acc),\n dates[0],\n );\n\n // Calculate the time span in milliseconds\n const range = Math.min(maxDate.getTime(), Date.now()) - minDate.getTime();\n\n // Create empty bins and loop through data\n const bins = Array.from({ length: numBins }, () => []);\n data.forEach((item) => {\n const date = new Date(item[key]);\n if (date.getTime() > Date.now()) {\n // Future dates go into the last bin\n bins[bins.length - 1].push(item);\n } else {\n const normalized = (date.getTime() - minDate.getTime()) / range;\n const binIndex = Math.floor(normalized * (numBins - 1));\n bins[binIndex].push(item);\n }\n });\n\n return bins;\n}\n\nexport default Catchup;\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { 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 const { t } = useLingui();\n useTitle(t`Likes`, '/favourites');\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\n .list({ limit: LIMIT })\n .values();\n }\n return await favouritesIterator.current.next();\n }\n\n return (\n <Timeline\n title={t`Likes`}\n id=\"favourites\"\n emptyText={t`No likes yet. Go like something!`}\n errorText={t`Unable to load likes.`}\n instance={instance}\n fetchItems={fetchFavourites}\n />\n );\n}\n\nexport default Favourites;\n","import './filters.css';\n\nimport { msg } from '@lingui/core/macro';\nimport { Plural, Trans, useLingui } from '@lingui/react/macro';\nimport { useEffect, useReducer, useRef, useState } from 'preact/hooks';\n\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport MenuConfirm from '../components/menu-confirm';\nimport Modal from '../components/modal';\nimport NavMenu from '../components/nav-menu';\nimport RelativeTime from '../components/relative-time';\nimport { api } from '../utils/api';\nimport i18nDuration from '../utils/i18n-duration';\nimport { getAPIVersions } from '../utils/store-utils';\nimport useInterval from '../utils/useInterval';\nimport useTitle from '../utils/useTitle';\n\nconst FILTER_CONTEXT = ['home', 'public', 'notifications', 'thread', 'account'];\nconst FILTER_CONTEXT_UNIMPLEMENTED = ['thread', 'account'];\nconst FILTER_CONTEXT_LABELS = {\n home: msg`Home and lists`,\n notifications: msg`Notifications`,\n public: msg`Public timelines`,\n thread: msg`Conversations`,\n account: msg`Profiles`,\n};\n\nconst EXPIRY_DURATIONS = [\n 0, // forever\n 30 * 60, // 30 minutes\n 60 * 60, // 1 hour\n 6 * 60 * 60, // 6 hours\n 12 * 60 * 60, // 12 hours\n 60 * 60 * 24, // 24 hours\n 60 * 60 * 24 * 7, // 7 days\n 60 * 60 * 24 * 30, // 30 days\n];\n\nconst EXPIRY_DURATIONS_LABELS = {\n 0: msg`Never`,\n 1800: i18nDuration(30, 'minute'),\n 3600: i18nDuration(1, 'hour'),\n 21600: i18nDuration(6, 'hour'),\n 43200: i18nDuration(12, 'hour'),\n 86_400: i18nDuration(24, 'hour'),\n 604_800: i18nDuration(7, 'day'),\n 2_592_000: i18nDuration(30, 'day'),\n};\n\nfunction Filters() {\n const { t } = useLingui();\n const { masto } = api();\n useTitle(t`Filters`, `/ft`);\n const [uiState, setUIState] = useState('default');\n const [showFiltersAddEditModal, setShowFiltersAddEditModal] = useState(false);\n\n const [reloadCount, reload] = useReducer((c) => c + 1, 0);\n const [filters, setFilters] = useState([]);\n useEffect(() => {\n setUIState('loading');\n (async () => {\n try {\n const filters = await masto.v2.filters.list();\n filters.sort((a, b) => a.title.localeCompare(b.title));\n filters.forEach((filter) => {\n if (filter.keywords?.length) {\n filter.keywords.sort((a, b) => a.id - b.id);\n }\n });\n console.log(filters);\n setFilters(filters);\n setUIState('default');\n } catch (e) {\n console.error(e);\n setUIState('error');\n }\n })();\n }, [reloadCount]);\n\n return (\n <div id=\"filters-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\" alt={t`Home`} />\n </Link>\n </div>\n <h1>\n <Trans>Filters</Trans>\n </h1>\n <div class=\"header-side\">\n <button\n type=\"button\"\n class=\"plain\"\n onClick={() => {\n setShowFiltersAddEditModal(true);\n }}\n >\n <Icon icon=\"plus\" size=\"l\" alt={t`New filter`} />\n </button>\n </div>\n </div>\n </header>\n <main>\n {filters.length > 0 ? (\n <>\n <ul class=\"filters-list\">\n {filters.map((filter) => {\n const { id, title, expiresAt, keywords } = filter;\n return (\n <li key={id}>\n <div>\n <h2>{title}</h2>\n {keywords?.length > 0 && (\n <div>\n {keywords.map((k) => (\n <>\n <span class=\"tag collapsed insignificant\">\n {k.wholeWord ? `“${k.keyword}”` : k.keyword}\n </span>{' '}\n </>\n ))}\n </div>\n )}\n <small class=\"insignificant\">\n <ExpiryStatus expiresAt={expiresAt} />\n </small>\n </div>\n <button\n type=\"button\"\n class=\"plain\"\n onClick={() => {\n setShowFiltersAddEditModal({\n filter,\n });\n }}\n >\n <Icon icon=\"pencil\" size=\"l\" alt=\"Edit filter\" />\n </button>\n </li>\n );\n })}\n </ul>\n {filters.length > 1 && (\n <footer class=\"ui-state\">\n <small class=\"insignificant\">\n <Plural\n value={filters.length}\n one=\"# filter\"\n other=\"# filters\"\n />\n </small>\n </footer>\n )}\n </>\n ) : uiState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader />\n </p>\n ) : uiState === 'error' ? (\n <p class=\"ui-state\">\n <Trans>Unable to load filters.</Trans>\n </p>\n ) : (\n <p class=\"ui-state\">\n <Trans>No filters yet.</Trans>\n </p>\n )}\n </main>\n </div>\n {!!showFiltersAddEditModal && (\n <Modal\n title={t`Add filter`}\n onClose={() => {\n setShowFiltersAddEditModal(false);\n }}\n >\n <FiltersAddEdit\n filter={showFiltersAddEditModal?.filter}\n onClose={(result) => {\n if (result.state === 'success') {\n reload();\n }\n setShowFiltersAddEditModal(false);\n }}\n />\n </Modal>\n )}\n </div>\n );\n}\n\nlet _id = 1;\nconst incID = () => _id++;\nfunction FiltersAddEdit({ filter, onClose }) {\n const { _, t } = useLingui();\n const { masto } = api();\n const [uiState, setUIState] = useState('default');\n const editMode = !!filter;\n const { context, expiresAt, id, keywords, title, filterAction } =\n filter || {};\n const hasExpiry = !!expiresAt;\n const expiresAtDate = hasExpiry && new Date(expiresAt);\n const [editKeywords, setEditKeywords] = useState(keywords || []);\n const keywordsRef = useRef();\n\n // Hacky way of handling removed keywords for both existing and new ones\n const [removedKeywordIDs, setRemovedKeywordIDs] = useState([]);\n const [removedKeyword_IDs, setRemovedKeyword_IDs] = useState([]);\n\n const filteredEditKeywords = editKeywords.filter(\n (k) =>\n !removedKeywordIDs.includes(k.id) && !removedKeyword_IDs.includes(k._id),\n );\n\n return (\n <div class=\"sheet\" id=\"filters-add-edit-modal\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}\n <header>\n <h2>{editMode ? t`Edit filter` : t`New filter`}</h2>\n </header>\n <main>\n <form\n onSubmit={(e) => {\n e.preventDefault();\n const formData = new FormData(e.target);\n const title = formData.get('title');\n const keywordIDs = formData.getAll('keyword_attributes[][id]');\n const keywordKeywords = formData.getAll(\n 'keyword_attributes[][keyword]',\n );\n // const keywordWholeWords = formData.getAll(\n // 'keyword_attributes[][whole_word]',\n // );\n // Not using getAll because it skips the empty checkboxes\n const keywordWholeWords = [\n ...keywordsRef.current.querySelectorAll(\n 'input[name=\"keyword_attributes[][whole_word]\"]',\n ),\n ].map((i) => i.checked);\n const keywordsAttributes = keywordKeywords.map((k, i) => ({\n id: keywordIDs[i] || undefined,\n keyword: k,\n wholeWord: keywordWholeWords[i],\n }));\n // if (editMode && keywords?.length) {\n // // Find which one got deleted and add to keywordsAttributes\n // keywords.forEach((k) => {\n // if (!keywordsAttributes.find((ka) => ka.id === k.id)) {\n // keywordsAttributes.push({\n // ...k,\n // _destroy: true,\n // });\n // }\n // });\n // }\n if (editMode && removedKeywordIDs?.length) {\n removedKeywordIDs.forEach((id) => {\n keywordsAttributes.push({\n id,\n _destroy: true,\n });\n });\n }\n const context = formData.getAll('context');\n let expiresIn = formData.get('expires_in');\n const filterAction = formData.get('filter_action');\n console.log({\n title,\n keywordIDs,\n keywords: keywordKeywords,\n wholeWords: keywordWholeWords,\n keywordsAttributes,\n context,\n expiresIn,\n filterAction,\n });\n\n // Required fields\n if (!title || !context?.length) {\n return;\n }\n\n setUIState('loading');\n\n (async () => {\n try {\n let filterResult;\n\n if (editMode) {\n if (expiresIn === '' || expiresIn === null) {\n // No value\n // Preserve existing expiry if not specified\n // Seconds from now to expiresAtDate\n // Other clients don't do this\n if (hasExpiry) {\n expiresIn = Math.floor(\n (expiresAtDate - new Date()) / 1000,\n );\n } else {\n expiresIn = null;\n }\n } else if (expiresIn === '0' || expiresIn === 0) {\n // 0 = Never\n expiresIn = null;\n } else {\n expiresIn = +expiresIn;\n }\n filterResult = await masto.v2.filters.$select(id).update({\n title,\n context,\n expiresIn,\n keywordsAttributes,\n filterAction,\n });\n } else {\n expiresIn = +expiresIn || null;\n filterResult = await masto.v2.filters.create({\n title,\n context,\n expiresIn,\n keywordsAttributes,\n filterAction,\n });\n }\n console.log({ filterResult });\n setUIState('default');\n onClose?.({\n state: 'success',\n filter: filterResult,\n });\n } catch (error) {\n console.error(error);\n setUIState('error');\n alert(\n editMode\n ? t`Unable to edit filter`\n : t`Unable to create filter`,\n );\n }\n })();\n }}\n >\n <div class=\"filter-form-row\">\n <label>\n <b>\n <Trans>Title</Trans>\n </b>\n <input\n type=\"text\"\n name=\"title\"\n defaultValue={title}\n disabled={uiState === 'loading'}\n dir=\"auto\"\n required\n />\n </label>\n </div>\n <div class=\"filter-form-keywords\" ref={keywordsRef}>\n {filteredEditKeywords.length ? (\n <ul class=\"filter-keywords\">\n {filteredEditKeywords.map((k) => {\n const { id, keyword, wholeWord, _id } = k;\n return (\n <li key={`${id}-${_id}`}>\n <input\n type=\"hidden\"\n name=\"keyword_attributes[][id]\"\n value={id}\n />\n <input\n name=\"keyword_attributes[][keyword]\"\n type=\"text\"\n defaultValue={keyword}\n disabled={uiState === 'loading'}\n required\n dir=\"auto\"\n />\n <div class=\"filter-keyword-actions\">\n <label>\n <input\n name=\"keyword_attributes[][whole_word]\"\n type=\"checkbox\"\n value={id} // Hacky way to map checkbox boolean to the keyword id\n defaultChecked={wholeWord}\n disabled={uiState === 'loading'}\n />{' '}\n <Trans>Whole word</Trans>\n </label>\n <button\n type=\"button\"\n class=\"light danger small\"\n disabled={uiState === 'loading'}\n onClick={() => {\n if (id) {\n removedKeywordIDs.push(id);\n setRemovedKeywordIDs([...removedKeywordIDs]);\n } else if (_id) {\n removedKeyword_IDs.push(_id);\n setRemovedKeyword_IDs([...removedKeyword_IDs]);\n }\n }}\n >\n <Icon icon=\"x\" alt={t`Remove`} />\n </button>\n </div>\n </li>\n );\n })}\n </ul>\n ) : (\n <div class=\"filter-keywords\">\n <div class=\"insignificant\">\n <Trans>No keywords. Add one.</Trans>\n </div>\n </div>\n )}\n <footer class=\"filter-keywords-footer\">\n <button\n type=\"button\"\n class=\"light\"\n onClick={() => {\n setEditKeywords([\n ...editKeywords,\n {\n _id: incID(),\n keyword: '',\n wholeWord: true,\n },\n ]);\n setTimeout(() => {\n // Focus last input\n const fields =\n keywordsRef.current.querySelectorAll(\n 'input[type=\"text\"]',\n );\n fields[fields.length - 1]?.focus?.();\n }, 10);\n }}\n >\n <Trans>Add keyword</Trans>\n </button>{' '}\n {filteredEditKeywords?.length > 1 && (\n <small class=\"insignificant\">\n <Plural\n value={filteredEditKeywords.length}\n one=\"# keyword\"\n other=\"# keywords\"\n />\n </small>\n )}\n </footer>\n </div>\n <div class=\"filter-form-cols\">\n <div class=\"filter-form-col\">\n <div>\n <b>\n <Trans>Filter from…</Trans>\n </b>\n </div>\n {FILTER_CONTEXT.map((ctx) => (\n <div>\n <label\n class={\n FILTER_CONTEXT_UNIMPLEMENTED.includes(ctx)\n ? 'insignificant'\n : ''\n }\n >\n <input\n type=\"checkbox\"\n name=\"context\"\n value={ctx}\n defaultChecked={!!context ? context.includes(ctx) : true}\n disabled={uiState === 'loading'}\n />{' '}\n {_(FILTER_CONTEXT_LABELS[ctx])}\n {FILTER_CONTEXT_UNIMPLEMENTED.includes(ctx) ? '*' : ''}\n </label>{' '}\n </div>\n ))}\n <p>\n <small class=\"insignificant\">\n <Trans>* Not implemented yet</Trans>\n </small>\n </p>\n </div>\n <div class=\"filter-form-col\">\n {editMode && (\n <Trans>\n Status:{' '}\n <b>\n <ExpiryStatus expiresAt={expiresAt} showNeverExpires />\n </b>\n </Trans>\n )}\n <div>\n <label for=\"filters-expires_in\">\n {editMode ? t`Change expiry` : t`Expiry`}\n </label>\n <select\n id=\"filters-expires_in\"\n name=\"expires_in\"\n disabled={uiState === 'loading'}\n defaultValue={editMode ? undefined : 0}\n >\n {editMode && <option></option>}\n {EXPIRY_DURATIONS.map((v) => (\n <option value={v}>\n {typeof EXPIRY_DURATIONS_LABELS[v] === 'function'\n ? EXPIRY_DURATIONS_LABELS[v]()\n : _(EXPIRY_DURATIONS_LABELS[v])}\n </option>\n ))}\n </select>\n </div>\n <p>\n <Trans>Filtered post will be…</Trans>\n <br />\n {getAPIVersions()?.mastodon >= 5 && (\n <label class=\"ib\">\n <input\n type=\"radio\"\n name=\"filter_action\"\n value=\"blur\"\n defaultChecked={filterAction === 'blur'}\n disabled={uiState === 'loading'}\n />{' '}\n <Trans>obscured (media only)</Trans>\n </label>\n )}{' '}\n <label class=\"ib\">\n <input\n type=\"radio\"\n name=\"filter_action\"\n value=\"warn\"\n defaultChecked={\n (filterAction !== 'hide' && filterAction !== 'blur') ||\n !editMode\n }\n disabled={uiState === 'loading'}\n />{' '}\n <Trans>minimized</Trans>\n </label>{' '}\n <label class=\"ib\">\n <input\n type=\"radio\"\n name=\"filter_action\"\n value=\"hide\"\n defaultChecked={filterAction === 'hide'}\n disabled={uiState === 'loading'}\n />{' '}\n <Trans>hidden</Trans>\n </label>\n </p>\n </div>\n </div>\n <footer class=\"filter-form-footer\">\n <span>\n <button type=\"submit\" disabled={uiState === 'loading'}>\n {editMode ? t`Save` : t`Create`}\n </button>{' '}\n <Loader abrupt hidden={uiState !== 'loading'} />\n </span>\n {editMode && (\n <MenuConfirm\n disabled={uiState === 'loading'}\n align=\"end\"\n menuItemClassName=\"danger\"\n confirmLabel={t`Delete this filter?`}\n onClick={() => {\n setUIState('loading');\n (async () => {\n try {\n await masto.v2.filters.$select(id).remove();\n setUIState('default');\n onClose?.({\n state: 'success',\n });\n } catch (e) {\n console.error(e);\n setUIState('error');\n alert(t`Unable to delete filter.`);\n }\n })();\n }}\n >\n <button\n type=\"button\"\n class=\"light danger\"\n onClick={() => {}}\n disabled={uiState === 'loading'}\n >\n <Trans>Delete…</Trans>\n </button>\n </MenuConfirm>\n )}\n </footer>\n </form>\n </main>\n </div>\n );\n}\n\nfunction ExpiryStatus({ expiresAt, showNeverExpires }) {\n const { t } = useLingui();\n const hasExpiry = !!expiresAt;\n const expiresAtDate = hasExpiry && new Date(expiresAt);\n const expired = hasExpiry && expiresAtDate <= new Date();\n\n // If less than a minute left, re-render interval every second, else every minute\n const [_, rerender] = useReducer((c) => c + 1, 0);\n useInterval(rerender, expired || 30_000);\n\n return expired ? (\n t`Expired`\n ) : hasExpiry ? (\n <Trans>\n Expiring <RelativeTime datetime={expiresAtDate} />\n </Trans>\n ) : (\n showNeverExpires && t`Never expires`\n );\n}\n\nexport default Filters;\n","import { Plural, Trans, useLingui } from '@lingui/react/macro';\nimport { 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 { t } = useLingui();\n const { masto, instance } = api();\n useTitle(t`Followed Hashtags`, `/fh`);\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\" alt={t`Home`} />\n </Link>\n </div>\n <h1>\n <Trans>Followed Hashtags</Trans>\n </h1>\n <div class=\"header-side\" />\n </div>\n </header>\n <main>\n {followedHashtags.length > 0 ? (\n <>\n <ul class=\"link-list\">\n {followedHashtags.map((tag) => (\n <li>\n <Link\n to={\n instance\n ? `/${instance}/t/${tag.name}`\n : `/t/${tag.name}`\n }\n >\n <Icon icon=\"hashtag\" alt=\"#\" /> <span>{tag.name}</span>\n </Link>\n </li>\n ))}\n </ul>\n {followedHashtags.length > 1 && (\n <footer class=\"ui-state\">\n <small class=\"insignificant\">\n <Plural\n value={followedHashtags.length}\n one=\"# hashtag\"\n other=\"# hashtags\"\n />\n </small>\n </footer>\n )}\n </>\n ) : uiState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n ) : uiState === 'error' ? (\n <p class=\"ui-state\">\n <Trans>Unable to load followed hashtags.</Trans>\n </p>\n ) : (\n <p class=\"ui-state\">\n <Trans>No hashtags followed yet.</Trans>\n </p>\n )}\n </main>\n </div>\n </div>\n );\n}\n\nexport default FollowedHashtags;\n","import { useLingui } from '@lingui/react/macro';\nimport { 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, { getStatus, saveStatus } from '../utils/states';\nimport supports from '../utils/supports';\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 const { t } = useLingui();\n useTitle(\n title ||\n t({\n id: 'following.title',\n message: 'Following',\n }),\n path || '/following',\n );\n const { masto, streaming, instance } = api();\n const snapStates = useSnapshot(states);\n const homeIterable = useRef();\n const homeIterator = useRef();\n const latestItem = useRef();\n __BENCHMARK.end('time-to-following');\n\n console.debug('RENDER Following', title, id);\n const supportsPixelfed = supports('@pixelfed/home-include-reblogs');\n\n async function fetchHome(firstLoad) {\n if (firstLoad || !homeIterator.current) {\n __BENCHMARK.start('fetch-home-first');\n homeIterable.current = masto.v1.timelines.home.list({ limit: LIMIT });\n homeIterator.current = homeIterable.current.values();\n }\n if (supportsPixelfed && homeIterable.current?.params) {\n if (typeof homeIterable.current.params === 'string') {\n homeIterable.current.params += '&include_reblogs=true';\n } else {\n homeIterable.current.params.include_reblogs = true;\n }\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 __BENCHMARK.end('fetch-home-first');\n return {\n ...results,\n value,\n };\n }\n\n async function checkForUpdates() {\n try {\n const opts = {\n limit: 5,\n since_id: latestItem.current,\n };\n if (supports('@pixelfed/home-include-reblogs')) {\n opts.include_reblogs = true;\n }\n const results = await masto.v1.timelines.home.list(opts).values().next();\n let { value } = results;\n console.log('checkForUpdates', latestItem.current, value);\n const valueContainsLatestItem = value[0]?.id === latestItem.current; // since_id might not be supported\n if (value?.length && !valueContainsLatestItem) {\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 console.error(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 || t({ id: 'following.title', message: 'Following' })}\n id={id || 'following'}\n emptyText={t`Nothing to see here.`}\n errorText={t`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 showReplyParent\n />\n );\n}\n\nexport default Following;\n","import { plural } from '@lingui/core/macro';\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport {\n FocusableItem,\n MenuDivider,\n MenuGroup,\n MenuHeader,\n MenuItem,\n} from '@szhsin/react-menu';\nimport { useEffect, useMemo, useRef, useState } from 'preact/hooks';\nimport { useNavigate, useParams, useSearchParams } from 'react-router-dom';\n\nimport Icon from '../components/icon';\nimport MenuConfirm from '../components/menu-confirm';\nimport Menu2 from '../components/menu2';\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, { saveStatus } from '../utils/states';\nimport { isMediaFirstInstance } from '../utils/store-utils';\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 { t } = useLingui();\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 title = instance\n ? media\n ? t`${hashtagTitle} (Media only) on ${instance}`\n : t`${hashtagTitle} on ${instance}`\n : media\n ? t`${hashtagTitle} (Media only)`\n : t`${hashtagTitle}`;\n useTitle(title, `/:instance?/t/:hashtag`);\n const latestItem = useRef();\n\n const mediaFirst = useMemo(() => isMediaFirstInstance(), []);\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 // }).values();\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 ? true : undefined,\n })\n .values()\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 || mediaFirst, // 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 .values()\n .next();\n let { value } = results;\n const valueContainsLatestItem = value[0]?.id === latestItem.current; // since_id might not be supported\n if (value?.length && !valueContainsLatestItem) {\n value = filteredItems(value, 'public');\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 const [featuredUIState, setFeaturedUIState] = useState('default');\n const [featuredTags, setFeaturedTags] = useState([]);\n const [isFeaturedTag, setIsFeaturedTag] = useState(false);\n useEffect(() => {\n if (!authenticated) return;\n (async () => {\n try {\n const featuredTags = await masto.v1.featuredTags.list();\n setFeaturedTags(featuredTags);\n setIsFeaturedTag(\n featuredTags.some(\n (tag) => tag.name.toLowerCase() === hashtag.toLowerCase(),\n ),\n );\n } catch (e) {\n console.error(e);\n }\n })();\n }, []);\n\n return (\n <>\n <Timeline\n key={instance + hashtagTitle}\n title={title}\n titleComponent={\n !!instance && (\n <h1 class=\"header-double-lines\">\n <b dir=\"auto\">{hashtagTitle}</b>\n <div>{instance}</div>\n </h1>\n )\n }\n id=\"hashtag\"\n instance={instance}\n emptyText={t`No one has posted anything with this tag yet.`}\n errorText={t`Unable to load posts with this tag`}\n fetchItems={fetchHashtags}\n checkForUpdates={checkForUpdates}\n useItemID\n view={media || mediaFirst ? '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\" alt={t`More`} />\n </button>\n }\n >\n {!!info && hashtags.length === 1 && (\n <>\n <MenuConfirm\n subMenu\n confirm={info.following}\n confirmLabel={t`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(t`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(t`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\" />{' '}\n <span>\n <Trans>Following…</Trans>\n </span>\n </>\n ) : (\n <>\n <Icon icon=\"plus\" />{' '}\n <span>\n <Trans>Follow</Trans>\n </span>\n </>\n )}\n </MenuConfirm>\n <MenuItem\n type=\"checkbox\"\n checked={isFeaturedTag}\n disabled={featuredUIState === 'loading' || !authenticated}\n onClick={() => {\n setFeaturedUIState('loading');\n if (isFeaturedTag) {\n const featuredTagID = featuredTags.find(\n (tag) =>\n tag.name.toLowerCase() === hashtag.toLowerCase(),\n ).id;\n if (featuredTagID) {\n masto.v1.featuredTags\n .$select(featuredTagID)\n .remove()\n .then(() => {\n setIsFeaturedTag(false);\n showToast(t`Unfeatured on profile`);\n setFeaturedTags(\n featuredTags.filter(\n (tag) => tag.id !== featuredTagID,\n ),\n );\n })\n .catch((e) => {\n console.error(e);\n })\n .finally(() => {\n setFeaturedUIState('default');\n });\n } else {\n showToast(t`Unable to unfeature on profile`);\n }\n } else {\n masto.v1.featuredTags\n .create({\n name: hashtag,\n })\n .then((value) => {\n setIsFeaturedTag(true);\n showToast(t`Featured on profile`);\n setFeaturedTags(featuredTags.concat(value));\n })\n .catch((e) => {\n console.error(e);\n })\n .finally(() => {\n setFeaturedUIState('default');\n });\n }\n }}\n >\n {isFeaturedTag ? (\n <>\n <Icon icon=\"check-circle\" />\n <span>\n <Trans>Featured on profile</Trans>\n </span>\n </>\n ) : (\n <>\n <Icon icon=\"check-circle\" />\n <span>\n <Trans>Feature on profile</Trans>\n </span>\n </>\n )}\n </MenuItem>\n <MenuDivider />\n </>\n )}\n {!mediaFirst && (\n <>\n <MenuHeader className=\"plain\">\n <Trans>Filters</Trans>\n </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\" alt=\"☑️\" />{' '}\n <span class=\"menu-grow\">\n <Trans>Media only</Trans>\n </span>\n </MenuItem>\n <MenuDivider />\n </>\n )}\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('+')}${linkParams}`\n : `/t/${hashtags.join('+')}${linkParams}`;\n }\n }}\n >\n <Icon icon=\"hashtag\" />\n <input\n ref={ref}\n type=\"text\"\n placeholder={\n reachLimit\n ? plural(TOTAL_TAGS_LIMIT, {\n other: 'Max # tags',\n })\n : t`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 dir=\"auto\"\n />\n </form>\n )}\n </FocusableItem>\n <MenuGroup takeOverflow>\n {hashtags.map((tag, i) => (\n <MenuItem\n key={tag}\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={t`Remove hashtag`} class=\"danger-icon\" />\n <span class=\"bidi-isolate\">\n <span class=\"more-insignificant\">#</span>\n {tag}\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 plural(SHORTCUTS_LIMIT, {\n one: 'Max # shortcut reached. Unable to add shortcut.',\n other: 'Max # shortcuts reached. Unable to add shortcut.',\n }),\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(t`This shortcut already exists`);\n } else {\n states.shortcuts.push(shortcut);\n showToast(t`Hashtag shortcut added`);\n }\n }}\n >\n <Icon icon=\"shortcut\" />{' '}\n <span>\n <Trans>Add to Shortcuts</Trans>\n </span>\n </MenuItem>\n <MenuItem\n onClick={() => {\n let newInstance = prompt(\n t`Enter a new instance e.g. \"mastodon.social\"`,\n );\n if (!/\\./.test(newInstance)) {\n if (newInstance) alert(t`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\" />{' '}\n <span>\n <Trans>Go to another instance…</Trans>\n </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 <Trans>\n Go to my instance (<b>{currentInstance}</b>)\n </Trans>\n </small>\n </MenuItem>\n )}\n </Menu2>\n }\n />\n {!columnMode && !!hashtags?.length && (\n <data\n class=\"compose-data\"\n value={JSON.stringify({\n draftStatus: {\n status: `${hashtags.length > 1 ? '\\n\\n' : ' '}${hashtagTitle}`,\n },\n })}\n />\n )}\n </>\n );\n}\n\nexport default Hashtags;\n","import './lists.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { Menu, MenuDivider, MenuHeader, 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 ListAddEdit from '../components/list-add-edit';\nimport ListExclusiveBadge from '../components/list-exclusive-badge';\nimport MenuConfirm from '../components/menu-confirm';\nimport MenuLink from '../components/menu-link';\nimport Menu2 from '../components/menu2';\nimport Modal from '../components/modal';\nimport Timeline from '../components/timeline';\nimport { api } from '../utils/api';\nimport { filteredItems } from '../utils/filters';\nimport { getList, getLists } from '../utils/lists';\nimport states, { saveStatus } from '../utils/states';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 20;\n\nfunction List(props) {\n const { t } = useLingui();\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\n .$select(id)\n .list({\n limit: LIMIT,\n })\n .values();\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 const valueContainsLatestItem = value[0]?.id === latestItem.current; // since_id might not be supported\n if (value?.length && !valueContainsLatestItem) {\n value = filteredItems(value, 'home');\n return true;\n }\n return false;\n } catch (e) {\n return false;\n }\n }\n\n const [lists, setLists] = useState([]);\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 getList(id);\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={t`Nothing yet.`}\n errorText={t`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 showReplyParent\n // refresh={reloadCount}\n headerStart={\n // <Link to=\"/l\" class=\"button plain\">\n // <Icon icon=\"list\" size=\"l\" />\n // </Link>\n <Menu2\n overflow=\"auto\"\n menuButton={\n <button type=\"button\" class=\"plain\">\n <Icon icon=\"list\" size=\"l\" alt={t`Lists`} />\n <Icon icon=\"chevron-down\" size=\"s\" />\n </button>\n }\n onMenuChange={(e) => {\n if (e.open) {\n getLists().then(setLists);\n }\n }}\n >\n <MenuLink to=\"/l\">\n <span>\n <Trans>All Lists</Trans>\n </span>\n </MenuLink>\n {lists?.length > 0 && (\n <>\n <MenuDivider />\n {lists.map((list) => (\n <MenuLink key={list.id} to={`/l/${list.id}`}>\n <span>\n {list.title}\n {list.exclusive && (\n <>\n {' '}\n <ListExclusiveBadge />\n </>\n )}\n </span>\n </MenuLink>\n ))}\n </>\n )}\n </Menu2>\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\" alt={t`More`} />\n </button>\n }\n >\n {list?.exclusive && (\n <>\n <MenuHeader className=\"plain\">\n <ListExclusiveBadge />{' '}\n <Trans>\n Posts on this list are hidden from Home/Following\n </Trans>\n </MenuHeader>\n <MenuDivider />\n </>\n )}\n <MenuItem\n onClick={() =>\n setShowListAddEditModal({\n list,\n })\n }\n >\n <Icon icon=\"pencil\" size=\"l\" />\n <span>\n <Trans>Edit</Trans>\n </span>\n </MenuItem>\n <MenuItem onClick={() => setShowManageMembersModal(true)}>\n <Icon icon=\"group\" size=\"l\" />\n <span>\n <Trans>Manage members</Trans>\n </span>\n </MenuItem>\n </Menu2>\n }\n />\n {showListAddEditModal && (\n <Modal\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 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;\n\nfunction ListManageMembers({ listID, onClose }) {\n const { t } = useLingui();\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 .values();\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\" alt={t`Close`} />\n </button>\n )}\n <header>\n <h2>\n <Trans>Manage members</Trans>\n </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 <Trans>Show more…</Trans>\n </button>\n </InView>\n )}\n </ul>\n </main>\n </div>\n );\n}\n\nfunction RemoveAddButton({ account, listID }) {\n const { t } = useLingui();\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={\n <span>\n <Trans>\n Remove <span class=\"bidi-isolate\">@{account.username}</span> from\n list?\n </Trans>\n </span>\n }\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 ? t`Add` : t`Remove…`}\n </button>\n </MenuConfirm>\n );\n}\n\nexport default List;\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};\n\nconst GROUP_TYPES = ['favourite', 'reblog', 'follow'];\nconst groupable = (type) => GROUP_TYPES.includes(type);\n\nexport function 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\nexport function massageNotifications2(notifications) {\n if (notifications?.notificationGroups) {\n const {\n accounts = [],\n notificationGroups = [],\n statuses = [],\n } = notifications;\n return notificationGroups.map((group) => {\n const { sampleAccountIds, statusId } = group;\n const sampleAccounts =\n sampleAccountIds?.map((id) => accounts.find((a) => a.id === id)) || [];\n const status = statuses?.find((s) => s.id === statusId) || null;\n return {\n ...group,\n sampleAccounts,\n status,\n };\n });\n }\n return notifications;\n}\n\nexport function groupNotifications2(groupNotifications) {\n // Make grouped notifications to look like faux grouped notifications\n const newGroupNotifications = groupNotifications.map((gn) => {\n const {\n latestPageNotificationAt,\n mostRecentNotificationId,\n sampleAccounts,\n notificationsCount,\n } = gn;\n\n return {\n id: '' + mostRecentNotificationId,\n createdAt: latestPageNotificationAt,\n account: sampleAccounts[0],\n ...gn,\n };\n });\n\n // Merge favourited and reblogged of same status into a single notification\n // - new type: \"favourite+reblog\"\n // - sum numbers for `notificationsCount` and `sampleAccounts`\n const notificationsMap = {};\n const newGroupNotifications1 = [];\n for (let i = 0; i < newGroupNotifications.length; i++) {\n const gn = newGroupNotifications[i];\n const {\n type,\n status,\n createdAt,\n notificationsCount,\n sampleAccounts,\n groupKey,\n } = gn;\n const date = createdAt ? new Date(createdAt).toLocaleDateString() : '';\n let virtualType = type;\n // const sameCount = notificationsCount > 0 && notificationsCount === sampleAccounts?.length;\n // if (sameCount && (type === 'favourite' || type === 'reblog')) {\n const sampleCountDiffNotificationsCount =\n notificationsCount > 0 &&\n sampleAccounts?.length > 0 &&\n notificationsCount > sampleAccounts?.length;\n if (\n !sampleCountDiffNotificationsCount &&\n (type === 'favourite' || type === 'reblog')\n ) {\n virtualType = 'favourite+reblog';\n }\n // const key = `${status?.id}-${virtualType}-${date}-${sameCount ? 1 : 0}`;\n const key = `${status?.id}-${virtualType}-${date}`;\n const mappedNotification = notificationsMap[key];\n if (!groupable(type)) {\n newGroupNotifications1.push(gn);\n } else if (mappedNotification) {\n // Merge sampleAccounts + merge _types\n sampleAccounts.forEach((a) => {\n const mappedAccount = mappedNotification.sampleAccounts.find(\n (ma) => ma.id === a.id,\n );\n if (!mappedAccount) {\n mappedNotification.sampleAccounts.push({\n ...a,\n _types: [type],\n });\n } else {\n mappedAccount._types.push(type);\n mappedAccount._types.sort().reverse();\n }\n });\n // mappedNotification.notificationsCount =\n // mappedNotification.sampleAccounts.length;\n mappedNotification.notificationsCount = Math.min(\n mappedNotification.notificationsCount,\n notificationsCount,\n );\n mappedNotification._notificationsCount.push(notificationsCount);\n mappedNotification._sampleAccountsCount.push(sampleAccounts?.length);\n mappedNotification._accounts = mappedNotification.sampleAccounts;\n mappedNotification._groupKeys.push(groupKey);\n } else {\n const accounts = sampleAccounts.map((a) => ({\n ...a,\n _types: [type],\n }));\n notificationsMap[key] = {\n ...gn,\n sampleAccounts: accounts,\n type: virtualType,\n _accounts: accounts,\n _groupKeys: groupKey ? [groupKey] : [],\n _notificationsCount: [notificationsCount],\n _sampleAccountsCount: [sampleAccounts?.length],\n };\n newGroupNotifications1.push(notificationsMap[key]);\n }\n }\n\n // 2nd pass.\n // - Group 1 account favourte/reblog multiple posts\n // - _statuses: [status, status, ...]\n const notificationsMap2 = {};\n const newGroupNotifications2 = [];\n for (let i = 0; i < newGroupNotifications1.length; i++) {\n const gn = newGroupNotifications1[i];\n const { type, account, _accounts, sampleAccounts, createdAt, groupKey } =\n gn;\n const date = createdAt ? new Date(createdAt).toLocaleDateString() : '';\n const hasOneAccount =\n sampleAccounts?.length === 1 || _accounts?.length === 1;\n if (\n (type === 'favourite' ||\n type === 'reblog' ||\n type === 'favourite+reblog') &&\n hasOneAccount\n ) {\n const key = `${account?.id}-${type}-${date}`;\n const mappedNotification = notificationsMap2[key];\n if (mappedNotification) {\n mappedNotification._statuses.push(gn.status);\n mappedNotification._ids += `-${gn.id}`;\n mappedNotification._groupKeys.push(groupKey);\n } else {\n let n = (notificationsMap2[key] = {\n ...gn,\n type,\n _ids: gn.id,\n _statuses: [gn.status],\n _groupKeys: groupKey ? [groupKey] : [],\n });\n newGroupNotifications2.push(n);\n }\n } else {\n newGroupNotifications2.push(gn);\n }\n }\n\n console.log('newGroupNotifications2', newGroupNotifications2);\n\n return newGroupNotifications2;\n}\n\nexport default function 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 (!groupable(type)) {\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._ids += `-${id}`;\n } else {\n account._types = [type];\n mappedNotification._accounts.push(account);\n mappedNotification._ids += `-${id}`;\n }\n } else {\n if (account) account._types = [type];\n let n = (notificationsMap[key] = {\n ...notification,\n type: virtualType,\n _ids: id,\n _accounts: account ? [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._ids += `-${id}`;\n } else {\n let n = (notificationsMap2[key] = {\n ...notification,\n type,\n _ids: id,\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","import { Trans, useLingui } from '@lingui/react/macro';\nimport { 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 { fixNotifications } from '../utils/group-notifications';\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 { t } = useLingui();\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(type === 'private' ? t`Private mentions` : t`Mentions`, '/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\n .list({\n limit: LIMIT,\n types: ['mention'],\n })\n .values();\n }\n const results = await mentionsIterator.current.next();\n let { value } = results;\n if (value?.length) {\n value = fixNotifications(value);\n\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\n .list({\n limit: LIMIT,\n })\n .values();\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 .values()\n .next();\n let { value } = results;\n console.log(\n 'checkForUpdates PRIVATE',\n latestConversationItem.current,\n value,\n );\n const valueContainsLatestItem =\n value[0]?.id === latestConversationItem.current; // since_id might not be supported\n if (value?.length && !valueContainsLatestItem) {\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 .values()\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 <Trans>All</Trans>\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 <Trans>Private</Trans>\n </Link>\n </div>\n );\n }, [type]);\n\n return (\n <Timeline\n title={t`Mentions`}\n id=\"mentions\"\n emptyText={t`No one mentioned you :(`}\n errorText={t`Unable to load mentions.`}\n instance={instance}\n fetchItems={fetchItems}\n checkForUpdates={checkForUpdates}\n useItemID\n timelineStart={TimelineStart}\n refresh={type}\n filterContext=\"notifications\"\n />\n );\n}\n\nexport default Mentions;\n","import './notifications.css';\n\nimport { msg } from '@lingui/core/macro';\nimport { Plural, Trans, useLingui } from '@lingui/react/macro';\nimport { Fragment } from 'preact';\nimport { memo } from 'preact/compat';\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\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 Modal from '../components/modal';\nimport NavMenu from '../components/nav-menu';\nimport Notification from '../components/notification';\nimport Status from '../components/status';\nimport { api } from '../utils/api';\nimport enhanceContent from '../utils/enhance-content';\nimport FilterContext from '../utils/filter-context';\nimport groupNotifications, {\n groupNotifications2,\n massageNotifications2,\n} from '../utils/group-notifications';\nimport handleContentLinks from '../utils/handle-content-links';\nimport mem from '../utils/mem';\nimport niceDateTime from '../utils/nice-date-time';\nimport { getRegistration } from '../utils/push-notifications';\nimport shortenNumber from '../utils/shorten-number';\nimport showToast from '../utils/show-toast';\nimport states, { saveStatus } from '../utils/states';\nimport store from '../utils/store';\nimport { getAPIVersions, getCurrentInstance } from '../utils/store-utils';\nimport supports from '../utils/supports';\nimport usePageVisibility from '../utils/usePageVisibility';\nimport useScroll from '../utils/useScroll';\nimport useTitle from '../utils/useTitle';\n\nconst NOTIFICATIONS_LIMIT = 80;\nconst NOTIFICATIONS_GROUPED_LIMIT = 20;\nconst emptySearchParams = new URLSearchParams();\n\nconst scrollIntoViewOptions = {\n block: 'center',\n inline: 'center',\n behavior: 'smooth',\n};\n\nconst memSupportsGroupedNotifications = mem(\n () => getAPIVersions()?.mastodon >= 2,\n {\n maxAge: 1000 * 60 * 5, // 5 minutes\n },\n);\n\nfunction mastoFetchNotificationsIterable(opts = {}) {\n const { masto } = api();\n if (\n states.settings.groupedNotificationsAlpha &&\n memSupportsGroupedNotifications()\n ) {\n // https://github.com/mastodon/mastodon/pull/29889\n return masto.v2.notifications.list({\n limit: NOTIFICATIONS_GROUPED_LIMIT,\n ...opts,\n });\n } else {\n return masto.v1.notifications.list({\n limit: NOTIFICATIONS_LIMIT,\n ...opts,\n });\n }\n}\nexport function mastoFetchNotifications(opts = {}) {\n return mastoFetchNotificationsIterable(opts).values();\n}\n\nexport function getGroupedNotifications(notifications) {\n if (\n states.settings.groupedNotificationsAlpha &&\n memSupportsGroupedNotifications()\n ) {\n return groupNotifications2(notifications);\n } else {\n return groupNotifications(notifications);\n }\n}\n\nconst NOTIFICATIONS_POLICIES = [\n 'forNotFollowing',\n 'forNotFollowers',\n 'forNewAccounts',\n 'forPrivateMentions',\n 'forLimitedAccounts',\n];\nconst NOTIFICATIONS_POLICIES_TEXT = {\n forNotFollowing: msg`You don't follow`,\n forNotFollowers: msg`Who don't follow you`,\n forNewAccounts: msg`With a new account`,\n forPrivateMentions: msg`Who unsolicitedly private mention you`,\n forLimitedAccounts: msg`Who are limited by server moderators`,\n};\n\nfunction Notifications({ columnMode }) {\n const { _, t } = useLingui();\n useTitle(t`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 notificationsIterable = useRef();\n const notificationsIterator = useRef();\n async function fetchNotifications(firstLoad) {\n if (firstLoad || !notificationsIterator.current) {\n // Reset iterator\n notificationsIterable.current = mastoFetchNotificationsIterable({\n excludeTypes: ['follow_request'],\n });\n notificationsIterator.current = notificationsIterable.current.values();\n }\n if (/max_id=($|&)/i.test(notificationsIterator.current?.nextParams)) {\n // Pixelfed returns next paginationed link with empty max_id\n // I assume, it's done (end of list)\n return {\n done: true,\n };\n }\n const allNotifications = await notificationsIterator.current.next();\n const notifications = massageNotifications2(allNotifications.value);\n\n if (notifications?.length) {\n notifications.forEach((notification) => {\n saveStatus(notification.status, instance, {\n skipThreading: true,\n });\n });\n\n // TEST: Slot in a fake notification to test 'severed_relationships'\n // notifications.unshift({\n // id: '123123',\n // type: 'severed_relationships',\n // createdAt: '2024-03-22T19:20:08.316Z',\n // event: {\n // type: 'account_suspension',\n // targetName: 'mastodon.dev',\n // followersCount: 0,\n // followingCount: 0,\n // },\n // });\n\n // TEST: Slot in a fake notification to test 'moderation_warning'\n // notifications.unshift({\n // id: '123123',\n // type: 'moderation_warning',\n // createdAt: new Date().toISOString(),\n // moderation_warning: {\n // id: '1231234',\n // action: 'mark_statuses_as_sensitive',\n // },\n // });\n\n // console.log({ notifications });\n\n const groupedNotifications = getGroupedNotifications(notifications);\n\n if (firstLoad) {\n states.notificationsLast = groupedNotifications[0];\n states.notifications = groupedNotifications;\n\n // Update last read marker\n masto.v1.markers\n .create({\n notifications: {\n lastReadId: groupedNotifications[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 supportsFilteredNotifications = supports(\n '@mastodon/filtered-notifications',\n );\n const [showNotificationsSettings, setShowNotificationsSettings] =\n useState(false);\n const [notificationsPolicy, setNotificationsPolicy] = useState({});\n function fetchNotificationsPolicy() {\n return masto.v2.notifications.policy.fetch().catch(() => {});\n }\n function loadNotificationsPolicy() {\n fetchNotificationsPolicy()\n .then((policy) => {\n console.log('✨ Notifications policy', policy);\n setNotificationsPolicy(policy);\n })\n .catch(() => {});\n }\n const [notificationsRequests, setNotificationsRequests] = useState(null);\n function fetchNotificationsRequest() {\n return masto.v1.notifications.requests.list();\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 if (supportsFilteredNotifications) {\n loadNotificationsPolicy();\n }\n }\n\n const { done } = await fetchNotificationsPromise;\n setShowMore(!done);\n\n setUIState('default');\n } catch (e) {\n console.error(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 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 }\n });\n const firstLoad = useRef(true);\n useEffect(() => {\n let unsub = subscribeKey(states, 'notificationsShowNew', (v) => {\n if (firstLoad.current) {\n firstLoad.current = false;\n return;\n }\n if (uiState === 'loading') return;\n if (v) loadUpdates();\n setShowNew(v);\n });\n return () => unsub?.();\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 const [annualReportNotification, setAnnualReportNotification] =\n useState(null);\n useEffect(async () => {\n // Skip this if not in December\n const date = new Date();\n if (date.getMonth() !== 11) return;\n\n // Skip if doesn't support annual report\n if (!supports('@mastodon/annual-report')) return;\n\n let annualReportNotification = store.account.get(\n 'annualReportNotification',\n );\n if (annualReportNotification) {\n setAnnualReportNotification(annualReportNotification);\n return;\n }\n const notificationIterator = mastoFetchNotifications({\n types: ['annual_report'],\n });\n try {\n const notification = await notificationIterator.next();\n annualReportNotification = notification?.value?.notificationGroups?.[0];\n const annualReportYear = annualReportNotification?.annualReport?.year;\n // If same year, show the annual report\n if (annualReportYear == date.getFullYear()) {\n console.log(\n 'ANNUAL REPORT',\n annualReportYear,\n annualReportNotification,\n );\n setAnnualReportNotification(annualReportNotification);\n store.account.set('annualReportNotification', annualReportNotification);\n }\n } catch (e) {\n console.warn(e);\n }\n }, []);\n\n const itemsSelector = '.notification';\n const jRef = useHotkeys(\n 'j',\n () => {\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 (nextItem) {\n nextItem.focus();\n nextItem.scrollIntoView(scrollIntoViewOptions);\n }\n } else {\n const topmostItem = allItems.find((item) => {\n const itemRect = item.getBoundingClientRect();\n return itemRect.top >= 44 && itemRect.left >= 0;\n });\n if (topmostItem) {\n topmostItem.focus();\n topmostItem.scrollIntoView(scrollIntoViewOptions);\n }\n }\n },\n {\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n },\n );\n\n const kRef = useHotkeys(\n 'k',\n () => {\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 (prevItem) {\n prevItem.focus();\n prevItem.scrollIntoView(scrollIntoViewOptions);\n }\n } else {\n const topmostItem = allItems.find((item) => {\n const itemRect = item.getBoundingClientRect();\n return itemRect.top >= 44 && itemRect.left >= 0;\n });\n if (topmostItem) {\n topmostItem.focus();\n topmostItem.scrollIntoView(scrollIntoViewOptions);\n }\n }\n },\n {\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n },\n );\n\n const oRef = useHotkeys(\n ['enter', 'o'],\n () => {\n const activeItem = document.activeElement.closest(itemsSelector);\n const statusLink = activeItem?.querySelector('.status-link');\n if (statusLink) {\n statusLink.click();\n }\n },\n {\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n },\n );\n\n const today = new Date();\n const todaySubHeading = useMemo(() => {\n return niceDateTime(today, {\n forceOpts: {\n weekday: 'long',\n },\n });\n }, [today]);\n\n return (\n <div\n id=\"notifications-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 ${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 onDblClick={(e) => {\n if (!e.target.closest('a, button')) {\n loadNotifications(true);\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={t`Home`} />\n </Link>\n </div>\n <h1>\n <Trans>Notifications</Trans>\n </h1>\n <div class=\"header-side\">\n {supportsFilteredNotifications && (\n <button\n type=\"button\"\n class=\"button plain4\"\n onClick={() => {\n setShowNotificationsSettings(true);\n }}\n >\n <Icon\n icon=\"settings\"\n size=\"l\"\n alt={t`Notifications settings`}\n />\n </button>\n )}\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\" /> <Trans>New notifications</Trans>\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 <Plural\n value={announcements.length}\n one=\"Announcement\"\n other=\"Announcements\"\n />{' '}\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\">\n <Trans>Follow requests</Trans>\n </h2>\n {followRequests.length > 5 ? (\n <details>\n <summary>\n <Plural\n value={followRequests.length}\n one=\"# follow request\"\n other=\"# follow requests\"\n />\n </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 {supportsFilteredNotifications &&\n notificationsPolicy?.summary?.pendingRequestsCount > 0 && (\n <div class=\"shazam-container\">\n <div class=\"shazam-container-inner\">\n <div class=\"filtered-notifications\">\n <details\n onToggle={async (e) => {\n const { open } = e.target;\n if (open) {\n const requests = await fetchNotificationsRequest();\n setNotificationsRequests(requests);\n console.log({ open, requests });\n }\n }}\n >\n <summary>\n <Plural\n value={notificationsPolicy.summary.pendingRequestsCount}\n one=\"Filtered notifications from # person\"\n other=\"Filtered notifications from # people\"\n />\n </summary>\n {!notificationsRequests ? (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n ) : (\n notificationsRequests?.length > 0 && (\n <ul>\n {notificationsRequests.map((request) => (\n <li key={request.id}>\n <div class=\"request-notifcations\">\n {!request.lastStatus?.id && (\n <AccountBlock\n useAvatarStatic\n showStats\n account={request.account}\n />\n )}\n {request.lastStatus?.id && (\n <div class=\"last-post\">\n <Link\n class=\"status-link\"\n to={`/${instance}/s/${request.lastStatus.id}`}\n >\n <Status\n status={request.lastStatus}\n size=\"s\"\n readOnly\n />\n </Link>\n </div>\n )}\n <NotificationRequestModalButton\n request={request}\n />\n </div>\n <NotificationRequestButtons\n request={request}\n onChange={() => {\n loadNotifications(true);\n }}\n />\n </li>\n ))}\n </ul>\n )\n )}\n </details>\n </div>\n </div>\n </div>\n )}\n {annualReportNotification && (\n <div class=\"shazam-container\">\n <div class=\"shazam-container-inner\">\n <Notification notification={annualReportNotification} />\n </div>\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 <Trans>Only mentions</Trans>\n </label>\n </div>\n <h2 class=\"timeline-header\">\n <Trans>Today</Trans>{' '}\n <small class=\"insignificant bidi-isolate\">{todaySubHeading}</small>\n </h2>\n {showTodayEmpty && (\n <p class=\"ui-state insignificant\">\n {uiState === 'default' ? t`You're all caught up.` : <>…</>}\n </p>\n )}\n {snapStates.notifications.length ? (\n <FilterContext.Provider value=\"notifications\">\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 ? t`Yesterday`\n : niceDateTime(currentDay, {\n hideTime: true,\n });\n const subHeading = niceDateTime(currentDay, {\n forceOpts: {\n weekday: 'long',\n },\n });\n return (\n <Fragment key={notification._ids || notification.id}>\n {differentDay && (\n <h2 class=\"timeline-header\">\n <span>{heading}</span>{' '}\n <small class=\"insignificant bidi-isolate\">\n {subHeading}\n </small>\n </h2>\n )}\n <Notification\n instance={instance}\n notification={notification}\n key={notification._ids || notification.id}\n />\n </Fragment>\n );\n })}\n </FilterContext.Provider>\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 <Trans>Unable to load notifications</Trans>\n <br />\n <br />\n <button type=\"button\" onClick={() => loadNotifications(true)}>\n <Trans>Try again</Trans>\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 <Trans>Show more…</Trans>\n )}\n </button>\n </InView>\n )}\n </div>\n {supportsFilteredNotifications && showNotificationsSettings && (\n <Modal\n onClick={(e) => {\n if (e.target === e.currentTarget) {\n setShowNotificationsSettings(false);\n }\n }}\n >\n <div class=\"sheet\" id=\"notifications-settings\" tabIndex=\"-1\">\n <button\n type=\"button\"\n class=\"sheet-close\"\n onClick={() => setShowNotificationsSettings(false)}\n >\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n <header>\n <h2>\n <Trans>Notifications settings</Trans>\n </h2>\n </header>\n <main>\n <form\n onSubmit={(e) => {\n e.preventDefault();\n const {\n forNotFollowing,\n forNotFollowers,\n forNewAccounts,\n forPrivateMentions,\n forLimitedAccounts,\n } = e.target;\n const newPolicy = {\n ...notificationsPolicy,\n forNotFollowing: forNotFollowing.value,\n forNotFollowers: forNotFollowers.value,\n forNewAccounts: forNewAccounts.value,\n forPrivateMentions: forPrivateMentions.value,\n forLimitedAccounts: forLimitedAccounts.value,\n };\n setNotificationsPolicy(newPolicy);\n setShowNotificationsSettings(false);\n (async () => {\n try {\n await masto.v2.notifications.policy.update(newPolicy);\n showToast(t`Notifications settings updated`);\n } catch (e) {\n console.error(e);\n }\n })();\n }}\n >\n <p>\n <Trans>Filter out notifications from people:</Trans>\n </p>\n <div class=\"notification-policy-fields\">\n {NOTIFICATIONS_POLICIES.map((key) => {\n const value = notificationsPolicy[key];\n return (\n <div key={key}>\n <label>\n {_(NOTIFICATIONS_POLICIES_TEXT[key])}\n <select name={key} defaultValue={value} class=\"small\">\n <option value=\"accept\">\n <Trans>Accept</Trans>\n </option>\n <option value=\"filter\">\n <Trans>Filter</Trans>\n </option>\n <option value=\"drop\">\n <Trans>Ignore</Trans>\n </option>\n </select>\n </label>\n </div>\n );\n })}\n </div>\n <p>\n <button type=\"submit\">\n <Trans>Save</Trans>\n </button>\n </p>\n </form>\n </main>\n </div>\n </Modal>\n )}\n </div>\n );\n}\n\nfunction inBackground() {\n return !!document.querySelector('.deck-backdrop, #modal-container > *');\n}\n\nfunction AnnouncementBlock({ announcement }) {\n const { instance } = api();\n const { contact } = getCurrentInstance();\n const contactAccount = contact?.account;\n const {\n id,\n content,\n startsAt,\n endsAt,\n published,\n allDay,\n publishedAt,\n updatedAt,\n read,\n mentions,\n statuses,\n tags,\n emojis,\n reactions,\n } = announcement;\n\n const publishedAtDate = new Date(publishedAt);\n const publishedDateText = niceDateTime(publishedAtDate);\n const updatedAtDate = new Date(updatedAt);\n const updatedAtText = niceDateTime(updatedAtDate);\n\n return (\n <div class=\"announcement-block\">\n <AccountBlock account={contactAccount} />\n <div\n class=\"announcement-content\"\n onClick={handleContentLinks({ mentions, instance })}\n dangerouslySetInnerHTML={{\n __html: enhanceContent(content, {\n emojis,\n }),\n }}\n />\n <p class=\"insignificant\">\n <time datetime={publishedAtDate.toISOString()}>\n {niceDateTime(publishedAtDate)}\n </time>\n {updatedAt && updatedAtText !== publishedDateText && (\n <>\n {' '}\n •{' '}\n <span class=\"ib\">\n <Trans>\n Updated{' '}\n <time datetime={updatedAtDate.toISOString()}>\n {niceDateTime(updatedAtDate)}\n </time>\n </Trans>\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\nfunction fetchNotficationsByAccount(accountID) {\n const { masto } = api();\n return masto.v1.notifications.list({\n accountID,\n });\n}\nfunction NotificationRequestModalButton({ request }) {\n const { instance } = api();\n const [uiState, setUIState] = useState('loading');\n const { account, lastStatus } = request;\n const [showModal, setShowModal] = useState(false);\n const [notifications, setNotifications] = useState([]);\n\n function onClose() {\n setShowModal(false);\n }\n\n useEffect(() => {\n if (!request?.account?.id) return;\n if (!showModal) return;\n setUIState('loading');\n (async () => {\n const notifs = await fetchNotficationsByAccount(request.account.id);\n setNotifications(notifs || []);\n setUIState('default');\n })();\n }, [showModal, request?.account?.id]);\n\n return (\n <>\n <button\n type=\"button\"\n class=\"plain4 request-notifications-account\"\n onClick={() => {\n setShowModal(true);\n }}\n >\n <Icon icon=\"notification\" class=\"more-insignificant\" />{' '}\n <small>\n <Trans>\n View notifications from{' '}\n <span class=\"bidi-isolate\">@{account.username}</span>\n </Trans>\n </small>{' '}\n <Icon icon=\"chevron-down\" />\n </button>\n {showModal && (\n <Modal\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\" alt={t`Close`} />\n </button>\n <header>\n <b>\n <Trans>\n Notifications from{' '}\n <span class=\"bidi-isolate\">@{account.username}</span>\n </Trans>\n </b>\n </header>\n <main>\n {uiState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n ) : (\n notifications.map((notification) => (\n <div\n class=\"notification-peek\"\n onClick={(e) => {\n const { target } = e;\n // If button or links\n if (\n e.target.tagName === 'BUTTON' ||\n e.target.tagName === 'A'\n ) {\n onClose();\n }\n }}\n >\n <Notification\n instance={instance}\n notification={notification}\n isStatic\n />\n </div>\n ))\n )}\n </main>\n </div>\n </Modal>\n )}\n </>\n );\n}\n\nfunction NotificationRequestButtons({ request, onChange }) {\n const { t } = useLingui();\n const { masto } = api();\n const [uiState, setUIState] = useState('default');\n const [requestState, setRequestState] = useState(null); // accept, dismiss\n const hasRequestState = requestState !== null;\n\n return (\n <p class=\"notification-request-buttons\">\n <button\n type=\"button\"\n disabled={uiState === 'loading' || hasRequestState}\n onClick={() => {\n setUIState('loading');\n (async () => {\n try {\n await masto.v1.notifications.requests\n .$select(request.id)\n .accept();\n setRequestState('accept');\n setUIState('default');\n onChange({\n request,\n state: 'accept',\n });\n showToast(\n t`Notifications from @${request.account.username} will not be filtered from now on.`,\n );\n } catch (error) {\n setUIState('error');\n console.error(error);\n showToast(t`Unable to accept notification request`);\n }\n })();\n }}\n >\n <Trans>Allow</Trans>\n </button>{' '}\n <button\n type=\"button\"\n disabled={uiState === 'loading' || hasRequestState}\n class=\"light danger\"\n onClick={() => {\n setUIState('loading');\n (async () => {\n try {\n await masto.v1.notifications.requests\n .$select(request.id)\n .dismiss();\n setRequestState('dismiss');\n setUIState('default');\n onChange({\n request,\n state: 'dismiss',\n });\n showToast(\n t`Notifications from @${request.account.username} will not show up in Filtered notifications from now on.`,\n );\n } catch (error) {\n setUIState('error');\n console.error(error);\n showToast(t`Unable to dismiss notification request`);\n }\n })();\n }}\n >\n <Trans>Dismiss</Trans>\n </button>\n <span class=\"notification-request-states\">\n {uiState === 'loading' ? (\n <Loader abrupt />\n ) : requestState === 'accept' ? (\n <Icon\n icon=\"check-circle\"\n alt={t`Accepted`}\n class=\"notification-accepted\"\n />\n ) : (\n requestState === 'dismiss' && (\n <Icon\n icon=\"x-circle\"\n alt={t`Dismissed`}\n class=\"notification-dismissed\"\n />\n )\n )}\n </span>\n </p>\n );\n}\n\nexport default memo(Notifications);\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { 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, { saveStatus } from '../utils/states';\nimport supports from '../utils/supports';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 20;\n\nfunction Public({ local, columnMode, ...props }) {\n const { t } = useLingui();\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\n ? t`Local timeline (${instance})`\n : t`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 const opts = {\n limit: LIMIT,\n local: isLocal || undefined,\n };\n if (!isLocal && supports('@pixelfed/global-feed')) {\n opts.remote = true;\n }\n publicIterator.current = masto.v1.timelines.public.list(opts).values();\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 .values()\n .next();\n let { value } = results;\n const valueContainsLatestItem = value[0]?.id === latestItem.current; // since_id might not be supported\n if (value?.length && !valueContainsLatestItem) {\n value = filteredItems(value, 'public');\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 ? t`Local timeline` : t`Federated timeline`}</b>\n <div>{instance}</div>\n </h1>\n }\n id=\"public\"\n instance={instance}\n emptyText={t`No one has posted anything yet.`}\n errorText={t`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\" alt={t`More`} />\n </button>\n }\n >\n <MenuItem href={isLocal ? `/#/${instance}/p` : `/#/${instance}/p/l`}>\n {isLocal ? (\n <>\n <Icon icon=\"transfer\" />{' '}\n <span>\n <Trans>Switch to Federated</Trans>\n </span>\n </>\n ) : (\n <>\n <Icon icon=\"transfer\" />{' '}\n <span>\n <Trans>Switch to Local</Trans>\n </span>\n </>\n )}\n </MenuItem>\n <MenuDivider />\n <MenuItem\n onClick={() => {\n let newInstance = prompt(\n t`Enter a new instance e.g. \"mastodon.social\"`,\n );\n if (!/\\./.test(newInstance)) {\n if (newInstance) alert(t`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\" />{' '}\n <span>\n <Trans>Go to another instance…</Trans>\n </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 <Trans>\n Go to my instance (<b>{currentInstance}</b>)\n </Trans>\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 { Trans, useLingui } from '@lingui/react/macro';\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\nconst scrollIntoViewOptions = {\n block: 'nearest',\n inline: 'center',\n behavior: 'smooth',\n};\n\nfunction Search({ columnMode, ...props }) {\n const { t } = useLingui();\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 let title = t`Search`;\n if (q) {\n switch (type) {\n case 'statuses':\n title = t`Search: ${q} (Posts)`;\n break;\n case 'accounts':\n title = t`Search: ${q} (Accounts)`;\n break;\n case 'hashtags':\n title = t`Search: ${q} (Hashtags)`;\n break;\n default:\n title = t`Search: ${q}`;\n }\n }\n useTitle(title, `/search`);\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 typeResults = {\n statuses: statusResults,\n accounts: accountResults,\n hashtags: hashtagResults,\n };\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.list(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 // If first item is the same, it means API doesn't support offset\n // I know this is a very basic check, but it works for now\n if (results[type]?.[0]?.id === typeResults[type]?.[0]?.id) {\n setShowMore(false);\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 }\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 let timer;\n searchFormRef.current?.setValue?.(q || '');\n if (q) {\n loadResults(true);\n } else {\n timer = setTimeout(() => {\n searchFormRef.current?.focus?.();\n }, 150); // Right after focusDeck runs\n }\n return () => clearTimeout(timer);\n }, [q, type, instance]);\n\n useHotkeys(\n ['Slash', '/'],\n (e) => {\n searchFormRef.current?.focus?.();\n searchFormRef.current?.select?.();\n },\n {\n useKey: true,\n preventDefault: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n },\n );\n\n const itemsSelector = '.timeline > li > a, .hashtag-list > li > a';\n const jRef = useHotkeys(\n 'j',\n () => {\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 (nextItem) {\n nextItem.focus();\n nextItem.scrollIntoView(scrollIntoViewOptions);\n }\n } else {\n const topmostItem = allItems.find((item) => {\n const itemRect = item.getBoundingClientRect();\n return itemRect.top >= 44 && itemRect.left >= 0;\n });\n if (topmostItem) {\n topmostItem.focus();\n topmostItem.scrollIntoView(scrollIntoViewOptions);\n }\n }\n },\n {\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n },\n );\n\n const kRef = useHotkeys(\n 'k',\n () => {\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 (prevItem) {\n prevItem.focus();\n prevItem.scrollIntoView(scrollIntoViewOptions);\n }\n } else {\n const topmostItem = allItems.find((item) => {\n const itemRect = item.getBoundingClientRect();\n return itemRect.top >= 44 && itemRect.left >= 0;\n });\n if (topmostItem) {\n topmostItem.focus();\n topmostItem.scrollIntoView(scrollIntoViewOptions);\n }\n }\n },\n {\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n },\n );\n\n const [filterBarParent] = useAutoAnimate();\n\n return (\n <div\n id=\"search-page\"\n class=\"deck-container\"\n tabIndex=\"-1\"\n ref={(node) => {\n scrollableRef.current = node;\n jRef.current = node;\n kRef.current = node;\n }}\n >\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\" alt={t`Search`} />\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 <Icon icon=\"chevron-left\" /> <Trans>All</Trans>\n </Link>\n )}\n {[\n {\n label: t`Accounts`,\n type: 'accounts',\n to: `/search?q=${encodeURIComponent(q)}&type=accounts`,\n },\n {\n label: t`Hashtags`,\n type: 'hashtags',\n to: `/search?q=${encodeURIComponent(q)}&type=hashtags`,\n },\n {\n label: t`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\">\n <Trans>Accounts</Trans>{' '}\n <Link\n to={`/search?q=${encodeURIComponent(q)}&type=accounts`}\n >\n <Icon icon=\"arrow-right\" size=\"l\" alt={t`See more`} />\n </Link>\n </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=${encodeURIComponent(\n q,\n )}&type=accounts`}\n >\n <Trans>See more accounts</Trans>{' '}\n <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\">\n <Trans>No accounts found.</Trans>\n </p>\n ))\n )}\n </>\n )}\n {(!type || type === 'hashtags') && (\n <>\n {type !== 'hashtags' && (\n <h2 class=\"timeline-header\">\n <Trans>Hashtags</Trans>{' '}\n <Link\n to={`/search?q=${encodeURIComponent(q)}&type=hashtags`}\n >\n <Icon icon=\"arrow-right\" size=\"l\" alt={t`See more`} />\n </Link>\n </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\" alt=\"#\" />\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=${encodeURIComponent(\n q,\n )}&type=hashtags`}\n >\n <Trans>See more hashtags</Trans>{' '}\n <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\">\n <Trans>No hashtags found.</Trans>\n </p>\n ))\n )}\n </>\n )}\n {(!type || type === 'statuses') && (\n <>\n {type !== 'statuses' && (\n <h2 class=\"timeline-header\">\n <Trans>Posts</Trans>{' '}\n <Link\n to={`/search?q=${encodeURIComponent(q)}&type=statuses`}\n >\n <Icon icon=\"arrow-right\" size=\"l\" alt={t`See more`} />\n </Link>\n </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=${encodeURIComponent(\n q,\n )}&type=statuses`}\n >\n <Trans>See more posts</Trans>{' '}\n <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\">\n <Trans>No posts found.</Trans>\n </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 <Trans>Show more…</Trans>\n </button>\n </InView>\n ) : (\n <p class=\"ui-state insignificant\">\n <Trans>The end.</Trans>\n </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 <Trans>\n Enter your search term or paste a URL above to get started.\n </Trans>\n </p>\n )}\n </main>\n </div>\n </div>\n );\n}\n\nexport default Search;\n","import '../components/links-bar.css';\nimport './trending.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { MenuItem } from '@szhsin/react-menu';\nimport { getBlurHashAverageColor } from 'fast-blurhash';\nimport { useEffect, useMemo, useRef, useState } from 'preact/hooks';\nimport punycode from 'punycode/';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { useSnapshot } from 'valtio';\n\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport Menu2 from '../components/menu2';\nimport NameText from '../components/name-text';\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 getDomain from '../utils/get-domain';\nimport pmem from '../utils/pmem';\nimport shortenNumber from '../utils/shorten-number';\nimport states, { saveStatus } from '../utils/states';\nimport supports from '../utils/supports';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 20;\nconst TREND_CACHE_TIME = 10 * 60 * 1000; // 10 minutes\n\nconst fetchLinks = pmem(\n (masto) => {\n return masto.v1.trends.links.list().values().next();\n },\n {\n maxAge: TREND_CACHE_TIME,\n },\n);\n\nconst fetchHashtags = pmem(\n (masto) => {\n return masto.v1.trends.tags.list().values().next();\n },\n {\n maxAge: TREND_CACHE_TIME,\n },\n);\n\nfunction fetchTrendsStatuses(masto) {\n if (supports('@pixelfed/trending')) {\n return masto.pixelfed.v2.discover.posts.trending\n .list({\n range: 'daily',\n })\n .values();\n }\n return masto.v1.trends.statuses\n .list({\n limit: LIMIT,\n })\n .values();\n}\n\nfunction fetchLinkList(masto, params) {\n return masto.v1.timelines.link.list(params).values();\n}\n\nfunction Trending({ columnMode, ...props }) {\n const { t } = useLingui();\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 = t`Trending (${instance})`;\n useTitle(title, `/:instance?/trending`);\n // const navigate = useNavigate();\n const latestItem = useRef();\n\n const sameCurrentInstance = instance === currentInstance;\n\n const [hashtags, setHashtags] = useState([]);\n const [links, setLinks] = useState([]);\n const trendIterator = useRef();\n\n async function fetchTrends(firstLoad) {\n console.log('fetchTrend', firstLoad);\n if (firstLoad || !trendIterator.current) {\n trendIterator.current = fetchTrendsStatuses(masto);\n\n // Get hashtags\n if (supports('@mastodon/trending-hashtags')) {\n try {\n // const iterator = masto.v1.trends.tags.list();\n const { value: tags } = await fetchHashtags(masto);\n console.log('tags', tags);\n if (tags?.length) {\n setHashtags(tags);\n }\n } catch (e) {\n console.error(e);\n }\n }\n\n // Get links\n if (supports('@mastodon/trending-links')) {\n try {\n const { value } = await fetchLinks(masto, instance);\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 }\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 // Link mentions\n // https://github.com/mastodon/mastodon/pull/30381\n const [currentLinkMentionsLoading, setCurrentLinkMentionsLoading] =\n useState(false);\n const currentLinkMentionsIterator = useRef();\n const [currentLink, setCurrentLink] = useState(null);\n const hasCurrentLink = !!currentLink;\n const currentLinkRef = useRef();\n const supportsTrendingLinkPosts =\n sameCurrentInstance && supports('@mastodon/trending-link-posts');\n\n useEffect(() => {\n if (currentLink && currentLinkRef.current) {\n currentLinkRef.current.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'center',\n });\n }\n }, [currentLink]);\n\n const prevCurrentLink = useRef();\n async function fetchLinkMentions(firstLoad) {\n if (firstLoad || !currentLinkMentionsIterator.current) {\n setCurrentLinkMentionsLoading(true);\n currentLinkMentionsIterator.current = fetchLinkList(masto, {\n url: currentLink,\n });\n }\n prevCurrentLink.current = currentLink;\n const results = await currentLinkMentionsIterator.current.next();\n let { value } = results;\n if (value?.length) {\n value = filteredItems(value, 'public');\n value.forEach((item) => {\n saveStatus(item, instance);\n });\n }\n if (prevCurrentLink.current === currentLink) {\n setCurrentLinkMentionsLoading(false);\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 .values()\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 dir=\"auto\">\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>\n <Trans>Trending News</Trans>\n </h3>\n </header>\n {links.map((link) => {\n const {\n authors,\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 author = authors?.[0]?.account?.id\n ? authors[0].account\n : null;\n const isShortTitle = title.length < 30;\n const hasAuthor = !!(authorName || author);\n const domain = getDomain(url);\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 <div key={url}>\n <a\n ref={currentLink === url ? currentLinkRef : null}\n href={url}\n target=\"_blank\"\n rel=\"noopener\"\n class={`link-block ${\n hasCurrentLink\n ? currentLink === url\n ? 'active'\n : 'inactive'\n : ''\n }`}\n style={\n accentColor\n ? {\n '--accent-color': `rgb(${accentColor.join(',')})`,\n '--accent-alpha-color': `rgba(${accentColor.join(\n ',',\n )}, 0.4)`,\n }\n : {}\n }\n >\n <article>\n <figure>\n <img\n src={image}\n alt={imageDescription}\n width={width}\n height={height}\n loading=\"lazy\"\n />\n </figure>\n <div class=\"article-body\">\n <header>\n <div class=\"article-meta\">\n <span class=\"domain\">{domain}</span>{' '}\n {!!publishedAt && <>· </>}\n {!!publishedAt && (\n <>\n <RelativeTime\n datetime={publishedAt}\n format=\"micro\"\n />\n </>\n )}\n </div>\n {!!title && (\n <h1\n class=\"title\"\n lang={language}\n dir=\"auto\"\n title={title}\n >\n {title}\n </h1>\n )}\n </header>\n {!!description && (\n <p\n class={`description ${\n hasAuthor && !isShortTitle ? '' : 'more-lines'\n }`}\n lang={language}\n dir=\"auto\"\n title={description}\n >\n {description}\n </p>\n )}\n {hasAuthor && (\n <>\n <hr />\n <p class=\"byline\">\n <small>\n <Trans comment=\"By [Author]\">\n By{' '}\n {author ? (\n <NameText account={author} showAvatar />\n ) : authorUrl ? (\n <a\n href={authorUrl}\n target=\"_blank\"\n rel=\"noopener\"\n >\n {authorName}\n </a>\n ) : (\n authorName\n )}\n </Trans>\n </small>\n </p>\n </>\n )}\n </div>\n </article>\n </a>\n {supportsTrendingLinkPosts && (\n <button\n type=\"button\"\n class=\"small plain4 block\"\n onClick={() => {\n setCurrentLink(url);\n }}\n disabled={url === currentLink}\n >\n <Icon icon=\"comment2\" />{' '}\n <span>\n <Trans>Mentions</Trans>\n </span>{' '}\n <Icon icon=\"chevron-down\" />\n </button>\n )}\n </div>\n );\n })}\n </div>\n )}\n {supportsTrendingLinkPosts && !!links.length && (\n <div\n class={`timeline-header-block ${hasCurrentLink ? 'blended' : ''}`}\n >\n {hasCurrentLink ? (\n <>\n <div style={{ width: 50, flexShrink: 0, textAlign: 'center' }}>\n {currentLinkMentionsLoading ? (\n <Loader abrupt />\n ) : (\n <button\n type=\"button\"\n class=\"light\"\n onClick={() => {\n setCurrentLink(null);\n }}\n >\n <Icon icon=\"x\" alt={t`Back to showing trending posts`} />\n </button>\n )}\n </div>\n <p>\n <Trans>\n Showing posts mentioning{' '}\n <span class=\"link-text\">\n {currentLink\n .replace(/^https?:\\/\\/(www\\.)?/i, '')\n .replace(/\\/$/, '')}\n </span>\n </Trans>\n </p>\n </>\n ) : (\n <p class=\"insignificant\">\n <Trans>Trending posts</Trans>\n </p>\n )}\n </div>\n )}\n </>\n );\n }, [hashtags, links, currentLink, currentLinkMentionsLoading]);\n\n return (\n <Timeline\n key={instance}\n title={title}\n titleComponent={\n <h1 class=\"header-double-lines\">\n <b>\n <Trans>Trending</Trans>\n </b>\n <div>{instance}</div>\n </h1>\n }\n id=\"trending\"\n instance={instance}\n emptyText={t`No trending posts.`}\n errorText={t`Unable to load posts`}\n fetchItems={hasCurrentLink ? fetchLinkMentions : fetchTrends}\n checkForUpdates={hasCurrentLink ? undefined : 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 refresh={currentLink}\n clearWhenRefresh\n view={hasCurrentLink ? 'link-mentions' : undefined}\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\" alt={t`More`} />\n </button>\n }\n >\n <MenuItem\n onClick={() => {\n let newInstance = prompt(\n t`Enter a new instance e.g. \"mastodon.social\"`,\n );\n if (!/\\./.test(newInstance)) {\n if (newInstance) alert(t`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\" />{' '}\n <span>\n <Trans>Go to another instance…</Trans>\n </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 <Trans>\n Go to my instance (<b>{currentInstance}</b>)\n </Trans>\n </small>\n </MenuItem>\n )}\n </Menu2>\n }\n />\n );\n}\n\nexport default Trending;\n","import { useLingui } from '@lingui/react/macro';\nimport { 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 isRTL from '../utils/is-rtl';\nimport states from '../utils/states';\nimport useTitle from '../utils/useTitle';\n\nconst scrollIntoViewOptions = {\n block: 'nearest',\n inline: 'nearest',\n behavior: 'smooth',\n};\n\nfunction Columns() {\n const { t } = useLingui();\n useTitle(t`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 // Don't show List column with no list, for now\n if (type === 'list' && !params.id) return null;\n return (\n <Component key={type + JSON.stringify(params)} {...params} columnMode />\n );\n });\n\n useHotkeys(\n ['1', '2', '3', '4', '5', '6', '7', '8', '9'],\n (e) => {\n try {\n const index = parseInt(e.key, 10) - 1;\n const $column = document.querySelectorAll('#columns > *')[index];\n if ($column) {\n $column.focus();\n $column.scrollIntoView(scrollIntoViewOptions);\n }\n } catch (e) {\n console.error(e);\n }\n },\n {\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n },\n );\n\n useHotkeys(\n ['[', ']'],\n (e, handler) => {\n const key = handler.keys[0];\n const currentFocusedColumn =\n document.activeElement.closest('#columns > *');\n\n const rtl = isRTL();\n const prevColKey = rtl ? ']' : '[';\n const nextColKey = rtl ? '[' : ']';\n let $column;\n\n if (key === prevColKey) {\n // If [, focus on left of focused column, else first column\n $column = currentFocusedColumn\n ? currentFocusedColumn.previousElementSibling\n : document.querySelectorAll('#columns > *')[0];\n } else if (key === nextColKey) {\n // If ], focus on right of focused column, else 2nd column\n $column = currentFocusedColumn\n ? currentFocusedColumn.nextElementSibling\n : document.querySelectorAll('#columns > *')[1];\n }\n if ($column) {\n $column.focus();\n $column.scrollIntoView(scrollIntoViewOptions);\n }\n },\n {\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\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 onFocus={() => {\n // Get current focused column\n const currentFocusedColumn =\n document.activeElement.closest('#columns > *');\n if (currentFocusedColumn) {\n // Remove focus classes from all columns\n // Add focus class to current focused column\n document.querySelectorAll('#columns > *').forEach((column) => {\n column.classList.toggle('focus', column === currentFocusedColumn);\n });\n }\n }}\n >\n {components}\n </div>\n );\n}\n\nexport default Columns;\n","import './notifications-menu.css';\n\nimport { msg } from '@lingui/core/macro';\nimport { Trans, useLingui } from '@lingui/react/macro';\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 FilterContext from '../utils/filter-context';\nimport { massageNotifications2 } from '../utils/group-notifications';\nimport states, { saveStatus } from '../utils/states';\nimport { getCurrentAccountNS } from '../utils/store-utils';\n\nimport Following from './following';\nimport {\n getGroupedNotifications,\n mastoFetchNotifications,\n} from './notifications';\n\nfunction Home() {\n const { _ } = useLingui();\n const snapStates = useSnapshot(states);\n __BENCHMARK.end('time-to-home');\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={_(msg`Home`)}\n path=\"/\"\n id=\"home\"\n headerStart={false}\n headerEnd={<NotificationsLink />}\n />\n )}\n </>\n );\n}\n\nfunction NotificationsLink() {\n const { t } = useLingui();\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={t`Notifications`} />\n </Link>\n <NotificationsMenu\n state={menuState}\n anchorRef={notificationLinkRef}\n onClose={() => setMenuState(undefined)}\n />\n </>\n );\n}\n\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 = mastoFetchNotifications();\n\n async function fetchNotifications() {\n const allNotifications = await notificationsIterator.next();\n const notifications = massageNotifications2(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 = getGroupedNotifications(notifications);\n\n states.notificationsLast = groupedNotifications[0];\n states.notifications = groupedNotifications;\n\n // Update last read marker\n masto.v1.markers\n .create({\n notifications: {\n lastReadId: groupedNotifications[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({ skipFollowRequests = false } = {}) {\n setUIState('loading');\n (async () => {\n try {\n await fetchNotifications();\n if (!skipFollowRequests) {\n const followRequests = await fetchFollowRequests();\n setHasFollowRequests(!!followRequests?.length);\n }\n setUIState('default');\n } catch (e) {\n setUIState('error');\n }\n })();\n }\n\n const menuRef = useRef();\n const headerHeight = 52;\n useEffect(() => {\n if (state !== 'open') return;\n if (snapStates.notificationsShowNew) {\n const menuElement = menuRef.current;\n if (menuElement?.scrollTop <= headerHeight) {\n loadNotifications({\n skipFollowRequests: true,\n });\n }\n } else {\n loadNotifications();\n }\n }, [state, snapStates.notificationsShowNew]);\n\n return (\n <ControlledMenu\n ref={menuRef}\n menuClassName=\"notifications-menu\"\n state={state}\n anchorRef={anchorRef}\n onClose={onClose}\n portal={{\n target: document.body,\n }}\n containerProps={{\n onClick: () => {\n menuRef.current?.closeMenu?.();\n },\n }}\n overflow=\"auto\"\n viewScroll=\"close\"\n position=\"anchor\"\n align=\"center\"\n boundingBoxPadding=\"8 8 8 8\"\n >\n <header>\n <h2>\n <Trans>Notifications</Trans>\n </h2>\n </header>\n <FilterContext.Provider value=\"notifications\">\n <main>\n {snapStates.notifications.length ? (\n <>\n {snapStates.notifications\n .slice(0, NOTIFICATIONS_DISPLAY_LIMIT)\n .map((notification) => (\n <Notification\n key={notification._ids || 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>\n <Trans>Unable to fetch notifications.</Trans>\n </p>\n <p>\n <button type=\"button\" onClick={loadNotifications}>\n <Trans>Try again</Trans>\n </button>\n </p>\n </div>\n )\n )}\n </main>\n </FilterContext.Provider>\n <footer>\n <Link to=\"/mentions\" class=\"button plain\">\n <Icon icon=\"at\" />{' '}\n <span>\n <Trans>Mentions</Trans>\n </span>\n </Link>\n <Link to=\"/notifications\" class=\"button plain2\">\n {hasFollowRequests ? (\n <Trans>\n <span class=\"tag collapsed\">New</span>{' '}\n <span>Follow Requests</span>\n </Trans>\n ) : (\n <b>\n <Trans>See all</Trans>\n </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 /\\/@[^@\\/]+\\/post\\/([^\\/]+)/i, // Threads\n /\\/@[^@\\/]+@?[^\\/]+?\\/([^\\/]+)/i, // Mastodon\n /^\\/p\\/[^\\/]+\\/([^\\/]+)/i, // Pixelfed\n];\n\nexport function getInstanceStatusObject(url) {\n // Regex /:username/:id, where username = @username or @username@domain, id = anything\n const theURL = URL.parse(url);\n if (!theURL) return {};\n const { hostname, pathname } = theURL;\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 { Trans } from '@lingui/react/macro';\nimport { 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 if (id) {\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 }\n } catch (e) {}\n\n // Fallback to search\n {\n const { masto: currentMasto, instance: currentInstance } = api();\n const result = await currentMasto.v2.search.list({\n q: url,\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 if (result.accounts.length) {\n const account = result.accounts[0];\n window.location.hash = `/${currentInstance}/a/${account.id}`;\n } else if (statusURL) {\n // Fallback to original URL, which will probably show error\n window.location.hash = statusURL + '?view=full';\n } else {\n setUIState('error');\n }\n }\n })();\n }, [statusURL]);\n\n return (\n <div class=\"ui-state\" tabIndex=\"-1\">\n {uiState === 'loading' ? (\n <>\n <Loader abrupt />\n <h2>\n <Trans>Resolving…</Trans>\n </h2>\n <p>\n <a href={url} target=\"_blank\" rel=\"noopener\">\n {url}\n </a>\n </p>\n </>\n ) : (\n <>\n <h2>\n <Trans>Unable to resolve URL</Trans>\n </h2>\n <p>\n <a href={url} target=\"_blank\" rel=\"noopener\">\n {url}\n </a>\n </p>\n </>\n )}\n <hr />\n <p>\n <Link to=\"/\">\n <Trans>Go home</Trans>\n </Link>\n </p>\n </div>\n );\n}\n","import './lists.css';\n\nimport { Plural, Trans, useLingui } from '@lingui/react/macro';\nimport { useEffect, useReducer, useState } from 'preact/hooks';\n\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport ListAddEdit from '../components/list-add-edit';\nimport ListExclusiveBadge from '../components/list-exclusive-badge';\nimport Loader from '../components/loader';\nimport Modal from '../components/modal';\nimport NavMenu from '../components/nav-menu';\nimport { fetchLists } from '../utils/lists';\nimport useTitle from '../utils/useTitle';\n\nfunction Lists() {\n const { t } = useLingui();\n useTitle(t`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 fetchLists();\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 const hasExclusiveLists = lists.some((list) => list.exclusive);\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>\n <Trans>Lists</Trans>\n </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={t`New list`} />\n </button>\n </div>\n </div>\n </header>\n <main>\n {lists.length > 0 ? (\n <>\n <ul class=\"link-list\">\n {lists.map((list) => (\n <li>\n <Link to={`/l/${list.id}`}>\n <Icon icon=\"list\" />{' '}\n <span>\n {list.title}\n {list.exclusive && (\n <>\n {' '}\n <ListExclusiveBadge insignificant />\n </>\n )}\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 {lists.length > 1 && (\n <footer class=\"ui-state\">\n {hasExclusiveLists && (\n <p>\n <small class=\"insignificant\">\n <ListExclusiveBadge />{' '}\n <Trans>\n Posts on this list are hidden from Home/Following\n </Trans>\n </small>\n </p>\n )}\n <p>\n <small class=\"insignificant\">\n <Plural\n value={lists.length}\n one=\"# list\"\n other=\"# lists\"\n />\n </small>\n </p>\n </footer>\n )}\n </>\n ) : uiState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader />\n </p>\n ) : uiState === 'error' ? (\n <p class=\"ui-state\">\n <Trans>Unable to load lists.</Trans>\n </p>\n ) : (\n <p class=\"ui-state\">\n <Trans>No lists yet.</Trans>\n </p>\n )}\n </main>\n </div>\n {showListAddEditModal && (\n <Modal\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__Bj_CmqRM__\"","import './login.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport Fuse from 'fuse.js';\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport { useSearchParams } from 'react-router-dom';\n\nimport logo from '../assets/logo.svg';\n\nimport LangSelector from '../components/lang-selector';\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport instancesListURL from '../data/instances.json?url';\nimport {\n getAuthorizationURL,\n getPKCEAuthorizationURL,\n registerApplication,\n} from '../utils/auth';\nimport { supportsPKCE } from '../utils/oauth-pkce';\nimport store from '../utils/store';\nimport {\n getCredentialApplication,\n hasAccountInInstance,\n storeCredentialApplication,\n} from '../utils/store-utils';\nimport useTitle from '../utils/useTitle';\n\nconst { PHANPY_DEFAULT_INSTANCE: DEFAULT_INSTANCE } = import.meta.env;\n\nfunction Login() {\n const { t } = useLingui();\n useTitle(t`Log in`, '/login');\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 const searcher = useRef();\n useEffect(() => {\n (async () => {\n try {\n const res = await fetch(instancesListURL);\n const data = await res.json();\n setInstancesList(data);\n searcher.current = new Fuse(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\n (async () => {\n // WEB_DOMAIN vs LOCAL_DOMAIN negotiation time\n // https://docs.joinmastodon.org/admin/config/#web_domain\n try {\n const res = await fetch(`https://${instanceURL}/.well-known/host-meta`); // returns XML\n const text = await res.text();\n // Parse XML\n const parser = new DOMParser();\n const xmlDoc = parser.parseFromString(text, 'text/xml');\n // Get Link[template]\n const link = xmlDoc.getElementsByTagName('Link')[0];\n const template = link.getAttribute('template');\n const url = URL.parse(template);\n const { host } = url; // host includes the port\n if (instanceURL !== host) {\n console.log(`💫 ${instanceURL} -> ${host}`);\n instanceURL = host;\n }\n } catch (e) {\n // Silently fail\n console.error(e);\n }\n\n store.local.set('instanceURL', instanceURL);\n\n setUIState('loading');\n try {\n let credentialApplication = getCredentialApplication(instanceURL);\n if (\n !credentialApplication ||\n !credentialApplication.client_id ||\n !credentialApplication.client_secret\n ) {\n credentialApplication = await registerApplication({\n instanceURL,\n });\n storeCredentialApplication(instanceURL, credentialApplication);\n }\n\n const { client_id, client_secret } = credentialApplication;\n\n const authPKCE = await supportsPKCE({ instanceURL });\n console.log({ authPKCE });\n const forceLogin = hasAccountInInstance(instanceURL);\n if (authPKCE) {\n if (client_id && client_secret) {\n const [url, verifier] = await getPKCEAuthorizationURL({\n instanceURL,\n client_id,\n forceLogin,\n });\n store.sessionCookie.set('codeVerifier', verifier);\n location.href = url;\n } else {\n alert(t`Failed to register application`);\n }\n } else {\n if (client_id && client_secret) {\n location.href = await getAuthorizationURL({\n instanceURL,\n client_id,\n forceLogin,\n });\n } else {\n alert(t`Failed to register application`);\n }\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 ? searcher.current\n ?.search(cleanInstanceText, {\n limit: 10,\n })\n ?.map((match) => match.item)\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 <Trans>Log in</Trans>\n </h1>\n <label>\n <p>\n <Trans>Instance</Trans>\n </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={t`instance domain`}\n onInput={(e) => {\n setInstanceText(e.target.value);\n }}\n dir=\"auto\"\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\">\n <Trans>e.g. “mastodon.social”</Trans>\n </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 <Trans>\n Failed to log in. Please try again or try another instance.\n </Trans>\n </p>\n )}\n <div>\n <button\n disabled={\n uiState === 'loading' || !instanceText || !selectedInstanceText\n }\n >\n {selectedInstanceText\n ? t`Continue with ${selectedInstanceText}`\n : t`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 <Trans>Don't have an account? Create one!</Trans>\n </a>\n </p>\n )}\n <p>\n <Link to=\"/\">\n <Trans>Go home</Trans>\n </Link>\n </p>\n <LangSelector />\n </form>\n </main>\n );\n}\n\nexport default Login;\n","import './scheduled-posts.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { MenuItem } from '@szhsin/react-menu';\nimport { useEffect, useMemo, useReducer, useState } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport MenuConfirm from '../components/menu-confirm';\nimport Menu2 from '../components/menu2';\nimport Modal from '../components/modal';\nimport NavMenu from '../components/nav-menu';\nimport RelativeTime from '../components/relative-time';\nimport ScheduledAtField, {\n getLocalTimezoneName,\n} from '../components/ScheduledAtField';\nimport Status from '../components/status';\nimport { api } from '../utils/api';\nimport niceDateTime from '../utils/nice-date-time';\nimport showToast from '../utils/show-toast';\nimport states from '../utils/states';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 40;\n\nexport default function ScheduledPosts() {\n const { t } = useLingui();\n const snapStates = useSnapshot(states);\n useTitle(t`Scheduled Posts`, '/sp');\n const { masto } = api();\n const [scheduledPosts, setScheduledPosts] = useState([]);\n const [uiState, setUIState] = useState('default');\n const [reloadCount, reload] = useReducer((c) => c + 1, 0);\n const [showScheduledPostModal, setShowScheduledPostModal] = useState(false);\n\n useEffect(reload, [snapStates.reloadScheduledPosts]);\n\n useEffect(() => {\n setUIState('loading');\n (async () => {\n try {\n const postsIterator = masto.v1.scheduledStatuses\n .list({ limit: LIMIT })\n .values();\n const allPosts = [];\n let posts;\n do {\n const result = await postsIterator.next();\n posts = result.value;\n if (posts?.length) {\n allPosts.push(...posts);\n }\n } while (posts?.length);\n setScheduledPosts(allPosts);\n } catch (e) {\n console.error(e);\n setUIState('error');\n } finally {\n setUIState('default');\n }\n })();\n }, [reloadCount]);\n\n return (\n <div id=\"scheduled-posts-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\" alt={t`Home`} />\n </Link>\n </div>\n <h1>\n <Trans>Scheduled Posts</Trans>\n </h1>\n <div class=\"header-side\">\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\" alt={t`More`} />\n </button>\n }\n >\n <MenuItem\n onClick={() => {\n reload();\n }}\n >\n <Icon icon=\"refresh\" size=\"l\" />\n <span>\n <Trans>Refresh</Trans>\n </span>\n </MenuItem>\n </Menu2>\n </div>\n </div>\n </header>\n <main>\n {!scheduledPosts.length ? (\n <p class=\"ui-state\">\n {uiState === 'loading' ? <Loader /> : t`No scheduled posts.`}\n </p>\n ) : (\n <ul class=\"posts-list\">\n {scheduledPosts.map((post) => {\n const { id, params, scheduledAt, mediaAttachments } = post;\n const {\n inReplyToId,\n language,\n poll,\n sensitive,\n spoilerText,\n text,\n visibility,\n } = params;\n const status = {\n // account: account.info,\n id,\n inReplyToId,\n language,\n mediaAttachments,\n poll: poll\n ? {\n ...poll,\n expiresAt: new Date(Date.now() + poll.expiresIn * 1000),\n options: poll.options.map((option) => ({\n title: option,\n votesCount: 0,\n })),\n }\n : undefined,\n sensitive,\n spoilerText,\n text,\n visibility,\n content: `<p>${text}</p>`,\n // createdAt: scheduledAt,\n };\n\n return (\n <li key={id}>\n <ScheduledPostPreview\n status={status}\n scheduledAt={scheduledAt}\n onClick={() => {\n setShowScheduledPostModal({\n post: status,\n scheduledAt: new Date(scheduledAt),\n });\n }}\n />\n </li>\n );\n })}\n </ul>\n )}\n {showScheduledPostModal && (\n <Modal\n onClick={(e) => {\n if (e.target === e.currentTarget) {\n setShowScheduledPostModal(false);\n }\n }}\n >\n <ScheduledPostEdit\n post={showScheduledPostModal.post}\n scheduledAt={showScheduledPostModal.scheduledAt}\n onClose={() => setShowScheduledPostModal(false)}\n />\n </Modal>\n )}\n </main>\n </div>\n </div>\n );\n}\n\nfunction ScheduledPostPreview({ status, scheduledAt, onClick }) {\n // Look at scheduledAt, if it's months away, ICON = 'month'. If it's days away, ICON = 'day', else ICON = 'time'\n const icon = useMemo(() => {\n const hours =\n (new Date(scheduledAt).getTime() - Date.now()) / (1000 * 60 * 60);\n if (hours < 24) {\n return 'time';\n } else if (hours < 720) {\n // 30 days\n return 'day';\n } else {\n return 'month';\n }\n }, [scheduledAt]);\n\n return (\n <button type=\"button\" class=\"textual block\" onClick={onClick}>\n <div class={`post-schedule-meta post-schedule-${icon}`}>\n <Icon icon={icon} class=\"insignificant\" />{' '}\n <span>\n <Trans comment=\"Scheduled [in 1 day] ([Thu, Feb 27, 6:30:00 PM])\">\n Scheduled{' '}\n <b>\n <RelativeTime datetime={scheduledAt} />\n </b>{' '}\n <small>\n (\n {niceDateTime(scheduledAt, {\n formatOpts: {\n weekday: 'short',\n second: 'numeric',\n },\n })}\n )\n </small>\n </Trans>\n </span>\n </div>\n <Status status={status} size=\"s\" previewMode readOnly />\n </button>\n );\n}\n\nfunction ScheduledPostEdit({ post, scheduledAt, onClose }) {\n const { masto } = api();\n const { t } = useLingui();\n const [uiState, setUIState] = useState('default');\n const [newScheduledAt, setNewScheduledAt] = useState();\n const differentScheduledAt =\n newScheduledAt && newScheduledAt.getTime() !== scheduledAt.getTime();\n const localTZ = getLocalTimezoneName();\n const pastSchedule = scheduledAt && scheduledAt <= Date.now();\n\n const { inReplyToId } = post;\n const [replyToStatus, setReplyToStatus] = useState(null);\n // TODO: Uncomment this once https://github.com/mastodon/mastodon/issues/34000 is fixed\n // useEffect(() => {\n // if (inReplyToId) {\n // (async () => {\n // try {\n // const status = await masto.v1.statuses.$select(inReplyToId).fetch();\n // setReplyToStatus(status);\n // } catch (e) {\n // console.error(e);\n // }\n // })();\n // }\n // }, [inReplyToId]);\n\n return (\n <div id=\"scheduled-post-sheet\" class=\"sheet\">\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" size=\"l\" alt={t`Close`} />\n </button>\n <header>\n <h2>\n <Trans comment=\"Scheduled [in 1 day]\">\n Scheduled{' '}\n <b>\n <RelativeTime datetime={scheduledAt} />\n </b>\n </Trans>\n <br />\n <small>\n {niceDateTime(scheduledAt, {\n formatOpts: {\n weekday: 'short',\n second: 'numeric',\n },\n })}\n </small>\n </h2>\n </header>\n <main tabIndex=\"-1\">\n {!!replyToStatus && (\n <div class=\"status-reply\">\n <Status status={replyToStatus} size=\"s\" previewMode readOnly />\n </div>\n )}\n <Status\n status={post}\n size=\"s\"\n previewMode\n readOnly\n onMediaClick={(e, i, media, status) => {\n e.preventDefault();\n states.showMediaModal = {\n mediaAttachments: post.mediaAttachments,\n mediaIndex: i,\n };\n }}\n />\n <form\n onSubmit={(e) => {\n e.preventDefault();\n setUIState('loading');\n (async () => {\n try {\n await masto.v1.scheduledStatuses.$select(post.id).update({\n scheduledAt: newScheduledAt.toISOString(),\n });\n showToast(t`Scheduled post rescheduled`);\n onClose();\n setUIState('default');\n states.reloadScheduledPosts++;\n } catch (e) {\n setUIState('error');\n console.error(e);\n showToast(t`Failed to reschedule post`);\n }\n })();\n }}\n >\n <footer>\n <div class=\"row\">\n <span>\n <ScheduledAtField\n scheduledAt={scheduledAt}\n setScheduledAt={(date) => {\n setNewScheduledAt(date);\n }}\n />{' '}\n <small class=\"ib\">{localTZ}</small>\n </span>\n </div>\n <div class=\"row\">\n <button\n disabled={\n !differentScheduledAt || uiState === 'loading' || pastSchedule\n }\n >\n <Trans>Reschedule</Trans>\n </button>\n <span class=\"grow\" />\n <MenuConfirm\n align=\"end\"\n menuItemClassName=\"danger\"\n confirmLabel={t`Delete scheduled post?`}\n onClick={() => {\n setUIState('loading');\n (async () => {\n try {\n await api()\n .masto.v1.scheduledStatuses.$select(post.id)\n .remove();\n showToast(t`Scheduled post deleted`);\n onClose();\n setUIState('default');\n states.reloadScheduledPosts++;\n } catch (e) {\n setUIState('error');\n console.error(e);\n showToast(t`Failed to delete scheduled post`);\n }\n })();\n }}\n >\n <button\n type=\"button\"\n class=\"light danger\"\n disabled={uiState === 'loading' || pastSchedule}\n >\n <Trans>Delete…</Trans>\n </button>\n </MenuConfirm>\n </div>\n </footer>\n </form>\n </main>\n </div>\n );\n}\n","import './status.css';\n\nimport { Plural, Trans, useLingui } from '@lingui/react/macro';\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 punycode from 'punycode/';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport { InView } from 'react-intersection-observer';\nimport { matchPath, useSearchParams } from 'react-router-dom';\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 { getSafeViewTransitionName } from '../components/media';\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 useTitle from '../utils/useTitle';\n\nimport getInstanceStatusURL from './../utils/get-instance-status-url';\n\nconst { PHANPY_DEFAULT_INSTANCE: DEFAULT_INSTANCE } = import.meta.env;\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 { t } = useLingui();\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 ? snapStates.statuses[statusKey(mediaStatusID, instance)]?.mediaAttachments\n : heroStatus?.mediaAttachments;\n\n const postViewState = () =>\n window.matchMedia('(min-width: calc(40em + 350px))').matches\n ? 'large'\n : 'small';\n const mediaClose = useCallback(() => {\n console.log('xxx', {\n postViewState: postViewState(),\n showMediaOnly,\n });\n if (postViewState() === 'small' && snapStates.prevLocation) {\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 const handleMediaClose = useCallback(\n (e, currentIndex, mediaAttachments, carouselRef) => {\n if (postViewState() === 'large' && !showMediaOnly) {\n mediaClose();\n return;\n }\n if (showMedia && document.startViewTransition) {\n const media = mediaAttachments[currentIndex];\n const { id, blurhash, url } = media;\n const mediaVTN = getSafeViewTransitionName(id || blurhash || url);\n const els = document.querySelectorAll(\n `.status .media [data-view-transition-name=\"${mediaVTN}\"]`,\n );\n const foundEls = [...els]?.filter?.((el) => {\n const elBounds = el.getBoundingClientRect();\n return (\n elBounds.top < window.innerHeight &&\n elBounds.bottom > 0 &&\n elBounds.left < window.innerWidth &&\n elBounds.right > 0\n );\n });\n // If more than one, get the one in status page\n const el =\n foundEls.length === 1\n ? foundEls[0]\n : foundEls.find((el) => !!el.closest('.status-deck'));\n\n console.log('xxx', { media, id, els, el });\n if (el) {\n const transition = document.startViewTransition(() => {\n el.style.viewTransitionName = mediaVTN;\n if (carouselRef?.current) {\n carouselRef.current\n .querySelectorAll('.media img, .media video')\n ?.forEach((el) => {\n el.style.viewTransitionName = '';\n });\n }\n mediaClose();\n });\n transition.ready.finally(() => {\n el.style.viewTransitionName = '';\n el.dataset.viewTransitioned = mediaVTN;\n });\n } else {\n mediaClose();\n }\n } else {\n mediaClose();\n }\n },\n [showMedia, showMediaOnly],\n );\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 useEffect(() => {\n const $deckContainers = document.querySelectorAll('.deck-container');\n $deckContainers.forEach(($deckContainer) => {\n $deckContainer.setAttribute('inert', '');\n });\n return () => {\n $deckContainers.forEach(($deckContainer) => {\n $deckContainer.removeAttribute('inert');\n });\n };\n }, []);\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 StatusParent(props) {\n const { linkable, to, onClick, ...restProps } = props;\n return linkable ? (\n <Link class=\"status-link\" to={to} onClick={onClick} {...restProps} />\n ) : (\n <div class=\"status-focus\" tabIndex={0} {...restProps} />\n );\n}\n\n// oldest first\nfunction createdAtSort(a, b) {\n return new Date(b.created_at) - new Date(a.created_at);\n}\n\nfunction StatusThread({ id, closeLink = '/', instance: propInstance }) {\n const { t } = useLingui();\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 lastInitContextTS = 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 ancestors.sort(createdAtSort);\n descendants.sort(createdAtSort);\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(\n (s) =>\n s.id === status.inReplyToId &&\n s.account.id === heroStatus.account.id,\n ) &&\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 // sort hero author to top\n nestedDescendants.sort((a, b) => {\n const heroAccountID = heroStatus.account.id;\n if (a.account.id === heroAccountID && b.account.id !== heroAccountID)\n return -1;\n if (b.account.id === heroAccountID && a.account.id !== heroAccountID)\n return 1;\n return 0;\n });\n\n console.log({ ancestors, descendants, nestedDescendants });\n if (missingStatuses.size) {\n console.error('Missing statuses', [...missingStatuses]);\n }\n\n let descendantLevelsCount = 1;\n function expandReplies(_replies, level) {\n const nextLevel = level + 1;\n if (nextLevel > descendantLevelsCount) {\n descendantLevelsCount = level;\n }\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 level: nextLevel,\n replies: expandReplies(_r.__replies, nextLevel),\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 level: 1,\n replies: expandReplies(s.__replies, 1),\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 const heroLimit = ancestors.length || 0; // 0-indexed\n if (heroLimit >= limit) {\n setLimit(heroLimit + 1);\n }\n\n console.log({ allStatuses, descendantLevelsCount });\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 lastInitContextTS.current = Date.now();\n\n return () => {\n clearTimeout(heroTimer);\n };\n };\n\n useEffect(initContext, [id, masto]);\n\n const [showRefresh, setShowRefresh] = useState(false);\n useEffect(() => {\n let interval = setInterval(() => {\n const now = Date.now();\n if (\n lastInitContextTS.current &&\n now - lastInitContextTS.current >= 60_000\n ) {\n setShowRefresh(true);\n }\n }, 60_000); // 1 minute\n return () => {\n clearInterval(interval);\n };\n }, []);\n\n useLayoutEffect(() => {\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 : t({\n id: 'post.title',\n message: 'Post',\n }),\n '/:instance?/s/:id',\n );\n\n const postInstance = useMemo(() => {\n if (!heroStatus) return;\n const { url } = heroStatus;\n if (!url) return;\n return URL.parse(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 || e.metaKey || e.ctrlKey || e.altKey || e.shiftKey;\n },\n useKey: true,\n },\n );\n // For backspace, will always close both media and status page\n useHotkeys(\n 'backspace',\n () => {\n location.hash = closeLink;\n },\n {\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n },\n );\n\n useHotkeys(\n 'j',\n () => {\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 useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n },\n );\n\n useHotkeys(\n 'k',\n () => {\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 useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\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(\n 'x',\n () => {\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 useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\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 level,\n } = status;\n const isHero = statusID === id;\n const isLinkable = isThread || ancestor;\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 <Trans>\n You're not logged in. Interactions (reply, boost, etc) are\n not possible.\n </Trans>\n </p>\n <Link\n to={\n DEFAULT_INSTANCE\n ? `/login?instance=${DEFAULT_INSTANCE}&submit=1`\n : '/login'\n }\n class=\"button\"\n >\n <Trans>Log in</Trans>\n </Link>\n </div>\n ) : (\n !sameInstance && (\n <div class=\"post-status-banner\">\n <p>\n <Trans>\n This post is from another instance (<b>{instance}</b>).\n Interactions (reply, boost, etc) are not possible.\n </Trans>\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.list({\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(t`Error: ${e}`);\n console.error(e);\n }\n })();\n }}\n >\n <Icon icon=\"transfer\" />{' '}\n <Trans>\n Switch to my instance to enable interactions\n </Trans>\n </button>\n </div>\n )\n )}\n </>\n ) : (\n <StatusParent\n linkable={isLinkable}\n to={instance ? `/${instance}/s/${statusID}` : `/s/${statusID}`}\n onClick={() => {\n resetScrollPosition(statusID);\n }}\n >\n {/* <Link\n class=\"status-link\"\n to={instance ? `/${instance}/s/${statusID}` : `/s/${statusID}`}\n onClick={() => {\n resetScrollPosition(statusID);\n }}\n > */}\n {i === 0 && ancestor ? (\n <InView\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 ) : (\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 showActionsBar={!!descendant}\n />\n )}\n {ancestor && repliesCount > 1 && (\n <div class=\"replies-link\">\n <Icon icon=\"comment2\" alt={t`Replies`} />{' '}\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={level}\n accWeight={weight}\n openAll={totalDescendants.current < SUBCOMMENTS_OPEN_ALL_LIMIT}\n parentLink={{\n to: instance ? `/${instance}/s/${statusID}` : `/s/${statusID}`,\n onClick: () => resetScrollPosition(statusID),\n }}\n />\n )}\n {uiState === 'loading' &&\n isHero &&\n !!heroStatus?.repliesCount &&\n !hasDescendants && (\n <div class=\"status-loading\">\n <Loader abrupt={heroStatus.repliesCount >= 3} />\n </div>\n )}\n {uiState === 'error' &&\n isHero &&\n !!heroStatus?.repliesCount &&\n !hasDescendants && (\n <div class=\"status-error\">\n <Trans>Unable to load replies.</Trans>\n <br />\n <button\n type=\"button\"\n class=\"plain\"\n onClick={() => {\n states.reloadStatusPage++;\n }}\n >\n <Trans>Try again</Trans>\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 const statusesList = useMemo(\n () => statuses.slice(0, limit).map(renderStatus),\n [statuses, limit, renderStatus],\n );\n\n // If there's spoiler in hero status, auto-expand it\n useEffect(() => {\n let timer = setTimeout(() => {\n if (!heroStatusRef.current) return;\n const spoilerButton = heroStatusRef.current.querySelector(\n '.spoiler-button:not(.spoiling), .spoiler-media-button:not(.spoiling)',\n );\n if (spoilerButton) spoilerButton.click();\n }, 1000);\n return () => clearTimeout(timer);\n }, [id]);\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\" alt={t`Back`} />\n </button>\n )}\n {!heroInView && heroStatus && uiState !== 'loading' ? (\n <>\n <span class=\"hero-heading\">\n <NameText\n account={heroStatus.account}\n instance={instance}\n showAvatar\n short\n />{' '}\n <span class=\"insignificant\">\n •{' '}\n <RelativeTime\n datetime={heroStatus.createdAt}\n format=\"micro\"\n />\n </span>\n </span>{' '}\n <button\n type=\"button\"\n class=\"ancestors-indicator light small\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n heroStatusRef.current.scrollIntoView({\n behavior: 'smooth',\n block: 'start',\n });\n }}\n title={t`Go to main post`}\n >\n <Icon\n icon={heroPointer === 'down' ? 'arrow-down' : 'arrow-up'}\n />\n </button>\n </>\n ) : (\n <>\n <Trans id=\"post.title\">Post</Trans>{' '}\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={t`${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={\n ancestor.account.avatarStatic ||\n ancestor.account.avatar\n }\n alt={ancestor.account.displayName}\n squircle={ancestor.account?.bot}\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={t`Switch to Side Peek view`}\n >\n <Icon icon=\"layout4\" size=\"l\" />\n </button>\n {showRefresh && (\n <button\n type=\"button\"\n class=\"plain button-refresh\"\n onClick={() => {\n states.reloadStatusPage++;\n setShowRefresh(false);\n }}\n >\n <Icon icon=\"refresh\" size=\"l\" alt={t`Refresh`} />\n </button>\n )}\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={t`More`} 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>\n <Trans>Refresh</Trans>\n </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 {viewMode === 'full'\n ? t`Switch to Side Peek view`\n : t`Switch to 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\" />{' '}\n <span>\n <Trans>Show all sensitive content</Trans>\n </span>\n </MenuItem>\n <MenuDivider />\n <MenuHeader className=\"plain\">\n <Trans>Experimental</Trans>\n </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(t`Unable to switch`);\n }\n }}\n >\n <Icon icon=\"transfer\" />\n <small class=\"menu-double-lines\">\n {postInstance\n ? t`Switch to post's instance (${punycode.toUnicode(\n postInstance,\n )})`\n : t`Switch to post's instance`}\n </small>\n </MenuItem>\n </Menu2>\n <Link class=\"button plain deck-close\" to={closeLink}>\n <Icon icon=\"x\" size=\"xl\" alt={t`Close`} />\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 {statusesList}\n {showMore > 0 && (\n <li class=\"descendant descendant-more\">\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 <Trans>Show more…</Trans>{' '}\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 <Trans>Unable to load post</Trans>\n <br />\n <br />\n <button\n type=\"button\"\n onClick={() => {\n states.reloadStatusPage++;\n }}\n >\n <Trans>Try again</Trans>\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 parentLink,\n}) {\n const { t } = useLingui();\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 // NOTE: this scrollLeft works for RTL too\n // Browsers do the magic for us\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 // If not open, delay render replies\n const [renderReplies, setRenderReplies] = useState(openBefore || open);\n useEffect(() => {\n let timer;\n if (!openBefore && !open) {\n timer = setTimeout(() => setRenderReplies(true), 100);\n }\n return () => clearTimeout(timer);\n }, [openBefore, open]);\n\n const Container = open ? 'div' : 'details';\n const isDetails = Container === 'details';\n\n return (\n <Container\n ref={detailsRef}\n class=\"replies\"\n open={isDetails ? openBefore || open : undefined}\n onToggle={\n isDetails\n ? (e) => {\n const { open } = e.target;\n // use first reply as ID\n cachedRepliesToggle[replies[0].id] = open;\n }\n : undefined\n }\n style={{\n '--comments-level': level,\n }}\n data-comments-level={level}\n data-comments-level-overflow={level > 4}\n >\n {!open && (\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 <span class=\"replies-counts\">\n <b>\n <Plural\n value={replies.length}\n one=\"# reply\"\n other={\n <Trans>\n <span title={replies.length}>\n {shortenNumber(replies.length)}\n </span>{' '}\n replies\n </Trans>\n }\n />\n </b>\n {!sameCount && totalComments > 1 && (\n <>\n {' '}\n ·{' '}\n <span>\n <Plural\n value={totalComments}\n one=\"# comment\"\n other={\n <Trans>\n <span title={totalComments}>\n {shortenNumber(totalComments)}\n </span>{' '}\n comments\n </Trans>\n }\n />\n </span>\n </>\n )}\n </span>\n <Icon icon=\"chevron-down\" class=\"replies-summary-chevron\" />\n {!!parentLink && (\n <Link\n class=\"replies-parent-link\"\n to={parentLink.to}\n onClick={parentLink.onClick}\n title={t`View post with its replies`}\n >\n »\n </Link>\n )}\n </summary>\n )}\n {renderReplies && (\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 showActionsBar\n />\n {!r.replies?.length && r.repliesCount > 0 && (\n <div class=\"replies-link\">\n <Icon icon=\"comment2\" alt={t`Replies`} />{' '}\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={r.level}\n accWeight={!open ? r.weight : totalWeight}\n openAll={openAll}\n parentLink={{\n to: instance ? `/${instance}/s/${r.id}` : `/s/${r.id}`,\n onClick: () => {\n resetScrollPosition(r.id);\n },\n }}\n />\n )}\n </li>\n ))}\n </ul>\n )}\n </Container>\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__BbkKeAoc__\"","export default \"__VITE_ASSET__C$apFnmr__\"","export default \"__VITE_ASSET__MUCjVR2Z__\"","export default \"__VITE_ASSET__Pb$jWfr9__\"","export default \"__VITE_ASSET__DJIucEyS__\"","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 { Trans, useLingui } from '@lingui/react/macro';\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 logo from '../assets/logo.svg';\nimport logoText from '../assets/logo-text.svg';\n\nimport LangSelector from '../components/lang-selector';\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 const { t } = useLingui();\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\">\n <Trans>A minimalistic opinionated Mastodon web client.</Trans>\n </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 ? t`Log in` : t`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 <Trans>Sign up</Trans>\n </a>\n </p>\n )}\n {!DEFAULT_INSTANCE && (\n <p class=\"insignificant\">\n <small>\n <Trans>\n Connect your existing Mastodon/Fediverse account.\n <br />\n Your credentials are not stored on this server.\n </Trans>\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 <Trans>\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 </Trans>\n </p>\n <div>\n <LangSelector />\n </div>\n </div>\n <div id=\"why-container\">\n <div class=\"sections\">\n <section>\n <img\n src={boostsCarouselUrl}\n alt={t`Screenshot of Boosts Carousel`}\n loading=\"lazy\"\n />\n <h4>\n <Trans>Boosts Carousel</Trans>\n </h4>\n <p>\n <Trans>\n Visually separate original posts and re-shared posts (boosted\n posts).\n </Trans>\n </p>\n </section>\n <section>\n <img\n src={nestedCommentsThreadUrl}\n alt={t`Screenshot of nested comments thread`}\n loading=\"lazy\"\n />\n <h4>\n <Trans>Nested comments thread</Trans>\n </h4>\n <p>\n <Trans>\n Effortlessly follow conversations. Semi-collapsible replies.\n </Trans>\n </p>\n </section>\n <section>\n <img\n src={groupedNotificationsUrl}\n alt={t`Screenshot of grouped notifications`}\n loading=\"lazy\"\n />\n <h4>\n <Trans>Grouped notifications</Trans>\n </h4>\n <p>\n <Trans>\n Similar notifications are grouped and collapsed to reduce\n clutter.\n </Trans>\n </p>\n </section>\n <section>\n <img\n src={multiColumnUrl}\n alt={t`Screenshot of multi-column UI`}\n loading=\"lazy\"\n />\n <h4>\n <Trans>Single or multi-column</Trans>\n </h4>\n <p>\n <Trans>\n By default, single column for zen-mode seekers. Configurable\n multi-column for power users.\n </Trans>\n </p>\n </section>\n <section>\n <img\n src={multiHashtagTimelineUrl}\n alt={t`Screenshot of multi-hashtag timeline with a form to add more hashtags`}\n loading=\"lazy\"\n />\n <h4>\n <Trans>Multi-hashtag timeline</Trans>\n </h4>\n <p>\n <Trans>Up to 5 hashtags combined into a single timeline.</Trans>\n </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 { useLingui } from '@lingui/react';\nimport debounce from 'just-debounce-it';\nimport { lazy, memo, Suspense } from 'preact/compat';\nimport {\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'preact/hooks';\nimport { matchPath, Route, Routes, useLocation } from 'react-router-dom';\n\nimport 'swiped-events';\n\nimport { subscribe } from 'valtio';\n\nimport BackgroundService from './components/background-service';\nimport ComposeButton from './components/compose-button';\nimport { ICONS } from './components/ICONS';\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 AnnualReport from './pages/annual-report';\nimport Bookmarks from './pages/bookmarks';\nimport Catchup from './pages/catchup';\nimport Favourites from './pages/favourites';\nimport Filters from './pages/filters';\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 ScheduledPosts from './pages/scheduled-posts';\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 hasInstance,\n hasPreferences,\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 {\n getAccount,\n getCredentialApplication,\n getCurrentAccount,\n getVapidKey,\n setCurrentAccountID,\n} from './utils/store-utils';\n\nimport './utils/toast-alert';\n\n// Lazy load Sandbox component only in development\nconst Sandbox =\n import.meta.env.DEV || import.meta.env.PHANPY_DEV\n ? lazy(() => import('./pages/sandbox'))\n : () => null;\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 () => {\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 },\n 15 * 60 * 1000,\n);\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 setTimeout(() => {\n if (Array.isArray(ICONS[icon])) {\n ICONS[icon][0]?.();\n } else if (typeof ICONS[icon] === 'object') {\n ICONS[icon].module?.();\n } else {\n ICONS[icon]?.();\n }\n }, 1);\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 // Don't reset theme color if media modal is showing\n // Media modal will set its own theme color based on the media's color\n const showingMediaModal =\n document.getElementsByClassName('media-modal-container').length > 0;\n if (showingMediaModal) return;\n\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\nconst BENCHES = new Map();\nwindow.__BENCH_RESULTS = new Map();\nwindow.__BENCHMARK = {\n start(name) {\n if (!import.meta.env.DEV && !import.meta.env.PHANPY_DEV) return;\n // If already started, ignore\n if (BENCHES.has(name)) return;\n const start = performance.now();\n BENCHES.set(name, start);\n },\n end(name) {\n if (!import.meta.env.DEV && !import.meta.env.PHANPY_DEV) return;\n const start = BENCHES.get(name);\n if (start) {\n const end = performance.now();\n const duration = end - start;\n __BENCH_RESULTS.set(name, duration);\n BENCHES.delete(name);\n }\n },\n};\n\nif (import.meta.env.DEV) {\n // If press shift down, set --time-scale to 10 in root\n document.addEventListener('keydown', (e) => {\n if (e.key === 'Shift') {\n document.documentElement.classList.add('slow-mo');\n }\n });\n document.addEventListener('keyup', (e) => {\n if (e.key === 'Shift') {\n document.documentElement.classList.remove('slow-mo');\n }\n });\n}\n\n{\n // Temporary Experiments\n // May be removed in the future\n document.body.classList.toggle(\n 'exp-tab-bar-v2',\n store.local.get('experiments-tabBarV2') ?? false,\n );\n}\n\nfunction App() {\n const [isLoggedIn, setIsLoggedIn] = useState(false);\n const [uiState, setUIState] = useState('loading');\n __BENCHMARK.start('app-init');\n __BENCHMARK.start('time-to-following');\n __BENCHMARK.start('time-to-home');\n __BENCHMARK.start('time-to-isLoggedIn');\n useLingui();\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 {\n client_id: clientID,\n client_secret: clientSecret,\n vapid_key,\n } = getCredentialApplication(instanceURL) || {};\n const vapidKey = getVapidKey(instanceURL) || vapid_key;\n const verifier = store.sessionCookie.get('codeVerifier');\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 code_verifier: verifier || undefined,\n });\n\n if (accessToken) {\n const client = initClient({ instance: instanceURL, accessToken });\n await Promise.allSettled([\n initPreferences(client),\n initInstance(client, instanceURL),\n initAccount(client, instanceURL, accessToken, vapidKey),\n ]);\n initStates();\n window.__IGNORE_GET_ACCOUNT_ERROR__ = true;\n\n setIsLoggedIn(true);\n setUIState('default');\n } else {\n setUIState('error');\n }\n __BENCHMARK.end('app-init');\n })();\n } else {\n window.__IGNORE_GET_ACCOUNT_ERROR__ = true;\n const searchAccount = decodeURIComponent(\n (window.location.search.match(/account=([^&]+)/) || [, ''])[1],\n );\n let account;\n if (searchAccount) {\n account = getAccount(searchAccount);\n console.log('searchAccount', searchAccount, account);\n if (account) {\n setCurrentAccountID(account.info.id);\n window.history.replaceState(\n {},\n document.title,\n window.location.pathname || '/',\n );\n }\n }\n if (!account) {\n account = getCurrentAccount();\n }\n if (account) {\n setCurrentAccountID(account.info.id);\n const { client } = api({ account });\n const { instance } = client;\n // console.log('masto', masto);\n initStates();\n setUIState('loading');\n (async () => {\n try {\n if (hasPreferences() && hasInstance(instance)) {\n // Non-blocking\n initPreferences(client);\n initInstance(client, instance);\n } else {\n await Promise.allSettled([\n initPreferences(client),\n initInstance(client, instance),\n ]);\n }\n } catch (e) {\n } finally {\n setIsLoggedIn(true);\n setUIState('default');\n __BENCHMARK.end('app-init');\n }\n })();\n } else {\n setUIState('default');\n __BENCHMARK.end('app-init');\n }\n }\n\n // Cleanup\n store.sessionCookie.del('clientID');\n store.sessionCookie.del('clientSecret');\n store.sessionCookie.del('codeVerifier');\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 if (uiState === 'loading') {\n return <Loader id=\"loader-root\" />;\n }\n\n return (\n <>\n <PrimaryRoutes isLoggedIn={isLoggedIn} />\n <SecondaryRoutes isLoggedIn={isLoggedIn} />\n <Routes>\n <Route path=\"/:instance?/s/:id\" element={<StatusRoute />} />\n </Routes>\n {isLoggedIn && <ComposeButton />}\n {isLoggedIn && <Shortcuts />}\n <Modals />\n {isLoggedIn && <NotificationService />}\n <BackgroundService isLoggedIn={isLoggedIn} />\n <SearchCommand onClose={focusDeck} />\n <KeyboardShortcutsHelp />\n </>\n );\n}\n\nfunction Root({ isLoggedIn }) {\n if (isLoggedIn) {\n __BENCHMARK.end('time-to-isLoggedIn');\n }\n return isLoggedIn ? <Home /> : <Welcome />;\n}\n\nconst PrimaryRoutes = memo(({ isLoggedIn }) => {\n const location = useLocation();\n const nonRootLocation = useMemo(() => {\n const { pathname } = location;\n return !/^\\/(login|welcome|_sandbox)/i.test(pathname);\n }, [location]);\n\n return (\n <Routes location={nonRootLocation || location}>\n <Route path=\"/\" element={<Root isLoggedIn={isLoggedIn} />} />\n <Route path=\"/login\" element={<Login />} />\n <Route path=\"/welcome\" element={<Welcome />} />\n {(import.meta.env.DEV || import.meta.env.PHANPY_DEV) && (\n <Route\n path=\"/_sandbox\"\n element={\n <Suspense fallback={<Loader id=\"loader-sandbox\" />}>\n <Sandbox />\n </Suspense>\n }\n />\n )}\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=\"/fh\" element={<FollowedHashtags />} />\n <Route path=\"/sp\" element={<ScheduledPosts />} />\n <Route path=\"/ft\" element={<Filters />} />\n <Route path=\"/catchup\" element={<Catchup />} />\n <Route path=\"/annual_report/:year\" element={<AnnualReport />} />\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';\nimport './cloak-mode.css';\nimport './polyfills';\n\nimport { i18n } from '@lingui/core';\nimport { I18nProvider } from '@lingui/react';\n// Polyfill needed for Firefox < 122\n// https://bugzilla.mozilla.org/show_bug.cgi?id=1423593\n// import '@formatjs/intl-segmenter/polyfill';\nimport { render } from 'preact';\nimport { HashRouter } from 'react-router-dom';\n\nimport { App } from './app';\nimport { initActivateLang } from './utils/lang';\n\ninitActivateLang();\n\nif (import.meta.env.DEV) {\n import('preact/debug');\n}\n\nrender(\n <I18nProvider i18n={i18n}>\n <HashRouter>\n <App />\n </HashRouter>\n </I18nProvider>,\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\n// Service worker cache cleanup\nif ('serviceWorker' in navigator && typeof caches !== 'undefined') {\n const MAX_SW_CACHE_SIZE = 50;\n const IGNORE_CACHE_KEYS = ['icons'];\n let clearRanOnce = false;\n const FAST_INTERVAL = 10_000; // 10 seconds\n const SLOW_INTERVAL = 60 * 60 * 1000; // 1 hour\n async function clearCaches() {\n if (window.__IDLE__) {\n try {\n const keys = await caches.keys();\n for (const key of keys) {\n if (IGNORE_CACHE_KEYS.includes(key)) continue;\n const cache = await caches.open(key);\n const _keys = await cache.keys();\n if (_keys.length > MAX_SW_CACHE_SIZE) {\n console.warn('Cleaning cache', key, _keys.length);\n const deleteKeys = _keys.slice(MAX_SW_CACHE_SIZE);\n for (const deleteKey of deleteKeys) {\n await cache.delete(deleteKey);\n }\n }\n }\n clearRanOnce = true;\n } catch (e) {} // Silent fail\n }\n // Once cleared, clear again at slower interval\n setTimeout(clearCaches, clearRanOnce ? SLOW_INTERVAL : FAST_INTERVAL);\n }\n setTimeout(clearCaches, FAST_INTERVAL);\n}\n\nwindow.__CLOAK__ = () => {\n document.body.classList.toggle('cloak');\n};\n"],"names":["functionDebounce","debounce","fn","wait","callFirst","timeout","debouncedFn","clear","flush","call","debounceWrapper","context","args","callNow","window","document","event","params","evt","handleTouchStart","handleTouchMove","handleTouchEnd","xDown","yDown","xDiff","yDiff","timeDown","startEl","touchCount","e","swipeThreshold","getNearestAttribute","swipeUnit","swipeTimeout","timeDiff","eventType","changedTouches","eventData","xUp","yUp","el","attributeName","defaultValue","attributeValue","usePageVisibility","deps","savedCallback","useRef","useEffect","current","handleVisibilityChange","hidden","visibilityState","console","STREAMING_TIMEOUT","POLL_INTERVAL","BackgroundService","memo","isLoggedIn","t","_useLingui","visible","setVisible","useState","visibleTimeout","clearTimeout","setTimeout","checkLatestNotification","masto","instance","skipCheckMarkers","states","notificationsLast","notificationsIterator","v1","notifications","list","limit","sinceId","id","values","value","next","length","notificationsShowNew","lastReadId","markers","fetch","timeline","sub","streamTimeout","pollNotifications","streaming","api","hasStreaming","user","notification","subscribe","log","entry","checkForUpdates","clearInterval","r","info","useInterval","lastCheckDate","useHotkeys","currentCloakMode","diff","showToast","_t","settings","fetchLatestPostsMemoized","pmem","currentAccountID","statusesIterator","accounts","$select","statuses","exclude_replies","exclude_reblogs","maxAge","ComposeButton","snapStates","useSnapshot","menuOpen","setMenuOpen","latestPosts","setLatestPosts","loadingPosts","setLoadingPosts","buttonRef","menuRef","columnMode","shortcutsViewMode","handleButton","key","toLowerCase","composerState","minimized","openOSK","composeDataElements","querySelectorAll","opts","JSON","parse","undefined","shiftKey","openCompose","showCompose","useKey","ignoreEventWhen","querySelector","metaKey","ctrlKey","altKey","bindLongPress","useLongPress","threshold","fetchLatestPosts","useCallback","getCurrentAccountID","posts","handleReplyToPost","post","replyToStatus","_jsxs","_Fragment","children","_jsx","ref","type","onClick","onContextMenu","preventDefault","class","publishing","publishingError","Icon","icon","size","alt","ControlledMenu","state","anchorRef","onClose","direction","gap","unmountOnClose","portal","target","body","boundingBoxPadding","safeBoundingBoxPadding","containerProps","style","zIndex","closeMenu","submenuOpenDelay","MenuLink","to","_Trans","MenuDivider","SubMenu2","align","shift","disabled","label","className","map","createdDate","Date","createdAt","isWithinDay","getTime","MenuItem","statusPeek","RelativeTime","datetime","format","dateTime","toISOString","title","toLocaleString","niceDateTime","KeyboardShortcutsHelp","showKeyboardShortcutsHelp","location","Modal","tabindex","keys","0","action","1","2","parents","coords","siblings","animations","intersections","intervals","options","debounces","enabled","root","scrollX","scrollY","TGT","DEL","NEW","handleMutations","mutations","elements","getElements","animate","handleResizes","entries","updateAllPos","updatePos","observePosition","oldObserver","rect","invocations","buffer","getCoords","offsetWidth","offsetHeight","rootMargin","px","observer","optionsOrPlugin","getOptions","delay","isPlugin","currentAnimation","parent","forEach","lowPriority","poll","callback","resize","supportedBrowser","nodes","mutation","node","i","child","_a","isMounted","preExisting","add","remain","remove","raw","str","getScrollOffset","p","x","y","getTransitionSizes","oldCoords","newCoords","widthFrom","heightFrom","widthTo","heightTo","styles","paddingY","paddingX","getTarget","isEnabled","callbacks","getPluginTuple","pluginReturn","config","animation","pluginOrOptions","deltaX","deltaY","start","end","keyframes","cleanUp","prev","finalX","finalY","top","left","width","height","deletePosition","adjustScroll","styleReset","scrollDeltaX","scrollDeltaY","scrollBefore","lastHeight","lastWidth","startScroll","smoothScroll","offsetParent","parentStyles","parentCoords","autoAnimate","element","useAutoAnimate","controller","setController","setEnabled","dec2hex","dec","toString","slice","verifier","array","Uint32Array","crypto","getRandomValues","Array","from","join","sha256","plain","data","TextEncoder","encode","subtle","digest","base64urlencode","a","bytes","Uint8Array","len","byteLength","String","fromCharCode","btoa","replace","generateCodeChallenge","v","hashed","supportsPKCE","instanceURL","res","ok","status","json","code_challenge_methods_supported","includes","__generateCodeChallenge","DEV","PHANPY_CLIENT_NAME","CLIENT_NAME","PHANPY_WEBSITE","WEBSITE","import","SCOPES","sameSite","hostname","currentLocation","origin","pathname","REDIRECT_URI","registerApplication","registrationParams","URLSearchParams","client_name","redirect_uris","scopes","website","method","headers","getPKCEAuthorizationURL","registrationJSON","client_id","forceLogin","codeChallenge","codeVerifier","code_challenge_method","code_challenge","authorizationParams","scope","authorizationURL","client_secret","code","code_verifier","append","tokenJSON","tokenResponse","token","error","isStandalone","matchMedia","matches","Accounts","getAccounts","currentAccount","moreThanOneAccount","_","reload","useReducer","accountsListParent","tabIndex","account","isCurrent","isDefault","Avatar","url","avatarStatic","onDblClick","saveAccounts","NameText","test","showAcct","setCurrentAccountID","Menu2","menuButton","href","splice","subMenu","confirmLabel","menuItemClassName","clientId","clientSecret","Link","logo","regionMaps","LangSelector","i18n","useLingui","populatedLocales","useMemo","LOCALES","lang","regionlessCode","native","localeCode2Text","locale","fallback","CATALOGS","find","c","nativeName","_common","name","sort","b","order","localeCompare","DEFAULT_LANG","onChange","store","local","set","common","createBackendPushSubscription","subscription","push","create","fetchBackendPushSubscription","updateBackendPushSubscription","update","removeBackendPushSubscription","isPushSupported","navigator","getRegistration","serviceWorker","getSubscription","registration","pushManager","urlBase64ToUint8Array","base64String","padding","repeat","base64","rawData","atob","outputArray","charCodeAt","initSubscription","backendSubscription","err","message","sameEndpoint","sameKey","vapidKey","key2","applicationServerKey","vapidKeyStr","applicationServerKeyStr","updateSubscription","policy","removeSubscription","DEFAULT_TEXT_SIZE","TEXT_SIZES","PHANPY_PRIVACY_POLICY_URL","PRIVACY_POLICY_URL","PHANPY_TRANSLANG_INSTANCES","TRANSLANG_INSTANCES","PHANPY_IMG_ALT_API_URL","IMG_ALT_API_URL","PHANPY_GIPHY_API_KEY","GIPHY_API_KEY","targetLanguages","Object","languages","tl","TRANSLATION_API_NAME","Settings","currentTheme","get","themeFormRef","targetLanguage","contentTranslationTargetLanguage","systemTargetLanguage","getTranslateTargetLanguage","systemTargetLanguageText","currentTextSize","prefs","setPrefs","getPreferences","authenticated","expTabBarV2","setExpTabBarV2","onInput","formData","theme","documentElement","html","classList","$manualMeta","$autoMetas","m","toggle","defaultChecked","fontSize","min","max","step","parseInt","setProperty","rel","for","setPreferences","checked","autoRefresh","boostsCarousel","showCommon","contentTranslationHideLanguages","contentTranslation","composerGIFPicker","mediaAltGenerator","getAPIVersions","groupedNotificationsAlpha","shortcutSettingsCloudImportExport","cloakMode","PushNotificationsSection","display","flexWrap","lineHeight","src","aspectRatio","verticalAlign","borderRadius","readOnly","__BUILD_TIME__","caches","uiState","setUIState","allowNotifications","setAllowNotifications","setNeedRelogin","pushFormRef","needRelogin","alerts","previousPolicyRef","policyEl","namedItem","isLoading","mention","favourite","reblog","follow","alertsCount","allowNotifications2","_t2","permission","components","alert2","alert","focusDeck","timer","columns","getElementById","focusedColumn","focus","firstVisibleColumn","column","getBoundingClientRect","modals","modal","modalFocusElement","pages","page","useLocationChange","useLocation","currentLocationRef","FETCH_MAX_AGE","MAX_AGE","fetchLists","lists","updatedAt","now","getLists","fetchList","getList","theList","getListTitle","addListStore","updateListStore","index","deleteListStore","listID","findIndex","ListExclusiveBadge","insignificant","ListAddEdit","editMode","nameFieldRef","repliesPolicyFieldRef","exclusiveFieldRef","repliesPolicy","exclusive","supportsExclusive","supports","onSubmit","FormData","listResult","replies_policy","MenuConfirm","MUTE_DURATIONS","MUTE_DURATIONS_LABELS","i18nDuration","LIMIT","ACCOUNT_INFO_MAX_AGE","fetchFamiliarFollowers","currentID","familiarFollowers","memFetchFamiliarFollowers","fetchPostingStats","accountID","fetchStatuses","total","originals","replies","stats","boosts","memFetchPostingStats","AccountInfo","fetchAccount","standalone","showEndorsements","currentAuthenticated","currentMasto","currentInstance","isString","setInfo","sameCurrentInstance","info2","acct","avatar","bot","displayName","emojis","fields","group","lastStatusAt","locked","note","statusesCount","username","memorial","moved","roles","hideCollections","header","headerStatic","headerIsAvatar","isSelf","infoHasEssentials","account2","updated","accountInstance","setHeaderCornerColors","domain","toUnicode","fetchFollowers","firstLoad","followersIterator","familiarFollowersCache","results","newValue","familiarFollowers2","familiar","followingIterator","fetchFollowing","LinkOrDiv","accountLink","postingStats","setPostingStats","renderFamiliarFollowers","setFamiliarFollowers","postingStatsUIState","setPostingStatsUIState","hasPostingStats","followers","renderPostingStats","onRelationshipChange","onProfileUpdate","newAccount","isStringURL","headerCornerColors","renderEndorsements","stopPropagation","onError","ctx","canvas","onLoad","pixelDimension","rgbColors","OffscreenCanvas","createElement","g","imageSmoothingEnabled","drawImage","colors","getImageData","dataLength","lightenRGB","color","AccountBlock","avatarSize","handleWithInstance","clipboard","setShowEditProfile","enhanceContent","verifiedAt","__html","EmojiText","text","blankCopy","follower","followersCount","shortenNumber","followingCount","excludeRelationshipAttrs","hideTime","_i18n","daysSinceLastPost","setRenderEndorsements","Endorsements","sameInstance","setRelationshipUIState","relationship","setRelationship","following","showingReblogs","currentInfo","setCurrentInfo","notifying","followedBy","blocking","blockedBy","muting","mutingNotifications","requested","domainBlocking","endorsed","privateNote","setIsSelf","acctWithInstance","supportsEndorsements","q","fetchRelationships2","relationships","relationship2","showAddRemoveLists","setShowAddRemoveLists","showPrivateNoteModal","updateAccount","showTranslatedBio","setLists","setShowPrivateNoteModal","lists2","loading","onMenuChange","setShowTranslatedBio","newRelationship","share","reloadGenericAccounts","counter","duration","relationshipUIState","Loader","luminence","alpha","urlObj","TranslatedBioSheet","getHTMLText","fieldsText","Math","host","path","TranslationBlock","AddRemoveListsSheet","_t4","_t3","listsContainingAccount","setListsContainingAccount","reloadCount","listsContainingAccount2","l","inList","accountIds","showListAddEditModal","setShowListAddEditModal","result","PrivateNoteSheet","_t5","textareaRef","initialNote","e2","trim","EditProfileSheet","_t6","headerPreview","setHeaderPreview","avatarPreview","acc","setAccount","source","fieldsAttributesRef","avatarMediaAttachments","SUPPORTED_IMAGE_FORMATS_STR","header2","avatar2","fieldsAttributesFields","field","fieldsAttributes","displayName2","note2","blob","headerMediaAttachments","files","file","setAvatarPreview","accept","FieldsAttributesRow","rows","dir","hasValue","setHasValue","AccountHandleInfo","server","encodedAcct","punycode","required","open","onlyOpenIfHasEndorsements","endorsementsContainer","toASCII","setEndorsementsUIState","fetchRelationships","relationshipsMap","setRelationshipsMap","endorsements","endorsementsUIState","setEndorsements","ENDORSEMENTS_LIMIT","AccountSheet","propInstance","lookup","skip_webfinger","v2","search","resolve","accountWithSameString","startsWith","accountURL","URL","Drafts","drafts","setDrafts","db","ns","getCurrentAccountNS","ownKeys","filter","getMany","hasDrafts","abrupt","draft","draftStatus","replyTo","updatedAtDate","MiniDraft","spoilerText","mediaAttachments","hasPoll","hasMedia","firstImageMedia","image","objectURL","createObjectURL","hasPollOrMedia","EmbedModal","dangerouslySetInnerHTML","GenericAccounts","postID","isCurrentInstance","showMore","setShowMore","showGenericAccounts","heading","fetchAccounts","staticAccounts","showReactions","setAccounts","loadRelationships","loadAccounts","done","isArray","theAccount","j","_types","newAccounts","Status","showStats","InView","FORCE_TRANSLATE_LIMIT","MediaAltModal","forceTranslate","setForceTranslate","differentLanguage","localeMatch","isShortAlt","supportsTTS","speak","whiteSpace","textWrap","sourceLanguage","classToType","obj","unpack","keyOrder","k","PI","TWOPI","PITHIRD","DEG2RAD","RAD2DEG","multiplyMatrices","A","B","B_cols","product","row","col","labConstants","compand","linear","sign","xyz2rgb","z","MtxAdaptMa","MtxAdaptMaI","MtxXYZ2RGB","RefWhiteRGB","Xn","Yn","Zn","LAB_CONSTANTS","As","Bs","Cs","Ad","Bd","Cd","X1","Y1","Z1","X2","Y2","Z2","oklab2rgb","L","rest","X","Y","Z","OKLab_to_XYZ","b_","OKLab","LMStoXYZ","OKLabtoLMS","LMSnl","gammaAdjustSRGB","companded","rgb2xyz","MtxRGB2XYZ","rgb2oklab","xyz","XYZ_to_OKLab","XYZ","XYZtoLMS","LMStoOKLab","LMS","sin","cos","lch2lab","h","oklch2rgb","sqrt","atan2","round","lab2lch","rgb2oklch","MediaModal","statusID","carouselRef","currentIndex","setCurrentIndex","carouselFocusItem","useLayoutEffect","scrollIntoView","prevStatusID","scrollLeft","clientWidth","differentStatusID","scrollTo","isRTL","behavior","showControls","setShowControls","handleSwipe","addEventListener","removeEventListener","handleScroll","abs","passive","mediaOkColors","media","blurhash","averageColor","getBlurHashAverageColor","mediaAccentColors","okColor","light","dark","default","mediaAccentGradients","range","lightGradient","darkGradient","toastRef","hideToast","currentColor","$meta","metaColor","mediaColor","colorScheme","content","accentColor","description","showMediaAlt","CATEGORIES","CATEGORIES_INFO","spam","legal","violation","stampLabel","other","excludeStamp","findMatchingLanguage","rule","currentLang","translations","availableLanguages","matchedLang","normalizedLanguages","split","part","region","charAt","toUpperCase","translateRules","rules","_translatedText","ReportModal","translatedRules","currentDomain","getCurrentInstance","selectedCategory","setSelectedCategory","showRules","setShowRules","rulesRef","hasRules","setHasRules","previewMode","useAvatarStatic","showActivity","fromEntries","category","comment","forward","ruleIds","reports","accountId","statusIds","Fragment","maxlength","LZString","f","keyStrBase64","keyStrUriSafe","baseReverseDic","getBaseValue","alphabet","character","input","compressed","uncompressed","buf","TotalLen","current_value","bitsPerChar","getCharFromInt","context_dictionary","context_dictionaryToCreate","context_c","context_wc","context_w","context_enlargeIn","context_dictSize","context_numBits","context_data","context_data_val","context_data_position","ii","resetValue","getNextValue","dictionary","enlargeIn","dictSize","numBits","w","bits","resb","maxpower","power","module","floatingButtonUrl","multiColumnUrl$1","tabMenuBarUrl","MAX_FETCH","fetchFollowedTags","iterator","followedTags","tags","fetchCount","getFollowedTags","fauxDiv","extractTagsFromStatus","hashtagLinks","AsyncText","setText","Promise","then","SHORTCUTS_LIMIT","TYPES","TYPE_TEXT","public","bookmarks","favourites","hashtag","trending","mentions","TYPE_PARAMS","notRequired","placeholder","pattern","fetchAccountTitle","SHORTCUTS_META","excludeViewMode","subtitle","query","encodeURIComponent","ShortcutsSettings","shortcuts","showForm","setShowForm","showImportExport","setShowImportExport","shortcutsListParent","opacity","textTransform","imgURL","multiColumnUrl","Boolean","shortcut","excludedViewMode","shortcutsArr","temp","shortcutIndex","justifyContent","alignItems","currentTarget","ShortcutForm","mode","ImportExport","FORM_NOTES","currentType","setCurrentType","setFollowedHashtags","form","formRef","switch","followedHashtags","autocorrect","autocapitalize","tag","shortcutsStr","compressToEncodedURIComponent","importShortcutStr","setImportShortcutStr","parsedImportShortcutStr","setImportUIState","parsed","decompressFromEncodedURIComponent","hasCurrentSettings","shortcutsImportFieldRef","dt","s","importUIState","menuFooter","nonUniqueShortcuts","exceededLimit","newShortcuts","writeText","settingsJSON","newNote","changes","prevValue","Modals","navigate","useNavigate","preload","ComposeSuspense","__COMPOSE__","editStatus","newStatus","scheduledAt","reloadStatusPage","reloadScheduledPosts","reply","edit","toast","prevLocation","showSettings","showAccounts","showAccount","destination","showDrafts","showMediaModal","contains","mediaIndex","showShortcutsSettings","showEmbedModal","showReportModal","FollowRequestButtons","requestState","setRequestState","hasRelationship","followRequests","authorize","Error","NOTIFICATION_ICONS","follow_request","severed_relationships","moderation_warning","emoji_reaction","annual_report","emojiText","emoji","emoji_url","staticUrl","emojiObject","CustomEmoji","contentText","count","postsCount","postType","Subject","clickable","3","poll-self","poll-voted","favourite+reblog","admin.sign_up","admin.report","targetAccount","year","SEVERED_RELATIONSHIPS_TEXT","account_suspension","targetName","domain_block","user_domain_block","MODERATION_WARNING_TEXT","none","disable","mark_statuses_as_sensitive","delete_statuses","sensitive","silence","suspend","AVATARS_LIMIT","Notification","isStatic","disableContextMenu","report","annualReport","_ids","_accounts","_statuses","_groupKeys","sampleAccounts","notificationsCount","groupKey","_notificationsCount","_sampleAccountsCount","actualStatus","actualStatusID","isVoted","voted","isReplyToOthers","inReplyToAccountId","favsCount","reblogsCount","props","handleOpenGenericAccounts","diffCount","expandAccounts","showAvatar","emojiURL","shortcode","formattedCreatedAt","genericAccountsHeading","statusKey","debug","isOwnPost","isFiltered","filtered","type2","gKey","keyAccounts","keyAccount","_accounts2","status2","allowContextMenu","TruncatedLink","dispatchEvent","clientX","clientY","useTruncated","oldProps","newProps","accessToken","NotificationService","routeNotification","showNotificationSheet","notificationAccount","hasAccount","hasModal","hash","warn","id2","setShowNotificationSheet","tagName","SearchForm","forwardRef","searchParams","setSearchParams","useSearchParams","searchMenuOpen","setSearchMenuOpen","setQuery","searchFieldRef","useImperativeHandle","setValue","select","blur","autocomplete","spellCheck","onSearch","onFocus","onBlur","onKeyDown","focusItem","nextItem","nextElementSibling","parentElement","firstItem","prevItem","previousElementSibling","lastItem","click","queryType","SearchCommand","showSearch","setShowSearch","searchFormRef","isSearchPage","closeSearch","enableOnFormTags","Shortcuts","isMultiColumnMode","shortcutsColumnsMode","tabBarRef","hasLists","formattedShortcuts","pin","timeoutId","activeTab","block","inline","updatesButton","instanceRef","overflow","viewScroll","menuClassName","position","pointerEvents","groupBoosts","newValues","boostStash","serialBoosts","item","boostStashID","items","half","floor","dedupeBoosts","boostedStatusIDs","filteredItems","boosterID","groupContext","contexts","contextIndex","repliedItem","self","inReplyToId","firstItemAccountID","newItems","appliedContextIndices","inReplyToIds","contextItems","aDate","bDate","every","it","sKey","statusReply","queueMicrotask","fallbackFetch","fetchStatus","saveStatus","skipThreading","ids","replyToStatuses","assignFollowedTags","statusFollowedTags","statusWithFollowedTags","extractedTags","itemFollowedTags","useScroll","scrollableRef","distanceFromStart","distanceFromEnd","scrollThresholdStart","scrollThresholdEnd","distanceFromStartPx","_distanceFromStartPx","distanceFromEndPx","_distanceFromEndPx","scrollDirection","setScrollDirection","reachStart","setReachStart","reachEnd","setReachEnd","nearReachStart","setNearReachStart","nearReachEnd","setNearReachEnd","isVertical","scrollableElement","previousScrollStart","scrollTop","onScroll","scrollHeight","scrollWidth","clientHeight","scrollStart","scrollDimension","clientDimension","scrollDistance","init","Event","useScrollFn","useThrottledCallback","MediaPost","onMediaClick","accountEmojis","repliesCount","reblogged","favourited","favouritesCount","bookmarked","muted","visibility","language","editedAt","card","uri","_deleted","_pinned","debugHover","filterContext","useContext","FilterContext","filterInfo","showSpoilerMedia","filterTitleStr","hasSpoiler","Media","NavMenu","showFollowing","detect","cancelOnMovement","menuState","setMenuState","mutesIterator","fetchMutes","mutes","blocksIterator","fetchBlocks","blocks","buttonClickTS","squircle","appVersion","commitHash","__COMMIT_HASH__","confirm","ListMenu","supportsLists","scrollIntoViewOptions","Timeline","titleComponent","emptyText","errorText","useItemID","fetchItems","checkForUpdatesInterval","headerStart","headerEnd","timelineStart","refresh","view","showFollowedTags","showReplyParent","clearWhenRefresh","setItems","showNew","setShowNew","isMediaFirstInstance","mediaFirst","allowGrouping","loadItemsTS","firstLoad2","loadItems","useDebouncedCallback","ts","otherPosts","pinnedPosts","items2","itemsSelector","jRef","handler","activeItem","closest","activeItemRect","allItems","activeItemIndex","indexOf","itemRect","topmostItem","kRef","findLast","oRef","showNewPostsIndicator","handleLoadNewPosts","dotRef","headerRef","nearReachStart2","hiddenUI","prevView","disableIdleCheck","loadOrCheckUpdates","inBackground","noPointers","__IDLE__","visible2","hasUpdate","lastHiddenTime","TimelineItem","skeleton","inView","fItems","filteredItemsIDs","aFiltered","bFiltered","isCarousel","unfiltered","filteredItems2","has","StatusCarousel","_pinned2","_grouped","item2","statusID3","_pinned3","actualStatusID3","reblog3","statusID2","actualStatusID2","reblog2","url2","showCompact","_differentAuthor","isSpoiler","manyItems","isMiddle","isStart","isEnd","TimelineStatusCompact","itemKey","enableCommentHint","startButtonRef","oldID","setRender","render","endButtonRef","statusPeekText","statusThreadNumber","titlesStr","MIN_YEAR","MIN_YEAR_MONTH","supportsInputMonth","setAttribute","_isSearchEnabled","isSearchEnabled","AccountStatuses","useParams","month","excludeReplies","excludeBoosts","tagged","accountStatusesIterator","allSearchParams","searchOffsetRef","searchEnabled","setSearchEnabled","isValidMonth","_year","_month","monthIndex","after","afterStr","before","beforeStr","searchResults","value2","offset","pinnedStatuses","pinnedStatusesIds","postId","containsAllPinned","featuredTags","setFeaturedTags","acctDisplay","accountDisplay","monthYear","fetchAccount2","memFetchAccount","featuredTags2","useTitle","cachedAccount","filterBarRef","month2","date","validity","MonthPicker","active","allowSwitch","offsetLeft","fetchAccountStatuses","TimelineStart","masto2","yearFieldRef","minYear","minMonth","maxYear","maxMonth","checkValidity","monthFieldRef","AnnualReport","setResults","annualReports","report2","datePlaceholder","Bookmarks","bookmarksIterator","fetchBookmarks","catchupUrl","FILTER_CONTEXT","RANGES","FILTER_KEYS","original","groups","FILTER_SORTS","FILTER_GROUPS","DTF","mem","Intl","DateTimeFormat","day","hour","minute","Catchup","dtf","showTopLinks","setShowTopLinks","supportsPixelfed","fetchHome","maxCreatedAt","maxCreatedAtDate","allResults","homeIterator","homeIterable","mainloop","createdAtDate","selfPost","addedResults","catchupRangeRef","catchupLastRef","handleCatchupClick","catchupID","catchup","setPosts","reloadCatchups","setLastCatchupEndAt","prevCatchups","setPrevCatchups","lastCatchupEndAt","catchups","ownCatchups","trimmedCatchups","lastCatchups","restCatchups","endAt","startAt","reloadCatchupsCount","_filtered","_followedTags","thePost","__FILTER","links","sharers","links2","link","topLinks","shared","linksLoop","likes","filteredPosts","authors","authorCounts","selectedFilterCategory","filteredPosts2","setSelectedAuthor","sortBy","authorsHash","setSortOrder","authorCountsMap","postFilterMatches","boostedPosts","__BOOSTERS","selectedAuthor","filteredPostsMap","authorID","authorCountsList","sortedFilteredPosts","aAccountID","authorIndices","bAccountID","aIndex","bIndex","postDensity","bDensity","aDensity","sortOrder","groupBy","prevGroup","authorsListParent","autoAnimated","isFiltered2","postsBar","postsBarType","posts2","postsBins","binByTime","lastCatchupRange","sortOrderIndex","authorElement","scrollableRect","authorRect","right","showHelp","setShowHelp","hlRef","_2","escRef","activeElement","isRadio","handleArrowKeys","isArrowKeys","setRange","pc","st","yes","del","setSelectedFilterCategory","setSortBy","formatRange","setGroupBy","transform","imageDescription","publishedAt","labAverageColor","filterCounts","author","paddingInline","showSeparator","IntersectionPostLineItem","isFollowedTags","PostLine","isReplyTo","show","setShow","IntersectionObserver","unobserve","MEDIA_DENSITY","CARD_DENSITY","pollContent","cur","htmlContentLength","PostPeek","density","_thread","readingExpandSpoilers","postText","showPostContent","isThread","emojifyText","o","multiple","remoteMediaURL","showMedia","mediaURL","MEDIA_SIZE","previewUrl","gifv","video","audio","PostStats","numBins","dates","minDate","maxDate","bins","normalized","binIndex","Favourites","favouritesIterator","fetchFavourites","FILTER_CONTEXT_UNIMPLEMENTED","FILTER_CONTEXT_LABELS","home","thread","EXPIRY_DURATIONS","EXPIRY_DURATIONS_LABELS","Filters","showFiltersAddEditModal","setShowFiltersAddEditModal","filters","setFilters","keywords","expiresAt","keyword","ExpiryStatus","_id","incID","FiltersAddEdit","filterAction","hasExpiry","expiresAtDate","editKeywords","setEditKeywords","keywordsRef","setRemovedKeyword_IDs","filteredEditKeywords","setRemovedKeywordIDs","removedKeyword_IDs","title2","keywordIDs","getAll","keywordKeywords","keywordWholeWords","wholeWord","removedKeywordIDs","keywordsAttributes","context2","expiresIn","filterResult","filterAction2","_id2","showNeverExpires","expired","rerender","FollowedHashtags","Following","latestItem","__BENCHMARK","latestItemChanged","clearFollowedTagsState","payload","TAGS_LIMIT_PER_MODE","TOTAL_TAGS_LIMIT","Hashtags","mediaView","hashtags","linkParams","hashtagTitle","maxID","fetchHashtags","timelines","any","maxId","onlyMedia","since_id","valueContainsLatestItem","followUIState","setFollowUIState","reachLimit","featuredUIState","setFeaturedUIState","isFeaturedTag","setIsFeaturedTag","finally","featuredTagID","catch","MenuHeader","delete","FocusableItem","newHashtag","MenuGroup","exists","newInstance","List","listIterator","setList","showManageMembersModal","setShowManageMembersModal","list2","setDownOverflow","ListManageMembers","MEMBERS_LIMIT","members","setMembers","membersIterator","fetchMembers","member","as","RemoveAddButton","removed","setRemoved","notificationTypeKeys","GROUP_TYPES","groupable","fixNotifications","massageNotifications2","notificationGroups","sampleAccountIds","statusId","groupNotifications2","groupNotifications","newGroupNotifications","gn","latestPageNotificationAt","mostRecentNotificationId","newGroupNotifications1","notificationsMap","virtualType","mappedNotification","ma","mappedAccount","newGroupNotifications2","notificationsMap2","hasOneAccount","toLocaleDateString","n","cleanNotifications","cleanNotifications2","emptySearchParams","Mentions","stateType","setStateType","mentionsIterator","fetchMentions","types","conversationsIterator","latestConversationItem","lastStatus","fetchConversations","NOTIFICATIONS_LIMIT","NOTIFICATIONS_GROUPED_LIMIT","memSupportsGroupedNotifications","mastodon","mastoFetchNotificationsIterable","mastoFetchNotifications","getGroupedNotifications","NOTIFICATIONS_POLICIES","NOTIFICATIONS_POLICIES_TEXT","forNotFollowing","forNotFollowers","forNewAccounts","forPrivateMentions","forLimitedAccounts","Notifications","notificationID","notificationAccessToken","onlyMentions","setOnlyMentions","setFollowRequests","announcements","setAnnouncements","notificationsIterable","excludeTypes","allNotifications","groupedNotifications","notificationsLastFetchTime","fetchFollowRequests","loadFollowRequests","requests","fetchAnnouncements","supportsFilteredNotifications","showNotificationsSettings","setNotificationsPolicy","fetchNotificationsPolicy","loadNotificationsPolicy","notificationsRequests","setNotificationsRequests","fetchNotificationsRequest","loadNotifications","fetchNotificationsPromise","fetchNotifications","loadUpdates","unsub","subscribeKey","yesterdayDate","todayDate","currentDay","showTodayEmpty","announcementsListRef","setAnnualReportNotification","annualReportNotification2","annualReportYear","getFullYear","statusLink","todaySubHeading","today","forceOpts","setShowNotificationsSettings","announcement","notificationsPolicy","onToggle","request","pendingRequestsCount","NotificationRequestModalButton","NotificationRequestButtons","annualReportNotification","differentDay","notificationDay","toDateString","subHeading","newPolicy","AnnouncementBlock","contact","contactAccount","startsAt","endsAt","published","allDay","reactions","publishedAtDate","read","publishedDateText","updatedAtText","reaction","me","fetchNotficationsByAccount","showModal","setShowModal","notifs","setNotifications","hasRequestState","Public","isLocal","publicIterator","fetchPublic","remote","prompt","SHORT_LIMIT","Search","offsetRef","statusResults","setStatusResults","accountResults","setAccountResults","hashtagResults","setHashtagResults","typeResults","setTypeResultsFunc","loadResults","filterBarParent","history","reduce","TREND_CACHE_TIME","fetchLinks","trends","fetchTrendsStatuses","pixelfed","discover","fetchLinkList","Trending","setHashtags","setLinks","trendIterator","fetchTrends","currentLinkMentionsLoading","setCurrentLinkMentionsLoading","currentLinkMentionsIterator","currentLink","setCurrentLink","supportsTrendingLinkPosts","currentLinkRef","hasCurrentLink","fetchLinkMentions","prevCurrentLink","authorUrl","authorName","providerName","providerUrl","isShortTitle","hasAuthor","flexShrink","textAlign","Columns","Hashtag","Component","$column","currentFocusedColumn","prevColKey","nextColKey","Home","NotificationsLink","notificationLinkRef","NotificationsMenu","NOTIFICATIONS_DISPLAY_LIMIT","hasFollowRequests","setHasFollowRequests","skipFollowRequests","headerHeight","Provider","statusPostRegexes","getInstanceStatusObject","theURL","regex","match","getInstanceStatusURL","HttpRoute","statusObject","statusURL","Lists","hasExclusiveLists","instancesListURL","PHANPY_DEFAULT_INSTANCE","DEFAULT_INSTANCE","Login","instanceURLRef","cachedInstanceURL","submit","instanceText","setInstanceText","instancesList","setInstancesList","searcher","Fuse","submitInstance","xmlDoc","parseFromString","template","getCredentialApplication","credentialApplication","storeCredentialApplication","authPKCE","sessionCookie","cleanInstanceText","instanceTextLooksLikeDomain","instancesSuggestions","instance2","selectedInstanceText","ScheduledPosts","scheduledPosts","setScheduledPosts","showScheduledPostModal","setShowScheduledPostModal","postsIterator","scheduledStatuses","allPosts","option","votesCount","ScheduledPostPreview","ScheduledPostEdit","hours","weekday","setNewScheduledAt","differentScheduledAt","newScheduledAt","localTZ","pastSchedule","ScheduledAtField","SUBCOMMENTS_OPEN_ALL_LIMIT","MAX_WEIGHT","cachedRepliesToggle","cachedStatusesMap","scrollPositions","resetScrollPosition","STATUSES_SELECTOR","STATUS_URL_REGEX","StatusPage","mediaParam","mediaOnlyParam","mediaStatusID","mediaStatus","getStatus","showMediaOnly","heroStatus","setHeroStatus","closeLink","matchStatusPath","matchPath","postViewState","mediaClose","mediaAttachments2","handleMediaClose","mediaVTN","getSafeViewTransitionName","els","foundEls","el2","innerHeight","transition","startViewTransition","ready","$carousel","$deckContainer","$deckContainers","StatusParent","linkable","restProps","createdAtSort","created_at","viewMode","setViewMode","totalDescendants","setStatuses","heroStatusRef","scrollOffsets","lastInitContextTS","reloadHero","heroTimer","reallyCachedStatuses","cachedStatuses","heroFetch","pRetry","contextFetch","hasStatus","heroStatus2","_replies","level","nextLevel","descendantLevelsCount","_r","expandReplies","descendants","weight","ancestors2","missingStatuses","ancestors","nestedDescendants","ancestorsIsThread","heroAccountID","allStatuses","__replies","calcStatusWeight","initContext","showRefresh","offsetTop","heroLimit","setLimit","scrollPosition","threadifyStatus","newScrollTop","newScrollOffsets","interval","setShowRefresh","getCurrentAccount","contextURL","statusWeightCache","heroDisplayName","div","heroContentText","postInstance","apiCache","postSameInstance","heroInView","activeStatus","activeStatusRect","activeStatusIndex","allStatusLinks","nextStatus","topmostStatusLink","statusLinkRect","heroPointer","prevStatus","details","handleMediaClick","handleStatusLinkClick","renderStatus","descendant","isHero","reachTopPost","translate","ancestor","requestAnimationFrame","setHeroInView","setReachTopPost","SubComments","isLinkable","hasDescendants","enableTranslate","showActionsBar","prevLocationIsStatusPage","prevEntry","moreStatusesKeys","getIDs","openAll","spoilerButton","initialPageState","onAnimationEnd","button","full","buttons","hasParentThread","accWeight","parentLink","diveDeep","replies2","replies3","totalComments","sameCount","arr","totalWeight","openBefore","detailsRef","dataset","setRenderReplies","Container","MEDIA_VIRTUAL_LENGTH","POLL_VIRTUAL_LENGTH","CARD_VIRTUAL_LENGTH","WEIGHT_SEGMENT","renderReplies","mediaLength","pollLength","StatusRoute","boostsCarouselUrl","groupedNotificationsUrl","multiHashtagTimelineUrl","nestedCommentsThreadUrl","logoText","PHANPY_DEFAULT_INSTANCE_REGISTRATION_URL","DEFAULT_INSTANCE_REGISTRATION_URL","appSite","Welcome","marginBlockEnd","nativeAlert","__nativeAlert","Toastify","gravity","__STATES__","__STATES_STATS__","counts","unmountedPosts","setInterval","unfurledLinks","postInNotifications","$post","unfurled","keysCount","ICONS","nonIdleEvents","setIdle","debouncedSetIdle","onNonIdle","isIOS","tempColor","themeDarkColor","textSize","$app","BENCHES","App","setIsLoggedIn","decodeURIComponent","getVapidKey","vapid_key","clientID","initStates","searchAccount","getAccount","client","hasPreferences","hasInstance","initPreferences","initInstance","PrimaryRoutes","Routes","Route","Root","nonRootLocation","backgroundLocation","getPrevLocation","isModalPage","initActivateLang","I18nProvider","HashRouter","localStorage","removeItem","sessionStorage","IGNORE_CACHE_KEYS","clearRanOnce","FAST_INTERVAL","SLOW_INTERVAL","clearCaches","cache","_keys","MAX_SW_CACHE_SIZE","deleteKeys"],"mappings":"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","x_google_ignoreList":[0,1,6,7,26,27,28,29,30,31,32,33,34,35,36,37,38,39,42]} |