) => {
if (e.defaultPrevented || e.metaKey || e.ctrlKey || e.altKey) return;
if (filesInOrder.length === 0) return;
const pos = selectedPath ? filesInOrder.indexOf(selectedPath) : -1;
if (e.key === 'j' || e.key === 'ArrowDown') {
e.preventDefault();
if (pos < filesInOrder.length - 1) selectFile(filesInOrder[pos + 1]);
return;
}
if (e.key === 'k' || e.key === 'ArrowUp') {
e.preventDefault();
if (pos > 0) selectFile(filesInOrder[pos - 1]);
return;
}
if (e.key === 'Home') {
e.preventDefault();
selectFile(filesInOrder[0]);
return;
}
if (e.key === 'End') {
e.preventDefault();
selectFile(filesInOrder[filesInOrder.length - 1]);
return;
}
if (e.key !== 'ArrowRight' && e.key !== 'ArrowLeft') return;
const current = rows.find((r) => r.key === tabStopKey);
if (!current) return;
e.preventDefault();
const { node } = current;
if (e.key === 'ArrowRight') {
if (node.type !== 'folder') return;
if (!expandedFolders.has(node.path)) {
setFolderExpanded(node.path, true);
} else {
const index = rows.indexOf(current);
const child = rows[index + 1];
if (child && child.parentKey === current.key) focusRow(child.key);
}
return;
}
if (node.type === 'folder' && expandedFolders.has(node.path)) {
setFolderExpanded(node.path, false);
} else if (current.parentKey) {
focusRow(current.parentKey);
}
},
[filesInOrder, selectedPath, selectFile, rows, tabStopKey, expandedFolders, setFolderExpanded, focusRow],
);
const setRef = (key: string) => (el: HTMLButtonElement | null) => {
if (el) rowRefs.current.set(key, el);
else rowRefs.current.delete(key);
};
return (
{rows.map(({ key, node }) => {
const level = node.depth + 1;
const tabIndex = key === tabStopKey ? 0 : -1;
if (node.type === 'folder') {
const isExpanded = expandedFolders.has(node.path);
return (
setFocusedKey(key)}
node={node}
isExpanded={isExpanded}
onToggle={() => {
toggleFolder(node.path);
setFocusedKey(key);
}}
/>
);
}
const file = node.file!;
const isActive = node.path === selectedPath;
return (
);
})}
);
};