import { RefObject } from 'preact' import { StateUpdater } from 'preact/hooks' import { JSXInternal } from 'preact/src/jsx' export const quickSettingsKeyDownHandler = ( closeQuickSettingsMenu: () => void, event: JSXInternal.TargetedKeyboardEvent, quickSettingsMenuRef: RefObject, themesMenuOpen: boolean, ) => { if (quickSettingsMenuRef?.current) { const items: NodeListOf = quickSettingsMenuRef.current.querySelectorAll(':scope > button') const currentFocusedIndex = Array.from(items).findIndex((btn) => btn === document.activeElement) if (!themesMenuOpen) { switch (event.key) { case 'Escape': closeQuickSettingsMenu() break case 'ArrowDown': if (items[currentFocusedIndex + 1]) { items[currentFocusedIndex + 1].focus() } else { items[0].focus() } break case 'ArrowUp': if (items[currentFocusedIndex - 1]) { items[currentFocusedIndex - 1].focus() } else { items[items.length - 1].focus() } break } } } } export const themesMenuKeyDownHandler = ( event: React.KeyboardEvent, themesMenuRef: RefObject, setThemesMenuOpen: StateUpdater, themesButtonRef: RefObject, ) => { if (themesMenuRef?.current) { const themes = themesMenuRef.current.querySelectorAll('button') const currentFocusedIndex = Array.from(themes).findIndex( (themeBtn) => themeBtn === document.activeElement, ) switch (event.key) { case 'Escape': case 'ArrowLeft': event.stopPropagation() setThemesMenuOpen(false) themesButtonRef.current?.focus() break case 'ArrowDown': if (themes[currentFocusedIndex + 1]) { themes[currentFocusedIndex + 1].focus() } else { themes[0].focus() } break case 'ArrowUp': if (themes[currentFocusedIndex - 1]) { themes[currentFocusedIndex - 1].focus() } else { themes[themes.length - 1].focus() } break } } }