phanpy-cz/assets/main-ztohNzti.js.map
2024-07-01 19:34:06 +02:00

1 line
1.1 MiB
Raw Blame History

This file contains ambiguous Unicode characters

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

{"version":3,"file":"main-ztohNzti.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/pages/accounts.jsx","../../src/assets/logo.svg","../../src/utils/push-notifications.js","../../src/pages/settings.jsx","../../src/utils/focus-deck.jsx","../../src/utils/useLocationChange.js","../../src/utils/lists.js","../../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","../../src/utils/color-utils.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.jsx","../../src/utils/useScroll.js","../../src/utils/useScrollFn.js","../../src/components/media-post.jsx","../../src/components/nav-menu.jsx","../../src/components/timeline.jsx","../../src/pages/account-statuses.jsx","../../src/pages/bookmarks.jsx","../../src/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.jsx","../../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/utils/auth.js","../../src/pages/login.jsx","../../src/pages/status.jsx","../../src/pages/status-route.jsx","../../src/assets/features/boosts-carousel.jpg","../../src/assets/features/grouped-notifications.jpg","../../src/assets/features/multi-column.jpg","../../src/assets/features/multi-hashtag-timeline.jpg","../../src/assets/features/nested-comments-thread.jpg","../../src/assets/logo-text.svg","../../src/pages/welcome.jsx","../../src/utils/toast-alert.js","../../src/app.jsx","../../src/main.jsx"],"sourcesContent":["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 { memo } from 'preact/compat';\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\n\nimport { api } from '../utils/api';\nimport showToast from '../utils/show-toast';\nimport states, { saveStatus } from '../utils/states';\nimport useInterval from '../utils/useInterval';\nimport usePageVisibility from '../utils/usePageVisibility';\n\nconst STREAMING_TIMEOUT = 1000 * 3; // 3 seconds\nconst POLL_INTERVAL = 15_000; // 15 seconds\n\nexport default memo(function BackgroundService({ isLoggedIn }) {\n // Notifications service\n // - WebSocket to receive notifications when page is visible\n const [visible, setVisible] = useState(true);\n usePageVisibility(setVisible);\n const checkLatestNotification = async (masto, instance, skipCheckMarkers) => {\n if (states.notificationsLast) {\n const notificationsIterator = masto.v1.notifications.list({\n limit: 1,\n sinceId: states.notificationsLast.id,\n });\n const { value: notifications } = await notificationsIterator.next();\n if (notifications?.length) {\n if (skipCheckMarkers) {\n states.notificationsShowNew = true;\n } else {\n let lastReadId;\n try {\n const markers = await masto.v1.markers.fetch({\n timeline: 'notifications',\n });\n lastReadId = markers?.notifications?.lastReadId;\n } catch (e) {}\n if (lastReadId) {\n states.notificationsShowNew = notifications[0].id !== lastReadId;\n } else {\n states.notificationsShowNew = true;\n }\n }\n }\n }\n };\n\n useEffect(() => {\n let sub;\n let pollNotifications;\n if (isLoggedIn && visible) {\n const { masto, streaming, instance } = api();\n (async () => {\n // 1. Get the latest notification\n await checkLatestNotification(masto, instance);\n\n let hasStreaming = false;\n // 2. Start streaming\n if (streaming) {\n pollNotifications = setTimeout(() => {\n (async () => {\n try {\n hasStreaming = true;\n sub = streaming.user.notification.subscribe();\n console.log('🎏 Streaming notification', sub);\n for await (const entry of sub) {\n if (!sub) break;\n if (!visible) break;\n console.log('🔔🔔 Notification entry', entry);\n if (entry.event === 'notification') {\n console.log('🔔🔔 Notification', entry);\n saveStatus(entry.payload, instance, {\n skipThreading: true,\n });\n }\n states.notificationsShowNew = true;\n }\n console.log('💥 Streaming notification loop STOPPED');\n } catch (e) {\n hasStreaming = false;\n console.error(e);\n }\n\n if (!hasStreaming) {\n console.log('🎏 Streaming failed, fallback to polling');\n pollNotifications = setInterval(() => {\n checkLatestNotification(masto, instance, true);\n }, POLL_INTERVAL);\n }\n })();\n }, STREAMING_TIMEOUT);\n }\n })();\n }\n return () => {\n sub?.unsubscribe?.();\n sub = null;\n clearTimeout(pollNotifications);\n clearInterval(pollNotifications);\n };\n }, [visible, isLoggedIn]);\n\n // Check for updates service\n const lastCheckDate = useRef();\n const checkForUpdates = () => {\n lastCheckDate.current = Date.now();\n console.log('✨ Check app update');\n fetch('./version.json')\n .then((r) => r.json())\n .then((info) => {\n if (info) states.appVersion = info;\n })\n .catch((e) => {\n console.error(e);\n });\n };\n useInterval(checkForUpdates, visible && 1000 * 60 * 30); // 30 minutes\n usePageVisibility((visible) => {\n if (visible) {\n if (!lastCheckDate.current) {\n checkForUpdates();\n } else {\n const diff = Date.now() - lastCheckDate.current;\n if (diff > 1000 * 60 * 60) {\n // 1 hour\n checkForUpdates();\n }\n }\n }\n });\n\n // Global keyboard shortcuts \"service\"\n useHotkeys('shift+alt+k', () => {\n const currentCloakMode = states.settings.cloakMode;\n states.settings.cloakMode = !currentCloakMode;\n showToast({\n text: `Cloak mode ${currentCloakMode ? 'disabled' : 'enabled'}`,\n });\n });\n\n return null;\n});\n","import { useHotkeys } from 'react-hotkeys-hook';\nimport { useSnapshot } from 'valtio';\n\nimport openCompose from '../utils/open-compose';\nimport openOSK from '../utils/open-osk';\nimport states from '../utils/states';\n\nimport Icon from './icon';\n\nexport default function ComposeButton() {\n const snapStates = useSnapshot(states);\n\n function handleButton(e) {\n if (snapStates.composerState.minimized) {\n states.composerState.minimized = false;\n openOSK();\n return;\n }\n\n if (e.shiftKey) {\n const newWin = openCompose();\n\n if (!newWin) {\n states.showCompose = true;\n }\n } else {\n openOSK();\n states.showCompose = true;\n }\n }\n\n useHotkeys('c, shift+c', handleButton, {\n ignoreEventWhen: (e) => {\n const hasModal = !!document.querySelector('#modal-container > *');\n return hasModal;\n },\n });\n\n return (\n <button\n type=\"button\"\n id=\"compose-button\"\n onClick={handleButton}\n class={`${snapStates.composerState.minimized ? 'min' : ''} ${\n snapStates.composerState.publishing ? 'loading' : ''\n } ${snapStates.composerState.publishingError ? 'error' : ''}`}\n >\n <Icon icon=\"quill\" size=\"xl\" alt=\"Compose\" />\n </button>\n );\n}\n","import './keyboard-shortcuts-help.css';\n\nimport { memo } from 'preact/compat';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport { useSnapshot } from 'valtio';\n\nimport states from '../utils/states';\n\nimport Icon from './icon';\nimport Modal from './modal';\n\nexport default memo(function KeyboardShortcutsHelp() {\n const snapStates = useSnapshot(states);\n\n function onClose() {\n states.showKeyboardShortcutsHelp = false;\n }\n\n useHotkeys(\n '?, shift+?, shift+slash',\n (e) => {\n console.log('help');\n states.showKeyboardShortcutsHelp = true;\n },\n {\n ignoreEventWhen: (e) => {\n const hasModal = !!document.querySelector('#modal-container > *');\n return hasModal;\n },\n },\n );\n\n return (\n !!snapStates.showKeyboardShortcutsHelp && (\n <Modal onClose={onClose}>\n <div id=\"keyboard-shortcuts-help-container\" class=\"sheet\" tabindex=\"-1\">\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" />\n </button>\n <header>\n <h2>Keyboard shortcuts</h2>\n </header>\n <main>\n <table>\n {[\n {\n action: 'Keyboard shortcuts help',\n keys: <kbd>?</kbd>,\n },\n {\n action: 'Next post',\n keys: <kbd>j</kbd>,\n },\n {\n action: 'Previous post',\n keys: <kbd>k</kbd>,\n },\n {\n action: 'Skip carousel to next post',\n keys: (\n <>\n <kbd>Shift</kbd> + <kbd>j</kbd>\n </>\n ),\n },\n {\n action: 'Skip carousel to previous post',\n keys: (\n <>\n <kbd>Shift</kbd> + <kbd>k</kbd>\n </>\n ),\n },\n {\n action: 'Load new posts',\n keys: <kbd>.</kbd>,\n },\n {\n action: 'Open post details',\n keys: (\n <>\n <kbd>Enter</kbd> or <kbd>o</kbd>\n </>\n ),\n },\n {\n action: (\n <>\n Expand content warning or\n <br />\n toggle expanded/collapsed thread\n </>\n ),\n keys: <kbd>x</kbd>,\n },\n {\n action: 'Close post or dialogs',\n keys: (\n <>\n <kbd>Esc</kbd> or <kbd>Backspace</kbd>\n </>\n ),\n },\n {\n action: 'Focus column in multi-column mode',\n keys: (\n <>\n <kbd>1</kbd> to <kbd>9</kbd>\n </>\n ),\n },\n {\n action: 'Compose new post',\n keys: <kbd>c</kbd>,\n },\n {\n action: 'Compose new post (new window)',\n className: 'insignificant',\n keys: (\n <>\n <kbd>Shift</kbd> + <kbd>c</kbd>\n </>\n ),\n },\n {\n action: 'Send post',\n keys: (\n <>\n <kbd>Ctrl</kbd> + <kbd>Enter</kbd> or <kbd>⌘</kbd> +{' '}\n <kbd>Enter</kbd>\n </>\n ),\n },\n {\n action: 'Search',\n keys: <kbd>/</kbd>,\n },\n {\n action: 'Reply',\n keys: <kbd>r</kbd>,\n },\n {\n action: 'Reply (new window)',\n className: 'insignificant',\n keys: (\n <>\n <kbd>Shift</kbd> + <kbd>r</kbd>\n </>\n ),\n },\n {\n action: 'Like (favourite)',\n keys: (\n <>\n <kbd>l</kbd> or <kbd>f</kbd>\n </>\n ),\n },\n {\n action: 'Boost',\n keys: (\n <>\n <kbd>Shift</kbd> + <kbd>b</kbd>\n </>\n ),\n },\n {\n action: 'Bookmark',\n keys: <kbd>d</kbd>,\n },\n {\n action: 'Toggle Cloak mode',\n keys: (\n <>\n <kbd>Shift</kbd> + <kbd>Alt</kbd> + <kbd>k</kbd>\n </>\n ),\n },\n ].map(({ action, className, keys }) => (\n <tr key={action}>\n <th class={className}>{action}</th>\n <td>{keys}</td>\n </tr>\n ))}\n </table>\n </main>\n </div>\n </Modal>\n )\n );\n});\n","/**\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 roots 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 parents 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","import './accounts.css';\n\nimport { useAutoAnimate } from '@formkit/auto-animate/preact';\nimport { Menu, MenuDivider, MenuItem } from '@szhsin/react-menu';\nimport { useReducer } from 'preact/hooks';\n\nimport Avatar from '../components/avatar';\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport Menu2 from '../components/menu2';\nimport MenuConfirm from '../components/menu-confirm';\nimport NameText from '../components/name-text';\nimport { api } from '../utils/api';\nimport states from '../utils/states';\nimport store from '../utils/store';\nimport { getCurrentAccountID, setCurrentAccountID } from '../utils/store-utils';\n\nfunction Accounts({ onClose }) {\n const { masto } = api();\n // Accounts\n const accounts = store.local.getJSON('accounts');\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\" />\n </button>\n )}\n <header class=\"header-grid\">\n <h2>Accounts</h2>\n </header>\n <main>\n <section>\n <ul class=\"accounts-list\" ref={accountsListParent}>\n {accounts.map((account, i) => {\n const isCurrent = account.info.id === currentAccount;\n const isDefault = i === 0; // first account is always default\n return (\n <li key={account.info.id}>\n <div>\n {moreThanOneAccount && (\n <span class={`current ${isCurrent ? 'is-current' : ''}`}>\n <Icon icon=\"check-circle\" alt=\"Current\" />\n </span>\n )}\n <Avatar\n url={account.info.avatarStatic}\n size=\"xxl\"\n onDblClick={async () => {\n if (isCurrent) {\n try {\n const info = await masto.v1.accounts\n .$select(account.info.id)\n .fetch();\n console.log('fetched account info', info);\n account.info = info;\n store.local.setJSON('accounts', accounts);\n reload();\n } catch (e) {}\n }\n }}\n />\n <NameText\n account={\n moreThanOneAccount\n ? {\n ...account.info,\n acct: /@/.test(account.info.acct)\n ? account.info.acct\n : `${account.info.acct}@${account.instanceURL}`,\n }\n : account.info\n }\n showAcct\n onClick={() => {\n if (isCurrent) {\n states.showAccount = `${account.info.username}@${account.instanceURL}`;\n } else {\n setCurrentAccountID(account.info.id);\n location.reload();\n }\n }}\n />\n </div>\n <div class=\"actions\">\n {isDefault && moreThanOneAccount && (\n <>\n <span class=\"tag\">Default</span>{' '}\n </>\n )}\n <Menu2\n align=\"end\"\n menuButton={\n <button\n type=\"button\"\n title=\"More\"\n class=\"plain more-button\"\n >\n <Icon icon=\"more\" size=\"l\" alt=\"More\" />\n </button>\n }\n >\n <MenuItem\n onClick={() => {\n states.showAccount = `${account.info.username}@${account.instanceURL}`;\n }}\n >\n <Icon icon=\"user\" />\n <span>View profile…</span>\n </MenuItem>\n <MenuDivider />\n {moreThanOneAccount && (\n <MenuItem\n disabled={isDefault}\n onClick={() => {\n // Move account to the top of the list\n accounts.splice(i, 1);\n accounts.unshift(account);\n store.local.setJSON('accounts', accounts);\n reload();\n }}\n >\n <Icon icon=\"check-circle\" />\n <span>Set as default</span>\n </MenuItem>\n )}\n <MenuConfirm\n subMenu\n confirmLabel={\n <>\n <Icon icon=\"exit\" />\n <span>Log out @{account.info.acct}?</span>\n </>\n }\n disabled={!isCurrent}\n menuItemClassName=\"danger\"\n onClick={() => {\n // const yes = confirm('Log out?');\n // if (!yes) return;\n accounts.splice(i, 1);\n store.local.setJSON('accounts', accounts);\n // location.reload();\n location.href = location.pathname || '/';\n }}\n >\n <Icon icon=\"exit\" />\n <span>Log out…</span>\n </MenuConfirm>\n </Menu2>\n </div>\n </li>\n );\n })}\n </ul>\n <p>\n <Link to=\"/login\" class=\"button plain2\" onClick={onClose}>\n <Icon icon=\"plus\" /> <span>Add an existing account</span>\n </Link>\n </p>\n {moreThanOneAccount && (\n <p>\n <small>\n Note: <i>Default</i> account will always be used for first load.\n Switched accounts will persist during the session.\n </small>\n </p>\n )}\n </section>\n </main>\n </div>\n );\n}\n\nexport default Accounts;\n","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20xml:space='preserve'%20fill-rule='evenodd'%20stroke-linejoin='round'%20stroke-miterlimit='2'%20clip-rule='evenodd'%20viewBox='0%200%2064%2064'%3e%3cpath%20fill='none'%20d='M0%200h63.994v63.994H0z'/%3e%3cpath%20fill='%23a4bff7'%20d='M37.774%2011.471c14.639%203.752%2019.034%2016.557%2015.889%2031.304-.696%203.261-2.563%206.661-6.356%208.693-3.204%201.717-8.07%202.537-15.338.55l-9.634-2.404C11.651%2046.992%208.378%2038.733%2010.027%2031.823c3.627-15.201%2015.543-23.48%2027.747-20.352Z'/%3e%3cpath%20fill='%23d8e7fe'%20d='M36.76%2015.429c12.289%203.15%2015.547%2014.114%2012.907%2026.493-.947%204.44-4.937%209.365-16.664%206.143l-9.684-2.417c-7.854-1.923-10.53-7.8-9.318-12.877%203.016-12.639%2012.611-19.943%2022.759-17.342Z'/%3e%3cpath%20fill='%236081e6'%20d='M27.471%2024.991c-1.457-.698-7.229%203.213-7.663%208.926-.182%202.39%204.55%203.237%205.071-.169.725-4.743%203.715-8.218%202.592-8.757Zm10.746%202.005c-2.083.327-.382%205.901-.595%2010.727-.123%202.8%204.388%203.464%204.703%202.011%201.098-5.073-2.066-13.058-4.108-12.738Z'/%3e%3c/svg%3e\"","// Utils for push notifications\nimport { api } from './api';\nimport { getCurrentAccount } from './store-utils';\n\n// Subscription is an object with the following structure:\n// {\n// data: {\n// alerts: {\n// admin: {\n// report: boolean,\n// signUp: boolean,\n// },\n// favourite: boolean,\n// follow: boolean,\n// mention: boolean,\n// poll: boolean,\n// reblog: boolean,\n// status: boolean,\n// update: boolean,\n// }\n// },\n// policy: \"all\" | \"followed\" | \"follower\" | \"none\",\n// subscription: {\n// endpoint: string,\n// keys: {\n// auth: string,\n// p256dh: string,\n// },\n// },\n// }\n\n// Back-end CRUD\n// =============\n\nfunction createBackendPushSubscription(subscription) {\n const { masto } = api();\n return masto.v1.push.subscription.create(subscription);\n}\n\nfunction fetchBackendPushSubscription() {\n const { masto } = api();\n return masto.v1.push.subscription.fetch();\n}\n\nfunction updateBackendPushSubscription(subscription) {\n const { masto } = api();\n return masto.v1.push.subscription.update(subscription);\n}\n\nfunction removeBackendPushSubscription() {\n const { masto } = api();\n return masto.v1.push.subscription.remove();\n}\n\n// Front-end\n// =========\n\nexport function isPushSupported() {\n return 'serviceWorker' in navigator && 'PushManager' in window;\n}\n\nexport function getRegistration() {\n // return navigator.serviceWorker.ready;\n return navigator.serviceWorker.getRegistration();\n}\n\nasync function getSubscription() {\n const registration = await getRegistration();\n const subscription = registration\n ? await registration.pushManager.getSubscription()\n : undefined;\n return { registration, subscription };\n}\n\nfunction urlBase64ToUint8Array(base64String) {\n const padding = '='.repeat((4 - (base64String.length % 4)) % 4);\n const base64 = `${base64String}${padding}`\n .replace(/-/g, '+')\n .replace(/_/g, '/');\n\n const rawData = window.atob(base64);\n const outputArray = new Uint8Array(rawData.length);\n\n for (let i = 0; i < rawData.length; ++i) {\n outputArray[i] = rawData.charCodeAt(i);\n }\n\n return outputArray;\n}\n\n// Front-end <-> back-end\n// ======================\n\nexport async function initSubscription() {\n if (!isPushSupported()) return;\n const { subscription } = await getSubscription();\n let backendSubscription = null;\n try {\n backendSubscription = await fetchBackendPushSubscription();\n } catch (err) {\n if (/(not found|unknown)/i.test(err.message)) {\n // No subscription found\n } else {\n // Other error\n throw err;\n }\n }\n console.log('INIT subscription', {\n subscription,\n backendSubscription,\n });\n\n // Check if the subscription changed\n if (backendSubscription && subscription) {\n const sameEndpoint = backendSubscription.endpoint === subscription.endpoint;\n const { vapidKey } = getCurrentAccount();\n const sameKey = backendSubscription.serverKey === vapidKey;\n if (!sameEndpoint) {\n throw new Error('Backend subscription endpoint changed');\n }\n if (sameKey) {\n // Subscription didn't change\n } else {\n // Subscription changed\n console.error('🔔 Subscription changed', {\n sameEndpoint,\n serverKey: backendSubscription.serverKey,\n vapIdKey: vapidKey,\n endpoint1: backendSubscription.endpoint,\n endpoint2: subscription.endpoint,\n sameKey,\n key1: backendSubscription.serverKey,\n key2: vapidKey,\n });\n throw new Error('Backend subscription key and vapid key changed');\n // Only unsubscribe from backend, not from browser\n // await removeBackendPushSubscription();\n // // Now let's resubscribe\n // // NOTE: I have no idea if this works\n // return await updateSubscription({\n // data: backendSubscription.data,\n // policy: backendSubscription.policy,\n // });\n }\n }\n\n if (subscription && !backendSubscription) {\n // check if account's vapidKey is same as subscription's applicationServerKey\n const { vapidKey } = getCurrentAccount();\n 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 } = getCurrentAccount();\n if (!vapidKey) throw new Error('No server key found');\n subscription = await registration.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: urlBase64ToUint8Array(vapidKey),\n });\n backendSubscription = await createBackendPushSubscription({\n subscription,\n data,\n policy,\n });\n // TODO: save subscription in user settings\n }\n\n return { subscription, backendSubscription };\n}\n\nexport async function removeSubscription() {\n if (!isPushSupported()) return;\n const { subscription } = await getSubscription();\n if (subscription) {\n await removeBackendPushSubscription();\n await subscription.unsubscribe();\n }\n}\n","import './settings.css';\n\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport logo from '../assets/logo.svg';\n\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport RelativeTime from '../components/relative-time';\nimport targetLanguages from '../data/lingva-target-languages';\nimport { api } from '../utils/api';\nimport getTranslateTargetLanguage from '../utils/get-translate-target-language';\nimport localeCode2Text from '../utils/localeCode2Text';\nimport {\n initSubscription,\n isPushSupported,\n removeSubscription,\n updateSubscription,\n} from '../utils/push-notifications';\nimport showToast from '../utils/show-toast';\nimport states from '../utils/states';\nimport store from '../utils/store';\n\nconst DEFAULT_TEXT_SIZE = 16;\nconst TEXT_SIZES = [14, 15, 16, 17, 18, 19, 20];\nconst {\n PHANPY_WEBSITE: WEBSITE,\n PHANPY_PRIVACY_POLICY_URL: PRIVACY_POLICY_URL,\n PHANPY_IMG_ALT_API_URL: IMG_ALT_API_URL,\n PHANPY_GIPHY_API_KEY: GIPHY_API_KEY,\n} = import.meta.env;\n\nfunction Settings({ onClose }) {\n const snapStates = useSnapshot(states);\n const currentTheme = store.local.get('theme') || 'auto';\n const themeFormRef = useRef();\n const targetLanguage =\n snapStates.settings.contentTranslationTargetLanguage || null;\n const systemTargetLanguage = getTranslateTargetLanguage();\n const systemTargetLanguageText = localeCode2Text(systemTargetLanguage);\n const currentTextSize = store.local.get('textSize') || DEFAULT_TEXT_SIZE;\n\n const [prefs, setPrefs] = useState(store.account.get('preferences') || {});\n const { masto, authenticated, instance } = api();\n // Get preferences every time Settings is opened\n // NOTE: Disabled for now because I don't expect this to change often. Also for some reason, the /api/v1/preferences endpoint is cached for a while and return old prefs if refresh immediately after changing them.\n // useEffect(() => {\n // const { masto } = api();\n // (async () => {\n // try {\n // const preferences = await masto.v1.preferences.fetch();\n // setPrefs(preferences);\n // store.account.set('preferences', preferences);\n // } catch (e) {\n // // Silently fail\n // console.error(e);\n // }\n // })();\n // }, []);\n\n return (\n <div id=\"settings-container\" class=\"sheet\" tabIndex=\"-1\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" />\n </button>\n )}\n <header>\n <h2>Settings</h2>\n </header>\n <main>\n <section>\n <ul>\n <li>\n <div>\n <label>Appearance</label>\n </div>\n <div>\n <form\n ref={themeFormRef}\n onInput={(e) => {\n console.log(e);\n e.preventDefault();\n const formData = new FormData(themeFormRef.current);\n const theme = formData.get('theme');\n const html = document.documentElement;\n\n if (theme === 'auto') {\n html.classList.remove('is-light', 'is-dark');\n\n // Disable manual theme <meta>\n const $manualMeta = document.querySelector(\n 'meta[data-theme-setting=\"manual\"]',\n );\n if ($manualMeta) {\n $manualMeta.name = '';\n }\n // Enable auto theme <meta>s\n const $autoMetas = document.querySelectorAll(\n 'meta[data-theme-setting=\"auto\"]',\n );\n $autoMetas.forEach((m) => {\n m.name = 'theme-color';\n });\n } else {\n html.classList.toggle('is-light', theme === 'light');\n html.classList.toggle('is-dark', theme === 'dark');\n\n // Enable manual theme <meta>\n const $manualMeta = document.querySelector(\n 'meta[data-theme-setting=\"manual\"]',\n );\n if ($manualMeta) {\n $manualMeta.name = 'theme-color';\n $manualMeta.content =\n theme === 'light'\n ? $manualMeta.dataset.themeLightColor\n : $manualMeta.dataset.themeDarkColor;\n }\n // Disable auto theme <meta>s\n const $autoMetas = document.querySelectorAll(\n 'meta[data-theme-setting=\"auto\"]',\n );\n $autoMetas.forEach((m) => {\n m.name = '';\n });\n }\n document\n .querySelector('meta[name=\"color-scheme\"]')\n .setAttribute(\n 'content',\n theme === 'auto' ? 'dark light' : theme,\n );\n\n if (theme === 'auto') {\n store.local.del('theme');\n } else {\n store.local.set('theme', theme);\n }\n }}\n >\n <div class=\"radio-group\">\n <label>\n <input\n type=\"radio\"\n name=\"theme\"\n value=\"light\"\n defaultChecked={currentTheme === 'light'}\n />\n <span>Light</span>\n </label>\n <label>\n <input\n type=\"radio\"\n name=\"theme\"\n value=\"dark\"\n defaultChecked={currentTheme === 'dark'}\n />\n <span>Dark</span>\n </label>\n <label>\n <input\n type=\"radio\"\n name=\"theme\"\n value=\"auto\"\n defaultChecked={\n currentTheme !== 'light' && currentTheme !== 'dark'\n }\n />\n <span>Auto</span>\n </label>\n </div>\n </form>\n </div>\n </li>\n <li>\n <div>\n <label>Text size</label>\n </div>\n <div class=\"range-group\">\n <span style={{ fontSize: TEXT_SIZES[0] }}>A</span>{' '}\n <input\n type=\"range\"\n min={TEXT_SIZES[0]}\n max={TEXT_SIZES[TEXT_SIZES.length - 1]}\n step=\"1\"\n value={currentTextSize}\n list=\"sizes\"\n onChange={(e) => {\n const value = parseInt(e.target.value, 10);\n const html = document.documentElement;\n // set CSS variable\n html.style.setProperty('--text-size', `${value}px`);\n // save to local storage\n if (value === DEFAULT_TEXT_SIZE) {\n store.local.del('textSize');\n } else {\n store.local.set('textSize', e.target.value);\n }\n }}\n />{' '}\n <span style={{ fontSize: TEXT_SIZES[TEXT_SIZES.length - 1] }}>\n A\n </span>\n <datalist id=\"sizes\">\n {TEXT_SIZES.map((size) => (\n <option value={size} />\n ))}\n </datalist>\n </div>\n </li>\n </ul>\n </section>\n {authenticated && (\n <>\n <h3>Posting</h3>\n <section>\n <ul>\n <li>\n <div>\n <label for=\"posting-privacy-field\">\n Default visibility{' '}\n <Icon icon=\"cloud\" alt=\"Synced\" class=\"synced-icon\" />\n </label>\n </div>\n <div>\n <select\n id=\"posting-privacy-field\"\n value={prefs['posting:default:visibility'] || 'public'}\n onChange={(e) => {\n const { value } = e.target;\n (async () => {\n try {\n await masto.v1.accounts.updateCredentials({\n source: {\n privacy: value,\n },\n });\n setPrefs({\n ...prefs,\n 'posting:default:visibility': value,\n });\n store.account.set('preferences', {\n ...prefs,\n 'posting:default:visibility': value,\n });\n } catch (e) {\n alert('Failed to update posting privacy');\n console.error(e);\n }\n })();\n }}\n >\n <option value=\"public\">Public</option>\n <option value=\"unlisted\">Unlisted</option>\n <option value=\"private\">Followers only</option>\n </select>\n </div>\n </li>\n </ul>\n </section>\n <p class=\"section-postnote\">\n <Icon icon=\"cloud\" alt=\"Synced\" class=\"synced-icon\" />{' '}\n <small>\n Synced to your instance server's settings.{' '}\n <a\n href={`https://${instance}/`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Go to your instance ({instance}) for more settings.\n </a>\n </small>\n </p>\n </>\n )}\n <h3>Experiments</h3>\n <section>\n <ul>\n <li>\n <label>\n <input\n type=\"checkbox\"\n checked={snapStates.settings.autoRefresh}\n onChange={(e) => {\n states.settings.autoRefresh = e.target.checked;\n }}\n />{' '}\n Auto refresh timeline posts\n </label>\n </li>\n <li>\n <label>\n <input\n type=\"checkbox\"\n checked={snapStates.settings.boostsCarousel}\n onChange={(e) => {\n states.settings.boostsCarousel = e.target.checked;\n }}\n />{' '}\n Boosts carousel\n </label>\n </li>\n <li>\n <label>\n <input\n type=\"checkbox\"\n checked={snapStates.settings.contentTranslation}\n onChange={(e) => {\n const { checked } = e.target;\n states.settings.contentTranslation = checked;\n if (!checked) {\n states.settings.contentTranslationTargetLanguage = null;\n }\n }}\n />{' '}\n Post translation\n </label>\n <div\n class={`sub-section ${\n !snapStates.settings.contentTranslation\n ? 'more-insignificant'\n : ''\n }`}\n >\n <div>\n <label>\n Translate to{' '}\n <select\n value={targetLanguage || ''}\n disabled={!snapStates.settings.contentTranslation}\n onChange={(e) => {\n states.settings.contentTranslationTargetLanguage =\n e.target.value || null;\n }}\n >\n <option value=\"\">\n System language ({systemTargetLanguageText})\n </option>\n <option disabled>──────────</option>\n {targetLanguages.map((lang) => (\n <option value={lang.code}>{lang.name}</option>\n ))}\n </select>\n </label>\n </div>\n <hr />\n <p class=\"checkbox-fieldset\">\n Hide \"Translate\" button for\n {snapStates.settings.contentTranslationHideLanguages.length >\n 0 && (\n <>\n {' '}\n (\n {\n snapStates.settings.contentTranslationHideLanguages\n .length\n }\n )\n </>\n )}\n :\n <div class=\"checkbox-fields\">\n {targetLanguages.map((lang) => (\n <label>\n <input\n type=\"checkbox\"\n checked={snapStates.settings.contentTranslationHideLanguages.includes(\n lang.code,\n )}\n onChange={(e) => {\n const { checked } = e.target;\n if (checked) {\n states.settings.contentTranslationHideLanguages.push(\n lang.code,\n );\n } else {\n states.settings.contentTranslationHideLanguages =\n snapStates.settings.contentTranslationHideLanguages.filter(\n (code) => code !== lang.code,\n );\n }\n }}\n />{' '}\n {lang.name}\n </label>\n ))}\n </div>\n </p>\n <p class=\"insignificant\">\n <small>\n Note: This feature uses external translation services,\n powered by{' '}\n <a\n href=\"https://github.com/cheeaun/lingva-api\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Lingva API\n </a>{' '}\n &amp;{' '}\n <a\n href=\"https://github.com/thedaviddelta/lingva-translate\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Lingva Translate\n </a>\n .\n </small>\n </p>\n <hr />\n <div>\n <label>\n <input\n type=\"checkbox\"\n checked={snapStates.settings.contentTranslationAutoInline}\n disabled={!snapStates.settings.contentTranslation}\n onChange={(e) => {\n states.settings.contentTranslationAutoInline =\n e.target.checked;\n }}\n />{' '}\n Auto inline translation\n </label>\n <p class=\"insignificant\">\n <small>\n Automatically show translation for posts in timeline. Only\n works for <b>short</b> posts without content warning,\n media and poll.\n </small>\n </p>\n </div>\n </div>\n </li>\n {!!GIPHY_API_KEY && authenticated && (\n <li>\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 GIF Picker for composer\n </label>\n <div class=\"sub-section insignificant\">\n <small>\n Note: This feature uses external GIF search service, powered\n by{' '}\n <a\n href=\"https://developers.giphy.com/\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\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 information\n will still reach their servers.\n </small>\n </div>\n </li>\n )}\n {!!IMG_ALT_API_URL && authenticated && (\n <li>\n <label>\n <input\n type=\"checkbox\"\n checked={snapStates.settings.mediaAltGenerator}\n onChange={(e) => {\n states.settings.mediaAltGenerator = e.target.checked;\n }}\n />{' '}\n Image description generator{' '}\n <Icon icon=\"sparkles2\" class=\"more-insignificant\" />\n </label>\n <div class=\"sub-section insignificant\">\n <small>Only for new images while composing new posts.</small>\n </div>\n <div class=\"sub-section insignificant\">\n <small>\n Note: This feature uses external AI service, powered by{' '}\n <a\n href=\"https://github.com/cheeaun/img-alt-api\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n img-alt-api\n </a>\n . May not work well. Only for images and in English.\n </small>\n </div>\n </li>\n )}\n {authenticated && (\n <li>\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 \"Cloud\" import/export for shortcuts settings{' '}\n <Icon icon=\"cloud\" class=\"more-insignificant\" />\n </label>\n <div class=\"sub-section insignificant\">\n <small>\n ⚠️⚠️⚠️ Very experimental.\n <br />\n Stored in your own profiles notes. Profile (private) notes\n are mainly used for other profiles, and hidden for own\n profile.\n </small>\n </div>\n <div class=\"sub-section insignificant\">\n <small>\n Note: This feature uses currently-logged-in instance server\n API.\n </small>\n </div>\n </li>\n )}\n <li>\n <label>\n <input\n type=\"checkbox\"\n checked={snapStates.settings.cloakMode}\n onChange={(e) => {\n states.settings.cloakMode = e.target.checked;\n }}\n />{' '}\n Cloak mode{' '}\n <span class=\"insignificant\">\n (<samp>Text</samp> → <samp>████</samp>)\n </span>\n </label>\n <div class=\"sub-section insignificant\">\n <small>\n Replace text as blocks, useful when taking screenshots, for\n privacy reasons.\n </small>\n </div>\n </li>\n {authenticated && (\n <li>\n <button\n type=\"button\"\n class=\"light\"\n onClick={() => {\n states.showDrafts = true;\n states.showSettings = false;\n }}\n >\n Unsent drafts\n </button>\n </li>\n )}\n </ul>\n </section>\n {authenticated && <PushNotificationsSection onClose={onClose} />}\n <h3>About</h3>\n <section>\n <div\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n gap: 8,\n lineHeight: 1.25,\n alignItems: 'center',\n marginTop: 8,\n }}\n >\n <img\n src={logo}\n alt=\"\"\n width=\"64\"\n height=\"64\"\n style={{\n aspectRatio: '1/1',\n verticalAlign: 'middle',\n background: '#b7cdf9',\n borderRadius: 12,\n }}\n />\n <div>\n <b>Phanpy</b>{' '}\n <a\n href=\"https://hachyderm.io/@phanpy\"\n // target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={(e) => {\n e.preventDefault();\n states.showAccount = 'phanpy@hachyderm.io';\n }}\n >\n @phanpy\n </a>\n <br />\n <a\n href=\"https://github.com/cheeaun/phanpy\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Built\n </a>{' '}\n by{' '}\n <a\n href=\"https://mastodon.social/@cheeaun\"\n // target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={(e) => {\n e.preventDefault();\n states.showAccount = 'cheeaun@mastodon.social';\n }}\n >\n @cheeaun\n </a>\n </div>\n </div>\n <p>\n <a\n href=\"https://github.com/sponsors/cheeaun\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Sponsor\n </a>{' '}\n &middot;{' '}\n <a\n href=\"https://www.buymeacoffee.com/cheeaun\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Donate\n </a>{' '}\n &middot;{' '}\n <a\n href={PRIVACY_POLICY_URL}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Privacy Policy\n </a>\n </p>\n {__BUILD_TIME__ && (\n <p>\n {WEBSITE && (\n <>\n <span class=\"insignificant\">Site:</span>{' '}\n {WEBSITE.replace(/https?:\\/\\//g, '').replace(/\\/$/, '')}\n <br />\n </>\n )}\n <span class=\"insignificant\">Version:</span>{' '}\n <input\n type=\"text\"\n class=\"version-string\"\n readOnly\n size=\"18\" // Manually calculated here\n value={`${__BUILD_TIME__.slice(0, 10).replace(/-/g, '.')}${\n __COMMIT_HASH__ ? `.${__COMMIT_HASH__}` : ''\n }`}\n onClick={(e) => {\n e.target.select();\n // Copy to clipboard\n try {\n navigator.clipboard.writeText(e.target.value);\n showToast('Version string copied');\n } catch (e) {\n console.warn(e);\n showToast('Unable to copy version string');\n }\n }}\n />{' '}\n {!__FAKE_COMMIT_HASH__ && (\n <span class=\"ib insignificant\">\n (\n <a\n href={`https://github.com/cheeaun/phanpy/commit/${__COMMIT_HASH__}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <RelativeTime datetime={new Date(__BUILD_TIME__)} />\n </a>\n )\n </span>\n )}\n </p>\n )}\n </section>\n </main>\n </div>\n );\n}\n\nfunction PushNotificationsSection({ onClose }) {\n if (!isPushSupported()) return null;\n\n const { instance } = api();\n const [uiState, setUIState] = useState('default');\n const pushFormRef = useRef();\n const [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.keys(alerts).forEach((alert) => {\n const el = elements.namedItem(alert);\n if (el?.type === 'checkbox') {\n el.checked = true;\n }\n });\n }\n setUIState('default');\n } catch (err) {\n console.warn(err);\n if (/outside.*authorized/i.test(err.message)) {\n setNeedRelogin(true);\n } else {\n alert(err?.message || err);\n }\n setUIState('error');\n }\n })();\n }, []);\n\n const isLoading = uiState === 'loading';\n\n return (\n <form\n ref={pushFormRef}\n onChange={() => {\n 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('Failed to update subscription. Please try again.');\n });\n } else {\n updateSubscription(params).catch((err) => {\n console.warn(err);\n alert('Failed to update subscription. Please try again.');\n });\n }\n } else {\n removeSubscription().catch((err) => {\n console.warn(err);\n alert('Failed to remove subscription. Please try again.');\n });\n }\n }, 100);\n }}\n >\n <h3>Push Notifications (beta)</h3>\n <section>\n <ul>\n <li>\n <label>\n <input\n type=\"checkbox\"\n disabled={isLoading || needRelogin}\n name=\"policy-allow\"\n checked={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 'Push notifications are blocked. Please enable them in your browser settings.',\n );\n }\n }\n } else {\n setAllowNotifications(false);\n }\n }}\n />{' '}\n Allow from{' '}\n <select\n name=\"policy\"\n disabled={isLoading || needRelogin || !allowNotifications}\n >\n {[\n {\n value: 'all',\n label: 'anyone',\n },\n {\n value: 'followed',\n label: 'people I follow',\n },\n {\n value: 'follower',\n label: 'followers',\n },\n ].map((type) => (\n <option value={type.value}>{type.label}</option>\n ))}\n </select>\n </label>\n <div\n class=\"shazam-container no-animation\"\n style={{\n width: '100%',\n }}\n hidden={!allowNotifications}\n >\n <div class=\"shazam-container-inner\">\n <div class=\"sub-section\">\n <ul>\n {[\n {\n value: 'mention',\n label: 'Mentions',\n },\n {\n value: 'favourite',\n label: 'Likes',\n },\n {\n value: 'reblog',\n label: 'Boosts',\n },\n {\n value: 'follow',\n label: 'Follows',\n },\n {\n value: 'followRequest',\n label: 'Follow requests',\n },\n {\n value: 'poll',\n label: 'Polls',\n },\n {\n value: 'update',\n label: 'Post edits',\n },\n {\n value: 'status',\n label: 'New posts',\n },\n ].map((alert) => (\n <li>\n <label>\n <input type=\"checkbox\" name={alert.value} />{' '}\n {alert.label}\n </label>\n </li>\n ))}\n </ul>\n </div>\n </div>\n </div>\n {needRelogin && (\n <div class=\"sub-section\">\n <p>\n Push permission was not granted since your last login. You'll\n need to{' '}\n <Link to={`/login?instance=${instance}`} onClick={onClose}>\n <b>log in</b> again to grant push permission\n </Link>\n .\n </p>\n </div>\n )}\n </li>\n </ul>\n </section>\n <p class=\"section-postnote\">\n <small>\n NOTE: Push notifications only work for <b>one account</b>.\n </small>\n </p>\n </form>\n );\n}\n\nexport default Settings;\n","const focusDeck = () => {\n let timer = setTimeout(() => {\n const columns = document.getElementById('columns');\n if (columns) {\n // Focus first column\n // columns.querySelector('.deck-container')?.focus?.();\n } else {\n const modals = document.querySelectorAll('#modal-container > *');\n if (modals?.length) {\n // Focus last modal\n const modal = modals[modals.length - 1]; // last one\n const modalFocusElement =\n modal.querySelector('[tabindex=\"-1\"]') || modal;\n if (modalFocusElement) {\n modalFocusElement.focus();\n return;\n }\n }\n const backDrop = document.querySelector('.deck-backdrop');\n if (backDrop) return;\n // Focus last deck\n const pages = document.querySelectorAll('.deck-container');\n const page = pages[pages.length - 1]; // last one\n if (page && page.tabIndex === -1) {\n console.log('FOCUS', page);\n page.focus();\n }\n }\n }, 100);\n return () => clearTimeout(timer);\n};\n\nexport default focusDeck;\n","import { useEffect, useRef } from 'preact/hooks';\nimport { useLocation } from 'react-router-dom';\n\n// Hook that runs a callback when the location changes\n// Won't run on the first render\n\nexport default function useLocationChange(fn) {\n if (!fn) return;\n const location = useLocation();\n const currentLocationRef = useRef(location.pathname);\n useEffect(() => {\n // console.log('location', {\n // current: currentLocationRef.current,\n // next: location.pathname,\n // });\n if (\n currentLocationRef.current &&\n location.pathname !== currentLocationRef.current\n ) {\n fn?.();\n }\n }, [location.pathname, fn]);\n}\n","import { 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 { 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 MenuConfirm from './menu-confirm';\n\nfunction ListAddEdit({ list, onClose }) {\n const { masto } = api();\n const [uiState, setUIState] = useState('default');\n const editMode = !!list;\n const nameFieldRef = useRef();\n const repliesPolicyFieldRef = useRef();\n const exclusiveFieldRef = useRef();\n useEffect(() => {\n if (editMode) {\n nameFieldRef.current.value = list.title;\n repliesPolicyFieldRef.current.value = list.repliesPolicy;\n if (exclusiveFieldRef.current) {\n exclusiveFieldRef.current.checked = list.exclusive;\n }\n }\n }, [editMode]);\n const supportsExclusive = supports('@mastodon/list-exclusive');\n\n return (\n <div class=\"sheet\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" />\n </button>\n )}{' '}\n <header>\n <h2>{editMode ? 'Edit list' : 'New list'}</h2>\n </header>\n <main>\n <form\n class=\"list-form\"\n onSubmit={(e) => {\n e.preventDefault(); // Get form values\n\n const formData = new FormData(e.target);\n const title = formData.get('title');\n const repliesPolicy = formData.get('replies_policy');\n const exclusive = formData.get('exclusive') === 'on';\n console.log({\n title,\n repliesPolicy,\n exclusive,\n });\n setUIState('loading');\n\n (async () => {\n try {\n let listResult;\n\n if (editMode) {\n listResult = await masto.v1.lists.$select(list.id).update({\n title,\n replies_policy: repliesPolicy,\n exclusive,\n });\n } else {\n listResult = await masto.v1.lists.create({\n title,\n replies_policy: repliesPolicy,\n exclusive,\n });\n }\n\n console.log(listResult);\n setUIState('default');\n onClose?.({\n state: 'success',\n list: listResult,\n });\n\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 ? 'Unable to edit list.' : 'Unable to create list.',\n );\n }\n })();\n }}\n >\n <div class=\"list-form-row\">\n <label for=\"list-title\">\n Name{' '}\n <input\n ref={nameFieldRef}\n type=\"text\"\n id=\"list-title\"\n name=\"title\"\n required\n disabled={uiState === 'loading'}\n dir=\"auto\"\n />\n </label>\n </div>\n <div class=\"list-form-row\">\n <select\n ref={repliesPolicyFieldRef}\n name=\"replies_policy\"\n required\n disabled={uiState === 'loading'}\n >\n <option value=\"list\">Show replies to list members</option>\n <option value=\"followed\">Show replies to people I follow</option>\n <option value=\"none\">Don't show replies</option>\n </select>\n </div>\n {supportsExclusive && (\n <div class=\"list-form-row\">\n <label class=\"label-block\">\n <input\n ref={exclusiveFieldRef}\n type=\"checkbox\"\n name=\"exclusive\"\n disabled={uiState === 'loading'}\n />{' '}\n Hide posts on this list from Home/Following\n </label>\n </div>\n )}\n <div class=\"list-form-footer\">\n <button type=\"submit\" disabled={uiState === 'loading'}>\n {editMode ? 'Save' : 'Create'}\n </button>\n {editMode && (\n <MenuConfirm\n disabled={uiState === 'loading'}\n align=\"end\"\n menuItemClassName=\"danger\"\n confirmLabel=\"Delete this list?\"\n onClick={() => {\n // const yes = confirm('Delete this list?');\n // if (!yes) return;\n setUIState('loading');\n\n (async () => {\n try {\n await masto.v1.lists.$select(list.id).remove();\n setUIState('default');\n onClose?.({\n state: 'deleted',\n });\n setTimeout(() => {\n deleteListStore(list.id);\n }, 1);\n } catch (e) {\n console.error(e);\n setUIState('error');\n alert('Unable to delete list.');\n }\n })();\n }}\n >\n <button\n type=\"button\"\n class=\"light danger\"\n disabled={uiState === 'loading'}\n >\n Delete…\n </button>\n </MenuConfirm>\n )}\n </div>\n </form>\n </main>\n </div>\n );\n}\n\nexport default ListAddEdit;\n","import './account-info.css';\n\nimport { 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 { getLists } from '../utils/lists';\nimport niceDateTime from '../utils/nice-date-time';\nimport pmem from '../utils/pmem';\nimport shortenNumber from '../utils/shorten-number';\nimport showCompose from '../utils/show-compose';\nimport showToast from '../utils/show-toast';\nimport states, { hideAllModals } from '../utils/states';\nimport store from '../utils/store';\nimport { getCurrentAccountID, updateAccount } 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 Menu2 from './menu2';\nimport MenuConfirm from './menu-confirm';\nimport MenuLink from './menu-link';\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 0, // forever\n];\nconst MUTE_DURATIONS_LABELS = {\n 0: 'Forever',\n 300: '5 minutes',\n 1_800: '30 minutes',\n 3_600: '1 hour',\n 21_600: '6 hours',\n 86_400: '1 day',\n 259_200: '3 days',\n 604_800: '1 week',\n};\n\nconst LIMIT = 80;\n\nconst ACCOUNT_INFO_MAX_AGE = 1000 * 60 * 10; // 10 mins\n\nfunction fetchFamiliarFollowers(currentID, masto) {\n return masto.v1.accounts.familiarFollowers.fetch({\n id: [currentID],\n });\n}\nconst memFetchFamiliarFollowers = pmem(fetchFamiliarFollowers, {\n maxAge: ACCOUNT_INFO_MAX_AGE,\n});\n\nasync function fetchPostingStats(accountID, masto) {\n const fetchStatuses = masto.v1.accounts\n .$select(accountID)\n .statuses.list({\n limit: 20,\n })\n .next();\n\n const { value: statuses } = await fetchStatuses;\n console.log('fetched statuses', statuses);\n const stats = {\n total: statuses.length,\n originals: 0,\n replies: 0,\n boosts: 0,\n };\n // Categories statuses by type\n // - Original posts (not replies to others)\n // - Threads (self-replies + 1st original post)\n // - Boosts (reblogs)\n // - Replies (not-self replies)\n statuses.forEach((status) => {\n if (status.reblog) {\n stats.boosts++;\n } else if (\n !!status.inReplyToId &&\n status.inReplyToAccountId !== status.account.id // Not self-reply\n ) {\n stats.replies++;\n } else {\n stats.originals++;\n }\n });\n\n // Count days since last post\n if (statuses.length) {\n stats.daysSinceLastPost = Math.ceil(\n (Date.now() - new Date(statuses[statuses.length - 1].createdAt)) /\n 86400000,\n );\n }\n\n console.log('posting stats', stats);\n return stats;\n}\nconst memFetchPostingStats = pmem(fetchPostingStats, {\n maxAge: ACCOUNT_INFO_MAX_AGE,\n});\n\nfunction AccountInfo({\n account,\n fetchAccount = () => {},\n standalone,\n instance,\n authenticated,\n}) {\n const { masto } = api({\n instance,\n });\n const { masto: currentMasto, instance: currentInstance } = api();\n const [uiState, setUIState] = useState('default');\n const isString = typeof account === 'string';\n const [info, setInfo] = useState(isString ? null : account);\n\n const sameCurrentInstance = useMemo(\n () => instance === currentInstance,\n [instance, currentInstance],\n );\n\n useEffect(() => {\n if (!isString) {\n setInfo(account);\n return;\n }\n setUIState('loading');\n (async () => {\n try {\n const info = await fetchAccount();\n states.accounts[`${info.id}@${instance}`] = info;\n setInfo(info);\n setUIState('default');\n } catch (e) {\n console.error(e);\n setInfo(null);\n setUIState('error');\n }\n })();\n }, [isString, account, fetchAccount]);\n\n const {\n acct,\n avatar,\n avatarStatic,\n bot,\n createdAt,\n displayName,\n emojis,\n fields,\n followersCount,\n followingCount,\n group,\n // header,\n // headerStatic,\n id,\n lastStatusAt,\n locked,\n note,\n statusesCount,\n url,\n username,\n memorial,\n moved,\n roles,\n 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 = store.local.getJSON('accounts');\n let updated = false;\n accounts.forEach((account) => {\n if (account.info.id === info.id && account.instanceURL === instance) {\n account.info = info;\n updated = true;\n }\n });\n if (updated) {\n console.log('Updated account info', info);\n store.local.setJSON('accounts', accounts);\n }\n }\n }, [isSelf, info, instance]);\n\n const accountInstance = useMemo(() => {\n if (!url) return null;\n const domain = punycode.toUnicode(URL.parse(url).hostname);\n return domain;\n }, [url]);\n\n const [headerCornerColors, setHeaderCornerColors] = useState([]);\n\n const followersIterator = useRef();\n const familiarFollowersCache = useRef([]);\n async function fetchFollowers(firstLoad) {\n if (firstLoad || !followersIterator.current) {\n followersIterator.current = masto.v1.accounts.$select(id).followers.list({\n limit: LIMIT,\n });\n }\n const results = await followersIterator.current.next();\n if (isSelf) return results;\n if (!sameCurrentInstance) return results;\n\n const { value } = results;\n let newValue = [];\n // On first load, fetch familiar followers, merge to top of results' `value`\n // Remove dups on every fetch\n if (firstLoad) {\n 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.$select(id).following.list({\n limit: LIMIT,\n });\n }\n const results = await followingIterator.current.next();\n return results;\n }\n\n const LinkOrDiv = standalone ? 'div' : Link;\n const accountLink = instance ? `/${instance}/a/${id}` : `/a/${id}`;\n\n const [familiarFollowers, setFamiliarFollowers] = useState([]);\n const [postingStats, setPostingStats] = useState();\n const [postingStatsUIState, setPostingStatsUIState] = useState('default');\n const hasPostingStats = !!postingStats?.total;\n\n const renderFamiliarFollowers = async (currentID) => {\n try {\n const followers = await memFetchFamiliarFollowers(\n currentID,\n currentMasto,\n );\n console.log('fetched familiar followers', followers);\n setFamiliarFollowers(\n followers[0].accounts.slice(0, FAMILIAR_FOLLOWERS_LIMIT),\n );\n } catch (e) {\n console.error(e);\n }\n };\n\n const renderPostingStats = async () => {\n if (!id) return;\n setPostingStatsUIState('loading');\n try {\n const stats = await memFetchPostingStats(id, masto);\n setPostingStats(stats);\n setPostingStatsUIState('default');\n } catch (e) {\n console.error(e);\n setPostingStatsUIState('error');\n }\n };\n\n const onRelationshipChange = useCallback(\n ({ relationship, currentID }) => {\n if (!relationship.following) {\n renderFamiliarFollowers(currentID);\n if (!standalone && statusesCount > 0) {\n // Only render posting stats if not standalone and has posts\n renderPostingStats();\n }\n }\n },\n [standalone, id, statusesCount],\n );\n\n 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 return (\n <div\n tabIndex=\"-1\"\n class={`account-container ${uiState === 'loading' ? 'skeleton' : ''}`}\n style={{\n '--header-color-1': headerCornerColors[0],\n '--header-color-2': headerCornerColors[1],\n '--header-color-3': headerCornerColors[2],\n '--header-color-4': headerCornerColors[3],\n }}\n >\n {uiState === 'error' && (\n <div class=\"ui-state\">\n <p>Unable to load account.</p>\n <p>\n <a\n href={isString ? account : url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Go to account page <Icon icon=\"external\" />\n </a>\n </p>\n </div>\n )}\n {uiState === 'loading' ? (\n <>\n <header>\n <AccountBlock avatarSize=\"xxxl\" skeleton />\n </header>\n <main>\n <div class=\"note\">\n <p>███████ ████ ████</p>\n <p>████ ████████ ██████ █████████ ████ ██</p>\n </div>\n <div class=\"account-metadata-box\">\n <div class=\"profile-metadata\">\n <div class=\"profile-field\">\n <b class=\"more-insignificant\">███</b>\n <p>██████</p>\n </div>\n <div class=\"profile-field\">\n <b class=\"more-insignificant\">████</b>\n <p>███████████</p>\n </div>\n </div>\n <div class=\"stats\">\n <div>\n <span>██</span> Followers\n </div>\n <div>\n <span>██</span> Following\n </div>\n <div>\n <span>██</span> Posts\n </div>\n </div>\n </div>\n <div class=\"actions\">\n <span />\n <span class=\"buttons\">\n <button type=\"button\" title=\"More\" class=\"plain\" disabled>\n <Icon icon=\"more\" size=\"l\" alt=\"More\" />\n </button>\n </span>\n </div>\n </main>\n </>\n ) : (\n info && (\n <>\n {!!moved && (\n <div class=\"account-moved\">\n <p>\n <b>{displayName}</b> has indicated that their new account is\n now:\n </p>\n <AccountBlock\n account={moved}\n instance={instance}\n onClick={(e) => {\n e.stopPropagation();\n states.showAccount = moved;\n }}\n />\n </div>\n )}\n {!!header && !/missing\\.png$/.test(header) && (\n <img\n src={header}\n alt=\"\"\n class={`header-banner ${\n headerIsAvatar ? 'header-is-avatar' : ''\n }`}\n onError={(e) => {\n if (e.target.crossOrigin) {\n if (e.target.src !== headerStatic) {\n e.target.src = headerStatic;\n } else {\n e.target.removeAttribute('crossorigin');\n e.target.src = header;\n }\n } else if (e.target.src !== headerStatic) {\n e.target.src = headerStatic;\n } else {\n e.target.remove();\n }\n }}\n crossOrigin=\"anonymous\"\n onLoad={(e) => {\n e.target.classList.add('loaded');\n try {\n // Get color from four corners of image\n const canvas = 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 handle = `@${acct}`;\n try {\n navigator.clipboard.writeText(handle);\n showToast('Handle copied');\n } catch (e) {\n console.error(e);\n showToast('Unable to copy handle');\n }\n }}\n >\n <Icon icon=\"link\" />\n <span>Copy handle</span>\n </MenuItem>\n <MenuItem href={url} target=\"_blank\">\n <Icon icon=\"external\" />\n <span>Go to original profile page</span>\n </MenuItem>\n <MenuDivider />\n <MenuLink href={info.avatar} target=\"_blank\">\n <Icon icon=\"user\" />\n <span>View profile image</span>\n </MenuLink>\n <MenuLink href={info.header} target=\"_blank\">\n <Icon icon=\"media\" />\n <span>View profile header</span>\n </MenuLink>\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 && <span class=\"tag\">In Memoriam</span>}\n {!!bot && (\n <span class=\"tag\">\n <Icon icon=\"bot\" /> Automated\n </span>\n )}\n {!!group && (\n <span class=\"tag\">\n <Icon icon=\"group\" /> Group\n </span>\n )}\n {roles?.map((role) => (\n <span class=\"tag\">\n {role.name}\n {!!accountInstance && (\n <>\n {' '}\n <span class=\"more-insignificant\">{accountInstance}</span>\n </>\n )}\n </span>\n ))}\n <div\n class=\"note\"\n dir=\"auto\"\n onClick={handleContentLinks({\n instance: currentInstance,\n })}\n dangerouslySetInnerHTML={{\n __html: enhanceContent(note, { emojis }),\n }}\n />\n <div class=\"account-metadata-box\">\n {fields?.length > 0 && (\n <div class=\"profile-metadata\">\n {fields.map(({ name, value, verifiedAt }, i) => (\n <div\n class={`profile-field ${\n verifiedAt ? 'profile-verified' : ''\n }`}\n key={name + i}\n dir=\"auto\"\n >\n <b>\n <EmojiText text={name} emojis={emojis} />{' '}\n {!!verifiedAt && (\n <Icon icon=\"check-circle\" size=\"s\" />\n )}\n </b>\n <p\n dangerouslySetInnerHTML={{\n __html: enhanceContent(value, { emojis }),\n }}\n />\n </div>\n ))}\n </div>\n )}\n <div class=\"stats\">\n <LinkOrDiv\n tabIndex={0}\n to={accountLink}\n onClick={() => {\n // states.showAccount = false;\n setTimeout(() => {\n states.showGenericAccounts = {\n id: 'followers',\n heading: 'Followers',\n fetchAccounts: fetchFollowers,\n instance,\n excludeRelationshipAttrs: isSelf\n ? ['followedBy']\n : [],\n blankCopy: hideCollections\n ? '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 Followers\n </LinkOrDiv>\n <LinkOrDiv\n class=\"insignificant\"\n tabIndex={0}\n to={accountLink}\n onClick={() => {\n // states.showAccount = false;\n setTimeout(() => {\n states.showGenericAccounts = {\n heading: 'Following',\n fetchAccounts: fetchFollowing,\n instance,\n excludeRelationshipAttrs: isSelf ? ['following'] : [],\n blankCopy: hideCollections\n ? '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 Following\n <br />\n </LinkOrDiv>\n <LinkOrDiv\n class=\"insignificant\"\n to={accountLink}\n // onClick={\n // standalone\n // ? undefined\n // : () => {\n // hideAllModals();\n // }\n // }\n >\n <span title={statusesCount}>\n {shortenNumber(statusesCount)}\n </span>{' '}\n Posts\n </LinkOrDiv>\n {!!createdAt && (\n <div class=\"insignificant\">\n Joined{' '}\n <time datetime={createdAt}>\n {niceDateTime(createdAt, {\n hideTime: true,\n })}\n </time>\n </div>\n )}\n </div>\n </div>\n {!!postingStats && (\n <LinkOrDiv\n to={accountLink}\n class=\"account-metadata-box\"\n // onClick={() => {\n // states.showAccount = false;\n // }}\n >\n <div class=\"shazam-container\">\n <div class=\"shazam-container-inner\">\n {hasPostingStats ? (\n <div\n class=\"posting-stats\"\n title={`${Math.round(\n (postingStats.originals / postingStats.total) * 100,\n )}% original posts, ${Math.round(\n (postingStats.replies / postingStats.total) * 100,\n )}% replies, ${Math.round(\n (postingStats.boosts / postingStats.total) * 100,\n )}% boosts`}\n >\n <div>\n {postingStats.daysSinceLastPost < 365\n ? `Last ${postingStats.total} post${\n postingStats.total > 1 ? 's' : ''\n } in the past \n ${postingStats.daysSinceLastPost} day${\n postingStats.daysSinceLastPost > 1 ? 's' : ''\n }`\n : `\n Last ${postingStats.total} posts in the past year(s)\n `}\n </div>\n <div\n class=\"posting-stats-bar\"\n style={{\n // [originals | replies | boosts]\n '--originals-percentage': `${\n (postingStats.originals / postingStats.total) *\n 100\n }%`,\n '--replies-percentage': `${\n ((postingStats.originals +\n postingStats.replies) /\n postingStats.total) *\n 100\n }%`,\n }}\n />\n <div class=\"posting-stats-legends\">\n <span class=\"ib\">\n <span class=\"posting-stats-legend-item posting-stats-legend-item-originals\" />{' '}\n Original\n </span>{' '}\n <span class=\"ib\">\n <span class=\"posting-stats-legend-item posting-stats-legend-item-replies\" />{' '}\n Replies\n </span>{' '}\n <span class=\"ib\">\n <span class=\"posting-stats-legend-item posting-stats-legend-item-boosts\" />{' '}\n Boosts\n </span>\n </div>\n </div>\n ) : (\n <div class=\"posting-stats\">Post stats unavailable.</div>\n )}\n </div>\n </div>\n </LinkOrDiv>\n )}\n {!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 View post stats{' '}\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 />\n </footer>\n </>\n )\n )}\n </div>\n );\n}\n\nconst FAMILIAR_FOLLOWERS_LIMIT = 3;\n\nfunction RelatedActions({\n info,\n instance,\n standalone,\n authenticated,\n onRelationshipChange = () => {},\n onProfileUpdate = () => {},\n}) {\n if (!info) return null;\n const {\n masto: currentMasto,\n instance: currentInstance,\n authenticated: currentAuthenticated,\n } = api();\n const sameInstance = instance === currentInstance;\n\n const [relationshipUIState, setRelationshipUIState] = useState('default');\n const [relationship, setRelationship] = useState(null);\n\n const { id, acct, url, username, locked, lastStatusAt, note, fields, moved } =\n info;\n const accountID = useRef(id);\n\n const {\n following,\n showingReblogs,\n notifying,\n followedBy,\n blocking,\n blockedBy,\n muting,\n mutingNotifications,\n requested,\n domainBlocking,\n endorsed,\n note: privateNote,\n } = relationship || {};\n\n const [currentInfo, setCurrentInfo] = useState(null);\n const [isSelf, setIsSelf] = useState(false);\n\n useEffect(() => {\n if (info) {\n const currentAccount = 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.fetch({\n q: acctHasInstance ? info.acct : `${info.username}@${instance}`,\n type: 'accounts',\n limit: 1,\n resolve: true,\n });\n console.log('🥏 Fetched account from logged-in instance', results);\n if (results.accounts.length) {\n currentID = results.accounts[0].id;\n setCurrentInfo(results.accounts[0]);\n }\n } catch (e) {\n console.error(e);\n }\n }\n\n if (!currentID) return;\n\n if (currentAccount === currentID) {\n // It's myself!\n setIsSelf(true);\n return;\n }\n\n accountID.current = currentID;\n\n // if (moved) return;\n\n setRelationshipUIState('loading');\n\n const fetchRelationships = currentMasto.v1.accounts.relationships.fetch(\n {\n id: [currentID],\n },\n );\n\n try {\n const relationships = await fetchRelationships;\n console.log('fetched relationship', relationships);\n setRelationshipUIState('default');\n\n if (relationships.length) {\n const relationship = relationships[0];\n setRelationship(relationship);\n onRelationshipChange({ relationship, currentID });\n }\n } catch (e) {\n console.error(e);\n setRelationshipUIState('error');\n }\n })();\n }\n }, [info, authenticated]);\n\n useEffect(() => {\n if (info && isSelf) {\n updateAccount(info);\n }\n }, [info, isSelf]);\n\n const loading = relationshipUIState === 'loading';\n\n const [showTranslatedBio, setShowTranslatedBio] = useState(false);\n const [showAddRemoveLists, setShowAddRemoveLists] = useState(false);\n const [showPrivateNoteModal, setShowPrivateNoteModal] = useState(false);\n const [showEditProfile, setShowEditProfile] = useState(false);\n const [lists, setLists] = useState([]);\n\n return (\n <>\n <div class=\"actions\">\n <span>\n {followedBy ? (\n <span class=\"tag\">Follows you</span>\n ) : !!lastStatusAt ? (\n <small class=\"insignificant\">\n Last post:{' '}\n <span class=\"ib\">\n {niceDateTime(lastStatusAt, {\n hideTime: true,\n })}\n </span>\n </small>\n ) : (\n <span />\n )}\n {muting && <span class=\"tag danger\">Muted</span>}\n {blocking && <span class=\"tag danger\">Blocked</span>}\n </span>{' '}\n <span class=\"buttons\">\n {!!privateNote && (\n <button\n type=\"button\"\n class=\"private-note-tag\"\n title=\"Private note\"\n onClick={() => {\n setShowPrivateNoteModal(true);\n }}\n dir=\"auto\"\n >\n <span>{privateNote}</span>\n </button>\n )}\n <Menu2\n portal={{\n target: document.body,\n }}\n containerProps={{\n style: {\n // Higher than the backdrop\n zIndex: 1001,\n },\n }}\n align=\"center\"\n position=\"anchor\"\n overflow=\"auto\"\n menuButton={\n <button\n type=\"button\"\n title=\"More\"\n class=\"plain\"\n disabled={loading}\n >\n <Icon icon=\"more\" size=\"l\" alt=\"More\" />\n </button>\n }\n 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>Mention @{username}</span>\n </MenuItem>\n <MenuItem\n onClick={() => {\n setShowTranslatedBio(true);\n }}\n >\n <Icon icon=\"translate\" />\n <span>Translate bio</span>\n </MenuItem>\n {supports('@mastodon/profile-private-note') && (\n <MenuItem\n onClick={() => {\n setShowPrivateNoteModal(true);\n }}\n >\n <Icon icon=\"pencil\" />\n <span>\n {privateNote ? 'Edit private note' : 'Add private note'}\n </span>\n </MenuItem>\n )}\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 ? `Notifications enabled for @${username}'s posts.`\n : ` 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 ? 'Disable notifications'\n : '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 ? `Boosts from @${username} enabled.`\n : `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 ? 'Disable boosts' : 'Enable boosts'}\n </span>\n </MenuItem>\n </>\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 Add/Remove from Lists\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>Add/Remove from Lists</span>\n )}\n </MenuItem>\n )}\n <MenuDivider />\n </>\n )}\n <MenuItem\n onClick={() => {\n const handle = `@${currentInfo?.acct || acct}`;\n try {\n navigator.clipboard.writeText(handle);\n showToast('Handle copied');\n } catch (e) {\n console.error(e);\n showToast('Unable to copy handle');\n }\n }}\n >\n <Icon icon=\"copy\" />\n <small>\n Copy handle\n <br />\n <span class=\"more-insignificant\">\n @{currentInfo?.acct || acct}\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('Link copied');\n } catch (e) {\n console.error(e);\n showToast('Unable to copy link');\n }\n }}\n >\n <Icon icon=\"link\" />\n <span>Copy</span>\n </MenuItem>\n {navigator?.share &&\n navigator?.canShare?.({\n url,\n }) && (\n <MenuItem\n onClick={() => {\n try {\n navigator.share({\n url,\n });\n } catch (e) {\n console.error(e);\n alert(\"Sharing doesn't seem to work.\");\n }\n }}\n >\n <Icon icon=\"share\" />\n <span>Share…</span>\n </MenuItem>\n )}\n </div>\n {!!relationship && (\n <>\n <MenuDivider />\n {muting ? (\n <MenuItem\n onClick={() => {\n setRelationshipUIState('loading');\n (async () => {\n try {\n const newRelationship = await currentMasto.v1.accounts\n .$select(currentInfo?.id || id)\n .unmute();\n console.log('unmuting', newRelationship);\n setRelationship(newRelationship);\n setRelationshipUIState('default');\n showToast(`Unmuted @${username}`);\n states.reloadGenericAccounts.id = 'mute';\n states.reloadGenericAccounts.counter++;\n } catch (e) {\n console.error(e);\n setRelationshipUIState('error');\n }\n })();\n }}\n >\n <Icon icon=\"unmute\" />\n <span>Unmute @{username}</span>\n </MenuItem>\n ) : (\n <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\">Mute @{username}…</span>\n <span\n style={{\n textOverflow: 'clip',\n }}\n >\n <Icon icon=\"time\" />\n <Icon icon=\"chevron-right\" />\n </span>\n </>\n }\n >\n <div class=\"menu-wrap\">\n {MUTE_DURATIONS.map((duration) => (\n <MenuItem\n onClick={() => {\n setRelationshipUIState('loading');\n (async () => {\n try {\n const newRelationship =\n await currentMasto.v1.accounts\n .$select(currentInfo?.id || id)\n .mute({\n duration,\n });\n console.log('muting', newRelationship);\n setRelationship(newRelationship);\n setRelationshipUIState('default');\n showToast(\n `Muted @${username} for ${MUTE_DURATIONS_LABELS[duration]}`,\n );\n states.reloadGenericAccounts.id = 'mute';\n states.reloadGenericAccounts.counter++;\n } catch (e) {\n console.error(e);\n setRelationshipUIState('error');\n showToast(`Unable to mute @${username}`);\n }\n })();\n }}\n >\n {MUTE_DURATIONS_LABELS[duration]}\n </MenuItem>\n ))}\n </div>\n </SubMenu2>\n )}\n {followedBy && (\n <MenuConfirm\n subMenu\n menuItemClassName=\"danger\"\n confirmLabel={\n <>\n <Icon icon=\"user-x\" />\n <span>Remove @{username} from followers?</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(`@${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>Remove follower…</span>\n </MenuConfirm>\n )}\n <MenuConfirm\n subMenu\n confirm={!blocking}\n confirmLabel={\n <>\n <Icon icon=\"block\" />\n <span>Block @{username}?</span>\n </>\n }\n menuItemClassName=\"danger\"\n onClick={() => {\n // if (!blocking && !confirm(`Block @${username}?`)) {\n // return;\n // }\n setRelationshipUIState('loading');\n (async () => {\n try {\n if (blocking) {\n const newRelationship = await currentMasto.v1.accounts\n .$select(currentInfo?.id || id)\n .unblock();\n console.log('unblocking', newRelationship);\n setRelationship(newRelationship);\n setRelationshipUIState('default');\n showToast(`Unblocked @${username}`);\n } else {\n const newRelationship = await currentMasto.v1.accounts\n .$select(currentInfo?.id || id)\n .block();\n console.log('blocking', newRelationship);\n setRelationship(newRelationship);\n setRelationshipUIState('default');\n showToast(`Blocked @${username}`);\n }\n states.reloadGenericAccounts.id = 'block';\n states.reloadGenericAccounts.counter++;\n } catch (e) {\n console.error(e);\n setRelationshipUIState('error');\n if (blocking) {\n showToast(`Unable to unblock @${username}`);\n } else {\n showToast(`Unable to block @${username}`);\n }\n }\n })();\n }}\n >\n {blocking ? (\n <>\n <Icon icon=\"unblock\" />\n <span>Unblock @{username}</span>\n </>\n ) : (\n <>\n <Icon icon=\"block\" />\n <span>Block @{username}…</span>\n </>\n )}\n </MenuConfirm>\n <MenuItem\n className=\"danger\"\n onClick={() => {\n states.showReportModal = {\n account: currentInfo || info,\n };\n }}\n >\n <Icon icon=\"flag\" />\n <span>Report @{username}…</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>Edit profile</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 ? 'Withdraw follow request?'\n : `Unfollow @${info.acct || info.username}?`}\n </span>\n }\n menuItemClassName=\"danger\"\n align=\"end\"\n disabled={loading}\n onClick={() => {\n setRelationshipUIState('loading');\n (async () => {\n try {\n let newRelationship;\n\n if (following || requested) {\n // const yes = confirm(\n // requested\n // ? 'Withdraw follow request?'\n // : `Unfollow @${info.acct || info.username}?`,\n // );\n\n // if (yes) {\n newRelationship = await currentMasto.v1.accounts\n .$select(accountID.current)\n .unfollow();\n // }\n } else {\n newRelationship = await currentMasto.v1.accounts\n .$select(accountID.current)\n .follow();\n }\n\n if (newRelationship) setRelationship(newRelationship);\n setRelationshipUIState('default');\n } catch (e) {\n alert(e);\n setRelationshipUIState('error');\n }\n })();\n }}\n >\n <button\n type=\"button\"\n class={`${following || requested ? 'light swap' : ''}`}\n data-swap-state={following || requested ? 'danger' : ''}\n disabled={loading}\n >\n {following ? (\n <>\n <span>Following</span>\n <span>Unfollow…</span>\n </>\n ) : requested ? (\n <>\n <span>Requested</span>\n <span>Withdraw…</span>\n </>\n ) : locked ? (\n <>\n <Icon icon=\"lock\" /> <span>Follow</span>\n </>\n ) : (\n 'Follow'\n )}\n </button>\n </MenuConfirm>\n )}\n </span>\n </div>\n {!!showTranslatedBio && (\n <Modal\n 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 {!!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\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 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 fieldsText =\n fields\n ?.map(({ name, value }) => `${name}\\n${getHTMLText(value)}`)\n .join('\\n\\n') || '';\n\n const text = getHTMLText(note) + (fieldsText ? `\\n\\n${fieldsText}` : '');\n\n return (\n <div class=\"sheet\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" />\n </button>\n )}\n <header>\n <h2>Translated Bio</h2>\n </header>\n <main>\n <p\n style={{\n whiteSpace: 'pre-wrap',\n }}\n >\n {text}\n </p>\n <TranslationBlock forceTranslate text={text} />\n </main>\n </div>\n );\n}\n\nfunction AddRemoveListsSheet({ accountID, onClose }) {\n const { masto } = api();\n const [uiState, setUIState] = useState('default');\n const [lists, setLists] = useState([]);\n const [listsContainingAccount, setListsContainingAccount] = useState([]);\n const [reloadCount, reload] = useReducer((c) => c + 1, 0);\n\n useEffect(() => {\n setUIState('loading');\n (async () => {\n try {\n const lists = await 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\" />\n </button>\n )}\n <header>\n <h2>Add/Remove from Lists</h2>\n </header>\n <main>\n {lists.length > 0 ? (\n <ul class=\"list-add-remove\">\n {lists.map((list) => {\n const inList = listsContainingAccount.some(\n (l) => l.id === list.id,\n );\n return (\n <li>\n <button\n type=\"button\"\n class={`light ${inList ? 'checked' : ''}`}\n disabled={uiState === 'loading'}\n onClick={() => {\n setUIState('loading');\n (async () => {\n try {\n if (inList) {\n await masto.v1.lists\n .$select(list.id)\n .accounts.remove({\n accountIds: [accountID],\n });\n } else {\n await masto.v1.lists\n .$select(list.id)\n .accounts.create({\n accountIds: [accountID],\n });\n }\n // setUIState('default');\n reload();\n } catch (e) {\n console.error(e);\n setUIState('error');\n alert(\n inList\n ? 'Unable to remove from list.'\n : 'Unable to add to list.',\n );\n }\n })();\n }}\n >\n <Icon icon=\"check-circle\" />\n <span>{list.title}</span>\n </button>\n </li>\n );\n })}\n </ul>\n ) : uiState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n ) : uiState === 'error' ? (\n <p class=\"ui-state\">Unable to load lists.</p>\n ) : (\n <p class=\"ui-state\">No lists.</p>\n )}\n <button\n type=\"button\"\n class=\"plain2\"\n onClick={() => setShowListAddEditModal(true)}\n disabled={uiState !== 'default'}\n >\n <Icon icon=\"plus\" size=\"l\" /> <span>New list</span>\n </button>\n </main>\n {showListAddEditModal && (\n <Modal\n onClick={(e) => {\n if (e.target === e.currentTarget) {\n setShowListAddEditModal(false);\n }\n }}\n >\n <ListAddEdit\n list={showListAddEditModal?.list}\n onClose={(result) => {\n if (result.state === 'success') {\n reload();\n }\n setShowListAddEditModal(false);\n }}\n />\n </Modal>\n )}\n </div>\n );\n}\n\nfunction PrivateNoteSheet({\n account,\n note: initialNote,\n onRelationshipChange = () => {},\n onClose = () => {},\n}) {\n const { masto } = api();\n const [uiState, setUIState] = useState('default');\n const textareaRef = useRef(null);\n\n useEffect(() => {\n let timer;\n if (textareaRef.current && !initialNote) {\n timer = setTimeout(() => {\n textareaRef.current.focus?.();\n }, 100);\n }\n return () => {\n clearTimeout(timer);\n };\n }, []);\n\n return (\n <div class=\"sheet\" id=\"private-note-container\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" />\n </button>\n )}\n <header>\n <b>Private note about @{account?.username || account?.acct}</b>\n </header>\n <main>\n <form\n onSubmit={(e) => {\n e.preventDefault();\n const formData = new FormData(e.target);\n const note = formData.get('note');\n if (note?.trim() !== initialNote?.trim()) {\n setUIState('loading');\n (async () => {\n try {\n const newRelationship = await masto.v1.accounts\n .$select(account?.id)\n .note.create({\n comment: note,\n });\n console.log('updated relationship', newRelationship);\n setUIState('default');\n onRelationshipChange(newRelationship);\n onClose();\n } catch (e) {\n console.error(e);\n setUIState('error');\n alert(e?.message || 'Unable to update private note.');\n }\n })();\n }\n }}\n >\n <textarea\n ref={textareaRef}\n name=\"note\"\n disabled={uiState === 'loading'}\n >\n {initialNote}\n </textarea>\n <footer>\n <button\n type=\"button\"\n class=\"light\"\n disabled={uiState === 'loading'}\n onClick={() => {\n onClose?.();\n }}\n >\n Cancel\n </button>\n <span>\n <Loader abrupt hidden={uiState !== 'loading'} />\n <button disabled={uiState === 'loading'} type=\"submit\">\n Save &amp; close\n </button>\n </span>\n </footer>\n </form>\n </main>\n </div>\n );\n}\n\nfunction EditProfileSheet({ onClose = () => {} }) {\n const { masto } = api();\n const [uiState, setUIState] = useState('loading');\n const [account, setAccount] = 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 } = account || {};\n const { note, fields } = source || {};\n const fieldsAttributesRef = useRef(null);\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\" />\n </button>\n )}\n <header>\n <b>Edit profile</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 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 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 || 'Unable to update profile.');\n }\n })();\n }}\n >\n <p>\n <label>\n Name{' '}\n <input\n type=\"text\"\n name=\"display_name\"\n defaultValue={displayName}\n maxLength={30}\n disabled={uiState === 'loading'}\n />\n </label>\n </p>\n <p>\n <label>\n Bio\n <textarea\n defaultValue={note}\n name=\"note\"\n maxLength={500}\n rows=\"5\"\n disabled={uiState === 'loading'}\n />\n </label>\n </p>\n {/* Table for fields; name and values are in fields, min 4 rows */}\n <p>Extra fields</p>\n <table ref={fieldsAttributesRef}>\n <thead>\n <tr>\n <th>Label</th>\n <th>Content</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 Cancel\n </button>\n <button type=\"submit\" disabled={uiState === 'loading'}>\n Save\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 />\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 />\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 return (\n <div class=\"handle-info\">\n <span class=\"handle-handle\">\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\" /> username\n </span>{' '}\n <span class=\"ib\">\n <span class=\"handle-legend-icon server\" /> server domain name\n </span>\n </div>\n </div>\n );\n}\n\nexport default AccountInfo;\n","import { useEffect } from 'preact/hooks';\n\nimport { api } from '../utils/api';\nimport states from '../utils/states';\nimport useLocationChange from '../utils/useLocationChange';\n\nimport AccountInfo from './account-info';\nimport Icon from './icon';\n\nfunction AccountSheet({ account, instance: propInstance, onClose }) {\n const { masto, instance, authenticated } = api({ instance: propInstance });\n const isString = typeof account === 'string';\n\n useEffect(() => {\n if (!isString) {\n states.accounts[`${account.id}@${instance}`] = account;\n }\n }, [account]);\n\n useLocationChange(onClose);\n\n return (\n <div\n class=\"sheet\"\n // onClick={(e) => {\n // const accountBlock = e.target.closest('.account-block');\n // if (accountBlock) {\n // onClose({\n // destination: 'account-statuses',\n // });\n // }\n // }}\n >\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close outer\" onClick={onClose}>\n <Icon icon=\"x\" />\n </button>\n )}\n <AccountInfo\n instance={instance}\n authenticated={authenticated}\n account={account}\n fetchAccount={async () => {\n if (isString) {\n try {\n const info = await masto.v1.accounts.lookup({\n acct: account,\n skip_webfinger: false,\n });\n return info;\n } catch (e) {\n const result = await masto.v2.search.fetch({\n q: account,\n type: 'accounts',\n limit: 1,\n resolve: authenticated,\n });\n if (result.accounts.length) {\n return result.accounts[0];\n } else if (/https?:\\/\\/[^/]+\\/@/.test(account)) {\n const accountURL = URL.parse(account);\n const { hostname, pathname } = accountURL;\n const acct =\n pathname.replace(/^\\//, '').replace(/\\/$/, '') +\n '@' +\n hostname;\n const result = await masto.v2.search.fetch({\n q: acct,\n type: 'accounts',\n limit: 1,\n resolve: authenticated,\n });\n if (result.accounts.length) {\n return result.accounts[0];\n }\n }\n }\n } else {\n return account;\n }\n }}\n />\n </div>\n );\n}\n\nexport default AccountSheet;\n","import './drafts.css';\n\nimport { useEffect, useMemo, useReducer, useState } from 'react';\n\nimport { api } from '../utils/api';\nimport db from '../utils/db';\nimport niceDateTime from '../utils/nice-date-time';\nimport states from '../utils/states';\nimport { getCurrentAccountNS } from '../utils/store-utils';\n\nimport Icon from './icon';\nimport Loader from './loader';\nimport MenuConfirm from './menu-confirm';\n\nfunction Drafts({ onClose }) {\n const { masto } = api();\n const [uiState, setUIState] = useState('default');\n const [drafts, setDrafts] = useState([]);\n const [reloadCount, reload] = useReducer((c) => c + 1, 0);\n\n useEffect(() => {\n setUIState('loading');\n (async () => {\n try {\n const keys = await db.drafts.keys();\n if (keys.length) {\n const ns = getCurrentAccountNS();\n const ownKeys = keys.filter((key) => key.startsWith(ns));\n if (ownKeys.length) {\n const drafts = await db.drafts.getMany(ownKeys);\n drafts.sort(\n (a, b) =>\n new Date(b.updatedAt).getTime() -\n new Date(a.updatedAt).getTime(),\n );\n setDrafts(drafts);\n } else {\n setDrafts([]);\n }\n } else {\n setDrafts([]);\n }\n setUIState('default');\n } catch (e) {\n console.error(e);\n setUIState('error');\n }\n })();\n }, [reloadCount]);\n\n const hasDrafts = drafts?.length > 0;\n\n return (\n <div class=\"sheet\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" />\n </button>\n )}\n <header>\n <h2>\n Unsent drafts <Loader abrupt hidden={uiState !== 'loading'} />\n </h2>\n {hasDrafts && (\n <div class=\"insignificant\">\n Looks like you have unsent drafts. Let's continue where you left\n off.\n </div>\n )}\n </header>\n <main>\n {hasDrafts ? (\n <>\n <ul class=\"drafts-list\">\n {drafts.map((draft) => {\n const { updatedAt, key, draftStatus, replyTo } = draft;\n const updatedAtDate = new Date(updatedAt);\n return (\n <li key={updatedAt}>\n <div class=\"mini-draft-meta\">\n <b>\n <Icon icon={replyTo ? 'reply' : 'quill'} size=\"s\" />{' '}\n <time>\n {!!replyTo && (\n <>\n @{replyTo.account.acct}\n <br />\n </>\n )}\n {niceDateTime(updatedAtDate)}\n </time>\n </b>\n <MenuConfirm\n confirmLabel={<span>Delete this draft?</span>}\n menuItemClassName=\"danger\"\n align=\"end\"\n disabled={uiState === 'loading'}\n onClick={() => {\n (async () => {\n try {\n // const yes = confirm('Delete this draft?');\n // if (yes) {\n await db.drafts.del(key);\n reload();\n // }\n } catch (e) {\n alert('Error deleting draft! Please try again.');\n }\n })();\n }}\n >\n <button\n type=\"button\"\n class=\"small light\"\n disabled={uiState === 'loading'}\n >\n Delete&hellip;\n </button>\n </MenuConfirm>\n </div>\n <button\n type=\"button\"\n disabled={uiState === 'loading'}\n class=\"draft-item\"\n onClick={async () => {\n // console.log({ draftStatus });\n let replyToStatus;\n if (replyTo) {\n setUIState('loading');\n try {\n replyToStatus = await masto.v1.statuses\n .$select(replyTo.id)\n .fetch();\n } catch (e) {\n console.error(e);\n alert('Error fetching reply-to status!');\n setUIState('default');\n return;\n }\n setUIState('default');\n }\n window.__COMPOSE__ = {\n draftStatus,\n replyToStatus,\n };\n states.showCompose = true;\n states.showDrafts = false;\n }}\n >\n <MiniDraft draft={draft} />\n </button>\n </li>\n );\n })}\n </ul>\n {drafts.length > 1 && (\n <p>\n <MenuConfirm\n confirmLabel={<span>Delete all drafts?</span>}\n menuItemClassName=\"danger\"\n disabled={uiState === 'loading'}\n onClick={() => {\n (async () => {\n // const yes = confirm('Delete all drafts?');\n // if (yes) {\n setUIState('loading');\n try {\n await db.drafts.delMany(\n drafts.map((draft) => draft.key),\n );\n setUIState('default');\n reload();\n } catch (e) {\n console.error(e);\n alert('Error deleting drafts! Please try again.');\n setUIState('error');\n }\n // }\n })();\n }}\n >\n <button\n type=\"button\"\n class=\"light danger\"\n disabled={uiState === 'loading'}\n >\n Delete all&hellip;\n </button>\n </MenuConfirm>\n </p>\n )}\n </>\n ) : (\n <p>No drafts found.</p>\n )}\n </main>\n </div>\n );\n}\n\nfunction MiniDraft({ draft }) {\n const { draftStatus, replyTo } = draft;\n const { status, spoilerText, poll, mediaAttachments } = draftStatus;\n const hasPoll = poll?.options?.length > 0;\n const hasMedia = mediaAttachments?.length > 0;\n const hasPollOrMedia = hasPoll || hasMedia;\n const firstImageMedia = useMemo(() => {\n if (!hasMedia) return;\n const image = mediaAttachments.find((media) => /image/.test(media.type));\n if (!image) return;\n const { file } = image;\n const objectURL = URL.createObjectURL(file);\n return objectURL;\n }, [hasMedia, mediaAttachments]);\n return (\n <>\n <div class=\"mini-draft\">\n {hasPollOrMedia && (\n <div\n class={`mini-draft-aside ${firstImageMedia ? 'has-image' : ''}`}\n style={\n firstImageMedia\n ? {\n '--bg-image': `url(${firstImageMedia})`,\n }\n : {}\n }\n >\n {hasPoll && <Icon icon=\"poll\" />}\n {hasMedia && (\n <span>\n <Icon icon=\"attachment\" />{' '}\n <small>{mediaAttachments?.length}</small>\n </span>\n )}\n </div>\n )}\n <div class=\"mini-draft-main\">\n {!!spoilerText && <div class=\"mini-draft-spoiler\">{spoilerText}</div>}\n {!!status && <div class=\"mini-draft-status\">{status}</div>}\n </div>\n </div>\n </>\n );\n}\n\nexport default Drafts;\n","import './embed-modal.css';\n\nimport Icon from './icon';\n\nfunction EmbedModal({ html, url, width, height, onClose = () => {} }) {\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\" />\n </button>\n {url && (\n <a\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"button plain\"\n >\n <span>Open link</span> <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 { 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 = 'Nothing to show',\n}) {\n const { masto, instance: currentInstance } = api();\n const isCurrentInstance = instance ? instance === currentInstance : true;\n const snapStates = useSnapshot(states);\n ``;\n const [uiState, setUIState] = useState('default');\n const [accounts, setAccounts] = useState([]);\n const [showMore, setShowMore] = useState(false);\n\n useLocationChange(onClose);\n\n if (!snapStates.showGenericAccounts) {\n return null;\n }\n\n const {\n id,\n heading,\n fetchAccounts,\n accounts: staticAccounts,\n showReactions,\n } = snapStates.showGenericAccounts;\n\n const [relationshipsMap, setRelationshipsMap] = useState({});\n\n const loadRelationships = async (accounts) => {\n if (!accounts?.length) return;\n if (!isCurrentInstance) return;\n const relationships = await fetchRelationships(accounts, relationshipsMap);\n if (relationships) {\n setRelationshipsMap({\n ...relationshipsMap,\n ...relationships,\n });\n }\n };\n\n const loadAccounts = (firstLoad) => {\n if (!fetchAccounts) return;\n if (firstLoad) setAccounts([]);\n setUIState('loading');\n (async () => {\n try {\n const { done, value } = await fetchAccounts(firstLoad);\n if (Array.isArray(value)) {\n if (firstLoad) {\n const accounts = [];\n for (let i = 0; i < value.length; i++) {\n const account = value[i];\n const theAccount = accounts.find(\n (a, j) => a.id === account.id && i !== j,\n );\n if (!theAccount) {\n accounts.push({\n _types: [],\n ...account,\n });\n } else {\n theAccount._types.push(...account._types);\n }\n }\n setAccounts(accounts);\n } else {\n // setAccounts((prev) => [...prev, ...value]);\n // Merge accounts by id and _types\n setAccounts((prev) => {\n const newAccounts = prev;\n for (const account of value) {\n const theAccount = newAccounts.find((a) => a.id === account.id);\n if (!theAccount) {\n newAccounts.push(account);\n } else {\n theAccount._types.push(...account._types);\n }\n }\n return newAccounts;\n });\n }\n setShowMore(!done);\n\n loadRelationships(value);\n } else {\n setShowMore(false);\n }\n setUIState('default');\n } catch (e) {\n console.error(e);\n setUIState('error');\n }\n })();\n };\n\n const firstLoad = useRef(true);\n useEffect(() => {\n if (staticAccounts?.length > 0) {\n setAccounts(staticAccounts);\n loadRelationships(staticAccounts);\n } else {\n loadAccounts(true);\n firstLoad.current = false;\n }\n }, [staticAccounts, fetchAccounts]);\n\n useEffect(() => {\n if (firstLoad.current) return;\n // reloadGenericAccounts contains value like {id: 'mute', counter: 1}\n // We only need to reload if the id matches\n if (snapStates.reloadGenericAccounts?.id === id) {\n loadAccounts(true);\n }\n }, [snapStates.reloadGenericAccounts.counter]);\n\n 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\" />\n </button>\n <header>\n <h2>{heading || '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 Show more&hellip;\n </button>\n </InView>\n ) : (\n <p class=\"ui-state insignificant\">The end.</p>\n )\n ) : (\n uiState === 'loading' && (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n )\n )}\n </>\n ) : uiState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n ) : uiState === 'error' ? (\n <p class=\"ui-state\">Error loading accounts</p>\n ) : (\n <p class=\"ui-state insignificant\">{blankCopy}</p>\n )}\n </main>\n </div>\n );\n}\n","import { Menu, MenuItem } from '@szhsin/react-menu';\nimport { useState } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport getTranslateTargetLanguage from '../utils/get-translate-target-language';\nimport localeMatch from '../utils/locale-match';\nimport { speak, supportsTTS } from '../utils/speech';\nimport states from '../utils/states';\n\nimport Icon from './icon';\nimport Menu2 from './menu2';\nimport TranslationBlock from './translation-block';\n\nexport default function MediaAltModal({ alt, lang, onClose }) {\n const snapStates = useSnapshot(states);\n const [forceTranslate, setForceTranslate] = useState(false);\n const targetLanguage = getTranslateTargetLanguage(true);\n const contentTranslationHideLanguages =\n snapStates.settings.contentTranslationHideLanguages || [];\n const differentLanguage =\n !!lang &&\n lang !== targetLanguage &&\n !localeMatch([lang], [targetLanguage]) &&\n !contentTranslationHideLanguages.find(\n (l) => lang === l || localeMatch([lang], [l]),\n );\n\n return (\n <div class=\"sheet\" tabindex=\"-1\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close outer\" onClick={onClose}>\n <Icon icon=\"x\" />\n </button>\n )}\n <header class=\"header-grid\">\n <h2>Media description</h2>\n <div class=\"header-side\">\n <Menu2\n align=\"end\"\n menuButton={\n <button type=\"button\" class=\"plain4\">\n <Icon icon=\"more\" alt=\"More\" size=\"xl\" />\n </button>\n }\n >\n <MenuItem\n disabled={forceTranslate}\n onClick={() => {\n setForceTranslate(true);\n }}\n >\n <Icon icon=\"translate\" />\n <span>Translate</span>\n </MenuItem>\n {supportsTTS && (\n <MenuItem\n onClick={() => {\n speak(alt, lang);\n }}\n >\n <Icon icon=\"speak\" />\n <span>Speak</span>\n </MenuItem>\n )}\n </Menu2>\n </div>\n </header>\n <main lang={lang} dir=\"auto\">\n <p\n style={{\n whiteSpace: 'pre-wrap',\n textWrap: 'pretty',\n }}\n >\n {alt}\n </p>\n {(differentLanguage || forceTranslate) && (\n <TranslationBlock\n forceTranslate={forceTranslate}\n sourceLanguage={lang}\n text={alt}\n />\n )}\n </main>\n </div>\n );\n}\n","// https://gist.github.com/earthbound19/e7fe15fdf8ca3ef814750a61bc75b5ce\nfunction clamp(value, min, max) {\n return Math.max(Math.min(value, max), min);\n}\n\nconst gammaToLinear = (c) =>\n c >= 0.04045 ? Math.pow((c + 0.055) / 1.055, 2.4) : c / 12.92;\nconst linearToGamma = (c) =>\n c >= 0.0031308 ? 1.055 * Math.pow(c, 1 / 2.4) - 0.055 : 12.92 * c;\n\nexport function rgb2oklab([r, g, b]) {\n r = gammaToLinear(r / 255);\n g = gammaToLinear(g / 255);\n b = gammaToLinear(b / 255);\n var l = 0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b;\n var m = 0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b;\n var s = 0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b;\n l = Math.cbrt(l);\n m = Math.cbrt(m);\n s = Math.cbrt(s);\n return [\n l * +0.2104542553 + m * +0.793617785 + s * -0.0040720468,\n l * +1.9779984951 + m * -2.428592205 + s * +0.4505937099,\n l * +0.0259040371 + m * +0.7827717662 + s * -0.808675766,\n ];\n}\n\nexport function oklab2rgb([L, a, b]) {\n var l = L + a * +0.3963377774 + b * +0.2158037573;\n var m = L + a * -0.1055613458 + b * -0.0638541728;\n var s = L + a * -0.0894841775 + b * -1.291485548;\n // The ** operator here cubes; same as l_*l_*l_ in the C++ example:\n l = l ** 3;\n m = m ** 3;\n s = s ** 3;\n var r = l * +4.0767416621 + m * -3.3077115913 + s * +0.2309699292;\n var g = l * -1.2684380046 + m * +2.6097574011 + s * -0.3413193965;\n var b = l * -0.0041960863 + m * -0.7034186147 + s * +1.707614701;\n // Convert linear RGB values returned from oklab math to sRGB for our use before returning them:\n r = 255 * linearToGamma(r);\n g = 255 * linearToGamma(g);\n b = 255 * linearToGamma(b);\n // OPTION: clamp r g and b values to the range 0-255; but if you use the values immediately to draw, JavaScript clamps them on use:\n r = clamp(r, 0, 255);\n g = clamp(g, 0, 255);\n b = clamp(b, 0, 255);\n // OPTION: round the values. May not be necessary if you use them immediately for rendering in JavaScript, as JavaScript (also) discards decimals on render:\n r = Math.round(r);\n g = Math.round(g);\n b = Math.round(b);\n return [r, g, b];\n}\n","import { MenuDivider, MenuItem } from '@szhsin/react-menu';\nimport { getBlurHashAverageColor } from 'fast-blurhash';\nimport {\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\n\nimport { oklab2rgb, rgb2oklab } from '../utils/color-utils';\nimport showToast from '../utils/show-toast';\nimport states from '../utils/states';\n\nimport Icon from './icon';\nimport Link from './link';\nimport Media from './media';\nimport Menu2 from './menu2';\nimport MenuLink from './menu-link';\n\nconst { PHANPY_IMG_ALT_API_URL: IMG_ALT_API_URL } = import.meta.env;\n\nfunction MediaModal({\n mediaAttachments,\n statusID,\n instance,\n lang,\n index = 0,\n onClose = () => {},\n}) {\n const [uiState, setUIState] = useState('default');\n const carouselRef = useRef(null);\n\n const [currentIndex, setCurrentIndex] = useState(index);\n const carouselFocusItem = useRef(null);\n useLayoutEffect(() => {\n carouselFocusItem.current?.scrollIntoView();\n\n // history.pushState({ mediaModal: true }, '');\n // const handlePopState = (e) => {\n // if (e.state?.mediaModal) {\n // onClose();\n // }\n // };\n // window.addEventListener('popstate', handlePopState);\n // return () => {\n // window.removeEventListener('popstate', handlePopState);\n // };\n }, []);\n const prevStatusID = useRef(statusID);\n useEffect(() => {\n const scrollLeft = index * carouselRef.current.clientWidth;\n const differentStatusID = prevStatusID.current !== statusID;\n if (differentStatusID) prevStatusID.current = statusID;\n carouselRef.current.scrollTo({\n left: scrollLeft,\n behavior: differentStatusID ? 'auto' : 'smooth',\n });\n carouselRef.current.focus();\n }, [index, statusID]);\n\n const [showControls, setShowControls] = useState(true);\n\n useEffect(() => {\n let handleSwipe = () => {\n onClose();\n };\n if (carouselRef.current) {\n carouselRef.current.addEventListener('swiped-down', handleSwipe);\n }\n return () => {\n if (carouselRef.current) {\n carouselRef.current.removeEventListener('swiped-down', handleSwipe);\n }\n };\n }, []);\n\n useHotkeys(\n 'esc',\n onClose,\n {\n ignoreEventWhen: (e) => {\n const hasModal = !!document.querySelector('#modal-container > *');\n return hasModal;\n },\n },\n [onClose],\n );\n\n useEffect(() => {\n let handleScroll = () => {\n const { clientWidth, scrollLeft } = carouselRef.current;\n const index = Math.round(scrollLeft / clientWidth);\n setCurrentIndex(index);\n };\n if (carouselRef.current) {\n carouselRef.current.addEventListener('scroll', handleScroll, {\n passive: true,\n });\n }\n return () => {\n if (carouselRef.current) {\n carouselRef.current.removeEventListener('scroll', handleScroll);\n }\n };\n }, []);\n\n useEffect(() => {\n let timer = setTimeout(() => {\n carouselRef.current?.focus?.();\n }, 100);\n return () => clearTimeout(timer);\n }, []);\n\n const mediaAccentColors = useMemo(() => {\n return mediaAttachments?.map((media) => {\n const { blurhash } = media;\n if (blurhash) {\n const averageColor = getBlurHashAverageColor(blurhash);\n const labAverageColor = rgb2oklab(averageColor);\n return oklab2rgb([0.6, labAverageColor[1], labAverageColor[2]]);\n }\n return null;\n });\n }, [mediaAttachments]);\n const mediaAccentGradient = useMemo(() => {\n const gap = 5;\n const range = 100 / mediaAccentColors.length;\n return (\n mediaAccentColors\n ?.map((color, i) => {\n const start = i * range + gap;\n const end = (i + 1) * range - gap;\n if (color) {\n return `\n rgba(${color?.join(',')}, 0.4) ${start}%,\n rgba(${color?.join(',')}, 0.4) ${end}%\n `;\n }\n\n return `\n transparent ${start}%,\n transparent ${end}%\n `;\n })\n ?.join(', ') || 'transparent'\n );\n }, [mediaAccentColors]);\n\n let toastRef = useRef(null);\n useEffect(() => {\n return () => {\n toastRef.current?.hideToast?.();\n };\n }, []);\n\n return (\n <div\n class={`media-modal-container media-modal-count-${mediaAttachments?.length}`}\n >\n <div\n ref={carouselRef}\n tabIndex=\"0\"\n data-swipe-threshold=\"44\"\n class=\"carousel\"\n onClick={(e) => {\n if (\n e.target.classList.contains('carousel-item') ||\n e.target.classList.contains('media') ||\n e.target.classList.contains('media-zoom')\n ) {\n onClose();\n }\n }}\n style={\n mediaAttachments.length > 1\n ? {\n backgroundAttachment: 'local',\n backgroundImage: `linear-gradient(\n to right, ${mediaAccentGradient})`,\n }\n : {}\n }\n >\n {mediaAttachments?.map((media, i) => {\n const accentColor =\n mediaAttachments.length === 1 ? mediaAccentColors[i] : null;\n return (\n <div\n class=\"carousel-item\"\n style={\n accentColor\n ? {\n '--accent-color': `rgb(${accentColor?.join(',')})`,\n '--accent-alpha-color': `rgba(${accentColor?.join(\n ',',\n )}, 0.4)`,\n }\n : {}\n }\n tabindex=\"0\"\n key={media.id}\n ref={i === currentIndex ? carouselFocusItem : null}\n onClick={(e) => {\n // console.log(e);\n // if (e.target !== e.currentTarget) {\n // setShowControls(!showControls);\n // }\n if (!e.target.classList.contains('media')) {\n setShowControls(!showControls);\n }\n }}\n >\n {!!media.description && (\n <button\n type=\"button\"\n class=\"media-alt\"\n hidden={!showControls}\n onClick={() => {\n states.showMediaAlt = {\n alt: media.description,\n lang,\n };\n }}\n >\n <span class=\"alt-badge\">ALT</span>\n <span class=\"media-alt-desc\" lang={lang} dir=\"auto\">\n {media.description}\n </span>\n </button>\n )}\n <Media media={media} showOriginal lang={lang} />\n </div>\n );\n })}\n </div>\n <div class=\"carousel-top-controls\" hidden={!showControls}>\n <span>\n <button\n type=\"button\"\n class=\"carousel-button\"\n onClick={() => onClose()}\n >\n <Icon icon=\"x\" />\n </button>\n </span>\n {mediaAttachments?.length > 1 ? (\n <span class=\"carousel-dots\">\n {mediaAttachments?.map((media, i) => (\n <button\n key={media.id}\n type=\"button\"\n disabled={i === currentIndex}\n class={`carousel-dot ${i === currentIndex ? 'active' : ''}`}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n carouselRef.current.scrollTo({\n left: carouselRef.current.clientWidth * i,\n behavior: 'smooth',\n });\n carouselRef.current.focus();\n }}\n >\n <Icon icon=\"round\" size=\"s\" />\n </button>\n ))}\n </span>\n ) : (\n <span />\n )}\n <span>\n <Menu2\n overflow=\"auto\"\n align=\"end\"\n position=\"anchor\"\n gap={4}\n menuClassName=\"glass-menu\"\n menuButton={\n <button type=\"button\" class=\"carousel-button\">\n <Icon icon=\"more\" alt=\"More\" />\n </button>\n }\n >\n <MenuLink\n href={\n mediaAttachments[currentIndex]?.remoteUrl ||\n mediaAttachments[currentIndex]?.url\n }\n class=\"carousel-button\"\n target=\"_blank\"\n title=\"Open original media in new window\"\n >\n <Icon icon=\"popout\" />\n <span>Open original media</span>\n </MenuLink>\n {import.meta.env.DEV && // Only dev for now\n !!states.settings.mediaAltGenerator &&\n !!IMG_ALT_API_URL &&\n !!mediaAttachments[currentIndex]?.url &&\n !mediaAttachments[currentIndex]?.description &&\n mediaAttachments[currentIndex]?.type === 'image' && (\n <>\n <MenuDivider />\n <MenuItem\n disabled={uiState === 'loading'}\n onClick={() => {\n setUIState('loading');\n toastRef.current = showToast({\n text: 'Attempting to describe image. Please wait...',\n duration: -1,\n });\n (async function () {\n try {\n const response = await fetch(\n `${IMG_ALT_API_URL}?image=${encodeURIComponent(\n mediaAttachments[currentIndex]?.url,\n )}`,\n ).then((r) => r.json());\n states.showMediaAlt = {\n alt: response.description,\n };\n } catch (e) {\n console.error(e);\n showToast('Failed to describe image');\n } finally {\n setUIState('default');\n toastRef.current?.hideToast?.();\n }\n })();\n }}\n >\n <Icon icon=\"sparkles2\" />\n <span>Describe image…</span>\n </MenuItem>\n </>\n )}\n </Menu2>{' '}\n <Link\n to={`${instance ? `/${instance}` : ''}/s/${statusID}${\n window.matchMedia('(min-width: calc(40em + 350px))').matches\n ? `?media=${currentIndex + 1}`\n : ''\n }`}\n class=\"button carousel-button media-post-link\"\n // onClick={() => {\n // // if small screen (not media query min-width 40em + 350px), run onClose\n // if (\n // !window.matchMedia('(min-width: calc(40em + 350px))').matches\n // ) {\n // onClose();\n // }\n // }}\n >\n <span class=\"button-label\">View post </span>&raquo;\n </Link>\n </span>\n </div>\n {mediaAttachments?.length > 1 && (\n <div class=\"carousel-controls\" hidden={!showControls}>\n <button\n type=\"button\"\n class=\"carousel-button\"\n hidden={currentIndex === 0}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n carouselRef.current.focus();\n carouselRef.current.scrollTo({\n left: carouselRef.current.clientWidth * (currentIndex - 1),\n behavior: 'smooth',\n });\n }}\n >\n <Icon icon=\"arrow-left\" />\n </button>\n <button\n type=\"button\"\n class=\"carousel-button\"\n hidden={currentIndex === mediaAttachments.length - 1}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n carouselRef.current.focus();\n carouselRef.current.scrollTo({\n left: carouselRef.current.clientWidth * (currentIndex + 1),\n behavior: 'smooth',\n });\n }}\n >\n <Icon icon=\"arrow-right\" />\n </button>\n </div>\n )}\n </div>\n );\n}\n\nexport default MediaModal;\n","import './report-modal.css';\n\nimport { Fragment } from 'preact';\nimport { useMemo, useRef, useState } from 'preact/hooks';\n\nimport { api } from '../utils/api';\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: 'Spam',\n description: 'Malicious links, fake engagement, or repetitive replies',\n },\n legal: {\n label: 'Illegal',\n description: \"Violates the law of your or the server's country\",\n },\n violation: {\n label: 'Server rule violation',\n description: 'Breaks specific server rules',\n stampLabel: 'Violation',\n },\n other: {\n label: 'Other',\n description: \"Issue doesn't fit other categories\",\n excludeStamp: true,\n },\n};\n\nfunction ReportModal({ account, post, onClose }) {\n const { masto } = api();\n const [uiState, setUIState] = useState('default');\n const [username, domain] = account.acct.split('@');\n\n const [rules, currentDomain] = useMemo(() => {\n const { rules, domain } = getCurrentInstance();\n return [rules || [], domain];\n });\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 ? 'Report Post' : `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\" />\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 {CATEGORIES_INFO[selectedCategory].stampLabel ||\n CATEGORIES_INFO[selectedCategory].label}\n <small>Pending review</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 ? 'Post reported' : 'Profile reported');\n onClose();\n } catch (error) {\n console.error(error);\n setUIState('error');\n showToast(\n error?.message ||\n (post\n ? 'Unable to report post'\n : 'Unable to report profile'),\n );\n }\n })();\n }}\n >\n <p>\n {post\n ? `What's the issue with this post?`\n : `What's the issue with this profile?`}\n </p>\n <section class=\"report-categories\">\n {CATEGORIES.map((category) =>\n category === 'violation' && !rules?.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} &nbsp;\n <small class=\"ib insignificant\">\n {CATEGORIES_INFO[category].description}\n </small>\n </span>\n </label>\n {category === 'violation' && !!rules?.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 {rules.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.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\">Additional info</label>\n </p>\n <textarea\n maxlength=\"1000\"\n rows=\"1\"\n name=\"comment\"\n id=\"report-comment\"\n disabled={uiState === 'loading'}\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 Forward to <i>{domain}</i>\n </span>\n </label>\n </p>\n </section>\n )}\n <footer>\n <button type=\"submit\" disabled={uiState === 'loading'}>\n Send Report\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(`Muted ${username}`);\n } catch (e) {\n console.error(e);\n showToast(`Unable to mute ${username}`);\n }\n // onSubmit will still run\n }}\n >\n Send Report <small class=\"ib\">+ Mute profile</small>\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(`Blocked ${username}`);\n } catch (e) {\n console.error(e);\n showToast(`Unable to block ${username}`);\n }\n // onSubmit will still run\n }}\n >\n Send Report <small class=\"ib\">+ Block profile</small>\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.list({\n limit: LIMIT,\n });\n const tags = [];\n let fetchCount = 0;\n do {\n const { value, done } = await iterator.next();\n if (done || value?.length === 0) break;\n tags.push(...value);\n fetchCount++;\n } while (fetchCount < MAX_FETCH);\n tags.sort((a, b) => a.name.localeCompare(b.name));\n console.log(tags);\n\n if (tags.length) {\n setTimeout(() => {\n // Save to local storage, with saved timestamp\n store.account.set('followedTags', {\n tags,\n updatedAt: Date.now(),\n });\n }, 1);\n }\n\n return tags;\n}\n\nconst MAX_AGE = 24 * 60 * 60 * 1000; // 1 day\nexport async function getFollowedTags() {\n try {\n const { tags, updatedAt } = store.account.get('followedTags') || {};\n if (!tags?.length) return await fetchFollowedTags();\n if (Date.now() - updatedAt > MAX_AGE) {\n // Stale-while-revalidate\n fetchFollowedTags();\n return tags;\n }\n return tags;\n } catch (e) {\n return [];\n }\n}\n\nconst fauxDiv = document.createElement('div');\nexport const extractTagsFromStatus = (content) => {\n if (!content) return [];\n if (content.indexOf('#') === -1) return [];\n fauxDiv.innerHTML = content;\n const hashtagLinks = fauxDiv.querySelectorAll('a.hashtag');\n if (!hashtagLinks.length) return [];\n return Array.from(hashtagLinks).map((a) =>\n a.innerText.trim().replace(/^[^#]*#+/, ''),\n );\n};\n","import { useEffect, useState } from 'preact/hooks';\n\nfunction AsyncText({ children }) {\n if (typeof children === 'string') return children;\n const [text, setText] = useState('');\n useEffect(() => {\n Promise.resolve(children).then(setText);\n }, [children]);\n return text;\n}\n\nexport default AsyncText;\n","import './shortcuts-settings.css';\n\nimport { useAutoAnimate } from '@formkit/auto-animate/preact';\nimport {\n compressToEncodedURIComponent,\n decompressFromEncodedURIComponent,\n} from 'lz-string';\nimport { useEffect, useMemo, useRef, useState } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport floatingButtonUrl from '../assets/floating-button.svg';\nimport multiColumnUrl from '../assets/multi-column.svg';\nimport tabMenuBarUrl from '../assets/tab-menu-bar.svg';\n\nimport { api } from '../utils/api';\nimport { fetchFollowedTags } from '../utils/followed-tags';\nimport { 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: 'Home / Following',\n notifications: 'Notifications',\n list: 'Lists',\n public: 'Public (Local / Federated)',\n search: 'Search',\n 'account-statuses': 'Account',\n bookmarks: 'Bookmarks',\n favourites: 'Likes',\n hashtag: 'Hashtag',\n trending: 'Trending',\n mentions: 'Mentions',\n};\nconst TYPE_PARAMS = {\n list: [\n {\n text: 'List ID',\n name: 'id',\n notRequired: true,\n },\n ],\n public: [\n {\n text: 'Local only',\n name: 'local',\n type: 'checkbox',\n },\n {\n text: 'Instance',\n name: 'instance',\n type: 'text',\n placeholder: 'Optional, e.g. mastodon.social',\n notRequired: true,\n },\n ],\n trending: [\n {\n text: 'Instance',\n name: 'instance',\n type: 'text',\n placeholder: 'Optional, e.g. mastodon.social',\n notRequired: true,\n },\n ],\n search: [\n {\n text: 'Search term',\n name: 'query',\n type: 'text',\n placeholder: 'Optional, unless for multi-column mode',\n notRequired: true,\n },\n ],\n 'account-statuses': [\n {\n text: '@',\n name: 'id',\n type: 'text',\n placeholder: 'cheeaun@mastodon.social',\n },\n ],\n hashtag: [\n {\n text: '#',\n name: 'hashtag',\n type: 'text',\n placeholder: 'e.g. PixelArt (Max 5, space-separated)',\n pattern: '[^#]+',\n },\n {\n text: 'Media only',\n name: 'media',\n type: 'checkbox',\n },\n {\n text: 'Instance',\n name: 'instance',\n type: 'text',\n placeholder: 'Optional, e.g. mastodon.social',\n notRequired: true,\n },\n ],\n};\nconst fetchAccountTitle = pmem(async ({ id }) => {\n const account = await api().masto.v1.accounts.$select(id).fetch();\n return account.username || account.acct || account.displayName;\n});\nexport const SHORTCUTS_META = {\n following: {\n id: 'home',\n title: (_, index) => (index === 0 ? 'Home' : 'Following'),\n path: '/',\n icon: 'home',\n },\n mentions: {\n id: 'mentions',\n title: 'Mentions',\n path: '/mentions',\n icon: 'at',\n },\n notifications: {\n id: 'notifications',\n title: 'Notifications',\n path: '/notifications',\n icon: 'notification',\n },\n list: {\n id: ({ id }) => (id ? 'list' : 'lists'),\n title: ({ id }) => (id ? getListTitle(id) : '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 ? 'Local' : 'Federated'),\n subtitle: ({ instance }) => instance || api().instance,\n path: ({ local, instance }) => `/${instance}/p${local ? '/l' : ''}`,\n icon: ({ local }) => (local ? 'building' : 'earth'),\n },\n trending: {\n id: 'trending',\n title: 'Trending',\n subtitle: ({ instance }) => instance || api().instance,\n path: ({ instance }) => `/${instance}/trending`,\n icon: 'chart',\n },\n search: {\n id: 'search',\n title: ({ query }) => (query ? `“${query}”` : 'Search'),\n path: ({ query }) =>\n query\n ? `/search?q=${encodeURIComponent(query)}&type=statuses`\n : '/search',\n icon: 'search',\n excludeViewMode: ({ query }) => (!query ? ['multi-column'] : []),\n },\n 'account-statuses': {\n id: 'account-statuses',\n title: fetchAccountTitle,\n path: ({ id }) => `/a/${id}`,\n icon: 'user',\n },\n bookmarks: {\n id: 'bookmarks',\n title: 'Bookmarks',\n path: '/b',\n icon: 'bookmark',\n },\n favourites: {\n id: 'favourites',\n title: 'Likes',\n path: '/f',\n icon: 'heart',\n },\n hashtag: {\n id: 'hashtag',\n title: ({ hashtag }) => hashtag,\n subtitle: ({ instance }) => instance || api().instance,\n path: ({ hashtag, instance, media }) =>\n `${instance ? `/${instance}` : ''}/t/${hashtag.split(/\\s+/).join('+')}${\n media ? '?media=1' : ''\n }`,\n icon: 'hashtag',\n },\n};\n\nfunction ShortcutsSettings({ onClose }) {\n const snapStates = useSnapshot(states);\n const { shortcuts } = snapStates;\n const [showForm, setShowForm] = useState(false);\n const [showImportExport, setShowImportExport] = useState(false);\n\n const [shortcutsListParent] = useAutoAnimate();\n\n return (\n <div id=\"shortcuts-settings-container\" class=\"sheet\" tabindex=\"-1\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" />\n </button>\n )}\n <header>\n <h2>\n <Icon icon=\"shortcut\" /> Shortcuts{' '}\n <sup\n style={{\n fontSize: 12,\n opacity: 0.5,\n textTransform: 'uppercase',\n }}\n >\n beta\n </sup>\n </h2>\n </header>\n <main>\n <p>Specify a list of shortcuts that'll appear&nbsp;as:</p>\n <div class=\"shortcuts-view-mode\">\n {[\n {\n value: 'float-button',\n label: 'Floating button',\n imgURL: floatingButtonUrl,\n },\n {\n value: 'tab-menu-bar',\n label: 'Tab/Menu bar',\n imgURL: tabMenuBarUrl,\n },\n {\n value: 'multi-column',\n label: 'Multi-column',\n imgURL: multiColumnUrl,\n },\n ].map(({ value, label, imgURL }) => {\n const checked =\n snapStates.settings.shortcutsViewMode === value ||\n (value === 'float-button' &&\n !snapStates.settings.shortcutsViewMode);\n return (\n <label key={value} class={checked ? 'checked' : ''}>\n <input\n type=\"radio\"\n name=\"shortcuts-view-mode\"\n value={value}\n checked={checked}\n onChange={(e) => {\n states.settings.shortcutsViewMode = e.target.value;\n }}\n />{' '}\n <img src={imgURL} alt=\"\" width=\"80\" height=\"58\" />{' '}\n <span>{label}</span>\n </label>\n );\n })}\n </div>\n {shortcuts.length > 0 ? (\n <>\n <ol class=\"shortcuts-list\" ref={shortcutsListParent}>\n {shortcuts.filter(Boolean).map((shortcut, i) => {\n // const key = i + Object.values(shortcut);\n const key = Object.values(shortcut).join('-');\n const { type } = shortcut;\n if (!SHORTCUTS_META[type]) return null;\n let { icon, title, subtitle, excludeViewMode } =\n SHORTCUTS_META[type];\n if (typeof title === 'function') {\n title = title(shortcut, i);\n }\n if (typeof subtitle === 'function') {\n subtitle = subtitle(shortcut, i);\n }\n if (typeof icon === 'function') {\n icon = icon(shortcut, i);\n }\n if (typeof excludeViewMode === 'function') {\n excludeViewMode = excludeViewMode(shortcut, i);\n }\n const excludedViewMode = excludeViewMode?.includes(\n snapStates.settings.shortcutsViewMode,\n );\n return (\n <li key={key}>\n <Icon icon={icon} />\n <span class=\"shortcut-text\">\n <AsyncText>{title}</AsyncText>\n {subtitle && (\n <>\n {' '}\n <small class=\"ib insignificant\">{subtitle}</small>\n </>\n )}\n {excludedViewMode && (\n <span class=\"tag\">\n Not available in current view mode\n </span>\n )}\n </span>\n <span class=\"shortcut-actions\">\n <button\n type=\"button\"\n class=\"plain small\"\n disabled={i === 0}\n onClick={() => {\n const shortcutsArr = Array.from(states.shortcuts);\n if (i > 0) {\n const temp = states.shortcuts[i - 1];\n shortcutsArr[i - 1] = shortcut;\n shortcutsArr[i] = temp;\n states.shortcuts = shortcutsArr;\n }\n }}\n >\n <Icon icon=\"arrow-up\" alt=\"Move up\" />\n </button>\n <button\n type=\"button\"\n class=\"plain small\"\n disabled={i === shortcuts.length - 1}\n onClick={() => {\n const shortcutsArr = Array.from(states.shortcuts);\n if (i < states.shortcuts.length - 1) {\n const temp = states.shortcuts[i + 1];\n shortcutsArr[i + 1] = shortcut;\n shortcutsArr[i] = temp;\n states.shortcuts = shortcutsArr;\n }\n }}\n >\n <Icon icon=\"arrow-down\" alt=\"Move down\" />\n </button>\n <button\n type=\"button\"\n class=\"plain small\"\n onClick={() => {\n setShowForm({\n shortcut,\n shortcutIndex: i,\n });\n }}\n >\n <Icon icon=\"pencil\" alt=\"Edit\" />\n </button>\n {/* <button\n type=\"button\"\n class=\"plain small\"\n onClick={() => {\n states.shortcuts.splice(i, 1);\n }}\n >\n <Icon icon=\"x\" alt=\"Remove\" />\n </button> */}\n </span>\n </li>\n );\n })}\n </ol>\n {shortcuts.length === 1 &&\n snapStates.settings.shortcutsViewMode !== 'float-button' && (\n <div class=\"ui-state insignificant\">\n <Icon icon=\"info\" />{' '}\n <small>\n Add more than one shortcut/column to make this work.\n </small>\n </div>\n )}\n </>\n ) : (\n <div class=\"ui-state insignificant\">\n <p>\n {snapStates.settings.shortcutsViewMode === 'multi-column'\n ? 'No columns yet. Tap on the Add column button.'\n : 'No shortcuts yet. Tap on the Add shortcut button.'}\n </p>\n <p>\n Not sure what to add?\n <br />\n Try adding{' '}\n <a\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n states.shortcuts = [\n {\n type: 'following',\n },\n {\n type: 'notifications',\n },\n ];\n }}\n >\n Home / Following and Notifications\n </a>{' '}\n first.\n </p>\n </div>\n )}\n <p class=\"insignificant\">\n {shortcuts.length >= SHORTCUTS_LIMIT &&\n (snapStates.settings.shortcutsViewMode === 'multi-column'\n ? `Max ${SHORTCUTS_LIMIT} columns`\n : `Max ${SHORTCUTS_LIMIT} shortcuts`)}\n </p>\n <p\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <button\n type=\"button\"\n class=\"light\"\n onClick={() => setShowImportExport(true)}\n >\n Import/export\n </button>\n <button\n type=\"button\"\n disabled={shortcuts.length >= SHORTCUTS_LIMIT}\n onClick={() => setShowForm(true)}\n >\n <Icon icon=\"plus\" />{' '}\n <span>\n {snapStates.settings.shortcutsViewMode === 'multi-column'\n ? 'Add column…'\n : '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: `Specific list is optional. For multi-column mode, list is required, else the column will not be shown.`,\n search: `For multi-column mode, search term is required, else the column will not be shown.`,\n hashtag: 'Multiple hashtags are supported. Space-separated.',\n};\n\nfunction ShortcutForm({\n onSubmit,\n disabled,\n shortcut,\n shortcutIndex,\n onClose,\n}) {\n console.log('shortcut', shortcut);\n const editMode = !!shortcut;\n const [currentType, setCurrentType] = useState(shortcut?.type || null);\n const { masto } = api();\n\n const [uiState, setUIState] = useState('default');\n const [lists, setLists] = useState([]);\n const [followedHashtags, setFollowedHashtags] = useState([]);\n useEffect(() => {\n (async () => {\n if (currentType !== 'list') return;\n try {\n setUIState('loading');\n const lists = await 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\" />\n </button>\n )}\n <header>\n <h2>{editMode ? 'Edit' : 'Add'} shortcut</h2>\n </header>\n <main tabindex=\"-1\">\n <form\n ref={formRef}\n onSubmit={(e) => {\n // Construct a nice object from form\n e.preventDefault();\n const data = new FormData(e.target);\n const result = {};\n data.forEach((value, key) => {\n result[key] = value?.trim();\n if (key === 'instance') {\n // Remove protocol and trailing slash\n result[key] = result[key]\n .replace(/^https?:\\/\\//, '')\n .replace(/\\/+$/, '');\n // Remove @acct@ or acct@ from instance URL\n result[key] = result[key].replace(/^@?[^@]+@/, '');\n }\n });\n console.log('result', result);\n if (!result.type) return;\n onSubmit({\n result,\n mode: editMode ? 'edit' : 'add',\n });\n // Reset\n e.target.reset();\n setCurrentType(null);\n onClose?.();\n }}\n >\n <p>\n <label>\n <span>Timeline</span>\n <select\n required\n disabled={disabled}\n onChange={(e) => {\n setCurrentType(e.target.value);\n }}\n defaultValue={editMode ? shortcut.type : undefined}\n name=\"type\"\n >\n <option></option>\n {TYPES.map((type) => (\n <option value={type}>{TYPE_TEXT[type]}</option>\n ))}\n </select>\n </label>\n </p>\n {TYPE_PARAMS[currentType]?.map?.(\n ({ text, name, type, placeholder, pattern, notRequired }) => {\n if (currentType === 'list') {\n return (\n <p>\n <label>\n <span>List</span>\n <select\n name=\"id\"\n required={!notRequired}\n disabled={disabled || uiState === 'loading'}\n defaultValue={editMode ? shortcut.id : undefined}\n >\n <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 />\n {currentType === 'hashtag' &&\n followedHashtags.length > 0 && (\n <datalist id=\"followed-hashtags-datalist\">\n {followedHashtags.map((tag) => (\n <option value={tag.name} />\n ))}\n </datalist>\n )}\n </label>\n </p>\n );\n },\n )}\n {!!FORM_NOTES[currentType] && (\n <p class=\"form-note insignificant\">\n <Icon icon=\"info\" />\n {FORM_NOTES[currentType]}\n </p>\n )}\n <footer>\n <button\n type=\"submit\"\n class=\"block\"\n disabled={disabled || uiState === 'loading'}\n >\n {editMode ? 'Save' : 'Add'}\n </button>\n {editMode && (\n <button\n type=\"button\"\n class=\"light danger\"\n onClick={() => {\n states.shortcuts.splice(shortcutIndex, 1);\n onClose?.();\n }}\n >\n Remove\n </button>\n )}\n </footer>\n </form>\n </main>\n </div>\n );\n}\n\nfunction ImportExport({ shortcuts, onClose }) {\n const { 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\" />\n </button>\n )}\n <header>\n <h2>\n Import/Export <small class=\"ib insignificant\">Shortcuts</small>\n </h2>\n </header>\n <main tabindex=\"-1\">\n <section>\n <h3>\n <Icon icon=\"arrow-down-circle\" size=\"l\" class=\"insignificant\" />{' '}\n <span>Import</span>\n </h3>\n <p class=\"field-button\">\n <input\n ref={shortcutsImportFieldRef}\n type=\"text\"\n name=\"import\"\n placeholder=\"Paste shortcuts here\"\n class=\"block\"\n onInput={(e) => {\n setImportShortcutStr(e.target.value);\n }}\n />\n {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 '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('Unable to download shortcuts');\n }\n }}\n title=\"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>* Exists in current shortcuts</small>\n <br />\n <small>\n ⚠️ List may not work if it's from a different account.\n </small>\n </p>\n </>\n )}\n {importUIState === 'error' && (\n <p class=\"error\">\n <small>⚠️ Invalid settings format</small>\n </p>\n )}\n <p>\n {hasCurrentSettings && (\n <>\n <MenuConfirm\n confirmLabel=\"Append to current shortcuts?\"\n menuFooter={\n <div class=\"footer\">\n Only shortcuts that dont exist in current shortcuts will\n be appended.\n </div>\n }\n onClick={() => {\n // states.shortcuts = [\n // ...states.shortcuts,\n // ...parsedImportShortcutStr,\n // ];\n // Append non-unique shortcuts only\n const nonUniqueShortcuts = parsedImportShortcutStr.filter(\n (shortcut) =>\n !states.shortcuts.some((s) =>\n // Compare all properties\n Object.keys(s).every(\n (key) => s[key] === shortcut[key],\n ),\n ),\n );\n if (!nonUniqueShortcuts.length) {\n showToast('No new shortcuts to import');\n return;\n }\n let newShortcuts = [\n ...states.shortcuts,\n ...nonUniqueShortcuts,\n ];\n const exceededLimit = newShortcuts.length > SHORTCUTS_LIMIT;\n if (exceededLimit) {\n // If exceeded, trim it\n newShortcuts = newShortcuts.slice(0, SHORTCUTS_LIMIT);\n }\n states.shortcuts = newShortcuts;\n showToast(\n exceededLimit\n ? `Shortcuts imported. Exceeded max ${SHORTCUTS_LIMIT}, so the rest are not imported.`\n : 'Shortcuts imported',\n );\n onClose?.();\n }}\n >\n <button\n type=\"button\"\n class=\"plain2\"\n disabled={!parsedImportShortcutStr}\n >\n Import & append…\n </button>\n </MenuConfirm>{' '}\n </>\n )}\n <MenuConfirm\n confirmLabel={\n hasCurrentSettings\n ? 'Override current shortcuts?'\n : 'Import shortcuts?'\n }\n menuItemClassName={hasCurrentSettings ? 'danger' : undefined}\n onClick={() => {\n states.shortcuts = parsedImportShortcutStr;\n showToast('Shortcuts imported');\n onClose?.();\n }}\n >\n <button\n type=\"button\"\n class=\"plain2\"\n disabled={!parsedImportShortcutStr}\n >\n {hasCurrentSettings ? 'or override…' : 'Import…'}\n </button>\n </MenuConfirm>\n </p>\n </section>\n <section>\n <h3>\n <Icon icon=\"arrow-up-circle\" size=\"l\" class=\"insignificant\" />{' '}\n <span>Export</span>\n </h3>\n <p>\n <input\n style={{ width: '100%' }}\n type=\"text\"\n value={shortcutsStr}\n readOnly\n onClick={(e) => {\n if (!e.target.value) return;\n e.target.select();\n // Copy url to clipboard\n try {\n navigator.clipboard.writeText(e.target.value);\n showToast('Shortcuts copied');\n } catch (e) {\n console.error(e);\n showToast('Unable to copy shortcuts');\n }\n }}\n />\n </p>\n <p>\n <button\n type=\"button\"\n class=\"plain2\"\n disabled={!shortcutsStr}\n onClick={() => {\n try {\n navigator.clipboard.writeText(shortcutsStr);\n showToast('Shortcut settings copied');\n } catch (e) {\n console.error(e);\n showToast('Unable to copy shortcut settings');\n }\n }}\n >\n <Icon icon=\"clipboard\" /> <span>Copy</span>\n </button>{' '}\n {navigator?.share &&\n navigator?.canShare?.({\n text: shortcutsStr,\n }) && (\n <button\n type=\"button\"\n class=\"plain2\"\n disabled={!shortcutsStr}\n onClick={() => {\n try {\n navigator.share({\n text: shortcutsStr,\n });\n } catch (e) {\n console.error(e);\n alert(\"Sharing doesn't seem to work.\");\n }\n }}\n >\n <Icon icon=\"share\" /> <span>Share</span>\n </button>\n )}{' '}\n {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 if (\n /<phanpy-shortcuts-settings>(.*)<\\/phanpy-shortcuts-settings>/.test(\n note,\n )\n ) {\n const settingsJSON = JSON.stringify({\n v: '1', // version\n dt: Date.now(), // datetime stamp\n data: shortcutsStr, // shortcuts settings string\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('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('Shortcuts saved');\n }\n } catch (e) {\n console.error(e);\n setImportUIState('error');\n showToast('Unable to save shortcuts');\n }\n }}\n title=\"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 {shortcutsStr.length} characters\n </small>\n )}\n </p>\n {!!shortcutsStr && (\n <details>\n <summary class=\"insignificant\">\n <small>Raw Shortcuts JSON</small>\n </summary>\n <textarea style={{ width: '100%' }} rows={10} readOnly>\n {JSON.stringify(shortcuts.filter(Boolean), null, 2)}\n </textarea>\n </details>\n )}\n </section>\n {states.settings.shortcutSettingsCloudImportExport && (\n <footer>\n <p>\n <Icon icon=\"cloud\" /> Import/export settings from/to instance\n server (Very experimental)\n </p>\n </footer>\n )}\n </main>\n </div>\n );\n}\n\nexport default ShortcutsSettings;\n","import { 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 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 } = results || {};\n states.showCompose = false;\n window.__COMPOSE__ = null;\n if (newStatus) {\n states.reloadStatusPage++;\n showToast({\n text: {\n post: 'Post published. Check it out.',\n reply: 'Reply posted. Check it out.',\n edit: 'Post updated. Check it out.',\n }[type || 'post'],\n delay: 1000,\n duration: 10_000, // 10 seconds\n onClick: (toast) => {\n toast.hideToast();\n states.prevLocation = location;\n navigate(\n instance\n ? `/${instance}/s/${newStatus.id}`\n : `/s/${newStatus.id}`,\n );\n },\n });\n }\n }}\n />\n </Modal>\n )}\n {!!snapStates.showSettings && (\n <Modal\n onClose={() => {\n states.showSettings = false;\n }}\n >\n <Settings\n onClose={() => {\n states.showSettings = false;\n }}\n />\n </Modal>\n )}\n {!!snapStates.showAccounts && (\n <Modal\n onClose={() => {\n states.showAccounts = false;\n }}\n >\n <Accounts\n onClose={() => {\n states.showAccounts = false;\n }}\n />\n </Modal>\n )}\n {!!snapStates.showAccount && (\n <Modal\n onClose={() => {\n states.showAccount = false;\n }}\n >\n <AccountSheet\n account={snapStates.showAccount?.account || snapStates.showAccount}\n instance={snapStates.showAccount?.instance}\n onClose={({ destination } = {}) => {\n states.showAccount = false;\n // states.showGenericAccounts = false;\n // if (destination) {\n // states.showAccounts = false;\n // }\n }}\n />\n </Modal>\n )}\n {!!snapStates.showDrafts && (\n <Modal\n onClose={() => {\n states.showDrafts = false;\n }}\n >\n <Drafts onClose={() => (states.showDrafts = false)} />\n </Modal>\n )}\n {!!snapStates.showMediaModal && (\n <Modal\n onClick={(e) => {\n if (\n e.target === e.currentTarget ||\n e.target.classList.contains('media')\n ) {\n states.showMediaModal = false;\n }\n }}\n >\n <MediaModal\n mediaAttachments={snapStates.showMediaModal.mediaAttachments}\n instance={snapStates.showMediaModal.instance}\n index={snapStates.showMediaModal.index}\n statusID={snapStates.showMediaModal.statusID}\n onClose={() => {\n states.showMediaModal = false;\n }}\n />\n </Modal>\n )}\n {!!snapStates.showShortcutsSettings && (\n <Modal\n 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 { useState } from 'preact/hooks';\n\nimport { api } from '../utils/api';\n\nimport Icon from './icon';\nimport Loader from './loader';\n\nfunction FollowRequestButtons({ accountID, onChange }) {\n const { masto } = api();\n const [uiState, setUIState] = useState('default');\n const [requestState, setRequestState] = useState(null); // accept, reject\n const [relationship, setRelationship] = useState(null);\n\n const hasRelationship = relationship !== null;\n\n return (\n <p class=\"follow-request-buttons\">\n <button\n type=\"button\"\n disabled={uiState === 'loading' || hasRelationship}\n onClick={() => {\n setUIState('loading');\n setRequestState('accept');\n (async () => {\n try {\n const rel = await masto.v1.followRequests\n .$select(accountID)\n .authorize();\n if (!rel?.followedBy) {\n throw new Error('Follow request not accepted');\n }\n setRelationship(rel);\n onChange();\n } catch (e) {\n console.error(e);\n }\n setUIState('default');\n })();\n }}\n >\n Accept\n </button>{' '}\n <button\n type=\"button\"\n disabled={uiState === 'loading' || hasRelationship}\n class=\"light danger\"\n onClick={() => {\n setUIState('loading');\n setRequestState('reject');\n (async () => {\n try {\n const rel = await masto.v1.followRequests\n .$select(accountID)\n .reject();\n if (rel?.followedBy) {\n throw new Error('Follow request not rejected');\n }\n setRelationship(rel);\n onChange();\n } catch (e) {\n console.error(e);\n setUIState('default');\n }\n })();\n }}\n >\n Reject\n </button>\n <span class=\"follow-request-states\">\n {hasRelationship && requestState ? (\n requestState === 'accept' ? (\n <Icon icon=\"check-circle\" alt=\"Accepted\" class=\"follow-accepted\" />\n ) : (\n <Icon icon=\"x-circle\" alt=\"Rejected\" class=\"follow-rejected\" />\n )\n ) : (\n <Loader hidden={uiState !== 'loading'} />\n )}\n </span>\n </p>\n );\n}\n\nexport default FollowRequestButtons;\n","import { Fragment } from 'preact';\nimport { memo } from 'preact/compat';\n\nimport shortenNumber from '../utils/shorten-number';\nimport states, { statusKey } from '../utils/states';\nimport store from '../utils/store';\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 RelativeTime from './relative-time';\nimport Status from './status';\n\nconst NOTIFICATION_ICONS = {\n mention: 'comment',\n status: 'notification',\n reblog: 'rocket',\n follow: 'follow',\n follow_request: 'follow-add',\n favourite: 'heart',\n poll: 'poll',\n update: 'pencil',\n 'admin.signup': 'account-edit',\n 'admin.report': 'account-warning',\n severed_relationships: 'heart-break',\n moderation_warning: 'alert',\n emoji_reaction: 'emoji2',\n 'pleroma:emoji_reaction': 'emoji2',\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(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 return url ? (\n <>\n reacted to your post with{' '}\n <CustomEmoji url={url} staticUrl={staticUrl} alt={emoji} />\n </>\n ) : (\n `reacted to your post with ${emoji}.`\n );\n}\nconst contentText = {\n mention: 'mentioned you in their post.',\n status: 'published a post.',\n reblog: 'boosted your post.',\n 'reblog+account': (count) => `boosted ${count} of your posts.`,\n reblog_reply: 'boosted your reply.',\n follow: 'followed you.',\n follow_request: 'requested to follow you.',\n favourite: 'liked your post.',\n 'favourite+account': (count) => `liked ${count} of your posts.`,\n favourite_reply: 'liked your reply.',\n poll: 'A poll you have voted in or created has ended.',\n 'poll-self': 'A poll you have created has ended.',\n 'poll-voted': 'A poll you have voted in has ended.',\n update: 'A post you interacted with has been edited.',\n 'favourite+reblog': 'boosted & liked your post.',\n 'favourite+reblog+account': (count) =>\n `boosted & liked ${count} of your posts.`,\n 'favourite+reblog_reply': 'boosted & liked your reply.',\n 'admin.sign_up': 'signed up.',\n 'admin.report': (targetAccount) => <>reported {targetAccount}</>,\n severed_relationships: (name) => (\n <>\n Lost connections with <i>{name}</i>.\n </>\n ),\n moderation_warning: <b>Moderation warning</b>,\n emoji_reaction: emojiText,\n 'pleroma:emoji_reaction': emojiText,\n};\n\n// account_suspension, domain_block, user_domain_block\nconst SEVERED_RELATIONSHIPS_TEXT = {\n account_suspension: ({ from, targetName }) => (\n <>\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 </>\n ),\n domain_block: ({ from, targetName, followersCount, followingCount }) => (\n <>\n An admin from <i>{from}</i> has blocked <i>{targetName}</i>. Affected\n followers: {followersCount}, followings: {followingCount}.\n </>\n ),\n user_domain_block: ({ targetName, followersCount, followingCount }) => (\n <>\n You have blocked <i>{targetName}</i>. Removed followers: {followersCount},\n followings: {followingCount}.\n </>\n ),\n};\n\nconst MODERATION_WARNING_TEXT = {\n none: 'Your account has received a moderation warning.',\n disable: 'Your account has been disabled.',\n mark_statuses_as_sensitive:\n 'Some of your posts have been marked as sensitive.',\n delete_statuses: 'Some of your posts have been deleted.',\n sensitive: 'Your posts will be marked as sensitive from now on.',\n silence: 'Your account has been limited.',\n suspend: '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 {\n id,\n status,\n account,\n report,\n event,\n moderation_warning,\n _accounts,\n _statuses,\n } = notification;\n let { type } = notification;\n\n // status = Attached when type of the notification is favourite, reblog, status, mention, poll, or update\n const actualStatus = status?.reblog || status;\n const actualStatusID = actualStatus?.id;\n\n const currentAccount = 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 for (const account of _accounts) {\n if (account._types?.includes('favourite')) {\n favsCount++;\n }\n if (account._types?.includes('reblog')) {\n reblogsCount++;\n }\n }\n if (!reblogsCount && favsCount) type = 'favourite';\n if (!favsCount && reblogsCount) type = 'reblog';\n }\n\n let text;\n if (type === 'poll') {\n text = contentText[isSelf ? 'poll-self' : isVoted ? 'poll-voted' : 'poll'];\n } else if (\n type === 'reblog' ||\n type === 'favourite' ||\n type === 'favourite+reblog'\n ) {\n if (_statuses?.length > 1) {\n text = contentText[`${type}+account`];\n } else if (isReplyToOthers) {\n text = contentText[`${type}_reply`];\n } else {\n text = contentText[type];\n }\n } else if (contentText[type]) {\n text = contentText[type];\n } else {\n // Anticipate unhandled notification types, possibly from Mastodon forks or non-Mastodon instances\n // This surfaces the error to the user, hoping that users will report it\n text = `[Unknown notification type: ${type}]`;\n }\n\n if (typeof text === 'function') {\n const count = _statuses?.length || _accounts?.length;\n if (type === 'admin.report') {\n const targetAccount = report?.targetAccount;\n if (targetAccount) {\n text = text(<NameText account={targetAccount} showAvatar />);\n }\n } else if (type === 'severed_relationships') {\n const targetName = event?.targetName;\n if (targetName) {\n text = text(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(notification.emoji, emojiURL);\n } else if (count) {\n text = text(count);\n }\n }\n\n if (type === 'mention' && !status) {\n // Could be deleted\n return null;\n }\n\n const formattedCreatedAt =\n notification.createdAt && new Date(notification.createdAt).toLocaleString();\n\n const genericAccountsHeading =\n {\n 'favourite+reblog': 'Boosted/Liked by…',\n favourite: 'Liked by…',\n reblog: 'Boosted by…',\n follow: 'Followed by…',\n }[type] || 'Accounts';\n const handleOpenGenericAccounts = () => {\n states.showGenericAccounts = {\n heading: genericAccountsHeading,\n accounts: _accounts,\n showReactions: type === 'favourite+reblog',\n excludeRelationshipAttrs: type === 'follow' ? ['followedBy'] : [],\n postID: statusKey(actualStatusID, instance),\n };\n };\n\n console.debug('RENDER Notification', notification.id);\n\n return (\n <div\n class={`notification notification-${type}`}\n data-notification-id={id}\n tabIndex=\"0\"\n >\n <div\n class={`notification-type notification-${type}`}\n title={formattedCreatedAt}\n >\n {type === 'favourite+reblog' ? (\n <>\n <Icon icon=\"rocket\" size=\"xl\" alt={type} class=\"reblog-icon\" />\n <Icon icon=\"heart\" size=\"xl\" alt={type} class=\"favourite-icon\" />\n </>\n ) : (\n <Icon\n icon={NOTIFICATION_ICONS[type] || 'notification'}\n size=\"xl\"\n alt={type}\n />\n )}\n </div>\n <div class=\"notification-content\">\n {type !== 'mention' && (\n <>\n <p>\n {!/poll|update|severed_relationships/i.test(type) && (\n <>\n {_accounts?.length > 1 ? (\n <>\n <b tabIndex=\"0\" onClick={handleOpenGenericAccounts}>\n <span title={_accounts.length}>\n {shortenNumber(_accounts.length)}\n </span>{' '}\n people\n </b>{' '}\n </>\n ) : (\n account && (\n <>\n <NameText account={account} showAvatar />{' '}\n </>\n )\n )}\n </>\n )}\n {text}\n {type === 'mention' && (\n <span class=\"insignificant\">\n {' '}\n •{' '}\n <RelativeTime\n datetime={notification.createdAt}\n format=\"micro\"\n />\n </span>\n )}\n </p>\n {type === 'follow_request' && (\n <FollowRequestButtons accountID={account.id} />\n )}\n {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 noreferrer\"\n >\n Learn more <Icon icon=\"external\" size=\"s\" />\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 noreferrer\"\n >\n Learn more <Icon icon=\"external\" size=\"s\" />\n </a>\n .\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 noreferrer\"\n class=\"account-avatar-stack\"\n onClick={(e) => {\n e.preventDefault();\n states.showAccount = account;\n }}\n >\n <Avatar\n url={account.avatarStatic}\n size={\n _accounts.length <= 10\n ? 'xxl'\n : _accounts.length < 20\n ? 'xl'\n : '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 <button\n type=\"button\"\n class=\"small plain\"\n onClick={handleOpenGenericAccounts}\n >\n {_accounts.length > AVATARS_LIMIT &&\n `+${_accounts.length - AVATARS_LIMIT}`}\n <Icon icon=\"chevron-down\" />\n </button>\n </p>\n )}\n {_statuses?.length > 1 && (\n <ul class=\"notification-group-statuses\">\n {_statuses.map((status) => (\n <li key={status.id}>\n <TruncatedLink\n class={`status-link status-type-${type}`}\n to={\n instance ? `/${instance}/s/${status.id}` : `/s/${status.id}`\n }\n >\n <Status\n status={status}\n size=\"s\"\n previewMode\n allowContextMenu\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 />\n ) : (\n <Status\n statusID={actualStatusID}\n size=\"s\"\n readOnly\n allowContextMenu\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=\"Read more →\" ref={ref} />;\n}\n\nexport default memo(Notification, (oldProps, newProps) => {\n return oldProps.notification?.id === newProps.notification?.id;\n});\n","import { memo } from 'preact/compat';\nimport { useLayoutEffect, useState } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport { api } from '../utils/api';\nimport states from '../utils/states';\nimport {\n getAccountByAccessToken,\n getCurrentAccount,\n} from '../utils/store-utils';\nimport usePageVisibility from '../utils/usePageVisibility';\n\nimport Icon from './icon';\nimport Link from './link';\nimport Modal from './modal';\nimport Notification from './notification';\n\n{\n if ('serviceWorker' in navigator) {\n console.log('👂👂👂 Listen to message');\n navigator.serviceWorker.addEventListener('message', (event) => {\n console.log('💥💥💥 Message event', event);\n const { type, id, accessToken } = event?.data || {};\n if (type === 'notification') {\n states.routeNotification = {\n id,\n accessToken,\n };\n }\n });\n }\n}\n\nexport default memo(function NotificationService() {\n if (!('serviceWorker' in navigator)) return null;\n\n const snapStates = useSnapshot(states);\n const { routeNotification } = snapStates;\n\n console.log('🛎️ Notification service', routeNotification);\n\n const { id, accessToken } = routeNotification || {};\n const [showNotificationSheet, setShowNotificationSheet] = useState(false);\n\n useLayoutEffect(() => {\n if (!id || !accessToken) return;\n const { instance: currentInstance } = api();\n const { masto, instance } = api({\n accessToken,\n });\n console.log('API', { accessToken, currentInstance, instance });\n const sameInstance = currentInstance === instance;\n const account = accessToken\n ? getAccountByAccessToken(accessToken)\n : getCurrentAccount();\n (async () => {\n const notification = await masto.v1.notifications.$select(id).fetch();\n if (notification && account) {\n console.log('🛎️ Notification', { id, notification, account });\n const accountInstance = account.instanceURL;\n const { type, status, account: notificationAccount } = notification;\n const hasModal = !!document.querySelector('#modal-container > *');\n const isFollow = type === 'follow' && !!notificationAccount?.id;\n const hasAccount = !!notificationAccount?.id;\n const hasStatus = !!status?.id;\n if (isFollow && sameInstance) {\n // Show account sheet, can handle different instances\n states.showAccount = {\n account: notificationAccount,\n instance: accountInstance,\n };\n } else if (hasModal || !sameInstance || (hasAccount && hasStatus)) {\n // Show sheet of notification, if\n // - there is a modal open\n // - the notification is from another instance\n // - the notification has both account and status, gives choice for users to go to account or status\n setShowNotificationSheet({\n id,\n account,\n notification,\n sameInstance,\n });\n } else {\n if (hasStatus) {\n // Go to status page\n location.hash = `/${currentInstance}/s/${status.id}`;\n } else if (isFollow) {\n // Go to profile page\n location.hash = `/${currentInstance}/a/${notificationAccount.id}`;\n } else {\n // Go to notifications page\n location.hash = '/notifications';\n }\n }\n } else {\n console.warn('🛎️ Notification not found', id);\n }\n })();\n }, [id, accessToken]);\n\n // useLayoutEffect(() => {\n // // Listen to message from service worker\n // const handleMessage = (event) => {\n // console.log('💥💥💥 Message event', event);\n // const { type, id, accessToken } = event?.data || {};\n // if (type === 'notification') {\n // states.routeNotification = {\n // id,\n // accessToken,\n // };\n // }\n // };\n // console.log('👂👂👂 Listen to message');\n // navigator.serviceWorker.addEventListener('message', handleMessage);\n // return () => {\n // console.log('👂👂👂 Remove listen to message');\n // navigator.serviceWorker.removeEventListener('message', handleMessage);\n // };\n // }, []);\n\n useLayoutEffect(() => {\n if (navigator?.clearAppBadge) {\n navigator.clearAppBadge();\n }\n }, []);\n usePageVisibility((visible) => {\n if (visible && navigator?.clearAppBadge) {\n console.log('🔰 Clear app badge');\n navigator.clearAppBadge();\n }\n });\n\n const onClose = () => {\n setShowNotificationSheet(false);\n states.routeNotification = null;\n\n // If url is #/notifications?id=123, go to #/notifications\n if (/\\/notifications\\?id=/i.test(location.hash)) {\n location.hash = '/notifications';\n }\n };\n\n if (showNotificationSheet) {\n const { id, account, notification, sameInstance } = showNotificationSheet;\n return (\n <Modal\n onClick={(e) => {\n if (e.target === e.currentTarget) {\n onClose();\n }\n }}\n >\n <div class=\"sheet\" tabIndex=\"-1\">\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" />\n </button>\n <header>\n <b>Notification</b>\n </header>\n <main>\n {!sameInstance && (\n <p>This notification is from your other account.</p>\n )}\n <div\n class=\"notification-peek\"\n // style={{\n // pointerEvents: sameInstance ? '' : 'none',\n // }}\n onClick={(e) => {\n const { target } = e;\n // If button or links\n if (e.target.tagName === 'BUTTON' || e.target.tagName === 'A') {\n onClose();\n }\n }}\n >\n <Notification\n instance={account.instanceURL}\n notification={notification}\n isStatic\n />\n </div>\n <div\n style={{\n textAlign: 'end',\n }}\n >\n <Link to=\"/notifications\" class=\"button light\" onClick={onClose}>\n <span>View all notifications</span> <Icon icon=\"arrow-right\" />\n </Link>\n </div>\n </main>\n </div>\n </Modal>\n );\n }\n\n return null;\n});\n","import { forwardRef } from 'preact/compat';\nimport { useImperativeHandle, useRef, useState } from 'preact/hooks';\nimport { useSearchParams } from 'react-router-dom';\n\nimport { api } from '../utils/api';\n\nimport Icon from './icon';\nimport Link from './link';\n\nconst SearchForm = forwardRef((props, ref) => {\n const { instance } = api();\n const [searchParams, setSearchParams] = useSearchParams();\n const [searchMenuOpen, setSearchMenuOpen] = useState(false);\n const [query, setQuery] = useState(searchParams.get('q') || '');\n const type = searchParams.get('type');\n const formRef = useRef(null);\n\n const searchFieldRef = useRef(null);\n useImperativeHandle(ref, () => ({\n setValue: (value) => {\n setQuery(value);\n },\n focus: () => {\n searchFieldRef.current.focus();\n },\n select: () => {\n searchFieldRef.current.select();\n },\n blur: () => {\n searchFieldRef.current.blur();\n },\n }));\n\n return (\n <form\n ref={formRef}\n class=\"search-popover-container\"\n onSubmit={(e) => {\n e.preventDefault();\n\n const isSearchPage = /\\/search/.test(location.hash);\n if (isSearchPage) {\n if (query) {\n const params = {\n q: query,\n };\n if (type) params.type = type; // Preserve type\n setSearchParams(params);\n } else {\n setSearchParams({});\n }\n } else {\n if (query) {\n location.hash = `/search?q=${encodeURIComponent(query)}${\n type ? `&type=${type}` : ''\n }`;\n } else {\n location.hash = `/search`;\n }\n }\n\n props?.onSubmit?.(e);\n }}\n >\n <input\n ref={searchFieldRef}\n value={query}\n name=\"q\"\n type=\"search\"\n // autofocus\n placeholder=\"Search\"\n dir=\"auto\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n autocapitalize=\"off\"\n 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 <>\n {query}{' '}\n <small class=\"insignificant\">\n accounts, hashtags &amp; posts\n </small>\n </>\n ),\n to: `/search?q=${encodeURIComponent(query)}`,\n top: !type && !/\\s/.test(query),\n hidden: !!type,\n },\n {\n label: (\n <>\n Posts with <q>{query}</q>\n </>\n ),\n to: `/search?q=${encodeURIComponent(query)}&type=statuses`,\n hidden: /^https?:/.test(query),\n top: /\\s/.test(query),\n icon: 'document',\n queryType: 'statuses',\n },\n {\n label: (\n <>\n Posts tagged with <mark>#{query.replace(/^#/, '')}</mark>\n </>\n ),\n to: `/${instance}/t/${query.replace(/^#/, '')}`,\n hidden:\n /^@/.test(query) || /^https?:/.test(query) || /\\s/.test(query),\n top: /^#/.test(query),\n type: 'link',\n icon: 'hashtag',\n queryType: 'hashtags',\n },\n {\n label: (\n <>\n Look up <mark>{query}</mark>\n </>\n ),\n to: `/${query}`,\n hidden: !/^https?:/.test(query),\n top: /^https?:/.test(query),\n type: 'link',\n },\n {\n label: (\n <>\n Accounts with <q>{query}</q>\n </>\n ),\n to: `/search?q=${encodeURIComponent(query)}&type=accounts`,\n 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 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 preventDefault: true,\n ignoreEventWhen: (e) => {\n const isSearchPage = /\\/search/.test(location.hash);\n const hasModal = !!document.querySelector('#modal-container > *');\n return isSearchPage || hasModal;\n },\n },\n );\n\n const closeSearch = () => {\n setShowSearch(false);\n onClose();\n };\n\n useHotkeys(\n 'esc',\n (e) => {\n searchFormRef.current?.blur?.();\n closeSearch();\n },\n {\n enabled: showSearch,\n enableOnFormTags: true,\n preventDefault: true,\n },\n );\n\n return (\n <div\n id=\"search-command-container\"\n hidden={!showSearch}\n onClick={(e) => {\n console.log(e);\n if (e.target === e.currentTarget) {\n closeSearch();\n }\n }}\n >\n <SearchForm\n ref={searchFormRef}\n onSubmit={() => {\n closeSearch();\n }}\n />\n </div>\n );\n});\n","import './shortcuts.css';\n\nimport { MenuDivider } from '@szhsin/react-menu';\nimport { memo } from 'preact/compat';\nimport { 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 Menu2 from './menu2';\nimport MenuLink from './menu-link';\nimport SubMenu2 from './submenu2';\n\nfunction Shortcuts() {\n const { instance } = api();\n const snapStates = useSnapshot(states);\n const { shortcuts, settings } = snapStates;\n\n if (!shortcuts.length) {\n return null;\n }\n if (\n settings.shortcutsViewMode === 'multi-column' ||\n (!settings.shortcutsViewMode && settings.shortcutsColumnsMode)\n ) {\n return null;\n }\n\n const menuRef = useRef();\n\n const 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 }\n if (typeof subtitle === 'function') {\n subtitle = subtitle(data, i);\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 const navigate = useNavigate();\n useHotkeys(['1', '2', '3', '4', '5', '6', '7', '8', '9'], (e, handler) => {\n const index = parseInt(handler.keys[0], 10) - 1;\n if (index < formattedShortcuts.length) {\n const { path } = formattedShortcuts[index];\n if (path) {\n navigate(path);\n menuRef.current?.closeMenu?.();\n }\n }\n });\n\n const [lists, setLists] = useState([]);\n\n return (\n <div id=\"shortcuts\">\n {snapStates.settings.shortcutsViewMode === 'tab-menu-bar' ? (\n <nav\n class=\"tab-bar\"\n onContextMenu={(e) => {\n e.preventDefault();\n states.showShortcutsSettings = true;\n }}\n >\n <ul>\n {formattedShortcuts.map(\n ({ id, path, title, subtitle, icon }, i) => {\n return (\n <li key={`${i}-${id}-${title}-${subtitle}-${path}`}>\n <Link\n class={subtitle ? 'has-subtitle' : ''}\n to={path}\n onClick={(e) => {\n if (e.target.classList.contains('is-active')) {\n e.preventDefault();\n const page = document.getElementById(`${id}-page`);\n console.log(id, page);\n if (page) {\n page.scrollTop = 0;\n const updatesButton =\n page.querySelector('.updates-button');\n if (updatesButton) {\n updatesButton.click();\n }\n }\n }\n }}\n >\n <Icon icon={icon} size=\"xl\" alt={title} />\n <span>\n <AsyncText>{title}</AsyncText>\n {subtitle && (\n <>\n <br />\n <small>{subtitle}</small>\n </>\n )}\n </span>\n </Link>\n </li>\n );\n },\n )}\n </ul>\n </nav>\n ) : (\n <Menu2\n instanceRef={menuRef}\n overflow=\"auto\"\n viewScroll=\"close\"\n menuClassName=\"glass-menu shortcuts-menu\"\n gap={8}\n position=\"anchor\"\n 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=\"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>All Lists</span>\n </MenuLink>\n <MenuDivider />\n {lists?.map((list) => (\n <MenuLink key={list.id} to={`/l/${list.id}`}>\n <span>{list.title}</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 { memo } from 'preact/compat';\nimport { useContext, useMemo } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport FilterContext from '../utils/filter-context';\nimport { isFiltered } from '../utils/filters';\nimport states, { statusKey } from '../utils/states';\nimport store from '../utils/store';\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 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 readingExpandMedia = useMemo(() => {\n // default | show_all | hide_all\n const prefs = store.account.get('preferences') || {};\n return prefs['reading:expand:media'] || 'default';\n }, []);\n const showSpoilerMedia = readingExpandMedia === 'show_all';\n\n const Parent = parent || 'div';\n\n return mediaAttachments.map((media, i) => {\n const mediaKey = `${sKey}-${media.id}`;\n const filterTitleStr = filterInfo?.titlesStr;\n return (\n <Parent\n data-state-post-id={sKey}\n onMouseEnter={debugHover}\n key={mediaKey}\n data-spoiler-text={\n spoilerText || (sensitive ? 'Sensitive media' : undefined)\n }\n data-filtered-text={\n filterInfo\n ? `Filtered${filterTitleStr ? `: ${filterTitleStr}` : ''}`\n : undefined\n }\n class={`\n media-post\n ${filterInfo ? 'filtered' : ''}\n ${hasSpoiler ? 'has-spoiler' : ''}\n ${showSpoilerMedia ? 'show-media' : ''}\n `}\n >\n <Media\n class={className}\n media={media}\n lang={language}\n to={`/${instance}/s/${id}?media-only=${i + 1}`}\n onClick={\n onMediaClick ? (e) => onMediaClick(e, i, media, status) : undefined\n }\n />\n </Parent>\n );\n });\n}\n\nexport default memo(MediaPost);\n","import './nav-menu.css';\n\nimport { ControlledMenu, MenuDivider, MenuItem } from '@szhsin/react-menu';\nimport { 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 { getCurrentAccountID } from '../utils/store-utils';\nimport supports from '../utils/supports';\n\nimport Avatar from './avatar';\nimport Icon from './icon';\nimport MenuLink from './menu-link';\nimport SubMenu2 from './submenu2';\n\nfunction NavMenu(props) {\n const snapStates = useSnapshot(states);\n const { masto, instance, authenticated } = api();\n\n const [currentAccount, moreThanOneAccount] = useMemo(() => {\n const accounts = store.local.getJSON('accounts') || [];\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.list({\n limit: 80,\n });\n }\n const results = await mutesIterator.current.next();\n return results;\n }\n\n const blocksIterator = useRef();\n async function fetchBlocks(firstLoad) {\n if (firstLoad || !blocksIterator.current) {\n blocksIterator.current = masto.v1.blocks.list({\n limit: 80,\n });\n }\n const results = await blocksIterator.current.next();\n return results;\n }\n\n 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 === 'open']);\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'} />\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('Reload page now to update?');\n if (yes) {\n (async () => {\n try {\n location.reload();\n } catch (e) {}\n })();\n }\n }}\n >\n <Icon icon=\"sparkles\" class=\"sparkle-icon\" size=\"l\" />{' '}\n <span>New update available…</span>\n </MenuItem>\n <MenuDivider />\n </div>\n )}\n <section>\n <MenuLink to=\"/\">\n <Icon icon=\"home\" size=\"l\" /> <span>Home</span>\n </MenuLink>\n {authenticated ? (\n <>\n {showFollowing && (\n <MenuLink to=\"/following\">\n <Icon icon=\"following\" size=\"l\" /> <span>Following</span>\n </MenuLink>\n )}\n <MenuLink to=\"/catchup\">\n <Icon icon=\"history2\" size=\"l\" />\n <span>Catch-up</span>\n </MenuLink>\n {supports('@mastodon/mentions') && (\n <MenuLink to=\"/mentions\">\n <Icon icon=\"at\" size=\"l\" /> <span>Mentions</span>\n </MenuLink>\n )}\n <MenuLink to=\"/notifications\">\n <Icon icon=\"notification\" size=\"l\" /> <span>Notifications</span>\n {snapStates.notificationsShowNew && (\n <sup title=\"New\" style={{ opacity: 0.5 }}>\n {' '}\n &bull;\n </sup>\n )}\n </MenuLink>\n <MenuDivider />\n {currentAccount?.info?.id && (\n <MenuLink to={`/${instance}/a/${currentAccount.info.id}`}>\n <Icon icon=\"user\" size=\"l\" /> <span>Profile</span>\n </MenuLink>\n )}\n {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\">Lists</span>\n <Icon icon=\"chevron-right\" />\n </>\n }\n >\n <MenuLink to=\"/l\">\n <span>All Lists</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>{list.title}</span>\n </MenuLink>\n ))}\n </>\n )}\n </SubMenu2>\n ) : (\n supportsLists && (\n <MenuLink to=\"/l\">\n <Icon icon=\"list\" size=\"l\" />\n <span>Lists</span>\n </MenuLink>\n )\n )}\n <MenuLink to=\"/b\">\n <Icon icon=\"bookmark\" size=\"l\" /> <span>Bookmarks</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\">More…</span>\n <Icon icon=\"chevron-right\" />\n </>\n }\n >\n <MenuLink to=\"/f\">\n <Icon icon=\"heart\" size=\"l\" /> <span>Likes</span>\n </MenuLink>\n <MenuLink to=\"/fh\">\n <Icon icon=\"hashtag\" size=\"l\" />{' '}\n <span>Followed Hashtags</span>\n </MenuLink>\n <MenuDivider />\n {supports('@mastodon/filters') && (\n <MenuLink to=\"/ft\">\n <Icon icon=\"filters\" size=\"l\" />\n Filters\n </MenuLink>\n )}\n <MenuItem\n onClick={() => {\n states.showGenericAccounts = {\n id: 'mute',\n heading: 'Muted users',\n fetchAccounts: fetchMutes,\n excludeRelationshipAttrs: ['muting'],\n };\n }}\n >\n <Icon icon=\"mute\" size=\"l\" /> Muted users&hellip;\n </MenuItem>\n <MenuItem\n onClick={() => {\n states.showGenericAccounts = {\n id: 'block',\n heading: 'Blocked users',\n fetchAccounts: fetchBlocks,\n excludeRelationshipAttrs: ['blocking'],\n };\n }}\n >\n <Icon icon=\"block\" size=\"l\" />\n Blocked users&hellip;\n </MenuItem>{' '}\n </SubMenu2>\n <MenuDivider />\n <MenuItem\n onClick={() => {\n states.showAccounts = true;\n }}\n >\n <Icon icon=\"group\" size=\"l\" /> <span>Accounts&hellip;</span>\n </MenuItem>\n </>\n ) : (\n <>\n <MenuDivider />\n <MenuLink to=\"/login\">\n <Icon icon=\"user\" size=\"l\" /> <span>Log in</span>\n </MenuLink>\n </>\n )}\n </section>\n <section>\n <MenuDivider />\n <MenuLink to={`/search`}>\n <Icon icon=\"search\" size=\"l\" /> <span>Search</span>\n </MenuLink>\n <MenuLink to={`/${instance}/trending`}>\n <Icon icon=\"chart\" size=\"l\" /> <span>Trending</span>\n </MenuLink>\n <MenuLink to={`/${instance}/p/l`}>\n <Icon icon=\"building\" size=\"l\" /> <span>Local</span>\n </MenuLink>\n <MenuLink to={`/${instance}/p`}>\n <Icon icon=\"earth\" size=\"l\" /> <span>Federated</span>\n </MenuLink>\n {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>Keyboard shortcuts</span>\n </MenuItem>\n <MenuItem\n onClick={() => {\n states.showShortcutsSettings = true;\n }}\n >\n <Icon icon=\"shortcut\" size=\"l\" />{' '}\n <span>Shortcuts / Columns&hellip;</span>\n </MenuItem>\n <MenuItem\n onClick={() => {\n states.showSettings = true;\n }}\n >\n <Icon icon=\"gear\" size=\"l\" /> <span>Settings&hellip;</span>\n </MenuItem>\n </>\n ) : (\n <>\n <MenuDivider />\n <MenuItem\n onClick={() => {\n states.showSettings = true;\n }}\n >\n <Icon icon=\"gear\" size=\"l\" /> <span>Settings&hellip;</span>\n </MenuItem>\n </>\n )}\n </section>\n </ControlledMenu>\n </>\n );\n}\n\nexport default memo(NavMenu);\n","import { 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 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: 'nearest',\n inline: 'center',\n behavior: 'smooth',\n};\n\nfunction Timeline({\n title,\n titleComponent,\n id,\n instance,\n emptyText,\n errorText,\n useItemID, // use statusID instead of status object, assuming it's already in states\n boostsCarousel,\n fetchItems = () => {},\n checkForUpdates = () => {},\n checkForUpdatesInterval = 15_000, // 15 seconds\n headerStart,\n headerEnd,\n timelineStart,\n // allowFilters,\n refresh,\n view,\n filterContext,\n showFollowedTags,\n showReplyParent,\n clearWhenRefresh,\n}) {\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\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 } catch (e) {\n console.error(e);\n setUIState('error');\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('j, shift+j', (_, handler) => {\n // focus on next status after active item\n const activeItem = document.activeElement.closest(itemsSelector);\n const activeItemRect = activeItem?.getBoundingClientRect();\n const allItems = Array.from(\n scrollableRef.current.querySelectorAll(itemsSelector),\n );\n if (\n activeItem &&\n activeItemRect.top < scrollableRef.current.clientHeight &&\n activeItemRect.bottom > 0\n ) {\n const activeItemIndex = allItems.indexOf(activeItem);\n let nextItem = allItems[activeItemIndex + 1];\n if (handler.shift) {\n // get next status that's not .timeline-item-alt\n nextItem = allItems.find(\n (item, index) =>\n index > activeItemIndex &&\n !item.classList.contains('timeline-item-alt'),\n );\n }\n if (nextItem) {\n nextItem.focus();\n nextItem.scrollIntoView(scrollIntoViewOptions);\n }\n } else {\n // If active status is not in viewport, get the topmost status-link in viewport\n const topmostItem = allItems.find((item) => {\n const itemRect = item.getBoundingClientRect();\n return itemRect.top >= 44 && itemRect.left >= 0; // 44 is the magic number for header height, not real\n });\n if (topmostItem) {\n topmostItem.focus();\n topmostItem.scrollIntoView(scrollIntoViewOptions);\n }\n }\n });\n\n const kRef = useHotkeys('k, shift+k', (_, handler) => {\n // focus on previous status after active item\n const activeItem = document.activeElement.closest(itemsSelector);\n const activeItemRect = activeItem?.getBoundingClientRect();\n const allItems = Array.from(\n scrollableRef.current.querySelectorAll(itemsSelector),\n );\n if (\n activeItem &&\n activeItemRect.top < scrollableRef.current.clientHeight &&\n activeItemRect.bottom > 0\n ) {\n const activeItemIndex = allItems.indexOf(activeItem);\n let prevItem = allItems[activeItemIndex - 1];\n if (handler.shift) {\n // get prev status that's not .timeline-item-alt\n prevItem = allItems.findLast(\n (item, index) =>\n index < activeItemIndex &&\n !item.classList.contains('timeline-item-alt'),\n );\n }\n if (prevItem) {\n prevItem.focus();\n prevItem.scrollIntoView(scrollIntoViewOptions);\n }\n } else {\n // If active status is not in viewport, get the topmost status-link in viewport\n const topmostItem = allItems.find((item) => {\n const itemRect = item.getBoundingClientRect();\n return itemRect.top >= 44 && itemRect.left >= 0; // 44 is the magic number for header height, not real\n });\n if (topmostItem) {\n topmostItem.focus();\n topmostItem.scrollIntoView(scrollIntoViewOptions);\n }\n }\n });\n\n const oRef = useHotkeys(['enter', 'o'], () => {\n // open active status\n const activeItem = document.activeElement;\n if (activeItem?.matches(itemsSelector)) {\n activeItem.click();\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\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 >\n <div class=\"timeline-deck deck\">\n <header\n ref={headerRef}\n // hidden={hiddenUI}\n onClick={(e) => {\n if (!e.target.closest('a, button')) {\n scrollableRef.current?.scrollTo({\n top: 0,\n behavior: 'smooth',\n });\n }\n }}\n onDblClick={(e) => {\n if (!e.target.closest('a, button')) {\n loadItems(true);\n }\n }}\n class={uiState === 'loading' ? 'loading' : ''}\n >\n <div class=\"header-grid\">\n <div class=\"header-side\">\n <NavMenu />\n {headerStart !== null && headerStart !== undefined ? (\n headerStart\n ) : (\n <Link to=\"/\" class=\"button plain home-button\">\n <Icon icon=\"home\" size=\"l\" />\n </Link>\n )}\n </div>\n {title && (titleComponent ? titleComponent : <h1>{title}</h1>)}\n <div class=\"header-side\">\n {/* <Loader hidden={uiState !== 'loading'} /> */}\n {!!headerEnd && headerEnd}\n </div>\n </div>\n {showNewPostsIndicator && (\n <button\n class=\"updates-button shiny-pill\"\n type=\"button\"\n onClick={handleLoadNewPosts}\n >\n <Icon icon=\"arrow-up\" /> New posts\n </button>\n )}\n </header>\n {!!timelineStart && (\n <div\n class={`timeline-start ${uiState === 'loading' ? 'loading' : ''}`}\n >\n {timelineStart}\n </div>\n )}\n {!!items.length ? (\n <>\n <ul class={`timeline ${view ? `timeline-${view}` : ''}`}>\n {items.map((status) => (\n <TimelineItem\n status={status}\n instance={instance}\n useItemID={useItemID}\n // allowFilters={allowFilters}\n filterContext={filterContext}\n key={status.id + status?._pinned + view}\n view={view}\n showFollowedTags={showFollowedTags}\n 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 Show more&hellip;\n </button>\n </InView>\n ) : (\n <p class=\"ui-state insignificant\">The end.</p>\n ))}\n </>\n ) : uiState === 'loading' ? (\n <ul class=\"timeline\">\n {Array.from({ length: 5 }).map((_, i) =>\n view === 'media' ? (\n <div\n style={{\n height: '50vh',\n }}\n />\n ) : (\n <li key={i}>\n <Status skeleton 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 Try again\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 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 const fItems = filteredItems(items, filterContext);\n let title = '';\n if (type === 'boosts') {\n title = `${fItems.length} Boosts`;\n } else if (type === 'pinned') {\n title = 'Pinned posts';\n }\n const isCarousel = type === 'boosts' || type === 'pinned';\n if (isCarousel) {\n // Here, we don't hide filtered posts, but we sort them last\n fItems.sort((a, b) => {\n // if (a._filtered && !b._filtered) {\n // return 1;\n // }\n // if (!a._filtered && b._filtered) {\n // return -1;\n // }\n const aFiltered = isFiltered(a.filtered, filterContext);\n const bFiltered = isFiltered(b.filtered, filterContext);\n if (aFiltered && !bFiltered) {\n return 1;\n }\n if (!aFiltered && bFiltered) {\n return -1;\n }\n return 0;\n });\n return (\n <li key={`timeline-${statusID}`} class=\"timeline-item-carousel\">\n <StatusCarousel title={title} class={`${type}-carousel`}>\n {fItems.map((item) => {\n const { id: statusID, reblog, _pinned } = item;\n const actualStatusID = reblog?.id || statusID;\n const url = instance\n ? `/${instance}/s/${actualStatusID}`\n : `/s/${actualStatusID}`;\n if (_pinned) useItemID = false;\n return (\n <li key={statusID}>\n <Link\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 carouselRef = useRef();\n // const { reachStart, reachEnd, init } = useScroll({\n // scrollableRef: carouselRef,\n // direction: 'horizontal',\n // });\n const startButtonRef = useRef();\n const endButtonRef = useRef();\n // useScrollFn(\n // {\n // scrollableRef: carouselRef,\n // direction: 'horizontal',\n // init: true,\n // },\n // ({ reachStart, reachEnd }) => {\n // if (startButtonRef.current) startButtonRef.current.disabled = reachStart;\n // if (endButtonRef.current) endButtonRef.current.disabled = reachEnd;\n // },\n // [],\n // );\n // useEffect(() => {\n // init?.();\n // }, []);\n\n const [render, setRender] = useState(false);\n useEffect(() => {\n setTimeout(() => {\n setRender(true);\n }, 1);\n }, []);\n\n return (\n <div class={`status-carousel ${className}`}>\n <header>\n <h3>{title}</h3>\n <span>\n <button\n ref={startButtonRef}\n type=\"button\"\n class=\"small plain2\"\n // disabled={reachStart}\n onClick={() => {\n carouselRef.current?.scrollBy({\n left: -Math.min(320, carouselRef.current?.offsetWidth),\n behavior: 'smooth',\n });\n }}\n >\n <Icon icon=\"chevron-left\" />\n </button>{' '}\n <button\n ref={endButtonRef}\n type=\"button\"\n class=\"small plain2\"\n // disabled={reachEnd}\n onClick={() => {\n carouselRef.current?.scrollBy({\n left: Math.min(320, carouselRef.current?.offsetWidth),\n behavior: 'smooth',\n });\n }}\n >\n <Icon icon=\"chevron-right\" />\n </button>\n </span>\n </header>\n <ul ref={carouselRef}>\n <InView\n class=\"status-carousel-beacon\"\n onChange={(inView) => {\n if (startButtonRef.current)\n startButtonRef.current.disabled = inView;\n }}\n />\n {children[0]}\n {render && children.slice(1)}\n <InView\n class=\"status-carousel-beacon\"\n onChange={(inView) => {\n if (endButtonRef.current) endButtonRef.current.disabled = inView;\n }}\n />\n </ul>\n </div>\n );\n}\n\nfunction TimelineStatusCompact({ status, instance, filterContext }) {\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\" />\n {snapStates.statusThreadNumber[sKey]\n ? ` ${snapStates.statusThreadNumber[sKey]}/X`\n : ''}\n </div>\n ) : (\n <div class=\"status-thread-badge\">\n <Icon icon=\"thread\" size=\"s\" />\n </div>\n )}\n <div\n class=\"content-compact\"\n title={statusPeekText}\n lang={language}\n dir=\"auto\"\n >\n {!!filterInfo ? (\n <b\n class=\"status-filtered-badge badge-meta horizontal\"\n title={filterInfo?.titlesStr || ''}\n >\n <span>Filtered</span>: <span>{filterInfo?.titlesStr || ''}</span>\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\" />\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 { 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 from '../utils/states';\nimport { saveStatus } from '../utils/states';\nimport { isMediaFirstInstance } from '../utils/store-utils';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 20;\nconst MIN_YEAR = 1983;\nconst MIN_YEAR_MONTH = `${MIN_YEAR}-01`; // Birth of the Internet\n\nconst supportsInputMonth = (() => {\n try {\n const input = document.createElement('input');\n input.setAttribute('type', 'month');\n return input.type === 'month';\n } catch (e) {\n return false;\n }\n})();\n\nasync function _isSearchEnabled(instance) {\n const { masto } = api({ instance });\n const results = await masto.v2.search.fetch({\n q: 'from:me',\n type: 'statuses',\n limit: 1,\n });\n return !!results?.statuses?.length;\n}\nconst isSearchEnabled = pmem(_isSearchEnabled);\n\nfunction AccountStatuses() {\n const snapStates = useSnapshot(states);\n const { id, ...params } = useParams();\n const [searchParams, setSearchParams] = useSearchParams();\n const month = searchParams.get('month');\n const excludeReplies = !searchParams.get('replies');\n const excludeBoosts = !!searchParams.get('boosts');\n const tagged = searchParams.get('tagged');\n const media = !!searchParams.get('media');\n const { masto, instance, authenticated } = api({ instance: params.instance });\n const { masto: currentMasto, instance: currentInstance } = api();\n const accountStatusesIterator = useRef();\n\n const allSearchParams = [month, excludeReplies, excludeBoosts, tagged, media];\n const [account, setAccount] = useState();\n const searchOffsetRef = useRef(0);\n useEffect(() => {\n searchOffsetRef.current = 0;\n }, allSearchParams);\n\n const 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.fetch({\n q: `from:${account.acct} after:${afterStr} before:${beforeStr}`,\n type: 'statuses',\n limit,\n offset: searchOffsetRef.current,\n });\n if (searchResults?.statuses?.length) {\n const value = searchResults.statuses.slice(0, LIMIT);\n value.forEach((item) => {\n saveStatus(item, instance);\n });\n const done = searchResults.statuses.length <= LIMIT;\n return { value, done };\n } else {\n return { value: [], done: true };\n }\n }\n\n let results = [];\n if (firstLoad) {\n const { value } = await masto.v1.accounts\n .$select(id)\n .statuses.list({\n pinned: true,\n })\n .next();\n if (value?.length && !tagged && !media) {\n const pinnedStatuses = value.map((status) => {\n saveStatus(status, instance);\n return {\n ...status,\n _pinned: true,\n };\n });\n if (pinnedStatuses.length >= 3) {\n const pinnedStatusesIds = pinnedStatuses.map((status) => status.id);\n results.push({\n id: pinnedStatusesIds,\n items: pinnedStatuses,\n type: 'pinned',\n });\n } else {\n results.push(...pinnedStatuses);\n }\n }\n }\n if (firstLoad || !accountStatusesIterator.current) {\n accountStatusesIterator.current = masto.v1.accounts\n .$select(id)\n .statuses.list({\n limit: LIMIT,\n exclude_replies: excludeReplies,\n exclude_reblogs: excludeBoosts,\n only_media: media || undefined,\n tagged,\n });\n }\n const { value, done } = await accountStatusesIterator.current.next();\n if (value?.length) {\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 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 results.push(...value);\n\n value.forEach((item) => {\n saveStatus(item, instance);\n });\n }\n return {\n value: results,\n done,\n };\n }\n\n const [featuredTags, setFeaturedTags] = useState([]);\n useTitle(\n account?.acct\n ? `${\n account?.displayName\n ? `${account.displayName} (${/@/.test(account.acct) ? '' : '@'}${\n account.acct\n })`\n : `${/@/.test(account.acct) ? '' : '@'}${account.acct}`\n }${\n !excludeReplies\n ? ' (+ Replies)'\n : excludeBoosts\n ? ' (- Boosts)'\n : tagged\n ? ` (#${tagged})`\n : media\n ? ' (Media)'\n : month\n ? ` (${new Date(month).toLocaleString('default', {\n month: 'long',\n year: 'numeric',\n })})`\n : ''\n }`\n : 'Account posts',\n '/:instance?/a/:id',\n );\n\n const fetchAccountPromiseRef = useRef();\n const fetchAccount = useCallback(() => {\n const fetchPromise =\n fetchAccountPromiseRef.current || masto.v1.accounts.$select(id).fetch();\n fetchAccountPromiseRef.current = fetchPromise;\n return fetchPromise;\n }, [id, masto]);\n\n useEffect(() => {\n (async () => {\n try {\n const acc = await fetchAccount();\n console.log(acc);\n setAccount(acc);\n } catch (e) {\n console.error(e);\n }\n // 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 />\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=\"Clear filters\"\n key=\"clear-filters\"\n >\n <Icon icon=\"x\" size=\"l\" />\n </Link>\n ) : (\n <Icon icon=\"filter\" class=\"insignificant\" size=\"l\" />\n )}\n <Link\n to={`/${instance}/a/${id}${excludeReplies ? '?replies=1' : ''}`}\n onClick={() => {\n if (excludeReplies) {\n showToast('Showing post with replies');\n }\n }}\n class={excludeReplies ? '' : 'is-active'}\n >\n + Replies\n </Link>\n <Link\n to={`/${instance}/a/${id}${excludeBoosts ? '' : '?boosts=0'}`}\n onClick={() => {\n if (!excludeBoosts) {\n showToast('Showing posts without boosts');\n }\n }}\n class={!excludeBoosts ? '' : 'is-active'}\n >\n - Boosts\n </Link>\n <Link\n to={`/${instance}/a/${id}${media ? '' : '?media=1'}`}\n onClick={() => {\n if (!media) {\n showToast('Showing posts with media');\n }\n }}\n class={media ? 'is-active' : ''}\n >\n Media\n </Link>\n {featuredTags.map((tag) => (\n <Link\n key={tag.id}\n to={`/${instance}/a/${id}${\n tagged === tag.name\n ? ''\n : `?tagged=${encodeURIComponent(tag.name)}`\n }`}\n onClick={() => {\n if (tagged !== tag.name) {\n showToast(`Showing posts tagged with #${tag.name}`);\n }\n }}\n class={tagged === tag.name ? 'is-active' : ''}\n >\n <span>\n <span class=\"more-insignificant\">#</span>\n {tag.name}\n </span>\n {\n // The count differs based on instance 😅\n }\n {/* <span class=\"filter-count\">{tag.statusesCount}</span> */}\n </Link>\n ))}\n {searchEnabled &&\n (supportsInputMonth ? (\n <label class={`filter-field ${month ? 'is-active' : ''}`}>\n <Icon icon=\"month\" size=\"l\" />\n <input\n type=\"month\"\n disabled={!account?.acct}\n value={month || ''}\n min={MIN_YEAR_MONTH}\n max={new Date().toISOString().slice(0, 7)}\n onInput={(e) => {\n const { value, validity } = e.currentTarget;\n if (!validity.valid) return;\n setSearchParams(\n value\n ? {\n month: value,\n }\n : {},\n );\n const [year, month] = value.split('-');\n const monthIndex = parseInt(month, 10) - 1;\n const date = new Date(year, monthIndex);\n showToast(\n `Showing posts in ${date.toLocaleString('default', {\n month: 'long',\n year: 'numeric',\n })}`,\n );\n }}\n />\n </label>\n ) : (\n // Fallback to <select> for month and <input type=\"number\"> for year\n <MonthPicker\n class={`filter-field ${month ? 'is-active' : ''}`}\n disabled={!account?.acct}\n value={month || ''}\n min={MIN_YEAR_MONTH}\n max={new Date().toISOString().slice(0, 7)}\n onInput={(e) => {\n const { value, validity } = e;\n if (!validity.valid) return;\n setSearchParams(\n value\n ? {\n month: value,\n }\n : {},\n );\n }}\n />\n ))}\n </div>\n )}\n </>\n );\n }, [\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 <Timeline\n key={id}\n title={`${account?.acct ? '@' + account.acct : 'Posts'}`}\n titleComponent={\n <h1\n class=\"header-double-lines header-account\"\n // onClick={() => {\n // states.showAccount = {\n // account,\n // instance,\n // };\n // }}\n >\n <b>\n <EmojiText text={displayName} emojis={emojis} />\n </b>\n <div>\n <span>@{acct}</span>\n </div>\n </h1>\n }\n id=\"account-statuses\"\n instance={instance}\n emptyText=\"Nothing to see here yet.\"\n errorText=\"Unable to load posts\"\n fetchItems={fetchAccountStatuses}\n useItemID\n view={media || 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\" />\n </button>\n }\n >\n <MenuItem\n disabled={!allowSwitch}\n onClick={() => {\n (async () => {\n try {\n const { masto } = api({\n instance: accountInstance,\n });\n const acc = await masto.v1.accounts.lookup({\n acct: account.acct,\n });\n const { id } = acc;\n location.hash = `/${accountInstance}/a/${id}`;\n } catch (e) {\n console.error(e);\n alert('Unable to fetch account info');\n }\n })();\n }}\n >\n <Icon icon=\"transfer\" />{' '}\n <small class=\"menu-double-lines\">\n Switch to account's instance{' '}\n {accountInstance ? (\n <>\n {' '}\n (<b>{punycode.toUnicode(accountInstance)}</b>)\n </>\n ) : null}\n </small>\n </MenuItem>\n {!sameCurrentInstance && (\n <MenuItem\n onClick={() => {\n (async () => {\n try {\n const acc = await currentMasto.v1.accounts.lookup({\n acct: account.acct + '@' + instance,\n });\n const { id } = acc;\n location.hash = `/${currentInstance}/a/${id}`;\n } catch (e) {\n console.error(e);\n alert('Unable to fetch account info');\n }\n })();\n }}\n >\n <Icon icon=\"transfer\" />{' '}\n <small class=\"menu-double-lines\">\n Switch to my instance (<b>{currentInstance}</b>)\n </small>\n </MenuItem>\n )}\n </Menu2>\n }\n />\n );\n}\n\nfunction MonthPicker(props) {\n const {\n class: className,\n disabled,\n value,\n min,\n max,\n onInput = () => {},\n } = props;\n const [_year, _month] = value?.split('-') || [];\n const monthFieldRef = useRef();\n const yearFieldRef = useRef();\n\n const checkValidity = (month, year) => {\n const [minYear, minMonth] = min?.split('-') || [];\n const [maxYear, maxMonth] = max?.split('-') || [];\n if (year < minYear) return false;\n if (year > maxYear) return false;\n if (year === minYear && month < minMonth) return false;\n if (year === maxYear && month > maxMonth) return false;\n return true;\n };\n\n return (\n <div class={className}>\n <Icon icon=\"month\" size=\"l\" />\n <select\n ref={monthFieldRef}\n disabled={disabled}\n value={_month || ''}\n onInput={(e) => {\n const { value: month } = e.currentTarget;\n const year = yearFieldRef.current.value;\n if (!checkValidity(month, year))\n return {\n value: '',\n validity: {\n valid: false,\n },\n };\n onInput({\n value: month ? `${year}-${month}` : '',\n validity: {\n valid: true,\n },\n });\n }}\n >\n <option value=\"\">Month</option>\n <option disabled>-----</option>\n {Array.from({ length: 12 }, (_, i) => (\n <option\n value={\n // Month is 1-indexed\n (i + 1).toString().padStart(2, '0')\n }\n key={i}\n >\n {new Date(0, i).toLocaleString('default', {\n month: 'long',\n })}\n </option>\n ))}\n </select>{' '}\n <input\n ref={yearFieldRef}\n type=\"number\"\n disabled={disabled}\n value={_year || new Date().getFullYear()}\n min={min?.slice(0, 4) || MIN_YEAR}\n max={max?.slice(0, 4) || new Date().getFullYear()}\n onInput={(e) => {\n const { value: year, validity } = e.currentTarget;\n const month = monthFieldRef.current.value;\n if (!validity.valid || !checkValidity(month, year))\n return {\n value: '',\n validity: {\n valid: false,\n },\n };\n onInput({\n value: year ? `${year}-${month}` : '',\n validity: {\n valid: true,\n },\n });\n }}\n style={{\n width: '4.5em',\n }}\n />\n </div>\n );\n}\n\nexport default AccountStatuses;\n","import { useRef } from 'preact/hooks';\n\nimport Timeline from '../components/timeline';\nimport { api } from '../utils/api';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 20;\n\nfunction Bookmarks() {\n useTitle('Bookmarks', '/b');\n const { masto, instance } = api();\n const bookmarksIterator = useRef();\n async function fetchBookmarks(firstLoad) {\n if (firstLoad || !bookmarksIterator.current) {\n bookmarksIterator.current = masto.v1.bookmarks.list({ limit: LIMIT });\n }\n return await bookmarksIterator.current.next();\n }\n\n return (\n <Timeline\n title=\"Bookmarks\"\n id=\"bookmarks\"\n emptyText=\"No bookmarks yet. Go bookmark something!\"\n errorText=\"Unable to load bookmarks\"\n instance={instance}\n fetchItems={fetchBookmarks}\n />\n );\n}\n\nexport default Bookmarks;\n","export default \"__VITE_ASSET__S_9SYp01__\"","import '../components/links-bar.css';\nimport './catchup.css';\n\nimport autoAnimate from '@formkit/auto-animate';\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 punycode from 'punycode/';\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 } 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 htmlContentLength from '../utils/html-content-length';\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: 'last 1 hour', value: 1 },\n { label: 'last 2 hours', value: 2 },\n { label: 'last 3 hours', value: 3 },\n { label: 'last 4 hours', value: 4 },\n { label: 'last 5 hours', value: 5 },\n { label: 'last 6 hours', value: 6 },\n { label: 'last 7 hours', value: 7 },\n { label: 'last 8 hours', value: 8 },\n { label: 'last 9 hours', value: 9 },\n { label: 'last 10 hours', value: 10 },\n { label: 'last 11 hours', value: 11 },\n { label: 'last 12 hours', value: 12 },\n { label: 'beyond 12 hours', value: 13 },\n];\n\nconst FILTER_LABELS = [\n 'Original',\n 'Replies',\n 'Boosts',\n 'Followed tags',\n 'Groups',\n 'Filtered',\n];\nconst FILTER_SORTS = [\n 'createdAt',\n 'repliesCount',\n 'favouritesCount',\n 'reblogsCount',\n 'density',\n];\nconst FILTER_GROUPS = [null, 'account'];\nconst FILTER_VALUES = {\n Filtered: 'filtered',\n Groups: 'group',\n Boosts: 'boost',\n Replies: 'reply',\n 'Followed tags': 'followedTags',\n Original: 'original',\n};\nconst FILTER_CATEGORY_TEXT = {\n Filtered: 'filtered posts',\n Groups: 'group posts',\n Boosts: 'boosts',\n Replies: 'replies',\n 'Followed tags': 'followed-tag posts',\n Original: 'original posts',\n};\nconst SORT_BY_TEXT = {\n // asc, desc\n createdAt: ['oldest', 'latest'],\n repliesCount: ['fewest replies', 'most replies'],\n favouritesCount: ['fewest likes', 'most likes'],\n reblogsCount: ['fewest boosts', 'most boosts'],\n density: ['least dense', 'most dense'],\n};\n\nfunction Catchup() {\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 homeIterator = masto.v1.timelines.home.list({ limit: 40 });\n mainloop: while (true) {\n try {\n if (supportsPixelfed && homeIterator.nextParams) {\n if (typeof homeIterator.nextParams === 'string') {\n homeIterator.nextParams += '&include_reblogs=true';\n } else {\n homeIterator.nextParams.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 filtereds = 0,\n groups = 0,\n boosts = 0,\n replies = 0,\n followedTags = 0,\n originals = 0;\n const links = {};\n for (const post of posts) {\n if (post._filtered) {\n filtereds++;\n post.__FILTER = 'filtered';\n } else if (post.group) {\n groups++;\n post.__FILTER = 'group';\n } else if (post.reblog) {\n boosts++;\n post.__FILTER = 'boost';\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 = 'reply';\n } else {\n originals++;\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: filtereds,\n Groups: groups,\n Boosts: boosts,\n Replies: replies,\n 'Followed tags': followedTags,\n Original: originals,\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 === FILTER_VALUES[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 text: `Showing ${\n FILTER_CATEGORY_TEXT[selectedFilterCategory] || 'all posts'\n }${authorUsername ? ` by @${authorUsername}` : ''}, ${\n SORT_BY_TEXT[sortBy][sortOrderIndex]\n } first${\n !!groupBy\n ? `, grouped by ${groupBy === 'account' ? groupByText[groupBy] : ''}`\n : ''\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 preventDefault: true,\n ignoreModifiers: true,\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 preventDefault: true,\n ignoreModifiers: true,\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 preventDefault: true,\n ignoreModifiers: true,\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 ignoreModifiers: true,\n enableOnFormTags: ['input'],\n },\n );\n\n const dotRef = useHotkeys(\n '.',\n () => {\n scrollableRef.current?.scrollTo({\n top: 0,\n behavior: 'smooth',\n });\n },\n {\n preventDefault: true,\n ignoreModifiers: true,\n enableOnFormTags: ['input'],\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 }}\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\" />\n </Link>\n )}\n {uiState === 'start' && (\n <Link to=\"/\" class=\"button plain\">\n <Icon icon=\"home\" size=\"l\" />\n </Link>\n )}\n </div>\n <h1>\n {uiState !== 'start' && (\n <>\n Catch-up <sup>beta</sup>\n </>\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 Help\n </button>\n )}\n </div>\n </div>\n </header>\n <main>\n {uiState === 'start' && (\n <div class=\"catchup-start\">\n <h1>\n Catch-up <sup>beta</sup>\n </h1>\n <details>\n <summary>What is this?</summary>\n <p>\n Catch-up is a separate timeline for your followings, offering\n a high-level view at a glance, with a simple, email-inspired\n interface to effortlessly sort and filter through posts.\n </p>\n <img\n src={catchupUrl}\n width=\"1200\"\n height=\"900\"\n alt=\"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 Let's catch up\n </button>\n </p>\n </details>\n <p>Let's catch up on the posts from your followings.</p>\n <p>\n <b>Show me all posts from…</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 ? '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 Catch up\n </button>\n </div>\n {lastCatchupRange && range > lastCatchupRange ? (\n <p class=\"catchup-info\">\n <Icon icon=\"info\" /> Overlaps with your last catch-up\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 Until the last catch-up (\n {dtf.format(new Date(lastCatchupEndAt))})\n </label>\n </p>\n ) : null}\n <p class=\"insignificant\">\n <small>\n Note: your instance might only show a maximum of 800 posts in\n the Home timeline regardless of the time range. Could be less\n or more.\n </small>\n </p>\n {!!prevCatchups?.length && (\n <div class=\"catchup-prev\">\n <p>Previously…</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 {pc.count} posts\n </small>{' '}\n <button\n type=\"button\"\n class=\"light danger small\"\n onClick={async () => {\n const yes = confirm('Remove this catch-up?');\n if (yes) {\n let t = showToast(`Removing Catch-up ${pc.id}`);\n await db.catchup.del(pc.id);\n t?.hideToast?.();\n showToast(`Catch-up ${pc.id} removed`);\n reloadCatchups();\n }\n }}\n >\n <Icon icon=\"x\" />\n </button>\n </span>\n </li>\n ))}\n </ul>\n {prevCatchups.length >= 3 && (\n <p>\n <small>\n Note: Only max 3 will be stored. The rest will be\n automatically removed.\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\">Fetching posts…</p>\n <p class=\"insignificant\">This might take a while.</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 Reset filters\n </button>\n {links?.length > 0 && (\n <button\n type=\"button\"\n class=\"plain small\"\n onClick={() => setShowTopLinks(!showTopLinks)}\n >\n Top links{' '}\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 = punycode.toUnicode(\n URL.parse(url)\n .hostname.replace(/^www\\./, '')\n .replace(/\\/$/, ''),\n );\n let accentColor;\n if (blurhash) {\n const averageColor = getBlurHashAverageColor(blurhash);\n const labAverageColor = rgb2oklab(averageColor);\n accentColor = oklab2rgb([\n 0.6,\n labAverageColor[1],\n labAverageColor[2],\n ]);\n }\n\n return (\n <a\n key={url}\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={\n accentColor\n ? {\n '--accent-color': `rgb(${accentColor.join(\n ',',\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 && <>&middot; </>}\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 Shared by{' '}\n {sharers.map((s) => {\n const { avatarStatic, displayName } = s;\n return (\n <Avatar\n url={avatarStatic}\n size=\"s\"\n alt={displayName}\n />\n );\n })}\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 All <span class=\"count\">{posts.length}</span>\n </label>\n {FILTER_LABELS.map(\n (label) =>\n !!filterCounts[label] && (\n <label\n class=\"filter-cat\"\n key={label}\n title={\n (\n (filterCounts[label] / posts.length) *\n 100\n ).toFixed(2) + '%'\n }\n >\n <input\n type=\"radio\"\n name=\"filter-cat\"\n checked={\n selectedFilterCategory.toLowerCase() ===\n label.toLowerCase()\n }\n onChange={() => {\n setSelectedFilterCategory(label);\n // setSelectedAuthor(null);\n }}\n />\n {label}{' '}\n <span class=\"count\">{filterCounts[label]}</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 {authorCountsList.length} authors\n </small>\n )}\n </div>\n )}\n {posts.length >= 2 && (\n <div class=\"catchup-filters\">\n <span class=\"filter-label\">Sort</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: 'Date',\n repliesCount: 'Replies',\n favouritesCount: 'Likes',\n reblogsCount: 'Boosts',\n density: '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\">Group</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: 'Authors',\n }[key] || '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 Show all authors\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 FILTER_VALUES[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 ? \"You don't have to read everything.\"\n : \"That's all.\"}{' '}\n <button\n type=\"button\"\n class=\"textual\"\n onClick={() => {\n scrollableRef.current.scrollTop = 0;\n }}\n >\n Back to top\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\" />\n </button>\n <header>\n <h2>Help</h2>\n </header>\n <main>\n <dl>\n <dt>Top links</dt>\n <dd>\n Links shared by followings, sorted by shared counts, boosts\n and likes.\n </dd>\n <dt>Sort: Density</dt>\n <dd>\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 </dd>\n <dt>Group: Authors</dt>\n <dd>\n Posts are grouped by authors, sorted by posts count per\n author.\n </dd>\n <dt>Keyboard shortcuts</dt>\n <dd>\n <kbd>j</kbd>: Next post\n </dd>\n <dd>\n <kbd>k</kbd>: Previous post\n </dd>\n <dd>\n <kbd>l</kbd>: Next author\n </dd>\n <dd>\n <kbd>h</kbd>: Previous author\n </dd>\n <dd>\n <kbd>Enter</kbd>: Open post details\n </dd>\n <dd>\n <kbd>.</kbd>: Scroll to top\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;\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 {\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 readingExpandSpoilers = useMemo(() => {\n const prefs = store.account.get('preferences') || {};\n return !!prefs['reading:expand:spoilers'];\n }, []);\n // const readingExpandSpoilers = true;\n const showMedia = readingExpandSpoilers || (!spoilerText && !sensitive);\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 ? (\n <span class=\"post-peek-filtered\">\n Filtered{filterInfo?.titlesStr ? `: ${filterInfo.titlesStr}` : ''}\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\">Thread</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 && (\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 Poll\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 { 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\" /> {shortenNumber(repliesCount)}\n </span>\n )}\n {favouritesCount > 0 && (\n <span class=\"post-stat-likes\">\n <Icon icon=\"heart\" size=\"s\" /> {shortenNumber(favouritesCount)}\n </span>\n )}\n {reblogsCount > 0 && (\n <span class=\"post-stat-boosts\">\n <Icon icon=\"rocket\" size=\"s\" /> {shortenNumber(reblogsCount)}\n </span>\n )}\n </span>\n );\n}\n\nconst { locale } = new Intl.DateTimeFormat().resolvedOptions();\nconst dtf = new Intl.DateTimeFormat(locale, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\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 = maxDate.getTime() - 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 const normalized = (date.getTime() - minDate.getTime()) / range;\n const binIndex = Math.floor(normalized * (numBins - 1));\n bins[binIndex].push(item);\n });\n\n return bins;\n}\n\nexport default Catchup;\n","import { useRef } from 'preact/hooks';\n\nimport Timeline from '../components/timeline';\nimport { api } from '../utils/api';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 20;\n\nfunction Favourites() {\n useTitle('Likes', '/f');\n const { masto, instance } = api();\n const favouritesIterator = useRef();\n async function fetchFavourites(firstLoad) {\n if (firstLoad || !favouritesIterator.current) {\n favouritesIterator.current = masto.v1.favourites.list({ limit: LIMIT });\n }\n return await favouritesIterator.current.next();\n }\n\n return (\n <Timeline\n title=\"Likes\"\n id=\"favourites\"\n emptyText=\"No likes yet. Go like something!\"\n errorText=\"Unable to load likes\"\n instance={instance}\n fetchItems={fetchFavourites}\n />\n );\n}\n\nexport default Favourites;\n","import './filters.css';\n\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 useInterval from '../utils/useInterval';\nimport useTitle from '../utils/useTitle';\n\nconst FILTER_CONTEXT = ['home', 'public', 'notifications', 'thread', 'account'];\nconst FILTER_CONTEXT_UNIMPLEMENTED = ['notifications', 'thread', 'account'];\nconst FILTER_CONTEXT_LABELS = {\n home: 'Home and lists',\n notifications: 'Notifications',\n public: 'Public timelines',\n thread: 'Conversations',\n account: '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];\nconst EXPIRY_DURATIONS_LABELS = {\n 0: 'Never',\n 1800: '30 minutes',\n 3600: '1 hour',\n 21600: '6 hours',\n 43200: '12 hours',\n 86_400: '24 hours',\n 604_800: '7 days',\n 2_592_000: '30 days',\n};\n\nfunction Filters() {\n const { masto } = api();\n useTitle(`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\" />\n </Link>\n </div>\n <h1>Filters</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=\"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 {filters.length} filter\n {filters.length === 1 ? '' : 's'}\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\">Unable to load filters.</p>\n ) : (\n <p class=\"ui-state\">No filters yet.</p>\n )}\n </main>\n </div>\n {!!showFiltersAddEditModal && (\n <Modal\n title=\"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 { 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\" />\n </button>\n )}\n <header>\n <h2>{editMode ? 'Edit filter' : '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 ? 'Unable to edit filter'\n : 'Unable to create filter',\n );\n }\n })();\n }}\n >\n <div class=\"filter-form-row\">\n <label>\n <b>Title</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 />\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 Whole word\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\" />\n </button>\n </div>\n </li>\n );\n })}\n </ul>\n ) : (\n <div class=\"filter-keywords\">\n <div class=\"insignificant\">No keywords. Add one.</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 Add keyword\n </button>{' '}\n {filteredEditKeywords?.length > 1 && (\n <small class=\"insignificant\">\n {filteredEditKeywords.length} keyword\n {filteredEditKeywords.length === 1 ? '' : 's'}\n </small>\n )}\n </footer>\n </div>\n <div class=\"filter-form-cols\">\n <div class=\"filter-form-col\">\n <div>\n <b>Filter from…</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\">* Not implemented yet</small>\n </p>\n </div>\n <div class=\"filter-form-col\">\n {editMode && (\n <>\n Status:{' '}\n <b>\n <ExpiryStatus expiresAt={expiresAt} showNeverExpires />\n </b>\n </>\n )}\n <div>\n <label for=\"filters-expires_in\">\n {editMode ? 'Change expiry' : '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}>{EXPIRY_DURATIONS_LABELS[v]}</option>\n ))}\n </select>\n </div>\n <p>\n Filtered post will be…\n <br />\n <label class=\"ib\">\n <input\n type=\"radio\"\n name=\"filter_action\"\n value=\"warn\"\n defaultChecked={filterAction === 'warn' || !editMode}\n disabled={uiState === 'loading'}\n />{' '}\n minimized\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 hidden\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 ? 'Save' : '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=\"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('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 Delete…\n </button>\n </MenuConfirm>\n )}\n </footer>\n </form>\n </main>\n </div>\n );\n}\n\nfunction ExpiryStatus({ expiresAt, showNeverExpires }) {\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 'Expired'\n ) : hasExpiry ? (\n <>\n Expiring <RelativeTime datetime={expiresAtDate} />\n </>\n ) : (\n showNeverExpires && 'Never expires'\n );\n}\n\nexport default Filters;\n","import { useEffect, useState } from 'preact/hooks';\n\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport NavMenu from '../components/nav-menu';\nimport { api } from '../utils/api';\nimport { fetchFollowedTags } from '../utils/followed-tags';\nimport useTitle from '../utils/useTitle';\n\nfunction FollowedHashtags() {\n const { masto, instance } = api();\n useTitle(`Followed Hashtags`, `/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\" />\n </Link>\n </div>\n <h1>Followed Hashtags</h1>\n <div class=\"header-side\" />\n </div>\n </header>\n <main>\n {followedHashtags.length > 0 ? (\n <>\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\" /> <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 {followedHashtags.length} hashtag\n {followedHashtags.length === 1 ? '' : 's'}\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\">Unable to load followed hashtags.</p>\n ) : (\n <p class=\"ui-state\">No hashtags followed yet.</p>\n )}\n </main>\n </div>\n </div>\n );\n}\n\nexport default FollowedHashtags;\n","import { useEffect, useRef } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport Timeline from '../components/timeline';\nimport { api } from '../utils/api';\nimport { filteredItems } from '../utils/filters';\nimport states from '../utils/states';\nimport { getStatus, saveStatus } from '../utils/states';\nimport 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 useTitle(title || 'Following', path || '/following');\n const { masto, streaming, instance } = api();\n const snapStates = useSnapshot(states);\n const homeIterator = useRef();\n const latestItem = useRef();\n\n console.debug('RENDER Following', title, id);\n const supportsPixelfed = supports('@pixelfed/home-include-reblogs');\n\n async function fetchHome(firstLoad) {\n if (firstLoad || !homeIterator.current) {\n homeIterator.current = masto.v1.timelines.home.list({ limit: LIMIT });\n }\n if (supportsPixelfed && homeIterator.current?.nextParams) {\n if (typeof homeIterator.current.nextParams === 'string') {\n homeIterator.current.nextParams += '&include_reblogs=true';\n } else {\n homeIterator.current.nextParams.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 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).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 return false;\n }\n }\n\n useEffect(() => {\n let sub;\n (async () => {\n if (streaming) {\n sub = streaming.user.subscribe();\n console.log('🎏 Streaming user', sub);\n for await (const entry of sub) {\n if (!sub) break;\n if (entry.event === 'status.update') {\n const status = entry.payload;\n console.log(`🔄 Status ${status.id} updated`);\n saveStatus(status, instance);\n } else if (entry.event === 'delete') {\n const statusID = entry.payload;\n console.log(`❌ Status ${statusID} deleted`);\n // delete states.statuses[statusID];\n const s = getStatus(statusID, instance);\n if (s) s._deleted = true;\n }\n }\n console.log('💥 Streaming user loop STOPPED');\n }\n })();\n return () => {\n sub?.unsubscribe?.();\n sub = null;\n };\n }, [streaming]);\n\n return (\n <Timeline\n title={title || 'Following'}\n id={id || 'following'}\n emptyText=\"Nothing to see here.\"\n errorText=\"Unable to load posts.\"\n instance={instance}\n fetchItems={fetchHome}\n checkForUpdates={checkForUpdates}\n useItemID\n boostsCarousel={snapStates.settings.boostsCarousel}\n {...props}\n // allowFilters\n filterContext=\"home\"\n showFollowedTags\n showReplyParent\n />\n );\n}\n\nexport default Following;\n","import {\n FocusableItem,\n MenuDivider,\n MenuGroup,\n MenuHeader,\n MenuItem,\n} from '@szhsin/react-menu';\nimport { useEffect, useMemo, useRef, useState } from 'preact/hooks';\nimport { useNavigate, useParams, useSearchParams } from 'react-router-dom';\n\nimport Icon from '../components/icon';\nimport Menu2 from '../components/menu2';\nimport MenuConfirm from '../components/menu-confirm';\nimport { SHORTCUTS_LIMIT } from '../components/shortcuts-settings';\nimport Timeline from '../components/timeline';\nimport { api } from '../utils/api';\nimport { filteredItems } from '../utils/filters';\nimport showToast from '../utils/show-toast';\nimport states from '../utils/states';\nimport { saveStatus } from '../utils/states';\nimport { 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 navigate = useNavigate();\n let { hashtag, ...params } = columnMode ? {} : useParams();\n if (props.hashtag) hashtag = props.hashtag;\n let hashtags = hashtag.trim().split(/[\\s+]+/);\n hashtags.sort();\n hashtag = hashtags[0];\n const [searchParams, setSearchParams] = useSearchParams();\n const media = mediaView || !!searchParams.get('media');\n const linkParams = media ? '?media=1' : '';\n\n const { masto, instance, authenticated } = api({\n instance: props?.instance || params.instance,\n });\n const {\n masto: currentMasto,\n instance: currentInstance,\n authenticated: currentAuthenticated,\n } = api();\n const hashtagTitle = hashtags.map((t) => `#${t}`).join(' ');\n const hashtagPostTitle = media ? ` (Media only)` : '';\n const title = instance\n ? `${hashtagTitle}${hashtagPostTitle} on ${instance}`\n : `${hashtagTitle}${hashtagPostTitle}`;\n useTitle(title, `/:instance?/t/:hashtag`);\n const latestItem = useRef();\n\n const 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 // });\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 .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 .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 <Timeline\n key={instance + hashtagTitle}\n title={title}\n titleComponent={\n !!instance && (\n <h1 class=\"header-double-lines\">\n <b>{hashtagTitle}</b>\n <div>{instance}</div>\n </h1>\n )\n }\n id=\"hashtag\"\n instance={instance}\n emptyText=\"No one has posted anything with this tag yet.\"\n errorText=\"Unable to load posts with this tag\"\n fetchItems={fetchHashtags}\n checkForUpdates={checkForUpdates}\n useItemID\n view={media || 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\" />\n </button>\n }\n >\n {!!info && hashtags.length === 1 && (\n <>\n <MenuConfirm\n subMenu\n confirm={info.following}\n confirmLabel={`Unfollow #${hashtag}?`}\n disabled={followUIState === 'loading' || !authenticated}\n onClick={() => {\n setFollowUIState('loading');\n if (info.following) {\n // const yes = confirm(`Unfollow #${hashtag}?`);\n // if (!yes) {\n // setFollowUIState('default');\n // return;\n // }\n masto.v1.tags\n .$select(hashtag)\n .unfollow()\n .then(() => {\n setInfo({ ...info, following: false });\n showToast(`Unfollowed #${hashtag}`);\n })\n .catch((e) => {\n alert(e);\n console.error(e);\n })\n .finally(() => {\n setFollowUIState('default');\n });\n } else {\n masto.v1.tags\n .$select(hashtag)\n .follow()\n .then(() => {\n setInfo({ ...info, following: true });\n showToast(`Followed #${hashtag}`);\n })\n .catch((e) => {\n alert(e);\n console.error(e);\n })\n .finally(() => {\n setFollowUIState('default');\n });\n }\n }}\n >\n {info.following ? (\n <>\n <Icon icon=\"check-circle\" /> <span>Following…</span>\n </>\n ) : (\n <>\n <Icon icon=\"plus\" /> <span>Follow</span>\n </>\n )}\n </MenuConfirm>\n <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) => 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('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('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('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>Featured on profile</span>\n </>\n ) : (\n <>\n <Icon icon=\"check-circle\" />\n <span>Feature on profile</span>\n </>\n )}\n </MenuItem>\n <MenuDivider />\n </>\n )}\n {!mediaFirst && (\n <>\n <MenuHeader className=\"plain\">Filters</MenuHeader>\n <MenuItem\n type=\"checkbox\"\n checked={!!media}\n onClick={() => {\n if (media) {\n searchParams.delete('media');\n } else {\n searchParams.set('media', '1');\n }\n setSearchParams(searchParams);\n }}\n >\n <Icon icon=\"check-circle\" />{' '}\n <span class=\"menu-grow\">Media only</span>\n </MenuItem>\n <MenuDivider />\n </>\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('+')}`\n : `/t/${hashtags.join('+')}${linkParams}`;\n }\n }}\n >\n <Icon icon=\"hashtag\" />\n <input\n ref={ref}\n type=\"text\"\n placeholder={\n reachLimit ? `Max ${TOTAL_TAGS_LIMIT} tags` : 'Add hashtag'\n }\n required\n autocorrect=\"off\"\n autocapitalize=\"off\"\n spellCheck={false}\n // no spaces, no hashtags\n pattern=\"[^#][^\\s#]+[^#]\"\n disabled={reachLimit}\n />\n </form>\n )}\n </FocusableItem>\n <MenuGroup takeOverflow>\n {hashtags.map((t, i) => (\n <MenuItem\n key={t}\n disabled={hashtags.length === 1}\n onClick={(e) => {\n hashtags.splice(i, 1);\n hashtags.sort();\n // navigate(\n // instance\n // ? `/${instance}/t/${hashtags.join('+')}`\n // : `/t/${hashtags.join('+')}`,\n // );\n location.hash = instance\n ? `/${instance}/t/${hashtags.join('+')}${linkParams}`\n : `/t/${hashtags.join('+')}${linkParams}`;\n }}\n >\n <Icon icon=\"x\" alt=\"Remove hashtag\" class=\"danger-icon\" />\n <span>\n <span class=\"more-insignificant\">#</span>\n {t}\n </span>\n </MenuItem>\n ))}\n </MenuGroup>\n <MenuDivider />\n <MenuItem\n disabled={!currentAuthenticated}\n onClick={() => {\n if (states.shortcuts.length >= SHORTCUTS_LIMIT) {\n alert(\n `Max ${SHORTCUTS_LIMIT} shortcuts reached. Unable to add shortcut.`,\n );\n return;\n }\n const shortcut = {\n type: 'hashtag',\n hashtag: hashtags.join(' '),\n instance,\n media: media ? 'on' : undefined,\n };\n // Check if already exists\n const exists = states.shortcuts.some(\n (s) =>\n s.type === shortcut.type &&\n s.hashtag\n .split(/[\\s+]+/)\n .sort()\n .join(' ') ===\n shortcut.hashtag\n .split(/[\\s+]+/)\n .sort()\n .join(' ') &&\n (s.instance ? s.instance === shortcut.instance : true) &&\n (s.media ? !!s.media === !!shortcut.media : true),\n );\n if (exists) {\n alert('This shortcut already exists');\n } else {\n states.shortcuts.push(shortcut);\n showToast(`Hashtag shortcut added`);\n }\n }}\n >\n <Icon icon=\"shortcut\" /> <span>Add to Shortcuts</span>\n </MenuItem>\n <MenuItem\n onClick={() => {\n let newInstance = prompt(\n 'Enter a new instance e.g. \"mastodon.social\"',\n );\n if (!/\\./.test(newInstance)) {\n if (newInstance) alert('Invalid instance');\n return;\n }\n if (newInstance) {\n newInstance = newInstance.toLowerCase().trim();\n // navigate(`/${newInstance}/t/${hashtags.join('+')}`);\n location.hash = `/${newInstance}/t/${hashtags.join(\n '+',\n )}${linkParams}`;\n }\n }}\n >\n <Icon icon=\"bus\" /> <span>Go to another instance…</span>\n </MenuItem>\n {currentInstance !== instance && (\n <MenuItem\n onClick={() => {\n location.hash = `/${currentInstance}/t/${hashtags.join(\n '+',\n )}${linkParams}`;\n }}\n >\n <Icon icon=\"bus\" />{' '}\n <small class=\"menu-double-lines\">\n Go to my instance (<b>{currentInstance}</b>)\n </small>\n </MenuItem>\n )}\n </Menu2>\n }\n />\n );\n}\n\nexport default Hashtags;\n","import './lists.css';\n\nimport { Menu, MenuDivider, MenuItem } from '@szhsin/react-menu';\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport { InView } from 'react-intersection-observer';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { useSnapshot } from 'valtio';\n\nimport AccountBlock from '../components/account-block';\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport ListAddEdit from '../components/list-add-edit';\nimport Menu2 from '../components/menu2';\nimport MenuConfirm from '../components/menu-confirm';\nimport MenuLink from '../components/menu-link';\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 snapStates = useSnapshot(states);\n const { masto, instance } = api();\n const id = props?.id || useParams()?.id;\n // const navigate = useNavigate();\n const latestItem = useRef();\n // const [reloadCount, reload] = useReducer((c) => c + 1, 0);\n\n const listIterator = useRef();\n async function fetchList(firstLoad) {\n if (firstLoad || !listIterator.current) {\n listIterator.current = masto.v1.timelines.list.$select(id).list({\n limit: LIMIT,\n });\n }\n const results = await listIterator.current.next();\n let { value } = results;\n if (value?.length) {\n if (firstLoad) {\n latestItem.current = value[0].id;\n }\n\n // value = filteredItems(value, 'home');\n value.forEach((item) => {\n saveStatus(item, instance);\n });\n }\n return {\n ...results,\n value,\n };\n }\n\n async function checkForUpdates() {\n try {\n const results = await masto.v1.timelines.list.$select(id).list({\n limit: 1,\n since_id: latestItem.current,\n });\n let { value } = results;\n 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 useEffect(() => {\n getLists().then(setLists);\n }, []);\n\n const [list, setList] = useState({ title: 'List' });\n // const [title, setTitle] = useState(`List`);\n useTitle(list.title, `/l/:id`);\n useEffect(() => {\n (async () => {\n try {\n const list = await 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=\"Nothing yet.\"\n errorText=\"Unable to load posts.\"\n instance={instance}\n fetchItems={fetchList}\n checkForUpdates={checkForUpdates}\n useItemID\n boostsCarousel={snapStates.settings.boostsCarousel}\n // allowFilters\n filterContext=\"home\"\n 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=\"Lists\" />\n <Icon icon=\"chevron-down\" size=\"s\" />\n </button>\n }\n >\n <MenuLink to=\"/l\">\n <span>All Lists</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>{list.title}</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\" />\n </button>\n }\n >\n <MenuItem\n onClick={() =>\n setShowListAddEditModal({\n list,\n })\n }\n >\n <Icon icon=\"pencil\" size=\"l\" />\n <span>Edit</span>\n </MenuItem>\n <MenuItem onClick={() => setShowManageMembersModal(true)}>\n <Icon icon=\"group\" size=\"l\" />\n <span>Manage members</span>\n </MenuItem>\n </Menu2>\n }\n />\n {showListAddEditModal && (\n <Modal\n 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;\nfunction ListManageMembers({ listID, onClose }) {\n // Show list of members with [Remove] button\n // API only returns 40 members at a time, so this need to be paginated with infinite scroll\n // Show [Add] button after removing a member\n const { masto, instance } = api();\n const [members, setMembers] = useState([]);\n const [uiState, setUIState] = useState('default');\n const [showMore, setShowMore] = useState(false);\n\n const membersIterator = useRef();\n\n async function fetchMembers(firstLoad) {\n setShowMore(false);\n setUIState('loading');\n (async () => {\n try {\n if (firstLoad || !membersIterator.current) {\n membersIterator.current = masto.v1.lists\n .$select(listID)\n .accounts.list({\n limit: MEMBERS_LIMIT,\n });\n }\n const results = await membersIterator.current.next();\n let { done, value } = results;\n if (value?.length) {\n if (firstLoad) {\n setMembers(value);\n } else {\n setMembers(members.concat(value));\n }\n setShowMore(!done);\n } else {\n setShowMore(false);\n }\n setUIState('default');\n } catch (e) {\n setUIState('error');\n }\n })();\n }\n\n useEffect(() => {\n fetchMembers(true);\n }, []);\n\n return (\n <div class=\"sheet\" id=\"list-manage-members-container\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" />\n </button>\n )}\n <header>\n <h2>Manage members</h2>\n </header>\n <main>\n <ul>\n {members.map((member) => (\n <li key={member.id}>\n <AccountBlock account={member} instance={instance} />\n <RemoveAddButton account={member} listID={listID} />\n </li>\n ))}\n {showMore && uiState === 'default' && (\n <InView as=\"li\" onChange={(inView) => inView && fetchMembers()}>\n <button type=\"button\" class=\"light block\" onClick={fetchMembers}>\n Show more&hellip;\n </button>\n </InView>\n )}\n </ul>\n </main>\n </div>\n );\n}\n\nfunction RemoveAddButton({ account, listID }) {\n const { masto } = api();\n const [uiState, setUIState] = useState('default');\n const [removed, setRemoved] = useState(false);\n\n return (\n <MenuConfirm\n confirm={!removed}\n confirmLabel={<span>Remove @{account.username} from list?</span>}\n align=\"end\"\n menuItemClassName=\"danger\"\n onClick={() => {\n if (removed) {\n setUIState('loading');\n (async () => {\n try {\n await masto.v1.lists.$select(listID).accounts.create({\n accountIds: [account.id],\n });\n setUIState('default');\n setRemoved(false);\n } catch (e) {\n setUIState('error');\n }\n })();\n } else {\n // const yes = confirm(`Remove ${account.username} from this list?`);\n // if (!yes) return;\n setUIState('loading');\n\n (async () => {\n try {\n await masto.v1.lists.$select(listID).accounts.remove({\n accountIds: [account.id],\n });\n setUIState('default');\n setRemoved(true);\n } catch (e) {\n setUIState('error');\n }\n })();\n }\n }}\n >\n <button\n type=\"button\"\n class={`light ${removed ? '' : 'danger'}`}\n disabled={uiState === 'loading'}\n >\n {removed ? 'Add' : 'Remove…'}\n </button>\n </MenuConfirm>\n );\n}\n\nexport default List;\n","// 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};\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\nfunction groupNotifications(notifications) {\n // Filter out invalid notifications\n notifications = fixNotifications(notifications);\n\n // Create new flat list of notifications\n // Combine sibling notifications based on type and status id\n // Concat all notification.account into an array of _accounts\n const notificationsMap = {};\n const cleanNotifications = [];\n for (let i = 0, j = 0; i < notifications.length; i++) {\n const notification = notifications[i];\n const { id, status, account, type, createdAt } = notification;\n const date = createdAt ? new Date(createdAt).toLocaleDateString() : '';\n let virtualType = type;\n if (type === 'favourite' || type === 'reblog') {\n virtualType = 'favourite+reblog';\n }\n const key = `${status?.id}-${virtualType}-${date}`;\n const mappedNotification = notificationsMap[key];\n if (virtualType === 'follow_request') {\n cleanNotifications[j++] = notification;\n } else if (mappedNotification?.account) {\n const mappedAccount = mappedNotification._accounts.find(\n (a) => a.id === account.id,\n );\n if (mappedAccount) {\n mappedAccount._types.push(type);\n mappedAccount._types.sort().reverse();\n mappedNotification.id += `-${id}`;\n } else {\n account._types = [type];\n mappedNotification._accounts.push(account);\n mappedNotification.id += `-${id}`;\n }\n } else {\n if (account) account._types = [type];\n let n = (notificationsMap[key] = {\n ...notification,\n type: virtualType,\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.id += `-${id}`;\n } else {\n let n = (notificationsMap2[key] = {\n ...notification,\n type,\n _statuses: [notification.status],\n });\n cleanNotifications2[j++] = n;\n }\n } else {\n cleanNotifications2[j++] = notification;\n }\n }\n\n console.log({ notifications, cleanNotifications, cleanNotifications2 });\n\n // return cleanNotifications;\n return cleanNotifications2;\n}\n\nexport default groupNotifications;\n","import { 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 { masto, instance } = api();\n const [searchParams] = columnMode ? [emptySearchParams] : useSearchParams();\n const [stateType, setStateType] = useState(null);\n const type = props?.type || searchParams.get('type') || stateType;\n useTitle(`Mentions${type === 'private' ? ' (Private)' : ''}`, '/mentions');\n\n const mentionsIterator = useRef();\n const latestItem = useRef();\n\n async function fetchMentions(firstLoad) {\n if (firstLoad || !mentionsIterator.current) {\n mentionsIterator.current = masto.v1.notifications.list({\n limit: LIMIT,\n types: ['mention'],\n });\n }\n const results = await mentionsIterator.current.next();\n let { value } = results;\n if (value?.length) {\n 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.list({\n limit: LIMIT,\n });\n }\n const results = await conversationsIterator.current.next();\n let { value } = results;\n value = value?.filter((item) => item.lastStatus);\n if (value?.length) {\n if (firstLoad) {\n latestConversationItem.current = value[0].lastStatus.id;\n console.log('First load', latestConversationItem.current);\n }\n\n value.forEach(({ lastStatus: item }) => {\n saveStatus(item, instance);\n });\n }\n console.log('results', results);\n return {\n ...results,\n value: value?.map((item) => item.lastStatus),\n };\n }\n\n function fetchItems(...args) {\n if (type === 'private') {\n return fetchConversations(...args);\n }\n return fetchMentions(...args);\n }\n\n async function checkForUpdates() {\n if (type === 'private') {\n try {\n const results = await masto.v1.conversations\n .list({\n limit: 1,\n since_id: latestConversationItem.current,\n })\n .next();\n let { value } = results;\n console.log(\n 'checkForUpdates PRIVATE',\n latestConversationItem.current,\n value,\n );\n 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 .next();\n let { value } = results;\n console.log('checkForUpdates ALL', latestItem.current, value);\n if (value?.length) {\n latestItem.current = value[0].id;\n return true;\n }\n return false;\n } catch (e) {\n return false;\n }\n }\n }\n\n const TimelineStart = useMemo(() => {\n return (\n <div class=\"filter-bar centered\">\n <Link\n to=\"/mentions\"\n class={!type ? 'is-active' : ''}\n onClick={(e) => {\n if (columnMode) {\n e.preventDefault();\n setStateType(null);\n }\n }}\n >\n All\n </Link>\n <Link\n to=\"/mentions?type=private\"\n class={type === 'private' ? 'is-active' : ''}\n onClick={(e) => {\n if (columnMode) {\n e.preventDefault();\n setStateType('private');\n }\n }}\n >\n Private\n </Link>\n </div>\n );\n }, [type]);\n\n return (\n <Timeline\n title=\"Mentions\"\n id=\"mentions\"\n emptyText=\"No one mentioned you :(\"\n errorText=\"Unable to load mentions.\"\n instance={instance}\n fetchItems={fetchItems}\n checkForUpdates={checkForUpdates}\n useItemID\n timelineStart={TimelineStart}\n refresh={type}\n />\n );\n}\n\nexport default Mentions;\n","import './notifications.css';\n\nimport { Fragment } from 'preact';\nimport { memo } from 'preact/compat';\nimport { useCallback, useEffect, useRef, useState } 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 groupNotifications from '../utils/group-notifications';\nimport handleContentLinks from '../utils/handle-content-links';\nimport niceDateTime from '../utils/nice-date-time';\nimport { getRegistration } from '../utils/push-notifications';\nimport shortenNumber from '../utils/shorten-number';\nimport showToast from '../utils/show-toast';\nimport states, { saveStatus } from '../utils/states';\nimport { 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 LIMIT = 80;\nconst emptySearchParams = new URLSearchParams();\n\nconst scrollIntoViewOptions = {\n block: 'center',\n inline: 'center',\n behavior: 'smooth',\n};\n\nfunction Notifications({ columnMode }) {\n useTitle('Notifications', '/notifications');\n const { masto, instance } = api();\n const snapStates = useSnapshot(states);\n const [uiState, setUIState] = useState('default');\n const [searchParams] = columnMode ? [emptySearchParams] : useSearchParams();\n const notificationID = searchParams.get('id');\n const notificationAccessToken = searchParams.get('access_token');\n const [showMore, setShowMore] = useState(false);\n const [onlyMentions, setOnlyMentions] = useState(false);\n const scrollableRef = useRef();\n const { nearReachEnd, scrollDirection, reachStart, nearReachStart } =\n useScroll({\n scrollableRef,\n });\n const hiddenUI = scrollDirection === 'end' && !nearReachStart;\n const [followRequests, setFollowRequests] = useState([]);\n const [announcements, setAnnouncements] = useState([]);\n\n console.debug('RENDER Notifications');\n\n const notificationsIterator = useRef();\n async function fetchNotifications(firstLoad) {\n if (firstLoad || !notificationsIterator.current) {\n // Reset iterator\n notificationsIterator.current = masto.v1.notifications.list({\n limit: LIMIT,\n excludeTypes: ['follow_request'],\n });\n }\n 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 = 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 = groupNotifications(notifications);\n\n if (firstLoad) {\n states.notificationsLast = notifications[0];\n states.notifications = groupedNotifications;\n\n // Update last read marker\n masto.v1.markers\n .create({\n notifications: {\n lastReadId: notifications[0].id,\n },\n })\n .catch(() => {});\n } else {\n states.notifications.push(...groupedNotifications);\n }\n }\n\n states.notificationsShowNew = false;\n states.notificationsLastFetchTime = Date.now();\n return allNotifications;\n }\n\n async function fetchFollowRequests() {\n // Note: no pagination here yet because this better be on a separate page. Should be rare use-case???\n try {\n return await masto.v1.followRequests.list({\n limit: 80,\n });\n } catch (e) {\n // Silently fail\n return [];\n }\n }\n\n const loadFollowRequests = () => {\n setUIState('loading');\n (async () => {\n try {\n const requests = await fetchFollowRequests();\n setFollowRequests(requests);\n setUIState('default');\n } catch (e) {\n setUIState('error');\n }\n })();\n };\n\n async function fetchAnnouncements() {\n try {\n return await masto.v1.announcements.list();\n } catch (e) {\n // Silently fail\n return [];\n }\n }\n\n const 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.v1.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 itemsSelector = '.notification';\n const jRef = useHotkeys('j', () => {\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 const kRef = useHotkeys('k', () => {\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 const oRef = useHotkeys(['enter', 'o'], () => {\n const activeItem = document.activeElement.closest(itemsSelector);\n const statusLink = activeItem?.querySelector('.status-link');\n if (statusLink) {\n statusLink.click();\n }\n });\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=\"Home\" />\n </Link>\n </div>\n <h1>Notifications</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 icon=\"settings\" size=\"l\" alt=\"Notifications settings\" />\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\" /> New notifications\n </button>\n )}\n </header>\n {announcements.length > 0 && (\n <div class=\"shazam-container\">\n <div class=\"shazam-container-inner\">\n <details class=\"announcements\">\n <summary>\n <span>\n <Icon icon=\"announce\" class=\"announcement-icon\" size=\"l\" />{' '}\n <b>Announcement{announcements.length > 1 ? 's' : ''}</b>{' '}\n <small class=\"insignificant\">{instance}</small>\n </span>\n {announcements.length > 1 && (\n <span class=\"announcements-nav-buttons\">\n {announcements.map((announcement, index) => (\n <button\n type=\"button\"\n class=\"plain2 small\"\n onClick={() => {\n announcementsListRef.current?.children[\n index\n ].scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n });\n }}\n >\n {index + 1}\n </button>\n ))}\n </span>\n )}\n </summary>\n <ul\n class={`announcements-list-${\n announcements.length > 1 ? 'multiple' : 'single'\n }`}\n ref={announcementsListRef}\n >\n {announcements.map((announcement) => (\n <li>\n <AnnouncementBlock announcement={announcement} />\n </li>\n ))}\n </ul>\n </details>\n </div>\n </div>\n )}\n {followRequests.length > 0 && (\n <div class=\"follow-requests\">\n <h2 class=\"timeline-header\">Follow requests</h2>\n {followRequests.length > 5 ? (\n <details>\n <summary>{followRequests.length} follow requests</summary>\n <ul>\n {followRequests.map((account) => (\n <li key={account.id}>\n <AccountBlock account={account} />\n <FollowRequestButtons\n accountID={account.id}\n onChange={() => {\n // loadFollowRequests();\n // loadNotifications(true);\n }}\n />\n </li>\n ))}\n </ul>\n </details>\n ) : (\n <ul>\n {followRequests.map((account) => (\n <li key={account.id}>\n <AccountBlock account={account} />\n <FollowRequestButtons\n accountID={account.id}\n onChange={() => {\n // loadFollowRequests();\n // loadNotifications(true);\n }}\n />\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n {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 Filtered notifications from{' '}\n {notificationsPolicy.summary.pendingRequestsCount} people\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 <div id=\"mentions-option\">\n <label>\n <input\n type=\"checkbox\"\n checked={onlyMentions}\n onChange={(e) => {\n setOnlyMentions(e.target.checked);\n }}\n />{' '}\n Only mentions\n </label>\n </div>\n <h2 class=\"timeline-header\">Today</h2>\n {showTodayEmpty && (\n <p class=\"ui-state insignificant\">\n {uiState === 'default' ? \"You're all caught up.\" : <>&hellip;</>}\n </p>\n )}\n {snapStates.notifications.length ? (\n <>\n {snapStates.notifications\n // This is leaked from Notifications popover\n .filter((n) => n.type !== 'follow_request')\n .map((notification) => {\n if (onlyMentions && notification.type !== 'mention') {\n return null;\n }\n const notificationDay = new Date(notification.createdAt);\n const differentDay =\n notificationDay.toDateString() !== currentDay.toDateString();\n if (differentDay) {\n currentDay = notificationDay;\n }\n // if notificationDay is yesterday, show \"Yesterday\"\n // if notificationDay is before yesterday, show date\n const heading =\n notificationDay.toDateString() ===\n yesterdayDate.toDateString()\n ? 'Yesterday'\n : niceDateTime(currentDay, {\n hideTime: true,\n });\n return (\n <Fragment key={notification.id}>\n {differentDay && <h2 class=\"timeline-header\">{heading}</h2>}\n <Notification\n instance={instance}\n notification={notification}\n key={notification.id}\n />\n </Fragment>\n );\n })}\n </>\n ) : (\n <>\n {uiState === 'loading' && (\n <>\n <ul class=\"timeline flat\">\n {Array.from({ length: 5 }).map((_, i) => (\n <li class=\"notification skeleton\">\n <div class=\"notification-type\">\n <Icon icon=\"notification\" size=\"xl\" />\n </div>\n <div class=\"notification-content\">\n <p>███████████ ████</p>\n </div>\n </li>\n ))}\n </ul>\n </>\n )}\n {uiState === 'error' && (\n <p class=\"ui-state\">\n Unable to load notifications\n <br />\n <br />\n <button type=\"button\" onClick={() => loadNotifications(true)}>\n Try again\n </button>\n </p>\n )}\n </>\n )}\n {showMore && (\n <InView\n onChange={(inView) => {\n if (inView) {\n loadNotifications();\n }\n }}\n >\n <button\n type=\"button\"\n class=\"plain block\"\n disabled={uiState === 'loading'}\n onClick={() => loadNotifications()}\n style={{ marginBlockEnd: '6em' }}\n >\n {uiState === 'loading' ? (\n <Loader abrupt />\n ) : (\n <>Show more&hellip;</>\n )}\n </button>\n </InView>\n )}\n </div>\n {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\" />\n </button>\n <header>\n <h2>Notifications settings</h2>\n </header>\n <main>\n <form\n onSubmit={(e) => {\n e.preventDefault();\n const {\n filterNotFollowing,\n filterNotFollowers,\n filterNewAccounts,\n filterPrivateMentions,\n } = e.target;\n const allFilters = {\n filterNotFollowing: filterNotFollowing.checked,\n filterNotFollowers: filterNotFollowers.checked,\n filterNewAccounts: filterNewAccounts.checked,\n filterPrivateMentions: filterPrivateMentions.checked,\n };\n setNotificationsPolicy({\n ...notificationsPolicy,\n ...allFilters,\n });\n setShowNotificationsSettings(false);\n (async () => {\n try {\n await masto.v1.notifications.policy.update(allFilters);\n showToast('Notifications settings updated');\n } catch (e) {\n console.error(e);\n }\n })();\n }}\n >\n <p>Filter out notifications from people:</p>\n <p>\n <label>\n <input\n type=\"checkbox\"\n switch\n defaultChecked={notificationsPolicy.filterNotFollowing}\n name=\"filterNotFollowing\"\n />{' '}\n You don't follow\n </label>\n </p>\n <p>\n <label>\n <input\n type=\"checkbox\"\n switch\n defaultChecked={notificationsPolicy.filterNotFollowers}\n name=\"filterNotFollowers\"\n />{' '}\n Who don't follow you\n </label>\n </p>\n <p>\n <label>\n <input\n type=\"checkbox\"\n switch\n defaultChecked={notificationsPolicy.filterNewAccounts}\n name=\"filterNewAccounts\"\n />{' '}\n With a new account\n </label>\n </p>\n <p>\n <label>\n <input\n type=\"checkbox\"\n switch\n defaultChecked={notificationsPolicy.filterPrivateMentions}\n name=\"filterPrivateMentions\"\n />{' '}\n Who unsolicitedly private mention you\n </label>\n </p>\n <p>\n <button type=\"submit\">Save</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 &bull;{' '}\n <span class=\"ib\">\n Updated{' '}\n <time datetime={updatedAtDate.toISOString()}>\n {niceDateTime(updatedAtDate)}\n </time>\n </span>\n </>\n )}\n </p>\n <div class=\"announcement-reactions\" hidden>\n {reactions.map((reaction) => {\n const { name, count, me, staticUrl, url } = reaction;\n return (\n <button type=\"button\" class={`plain4 small ${me ? 'reacted' : ''}`}>\n {url || staticUrl ? (\n <img src={url || staticUrl} alt={name} width=\"16\" height=\"16\" />\n ) : (\n <span>{name}</span>\n )}{' '}\n <span class=\"count\">{shortenNumber(count)}</span>\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n\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>View notifications from @{account.username}</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\" />\n </button>\n <header>\n <b>Notifications from @{account.username}</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 { 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 `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(`Unable to accept notification request`);\n }\n })();\n }}\n >\n Allow\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 `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(`Unable to dismiss notification request`);\n }\n })();\n }}\n >\n Dismiss\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=\"Accepted\"\n class=\"notification-accepted\"\n />\n ) : (\n requestState === 'dismiss' && (\n <Icon\n icon=\"x-circle\"\n alt=\"Dismissed\"\n class=\"notification-dismissed\"\n />\n )\n )}\n </span>\n </p>\n );\n}\n\nexport default memo(Notifications);\n","import { Menu, MenuDivider, MenuItem } from '@szhsin/react-menu';\nimport { useRef } from 'preact/hooks';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { useSnapshot } from 'valtio';\n\nimport Icon from '../components/icon';\nimport Menu2 from '../components/menu2';\nimport Timeline from '../components/timeline';\nimport { api } from '../utils/api';\nimport { filteredItems } from '../utils/filters';\nimport states from '../utils/states';\nimport { saveStatus } from '../utils/states';\nimport supports from '../utils/supports';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 20;\n\nfunction Public({ local, columnMode, ...props }) {\n const snapStates = useSnapshot(states);\n const isLocal = !!local;\n const params = columnMode ? {} : useParams();\n const { masto, instance } = api({\n instance: props?.instance || params.instance,\n });\n const { masto: currentMasto, instance: currentInstance } = api();\n const title = `${isLocal ? 'Local' : 'Federated'} timeline (${instance})`;\n useTitle(title, isLocal ? `/:instance?/p/l` : `/:instance?/p`);\n // const navigate = useNavigate();\n const latestItem = useRef();\n\n const publicIterator = useRef();\n async function fetchPublic(firstLoad) {\n if (firstLoad || !publicIterator.current) {\n 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);\n }\n const results = await publicIterator.current.next();\n let { value } = results;\n if (value?.length) {\n if (firstLoad) {\n latestItem.current = value[0].id;\n }\n\n // value = filteredItems(value, 'public');\n value.forEach((item) => {\n saveStatus(item, instance);\n });\n }\n return {\n ...results,\n value,\n };\n }\n\n async function checkForUpdates() {\n try {\n const results = await masto.v1.timelines.public\n .list({\n limit: 1,\n local: isLocal,\n since_id: latestItem.current,\n })\n .next();\n let { value } = results;\n 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 ? 'Local timeline' : 'Federated timeline'}</b>\n <div>{instance}</div>\n </h1>\n }\n id=\"public\"\n instance={instance}\n emptyText=\"No one has posted anything yet.\"\n errorText=\"Unable to load posts\"\n fetchItems={fetchPublic}\n checkForUpdates={checkForUpdates}\n useItemID\n headerStart={<></>}\n boostsCarousel={snapStates.settings.boostsCarousel}\n // allowFilters\n filterContext=\"public\"\n headerEnd={\n <Menu2\n portal\n // setDownOverflow\n overflow=\"auto\"\n viewScroll=\"close\"\n position=\"anchor\"\n menuButton={\n <button type=\"button\" class=\"plain\">\n <Icon icon=\"more\" size=\"l\" />\n </button>\n }\n >\n <MenuItem href={isLocal ? `/#/${instance}/p` : `/#/${instance}/p/l`}>\n {isLocal ? (\n <>\n <Icon icon=\"transfer\" /> <span>Switch to Federated</span>\n </>\n ) : (\n <>\n <Icon icon=\"transfer\" /> <span>Switch to Local</span>\n </>\n )}\n </MenuItem>\n <MenuDivider />\n <MenuItem\n onClick={() => {\n let newInstance = prompt(\n 'Enter a new instance e.g. \"mastodon.social\"',\n );\n if (!/\\./.test(newInstance)) {\n if (newInstance) alert('Invalid instance');\n return;\n }\n if (newInstance) {\n newInstance = newInstance.toLowerCase().trim();\n // navigate(isLocal ? `/${newInstance}/p/l` : `/${newInstance}/p`);\n location.hash = isLocal\n ? `/${newInstance}/p/l`\n : `/${newInstance}/p`;\n }\n }}\n >\n <Icon icon=\"bus\" /> <span>Go to another instance…</span>\n </MenuItem>\n {currentInstance !== instance && (\n <MenuItem\n onClick={() => {\n location.hash = isLocal\n ? `/${currentInstance}/p/l`\n : `/${currentInstance}/p`;\n }}\n >\n <Icon icon=\"bus\" />{' '}\n <small class=\"menu-double-lines\">\n Go to my instance (<b>{currentInstance}</b>)\n </small>\n </MenuItem>\n )}\n </Menu2>\n }\n />\n );\n}\n\nexport default Public;\n","import './search.css';\n\nimport { useAutoAnimate } from '@formkit/auto-animate/preact';\nimport { useEffect, useLayoutEffect, useRef, useState } from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport { InView } from 'react-intersection-observer';\nimport { useParams, useSearchParams } from 'react-router-dom';\n\nimport AccountBlock from '../components/account-block';\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport NavMenu from '../components/nav-menu';\nimport SearchForm from '../components/search-form';\nimport Status from '../components/status';\nimport { api } from '../utils/api';\nimport { fetchRelationships } from '../utils/relationships';\nimport shortenNumber from '../utils/shorten-number';\nimport usePageVisibility from '../utils/usePageVisibility';\nimport useTitle from '../utils/useTitle';\n\nconst SHORT_LIMIT = 5;\nconst LIMIT = 40;\nconst emptySearchParams = new URLSearchParams();\n\nfunction Search({ columnMode, ...props }) {\n const params = columnMode ? {} : useParams();\n const { masto, instance, authenticated } = api({\n instance: params.instance,\n });\n const [uiState, setUIState] = useState('default');\n const [searchParams] = columnMode ? [emptySearchParams] : useSearchParams();\n const searchFormRef = useRef();\n const q = props?.query || searchParams.get('q');\n const type = columnMode\n ? 'statuses'\n : props?.type || searchParams.get('type');\n useTitle(\n q\n ? `Search: ${q}${\n type\n ? ` (${\n {\n statuses: 'Posts',\n accounts: 'Accounts',\n hashtags: 'Hashtags',\n }[type]\n })`\n : ''\n }`\n : 'Search',\n `/search`,\n );\n\n const [showMore, setShowMore] = useState(false);\n const offsetRef = useRef(0);\n useEffect(() => {\n offsetRef.current = 0;\n }, [q, type]);\n\n const scrollableRef = useRef();\n useLayoutEffect(() => {\n scrollableRef.current?.scrollTo?.(0, 0);\n }, [q, type]);\n\n const [statusResults, setStatusResults] = useState([]);\n const [accountResults, setAccountResults] = useState([]);\n const [hashtagResults, setHashtagResults] = useState([]);\n useEffect(() => {\n setStatusResults([]);\n setAccountResults([]);\n setHashtagResults([]);\n }, [q]);\n const setTypeResultsFunc = {\n statuses: setStatusResults,\n accounts: setAccountResults,\n hashtags: setHashtagResults,\n };\n\n const [relationshipsMap, setRelationshipsMap] = useState({});\n const loadRelationships = async (accounts) => {\n if (!accounts?.length) return;\n const relationships = await fetchRelationships(accounts, relationshipsMap);\n if (relationships) {\n setRelationshipsMap({\n ...relationshipsMap,\n ...relationships,\n });\n }\n };\n\n function loadResults(firstLoad) {\n if (firstLoad) {\n offsetRef.current = 0;\n }\n\n if (!firstLoad && !authenticated) {\n // Search results pagination is only available to authenticated users\n return;\n }\n\n setUIState('loading');\n if (firstLoad && !type) {\n setStatusResults(statusResults.slice(0, SHORT_LIMIT));\n setAccountResults(accountResults.slice(0, SHORT_LIMIT));\n setHashtagResults(hashtagResults.slice(0, SHORT_LIMIT));\n }\n\n (async () => {\n const params = {\n q,\n resolve: authenticated,\n limit: SHORT_LIMIT,\n };\n if (type) {\n params.limit = LIMIT;\n params.type = type;\n if (authenticated) params.offset = offsetRef.current;\n }\n\n try {\n const results = await masto.v2.search.fetch(params);\n console.log(results);\n if (type) {\n if (firstLoad) {\n setTypeResultsFunc[type](results[type]);\n const length = results[type]?.length;\n offsetRef.current = LIMIT;\n setShowMore(!!length);\n } else {\n setTypeResultsFunc[type]((prev) => [...prev, ...results[type]]);\n const length = results[type]?.length;\n offsetRef.current = offsetRef.current + LIMIT;\n setShowMore(!!length);\n }\n } else {\n setStatusResults(results.statuses || []);\n setAccountResults(results.accounts || []);\n setHashtagResults(results.hashtags || []);\n offsetRef.current = 0;\n setShowMore(false);\n }\n loadRelationships(results.accounts);\n\n setUIState('default');\n } catch (err) {\n console.error(err);\n setUIState('error');\n }\n })();\n }\n\n const lastHiddenTime = useRef();\n usePageVisibility((visible) => {\n const reachStart = scrollableRef.current?.scrollTop === 0;\n if (visible && reachStart) {\n const timeDiff = Date.now() - lastHiddenTime.current;\n if (!lastHiddenTime.current || timeDiff > 1000 * 3) {\n // 3 seconds\n loadResults(true);\n } else {\n lastHiddenTime.current = Date.now();\n }\n }\n });\n\n useEffect(() => {\n searchFormRef.current?.setValue?.(q || '');\n if (q) {\n loadResults(true);\n } else {\n searchFormRef.current?.focus?.();\n }\n }, [q, type, instance]);\n\n useHotkeys(\n ['/', 'Slash'],\n (e) => {\n searchFormRef.current?.focus?.();\n searchFormRef.current?.select?.();\n },\n {\n preventDefault: true,\n },\n );\n\n const [filterBarParent] = useAutoAnimate();\n\n return (\n <div id=\"search-page\" class=\"deck-container\" ref={scrollableRef}>\n <div class=\"timeline-deck deck\">\n <header class={uiState === 'loading' ? 'loading' : ''}>\n <div class=\"header-grid\">\n <div class=\"header-side\">\n <NavMenu />\n </div>\n <SearchForm ref={searchFormRef} />\n <div class=\"header-side\">\n <button\n type=\"button\"\n class=\"plain\"\n onClick={() => {\n loadResults(true);\n }}\n disabled={uiState === 'loading'}\n >\n <Icon icon=\"search\" size=\"l\" />\n </button>\n </div>\n </div>\n </header>\n <main>\n {!!q && !columnMode && (\n <div\n ref={filterBarParent}\n class={`filter-bar ${uiState === 'loading' ? 'loading' : ''}`}\n >\n {!!type && (\n <Link to={`/search${q ? `?q=${encodeURIComponent(q)}` : ''}`}>\n All\n </Link>\n )}\n {[\n {\n label: 'Accounts',\n type: 'accounts',\n to: `/search?q=${encodeURIComponent(q)}&type=accounts`,\n },\n {\n label: 'Hashtags',\n type: 'hashtags',\n to: `/search?q=${encodeURIComponent(q)}&type=hashtags`,\n },\n {\n label: 'Posts',\n type: 'statuses',\n to: `/search?q=${encodeURIComponent(q)}&type=statuses`,\n },\n ]\n .sort((a, b) => {\n if (a.type === type) return -1;\n if (b.type === type) return 1;\n return 0;\n })\n .map((link) => (\n <Link to={link.to} key={link.type}>\n {link.label}\n </Link>\n ))}\n </div>\n )}\n {!!q ? (\n <>\n {(!type || type === 'accounts') && (\n <>\n {type !== 'accounts' && (\n <h2 class=\"timeline-header\">\n Accounts{' '}\n <Link\n to={`/search?q=${encodeURIComponent(q)}&type=accounts`}\n >\n <Icon icon=\"arrow-right\" size=\"l\" />\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 See more accounts <Icon icon=\"arrow-right\" />\n </Link>\n </div>\n )}\n </>\n ) : (\n !type &&\n (uiState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n ) : (\n <p class=\"ui-state\">No accounts found.</p>\n ))\n )}\n </>\n )}\n {(!type || type === 'hashtags') && (\n <>\n {type !== 'hashtags' && (\n <h2 class=\"timeline-header\">\n Hashtags{' '}\n <Link\n to={`/search?q=${encodeURIComponent(q)}&type=hashtags`}\n >\n <Icon icon=\"arrow-right\" size=\"l\" />\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\" />\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 See more hashtags <Icon icon=\"arrow-right\" />\n </Link>\n </div>\n )}\n </>\n ) : (\n !type &&\n (uiState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n ) : (\n <p class=\"ui-state\">No hashtags found.</p>\n ))\n )}\n </>\n )}\n {(!type || type === 'statuses') && (\n <>\n {type !== 'statuses' && (\n <h2 class=\"timeline-header\">\n Posts{' '}\n <Link\n to={`/search?q=${encodeURIComponent(q)}&type=statuses`}\n >\n <Icon icon=\"arrow-right\" size=\"l\" />\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 See more posts <Icon icon=\"arrow-right\" />\n </Link>\n </div>\n )}\n </>\n ) : (\n !type &&\n (uiState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n ) : (\n <p class=\"ui-state\">No posts found.</p>\n ))\n )}\n </>\n )}\n {!!type &&\n (uiState === 'default' ? (\n showMore ? (\n <InView\n onChange={(inView) => {\n if (inView) {\n loadResults();\n }\n }}\n >\n <button\n type=\"button\"\n class=\"plain block\"\n onClick={() => loadResults()}\n style={{ marginBlockEnd: '6em' }}\n >\n Show more&hellip;\n </button>\n </InView>\n ) : (\n <p class=\"ui-state insignificant\">The end.</p>\n )\n ) : (\n uiState === 'loading' && (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n )\n ))}\n </>\n ) : uiState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n ) : (\n <p class=\"ui-state\">\n Enter your search term or paste a URL above to get started.\n </p>\n )}\n </main>\n </div>\n </div>\n );\n}\n\nexport default Search;\n","import '../components/links-bar.css';\nimport './trending.css';\n\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 RelativeTime from '../components/relative-time';\nimport Timeline from '../components/timeline';\nimport { api } from '../utils/api';\nimport { oklab2rgb, rgb2oklab } from '../utils/color-utils';\nimport { filteredItems } from '../utils/filters';\nimport pmem from '../utils/pmem';\nimport shortenNumber from '../utils/shorten-number';\nimport states from '../utils/states';\nimport { saveStatus } from '../utils/states';\nimport 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().next();\n },\n {\n maxAge: TREND_CACHE_TIME,\n },\n);\n\nconst fetchHashtags = pmem(\n (masto) => {\n return masto.v1.trends.tags.list().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.list({\n range: 'daily',\n });\n }\n return masto.v1.trends.statuses.list({\n limit: LIMIT,\n });\n}\n\nfunction fetchLinkList(masto, params) {\n return masto.v1.timelines.link.list(params);\n}\n\nfunction Trending({ columnMode, ...props }) {\n const snapStates = useSnapshot(states);\n const params = columnMode ? {} : useParams();\n const { masto, instance } = api({\n instance: props?.instance || params.instance,\n });\n const { masto: currentMasto, instance: currentInstance } = api();\n const title = `Trending (${instance})`;\n useTitle(title, `/:instance?/trending`);\n // const navigate = useNavigate();\n const latestItem = useRef();\n\n const 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-hashtags');\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 .next();\n let { value } = results;\n value = filteredItems(value, 'public');\n if (value?.length && value[0].id !== latestItem.current) {\n latestItem.current = value[0].id;\n return true;\n }\n return false;\n } catch (e) {\n return false;\n }\n }\n\n const TimelineStart = useMemo(() => {\n return (\n <>\n {!!hashtags.length && (\n <div class=\"filter-bar expandable\">\n <Icon icon=\"chart\" class=\"insignificant\" size=\"l\" />\n {hashtags.map((tag, i) => {\n const { name, history } = tag;\n const total = history.reduce((acc, cur) => acc + +cur.uses, 0);\n return (\n <Link to={`/${instance}/t/${name}`} key={name}>\n <span>\n <span class=\"more-insignificant\">#</span>\n {name}\n </span>\n <span class=\"filter-count\">{shortenNumber(total)}</span>\n </Link>\n );\n })}\n </div>\n )}\n {!!links.length && (\n <div class=\"links-bar\">\n <header>\n <h3>Trending News</h3>\n </header>\n {links.map((link) => {\n const {\n authorName,\n authorUrl,\n blurhash,\n description,\n height,\n image,\n imageDescription,\n language,\n providerName,\n providerUrl,\n publishedAt,\n title,\n url,\n width,\n } = link;\n const domain = punycode.toUnicode(\n URL.parse(url)\n .hostname.replace(/^www\\./, '')\n .replace(/\\/$/, ''),\n );\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 noreferrer\"\n class={\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 && <>&middot; </>}\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 </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\" /> <span>Mentions</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\" />\n </button>\n )}\n </div>\n <p>\n Showing posts mentioning{' '}\n <span class=\"link-text\">\n {currentLink\n .replace(/^https?:\\/\\/(www\\.)?/i, '')\n .replace(/\\/$/, '')}\n </span>\n </p>\n </>\n ) : (\n <p class=\"insignificant\">Trending posts</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>Trending</b>\n <div>{instance}</div>\n </h1>\n }\n id=\"trending\"\n instance={instance}\n emptyText=\"No trending posts.\"\n errorText=\"Unable to load posts\"\n fetchItems={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\" />\n </button>\n }\n >\n <MenuItem\n onClick={() => {\n let newInstance = prompt(\n 'Enter a new instance e.g. \"mastodon.social\"',\n );\n if (!/\\./.test(newInstance)) {\n if (newInstance) alert('Invalid instance');\n return;\n }\n if (newInstance) {\n newInstance = newInstance.toLowerCase().trim();\n // navigate(`/${newInstance}/trending`);\n location.hash = `/${newInstance}/trending`;\n }\n }}\n >\n <Icon icon=\"bus\" /> <span>Go to another instance…</span>\n </MenuItem>\n {currentInstance !== instance && (\n <MenuItem\n onClick={() => {\n location.hash = `/${currentInstance}/trending`;\n }}\n >\n <Icon icon=\"bus\" />{' '}\n <small class=\"menu-double-lines\">\n Go to my instance (<b>{currentInstance}</b>)\n </small>\n </MenuItem>\n )}\n </Menu2>\n }\n />\n );\n}\n\nexport default Trending;\n","import { useHotkeys } from 'react-hotkeys-hook';\nimport { useSnapshot } from 'valtio';\n\nimport Bookmarks from '../pages/bookmarks';\nimport Favourites from '../pages/favourites';\nimport Following from '../pages/following';\nimport Hashtag from '../pages/hashtag';\nimport List from '../pages/list';\nimport Mentions from '../pages/mentions';\nimport Notifications from '../pages/notifications';\nimport Public from '../pages/public';\nimport Search from '../pages/search';\nimport Trending from '../pages/trending';\nimport states from '../utils/states';\nimport useTitle from '../utils/useTitle';\n\nfunction Columns() {\n useTitle('Home', '/');\n const snapStates = useSnapshot(states);\n const { shortcuts } = snapStates;\n\n console.debug('RENDER Columns', shortcuts);\n\n const components = shortcuts.map((shortcut) => {\n if (!shortcut) return null;\n const { type, ...params } = shortcut;\n const Component = {\n following: Following,\n notifications: Notifications,\n list: List,\n public: Public,\n bookmarks: Bookmarks,\n favourites: Favourites,\n hashtag: Hashtag,\n mentions: Mentions,\n trending: Trending,\n search: Search,\n }[type];\n if (!Component) return null;\n // Don't show Search column with no query, for now\n if (type === 'search' && !params.query) return null;\n // 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(['1', '2', '3', '4', '5', '6', '7', '8', '9'], (e, handler) => {\n try {\n const index = parseInt(handler.keys[0], 10) - 1;\n document.querySelectorAll('#columns > *')[index].focus();\n } catch (e) {\n console.error(e);\n }\n });\n\n return (\n <div\n id=\"columns\"\n onContextMenu={(e) => {\n // If right-click on header, but not links or buttons\n if (\n e.target.closest('.deck > header') &&\n !e.target.closest('a') &&\n !e.target.closest('button')\n ) {\n e.preventDefault();\n states.showShortcutsSettings = true;\n }\n }}\n >\n {components}\n </div>\n );\n}\n\nexport default Columns;\n","import './notifications-menu.css';\n\nimport { ControlledMenu } from '@szhsin/react-menu';\nimport { memo } from 'preact/compat';\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport Columns from '../components/columns';\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport Notification from '../components/notification';\nimport { api } from '../utils/api';\nimport db from '../utils/db';\nimport groupNotifications from '../utils/group-notifications';\nimport states, { saveStatus } from '../utils/states';\nimport { getCurrentAccountNS } from '../utils/store-utils';\n\nimport Following from './following';\n\nfunction Home() {\n const snapStates = useSnapshot(states);\n useEffect(() => {\n (async () => {\n const keys = await db.drafts.keys();\n if (keys.length) {\n const ns = getCurrentAccountNS();\n const ownKeys = keys.filter((key) => key.startsWith(ns));\n if (ownKeys.length) {\n states.showDrafts = true;\n }\n }\n })();\n }, []);\n\n return (\n <>\n {(snapStates.settings.shortcutsViewMode === 'multi-column' ||\n (!snapStates.settings.shortcutsViewMode &&\n snapStates.settings.shortcutsColumnsMode)) &&\n !!snapStates.shortcuts?.length ? (\n <Columns />\n ) : (\n <Following\n title=\"Home\"\n path=\"/\"\n id=\"home\"\n headerStart={false}\n headerEnd={<NotificationsLink />}\n />\n )}\n </>\n );\n}\n\nfunction NotificationsLink() {\n const snapStates = useSnapshot(states);\n const notificationLinkRef = useRef();\n const [menuState, setMenuState] = useState(undefined);\n return (\n <>\n <Link\n ref={notificationLinkRef}\n to=\"/notifications\"\n class={`button plain notifications-button ${\n snapStates.notificationsShowNew ? 'has-badge' : ''\n } ${menuState || ''}`}\n onClick={(e) => {\n e.stopPropagation();\n if (window.matchMedia('(min-width: calc(40em))').matches) {\n e.preventDefault();\n setMenuState((state) => (!state ? 'open' : undefined));\n }\n }}\n >\n <Icon icon=\"notification\" size=\"l\" alt=\"Notifications\" />\n </Link>\n <NotificationsMenu\n state={menuState}\n anchorRef={notificationLinkRef}\n onClose={() => setMenuState(undefined)}\n />\n </>\n );\n}\n\nconst NOTIFICATIONS_LIMIT = 80;\nconst NOTIFICATIONS_DISPLAY_LIMIT = 5;\nfunction NotificationsMenu({ anchorRef, state, onClose }) {\n const { masto, instance } = api();\n const snapStates = useSnapshot(states);\n const [uiState, setUIState] = useState('default');\n\n const notificationsIterator = masto.v1.notifications.list({\n limit: NOTIFICATIONS_LIMIT,\n });\n\n async function fetchNotifications() {\n const allNotifications = await notificationsIterator.next();\n const notifications = allNotifications.value;\n\n if (notifications?.length) {\n notifications.forEach((notification) => {\n saveStatus(notification.status, instance, {\n skipThreading: true,\n });\n });\n\n const groupedNotifications = groupNotifications(notifications);\n\n states.notificationsLast = notifications[0];\n states.notifications = groupedNotifications;\n\n // Update last read marker\n masto.v1.markers\n .create({\n notifications: {\n lastReadId: notifications[0].id,\n },\n })\n .catch(() => {});\n }\n\n states.notificationsShowNew = false;\n states.notificationsLastFetchTime = Date.now();\n return allNotifications;\n }\n\n const [hasFollowRequests, setHasFollowRequests] = useState(false);\n function fetchFollowRequests() {\n return masto.v1.followRequests.list({\n limit: 1,\n });\n }\n\n function loadNotifications() {\n setUIState('loading');\n (async () => {\n try {\n await fetchNotifications();\n const followRequests = await fetchFollowRequests();\n setHasFollowRequests(!!followRequests?.length);\n setUIState('default');\n } catch (e) {\n setUIState('error');\n }\n })();\n }\n\n useEffect(() => {\n if (state === 'open') loadNotifications();\n }, [state]);\n\n return (\n <ControlledMenu\n menuClassName=\"notifications-menu\"\n state={state}\n anchorRef={anchorRef}\n onClose={onClose}\n portal={{\n target: document.body,\n }}\n overflow=\"auto\"\n viewScroll=\"close\"\n position=\"anchor\"\n align=\"center\"\n boundingBoxPadding=\"8 8 8 8\"\n >\n <header>\n <h2>Notifications</h2>\n </header>\n <main>\n {snapStates.notifications.length ? (\n <>\n {snapStates.notifications\n .slice(0, NOTIFICATIONS_DISPLAY_LIMIT)\n .map((notification) => (\n <Notification\n key={notification.id}\n instance={instance}\n notification={notification}\n disableContextMenu\n />\n ))}\n </>\n ) : uiState === 'loading' ? (\n <div class=\"ui-state\">\n <Loader abrupt />\n </div>\n ) : (\n uiState === 'error' && (\n <div class=\"ui-state\">\n <p>Unable to fetch notifications.</p>\n <p>\n <button type=\"button\" onClick={loadNotifications}>\n Try again\n </button>\n </p>\n </div>\n )\n )}\n </main>\n <footer>\n <Link to=\"/mentions\" class=\"button plain\">\n <Icon icon=\"at\" /> <span>Mentions</span>\n </Link>\n <Link to=\"/notifications\" class=\"button plain2\">\n {hasFollowRequests ? (\n <>\n <span class=\"tag collapsed\">New</span>{' '}\n <span>Follow Requests</span>\n </>\n ) : (\n <b>See all</b>\n )}{' '}\n <Icon icon=\"arrow-right\" />\n </Link>\n </footer>\n </ControlledMenu>\n );\n}\n\nexport default memo(Home);\n","// export const statusRegex = /\\/@([^@\\/]+)@?([^\\/]+)?\\/([^\\/]+)\\/?$/i;\n// export const statusNoteRegex = /\\/notes\\/([^\\/]+)\\/?$/i;\n\nconst statusPostRegexes = [\n /^\\/@[^@\\/]+\\/(?:statuses|posts)\\/([^\\/]+)/i, // GoToSocial, Takahe\n /\\/notes\\/([^\\/]+)/i, // Misskey, Firefish\n /^\\/(?:notice|objects)\\/([a-z0-9-]+)/i, // Pleroma\n /\\/@[^@\\/]+@?[^\\/]+?\\/([^\\/]+)/i, // Mastodon\n /^\\/p\\/[^\\/]+\\/([^\\/]+)/i, // Pixelfed\n];\n\nexport function getInstanceStatusObject(url) {\n // Regex /:username/:id, where username = @username or @username@domain, id = anything\n const { hostname, pathname } = URL.parse(url);\n // const [, username, domain, id] = pathname.match(statusRegex) || [];\n for (const regex of statusPostRegexes) {\n const [, id] = pathname.match(regex) || [];\n console.log(pathname, regex, id);\n if (id) {\n return {\n instance: hostname,\n id,\n };\n }\n }\n return {};\n}\n\nfunction getInstanceStatusURL(url) {\n const { instance, id } = getInstanceStatusObject(url);\n if (instance && id) {\n return `/${instance}/s/${id}`;\n }\n return null;\n}\n\nexport default getInstanceStatusURL;\n","import { useLayoutEffect, useState } from 'preact/hooks';\nimport { useLocation } from 'react-router-dom';\n\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport { api } from '../utils/api';\nimport getInstanceStatusURL, {\n getInstanceStatusObject,\n} from '../utils/get-instance-status-url';\n\nexport default function HttpRoute() {\n const location = useLocation();\n const url = location.pathname.replace(/^\\//, '');\n const statusObject = getInstanceStatusObject(url);\n // const statusURL = getInstanceStatusURL(url);\n const statusURL = statusObject?.instance\n ? `/${statusObject.instance}/s/${statusObject.id}`\n : null;\n const [uiState, setUIState] = useState('loading');\n\n useLayoutEffect(() => {\n setUIState('loading');\n (async () => {\n // Check if status returns 200\n try {\n const { instance, id } = statusObject;\n const { masto } = api({ instance });\n const status = await masto.v1.statuses.$select(id).fetch();\n if (status) {\n window.location.hash = statusURL + '?view=full';\n return;\n }\n } catch (e) {}\n\n // Fallback to search\n {\n const { masto: currentMasto, instance: currentInstance } = api();\n const result = await currentMasto.v2.search.fetch({\n q: url,\n 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>Resolving…</h2>\n <p>\n <a href={url} target=\"_blank\" rel=\"noopener noreferrer\">\n {url}\n </a>\n </p>\n </>\n ) : (\n <>\n <h2>Unable to resolve URL</h2>\n <p>\n <a href={url} target=\"_blank\" rel=\"noopener noreferrer\">\n {url}\n </a>\n </p>\n </>\n )}\n <hr />\n <p>\n <Link to=\"/\">Go home</Link>\n </p>\n </div>\n );\n}\n","import './lists.css';\n\nimport { useEffect, useReducer, useRef, useState } from 'preact/hooks';\n\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport ListAddEdit from '../components/list-add-edit';\nimport Loader from '../components/loader';\nimport Modal from '../components/modal';\nimport NavMenu from '../components/nav-menu';\nimport { fetchLists } from '../utils/lists';\nimport useTitle from '../utils/useTitle';\n\nfunction Lists() {\n useTitle(`Lists`, `/l`);\n const [uiState, setUIState] = useState('default');\n\n const [reloadCount, reload] = useReducer((c) => c + 1, 0);\n const [lists, setLists] = useState([]);\n useEffect(() => {\n setUIState('loading');\n (async () => {\n try {\n const lists = await 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 return (\n <div id=\"lists-page\" class=\"deck-container\" tabIndex=\"-1\">\n <div class=\"timeline-deck deck\">\n <header>\n <div class=\"header-grid\">\n <div class=\"header-side\">\n <NavMenu />\n <Link to=\"/\" class=\"button plain\">\n <Icon icon=\"home\" size=\"l\" />\n </Link>\n </div>\n <h1>Lists</h1>\n <div class=\"header-side\">\n <button\n type=\"button\"\n class=\"plain\"\n onClick={() => setShowListAddEditModal(true)}\n >\n <Icon icon=\"plus\" size=\"l\" alt=\"New list\" />\n </button>\n </div>\n </div>\n </header>\n <main>\n {lists.length > 0 ? (\n <>\n <ul class=\"link-list\">\n {lists.map((list) => (\n <li>\n <Link to={`/l/${list.id}`}>\n <span>\n <Icon icon=\"list\" /> <span>{list.title}</span>\n </span>\n {/* <button\n type=\"button\"\n class=\"plain\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setShowListAddEditModal({\n list,\n });\n }}\n >\n <Icon icon=\"pencil\" />\n </button> */}\n </Link>\n </li>\n ))}\n </ul>\n {lists.length > 1 && (\n <footer class=\"ui-state\">\n <small class=\"insignificant\">\n {lists.length} list\n {lists.length === 1 ? '' : 's'}\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\">Unable to load lists.</p>\n ) : (\n <p class=\"ui-state\">No lists yet.</p>\n )}\n </main>\n </div>\n {showListAddEditModal && (\n <Modal\n onClick={(e) => {\n if (e.target === e.currentTarget) {\n setShowListAddEditModal(false);\n }\n }}\n >\n <ListAddEdit\n list={showListAddEditModal?.list}\n onClose={(result) => {\n if (result.state === 'success') {\n reload();\n }\n setShowListAddEditModal(false);\n }}\n />\n </Modal>\n )}\n </div>\n );\n}\n\nexport default Lists;\n","export default \"__VITE_ASSET__Y_wpqkTO__\"","const { PHANPY_CLIENT_NAME: CLIENT_NAME, PHANPY_WEBSITE: WEBSITE } = import.meta\n .env;\n\nconst SCOPES = 'read write follow push';\n\nexport async function registerApplication({ instanceURL }) {\n const registrationParams = new URLSearchParams({\n client_name: CLIENT_NAME,\n redirect_uris: location.origin + location.pathname,\n scopes: SCOPES,\n website: WEBSITE,\n });\n const registrationResponse = await fetch(\n `https://${instanceURL}/api/v1/apps`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: registrationParams.toString(),\n },\n );\n const registrationJSON = await registrationResponse.json();\n console.log({ registrationJSON });\n return registrationJSON;\n}\n\nexport async function getAuthorizationURL({ instanceURL, client_id }) {\n const authorizationParams = new URLSearchParams({\n client_id,\n scope: SCOPES,\n redirect_uri: location.origin + location.pathname,\n // redirect_uri: 'urn:ietf:wg:oauth:2.0:oob',\n response_type: 'code',\n });\n const authorizationURL = `https://${instanceURL}/oauth/authorize?${authorizationParams.toString()}`;\n return authorizationURL;\n}\n\nexport async function getAccessToken({\n instanceURL,\n client_id,\n client_secret,\n code,\n}) {\n const params = new URLSearchParams({\n client_id,\n client_secret,\n redirect_uri: location.origin + location.pathname,\n grant_type: 'authorization_code',\n code,\n scope: SCOPES,\n });\n const tokenResponse = await fetch(`https://${instanceURL}/oauth/token`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: params.toString(),\n });\n const tokenJSON = await tokenResponse.json();\n console.log({ tokenJSON });\n return tokenJSON;\n}\n","import './login.css';\n\nimport 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 Link from '../components/link';\nimport Loader from '../components/loader';\nimport instancesListURL from '../data/instances.json?url';\nimport { getAuthorizationURL, registerApplication } from '../utils/auth';\nimport store from '../utils/store';\nimport useTitle from '../utils/useTitle';\n\nconst { PHANPY_DEFAULT_INSTANCE: DEFAULT_INSTANCE } = import.meta.env;\n\nfunction Login() {\n useTitle('Log in');\n const instanceURLRef = useRef();\n const cachedInstanceURL = store.local.get('instanceURL');\n const [uiState, setUIState] = useState('default');\n const [searchParams] = useSearchParams();\n const instance = searchParams.get('instance');\n const submit = searchParams.get('submit');\n const [instanceText, setInstanceText] = useState(\n instance || cachedInstanceURL?.toLowerCase() || '',\n );\n\n const [instancesList, setInstancesList] = useState([]);\n 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 store.local.set('instanceURL', instanceURL);\n\n (async () => {\n setUIState('loading');\n try {\n const { client_id, client_secret, vapid_key } =\n await registerApplication({\n instanceURL,\n });\n\n if (client_id && client_secret) {\n store.session.set('clientID', client_id);\n store.session.set('clientSecret', client_secret);\n store.session.set('vapidKey', vapid_key);\n\n location.href = await getAuthorizationURL({\n instanceURL,\n client_id,\n });\n } else {\n alert('Failed to register application');\n }\n setUIState('default');\n } catch (e) {\n console.error(e);\n setUIState('error');\n }\n })();\n };\n\n const cleanInstanceText = instanceText\n ? instanceText\n .replace(/^https?:\\/\\//, '') // Remove protocol from instance URL\n .replace(/\\/+$/, '') // Remove trailing slash\n .replace(/^@?[^@]+@/, '') // Remove @?acct@\n .trim()\n : null;\n const instanceTextLooksLikeDomain =\n /[^\\s\\r\\n\\t\\/\\\\]+\\.[^\\s\\r\\n\\t\\/\\\\]+/.test(cleanInstanceText) &&\n !/[\\s\\/\\\\@]/.test(cleanInstanceText);\n\n const instancesSuggestions = cleanInstanceText\n ? 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 Log in\n </h1>\n <label>\n <p>Instance</p>\n <input\n value={instanceText}\n required\n type=\"text\"\n class=\"large\"\n id=\"instanceURL\"\n ref={instanceURLRef}\n disabled={uiState === 'loading'}\n // list=\"instances-list\"\n autocorrect=\"off\"\n autocapitalize=\"off\"\n autocomplete=\"off\"\n spellCheck={false}\n placeholder=\"instance domain\"\n onInput={(e) => {\n setInstanceText(e.target.value);\n }}\n />\n {instancesSuggestions?.length > 0 ? (\n <ul id=\"instances-suggestions\">\n {instancesSuggestions.map((instance, i) => (\n <li>\n <button\n type=\"button\"\n class=\"plain5\"\n onClick={() => {\n submitInstance(instance);\n }}\n >\n {instance}\n </button>\n </li>\n ))}\n </ul>\n ) : (\n <div id=\"instances-eg\">e.g. &ldquo;mastodon.social&rdquo;</div>\n )}\n {/* <datalist id=\"instances-list\">\n {instancesList.map((instance) => (\n <option value={instance} />\n ))}\n </datalist> */}\n </label>\n {uiState === 'error' && (\n <p class=\"error\">\n Failed to log in. Please try again or another instance.\n </p>\n )}\n <div>\n <button\n disabled={\n uiState === 'loading' || !instanceText || !selectedInstanceText\n }\n >\n {selectedInstanceText\n ? `Continue with ${selectedInstanceText}`\n : 'Continue'}\n </button>{' '}\n </div>\n <Loader hidden={uiState !== 'loading'} />\n <hr />\n {!DEFAULT_INSTANCE && (\n <p>\n <a href=\"https://joinmastodon.org/servers\" target=\"_blank\">\n Don't have an account? Create one!\n </a>\n </p>\n )}\n <p>\n <Link to=\"/\">Go home</Link>\n </p>\n </form>\n </main>\n );\n}\n\nexport default Login;\n","import './status.css';\n\nimport { Menu, MenuDivider, MenuHeader, MenuItem } from '@szhsin/react-menu';\nimport debounce from 'just-debounce-it';\nimport pRetry from 'p-retry';\nimport { memo } from 'preact/compat';\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'preact/hooks';\nimport 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 MediaModal from '../components/media-modal';\nimport Menu2 from '../components/menu2';\nimport NameText from '../components/name-text';\nimport RelativeTime from '../components/relative-time';\nimport Status from '../components/status';\nimport { api } from '../utils/api';\nimport htmlContentLength from '../utils/html-content-length';\nimport shortenNumber from '../utils/shorten-number';\nimport states, {\n getStatus,\n saveStatus,\n statusKey,\n threadifyStatus,\n} from '../utils/states';\nimport statusPeek from '../utils/status-peek';\nimport { getCurrentAccount } from '../utils/store-utils';\nimport useScroll from '../utils/useScroll';\nimport useTitle from '../utils/useTitle';\n\nimport getInstanceStatusURL from './../utils/get-instance-status-url';\n\nconst LIMIT = 40;\nconst SUBCOMMENTS_OPEN_ALL_LIMIT = 10;\nconst MAX_WEIGHT = 5;\n\nlet cachedRepliesToggle = {};\nlet cachedStatusesMap = {};\nlet scrollPositions = {};\nfunction resetScrollPosition(id) {\n delete cachedStatusesMap[id];\n delete scrollPositions[id];\n}\n\nconst scrollIntoViewOptions = {\n block: 'nearest',\n inline: 'center',\n behavior: 'smooth',\n};\n\n// Select all statuses except those inside collapsed details/summary\n// Hat-tip to @AmeliaBR@front-end.social\n// https://front-end.social/@AmeliaBR/109784776146144471\nconst STATUSES_SELECTOR =\n '.status-link:not(details:not([open]) > summary ~ *, details:not([open]) > summary ~ * *), .status-focus:not(details:not([open]) > summary ~ *, details:not([open]) > summary ~ * *)';\n\nconst STATUS_URL_REGEX = /\\/s\\//i;\n\nfunction StatusPage(params) {\n const { id } = params;\n const { masto, instance } = api({ instance: params.instance });\n const snapStates = useSnapshot(states);\n const [searchParams, setSearchParams] = useSearchParams();\n const mediaParam = searchParams.get('media');\n const mediaOnlyParam = searchParams.get('media-only');\n const mediaIndex = parseInt(mediaParam || mediaOnlyParam, 10);\n let showMedia = mediaIndex > 0;\n const mediaStatusID = searchParams.get('mediaStatusID');\n const mediaStatus = getStatus(mediaStatusID, instance);\n if (mediaStatusID && !mediaStatus) {\n showMedia = false;\n }\n const showMediaOnly = showMedia && !!mediaOnlyParam;\n\n const sKey = statusKey(id, instance);\n const [heroStatus, setHeroStatus] = useState(states.statuses[sKey]);\n useEffect(() => {\n if (states.statuses[sKey]) {\n setHeroStatus(states.statuses[sKey]);\n }\n }, [sKey]);\n\n const closeLink = useMemo(() => {\n const { prevLocation } = states;\n const pathname =\n (prevLocation?.pathname || '') + (prevLocation?.search || '');\n const matchStatusPath =\n matchPath('/:instance/s/:id', pathname) || matchPath('/s/:id', pathname);\n if (!pathname || matchStatusPath) {\n return '/';\n }\n return pathname;\n }, []);\n\n useEffect(() => {\n if (!heroStatus && showMedia) {\n (async () => {\n try {\n const status = await masto.v1.statuses.$select(id).fetch();\n saveStatus(status, instance);\n setHeroStatus(status);\n } catch (err) {\n console.error(err);\n alert('Unable to load post.');\n location.hash = closeLink;\n }\n })();\n }\n }, [showMedia]);\n\n const mediaAttachments = mediaStatusID\n ? snapStates.statuses[statusKey(mediaStatusID, instance)]?.mediaAttachments\n : heroStatus?.mediaAttachments;\n\n const handleMediaClose = useCallback(() => {\n if (\n !window.matchMedia('(min-width: calc(40em + 350px))').matches &&\n snapStates.prevLocation\n ) {\n history.back();\n } else {\n if (showMediaOnly) {\n location.hash = closeLink;\n } else {\n searchParams.delete('media');\n searchParams.delete('mediaStatusID');\n setSearchParams(searchParams);\n }\n }\n }, [showMediaOnly, closeLink, snapStates.prevLocation]);\n\n useEffect(() => {\n let timer = setTimeout(() => {\n // carouselRef.current?.focus?.();\n const $carousel = document.querySelector('.carousel');\n if ($carousel) {\n $carousel.focus();\n }\n }, 100);\n return () => clearTimeout(timer);\n }, [showMediaOnly]);\n\n 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\nfunction StatusThread({ id, closeLink = '/', instance: propInstance }) {\n const [searchParams, setSearchParams] = useSearchParams();\n const mediaParam = searchParams.get('media');\n const mediaStatusID = searchParams.get('mediaStatusID');\n const showMedia = parseInt(mediaParam, 10) > 0;\n const firstLoad = useRef(\n !states.prevLocation &&\n (history.length === 1 ||\n ('navigation' in window && navigation?.entries?.()?.length === 1)),\n );\n const [viewMode, setViewMode] = useState(\n searchParams.get('view') || firstLoad.current ? 'full' : null,\n );\n const translate = !!parseInt(searchParams.get('translate'));\n const { masto, instance } = api({ instance: propInstance });\n const {\n masto: currentMasto,\n instance: currentInstance,\n authenticated,\n } = api();\n const sameInstance = instance === currentInstance;\n const snapStates = useSnapshot(states);\n const [statuses, setStatuses] = useState([]);\n const [uiState, setUIState] = useState('default');\n const heroStatusRef = useRef();\n const sKey = statusKey(id, instance);\n const totalDescendants = useRef(0);\n\n const scrollableRef = useRef();\n useEffect(() => {\n scrollableRef.current?.focus();\n }, []);\n useEffect(() => {\n const onScroll = debounce(() => {\n // console.log('onScroll');\n if (!scrollableRef.current) return;\n const { scrollTop } = scrollableRef.current;\n if (uiState !== 'loading') {\n scrollPositions[id] = scrollTop;\n }\n }, 50);\n scrollableRef.current?.addEventListener('scroll', onScroll, {\n passive: true,\n });\n onScroll();\n return () => {\n onScroll.cancel();\n scrollableRef.current?.removeEventListener('scroll', onScroll);\n };\n }, [id, uiState !== 'loading']);\n\n const scrollOffsets = useRef();\n const 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 totalDescendants.current = descendants?.length || 0;\n\n const missingStatuses = new Set();\n ancestors.forEach((status) => {\n saveStatus(status, instance, {\n skipThreading: true,\n });\n if (\n status.inReplyToId &&\n !ancestors.find((s) => s.id === status.inReplyToId)\n ) {\n missingStatuses.add(status.inReplyToId);\n }\n });\n const ancestorsIsThread = ancestors.every(\n (s) => s.account.id === heroStatus.account.id,\n );\n const nestedDescendants = [];\n descendants.forEach((status) => {\n saveStatus(status, instance, {\n skipThreading: true,\n });\n\n if (\n status.inReplyToId &&\n !descendants.find((s) => s.id === status.inReplyToId) &&\n status.inReplyToId !== heroStatus.id\n ) {\n missingStatuses.add(status.inReplyToId);\n }\n\n if (status.inReplyToAccountId === status.account.id) {\n // If replying to self, it's part of the thread, level 1\n nestedDescendants.push(status);\n } else if (status.inReplyToId === heroStatus.id) {\n // If replying to the hero status, it's a reply, level 1\n nestedDescendants.push(status);\n } else if (\n !status.inReplyToAccountId &&\n nestedDescendants.find((s) => s.id === status.inReplyToId) &&\n status.account.id === heroStatus.account.id\n ) {\n // If replying to hero's own statuses, it's part of the thread, level 1\n nestedDescendants.push(status);\n } else {\n // If replying to someone else, it's a reply to a reply, level 2\n const parent = descendants.find((s) => s.id === status.inReplyToId);\n if (parent) {\n if (!parent.__replies) {\n parent.__replies = [];\n }\n parent.__replies.push(status);\n } else {\n // If no parent, something is wrong\n console.warn('No parent found for', status);\n }\n }\n });\n\n console.log({ ancestors, descendants, nestedDescendants });\n if (missingStatuses.size) {\n console.error('Missing statuses', [...missingStatuses]);\n }\n\n function expandReplies(_replies) {\n return _replies?.map((_r) => ({\n id: _r.id,\n account: _r.account,\n repliesCount: _r.repliesCount,\n content: _r.content,\n weight: calcStatusWeight(_r),\n replies: expandReplies(_r.__replies),\n }));\n }\n\n const allStatuses = [\n ...ancestors.map((s) => ({\n id: s.id,\n ancestor: true,\n isThread: ancestorsIsThread,\n accountID: s.account.id,\n account: s.account,\n repliesCount: s.repliesCount,\n weight: calcStatusWeight(s),\n })),\n {\n id,\n accountID: heroStatus.account.id,\n weight: calcStatusWeight(heroStatus),\n },\n ...nestedDescendants.map((s) => ({\n id: s.id,\n account: s.account,\n accountID: s.account.id,\n descendant: true,\n thread: s.account.id === heroStatus.account.id,\n weight: calcStatusWeight(s),\n replies: expandReplies(s.__replies),\n })),\n ];\n\n setUIState('default');\n scrollOffsets.current = {\n offsetTop: heroStatusRef.current?.offsetTop,\n scrollTop: scrollableRef.current?.scrollTop,\n };\n\n // Set limit to hero's index\n const heroLimit = allStatuses.findIndex((s) => s.id === id);\n if (heroLimit >= limit) {\n setLimit(heroLimit + 1);\n }\n\n console.log({ allStatuses });\n setStatuses(allStatuses);\n cachedStatusesMap[id] = allStatuses;\n\n // Let's threadify this one\n // Note that all non-hero statuses will trigger saveStatus which will threadify them too\n // By right, at this point, all descendant statuses should be cached\n threadifyStatus(heroStatus, instance);\n } catch (e) {\n console.error(e);\n setUIState('error');\n }\n })();\n\n 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 : 'Status',\n '/:instance?/s/:id',\n );\n\n const postInstance = useMemo(() => {\n if (!heroStatus) return;\n const { url } = heroStatus;\n if (!url) return;\n return 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;\n },\n },\n );\n // For backspace, will always close both media and status page\n useHotkeys('backspace', () => {\n location.hash = closeLink;\n });\n\n useHotkeys('j', () => {\n const activeStatus = document.activeElement.closest(\n '.status-link, .status-focus',\n );\n const activeStatusRect = activeStatus?.getBoundingClientRect();\n const allStatusLinks = Array.from(\n scrollableRef.current.querySelectorAll(STATUSES_SELECTOR),\n );\n console.log({ allStatusLinks });\n if (\n activeStatus &&\n activeStatusRect.top < scrollableRef.current.clientHeight &&\n activeStatusRect.bottom > 0\n ) {\n const activeStatusIndex = allStatusLinks.indexOf(activeStatus);\n let nextStatus = allStatusLinks[activeStatusIndex + 1];\n if (nextStatus) {\n nextStatus.focus();\n nextStatus.scrollIntoView(scrollIntoViewOptions);\n }\n } else {\n // If active status is not in viewport, get the topmost status-link in viewport\n const topmostStatusLink = allStatusLinks.find((statusLink) => {\n const statusLinkRect = statusLink.getBoundingClientRect();\n return statusLinkRect.top >= 44 && statusLinkRect.left >= 0; // 44 is the magic number for header height, not real\n });\n if (topmostStatusLink) {\n topmostStatusLink.focus();\n topmostStatusLink.scrollIntoView(scrollIntoViewOptions);\n }\n }\n });\n\n useHotkeys('k', () => {\n const activeStatus = document.activeElement.closest(\n '.status-link, .status-focus',\n );\n const activeStatusRect = activeStatus?.getBoundingClientRect();\n const allStatusLinks = Array.from(\n scrollableRef.current.querySelectorAll(STATUSES_SELECTOR),\n );\n if (\n activeStatus &&\n activeStatusRect.top < scrollableRef.current.clientHeight &&\n activeStatusRect.bottom > 0\n ) {\n const activeStatusIndex = allStatusLinks.indexOf(activeStatus);\n let prevStatus = allStatusLinks[activeStatusIndex - 1];\n if (prevStatus) {\n prevStatus.focus();\n prevStatus.scrollIntoView(scrollIntoViewOptions);\n }\n } else {\n // If active status is not in viewport, get the topmost status-link in viewport\n const topmostStatusLink = allStatusLinks.find((statusLink) => {\n const statusLinkRect = statusLink.getBoundingClientRect();\n return statusLinkRect.top >= 44 && statusLinkRect.left >= 0; // 44 is the magic number for header height, not real\n });\n if (topmostStatusLink) {\n topmostStatusLink.focus();\n topmostStatusLink.scrollIntoView(scrollIntoViewOptions);\n }\n }\n });\n\n // NOTE: I'm not sure if 'x' is the best shortcut for this, might change it later\n // IDEA: x is for expand\n useHotkeys('x', () => {\n const activeStatus = document.activeElement.closest(\n '.status-link, .status-focus',\n );\n if (activeStatus) {\n const details = activeStatus.nextElementSibling;\n if (details && details.tagName.toLowerCase() === 'details') {\n details.open = !details.open;\n }\n }\n });\n\n const [reachTopPost, setReachTopPost] = useState(false);\n // const { nearReachStart } = useScroll({\n // scrollableRef,\n // distanceFromStartPx: 16,\n // });\n\n const initialPageState = useRef(showMedia ? 'media+status' : 'status');\n\n const handleMediaClick = useCallback(\n (e, i, media, status) => {\n e.preventDefault();\n e.stopPropagation();\n setSearchParams({\n media: i + 1,\n mediaStatusID: status.id,\n });\n },\n [id],\n );\n\n const handleStatusLinkClick = useCallback((e, status) => {\n resetScrollPosition(status.id);\n }, []);\n\n useEffect(() => {\n let timer;\n if (mediaStatusID && showMedia) {\n timer = setTimeout(() => {\n const status = scrollableRef.current?.querySelector(\n `.status-link[href*=\"/${mediaStatusID}\"]`,\n );\n if (status) {\n status.scrollIntoView(scrollIntoViewOptions);\n }\n }, 400); // After CSS transition\n }\n return () => {\n clearTimeout(timer);\n };\n }, [mediaStatusID, showMedia]);\n\n const renderStatus = useCallback(\n (status, i) => {\n const {\n id: statusID,\n ancestor,\n isThread,\n descendant,\n thread,\n replies,\n repliesCount,\n weight,\n } = status;\n const isHero = statusID === id;\n const 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 You're not logged in. Interactions (reply, boost, etc) are\n not possible.\n </p>\n <Link to=\"/login\" class=\"button\">\n Log in\n </Link>\n </div>\n ) : (\n !sameInstance && (\n <div class=\"post-status-banner\">\n <p>\n This post is from another instance (<b>{instance}</b>).\n Interactions (reply, boost, etc) are not possible.\n </p>\n <button\n type=\"button\"\n disabled={uiState === 'loading'}\n onClick={() => {\n setUIState('loading');\n (async () => {\n try {\n const results = await currentMasto.v2.search.fetch({\n q: heroStatus.url,\n type: 'statuses',\n resolve: true,\n limit: 1,\n });\n if (results.statuses.length) {\n const status = results.statuses[0];\n location.hash = currentInstance\n ? `/${currentInstance}/s/${status.id}`\n : `/s/${status.id}`;\n } else {\n throw new Error('No results');\n }\n } catch (e) {\n setUIState('default');\n alert('Error: ' + e);\n console.error(e);\n }\n })();\n }}\n >\n <Icon icon=\"transfer\" /> Switch to my instance to enable\n interactions\n </button>\n </div>\n )\n )}\n </>\n ) : (\n <StatusParent\n 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\" />{' '}\n <span title={repliesCount}>\n {shortenNumber(repliesCount)}\n </span>\n </div>\n )}{' '}\n {/* {replies?.length > LIMIT && (\n <div class=\"replies-link\">\n <Icon icon=\"comment\" />{' '}\n <span title={replies.length}>\n {shortenNumber(replies.length)}\n </span>\n </div>\n )} */}\n </StatusParent>\n // </Link>\n )}\n {descendant && replies?.length > 0 && (\n <SubComments\n instance={instance}\n replies={replies}\n hasParentThread={thread}\n level={1}\n accWeight={weight}\n openAll={totalDescendants.current < SUBCOMMENTS_OPEN_ALL_LIMIT}\n 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 Unable to load replies.\n <br />\n <button\n type=\"button\"\n class=\"plain\"\n onClick={() => {\n states.reloadStatusPage++;\n }}\n >\n Try again\n </button>\n </div>\n )}\n </li>\n );\n },\n [\n id,\n instance,\n uiState,\n authenticated,\n sameInstance,\n translate,\n handleMediaClick,\n handleStatusLinkClick,\n hasDescendants,\n ],\n );\n\n const prevLocationIsStatusPage = useMemo(() => {\n // Navigation API\n if ('navigation' in window && navigation?.entries) {\n const prevEntry = navigation.entries()[navigation.currentEntry.index - 1];\n if (prevEntry?.url) {\n return STATUS_URL_REGEX.test(prevEntry.url);\n }\n }\n return STATUS_URL_REGEX.test(states.prevLocation?.pathname);\n }, [sKey]);\n\n const moreStatusesKeys = useMemo(() => {\n if (!showMore) return [];\n const ids = [];\n function getIDs(status) {\n ids.push(status.id);\n if (status.replies) {\n status.replies.forEach(getIDs);\n }\n }\n statuses.slice(limit).forEach(getIDs);\n return ids.map((id) => statusKey(id, instance));\n }, [showMore, statuses, limit, instance]);\n\n 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\" />\n </button>\n )}\n {!heroInView && heroStatus && uiState !== 'loading' ? (\n <>\n <span class=\"hero-heading\">\n <NameText\n account={heroStatus.account}\n instance={instance}\n showAvatar\n short\n />{' '}\n <span class=\"insignificant\">\n &bull;{' '}\n <RelativeTime\n datetime={heroStatus.createdAt}\n format=\"micro\"\n />\n </span>\n </span>{' '}\n <button\n type=\"button\"\n class=\"ancestors-indicator light small\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n heroStatusRef.current.scrollIntoView({\n behavior: 'smooth',\n block: 'start',\n });\n }}\n title=\"Go to main post\"\n >\n <Icon\n icon={heroPointer === 'down' ? 'arrow-down' : 'arrow-up'}\n />\n </button>\n </>\n ) : (\n <>\n Post{' '}\n <button\n type=\"button\"\n class=\"ancestors-indicator light small\"\n onClick={(e) => {\n // Scroll to top\n e.preventDefault();\n e.stopPropagation();\n scrollableRef.current.scrollTo({\n top: 0,\n behavior: 'smooth',\n });\n }}\n hidden={!ancestors.length || reachTopPost}\n title={`${ancestors.length} posts above Go to top`}\n >\n <Icon icon=\"arrow-up\" />\n {ancestors\n .filter(\n (a, i, arr) =>\n arr.findIndex((b) => b.accountID === a.accountID) === i,\n )\n .slice(0, 3)\n .map((ancestor) => (\n <Avatar\n key={ancestor.account.id}\n url={ancestor.account.avatar}\n alt={ancestor.account.displayName}\n />\n ))}\n {/* <Icon icon=\"comment\" />{' '} */}\n {ancestors.length > 3 && (\n <>\n {' '}\n <span class=\"insignificant\">\n {shortenNumber(ancestors.length)}\n </span>\n </>\n )}\n </button>\n </>\n )}\n </h1>\n <div class=\"header-side\">\n <button\n type=\"button\"\n class=\"plain4 button-switch-view\"\n style={{\n display: viewMode === 'full' ? '' : 'none',\n }}\n onClick={() => {\n setViewMode(null);\n searchParams.delete('media');\n searchParams.delete('media-only');\n searchParams.delete('view');\n setSearchParams(searchParams);\n }}\n title=\"Switch to Side Peek view\"\n >\n <Icon icon=\"layout4\" size=\"l\" />\n </button>\n {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\" />\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=\"Actions\" size=\"xl\" />\n </button>\n }\n >\n <MenuItem\n disabled={uiState === 'loading'}\n onClick={() => {\n states.reloadStatusPage++;\n }}\n >\n <Icon icon=\"refresh\" />\n <span>Refresh</span>\n </MenuItem>\n <MenuItem\n className=\"menu-switch-view\"\n onClick={() => {\n setViewMode(viewMode === 'full' ? null : 'full');\n searchParams.delete('media');\n searchParams.delete('media-only');\n if (viewMode === 'full') {\n searchParams.delete('view');\n } else {\n searchParams.set('view', 'full');\n }\n setSearchParams(searchParams);\n }}\n >\n <Icon\n icon={\n {\n '': 'layout5',\n full: 'layout4',\n }[viewMode || '']\n }\n />\n <span>\n Switch to {viewMode === 'full' ? 'Side Peek' : 'Full'} view\n </span>\n </MenuItem>\n <MenuItem\n onClick={() => {\n // Click all buttons with class .spoiler but not .spoiling\n const buttons = Array.from(\n scrollableRef.current.querySelectorAll(\n '.spoiler-button:not(.spoiling), .spoiler-media-button:not(.spoiling)',\n ),\n );\n buttons.forEach((button) => {\n button.click();\n });\n }}\n >\n <Icon icon=\"eye-open\" /> <span>Show all sensitive content</span>\n </MenuItem>\n <MenuDivider />\n <MenuHeader className=\"plain\">Experimental</MenuHeader>\n <MenuItem\n disabled={!postInstance || postSameInstance}\n onClick={() => {\n const statusURL = getInstanceStatusURL(heroStatus.url);\n if (statusURL) {\n location.hash = statusURL;\n } else {\n alert('Unable to switch');\n }\n }}\n >\n <Icon icon=\"transfer\" />\n <small class=\"menu-double-lines\">\n Switch to post's instance\n {postInstance ? (\n <>\n {' '}\n (<b>{punycode.toUnicode(postInstance)}</b>)\n </>\n ) : (\n ''\n )}\n </small>\n </MenuItem>\n </Menu2>\n <Link class=\"button plain deck-close\" to={closeLink}>\n <Icon icon=\"x\" size=\"xl\" />\n </Link>\n </div>\n </div>\n </header>\n {!!statuses.length && heroStatus ? (\n <ul\n class={`timeline flat contextual grow ${\n uiState === 'loading' ? 'loading' : ''\n }`}\n >\n {statusesList}\n {showMore > 0 && (\n <li>\n <button\n type=\"button\"\n class=\"plain block show-more\"\n disabled={uiState === 'loading'}\n onClick={() => setLimit((l) => l + LIMIT)}\n style={{ marginBlockEnd: '6em' }}\n data-state-post-ids={moreStatusesKeys.join(' ')}\n >\n <div class=\"ib avatars-bunch\">\n {/* show avatars for first 5 statuses */}\n {statuses.slice(limit, limit + 5).map((status) => (\n <Avatar\n key={status.id}\n url={status.account.avatarStatic}\n // title={`${status.avatar.displayName} (@${status.avatar.acct})`}\n />\n ))}\n </div>{' '}\n <div class=\"ib\">\n Show more&hellip;{' '}\n <span class=\"tag\">\n {showMore > LIMIT ? `${LIMIT}+` : showMore}\n </span>\n </div>\n </button>\n </li>\n )}\n </ul>\n ) : (\n <>\n {uiState === 'loading' && (\n <ul class=\"timeline flat contextual grow loading\">\n <li>\n <Status skeleton size=\"l\" />\n </li>\n </ul>\n )}\n {uiState === 'error' && (\n <p class=\"ui-state\">\n Unable to load post\n <br />\n <br />\n <button\n type=\"button\"\n onClick={() => {\n states.reloadStatusPage++;\n }}\n >\n Try again\n </button>\n </p>\n )}\n </>\n )}\n </div>\n );\n}\n\nfunction SubComments({\n replies,\n instance,\n hasParentThread,\n level,\n accWeight,\n openAll,\n parentLink,\n}) {\n const [searchParams, setSearchParams] = useSearchParams();\n\n // Total comments count, including sub-replies\n const diveDeep = (replies) => {\n return replies.reduce((acc, reply) => {\n const { repliesCount, replies } = reply;\n const count = replies?.length || repliesCount;\n return acc + count + diveDeep(replies || []);\n }, 0);\n };\n const totalComments = replies.length + diveDeep(replies);\n const sameCount = replies.length === totalComments;\n\n // Get the first 3 accounts, unique by id\n const accounts = replies\n .map((r) => r.account)\n .filter((a, i, arr) => arr.findIndex((b) => b.id === a.id) === i)\n .slice(0, 3);\n\n const totalWeight = useMemo(() => {\n return replies?.reduce((acc, reply) => {\n return acc + reply?.weight;\n }, accWeight);\n }, [accWeight, replies?.length]);\n\n let open = false;\n if (openAll) {\n open = true;\n } else if (totalWeight <= MAX_WEIGHT) {\n open = true;\n } else if (!hasParentThread && totalComments === 1) {\n const shortReply = calcStatusWeight(replies[0]) < 2;\n if (shortReply) open = true;\n }\n const openBefore = cachedRepliesToggle[replies[0].id];\n\n const handleMediaClick = useCallback((e, i, media, status) => {\n e.preventDefault();\n e.stopPropagation();\n setSearchParams({\n media: i + 1,\n mediaStatusID: status.id,\n });\n }, []);\n\n const detailsRef = useRef();\n useLayoutEffect(() => {\n function handleScroll(e) {\n e.target.dataset.scrollLeft = e.target.scrollLeft;\n }\n detailsRef.current?.addEventListener('scroll', handleScroll, {\n passive: true,\n });\n return () => {\n detailsRef.current?.removeEventListener('scroll', handleScroll);\n };\n }, []);\n\n return (\n <details\n ref={detailsRef}\n class=\"replies\"\n open={openBefore || open}\n onToggle={(e) => {\n const { open } = e.target;\n // use first reply as ID\n cachedRepliesToggle[replies[0].id] = open;\n }}\n style={{\n '--comments-level': level,\n }}\n data-comments-level={level}\n data-comments-level-overflow={level > 4}\n >\n <summary class=\"replies-summary\" hidden={open}>\n <span class=\"avatars\">\n {accounts.map((a) => (\n <Avatar\n key={a.id}\n url={a.avatarStatic}\n title={`${a.displayName} @${a.username}`}\n squircle={a?.bot}\n />\n ))}\n </span>\n <span class=\"replies-counts\">\n <b>\n <span title={replies.length}>{shortenNumber(replies.length)}</span>{' '}\n repl\n {replies.length === 1 ? 'y' : 'ies'}\n </b>\n {!sameCount && totalComments > 1 && (\n <>\n {' '}\n &middot;{' '}\n <span>\n <span title={totalComments}>\n {shortenNumber(totalComments)}\n </span>{' '}\n comment\n {totalComments === 1 ? '' : 's'}\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=\"View post with its replies\"\n >\n &raquo;\n </Link>\n )}\n </summary>\n <ul>\n {replies.map((r) => (\n <li key={r.id}>\n {/* <Link\n class=\"status-link\"\n to={instance ? `/${instance}/s/${r.id}` : `/s/${r.id}`}\n onClick={() => {\n resetScrollPosition(r.id);\n }}\n > */}\n <div class=\"status-focus\" tabIndex={0}>\n <Status\n statusID={r.id}\n instance={instance}\n withinContext\n size=\"s\"\n enableTranslate\n onMediaClick={handleMediaClick}\n showActionsBar\n />\n {!r.replies?.length && r.repliesCount > 0 && (\n <div class=\"replies-link\">\n <Icon icon=\"comment2\" />{' '}\n <span title={r.repliesCount}>\n {shortenNumber(r.repliesCount)}\n </span>\n </div>\n )}\n </div>\n {/* </Link> */}\n {r.replies?.length && (\n <SubComments\n instance={instance}\n replies={r.replies}\n level={level + 1}\n accWeight={!open ? r.weight : totalWeight}\n openAll={openAll}\n 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 </details>\n );\n}\n\nconst MEDIA_VIRTUAL_LENGTH = 140;\nconst POLL_VIRTUAL_LENGTH = 35;\nconst CARD_VIRTUAL_LENGTH = 70;\nconst WEIGHT_SEGMENT = 140;\nconst statusWeightCache = new Map();\nfunction calcStatusWeight(status) {\n const cachedWeight = statusWeightCache.get(status.id);\n if (cachedWeight) return cachedWeight;\n const { spoilerText, content, mediaAttachments, poll, card } = status;\n const length = htmlContentLength(spoilerText + content);\n const mediaLength = mediaAttachments?.length ? MEDIA_VIRTUAL_LENGTH : 0;\n const pollLength = (poll?.options?.length || 0) * POLL_VIRTUAL_LENGTH;\n const cardLength =\n card && (mediaAttachments?.length || poll?.options?.length)\n ? 0\n : CARD_VIRTUAL_LENGTH;\n const totalLength = length + mediaLength + pollLength + cardLength;\n const weight = totalLength / WEIGHT_SEGMENT;\n statusWeightCache.set(status.id, weight);\n return weight;\n}\n\nexport default memo(StatusPage);\n","import { useParams } from 'react-router-dom';\n\nimport Status from './status';\n\nexport default function StatusRoute() {\n const params = useParams();\n const { id, instance } = params;\n return <Status id={id} instance={instance} />;\n}\n","export default \"__VITE_ASSET__W5CngKHO__\"","export default \"__VITE_ASSET__vmqRZ5q5__\"","export default \"__VITE_ASSET__DFAo1Udm__\"","export default \"__VITE_ASSET__D2_o1n6___\"","export default \"__VITE_ASSET__ySLnBMku__\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20xml:space='preserve'%20fill-rule='evenodd'%20stroke-linejoin='round'%20stroke-miterlimit='2'%20clip-rule='evenodd'%20viewBox='0%200%20102%2028'%3e%3cpath%20fill='none'%20d='M0%200h101.5v27.5H0z'/%3e%3cg%20fill-rule='nonzero'%3e%3cpath%20fill='url(%23a)'%20d='M2.32%2021.85c1.4%200%202.21-.85%202.21-2.3v-4.64H8.5c4.45%200%207.54-2.9%207.54-7.24%200-4.35-2.98-7.24-7.32-7.24h-6.4C.93.43.11%201.28.11%202.73v16.82c0%201.45.82%202.3%202.21%202.3Zm2.21-10.4V3.94h3c2.54%200%204%201.34%204%203.75s-1.47%203.76-4%203.76h-3Z'/%3e%3cpath%20fill='url(%23b)'%20d='M20.52%2021.88c1.25%200%202.13-.76%202.13-2.23v-7.04c0-2.07%201.2-3.49%203.21-3.49%201.95%200%202.95%201.23%202.95%203.25v7.28c0%201.47.89%202.23%202.13%202.23%201.26%200%202.14-.76%202.14-2.23v-8.18c0-3.64-1.99-5.9-5.48-5.9-2.38%200-4.1%201.12-4.93%203.1h-.09V2.3c0-1.38-.78-2.2-2.1-2.2-1.31%200-2.1.82-2.1%202.2v17.34c0%201.47.9%202.23%202.14%202.23Z'/%3e%3cpath%20fill='url(%23c)'%20d='M40.45%2021.82c1.96%200%203.93-.98%204.8-2.65h.1v.8c.08%201.27.89%201.91%202.05%201.91%201.21%200%202.08-.73%202.08-2.15v-8.95c0-3.17-2.63-5.25-6.65-5.25-3.26%200-5.78%201.16-6.5%203.04-.15.32-.23.63-.23.96%200%20.97.75%201.64%201.79%201.64.69%200%201.23-.26%201.7-.79.95-1.23%201.74-1.65%203.04-1.65%201.62%200%202.64.85%202.64%202.31v1.04l-3.95.24c-3.93.23-6.13%201.88-6.13%204.74%200%202.83%202.27%204.76%205.26%204.76Zm1.4-3.09c-1.43%200-2.4-.73-2.4-1.9%200-1.12.91-1.83%202.51-1.95l3.31-.2v1.14c0%201.7-1.54%202.91-3.41%202.91Z'/%3e%3cpath%20fill='url(%23d)'%20d='M54.37%2021.88c1.26%200%202.14-.76%202.14-2.23v-7.09c0-2.03%201.21-3.44%203.13-3.44s2.89%201.17%202.89%203.22v7.31c0%201.47.88%202.23%202.14%202.23%201.24%200%202.13-.76%202.13-2.23v-8.2c0-3.68-1.96-5.87-5.45-5.87-2.41%200-4%201.07-4.83%203.01h-.09v-.87c0-1.35-.85-2.17-2.14-2.17-1.28%200-2.06.82-2.06%202.15v11.95c0%201.47.9%202.23%202.14%202.23Z'/%3e%3cpath%20fill='url(%23e)'%20d='M71.65%2027.17c1.26%200%202.14-.76%202.14-2.23v-6h.09a5.15%205.15%200%200%200%204.88%202.88c3.92%200%206.35-3.05%206.35-8.1%200-5.07-2.44-8.1-6.43-8.1a5.12%205.12%200%200%200-4.86%202.99h-.09v-.85c0-1.45-.88-2.21-2.1-2.21-1.24%200-2.11.76-2.11%202.2v17.2c0%201.46.89%202.22%202.13%202.22Zm5.6-8.8c-2.1%200-3.47-1.8-3.47-4.65%200-2.81%201.37-4.67%203.47-4.67%202.14%200%203.49%201.83%203.49%204.67%200%202.86-1.35%204.66-3.5%204.66Z'/%3e%3cpath%20fill='url(%23f)'%20d='M89.61%2027.39c3.44%200%205.26-1.5%206.73-5.55l4.81-13.1a4%204%200%200%200%20.24-1.26c0-1.13-.85-1.93-2.08-1.93-1.1%200-1.71.51-2.07%201.7l-3.4%2010.9h-.08L90.35%207.28c-.36-1.25-.94-1.73-2.07-1.73-1.26%200-2.21.83-2.21%201.99%200%20.35.09.82.25%201.26l5%2013.21-.21.56c-.52%201.1-1.32%201.42-2.07%201.42l-.75-.01c-.96%200-1.56.54-1.56%201.4%200%201.29%201%202%202.88%202Z'/%3e%3c/g%3e%3cdefs%3e%3cradialGradient%20id='a'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='rotate(28.51%20.06%20.22)%20scale(57.6252)'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20offset='0'%20stop-color='%23a4bff7'/%3e%3cstop%20offset='1'%20stop-color='%236081e6'/%3e%3c/radialGradient%3e%3cradialGradient%20id='b'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='rotate(28.51%20.06%20.22)%20scale(57.6252)'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20offset='0'%20stop-color='%23a4bff7'/%3e%3cstop%20offset='1'%20stop-color='%236081e6'/%3e%3c/radialGradient%3e%3cradialGradient%20id='c'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='rotate(28.51%20.06%20.22)%20scale(57.6252)'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20offset='0'%20stop-color='%23a4bff7'/%3e%3cstop%20offset='1'%20stop-color='%236081e6'/%3e%3c/radialGradient%3e%3cradialGradient%20id='d'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='rotate(28.51%20.06%20.22)%20scale(57.6252)'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20offset='0'%20stop-color='%23a4bff7'/%3e%3cstop%20offset='1'%20stop-color='%236081e6'/%3e%3c/radialGradient%3e%3cradialGradient%20id='e'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='rotate(28.51%20.06%20.22)%20scale(57.6252)'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20offset='0'%20stop-color='%23a4bff7'/%3e%3cstop%20offset='1'%20stop-color='%236081e6'/%3e%3c/radialGradient%3e%3cradialGradient%20id='f'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='rotate(28.51%20.06%20.22)%20scale(57.6252)'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20offset='0'%20stop-color='%23a4bff7'/%3e%3cstop%20offset='1'%20stop-color='%236081e6'/%3e%3c/radialGradient%3e%3c/defs%3e%3c/svg%3e\"","import './welcome.css';\n\nimport boostsCarouselUrl from '../assets/features/boosts-carousel.jpg';\nimport groupedNotificationsUrl from '../assets/features/grouped-notifications.jpg';\nimport multiColumnUrl from '../assets/features/multi-column.jpg';\nimport multiHashtagTimelineUrl from '../assets/features/multi-hashtag-timeline.jpg';\nimport nestedCommentsThreadUrl from '../assets/features/nested-comments-thread.jpg';\nimport logoText from '../assets/logo-text.svg';\nimport logo from '../assets/logo.svg';\n\nimport Link from '../components/link';\nimport states from '../utils/states';\nimport useTitle from '../utils/useTitle';\n\nconst {\n PHANPY_DEFAULT_INSTANCE: DEFAULT_INSTANCE,\n PHANPY_WEBSITE: WEBSITE,\n PHANPY_PRIVACY_POLICY_URL: PRIVACY_POLICY_URL,\n PHANPY_DEFAULT_INSTANCE_REGISTRATION_URL: DEFAULT_INSTANCE_REGISTRATION_URL,\n} = import.meta.env;\nconst appSite = WEBSITE\n ? WEBSITE.replace(/https?:\\/\\//g, '').replace(/\\/$/, '')\n : null;\nconst appVersion = __BUILD_TIME__\n ? `${__BUILD_TIME__.slice(0, 10).replace(/-/g, '.')}${\n __COMMIT_HASH__ ? `.${__COMMIT_HASH__}` : ''\n }`\n : null;\n\nfunction Welcome() {\n useTitle(null, ['/', '/welcome']);\n return (\n <main id=\"welcome\">\n <div class=\"hero-container\">\n <div class=\"hero-content\">\n <h1>\n <img\n src={logo}\n alt=\"\"\n width=\"160\"\n height=\"160\"\n style={{\n aspectRatio: '1/1',\n marginBlockEnd: -16,\n }}\n />\n <img src={logoText} alt=\"Phanpy\" width=\"200\" />\n </h1>\n <p class=\"desc\">A minimalistic opinionated Mastodon web client.</p>\n <p>\n <Link\n to={\n DEFAULT_INSTANCE\n ? `/login?instance=${DEFAULT_INSTANCE}&submit=1`\n : '/login'\n }\n class=\"button\"\n >\n {DEFAULT_INSTANCE ? 'Log in' : 'Log in with Mastodon'}\n </Link>\n </p>\n {DEFAULT_INSTANCE && DEFAULT_INSTANCE_REGISTRATION_URL && (\n <p>\n <a href={DEFAULT_INSTANCE_REGISTRATION_URL} class=\"button plain5\">\n Sign up\n </a>\n </p>\n )}\n {!DEFAULT_INSTANCE && (\n <p class=\"insignificant\">\n <small>\n Connect your existing Mastodon/Fediverse account.\n <br />\n Your credentials are not stored on this server.\n </small>\n </p>\n )}\n </div>\n {(appSite || appVersion) && (\n <p class=\"app-site-version\">\n <small>\n {appSite} {appVersion}\n </small>\n </p>\n )}\n <p>\n <a href=\"https://github.com/cheeaun/phanpy\" target=\"_blank\">\n Built\n </a>{' '}\n by{' '}\n <a\n href=\"https://mastodon.social/@cheeaun\"\n target=\"_blank\"\n onClick={(e) => {\n e.preventDefault();\n states.showAccount = 'cheeaun@mastodon.social';\n }}\n >\n @cheeaun\n </a>\n .{' '}\n <a href={PRIVACY_POLICY_URL} target=\"_blank\">\n Privacy Policy\n </a>\n .\n </p>\n </div>\n <div id=\"why-container\">\n <div class=\"sections\">\n <section>\n <img\n src={boostsCarouselUrl}\n alt=\"Screenshot of Boosts Carousel\"\n loading=\"lazy\"\n />\n <h4>Boosts Carousel</h4>\n <p>\n Visually separate original posts and re-shared posts (boosted\n posts).\n </p>\n </section>\n <section>\n <img\n src={nestedCommentsThreadUrl}\n alt=\"Screenshot of nested comments thread\"\n loading=\"lazy\"\n />\n <h4>Nested comments thread</h4>\n <p>Effortlessly follow conversations. Semi-collapsible replies.</p>\n </section>\n <section>\n <img\n src={groupedNotificationsUrl}\n alt=\"Screenshot of grouped notifications\"\n loading=\"lazy\"\n />\n <h4>Grouped notifications</h4>\n <p>\n Similar notifications are grouped and collapsed to reduce clutter.\n </p>\n </section>\n <section>\n <img\n src={multiColumnUrl}\n alt=\"Screenshot of multi-column UI\"\n loading=\"lazy\"\n />\n <h4>Single or multi-column</h4>\n <p>\n By default, single column for zen-mode seekers. Configurable\n multi-column for power users.\n </p>\n </section>\n <section>\n <img\n src={multiHashtagTimelineUrl}\n alt=\"Screenshot of multi-hashtag timeline with a form to add more hashtags\"\n loading=\"lazy\"\n />\n <h4>Multi-hashtag timeline</h4>\n <p>Up to 5 hashtags combined into a single timeline.</p>\n </section>\n </div>\n </div>\n </main>\n );\n}\n\nexport default Welcome;\n","// Replace alert() with toastify-js\nimport Toastify from 'toastify-js';\n\nconst nativeAlert = window.alert;\nif (!window.__nativeAlert) window.__nativeAlert = nativeAlert;\n\nwindow.alert = function (message) {\n console.debug(\n 'ALERT: This is a custom alert() function. Native alert() is still available as window.__nativeAlert()',\n );\n // If Error object, show the message\n if (message instanceof Error && message?.message) {\n message = message.message;\n }\n // If not string, stringify it\n if (typeof message !== 'string') {\n message = JSON.stringify(message);\n }\n\n const toast = Toastify({\n text: message,\n className: 'alert',\n gravity: 'top',\n position: 'center',\n duration: 10_000,\n offset: {\n y: 48,\n },\n onClick: () => {\n toast.hideToast();\n },\n });\n toast.showToast();\n};\n","import './app.css';\n\nimport debounce from 'just-debounce-it';\nimport {\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'preact/hooks';\nimport { matchPath, Route, Routes, useLocation } from 'react-router-dom';\nimport 'swiped-events';\nimport { subscribe } from 'valtio';\n\nimport BackgroundService from './components/background-service';\nimport ComposeButton from './components/compose-button';\nimport { ICONS } from './components/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 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 Search from './pages/search';\nimport StatusRoute from './pages/status-route';\nimport Trending from './pages/trending';\nimport Welcome from './pages/welcome';\nimport {\n api,\n initAccount,\n initClient,\n initInstance,\n initPreferences,\n} from './utils/api';\nimport { getAccessToken } from './utils/auth';\nimport focusDeck from './utils/focus-deck';\nimport states, { initStates, statusKey } from './utils/states';\nimport store from './utils/store';\nimport { getCurrentAccount, setCurrentAccountID } from './utils/store-utils';\nimport './utils/toast-alert';\n\nwindow.__STATES__ = states;\nwindow.__STATES_STATS__ = () => {\n const keys = [\n 'statuses',\n 'accounts',\n 'spoilers',\n 'unfurledLinks',\n 'statusQuotes',\n ];\n const counts = {};\n keys.forEach((key) => {\n counts[key] = Object.keys(states[key]).length;\n });\n console.warn('STATE stats', counts);\n\n const { statuses } = states;\n const unmountedPosts = [];\n for (const key in statuses) {\n const $post = document.querySelector(\n `[data-state-post-id~=\"${key}\"], [data-state-post-ids~=\"${key}\"]`,\n );\n if (!$post) {\n unmountedPosts.push(key);\n }\n }\n console.warn('Unmounted posts', unmountedPosts.length, unmountedPosts);\n};\n\n// Experimental \"garbage collection\" for states\n// Every 15 minutes\n// Only posts for now\nsetInterval(() => {\n if (!window.__IDLE__) return;\n const { statuses, unfurledLinks, notifications } = states;\n let keysCount = 0;\n const { instance } = api();\n for (const key in statuses) {\n if (!window.__IDLE__) break;\n try {\n const $post = document.querySelector(\n `[data-state-post-id~=\"${key}\"], [data-state-post-ids~=\"${key}\"]`,\n );\n const postInNotifications = notifications.some(\n (n) => key === statusKey(n.status?.id, instance),\n );\n if (!$post && !postInNotifications) {\n delete states.statuses[key];\n delete states.statusQuotes[key];\n for (const link in unfurledLinks) {\n const unfurled = unfurledLinks[link];\n const sKey = statusKey(unfurled.id, unfurled.instance);\n if (sKey === key) {\n delete states.unfurledLinks[link];\n break;\n }\n }\n keysCount++;\n }\n } catch (e) {}\n }\n if (keysCount) {\n console.info(`GC: Removed ${keysCount} keys`);\n }\n}, 15 * 60 * 1000);\n\n// Preload icons\n// There's probably a better way to do this\n// Related: https://github.com/vitejs/vite/issues/10600\nsetTimeout(() => {\n for (const icon in ICONS) {\n setTimeout(() => {\n if (Array.isArray(ICONS[icon])) {\n ICONS[icon][0]?.();\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 const theme = store.local.get('theme');\n let $meta;\n if (theme) {\n // Get current meta\n $meta = document.querySelector(\n `meta[name=\"theme-color\"][data-theme-setting=\"manual\"]`,\n );\n if ($meta) {\n const color = $meta.content;\n const tempColor =\n theme === 'light'\n ? $meta.dataset.themeLightColorTemp\n : $meta.dataset.themeDarkColorTemp;\n $meta.content = tempColor || '';\n setTimeout(() => {\n $meta.content = color;\n }, 10);\n }\n } else {\n // Get current color scheme\n const colorScheme = window.matchMedia('(prefers-color-scheme: dark)')\n .matches\n ? 'dark'\n : 'light';\n // Get current theme-color\n $meta = document.querySelector(\n `meta[name=\"theme-color\"][media*=\"${colorScheme}\"]`,\n );\n if ($meta) {\n const color = $meta.dataset.content;\n const tempColor = $meta.dataset.contentTemp;\n $meta.content = tempColor || '';\n setTimeout(() => {\n $meta.content = color;\n }, 10);\n }\n }\n }\n });\n}\n\n{\n const theme = store.local.get('theme');\n // If there's a theme, it's NOT auto\n if (theme) {\n // dark | light\n document.documentElement.classList.add(`is-${theme}`);\n document\n .querySelector('meta[name=\"color-scheme\"]')\n .setAttribute('content', theme || 'dark light');\n\n // Enable manual theme <meta>\n const $manualMeta = document.querySelector(\n 'meta[data-theme-setting=\"manual\"]',\n );\n if ($manualMeta) {\n $manualMeta.name = 'theme-color';\n $manualMeta.content =\n theme === 'light'\n ? $manualMeta.dataset.themeLightColor\n : $manualMeta.dataset.themeDarkColor;\n }\n // Disable auto theme <meta>s\n const $autoMetas = document.querySelectorAll(\n 'meta[data-theme-setting=\"auto\"]',\n );\n $autoMetas.forEach((m) => {\n m.name = '';\n });\n }\n const textSize = store.local.get('textSize');\n if (textSize) {\n document.documentElement.style.setProperty('--text-size', `${textSize}px`);\n }\n}\n\nsubscribe(states, (changes) => {\n for (const [action, path, value, prevValue] of changes) {\n // Change #app dataset based on settings.shortcutsViewMode\n if (path.join('.') === 'settings.shortcutsViewMode') {\n const $app = document.getElementById('app');\n if ($app) {\n $app.dataset.shortcutsViewMode = states.shortcuts?.length ? value : '';\n }\n }\n\n // Add/Remove cloak class to body\n if (path.join('.') === 'settings.cloakMode') {\n const $body = document.body;\n $body.classList.toggle('cloak', value);\n }\n }\n});\n\nfunction App() {\n const [isLoggedIn, setIsLoggedIn] = useState(false);\n const [uiState, setUIState] = useState('loading');\n\n useEffect(() => {\n const instanceURL = store.local.get('instanceURL');\n const code = decodeURIComponent(\n (window.location.search.match(/code=([^&]+)/) || [, ''])[1],\n );\n\n if (code) {\n console.log({ code });\n // Clear the code from the URL\n window.history.replaceState(\n {},\n document.title,\n window.location.pathname || '/',\n );\n\n const clientID = store.session.get('clientID');\n const clientSecret = store.session.get('clientSecret');\n const vapidKey = store.session.get('vapidKey');\n\n (async () => {\n setUIState('loading');\n const { access_token: accessToken } = await getAccessToken({\n instanceURL,\n client_id: clientID,\n client_secret: clientSecret,\n code,\n });\n\n const client = initClient({ instance: instanceURL, accessToken });\n await Promise.allSettled([\n initPreferences(client),\n initInstance(client, instanceURL),\n initAccount(client, instanceURL, accessToken, vapidKey),\n ]);\n initStates();\n\n setIsLoggedIn(true);\n setUIState('default');\n })();\n } else {\n window.__IGNORE_GET_ACCOUNT_ERROR__ = true;\n const account = getCurrentAccount();\n if (account) {\n 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 await initPreferences(client);\n await initInstance(client, instance);\n } catch (e) {\n } finally {\n setIsLoggedIn(true);\n setUIState('default');\n }\n })();\n } else {\n setUIState('default');\n }\n }\n }, []);\n\n let location = useLocation();\n states.currentLocation = location.pathname;\n // useLayoutEffect(() => {\n // states.currentLocation = location.pathname;\n // }, [location.pathname]);\n\n useEffect(focusDeck, [location, isLoggedIn]);\n\n if (/\\/https?:/.test(location.pathname)) {\n return <HttpRoute />;\n }\n\n return (\n <>\n <PrimaryRoutes isLoggedIn={isLoggedIn} loading={uiState === 'loading'} />\n <SecondaryRoutes isLoggedIn={isLoggedIn} />\n {uiState === 'default' && (\n <Routes>\n <Route path=\"/:instance?/s/:id\" element={<StatusRoute />} />\n </Routes>\n )}\n {isLoggedIn && <ComposeButton />}\n {isLoggedIn && <Shortcuts />}\n <Modals />\n {isLoggedIn && <NotificationService />}\n <BackgroundService isLoggedIn={isLoggedIn} />\n {uiState !== 'loading' && <SearchCommand onClose={focusDeck} />}\n <KeyboardShortcutsHelp />\n </>\n );\n}\n\nfunction PrimaryRoutes({ isLoggedIn, loading }) {\n const location = useLocation();\n const nonRootLocation = useMemo(() => {\n const { pathname } = location;\n return !/^\\/(login|welcome)/i.test(pathname);\n }, [location]);\n\n return (\n <Routes location={nonRootLocation || location}>\n <Route\n path=\"/\"\n element={\n isLoggedIn ? (\n <Home />\n ) : loading ? (\n <Loader id=\"loader-root\" />\n ) : (\n <Welcome />\n )\n }\n />\n <Route path=\"/login\" element={<Login />} />\n <Route path=\"/welcome\" element={<Welcome />} />\n </Routes>\n );\n}\n\nfunction getPrevLocation() {\n return states.prevLocation || null;\n}\nfunction SecondaryRoutes({ isLoggedIn }) {\n // const snapStates = useSnapshot(states);\n const location = useLocation();\n // const prevLocation = snapStates.prevLocation;\n const backgroundLocation = useRef(getPrevLocation());\n\n const isModalPage = useMemo(() => {\n return (\n matchPath('/:instance/s/:id', location.pathname) ||\n matchPath('/s/:id', location.pathname)\n );\n }, [location.pathname, matchPath]);\n if (isModalPage) {\n if (!backgroundLocation.current)\n backgroundLocation.current = getPrevLocation();\n } else {\n backgroundLocation.current = null;\n }\n console.debug({\n backgroundLocation: backgroundLocation.current,\n location,\n });\n\n return (\n <Routes location={backgroundLocation.current || location}>\n {isLoggedIn && (\n <>\n <Route path=\"/notifications\" element={<Notifications />} />\n <Route path=\"/mentions\" element={<Mentions />} />\n <Route path=\"/following\" element={<Following />} />\n <Route path=\"/b\" element={<Bookmarks />} />\n <Route path=\"/f\" element={<Favourites />} />\n <Route path=\"/l\">\n <Route index element={<Lists />} />\n <Route path=\":id\" element={<List />} />\n </Route>\n <Route path=\"/fh\" element={<FollowedHashtags />} />\n <Route path=\"/ft\" element={<Filters />} />\n <Route path=\"/catchup\" element={<Catchup />} />\n </>\n )}\n <Route path=\"/:instance?/t/:hashtag\" element={<Hashtag />} />\n <Route path=\"/:instance?/a/:id\" element={<AccountStatuses />} />\n <Route path=\"/:instance?/p\">\n <Route index element={<Public />} />\n <Route path=\"l\" element={<Public local />} />\n </Route>\n <Route path=\"/:instance?/trending\" element={<Trending />} />\n <Route path=\"/:instance?/search\" element={<Search />} />\n {/* <Route path=\"/:anything\" element={<NotFound />} /> */}\n </Routes>\n );\n}\n\nexport { App };\n","import './index.css';\n\nimport './cloak-mode.css';\n\nimport './polyfills';\n\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';\n\nif (import.meta.env.DEV) {\n import('preact/debug');\n}\n\nrender(\n <HashRouter>\n <App />\n </HashRouter>,\n document.getElementById('app'),\n);\n\n// Storage cleanup\nsetTimeout(() => {\n try {\n // Clean up iconify localStorage\n Object.keys(localStorage).forEach((key) => {\n if (key.startsWith('iconify')) {\n localStorage.removeItem(key);\n }\n });\n Object.keys(sessionStorage).forEach((key) => {\n if (key.startsWith('iconify')) {\n sessionStorage.removeItem(key);\n }\n });\n\n // Clean up old settings key\n localStorage.removeItem('settings:boostsCarousel');\n } catch (e) {}\n}, 5000);\n\nwindow.__CLOAK__ = () => {\n document.body.classList.toggle('cloak');\n};\n"],"names":["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","visible","setVisible","useState","checkLatestNotification","masto","instance","skipCheckMarkers","states","notificationsLast","notificationsIterator","v1","notifications","list","limit","sinceId","id","value","next","length","notificationsShowNew","lastReadId","markers","fetch","timeline","sub","pollNotifications","streaming","api","hasStreaming","setTimeout","user","notification","subscribe","log","entry","_a","checkForUpdates","clearTimeout","clearInterval","r","info","useInterval","lastCheckDate","useHotkeys","currentCloakMode","Date","diff","ComposeButton","snapStates","useSnapshot","handleButton","composerState","minimized","openOSK","shiftKey","openCompose","showCompose","ignoreEventWhen","querySelector","_jsx","type","onClick","class","publishing","publishingError","children","Icon","icon","size","alt","KeyboardShortcutsHelp","onClose","showKeyboardShortcutsHelp","hasModal","Modal","tabindex","action","keys","_jsxs","_Fragment","className","map","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","target","i","child","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","style","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","Accounts","accounts","store","local","getJSON","currentAccount","getCurrentAccountID","moreThanOneAccount","_","reload","useReducer","accountsListParent","tabIndex","ref","account","isCurrent","isDefault","Avatar","url","avatarStatic","onDblClick","$select","NameText","test","showAcct","setCurrentAccountID","Menu2","align","menuButton","title","MenuItem","MenuDivider","disabled","splice","MenuConfirm","subMenu","confirmLabel","menuItemClassName","href","Link","to","logo","createBackendPushSubscription","subscription","push","create","fetchBackendPushSubscription","updateBackendPushSubscription","update","removeBackendPushSubscription","isPushSupported","navigator","getRegistration","serviceWorker","getSubscription","registration","pushManager","undefined","urlBase64ToUint8Array","base64String","padding","repeat","base64","replace","rawData","atob","outputArray","Uint8Array","charCodeAt","initSubscription","backendSubscription","err","message","sameEndpoint","vapidKey","sameKey","key2","getCurrentAccount","applicationServerKey","vapidKeyStr","applicationServerKeyStr","updateSubscription","data","policy","error","removeSubscription","DEFAULT_TEXT_SIZE","TEXT_SIZES","PHANPY_WEBSITE","WEBSITE","PHANPY_PRIVACY_POLICY_URL","PRIVACY_POLICY_URL","PHANPY_IMG_ALT_API_URL","IMG_ALT_API_URL","PHANPY_GIPHY_API_KEY","GIPHY_API_KEY","import","Settings","currentTheme","get","themeFormRef","targetLanguage","settings","contentTranslationTargetLanguage","systemTargetLanguage","getTranslateTargetLanguage","systemTargetLanguageText","localeCode2Text","currentTextSize","prefs","setPrefs","authenticated","onInput","formData","theme","documentElement","html","classList","$manualMeta","$autoMetas","querySelectorAll","m","toggle","name","defaultChecked","fontSize","min","max","step","onChange","parseInt","setProperty","for","alert","rel","checked","autoRefresh","boostsCarousel","contentTranslation","targetLanguages","lang","code","contentTranslationHideLanguages","composerGIFPicker","mediaAltGenerator","shortcutSettingsCloudImportExport","cloakMode","PushNotificationsSection","display","flexWrap","gap","lineHeight","src","aspectRatio","verticalAlign","borderRadius","readOnly","__BUILD_TIME__","showToast","writeText","datetime","uiState","setUIState","allowNotifications","setAllowNotifications","setNeedRelogin","pushFormRef","needRelogin","alerts","previousPolicyRef","policyEl","namedItem","isLoading","values","mention","favourite","reblog","follow","follow_request","followRequest","status","key","alertsCount","allowNotifications2","permission","label","alert2","focusDeck","timer","columns","getElementById","modals","modal","modalFocusElement","focus","pages","page","useLocationChange","location","useLocation","currentLocationRef","pathname","FETCH_MAX_AGE","MAX_AGE","fetchLists","pmem","lists","sort","a","b","localeCompare","set","updatedAt","now","maxAge","getLists","fetchList","getList","theList","getListTitle","addListStore","updateListStore","index","deleteListStore","listID","findIndex","ListAddEdit","editMode","nameFieldRef","repliesPolicyFieldRef","exclusiveFieldRef","repliesPolicy","exclusive","supportsExclusive","supports","onSubmit","preventDefault","FormData","listResult","replies_policy","MUTE_DURATIONS","MUTE_DURATIONS_LABELS","LIMIT","ACCOUNT_INFO_MAX_AGE","fetchFamiliarFollowers","currentID","familiarFollowers","memFetchFamiliarFollowers","fetchPostingStats","accountID","fetchStatuses","statuses","total","originals","replies","stats","boosts","memFetchPostingStats","fetchAccount","standalone","currentMasto","currentInstance","isString","useMemo","setInfo","sameCurrentInstance","info2","acct","avatar","bot","createdAt","displayName","emojis","fields","group","lastStatusAt","locked","note","statusesCount","username","memorial","moved","roles","hideCollections","header","headerStatic","headerIsAvatar","isSelf","infoHasEssentials","account2","updated","punycode","accountInstance","setHeaderCornerColors","followersIterator","toUnicode","domain","fetchFollowers","firstLoad","familiarFollowersCache","results","newValue","familiarFollowers2","familiar","followingIterator","LinkOrDiv","accountLink","postingStats","setPostingStats","renderFamiliarFollowers","setFamiliarFollowers","postingStatsUIState","setPostingStatsUIState","hasPostingStats","followers","renderPostingStats","onRelationshipChange","onProfileUpdate","useCallback","newAccount","headerCornerColors","AccountBlock","stopPropagation","onError","ctx","canvas","onLoad","pixelDimension","rgbColors","OffscreenCanvas","createElement","g","imageSmoothingEnabled","drawImage","colors","getImageData","dataLength","lightenRGB","color","avatarSize","handle","clipboard","MenuLink","role","enhanceContent","verifiedAt","__html","EmojiText","follower","heading","fetchAccounts","excludeRelationshipAttrs","blankCopy","followersCount","shortenNumber","squircle","fetchFollowing","followingCount","Math","RelatedActions","FAMILIAR_FOLLOWERS_LIMIT","currentAuthenticated","sameInstance","following","showingReblogs","currentInfo","setCurrentInfo","notifying","followedBy","blocking","blockedBy","muting","mutingNotifications","requested","domainBlocking","endorsed","privateNote","setIsSelf","q","setRelationshipUIState","fetchRelationships","relationships","setRelationship","relationship2","relationship","showAddRemoveLists","setShowAddRemoveLists","showPrivateNoteModal","setLists","updateAccount","niceDateTime","showTranslatedBio","showEditProfile","setShowPrivateNoteModal","body","lists2","loading","onMenuChange","setShowTranslatedBio","notify","niceAccountURL","share","SubMenu2","newRelationship","duration","counter","setShowEditProfile","relationshipUIState","Loader","TranslatedBioSheet","EditProfileSheet","AddRemoveListsSheet","luminence","alpha","urlObj","host","state","getHTMLText","text","fieldsText","path","TranslationBlock","setListsContainingAccount","reloadCount","c","listsContainingAccount2","showListAddEditModal","setShowListAddEditModal","inList","listsContainingAccount","accountIds","result","PrivateNoteSheet","initialNote","_b","textareaRef","e2","acc","setAccount","source","fieldsAttributesRef","displayName2","note2","fieldsAttributesFields","field","fieldsAttributes","FieldsAttributesRow","hasValue","server","setHasValue","maxLength","AccountSheet","propInstance","AccountInfo","lookup","skip_webfinger","v2","search","resolve","accountURL","URL","parse","hostname","Drafts","drafts","setDrafts","db","ns","getCurrentAccountNS","ownKeys","filter","startsWith","getMany","getTime","hasDrafts","abrupt","draft","draftStatus","replyTo","updatedAtDate","replyToStatus","MiniDraft","spoilerText","mediaAttachments","hasPoll","hasMedia","firstImageMedia","image","file","objectURL","createObjectURL","hasPollOrMedia","EmbedModal","dangerouslySetInnerHTML","GenericAccounts","postID","isCurrentInstance","setAccounts","showMore","setShowMore","showGenericAccounts","staticAccounts","showReactions","relationshipsMap","setRelationshipsMap","loadRelationships","loadAccounts","done","Array","isArray","theAccount","find","j","_types","newAccounts","reloadGenericAccounts","post","Status","showStats","InView","MediaAltModal","forceTranslate","setForceTranslate","differentLanguage","localeMatch","l","supportsTTS","speak","dir","whiteSpace","textWrap","sourceLanguage","clamp","gammaToLinear","pow","linearToGamma","rgb2oklab","s","cbrt","oklab2rgb","L","round","MediaModal","statusID","carouselRef","currentIndex","setCurrentIndex","carouselFocusItem","useLayoutEffect","scrollIntoView","prevStatusID","scrollLeft","clientWidth","differentStatusID","scrollTo","behavior","showControls","setShowControls","handleSwipe","addEventListener","removeEventListener","handleScroll","passive","mediaAccentColors","media","blurhash","averageColor","getBlurHashAverageColor","labAverageColor","mediaAccentGradient","range","join","toastRef","hideToast","contains","backgroundAttachment","backgroundImage","accentColor","description","showMediaAlt","Media","showOriginal","overflow","position","menuClassName","remoteUrl","matchMedia","matches","CATEGORIES","CATEGORIES_INFO","spam","legal","violation","stampLabel","other","excludeStamp","ReportModal","split","rules","currentDomain","getCurrentInstance","selectedCategory","setSelectedCategory","showRules","setShowRules","rulesRef","hasRules","setHasRules","previewMode","useAvatarStatic","showActivity","Object","fromEntries","category","comment","forward","ruleIds","reports","accountId","statusIds","Fragment","rule","required","maxlength","rows","LZString","f","keyStrBase64","keyStrUriSafe","baseReverseDic","getBaseValue","alphabet","character","input","res","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","content","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","shortcutsViewMode","Boolean","shortcut","excludedViewMode","includes","shortcutsArr","from","temp","shortcutIndex","justifyContent","alignItems","currentTarget","ShortcutForm","mode","ImportExport","FORM_NOTES","setFollowedHashtags","currentType","form","formRef","setCurrentType","switch","autocorrect","followedHashtags","tag","compressToEncodedURIComponent","importShortcutStr","setImportShortcutStr","shortcutsStr","parsedImportShortcutStr","setImportUIState","parsed","JSON","decompressFromEncodedURIComponent","hasCurrentSettings","shortcutsImportFieldRef","importUIState","v","dt","dispatchEvent","some","nonUniqueShortcuts","menuFooter","every","exceededLimit","newShortcuts","newNote","settingsJSON2","settingsJSON","changes","prevValue","Modals","navigate","useNavigate","preload","ComposeSuspense","__COMPOSE__","editStatus","newStatus","reloadStatusPage","reply","edit","toast","prevLocation","showSettings","showAccounts","showAccount","destination","showDrafts","showMediaModal","showShortcutsSettings","showEmbedModal","showReportModal","FollowRequestButtons","requestState","setRequestState","hasRelationship","followRequests","authorize","Error","NOTIFICATION_ICONS","severed_relationships","moderation_warning","emoji_reaction","emojiText","emoji","emoji_url","staticUrl","CustomEmoji","contentText","count","reblog_reply","favourite_reply","targetAccount","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","_accounts","_statuses","actualStatus","actualStatusID","isVoted","voted","isReplyToOthers","inReplyToAccountId","favsCount","reblogsCount","showAvatar","emojiURL","shortcode","formattedCreatedAt","toLocaleString","genericAccountsHeading","handleOpenGenericAccounts","statusKey","debug","RelativeTime","format","type2","status2","TruncatedLink","onContextMenu","clientX","clientY","props","useTruncated","oldProps","newProps","accessToken","NotificationService","routeNotification","showNotificationSheet","notificationAccount","hasAccount","hash","warn","id2","setShowNotificationSheet","tagName","instanceURL","SearchForm","forwardRef","searchParams","setSearchParams","useSearchParams","searchMenuOpen","setSearchMenuOpen","setQuery","searchFieldRef","useImperativeHandle","setValue","select","blur","autocomplete","autocapitalize","spellCheck","onSearch","onFocus","onBlur","onKeyDown","focusItem","nextItem","nextElementSibling","parentElement","firstItem","prevItem","previousElementSibling","lastItem","click","queryType","SearchCommand","showSearch","setShowSearch","searchFormRef","isSearchPage","closeSearch","enableOnFormTags","Shortcuts","shortcutsColumnsMode","menuRef","hasLists","formattedShortcuts","pin","handler","closeMenu","updatesButton","instanceRef","viewScroll","groupBoosts","newValues","boostStash","serialBoosts","item","boostStashID","items","half","floor","slice","dedupeBoosts","boostedStatusIDs","filteredItems","boosterID","statusKey2","groupContext","contextIndex","contexts","t","repliedItem","self","inReplyToId","firstItemAccountID","newItems","appliedContextIndices","inReplyToIds","contextItems","aDate","bDate","it","sKey","statusReply","queueMicrotask","fallbackFetch","fetchStatus","saveStatus","ids","replyToStatuses","skipThreading","assignFollowedTags","statusFollowedTags","extractedTags","itemFollowedTags","statusWithFollowedTags","followedTags2","useScroll","scrollableRef","distanceFromStart","distanceFromEnd","scrollThresholdStart","scrollThresholdEnd","direction","distanceFromStartPx","_distanceFromStartPx","distanceFromEndPx","_distanceFromEndPx","scrollDirection","setScrollDirection","reachStart","setReachStart","reachEnd","setReachEnd","nearReachStart","setNearReachStart","nearReachEnd","setNearReachEnd","isVertical","scrollableElement","previousScrollStart","scrollTop","onScroll","scrollHeight","scrollWidth","clientHeight","scrollStart","scrollDimension","clientDimension","scrollDistance","abs","init","Event","useScrollFn","useThrottledCallback","MediaPost","onMediaClick","accountEmojis","repliesCount","reblogged","favourited","favouritesCount","bookmarked","muted","visibility","language","editedAt","filtered","card","uri","_deleted","_pinned","debugHover","filterContext","useContext","FilterContext","isFiltered","filterInfo","hasSpoiler","readingExpandMedia","filterTitleStr","titlesStr","showSpoilerMedia","NavMenu","showFollowing","bindLongPress","useLongPress","threshold","detect","cancelOnMovement","buttonRef","menuState","setMenuState","boundingBoxPadding","safeBoundingBoxPadding","mutesIterator","fetchMutes","mutes","blocksIterator","fetchBlocks","blocks","supportsLists","buttonClickTS","ControlledMenu","anchorRef","containerProps","zIndex","portal","unmountOnClose","appVersion","commitHash","__COMMIT_HASH__","confirm","scrollIntoViewOptions","block","inline","Timeline","titleComponent","emptyText","errorText","useItemID","fetchItems","checkForUpdatesInterval","headerStart","headerEnd","timelineStart","refresh","view","showFollowedTags","showReplyParent","clearWhenRefresh","setItems","showNew","setShowNew","mediaFirst","allowGrouping","loadItemsTS","firstLoad2","loadItems","useDebouncedCallback","ts","otherPosts","pinnedPosts","items2","itemsSelector","jRef","activeItem","activeItemRect","closest","getBoundingClientRect","allItems","activeItemIndex","indexOf","itemRect","topmostItem","kRef","findLast","oRef","handleLoadNewPosts","showNewPostsIndicator","dotRef","headerRef","nearReachStart2","hiddenUI","prevView","disableIdleCheck","loadOrCheckUpdates","inBackground","noPointers","__IDLE__","visible2","hasUpdate","lastHiddenTime","TimelineItem","skeleton","inView","fItems","isCarousel","aFiltered","reblog2","_pinned2","actualStatusID2","statusID2","url2","showCompact","_differentAuthor","isSpoiler","manyItems","isMiddle","isStart","isEnd","TimelineStatusCompact","itemKey","enableCommentHint","endButtonRef","render","setRender","newID","oldID","startButtonRef","statusPeekText","statusPeek","statusThreadNumber","MIN_YEAR","MIN_YEAR_MONTH","supportsInputMonth","setAttribute","_isSearchEnabled","isSearchEnabled","AccountStatuses","useParams","month","excludeReplies","excludeBoosts","tagged","accountStatusesIterator","allSearchParams","searchOffsetRef","isMediaFirstInstance","searchEnabled","setSearchEnabled","isValidMonth","_year","_month","monthIndex","after","afterStr","before","beforeStr","searchResults","value2","offset","pinnedStatuses","pinnedStatusesIds","postId","setFeaturedTags","useTitle","fetchPromise","fetchAccountPromiseRef","cachedAccount","featuredTags","filterBarRef","TimelineStart","year","month2","date","validity","valid","active","allowSwitch","offsetLeft","fetchAccountStatuses","masto2","monthFieldRef","checkValidity","minYear","maxYear","maxMonth","minMonth","yearFieldRef","Bookmarks","bookmarksIterator","fetchBookmarks","catchupUrl","FILTER_CONTEXT","RANGES","FILTER_LABELS","FILTER_SORTS","FILTER_GROUPS","FILTER_VALUES","Filtered","Groups","Boosts","Replies","Original","FILTER_CATEGORY_TEXT","SORT_BY_TEXT","density","Catchup","showTopLinks","setShowTopLinks","supportsPixelfed","fetchHome","maxCreatedAt","maxCreatedAtDate","allResults","mainloop","homeIterator","nextParams","createdAtDate","selfPost","addedResults","catchupRangeRef","catchupLastRef","handleCatchupClick","catchupID","catchup","posts","setPosts","reloadCatchups","setLastCatchupEndAt","prevCatchups","setPrevCatchups","lastCatchupEndAt","catchups","ownCatchups","trimmedCatchups","lastCatchups","restCatchups","endAt","startAt","reloadCatchupsCount","filtereds","groups","_followedTags","_e","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","order","bAccountID","aIndex","bIndex","postDensity","bDensity","aDensity","sortOrder","groupBy","prevGroup","authorsListParent","autoAnimated","isFiltered2","postsBar","postsBarType","posts2","postsBins","binByTime","lastCatchupRange","authorUsername","sortOrderIndex","groupByText","authorElement","scrollableRect","authorRect","right","showHelp","setShowHelp","hlRef","escRef","ignoreModifiers","setRange","dtf","pc","yes","setSelectedFilterCategory","setSortBy","setGroupBy","transform","imageDescription","publishedAt","filterCounts","toLowerCase","author","paddingInline","showSeparator","IntersectionPostLineItem","isFollowedTags","PostLine","isReplyTo","show","setShow","IntersectionObserver","unobserve","MEDIA_DENSITY","CARD_DENSITY","pollContent","cur","htmlContentLength","PostPeek","isThread","_thread","readingExpandSpoilers","showMedia","showPostContent","o","_c","_d","_h","_g","_j","_i","mediaURL","remoteMediaURL","MEDIA_SIZE","previewUrl","gifv","video","audio","PostStats","locale","numBins","dates","bins","Intl","minDate","binIndex","DateTimeFormat","Favourites","favouritesIterator","fetchFavourites","FILTER_CONTEXT_UNIMPLEMENTED","FILTER_CONTEXT_LABELS","home","thread","EXPIRY_DURATIONS","EXPIRY_DURATIONS_LABELS","Filters","showFiltersAddEditModal","setShowFiltersAddEditModal","filters","setFilters","keywords","expiresAt","k","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","latestItemChanged","clearFollowedTagsState","opts","payload","TAGS_LIMIT_PER_MODE","TOTAL_TAGS_LIMIT","Hashtags","mediaView","columnMode","hashtags","trim","linkParams","hashtagTitle","hashtagPostTitle","maxID","fetchHashtags","timelines","any","maxId","onlyMedia","since_id","valueContainsLatestItem","followUIState","setFollowUIState","reachLimit","featuredUIState","setFeaturedUIState","isFeaturedTag","featuredTags2","setIsFeaturedTag","finally","featuredTagID","catch","MenuHeader","newHashtag","exists","newInstance","List","listIterator","setList","showManageMembersModal","setShowManageMembersModal","list2","setDownOverflow","ListManageMembers","MEMBERS_LIMIT","members","setMembers","membersIterator","fetchMembers","member","as","RemoveAddButton","removed","setRemoved","notificationTypeKeys","fixNotifications","groupNotifications","notificationsMap","cleanNotifications","virtualType","mappedNotification","mappedAccount","n","cleanNotifications2","notificationsMap2","emptySearchParams","URLSearchParams","Mentions","stateType","setStateType","mentionsIterator","fetchMentions","types","conversationsIterator","latestConversationItem","lastStatus","fetchConversations","Notifications","notificationID","notificationAccessToken","onlyMentions","setOnlyMentions","setFollowRequests","announcements","setAnnouncements","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","statusLink","setShowNotificationsSettings","announcement","AnnouncementBlock","notificationsPolicy","onToggle","open","request","NotificationRequestModalButton","NotificationRequestButtons","notificationDay","differentDay","filterNewAccounts","filterPrivateMentions","filterNotFollowing","filterNotFollowers","allFilters","contact","contactAccount","startsAt","endsAt","published","reactions","allDay","read","publishedAtDate","publishedDateText","updatedAtText","reaction","me","fetchNotficationsByAccount","setShowModal","showModal","setNotifications","notifs","hasRequestState","Public","isLocal","publicIterator","fetchPublic","remote","prompt","SHORT_LIMIT","Search","offsetRef","statusResults","setStatusResults","accountResults","setAccountResults","hashtagResults","setHashtagResults","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","authorName","authorUrl","providerName","providerUrl","flexShrink","textAlign","Columns","components","Hashtag","Component","Home","NotificationsLink","notificationLinkRef","NotificationsMenu","NOTIFICATIONS_LIMIT","NOTIFICATIONS_DISPLAY_LIMIT","hasFollowRequests","setHasFollowRequests","statusPostRegexes","getInstanceStatusObject","regex","match","getInstanceStatusURL","HttpRoute","statusObject","statusURL","Lists","instancesListURL","PHANPY_CLIENT_NAME","CLIENT_NAME","SCOPES","registerApplication","registrationParams","client_name","redirect_uris","origin","scopes","website","method","headers","toString","json","getAuthorizationURL","registrationJSON","client_id","authorizationParams","scope","redirect_uri","authorizationURL","client_secret","PHANPY_DEFAULT_INSTANCE","DEFAULT_INSTANCE","Login","instanceURLRef","cachedInstanceURL","submit","instanceText","setInstanceText","instancesList","setInstancesList","searcher","Fuse","submitInstance","vapid_key","session","cleanInstanceText","instanceTextLooksLikeDomain","instancesSuggestions","instance2","selectedInstanceText","SUBCOMMENTS_OPEN_ALL_LIMIT","MAX_WEIGHT","cachedRepliesToggle","cachedStatusesMap","scrollPositions","resetScrollPosition","STATUSES_SELECTOR","STATUS_URL_REGEX","StatusPage","mediaParam","mediaOnlyParam","mediaIndex","mediaStatusID","mediaStatus","getStatus","showMediaOnly","heroStatus","setHeroStatus","closeLink","matchStatusPath","matchPath","handleMediaClose","delete","$carousel","$deckContainers","$deckContainer","StatusParent","linkable","restProps","StatusThread","navigation","translate","setStatuses","heroStatusRef","totalDescendants","scrollOffsets","lastInitContextTS","reloadHero","heroTimer","cachedStatuses","reallyCachedStatuses","heroFetch","pRetry","contextFetch","hasStatus","heroStatus2","_replies","_r","expandReplies","weight","descendants","missingStatuses","ancestors2","ancestors","ancestorsIsThread","nestedDescendants","__replies","ancestor","allStatuses","offsetTop","setLimit","showRefresh","setShowRefresh","interval","scrollPosition","setInterval","newScrollOffsets","newScrollTop","heroDisplayName","div","heroContentText","apiCache","postInstance","statusWeightCache","hasDescendants","heroPointer","heroInView","activeStatus","postSameInstance","activeStatusRect","activeStatusIndex","allStatusLinks","nextStatus","topmostStatusLink","prevStatus","statusLinkRect","details","reachTopPost","initialPageState","handleMediaClick","renderStatus","descendant","isHero","requestAnimationFrame","setHeroInView","setReachTopPost","isLinkable","SubComments","handleStatusLinkClick","enableTranslate","showActionsBar","prevEntry","hasParentThread","getIDs","accWeight","openAll","statusesList","spoilerButton","viewMode","prevLocationIsStatusPage","moreStatusesKeys","arr","setViewMode","button","buttons","level","diveDeep","replies2","replies3","totalComments","totalWeight","calcStatusWeight","openBefore","parentLink","detailsRef","sameCount","open2","dataset","MEDIA_VIRTUAL_LENGTH","cachedWeight","pollLength","POLL_VIRTUAL_LENGTH","cardLength","CARD_VIRTUAL_LENGTH","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","unfurledLinks","postInNotifications","$post","unfurled","keysCount","ICONS","nonIdleEvents","setIdle","debouncedSetIdle","onNonIdle","isIOS","$meta","tempColor","colorScheme","themeDarkColor","textSize","$app","$body","setIsLoggedIn","decodeURIComponent","clientID","clientSecret","allSettled","client","initPreferences","initStates","PrimaryRoutes","Routes","Route","nonRootLocation","backgroundLocation","getPrevLocation","HashRouter","App","localStorage","removeItem","sessionStorage","__CLOAK__"],"mappings":"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","x_google_ignoreList":[0,1,6,7,25]}