import './shortcuts.css'; import { MenuDivider } from '@szhsin/react-menu'; import { memo } from 'preact/compat'; import { useRef, useState } from 'preact/hooks'; import { useHotkeys } from 'react-hotkeys-hook'; import { useNavigate } from 'react-router-dom'; import { useSnapshot } from 'valtio'; import { SHORTCUTS_META } from '../components/shortcuts-settings'; import { api } from '../utils/api'; import { getLists } from '../utils/lists'; import states from '../utils/states'; import AsyncText from './AsyncText'; import Icon from './icon'; import Link from './link'; import Menu2 from './menu2'; import MenuLink from './menu-link'; import SubMenu2 from './submenu2'; function Shortcuts() { const { instance } = api(); const snapStates = useSnapshot(states); const { shortcuts, settings } = snapStates; if (!shortcuts.length) { return null; } if ( settings.shortcutsViewMode === 'multi-column' || (!settings.shortcutsViewMode && settings.shortcutsColumnsMode) ) { return null; } const menuRef = useRef(); const hasLists = useRef(false); const formattedShortcuts = shortcuts .map((pin, i) => { const { type, ...data } = pin; if (!SHORTCUTS_META[type]) return null; let { id, path, title, subtitle, icon } = SHORTCUTS_META[type]; if (typeof id === 'function') { id = id(data, i); } if (typeof path === 'function') { path = path( { ...data, instance: data.instance || instance, }, i, ); } if (typeof title === 'function') { title = title(data, i); } if (typeof subtitle === 'function') { subtitle = subtitle(data, i); } if (typeof icon === 'function') { icon = icon(data, i); } if (id === 'lists') { hasLists.current = true; } return { id, path, title, subtitle, icon, }; }) .filter(Boolean); const navigate = useNavigate(); useHotkeys(['1', '2', '3', '4', '5', '6', '7', '8', '9'], (e, handler) => { const index = parseInt(handler.keys[0], 10) - 1; if (index < formattedShortcuts.length) { const { path } = formattedShortcuts[index]; if (path) { navigate(path); menuRef.current?.closeMenu?.(); } } }); const [lists, setLists] = useState([]); return (
{snapStates.settings.shortcutsViewMode === 'tab-menu-bar' ? ( ) : ( { if (e.open && hasLists.current) { getLists().then(setLists); } }} menuButton={ } > {formattedShortcuts.map(({ id, path, title, subtitle, icon }, i) => { if (id === 'lists') { return ( {title} } > All Lists {lists?.map((list) => ( {list.title} ))} ); } return ( {' '} {title} {subtitle && ( <> {' '} {subtitle} )} {i + 1} ); })} )}
); } export default memo(Shortcuts);