import './keyboard-shortcuts-help.css'; import { memo } from 'preact/compat'; import { useHotkeys } from 'react-hotkeys-hook'; import { useSnapshot } from 'valtio'; import states from '../utils/states'; import Icon from './icon'; import Modal from './modal'; export default memo(function KeyboardShortcutsHelp() { const snapStates = useSnapshot(states); function onClose() { states.showKeyboardShortcutsHelp = false; } useHotkeys( '?, shift+?', (e) => { console.log('help'); states.showKeyboardShortcutsHelp = true; }, { ignoreEventWhen: (e) => { const hasModal = !!document.querySelector('#modal-container > *'); return hasModal; }, }, ); const escRef = useHotkeys('esc', onClose, []); return ( !!snapStates.showKeyboardShortcutsHelp && ( <Modal class="light" onClick={(e) => { if (e.target === e.currentTarget) { onClose(); } }} > <div id="keyboard-shortcuts-help-container" class="sheet" tabindex="-1" ref={escRef} > <button type="button" class="sheet-close" onClick={onClose}> <Icon icon="x" /> </button> <header> <h2>Keyboard shortcuts</h2> </header> <main> <table> {[ { action: 'Keyboard shortcuts help', keys: <kbd>?</kbd>, }, { action: 'Next post', keys: <kbd>j</kbd>, }, { action: 'Previous post', keys: <kbd>k</kbd>, }, { action: 'Skip carousel to next post', keys: ( <> <kbd>Shift</kbd> + <kbd>j</kbd> </> ), }, { action: 'Skip carousel to previous post', keys: ( <> <kbd>Shift</kbd> + <kbd>k</kbd> </> ), }, { action: 'Open post details', keys: ( <> <kbd>Enter</kbd> or <kbd>o</kbd> </> ), }, { action: 'Toggle expanded/collapsed thread', keys: <kbd>x</kbd>, }, { action: 'Close post or dialogs', keys: ( <> <kbd>Esc</kbd> or <kbd>Backspace</kbd> </> ), }, { action: 'Focus column in multi-column mode', keys: ( <> <kbd>1</kbd> to <kbd>9</kbd> </> ), }, { action: 'Compose new post', keys: <kbd>c</kbd>, }, { action: 'Send post', keys: ( <> <kbd>Ctrl</kbd> + <kbd>Enter</kbd> or <kbd>⌘</kbd> +{' '} <kbd>Enter</kbd> </> ), }, { action: 'Search', keys: <kbd>/</kbd>, }, { action: 'Reply', keys: <kbd>r</kbd>, }, { action: 'Favourite', keys: <kbd>f</kbd>, }, { action: 'Boost', keys: ( <> <kbd>Shift</kbd> + <kbd>b</kbd> </> ), }, { action: 'Bookmark', keys: <kbd>d</kbd>, }, ].map(({ action, keys }) => ( <tr key={action}> <th>{action}</th> <td>{keys}</td> </tr> ))} </table> </main> </div> </Modal> ) ); });