2026-02-20 19:59:05 +01:00
|
|
|
import { useEffect } from 'react'
|
|
|
|
|
|
|
|
|
|
interface KeyboardActions {
|
|
|
|
|
onQuickOpen: () => void
|
|
|
|
|
onCreateNote: () => void
|
|
|
|
|
onSave: () => void
|
2026-02-21 17:37:15 +01:00
|
|
|
onTrashNote: (path: string) => void
|
2026-02-20 19:59:05 +01:00
|
|
|
activeTabPathRef: React.MutableRefObject<string | null>
|
|
|
|
|
handleCloseTabRef: React.MutableRefObject<(path: string) => void>
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function useAppKeyboard({
|
2026-02-21 17:37:15 +01:00
|
|
|
onQuickOpen, onCreateNote, onSave, onTrashNote,
|
2026-02-20 19:59:05 +01:00
|
|
|
activeTabPathRef, handleCloseTabRef,
|
|
|
|
|
}: KeyboardActions) {
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
const handleKeyDown = (e: KeyboardEvent) => {
|
|
|
|
|
const mod = e.metaKey || e.ctrlKey
|
|
|
|
|
if (!mod) return
|
|
|
|
|
|
|
|
|
|
switch (e.key) {
|
|
|
|
|
case 'p':
|
|
|
|
|
e.preventDefault()
|
|
|
|
|
onQuickOpen()
|
|
|
|
|
break
|
|
|
|
|
case 'n':
|
|
|
|
|
e.preventDefault()
|
|
|
|
|
onCreateNote()
|
|
|
|
|
break
|
|
|
|
|
case 's':
|
|
|
|
|
e.preventDefault()
|
|
|
|
|
onSave()
|
|
|
|
|
break
|
|
|
|
|
case 'w': {
|
|
|
|
|
e.preventDefault()
|
|
|
|
|
const path = activeTabPathRef.current
|
|
|
|
|
if (path) handleCloseTabRef.current(path)
|
|
|
|
|
break
|
|
|
|
|
}
|
2026-02-21 17:37:15 +01:00
|
|
|
case 'Backspace':
|
|
|
|
|
case 'Delete': {
|
|
|
|
|
e.preventDefault()
|
|
|
|
|
const path = activeTabPathRef.current
|
|
|
|
|
if (path) onTrashNote(path)
|
|
|
|
|
break
|
|
|
|
|
}
|
2026-02-20 19:59:05 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
window.addEventListener('keydown', handleKeyDown)
|
|
|
|
|
return () => window.removeEventListener('keydown', handleKeyDown)
|
2026-02-21 17:37:15 +01:00
|
|
|
}, [onQuickOpen, onCreateNote, onSave, onTrashNote, activeTabPathRef, handleCloseTabRef])
|
2026-02-20 19:59:05 +01:00
|
|
|
}
|