1 line
1.1 MiB
1 line
1.1 MiB
{"version":3,"file":"main-Gn0PSoQw.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 = 20_000; // 20 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 streamTimeout;\n let pollNotifications;\n if (isLoggedIn && visible) {\n const { masto, streaming, instance } = api();\n (async () => {\n // 1. Get the latest notification\n await checkLatestNotification(masto, instance);\n\n let hasStreaming = false;\n // 2. Start streaming\n if (streaming) {\n streamTimeout = setTimeout(() => {\n (async () => {\n try {\n hasStreaming = true;\n sub = streaming.user.notification.subscribe();\n console.log('🎏 Streaming notification', sub);\n for await (const entry of sub) {\n if (!sub) break;\n if (!visible) break;\n console.log('🔔🔔 Notification entry', entry);\n if (entry.event === 'notification') {\n console.log('🔔🔔 Notification', entry);\n saveStatus(entry.payload, instance, {\n skipThreading: true,\n });\n }\n states.notificationsShowNew = true;\n }\n console.log('💥 Streaming notification loop STOPPED');\n } catch (e) {\n hasStreaming = false;\n console.error(e);\n }\n\n if (!hasStreaming) {\n console.log('🎏 Streaming failed, fallback to polling');\n pollNotifications = setInterval(() => {\n checkLatestNotification(masto, instance, true);\n }, POLL_INTERVAL);\n }\n })();\n }, STREAMING_TIMEOUT);\n }\n })();\n }\n return () => {\n sub?.unsubscribe?.();\n sub = null;\n clearTimeout(streamTimeout);\n clearInterval(pollNotifications);\n };\n }, [visible, isLoggedIn]);\n\n // Check for updates service\n const lastCheckDate = useRef();\n const checkForUpdates = () => {\n lastCheckDate.current = Date.now();\n console.log('✨ Check app update');\n fetch('./version.json')\n .then((r) => r.json())\n .then((info) => {\n if (info) states.appVersion = info;\n })\n .catch((e) => {\n console.error(e);\n });\n };\n useInterval(checkForUpdates, visible && 1000 * 60 * 30); // 30 minutes\n usePageVisibility((visible) => {\n if (visible) {\n if (!lastCheckDate.current) {\n checkForUpdates();\n } else {\n const diff = Date.now() - lastCheckDate.current;\n if (diff > 1000 * 60 * 60) {\n // 1 hour\n checkForUpdates();\n }\n }\n }\n });\n\n // Global keyboard shortcuts \"service\"\n useHotkeys('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 root’s XY scroll positions.\n */\nlet scrollX = 0;\nlet scrollY = 0;\n/**\n * Used to sign an element as the target.\n */\nconst TGT = \"__aa_tgt\";\n/**\n * Used to sign an element as being part of a removal.\n */\nconst DEL = \"__aa_del\";\n/**\n * Used to sign an element as being \"new\". When an element is removed from the\n * dom, but may cycle back in we can sign it with new to ensure the next time\n * it is recognized we consider it new.\n */\nconst NEW = \"__aa_new\";\n/**\n * Callback for handling all mutations.\n * @param mutations - A mutation list\n */\nconst handleMutations = (mutations) => {\n const elements = getElements(mutations);\n // If elements is \"false\" that means this mutation that should be ignored.\n if (elements) {\n elements.forEach((el) => animate(el));\n }\n};\n/**\n *\n * @param entries - Elements that have been resized.\n */\nconst handleResizes = (entries) => {\n entries.forEach((entry) => {\n if (entry.target === root)\n updateAllPos();\n if (coords.has(entry.target))\n updatePos(entry.target);\n });\n};\n/**\n * Observe this elements position.\n * @param el - The element to observe the position of.\n */\nfunction observePosition(el) {\n const oldObserver = intersections.get(el);\n oldObserver === null || oldObserver === void 0 ? void 0 : oldObserver.disconnect();\n let rect = coords.get(el);\n let invocations = 0;\n const buffer = 5;\n if (!rect) {\n rect = getCoords(el);\n coords.set(el, rect);\n }\n const { offsetWidth, offsetHeight } = root;\n const rootMargins = [\n rect.top - buffer,\n offsetWidth - (rect.left + buffer + rect.width),\n offsetHeight - (rect.top + buffer + rect.height),\n rect.left - buffer,\n ];\n const rootMargin = rootMargins\n .map((px) => `${-1 * Math.floor(px)}px`)\n .join(\" \");\n const observer = new IntersectionObserver(() => {\n ++invocations > 1 && updatePos(el);\n }, {\n root,\n threshold: 1,\n rootMargin,\n });\n observer.observe(el);\n intersections.set(el, observer);\n}\n/**\n * Update the exact position of a given element.\n * @param el - An element to update the position of.\n */\nfunction updatePos(el) {\n clearTimeout(debounces.get(el));\n const optionsOrPlugin = getOptions(el);\n const delay = isPlugin(optionsOrPlugin) ? 500 : optionsOrPlugin.duration;\n debounces.set(el, setTimeout(async () => {\n const currentAnimation = animations.get(el);\n try {\n await (currentAnimation === null || currentAnimation === void 0 ? void 0 : currentAnimation.finished);\n coords.set(el, getCoords(el));\n observePosition(el);\n }\n catch {\n // ignore errors as the `.finished` promise is rejected when animations were cancelled\n }\n }, delay));\n}\n/**\n * Updates all positions that are currently being tracked.\n */\nfunction updateAllPos() {\n clearTimeout(debounces.get(root));\n debounces.set(root, setTimeout(() => {\n parents.forEach((parent) => forEach(parent, (el) => lowPriority(() => updatePos(el))));\n }, 100));\n}\n/**\n * Its possible for a quick scroll or other fast events to get past the\n * intersection observer, so occasionally we need want \"cold-poll\" for the\n * latests and greatest position. We try to do this in the most non-disruptive\n * fashion possible. First we only do this ever couple seconds, staggard by a\n * random offset.\n * @param el - Element\n */\nfunction poll(el) {\n setTimeout(() => {\n intervals.set(el, setInterval(() => lowPriority(updatePos.bind(null, el)), 2000));\n }, Math.round(2000 * Math.random()));\n}\n/**\n * Perform some operation that is non critical at some point.\n * @param callback\n */\nfunction lowPriority(callback) {\n if (typeof requestIdleCallback === \"function\") {\n requestIdleCallback(() => callback());\n }\n else {\n requestAnimationFrame(() => callback());\n }\n}\n/**\n * The mutation observer responsible for watching each root element.\n */\nlet mutations;\n/**\n * A resize observer, responsible for recalculating elements on resize.\n */\nlet resize;\n/**\n * Ensure the browser is supported.\n */\nconst supportedBrowser = typeof window !== \"undefined\" && \"ResizeObserver\" in window;\n/**\n * If this is in a browser, initialize our Web APIs\n */\nif (supportedBrowser) {\n root = document.documentElement;\n mutations = new MutationObserver(handleMutations);\n resize = new ResizeObserver(handleResizes);\n window.addEventListener(\"scroll\", () => {\n scrollY = window.scrollY;\n scrollX = window.scrollX;\n });\n resize.observe(root);\n}\n/**\n * Retrieves all the elements that may have been affected by the last mutation\n * including ones that have been removed and are no longer in the DOM.\n * @param mutations - A mutation list.\n * @returns\n */\nfunction getElements(mutations) {\n const observedNodes = mutations.reduce((nodes, mutation) => {\n return [\n ...nodes,\n ...Array.from(mutation.addedNodes),\n ...Array.from(mutation.removedNodes),\n ];\n }, []);\n // Short circuit if _only_ comment nodes are observed\n const onlyCommentNodesObserved = observedNodes.every((node) => node.nodeName === \"#comment\");\n if (onlyCommentNodesObserved)\n return false;\n return mutations.reduce((elements, mutation) => {\n // Short circuit if we find a purposefully deleted node.\n if (elements === false)\n return false;\n if (mutation.target instanceof Element) {\n target(mutation.target);\n if (!elements.has(mutation.target)) {\n elements.add(mutation.target);\n for (let i = 0; i < mutation.target.children.length; i++) {\n const child = mutation.target.children.item(i);\n if (!child)\n continue;\n if (DEL in child) {\n return false;\n }\n target(mutation.target, child);\n elements.add(child);\n }\n }\n if (mutation.removedNodes.length) {\n for (let i = 0; i < mutation.removedNodes.length; i++) {\n const child = mutation.removedNodes[i];\n if (DEL in child) {\n return false;\n }\n if (child instanceof Element) {\n elements.add(child);\n target(mutation.target, child);\n siblings.set(child, [\n mutation.previousSibling,\n mutation.nextSibling,\n ]);\n }\n }\n }\n }\n return elements;\n }, new Set());\n}\n/**\n * Assign the target to an element.\n * @param el - The root element\n * @param child\n */\nfunction target(el, child) {\n if (!child && !(TGT in el))\n Object.defineProperty(el, TGT, { value: el });\n else if (child && !(TGT in child))\n Object.defineProperty(child, TGT, { value: el });\n}\n/**\n * Determines what kind of change took place on the given element and then\n * performs the proper animation based on that.\n * @param el - The specific element to animate.\n */\nfunction animate(el) {\n var _a;\n const isMounted = el.isConnected;\n const preExisting = coords.has(el);\n if (isMounted && siblings.has(el))\n siblings.delete(el);\n if (animations.has(el)) {\n (_a = animations.get(el)) === null || _a === void 0 ? void 0 : _a.cancel();\n }\n if (NEW in el) {\n add(el);\n }\n else if (preExisting && isMounted) {\n remain(el);\n }\n else if (preExisting && !isMounted) {\n remove(el);\n }\n else {\n add(el);\n }\n}\n/**\n * Removes all non-digits from a string and casts to a number.\n * @param str - A string containing a pixel value.\n * @returns\n */\nfunction raw(str) {\n return Number(str.replace(/[^0-9.\\-]/g, \"\"));\n}\n/**\n * Get the scroll offset of elements\n * @param el - Element\n * @returns\n */\nfunction getScrollOffset(el) {\n let p = el.parentElement;\n while (p) {\n if (p.scrollLeft || p.scrollTop) {\n return { x: p.scrollLeft, y: p.scrollTop };\n }\n p = p.parentElement;\n }\n return { x: 0, y: 0 };\n}\n/**\n * Get the coordinates of elements adjusted for scroll position.\n * @param el - Element\n * @returns\n */\nfunction getCoords(el) {\n const rect = el.getBoundingClientRect();\n const { x, y } = getScrollOffset(el);\n return {\n top: rect.top + y,\n left: rect.left + x,\n width: rect.width,\n height: rect.height,\n };\n}\n/**\n * Returns the width/height that the element should be transitioned between.\n * This takes into account box-sizing.\n * @param el - Element being animated\n * @param oldCoords - Old set of Coordinates coordinates\n * @param newCoords - New set of Coordinates coordinates\n * @returns\n */\nfunction getTransitionSizes(el, oldCoords, newCoords) {\n let widthFrom = oldCoords.width;\n let heightFrom = oldCoords.height;\n let widthTo = newCoords.width;\n let heightTo = newCoords.height;\n const styles = getComputedStyle(el);\n const sizing = styles.getPropertyValue(\"box-sizing\");\n if (sizing === \"content-box\") {\n const paddingY = raw(styles.paddingTop) +\n raw(styles.paddingBottom) +\n raw(styles.borderTopWidth) +\n raw(styles.borderBottomWidth);\n const paddingX = raw(styles.paddingLeft) +\n raw(styles.paddingRight) +\n raw(styles.borderRightWidth) +\n raw(styles.borderLeftWidth);\n widthFrom -= paddingX;\n widthTo -= paddingX;\n heightFrom -= paddingY;\n heightTo -= paddingY;\n }\n return [widthFrom, widthTo, heightFrom, heightTo].map(Math.round);\n}\n/**\n * Retrieves animation options for the current element.\n * @param el - Element to retrieve options for.\n * @returns\n */\nfunction getOptions(el) {\n return TGT in el && options.has(el[TGT])\n ? options.get(el[TGT])\n : { duration: 250, easing: \"ease-in-out\" };\n}\n/**\n * Returns the target of a given animation (generally the parent).\n * @param el - An element to check for a target\n * @returns\n */\nfunction getTarget(el) {\n if (TGT in el)\n return el[TGT];\n return undefined;\n}\n/**\n * Checks if animations are enabled or disabled for a given element.\n * @param el - Any element\n * @returns\n */\nfunction isEnabled(el) {\n const target = getTarget(el);\n return target ? enabled.has(target) : false;\n}\n/**\n * Iterate over the children of a given parent.\n * @param parent - A parent element\n * @param callback - A callback\n */\nfunction forEach(parent, ...callbacks) {\n callbacks.forEach((callback) => callback(parent, options.has(parent)));\n for (let i = 0; i < parent.children.length; i++) {\n const child = parent.children.item(i);\n if (child) {\n callbacks.forEach((callback) => callback(child, options.has(child)));\n }\n }\n}\n/**\n * Always return tuple to provide consistent interface\n */\nfunction getPluginTuple(pluginReturn) {\n if (Array.isArray(pluginReturn))\n return pluginReturn;\n return [pluginReturn];\n}\n/**\n * Determine if config is plugin\n */\nfunction isPlugin(config) {\n return typeof config === \"function\";\n}\n/**\n * The element in question is remaining in the DOM.\n * @param el - Element to flip\n * @returns\n */\nfunction remain(el) {\n const oldCoords = coords.get(el);\n const newCoords = getCoords(el);\n if (!isEnabled(el))\n return coords.set(el, newCoords);\n let animation;\n if (!oldCoords)\n return;\n const pluginOrOptions = getOptions(el);\n if (typeof pluginOrOptions !== \"function\") {\n const deltaX = oldCoords.left - newCoords.left;\n const deltaY = oldCoords.top - newCoords.top;\n const [widthFrom, widthTo, heightFrom, heightTo] = getTransitionSizes(el, oldCoords, newCoords);\n const start = {\n transform: `translate(${deltaX}px, ${deltaY}px)`,\n };\n const end = {\n transform: `translate(0, 0)`,\n };\n if (widthFrom !== widthTo) {\n start.width = `${widthFrom}px`;\n end.width = `${widthTo}px`;\n }\n if (heightFrom !== heightTo) {\n start.height = `${heightFrom}px`;\n end.height = `${heightTo}px`;\n }\n animation = el.animate([start, end], {\n duration: pluginOrOptions.duration,\n easing: pluginOrOptions.easing,\n });\n }\n else {\n const [keyframes] = getPluginTuple(pluginOrOptions(el, \"remain\", oldCoords, newCoords));\n animation = new Animation(keyframes);\n animation.play();\n }\n animations.set(el, animation);\n coords.set(el, newCoords);\n animation.addEventListener(\"finish\", updatePos.bind(null, el));\n}\n/**\n * Adds the element with a transition.\n * @param el - Animates the element being added.\n */\nfunction add(el) {\n if (NEW in el)\n delete el[NEW];\n const newCoords = getCoords(el);\n coords.set(el, newCoords);\n const pluginOrOptions = getOptions(el);\n if (!isEnabled(el))\n return;\n let animation;\n if (typeof pluginOrOptions !== \"function\") {\n animation = el.animate([\n { transform: \"scale(.98)\", opacity: 0 },\n { transform: \"scale(0.98)\", opacity: 0, offset: 0.5 },\n { transform: \"scale(1)\", opacity: 1 },\n ], {\n duration: pluginOrOptions.duration * 1.5,\n easing: \"ease-in\",\n });\n }\n else {\n const [keyframes] = getPluginTuple(pluginOrOptions(el, \"add\", newCoords));\n animation = new Animation(keyframes);\n animation.play();\n }\n animations.set(el, animation);\n animation.addEventListener(\"finish\", updatePos.bind(null, el));\n}\n/**\n * Clean up after removing an element from the dom.\n * @param el - Element being removed\n * @param styles - Optional styles that should be removed from the element.\n */\nfunction cleanUp(el, styles) {\n var _a;\n el.remove();\n coords.delete(el);\n siblings.delete(el);\n animations.delete(el);\n (_a = intersections.get(el)) === null || _a === void 0 ? void 0 : _a.disconnect();\n setTimeout(() => {\n if (DEL in el)\n delete el[DEL];\n Object.defineProperty(el, NEW, { value: true, configurable: true });\n if (styles && el instanceof HTMLElement) {\n for (const style in styles) {\n el.style[style] = \"\";\n }\n }\n }, 0);\n}\n/**\n * Animates the removal of an element.\n * @param el - Element to remove\n */\nfunction remove(el) {\n var _a;\n if (!siblings.has(el) || !coords.has(el))\n return;\n const [prev, next] = siblings.get(el);\n Object.defineProperty(el, DEL, { value: true, configurable: true });\n const finalX = window.scrollX;\n const finalY = window.scrollY;\n if (next && next.parentNode && next.parentNode instanceof Element) {\n next.parentNode.insertBefore(el, next);\n }\n else if (prev && prev.parentNode) {\n prev.parentNode.appendChild(el);\n }\n else {\n (_a = getTarget(el)) === null || _a === void 0 ? void 0 : _a.appendChild(el);\n }\n if (!isEnabled(el))\n return cleanUp(el);\n const [top, left, width, height] = deletePosition(el);\n const optionsOrPlugin = getOptions(el);\n const oldCoords = coords.get(el);\n if (finalX !== scrollX || finalY !== scrollY) {\n adjustScroll(el, finalX, finalY, optionsOrPlugin);\n }\n let animation;\n let styleReset = {\n position: \"absolute\",\n top: `${top}px`,\n left: `${left}px`,\n width: `${width}px`,\n height: `${height}px`,\n margin: \"0\",\n pointerEvents: \"none\",\n transformOrigin: \"center\",\n zIndex: \"100\",\n };\n if (!isPlugin(optionsOrPlugin)) {\n Object.assign(el.style, styleReset);\n animation = el.animate([\n {\n transform: \"scale(1)\",\n opacity: 1,\n },\n {\n transform: \"scale(.98)\",\n opacity: 0,\n },\n ], { duration: optionsOrPlugin.duration, easing: \"ease-out\" });\n }\n else {\n const [keyframes, options] = getPluginTuple(optionsOrPlugin(el, \"remove\", oldCoords));\n if ((options === null || options === void 0 ? void 0 : options.styleReset) !== false) {\n styleReset = (options === null || options === void 0 ? void 0 : options.styleReset) || styleReset;\n Object.assign(el.style, styleReset);\n }\n animation = new Animation(keyframes);\n animation.play();\n }\n animations.set(el, animation);\n animation.addEventListener(\"finish\", cleanUp.bind(null, el, styleReset));\n}\n/**\n * If the element being removed is at the very bottom of the page, and the\n * the page was scrolled into a space being \"made available\" by the element\n * that was removed, the page scroll will have jumped up some amount. We need\n * to offset the jump by the amount that the page was \"automatically\" scrolled\n * up. We can do this by comparing the scroll position before and after the\n * element was removed, and then offsetting by that amount.\n *\n * @param el - The element being deleted\n * @param finalX - The final X scroll position\n * @param finalY - The final Y scroll position\n * @param optionsOrPlugin - The options or plugin\n * @returns\n */\nfunction adjustScroll(el, finalX, finalY, optionsOrPlugin) {\n const scrollDeltaX = scrollX - finalX;\n const scrollDeltaY = scrollY - finalY;\n const scrollBefore = document.documentElement.style.scrollBehavior;\n const scrollBehavior = getComputedStyle(root).scrollBehavior;\n if (scrollBehavior === \"smooth\") {\n document.documentElement.style.scrollBehavior = \"auto\";\n }\n window.scrollTo(window.scrollX + scrollDeltaX, window.scrollY + scrollDeltaY);\n if (!el.parentElement)\n return;\n const parent = el.parentElement;\n let lastHeight = parent.clientHeight;\n let lastWidth = parent.clientWidth;\n const startScroll = performance.now();\n // Here we use a manual scroll animation to keep the element using the same\n // easing and timing as the parent’s scroll animation.\n function smoothScroll() {\n requestAnimationFrame(() => {\n if (!isPlugin(optionsOrPlugin)) {\n const deltaY = lastHeight - parent.clientHeight;\n const deltaX = lastWidth - parent.clientWidth;\n if (startScroll + optionsOrPlugin.duration > performance.now()) {\n window.scrollTo({\n left: window.scrollX - deltaX,\n top: window.scrollY - deltaY,\n });\n lastHeight = parent.clientHeight;\n lastWidth = parent.clientWidth;\n smoothScroll();\n }\n else {\n document.documentElement.style.scrollBehavior = scrollBefore;\n }\n }\n });\n }\n smoothScroll();\n}\n/**\n * Determines the position of the element being removed.\n * @param el - The element being deleted\n * @returns\n */\nfunction deletePosition(el) {\n const oldCoords = coords.get(el);\n const [width, , height] = getTransitionSizes(el, oldCoords, getCoords(el));\n let offsetParent = el.parentElement;\n while (offsetParent &&\n (getComputedStyle(offsetParent).position === \"static\" ||\n offsetParent instanceof HTMLBodyElement)) {\n offsetParent = offsetParent.parentElement;\n }\n if (!offsetParent)\n offsetParent = document.body;\n const parentStyles = getComputedStyle(offsetParent);\n const parentCoords = coords.get(offsetParent) || getCoords(offsetParent);\n const top = Math.round(oldCoords.top - parentCoords.top) -\n raw(parentStyles.borderTopWidth);\n const left = Math.round(oldCoords.left - parentCoords.left) -\n raw(parentStyles.borderLeftWidth);\n return [top, left, width, height];\n}\n/**\n * A function that automatically adds animation effects to itself and its\n * immediate children. Specifically it adds effects for adding, moving, and\n * removing DOM elements.\n * @param el - A parent element to add animations to.\n * @param options - An optional object of options.\n */\nfunction autoAnimate(el, config = {}) {\n if (mutations && resize) {\n const mediaQuery = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n const isDisabledDueToReduceMotion = mediaQuery.matches &&\n !isPlugin(config) &&\n !config.disrespectUserMotionPreference;\n if (!isDisabledDueToReduceMotion) {\n enabled.add(el);\n if (getComputedStyle(el).position === \"static\") {\n Object.assign(el.style, { position: \"relative\" });\n }\n forEach(el, updatePos, poll, (element) => resize === null || resize === void 0 ? void 0 : resize.observe(element));\n if (isPlugin(config)) {\n options.set(el, config);\n }\n else {\n options.set(el, { duration: 250, easing: \"ease-in-out\", ...config });\n }\n mutations.observe(el, { childList: true });\n parents.add(el);\n }\n }\n return Object.freeze({\n parent: el,\n enable: () => {\n enabled.add(el);\n },\n disable: () => {\n enabled.delete(el);\n },\n isEnabled: () => enabled.has(el),\n });\n}\n/**\n * The vue directive.\n */\nconst vAutoAnimate = {\n mounted: (el, binding) => {\n autoAnimate(el, binding.value || {});\n },\n // ignore ssr see #96:\n getSSRProps: () => ({}),\n};\n\nexport { autoAnimate as default, getTransitionSizes, vAutoAnimate };\n","import { useRef, useState, useEffect } from 'preact/hooks';\nimport autoAnimate from '../index.mjs';\n\n/**\n * AutoAnimate hook for adding dead-simple transitions and animations to preact.\n * @param options - Auto animate options or a plugin\n * @returns\n */\nfunction useAutoAnimate(options) {\n const element = useRef(null);\n const [controller, setController] = useState();\n const setEnabled = (enabled) => {\n if (controller) {\n enabled ? controller.enable() : controller.disable();\n }\n };\n useEffect(() => {\n if (element.current instanceof HTMLElement)\n setController(autoAnimate(element.current, options || {}));\n }, []);\n return [element, setEnabled];\n}\n\nexport { useAutoAnimate };\n","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 MenuConfirm from '../components/menu-confirm';\nimport Menu2 from '../components/menu2';\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';\nimport supports from '../utils/supports';\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 &{' '}\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 && supports('@mastodon/grouped-notifications') && (\n <li>\n <label>\n <input\n type=\"checkbox\"\n checked={snapStates.settings.groupedNotificationsAlpha}\n onChange={(e) => {\n states.settings.groupedNotificationsAlpha =\n e.target.checked;\n }}\n />{' '}\n Server-side grouped notifications\n </label>\n <div class=\"sub-section insignificant\">\n <small>\n Alpha-stage feature. Potentially improved grouping window\n but basic grouping logic.\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 profile’s 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 ·{' '}\n <a\n href=\"https://www.buymeacoffee.com/cheeaun\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Donate\n </a>{' '}\n ·{' '}\n <a\n href={PRIVACY_POLICY_URL}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Privacy Policy\n </a>\n </p>\n {__BUILD_TIME__ && (\n <p>\n {WEBSITE && (\n <>\n <span class=\"insignificant\">Site:</span>{' '}\n {WEBSITE.replace(/https?:\\/\\//g, '').replace(/\\/$/, '')}\n <br />\n </>\n )}\n <span class=\"insignificant\">Version:</span>{' '}\n <input\n type=\"text\"\n class=\"version-string\"\n readOnly\n size=\"18\" // Manually calculated here\n value={`${__BUILD_TIME__.slice(0, 10).replace(/-/g, '.')}${\n __COMMIT_HASH__ ? `.${__COMMIT_HASH__}` : ''\n }`}\n onClick={(e) => {\n e.target.select();\n // Copy to clipboard\n try {\n navigator.clipboard.writeText(e.target.value);\n showToast('Version string copied');\n } catch (e) {\n console.warn(e);\n showToast('Unable to copy version string');\n }\n }}\n />{' '}\n {!__FAKE_COMMIT_HASH__ && (\n <span class=\"ib insignificant\">\n (\n <a\n href={`https://github.com/cheeaun/phanpy/commit/${__COMMIT_HASH__}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <RelativeTime datetime={new Date(__BUILD_TIME__)} />\n </a>\n )\n </span>\n )}\n </p>\n )}\n </section>\n </main>\n </div>\n );\n}\n\nfunction PushNotificationsSection({ onClose }) {\n if (!isPushSupported()) return null;\n\n const { instance } = api();\n const [uiState, setUIState] = useState('default');\n const pushFormRef = useRef();\n const [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 MenuConfirm from './menu-confirm';\nimport MenuLink from './menu-link';\nimport Menu2 from './menu2';\nimport Modal from './modal';\nimport SubMenu2 from './submenu2';\nimport TranslationBlock from './translation-block';\n\nconst MUTE_DURATIONS = [\n 60 * 5, // 5 minutes\n 60 * 30, // 30 minutes\n 60 * 60, // 1 hour\n 60 * 60 * 6, // 6 hours\n 60 * 60 * 24, // 1 day\n 60 * 60 * 24 * 3, // 3 days\n 60 * 60 * 24 * 7, // 1 week\n 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 handleWithInstance = acct.includes('@')\n ? `@${acct}`\n : `@${acct}@${instance}`;\n try {\n navigator.clipboard.writeText(handleWithInstance);\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 const acctWithInstance = acct.includes('@') ? acct : `${acct}@${instance}`;\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 || acctWithInstance}`;\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 bidi-isolate\">\n @{currentInfo?.acct || acctWithInstance}\n </span>\n </small>\n </MenuItem>\n <MenuItem href={url} target=\"_blank\">\n <Icon icon=\"external\" />\n <small class=\"menu-double-lines\">{niceAccountURL(url)}</small>\n </MenuItem>\n <div class=\"menu-horizontal\">\n <MenuItem\n onClick={() => {\n // Copy url to clipboard\n try {\n navigator.clipboard.writeText(url);\n showToast('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 dir=\"auto\"\n >\n {initialNote}\n </textarea>\n <footer>\n <button\n type=\"button\"\n class=\"light\"\n disabled={uiState === 'loading'}\n onClick={() => {\n onClose?.();\n }}\n >\n Cancel\n </button>\n <span>\n <Loader abrupt hidden={uiState !== 'loading'} />\n <button disabled={uiState === 'loading'} type=\"submit\">\n Save & close\n </button>\n </span>\n </footer>\n </form>\n </main>\n </div>\n );\n}\n\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 dir=\"auto\"\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 dir=\"auto\"\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 dir=\"auto\"\n />\n </td>\n <td>\n <input\n type=\"text\"\n name={`fields_attributes[${i}][value]`}\n defaultValue={value}\n disabled={disabled}\n maxLength={255}\n onChange={(e) => setHasValue(!!e.currentTarget.value)}\n dir=\"auto\"\n />\n </td>\n </tr>\n );\n}\n\nfunction AccountHandleInfo({ acct, instance }) {\n // acct = username or username@server\n let [username, server] = acct.split('@');\n if (!server) server = instance;\n 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…\n </button>\n </MenuConfirm>\n </div>\n <button\n type=\"button\"\n disabled={uiState === 'loading'}\n class=\"draft-item\"\n onClick={async () => {\n // console.log({ draftStatus });\n let replyToStatus;\n if (replyTo) {\n setUIState('loading');\n try {\n replyToStatus = await masto.v1.statuses\n .$select(replyTo.id)\n .fetch();\n } catch (e) {\n console.error(e);\n alert('Error fetching reply-to status!');\n setUIState('default');\n return;\n }\n setUIState('default');\n }\n window.__COMPOSE__ = {\n draftStatus,\n replyToStatus,\n };\n states.showCompose = true;\n states.showDrafts = false;\n }}\n >\n <MiniDraft draft={draft} />\n </button>\n </li>\n );\n })}\n </ul>\n {drafts.length > 1 && (\n <p>\n <MenuConfirm\n confirmLabel={<span>Delete all drafts?</span>}\n menuItemClassName=\"danger\"\n disabled={uiState === 'loading'}\n onClick={() => {\n (async () => {\n // const yes = confirm('Delete all drafts?');\n // if (yes) {\n setUIState('loading');\n try {\n await db.drafts.delMany(\n drafts.map((draft) => draft.key),\n );\n setUIState('default');\n reload();\n } catch (e) {\n console.error(e);\n alert('Error deleting drafts! Please try again.');\n setUIState('error');\n }\n // }\n })();\n }}\n >\n <button\n type=\"button\"\n class=\"light danger\"\n disabled={uiState === 'loading'}\n >\n Delete all…\n </button>\n </MenuConfirm>\n </p>\n )}\n </>\n ) : (\n <p>No drafts found.</p>\n )}\n </main>\n </div>\n );\n}\n\nfunction MiniDraft({ draft }) {\n const { draftStatus, replyTo } = draft;\n const { status, spoilerText, poll, mediaAttachments } = draftStatus;\n const hasPoll = poll?.options?.length > 0;\n const hasMedia = mediaAttachments?.length > 0;\n const hasPollOrMedia = hasPoll || hasMedia;\n const firstImageMedia = useMemo(() => {\n if (!hasMedia) return;\n const image = mediaAttachments.find((media) => /image/.test(media.type));\n if (!image) return;\n const { file } = image;\n const objectURL = URL.createObjectURL(file);\n return objectURL;\n }, [hasMedia, mediaAttachments]);\n return (\n <>\n <div class=\"mini-draft\">\n {hasPollOrMedia && (\n <div\n class={`mini-draft-aside ${firstImageMedia ? 'has-image' : ''}`}\n style={\n firstImageMedia\n ? {\n '--bg-image': `url(${firstImageMedia})`,\n }\n : {}\n }\n >\n {hasPoll && <Icon icon=\"poll\" />}\n {hasMedia && (\n <span>\n <Icon icon=\"attachment\" />{' '}\n <small>{mediaAttachments?.length}</small>\n </span>\n )}\n </div>\n )}\n <div class=\"mini-draft-main\">\n {!!spoilerText && <div class=\"mini-draft-spoiler\">{spoilerText}</div>}\n {!!status && <div class=\"mini-draft-status\">{status}</div>}\n </div>\n </div>\n </>\n );\n}\n\nexport default Drafts;\n","import './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…\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 isRTL from '../utils/is-rtl';\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 MenuLink from './menu-link';\nimport Menu2 from './menu2';\n\nconst { PHANPY_IMG_ALT_API_URL: IMG_ALT_API_URL } = import.meta.env;\n\nfunction MediaModal({\n mediaAttachments,\n statusID,\n instance,\n lang,\n index = 0,\n onClose = () => {},\n}) {\n const [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 * (isRTL() ? -1 : 1),\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(Math.abs(scrollLeft) / clientWidth);\n setCurrentIndex(index);\n };\n if (carouselRef.current) {\n carouselRef.current.addEventListener('scroll', handleScroll, {\n passive: true,\n });\n }\n return () => {\n if (carouselRef.current) {\n carouselRef.current.removeEventListener('scroll', handleScroll);\n }\n };\n }, []);\n\n useEffect(() => {\n let timer = setTimeout(() => {\n carouselRef.current?.focus?.();\n }, 100);\n return () => clearTimeout(timer);\n }, []);\n\n const 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 ${isRTL() ? 'left' : 'right'}, ${mediaAccentGradient})`,\n }\n : {}\n }\n >\n {mediaAttachments?.map((media, i) => {\n const accentColor =\n mediaAttachments.length === 1 ? mediaAccentColors[i] : null;\n return (\n <div\n class=\"carousel-item\"\n style={\n accentColor\n ? {\n '--accent-color': `rgb(${accentColor?.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:\n carouselRef.current.clientWidth * i * (isRTL() ? -1 : 1),\n behavior: 'smooth',\n });\n carouselRef.current.focus();\n }}\n >\n <Icon icon=\"round\" size=\"s\" />\n </button>\n ))}\n </span>\n ) : (\n <span />\n )}\n <span>\n <Menu2\n overflow=\"auto\"\n align=\"end\"\n position=\"anchor\"\n gap={4}\n menuClassName=\"glass-menu\"\n menuButton={\n <button type=\"button\" class=\"carousel-button\">\n <Icon icon=\"more\" alt=\"More\" />\n </button>\n }\n >\n <MenuLink\n href={\n mediaAttachments[currentIndex]?.remoteUrl ||\n mediaAttachments[currentIndex]?.url\n }\n class=\"carousel-button\"\n target=\"_blank\"\n title=\"Open original media in new window\"\n >\n <Icon icon=\"popout\" />\n <span>Open original media</span>\n </MenuLink>\n {import.meta.env.DEV && // Only dev for now\n !!states.settings.mediaAltGenerator &&\n !!IMG_ALT_API_URL &&\n !!mediaAttachments[currentIndex]?.url &&\n !mediaAttachments[currentIndex]?.description &&\n mediaAttachments[currentIndex]?.type === 'image' && (\n <>\n <MenuDivider />\n <MenuItem\n disabled={uiState === 'loading'}\n onClick={() => {\n setUIState('loading');\n toastRef.current = showToast({\n text: 'Attempting to describe image. Please wait...',\n duration: -1,\n });\n (async function () {\n try {\n const response = await fetch(\n `${IMG_ALT_API_URL}?image=${encodeURIComponent(\n mediaAttachments[currentIndex]?.url,\n )}`,\n ).then((r) => r.json());\n states.showMediaAlt = {\n alt: response.description,\n };\n } catch (e) {\n console.error(e);\n showToast('Failed to describe image');\n } finally {\n setUIState('default');\n toastRef.current?.hideToast?.();\n }\n })();\n }}\n >\n <Icon icon=\"sparkles2\" />\n <span>Describe image…</span>\n </MenuItem>\n </>\n )}\n </Menu2>{' '}\n <Link\n to={`${instance ? `/${instance}` : ''}/s/${statusID}${\n window.matchMedia('(min-width: calc(40em + 350px))').matches\n ? `?media=${currentIndex + 1}`\n : ''\n }`}\n class=\"button carousel-button media-post-link\"\n // onClick={() => {\n // // if small screen (not media query min-width 40em + 350px), run onClose\n // if (\n // !window.matchMedia('(min-width: calc(40em + 350px))').matches\n // ) {\n // onClose();\n // }\n // }}\n >\n <span class=\"button-label\">View post </span>»\n </Link>\n </span>\n </div>\n {mediaAttachments?.length > 1 && (\n <div class=\"carousel-controls\" hidden={!showControls}>\n <button\n type=\"button\"\n class=\"carousel-button\"\n hidden={currentIndex === 0}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n carouselRef.current.focus();\n carouselRef.current.scrollTo({\n left:\n carouselRef.current.clientWidth *\n (currentIndex - 1) *\n (isRTL() ? -1 : 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:\n carouselRef.current.clientWidth *\n (currentIndex + 1) *\n (isRTL() ? -1 : 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} \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 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 dir=\"auto\"\n >\n <option></option>\n {TYPES.map((type) => (\n <option value={type}>{TYPE_TEXT[type]}</option>\n ))}\n </select>\n </label>\n </p>\n {TYPE_PARAMS[currentType]?.map?.(\n ({ text, name, type, placeholder, pattern, notRequired }) => {\n if (currentType === 'list') {\n return (\n <p>\n <label>\n <span>List</span>\n <select\n name=\"id\"\n required={!notRequired}\n disabled={disabled || uiState === 'loading'}\n defaultValue={editMode ? shortcut.id : undefined}\n dir=\"auto\"\n >\n <option value=\"\"></option>\n {lists.map((list) => (\n <option value={list.id}>{list.title}</option>\n ))}\n </select>\n </label>\n </p>\n );\n }\n\n return (\n <p>\n <label>\n <span>{text}</span>{' '}\n <input\n type={type}\n switch={type === 'checkbox' || undefined}\n name={name}\n placeholder={placeholder}\n required={type === 'text' && !notRequired}\n disabled={disabled}\n list={\n currentType === 'hashtag'\n ? 'followed-hashtags-datalist'\n : null\n }\n autocorrect=\"off\"\n autocapitalize=\"off\"\n spellCheck={false}\n pattern={pattern}\n dir=\"auto\"\n />\n {currentType === 'hashtag' &&\n followedHashtags.length > 0 && (\n <datalist id=\"followed-hashtags-datalist\">\n {followedHashtags.map((tag) => (\n <option value={tag.name} />\n ))}\n </datalist>\n )}\n </label>\n </p>\n );\n },\n )}\n {!!FORM_NOTES[currentType] && (\n <p class=\"form-note insignificant\">\n <Icon icon=\"info\" />\n {FORM_NOTES[currentType]}\n </p>\n )}\n <footer>\n <button\n type=\"submit\"\n class=\"block\"\n disabled={disabled || uiState === 'loading'}\n >\n {editMode ? '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 dir=\"auto\"\n />\n {states.settings.shortcutSettingsCloudImportExport && (\n <button\n type=\"button\"\n class=\"plain2 small\"\n disabled={importUIState === 'cloud-downloading'}\n onClick={async () => {\n setImportUIState('cloud-downloading');\n const currentAccount = getCurrentAccountID();\n showToast(\n '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 don’t exist in current shortcuts will\n be appended.\n </div>\n }\n onClick={() => {\n // states.shortcuts = [\n // ...states.shortcuts,\n // ...parsedImportShortcutStr,\n // ];\n // Append non-unique shortcuts only\n const nonUniqueShortcuts = parsedImportShortcutStr.filter(\n (shortcut) =>\n !states.shortcuts.some((s) =>\n // Compare all properties\n Object.keys(s).every(\n (key) => s[key] === shortcut[key],\n ),\n ),\n );\n if (!nonUniqueShortcuts.length) {\n showToast('No new shortcuts to import');\n return;\n }\n let newShortcuts = [\n ...states.shortcuts,\n ...nonUniqueShortcuts,\n ];\n const exceededLimit = newShortcuts.length > SHORTCUTS_LIMIT;\n if (exceededLimit) {\n // If exceeded, trim it\n newShortcuts = newShortcuts.slice(0, SHORTCUTS_LIMIT);\n }\n states.shortcuts = newShortcuts;\n showToast(\n exceededLimit\n ? `Shortcuts imported. Exceeded max ${SHORTCUTS_LIMIT}, so the rest are not imported.`\n : 'Shortcuts imported',\n );\n onClose?.();\n }}\n >\n <button\n type=\"button\"\n class=\"plain2\"\n disabled={!parsedImportShortcutStr}\n >\n Import & append…\n </button>\n </MenuConfirm>{' '}\n </>\n )}\n <MenuConfirm\n confirmLabel={\n hasCurrentSettings\n ? 'Override current shortcuts?'\n : 'Import shortcuts?'\n }\n menuItemClassName={hasCurrentSettings ? 'danger' : undefined}\n onClick={() => {\n states.shortcuts = parsedImportShortcutStr;\n showToast('Shortcuts imported');\n onClose?.();\n }}\n >\n <button\n type=\"button\"\n class=\"plain2\"\n disabled={!parsedImportShortcutStr}\n >\n {hasCurrentSettings ? 'or override…' : 'Import…'}\n </button>\n </MenuConfirm>\n </p>\n </section>\n <section>\n <h3>\n <Icon icon=\"arrow-up-circle\" size=\"l\" class=\"insignificant\" />{' '}\n <span>Export</span>\n </h3>\n <p>\n <input\n style={{ width: '100%' }}\n type=\"text\"\n value={shortcutsStr}\n readOnly\n onClick={(e) => {\n if (!e.target.value) return;\n e.target.select();\n // Copy url to clipboard\n try {\n navigator.clipboard.writeText(e.target.value);\n showToast('Shortcuts copied');\n } catch (e) {\n console.error(e);\n showToast('Unable to copy shortcuts');\n }\n }}\n dir=\"auto\"\n />\n </p>\n <p>\n <button\n type=\"button\"\n class=\"plain2\"\n disabled={!shortcutsStr}\n onClick={() => {\n try {\n navigator.clipboard.writeText(shortcutsStr);\n showToast('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 const settingsJSON = JSON.stringify({\n v: '1', // version\n dt: Date.now(), // datetime stamp\n data: shortcutsStr, // shortcuts settings string\n });\n if (\n /<phanpy-shortcuts-settings>(.*)<\\/phanpy-shortcuts-settings>/.test(\n note,\n )\n ) {\n newNote = note.replace(\n /<phanpy-shortcuts-settings>(.*)<\\/phanpy-shortcuts-settings>/,\n `<phanpy-shortcuts-settings>${settingsJSON}</phanpy-shortcuts-settings>`,\n );\n } else {\n newNote = `${note}\\n\\n\\n<phanpy-shortcuts-settings>${settingsJSON}</phanpy-shortcuts-settings>`;\n }\n showToast('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 // Client-side grouped notification\n _ids,\n _accounts,\n _statuses,\n // Server-side grouped notification\n sampleAccounts,\n notificationsCount,\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 if (_accounts) {\n for (const account of _accounts) {\n if (account._types?.includes('favourite')) {\n favsCount++;\n }\n if (account._types?.includes('reblog')) {\n reblogsCount++;\n }\n }\n }\n if (!reblogsCount && favsCount) type = 'favourite';\n if (!favsCount && reblogsCount) type = 'reblog';\n }\n\n let text;\n if (type === 'poll') {\n text = contentText[isSelf ? 'poll-self' : isVoted ? 'poll-voted' : 'poll'];\n } else if (\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={_ids || 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 ) : notificationsCount > 1 ? (\n <>\n <b>\n <span title={notificationsCount}>\n {shortenNumber(notificationsCount)}\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 {!_accounts?.length && sampleAccounts?.length > 1 && (\n <p class=\"avatars-stack\">\n {sampleAccounts.map((account) => (\n <Fragment key={account.id}>\n <a\n key={account.id}\n href={account.url}\n rel=\"noopener 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=\"xxl\"\n key={account.id}\n alt={`${account.displayName} @${account.acct}`}\n squircle={account?.bot}\n />\n {/* {type === 'favourite+reblog' && (\n <div class=\"account-sub-icons\">\n {account._types.map((type) => (\n <Icon\n icon={NOTIFICATION_ICONS[type]}\n size=\"s\"\n class={`${type}-icon`}\n />\n ))}\n </div>\n )} */}\n </a>{' '}\n </Fragment>\n ))}\n {notificationsCount > sampleAccounts.length && (\n <Link\n to={\n instance ? `/${instance}/s/${status.id}` : `/s/${status.id}`\n }\n class=\"button small plain centered\"\n >\n +{notificationsCount - sampleAccounts.length}\n <Icon icon=\"chevron-right\" />\n </Link>\n )}\n </p>\n )}\n {_statuses?.length > 1 && (\n <ul class=\"notification-group-statuses\">\n {_statuses.map((status) => (\n <li key={status.id}>\n <TruncatedLink\n class={`status-link status-type-${type}`}\n to={\n instance ? `/${instance}/s/${status.id}` : `/s/${status.id}`\n }\n >\n <Status\n status={status}\n size=\"s\"\n previewMode\n allowContextMenu\n />\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 & 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 console.log('onClick', e);\n props?.onSubmit?.(e);\n }}\n >\n <Icon\n icon={icon || (type === 'link' ? 'arrow-right' : 'search')}\n class=\"more-insignificant\"\n />\n <span>{label}</span>{' '}\n </Link>\n ))}\n </div>\n </form>\n );\n});\n\nexport default SearchForm;\n","import './search-command.css';\n\nimport { memo } from 'preact/compat';\nimport { useRef, useState } from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\n\nimport SearchForm from './search-form';\n\nexport default memo(function SearchCommand({ onClose = () => {} }) {\n const [showSearch, setShowSearch] = useState(false);\n const searchFormRef = useRef(null);\n\n useHotkeys(\n ['Slash', '/'],\n (e) => {\n setShowSearch(true);\n setTimeout(() => {\n searchFormRef.current?.focus?.();\n searchFormRef.current?.select?.();\n }, 0);\n },\n {\n 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 MenuLink from './menu-link';\nimport Menu2 from './menu2';\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 •\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…\n </MenuItem>\n <MenuItem\n onClick={() => {\n states.showGenericAccounts = {\n id: 'block',\n heading: 'Blocked users',\n fetchAccounts: fetchBlocks,\n excludeRelationshipAttrs: ['blocking'],\n };\n }}\n >\n <Icon icon=\"block\" size=\"l\" />\n Blocked users…\n </MenuItem>{' '}\n </SubMenu2>\n <MenuDivider />\n <MenuItem\n onClick={() => {\n states.showAccounts = true;\n }}\n >\n <Icon icon=\"group\" size=\"l\" /> <span>Accounts…</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…</span>\n </MenuItem>\n <MenuItem\n onClick={() => {\n states.showSettings = true;\n }}\n >\n <Icon icon=\"gear\" size=\"l\" /> <span>Settings…</span>\n </MenuItem>\n </>\n ) : (\n <>\n <MenuDivider />\n <MenuItem\n onClick={() => {\n states.showSettings = true;\n }}\n >\n <Icon icon=\"gear\" size=\"l\" /> <span>Settings…</span>\n </MenuItem>\n </>\n )}\n </section>\n </ControlledMenu>\n </>\n );\n}\n\nexport default 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 isRTL from '../utils/is-rtl';\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 onClick={(e) => {\n // If click on timeline item, unhide header\n if (\n headerRef.current &&\n e.target.closest('.timeline-item, .timeline-item-alt')\n ) {\n setTimeout(() => {\n headerRef.current.hidden = false;\n }, 250);\n }\n }}\n >\n <div class=\"timeline-deck deck\">\n <header\n ref={headerRef}\n // hidden={hiddenUI}\n onClick={(e) => {\n if (!e.target.closest('a, button')) {\n scrollableRef.current?.scrollTo({\n top: 0,\n behavior: 'smooth',\n });\n }\n }}\n onDblClick={(e) => {\n if (!e.target.closest('a, button')) {\n loadItems(true);\n }\n }}\n class={uiState === 'loading' ? 'loading' : ''}\n >\n <div class=\"header-grid\">\n <div class=\"header-side\">\n <NavMenu />\n {headerStart !== null && headerStart !== undefined ? (\n headerStart\n ) : (\n <Link to=\"/\" class=\"button plain home-button\">\n <Icon icon=\"home\" size=\"l\" />\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…\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 let 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 const filteredItemsIDs = new Set();\n // Here, we don't hide filtered posts, but we sort them last\n fItems.sort((a, b) => {\n // if (a._filtered && !b._filtered) {\n // return 1;\n // }\n // if (!a._filtered && b._filtered) {\n // return -1;\n // }\n const aFiltered = isFiltered(a.filtered, filterContext);\n const bFiltered = isFiltered(b.filtered, filterContext);\n if (aFiltered) filteredItemsIDs.add(a.id);\n if (bFiltered) filteredItemsIDs.add(b.id);\n if (aFiltered && !bFiltered) {\n return 1;\n }\n if (!aFiltered && bFiltered) {\n return -1;\n }\n return 0;\n });\n\n if (filteredItemsIDs.size >= 2) {\n const GROUP_SIZE = 5;\n // If 2 or more, group filtered items into one, limit to GROUP_SIZE in a group\n const unfiltered = [];\n const filtered = [];\n fItems.forEach((item) => {\n if (filteredItemsIDs.has(item.id)) {\n filtered.push(item);\n } else {\n unfiltered.push(item);\n }\n });\n const filteredItems = [];\n for (let i = 0; i < filtered.length; i += GROUP_SIZE) {\n filteredItems.push({\n _grouped: true,\n posts: filtered.slice(i, i + GROUP_SIZE),\n });\n }\n fItems = unfiltered.concat(filteredItems);\n }\n\n return (\n <li key={`timeline-${statusID}`} class=\"timeline-item-carousel\">\n <StatusCarousel title={title} class={`${type}-carousel`}>\n {fItems.map((item) => {\n const { id: statusID, reblog, _pinned, _grouped } = item;\n if (_grouped) {\n return (\n <li key={statusID} class=\"timeline-item-carousel-group\">\n {item.posts.map((item) => {\n const { id: statusID, reblog, _pinned } = item;\n const actualStatusID = reblog?.id || statusID;\n const url = instance\n ? `/${instance}/s/${actualStatusID}`\n : `/s/${actualStatusID}`;\n if (_pinned) useItemID = false;\n return (\n <Link\n class=\"status-carousel-link timeline-item-alt\"\n to={url}\n >\n {useItemID ? (\n <Status\n statusID={statusID}\n instance={instance}\n size=\"s\"\n />\n ) : (\n <Status\n status={item}\n instance={instance}\n size=\"s\"\n />\n )}\n </Link>\n );\n })}\n </li>\n );\n }\n\n const actualStatusID = reblog?.id || statusID;\n const url = instance\n ? `/${instance}/s/${actualStatusID}`\n : `/s/${actualStatusID}`;\n if (_pinned) useItemID = false;\n return (\n <li key={statusID}>\n <Link\n class=\"status-carousel-link timeline-item-alt\"\n to={url}\n >\n {useItemID ? (\n <Status\n statusID={statusID}\n instance={instance}\n size=\"s\"\n contentTextWeight\n enableCommentHint\n // allowFilters={allowFilters}\n mediaFirst={mediaFirst}\n />\n ) : (\n <Status\n status={item}\n instance={instance}\n size=\"s\"\n contentTextWeight\n enableCommentHint\n // allowFilters={allowFilters}\n mediaFirst={mediaFirst}\n />\n )}\n </Link>\n </li>\n );\n })}\n </StatusCarousel>\n </li>\n );\n }\n const manyItems = fItems.length > 3;\n return fItems.map((item, i) => {\n const { id: statusID, _differentAuthor } = item;\n const url = instance ? `/${instance}/s/${statusID}` : `/s/${statusID}`;\n const isMiddle = i > 0 && i < fItems.length - 1;\n const isSpoiler = item.sensitive && !!item.spoilerText;\n const showCompact =\n (!_differentAuthor && isSpoiler && i > 0) ||\n (manyItems &&\n isMiddle &&\n (type === 'thread' ||\n (type === 'conversation' &&\n !_differentAuthor &&\n !fItems[i - 1]._differentAuthor &&\n !fItems[i + 1]._differentAuthor)));\n const isStart = i === 0;\n const isEnd = i === fItems.length - 1;\n return (\n <li\n key={`timeline-${statusID}`}\n class={`timeline-item-container timeline-item-container-type-${type} timeline-item-container-${\n isStart ? 'start' : isEnd ? 'end' : 'middle'\n } ${_differentAuthor ? 'timeline-item-diff-author' : ''}`}\n >\n <Link class=\"status-link timeline-item\" to={url}>\n {showCompact ? (\n <TimelineStatusCompact\n status={item}\n instance={instance}\n filterContext={filterContext}\n />\n ) : useItemID ? (\n <Status\n statusID={statusID}\n instance={instance}\n enableCommentHint={isEnd}\n showFollowedTags={showFollowedTags}\n // allowFilters={allowFilters}\n />\n ) : (\n <Status\n status={item}\n instance={instance}\n enableCommentHint={isEnd}\n showFollowedTags={showFollowedTags}\n // allowFilters={allowFilters}\n />\n )}\n </Link>\n </li>\n );\n });\n }\n\n const itemKey = `timeline-${statusID + _pinned}`;\n\n if (view === 'media') {\n return useItemID ? (\n <MediaPost\n class=\"timeline-item\"\n parent=\"li\"\n key={itemKey}\n statusID={statusID}\n instance={instance}\n // allowFilters={allowFilters}\n />\n ) : (\n <MediaPost\n class=\"timeline-item\"\n parent=\"li\"\n key={itemKey}\n status={status}\n instance={instance}\n // allowFilters={allowFilters}\n />\n );\n }\n\n return (\n <li key={itemKey}>\n <Link class=\"status-link timeline-item\" to={url}>\n {useItemID ? (\n <Status\n statusID={statusID}\n instance={instance}\n enableCommentHint\n showFollowedTags={showFollowedTags}\n showReplyParent={showReplyParent}\n // allowFilters={allowFilters}\n mediaFirst={mediaFirst}\n />\n ) : (\n <Status\n status={status}\n instance={instance}\n enableCommentHint\n showFollowedTags={showFollowedTags}\n showReplyParent={showReplyParent}\n // allowFilters={allowFilters}\n mediaFirst={mediaFirst}\n />\n )}\n </Link>\n </li>\n );\n },\n (oldProps, newProps) => {\n const oldID = (oldProps.status?.id || '').toString();\n const newID = (newProps.status?.id || '').toString();\n return (\n oldID === newID &&\n oldProps.instance === newProps.instance &&\n oldProps.view === newProps.view\n );\n },\n);\n\nfunction StatusCarousel({ title, class: className, children }) {\n const carouselRef = useRef();\n // const { reachStart, reachEnd, init } = useScroll({\n // scrollableRef: carouselRef,\n // direction: 'horizontal',\n // });\n const startButtonRef = useRef();\n const endButtonRef = useRef();\n // useScrollFn(\n // {\n // scrollableRef: carouselRef,\n // direction: 'horizontal',\n // init: true,\n // },\n // ({ reachStart, reachEnd }) => {\n // if (startButtonRef.current) startButtonRef.current.disabled = reachStart;\n // if (endButtonRef.current) endButtonRef.current.disabled = reachEnd;\n // },\n // [],\n // );\n // useEffect(() => {\n // init?.();\n // }, []);\n\n const [render, setRender] = useState(false);\n useEffect(() => {\n setTimeout(() => {\n setRender(true);\n }, 1);\n }, []);\n\n return (\n <div class={`status-carousel ${className}`}>\n <header>\n <h3>{title}</h3>\n <span>\n <button\n ref={startButtonRef}\n type=\"button\"\n class=\"small plain2\"\n // disabled={reachStart}\n onClick={() => {\n const left =\n Math.min(320, carouselRef.current?.offsetWidth) *\n (isRTL() ? 1 : -1);\n carouselRef.current?.scrollBy({\n left,\n behavior: 'smooth',\n });\n }}\n >\n <Icon icon=\"chevron-left\" />\n </button>{' '}\n <button\n ref={endButtonRef}\n type=\"button\"\n class=\"small plain2\"\n // disabled={reachEnd}\n onClick={() => {\n const left =\n Math.min(320, carouselRef.current?.offsetWidth) *\n (isRTL() ? -1 : 1);\n carouselRef.current?.scrollBy({\n left,\n behavior: 'smooth',\n });\n }}\n >\n <Icon icon=\"chevron-right\" />\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, { 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 && <>· </>}\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 if (label === 'Boosts') {\n setSortBy('reblogsCount');\n setGroupBy(null);\n }\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 dir=\"auto\"\n />\n <div class=\"filter-keyword-actions\">\n <label>\n <input\n name=\"keyword_attributes[][whole_word]\"\n type=\"checkbox\"\n value={id} // Hacky way to map checkbox boolean to the keyword id\n defaultChecked={wholeWord}\n disabled={uiState === 'loading'}\n />{' '}\n 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, { 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 MenuConfirm from '../components/menu-confirm';\nimport Menu2 from '../components/menu2';\nimport { SHORTCUTS_LIMIT } from '../components/shortcuts-settings';\nimport Timeline from '../components/timeline';\nimport { api } from '../utils/api';\nimport { filteredItems } from '../utils/filters';\nimport showToast from '../utils/show-toast';\nimport states, { saveStatus } from '../utils/states';\nimport { isMediaFirstInstance } from '../utils/store-utils';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 20;\n\n// Limit is 4 per \"mode\"\n// https://github.com/mastodon/mastodon/issues/15194\n// Hard-coded https://github.com/mastodon/mastodon/blob/19614ba2477f3d12468f5ec251ce1cc5f8c6210c/app/models/tag_feed.rb#L4\nconst TAGS_LIMIT_PER_MODE = 4;\nconst TOTAL_TAGS_LIMIT = TAGS_LIMIT_PER_MODE + 1;\n\nfunction Hashtags({ media: mediaView, columnMode, ...props }) {\n // const 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 dir=\"auto\">{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 dir=\"auto\"\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 class=\"bidi-isolate\">\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 MenuConfirm from '../components/menu-confirm';\nimport MenuLink from '../components/menu-link';\nimport Menu2 from '../components/menu2';\nimport Modal from '../components/modal';\nimport Timeline from '../components/timeline';\nimport { api } from '../utils/api';\nimport { filteredItems } from '../utils/filters';\nimport { getList, getLists } from '../utils/lists';\nimport states, { saveStatus } from '../utils/states';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 20;\n\nfunction List(props) {\n const 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…\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\nexport function massageNotifications2(notifications) {\n if (notifications?.notificationGroups) {\n const {\n accounts = [],\n notificationGroups = [],\n statuses = [],\n } = notifications;\n return notificationGroups.map((group) => {\n const { sampleAccountIds, statusId } = group;\n const sampleAccounts =\n sampleAccountIds?.map((id) => accounts.find((a) => a.id === id)) || [];\n const status = statuses?.find((s) => s.id === statusId) || null;\n return {\n ...group,\n sampleAccounts,\n status,\n };\n });\n }\n return notifications;\n}\n\nexport function groupNotifications2(groupNotifications) {\n // Make grouped notifications to look like faux grouped notifications\n const newGroupNotifications = groupNotifications.map((gn) => {\n const {\n latestPageNotificationAt,\n mostRecentNotificationId,\n sampleAccounts,\n notificationsCount,\n } = gn;\n\n return {\n id: '' + mostRecentNotificationId,\n createdAt: latestPageNotificationAt,\n account: sampleAccounts[0],\n ...gn,\n };\n });\n\n // DISABLED FOR NOW.\n // Merge favourited and reblogged of same status into a single notification\n // - new type: \"favourite+reblog\"\n // - sum numbers for `notificationsCount` and `sampleAccounts`\n // const mappedNotifications = {};\n // const newNewGroupNotifications = [];\n // for (let i = 0; i < newGroupNotifications.length; i++) {\n // const gn = newGroupNotifications[i];\n // const { type, status, createdAt, notificationsCount, sampleAccounts } = gn;\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 = mappedNotifications[key];\n // if (mappedNotification) {\n // const accountIDs = mappedNotification.sampleAccounts.map((a) => a.id);\n // sampleAccounts.forEach((a) => {\n // if (!accountIDs.includes(a.id)) {\n // mappedNotification.sampleAccounts.push(a);\n // }\n // });\n // mappedNotification.notificationsCount = Math.max(\n // mappedNotification.notificationsCount,\n // notificationsCount,\n // mappedNotification.sampleAccounts.length,\n // );\n // } else {\n // mappedNotifications[key] = {\n // ...gn,\n // type: virtualType,\n // };\n // newNewGroupNotifications.push(mappedNotifications[key]);\n // }\n // }\n\n // 2nd pass.\n // - Group 1 account favourte/reblog multiple posts\n // - _statuses: [status, status, ...]\n const notificationsMap2 = {};\n const newGroupNotifications2 = [];\n for (let i = 0; i < newGroupNotifications.length; i++) {\n const gn = newGroupNotifications[i];\n const { type, account, _accounts, sampleAccounts, createdAt } = gn;\n const date = createdAt ? new Date(createdAt).toLocaleDateString() : '';\n const hasOneAccount =\n sampleAccounts?.length === 1 || _accounts?.length === 1;\n if ((type === 'favourite' || type === 'reblog') && hasOneAccount) {\n const key = `${account?.id}-${type}-${date}`;\n const mappedNotification = notificationsMap2[key];\n if (mappedNotification) {\n mappedNotification._statuses.push(gn.status);\n mappedNotification._ids += `-${gn.id}`;\n } else {\n let n = (notificationsMap2[key] = {\n ...gn,\n type,\n _ids: gn.id,\n _statuses: [gn.status],\n });\n newGroupNotifications2.push(n);\n }\n } else {\n newGroupNotifications2.push(gn);\n }\n }\n\n return newGroupNotifications2;\n}\n\nexport default function groupNotifications(notifications) {\n // Filter out invalid notifications\n notifications = fixNotifications(notifications);\n\n // Create new flat list of notifications\n // Combine sibling notifications based on type and status id\n // Concat all notification.account into an array of _accounts\n const notificationsMap = {};\n const cleanNotifications = [];\n for (let i = 0, j = 0; i < notifications.length; i++) {\n const notification = notifications[i];\n const { id, status, account, type, createdAt } = notification;\n const date = createdAt ? new Date(createdAt).toLocaleDateString() : '';\n let virtualType = type;\n if (type === 'favourite' || type === 'reblog') {\n virtualType = 'favourite+reblog';\n }\n const key = `${status?.id}-${virtualType}-${date}`;\n const mappedNotification = notificationsMap[key];\n if (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._ids += `-${id}`;\n } else {\n account._types = [type];\n mappedNotification._accounts.push(account);\n mappedNotification._ids += `-${id}`;\n }\n } else {\n if (account) account._types = [type];\n let n = (notificationsMap[key] = {\n ...notification,\n type: virtualType,\n _ids: id,\n _accounts: account ? [account] : [],\n });\n cleanNotifications[j++] = n;\n }\n }\n\n // 2nd pass to group \"favourite+reblog\"-type notifications by account if _accounts.length <= 1\n // This means one acount has favourited and reblogged the multiple statuses\n // The grouped notification\n // - type: \"favourite+reblog+account\"\n // - _statuses: [status, status, ...]\n const notificationsMap2 = {};\n const cleanNotifications2 = [];\n for (let i = 0, j = 0; i < cleanNotifications.length; i++) {\n const notification = cleanNotifications[i];\n const { id, account, _accounts, type, createdAt } = notification;\n const date = createdAt ? new Date(createdAt).toLocaleDateString() : '';\n if (type === 'favourite+reblog' && account && _accounts.length === 1) {\n const key = `${account?.id}-${type}-${date}`;\n const mappedNotification = notificationsMap2[key];\n if (mappedNotification) {\n mappedNotification._statuses.push(notification.status);\n mappedNotification._ids += `-${id}`;\n } else {\n let n = (notificationsMap2[key] = {\n ...notification,\n type,\n _ids: id,\n _statuses: [notification.status],\n });\n cleanNotifications2[j++] = n;\n }\n } else {\n cleanNotifications2[j++] = notification;\n }\n }\n\n console.log({ notifications, cleanNotifications, cleanNotifications2 });\n\n // return cleanNotifications;\n return cleanNotifications2;\n}\n","import { 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, {\n groupNotifications2,\n massageNotifications2,\n} from '../utils/group-notifications';\nimport handleContentLinks from '../utils/handle-content-links';\nimport mem from '../utils/mem';\nimport niceDateTime from '../utils/nice-date-time';\nimport { getRegistration } from '../utils/push-notifications';\nimport shortenNumber from '../utils/shorten-number';\nimport showToast from '../utils/show-toast';\nimport states, { saveStatus } from '../utils/states';\nimport { getCurrentInstance } from '../utils/store-utils';\nimport supports from '../utils/supports';\nimport usePageVisibility from '../utils/usePageVisibility';\nimport useScroll from '../utils/useScroll';\nimport useTitle from '../utils/useTitle';\n\nconst NOTIFICATIONS_LIMIT = 80;\nconst NOTIFICATIONS_GROUPED_LIMIT = 20;\nconst emptySearchParams = new URLSearchParams();\n\nconst scrollIntoViewOptions = {\n block: 'center',\n inline: 'center',\n behavior: 'smooth',\n};\n\nconst memSupportsGroupedNotifications = mem(\n () => supports('@mastodon/grouped-notifications'),\n {\n maxAge: 1000 * 60 * 5, // 5 minutes\n },\n);\n\nexport function mastoFetchNotifications(opts = {}) {\n const { masto } = api();\n if (\n states.settings.groupedNotificationsAlpha &&\n memSupportsGroupedNotifications()\n ) {\n // https://github.com/mastodon/mastodon/pull/29889\n return masto.v2_alpha.notifications.list({\n limit: NOTIFICATIONS_GROUPED_LIMIT,\n ...opts,\n });\n } else {\n return masto.v1.notifications.list({\n limit: NOTIFICATIONS_LIMIT,\n ...opts,\n });\n }\n}\n\nexport function getGroupedNotifications(notifications) {\n if (\n states.settings.groupedNotificationsAlpha &&\n memSupportsGroupedNotifications()\n ) {\n return groupNotifications2(notifications);\n } else {\n return groupNotifications(notifications);\n }\n}\n\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 = mastoFetchNotifications({\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 = massageNotifications2(allNotifications.value);\n\n if (notifications?.length) {\n notifications.forEach((notification) => {\n saveStatus(notification.status, instance, {\n skipThreading: true,\n });\n });\n\n // TEST: Slot in a fake notification to test 'severed_relationships'\n // notifications.unshift({\n // id: '123123',\n // type: 'severed_relationships',\n // createdAt: '2024-03-22T19:20:08.316Z',\n // event: {\n // type: 'account_suspension',\n // targetName: 'mastodon.dev',\n // followersCount: 0,\n // followingCount: 0,\n // },\n // });\n\n // TEST: Slot in a fake notification to test 'moderation_warning'\n // notifications.unshift({\n // id: '123123',\n // type: 'moderation_warning',\n // createdAt: new Date().toISOString(),\n // moderation_warning: {\n // id: '1231234',\n // action: 'mark_statuses_as_sensitive',\n // },\n // });\n\n // console.log({ notifications });\n\n const groupedNotifications = getGroupedNotifications(notifications);\n\n if (firstLoad) {\n states.notificationsLast = groupedNotifications[0];\n states.notifications = groupedNotifications;\n\n // Update last read marker\n masto.v1.markers\n .create({\n notifications: {\n lastReadId: groupedNotifications[0].id,\n },\n })\n .catch(() => {});\n } else {\n states.notifications.push(...groupedNotifications);\n }\n }\n\n states.notificationsShowNew = false;\n states.notificationsLastFetchTime = Date.now();\n return allNotifications;\n }\n\n async function fetchFollowRequests() {\n // Note: no pagination here yet because this better be on a separate page. Should be rare use-case???\n try {\n return await masto.v1.followRequests.list({\n limit: 80,\n });\n } catch (e) {\n // Silently fail\n return [];\n }\n }\n\n const loadFollowRequests = () => {\n setUIState('loading');\n (async () => {\n try {\n const requests = await fetchFollowRequests();\n setFollowRequests(requests);\n setUIState('default');\n } catch (e) {\n setUIState('error');\n }\n })();\n };\n\n async function fetchAnnouncements() {\n try {\n return await masto.v1.announcements.list();\n } catch (e) {\n // Silently fail\n return [];\n }\n }\n\n const supportsFilteredNotifications = supports(\n '@mastodon/filtered-notifications',\n );\n const [showNotificationsSettings, setShowNotificationsSettings] =\n useState(false);\n const [notificationsPolicy, setNotificationsPolicy] = useState({});\n function fetchNotificationsPolicy() {\n return masto.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.\" : <>…</>}\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._ids || notification.id}>\n {differentDay && <h2 class=\"timeline-header\">{heading}</h2>}\n <Notification\n instance={instance}\n notification={notification}\n key={notification._ids || notification.id}\n />\n </Fragment>\n );\n })}\n </>\n ) : (\n <>\n {uiState === 'loading' && (\n <>\n <ul class=\"timeline flat\">\n {Array.from({ length: 5 }).map((_, i) => (\n <li class=\"notification skeleton\">\n <div class=\"notification-type\">\n <Icon icon=\"notification\" size=\"xl\" />\n </div>\n <div class=\"notification-content\">\n <p>███████████ ████</p>\n </div>\n </li>\n ))}\n </ul>\n </>\n )}\n {uiState === 'error' && (\n <p class=\"ui-state\">\n Unable to load notifications\n <br />\n <br />\n <button type=\"button\" onClick={() => loadNotifications(true)}>\n Try again\n </button>\n </p>\n )}\n </>\n )}\n {showMore && (\n <InView\n onChange={(inView) => {\n if (inView) {\n loadNotifications();\n }\n }}\n >\n <button\n type=\"button\"\n class=\"plain block\"\n disabled={uiState === 'loading'}\n onClick={() => loadNotifications()}\n style={{ marginBlockEnd: '6em' }}\n >\n {uiState === 'loading' ? (\n <Loader abrupt />\n ) : (\n <>Show more…</>\n )}\n </button>\n </InView>\n )}\n </div>\n {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 •{' '}\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, { 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…\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, { 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 dir=\"auto\">\n <span class=\"more-insignificant\">#</span>\n {name}\n </span>\n <span class=\"filter-count\">{shortenNumber(total)}</span>\n </Link>\n );\n })}\n </div>\n )}\n {!!links.length && (\n <div class=\"links-bar\">\n <header>\n <h3>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 && <>· </>}\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 { massageNotifications2 } from '../utils/group-notifications';\nimport states, { saveStatus } from '../utils/states';\nimport { getCurrentAccountNS } from '../utils/store-utils';\n\nimport Following from './following';\nimport {\n getGroupedNotifications,\n mastoFetchNotifications,\n} from './notifications';\n\nfunction Home() {\n const 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_DISPLAY_LIMIT = 5;\nfunction NotificationsMenu({ anchorRef, state, onClose }) {\n const { masto, instance } = api();\n const snapStates = useSnapshot(states);\n const [uiState, setUIState] = useState('default');\n\n const notificationsIterator = mastoFetchNotifications();\n\n async function fetchNotifications() {\n const allNotifications = await notificationsIterator.next();\n const notifications = massageNotifications2(allNotifications.value);\n\n if (notifications?.length) {\n notifications.forEach((notification) => {\n saveStatus(notification.status, instance, {\n skipThreading: true,\n });\n });\n\n const groupedNotifications = getGroupedNotifications(notifications);\n\n states.notificationsLast = groupedNotifications[0];\n states.notifications = groupedNotifications;\n\n // Update last read marker\n masto.v1.markers\n .create({\n notifications: {\n lastReadId: groupedNotifications[0].id,\n },\n })\n .catch(() => {});\n }\n\n states.notificationsShowNew = false;\n states.notificationsLastFetchTime = Date.now();\n return allNotifications;\n }\n\n const [hasFollowRequests, setHasFollowRequests] = useState(false);\n function fetchFollowRequests() {\n return masto.v1.followRequests.list({\n limit: 1,\n });\n }\n\n function loadNotifications() {\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 const menuRef = useRef();\n\n return (\n <ControlledMenu\n ref={menuRef}\n menuClassName=\"notifications-menu\"\n state={state}\n anchorRef={anchorRef}\n onClose={onClose}\n portal={{\n target: document.body,\n }}\n containerProps={{\n onClick: () => {\n menuRef.current?.closeMenu?.();\n },\n }}\n overflow=\"auto\"\n viewScroll=\"close\"\n position=\"anchor\"\n align=\"center\"\n boundingBoxPadding=\"8 8 8 8\"\n >\n <header>\n <h2>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._ids || notification.id}\n instance={instance}\n notification={notification}\n disableContextMenu\n />\n ))}\n </>\n ) : uiState === 'loading' ? (\n <div class=\"ui-state\">\n <Loader abrupt />\n </div>\n ) : (\n uiState === 'error' && (\n <div class=\"ui-state\">\n <p>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 if (id) {\n const { masto } = api({ instance });\n const status = await masto.v1.statuses.$select(id).fetch();\n if (status) {\n window.location.hash = statusURL + '?view=full';\n return;\n }\n }\n } catch (e) {}\n\n // Fallback to search\n {\n const { masto: currentMasto, instance: currentInstance } = api();\n const result = await currentMasto.v2.search.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 dir=\"auto\"\n />\n {instancesSuggestions?.length > 0 ? (\n <ul id=\"instances-suggestions\">\n {instancesSuggestions.map((instance, i) => (\n <li>\n <button\n type=\"button\"\n class=\"plain5\"\n onClick={() => {\n submitInstance(instance);\n }}\n >\n {instance}\n </button>\n </li>\n ))}\n </ul>\n ) : (\n <div id=\"instances-eg\">e.g. “mastodon.social”</div>\n )}\n {/* <datalist id=\"instances-list\">\n {instancesList.map((instance) => (\n <option value={instance} />\n ))}\n </datalist> */}\n </label>\n {uiState === 'error' && (\n <p class=\"error\">\n Failed to log in. Please try again or another instance.\n </p>\n )}\n <div>\n <button\n disabled={\n uiState === 'loading' || !instanceText || !selectedInstanceText\n }\n >\n {selectedInstanceText\n ? `Continue with ${selectedInstanceText}`\n : 'Continue'}\n </button>{' '}\n </div>\n <Loader hidden={uiState !== 'loading'} />\n <hr />\n {!DEFAULT_INSTANCE && (\n <p>\n <a href=\"https://joinmastodon.org/servers\" target=\"_blank\">\n Don't have an account? Create one!\n </a>\n </p>\n )}\n <p>\n <Link to=\"/\">Go home</Link>\n </p>\n </form>\n </main>\n );\n}\n\nexport default Login;\n","import './status.css';\n\nimport { Menu, MenuDivider, MenuHeader, MenuItem } from '@szhsin/react-menu';\nimport debounce from 'just-debounce-it';\nimport pRetry from 'p-retry';\nimport { memo } from 'preact/compat';\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'preact/hooks';\nimport 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 •{' '}\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…{' '}\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 // NOTE: this scrollLeft works for RTL too\n // Browsers do the magic for us\n e.target.dataset.scrollLeft = e.target.scrollLeft;\n }\n detailsRef.current?.addEventListener('scroll', handleScroll, {\n passive: true,\n });\n return () => {\n detailsRef.current?.removeEventListener('scroll', handleScroll);\n };\n }, []);\n\n 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 ·{' '}\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 »\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';\n\nimport 'swiped-events';\n\nimport { subscribe } from 'valtio';\n\nimport BackgroundService from './components/background-service';\nimport ComposeButton from './components/compose-button';\nimport { ICONS } from './components/ICONS';\nimport KeyboardShortcutsHelp from './components/keyboard-shortcuts-help';\nimport Loader from './components/loader';\nimport Modals from './components/modals';\nimport NotificationService from './components/notification-service';\nimport SearchCommand from './components/search-command';\nimport Shortcuts from './components/shortcuts';\nimport NotFound from './pages/404';\nimport AccountStatuses from './pages/account-statuses';\nimport 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';\n\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 if (typeof ICONS[icon] === 'object') {\n ICONS[icon].module?.();\n } else {\n ICONS[icon]?.();\n }\n }, 1);\n }\n}, 5000);\n\n(() => {\n window.__IDLE__ = true;\n const nonIdleEvents = [\n 'mousemove',\n 'mousedown',\n 'resize',\n 'keydown',\n 'touchstart',\n 'pointerdown',\n 'pointermove',\n 'wheel',\n ];\n const setIdle = () => {\n window.__IDLE__ = true;\n };\n const IDLE_TIME = 3_000; // 3 seconds\n const debouncedSetIdle = debounce(setIdle, IDLE_TIME);\n const onNonIdle = () => {\n window.__IDLE__ = false;\n debouncedSetIdle();\n };\n nonIdleEvents.forEach((event) => {\n window.addEventListener(event, onNonIdle, {\n passive: true,\n capture: true,\n });\n });\n window.addEventListener('blur', setIdle, {\n passive: true,\n });\n // When cursor leaves the window, set idle\n document.documentElement.addEventListener(\n 'mouseleave',\n (e) => {\n if (!e.relatedTarget && !e.toElement) {\n setIdle();\n }\n },\n {\n passive: true,\n },\n );\n // document.addEventListener(\n // 'visibilitychange',\n // () => {\n // if (document.visibilityState === 'visible') {\n // onNonIdle();\n // }\n // },\n // {\n // passive: true,\n // },\n // );\n})();\n\n// Possible fix for iOS PWA theme-color bug\n// It changes when loading web pages in \"webview\"\nconst isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent);\nif (isIOS) {\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'visible') {\n 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';\nimport './cloak-mode.css';\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","streamTimeout","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","supports","groupedNotificationsAlpha","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","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","handleWithInstance","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","acctWithInstance","setIsSelf","q","setRelationshipUIState","fetchRelationships","relationships","setRelationship","relationship2","relationship","showAddRemoveLists","setShowAddRemoveLists","showPrivateNoteModal","setLists","updateAccount","niceDateTime","showTranslatedBio","showEditProfile","setShowPrivateNoteModal","body","lists2","loading","onMenuChange","setShowTranslatedBio","notify","handle","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","source","fieldsAttributesRef","displayName2","note2","fieldsAttributesFields","setAccount","field","fieldsAttributes","FieldsAttributesRow","hasValue","setHasValue","AccountHandleInfo","server","dir","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","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","isRTL","behavior","showControls","setShowControls","handleSwipe","addEventListener","removeEventListener","handleScroll","abs","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","followedHashtags","autocorrect","autocapitalize","tag","compressToEncodedURIComponent","importShortcutStr","setImportShortcutStr","shortcutsStr","parsedImportShortcutStr","setImportUIState","parsed","JSON","decompressFromEncodedURIComponent","hasCurrentSettings","shortcutsImportFieldRef","v","dt","dispatchEvent","some","importUIState","nonUniqueShortcuts","menuFooter","every","exceededLimit","newShortcuts","settingsJSON","newNote","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","_ids","_accounts","_statuses","sampleAccounts","notificationsCount","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","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","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","bFiltered","filteredItemsIDs","aFiltered","isCarousel","unfiltered","filteredItems2","has","StatusCarousel","_pinned2","_grouped","item2","statusID3","_pinned3","actualStatusID3","reblog3","statusID2","actualStatusID2","reblog2","url2","showCompact","_differentAuthor","isSpoiler","manyItems","isMiddle","isStart","isEnd","TimelineStatusCompact","itemKey","enableCommentHint","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","MenuGroup","exists","newInstance","List","listIterator","setList","showManageMembersModal","setShowManageMembersModal","list2","setDownOverflow","ListManageMembers","MEMBERS_LIMIT","members","setMembers","membersIterator","fetchMembers","member","as","RemoveAddButton","removed","setRemoved","notificationTypeKeys","fixNotifications","massageNotifications2","notificationGroups","sampleAccountIds","statusId","groupNotifications2","groupNotifications3","latestPageNotificationAt","newGroupNotifications","mostRecentNotificationId","gn","newGroupNotifications2","mappedNotification","n","notificationsMap2","groupNotifications","notificationsMap","cleanNotifications","virtualType","mappedAccount","cleanNotifications2","emptySearchParams","URLSearchParams","Mentions","stateType","setStateType","mentionsIterator","fetchMentions","types","conversationsIterator","latestConversationItem","lastStatus","fetchConversations","NOTIFICATIONS_LIMIT","NOTIFICATIONS_GROUPED_LIMIT","memSupportsGroupedNotifications","mem","mastoFetchNotifications","v2_alpha","getGroupedNotifications","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_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]} |