import { useEffect, useCallback, useRef } from 'react' import { useInventoryContext } from '../context/InventoryContext' export function useKeyboardShortcuts(enabled = true) { const { setActiveNumberKey, hoveredSlot, sendAction, pKeyActive, setPKeyActive, focusedSlot, setFocusedSlot, pKeyDigit, setPKeyDigit, } = useInventoryContext() const pKeyDigitRef = useRef(pKeyDigit) pKeyDigitRef.current = pKeyDigit useEffect(() => { if (!enabled) return const handleKeyDown = (e: KeyboardEvent) => { // Ignore when typing in inputs if ((e.target as HTMLElement)?.tagName === 'INPUT' || (e.target as HTMLElement)?.tagName === 'TEXTAREA') return // P toggles slot numbering mode if (e.code === 'KeyP' && !e.shiftKey && !e.ctrlKey && !e.metaKey) { if (pKeyActive) { setPKeyActive(false) setFocusedSlot(null) setPKeyDigit('') } else { setPKeyActive(true) setPKeyDigit('') } return } // Escape exits P-key mode if (e.code === 'Escape' && pKeyActive) { setPKeyActive(false) setFocusedSlot(null) setPKeyDigit('') return } // Number entry during P-key mode if (pKeyActive && e.code >= 'Digit0' && e.code <= 'Digit9') { const digit = e.code.replace('Digit', '') const current = pKeyDigitRef.current if (current.length === 0) { setPKeyDigit(digit) } else { const slotNum = parseInt(current + digit, 10) setPKeyDigit('') if (slotNum <= 99) { setFocusedSlot(slotNum) // Exit P mode but keep focused slot setPKeyActive(false) } } return } // Normal hotbar number keys (only when P-key not active) if (!pKeyActive && e.code >= 'Digit1' && e.code <= 'Digit9') { setActiveNumberKey(parseInt(e.code.replace('Digit', ''), 10) - 1) } // Q to drop if (e.code === 'KeyQ') { if (hoveredSlot !== null) { sendAction({ type: 'drop', slotIndex: hoveredSlot, all: e.ctrlKey || e.metaKey, }) } } } const handleKeyUp = (e: KeyboardEvent) => { if (!pKeyActive && e.code >= 'Digit1' && e.code <= 'Digit9') { setActiveNumberKey(null) } } window.addEventListener('keydown', handleKeyDown) window.addEventListener('keyup', handleKeyUp) return () => { window.removeEventListener('keydown', handleKeyDown) window.removeEventListener('keyup', handleKeyUp) } }, [enabled, hoveredSlot, sendAction, setActiveNumberKey, pKeyActive, setPKeyActive, focusedSlot, setFocusedSlot, setPKeyDigit]) }