import { useEffect } from 'react'; import { X, Keyboard, ExternalLink } from 'lucide-react'; import { useTranslation } from 'react-i18next'; import { Card, CardContent } from './Card'; interface NavItem { id: string; to: string; labelKey: string; } interface SidebarItem { type: 'nav' | 'external'; label: string; labelKey?: string; } interface KeyboardShortcutsModalProps { onClose: () => void; navItems?: NavItem[]; sidebarItems?: SidebarItem[]; } function getShortcuts( sidebarItems: SidebarItem[] | undefined, navItems: NavItem[] | undefined, t: (key: string) => string ) { // Use sidebarItems if provided (new format), otherwise fall back to navItems const navShortcuts = sidebarItems ? sidebarItems.slice(0, 9).map((item, index) => ({ keys: [String(index + 1)], description: item.type === 'external' ? `Open ${item.label}` : `Go to ${item.labelKey ? t(item.labelKey) : item.label}`, isExternal: item.type === 'external', })) : navItems ? navItems.map((item, index) => ({ keys: [String(index + 1)], description: `Go to ${t(item.labelKey)}`, isExternal: false, })) : [ { keys: ['1'], description: 'Go to Printers', isExternal: false }, { keys: ['2'], description: 'Go to Archives', isExternal: false }, { keys: ['3'], description: 'Go to Queue', isExternal: false }, { keys: ['4'], description: 'Go to Statistics', isExternal: false }, { keys: ['5'], description: 'Go to Cloud Profiles', isExternal: false }, { keys: ['6'], description: 'Go to Settings', isExternal: false }, ]; return [ { category: 'Navigation', items: navShortcuts }, { category: 'Archives', items: [ { keys: ['/'], description: 'Focus search', isExternal: false }, { keys: ['U'], description: 'Open upload modal', isExternal: false }, { keys: ['Esc'], description: 'Clear selection / blur input', isExternal: false }, { keys: ['Right-click'], description: 'Context menu on cards', isExternal: false }, ]}, { category: 'K-Profiles', items: [ { keys: ['R'], description: 'Refresh profiles', isExternal: false }, { keys: ['N'], description: 'New profile', isExternal: false }, { keys: ['Esc'], description: 'Exit selection mode', isExternal: false }, ]}, { category: 'General', items: [ { keys: ['?'], description: 'Show this help', isExternal: false }, ]}, ]; } function KeyBadge({ children }: { children: string }) { return ( {children} ); } export function KeyboardShortcutsModal({ onClose, navItems, sidebarItems }: KeyboardShortcutsModalProps) { const { t } = useTranslation(); const shortcuts = getShortcuts(sidebarItems, navItems, t); // Close on Escape key useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); }; window.addEventListener('keydown', handleKeyDown); return () => window.removeEventListener('keydown', handleKeyDown); }, [onClose]); return (
e.stopPropagation()}> {/* Header */}

Keyboard Shortcuts

{/* Shortcuts List */}
{shortcuts.map((section) => (

{section.category}

{section.items.map((shortcut) => (
{shortcut.description} {shortcut.isExternal && ( )}
{shortcut.keys.map((key) => ( {key} ))}
))}
))}
{/* Footer */}

Press Esc or click outside to close

); }