(e: KeyboardEvent)
| 185 | // Keyboard navigation |
| 186 | useEffect(() => { |
| 187 | const handleKeyDown = (e: KeyboardEvent) => { |
| 188 | const displayEntries = searchQuery.trim() ? searchResults : entries; |
| 189 | |
| 190 | switch (e.key) { |
| 191 | case 'Escape': |
| 192 | e.preventDefault(); |
| 193 | onClose(); |
| 194 | break; |
| 195 | |
| 196 | case 'Enter': |
| 197 | e.preventDefault(); |
| 198 | // Enter always selects the current item (file or directory) |
| 199 | if (displayEntries.length > 0 && selectedIndex < displayEntries.length) { |
| 200 | onSelect(displayEntries[selectedIndex]); |
| 201 | } |
| 202 | break; |
| 203 | |
| 204 | case 'ArrowUp': |
| 205 | e.preventDefault(); |
| 206 | setSelectedIndex(prev => Math.max(0, prev - 1)); |
| 207 | break; |
| 208 | |
| 209 | case 'ArrowDown': |
| 210 | e.preventDefault(); |
| 211 | setSelectedIndex(prev => Math.min(displayEntries.length - 1, prev + 1)); |
| 212 | break; |
| 213 | |
| 214 | case 'ArrowRight': |
| 215 | e.preventDefault(); |
| 216 | // Right arrow enters directories |
| 217 | if (displayEntries.length > 0 && selectedIndex < displayEntries.length) { |
| 218 | const entry = displayEntries[selectedIndex]; |
| 219 | if (entry.is_directory) { |
| 220 | navigateToDirectory(entry.path); |
| 221 | } |
| 222 | } |
| 223 | break; |
| 224 | |
| 225 | case 'ArrowLeft': |
| 226 | e.preventDefault(); |
| 227 | // Left arrow goes back to parent directory |
| 228 | if (canGoBack) { |
| 229 | navigateBack(); |
| 230 | } |
| 231 | break; |
| 232 | } |
| 233 | }; |
| 234 | |
| 235 | window.addEventListener('keydown', handleKeyDown); |
| 236 | return () => window.removeEventListener('keydown', handleKeyDown); |
nothing calls this directly
no test coverage detected