- {table.getRowModel().rows.map((row) => (
+ {table.getRowModel().rows.map((row, idx) => (
{
const newFileName = row.getValue("path") as string;
const fullPath = cwd.concat("/", newFileName);
setFileName(fullPath);
}}
+ onClick={() => setFocusIndex(idx)}
onContextMenu={(e) => handleFileContextMenu(e, cwd.concat("/", row.getValue("path") as string))}
>
{row.getVisibleCells().map((cell) => {
@@ -333,15 +363,98 @@ const MemoizedTableBody = React.memo(
) as typeof TableBody;
interface DirectoryPreviewProps {
- contentAtom: jotai.Atom
>;
fileNameAtom: jotai.WritableAtom;
}
-function DirectoryPreview({ contentAtom, fileNameAtom }: DirectoryPreviewProps) {
- const contentText = jotai.useAtomValue(contentAtom);
- let content: FileInfo[] = JSON.parse(contentText);
+function DirectoryPreview({ fileNameAtom }: DirectoryPreviewProps) {
+ const [searchText, setSearchText] = React.useState("");
+ let [focusIndex, setFocusIndex] = React.useState(0);
+ const [content, setContent] = React.useState([]);
let [fileName, setFileName] = jotai.useAtom(fileNameAtom);
- return ;
+ const [enter, setEnter] = React.useState(false);
+
+ React.useEffect(() => {
+ const getContent = async () => {
+ const file = await services.FileService.ReadFile(fileName);
+ const serializedContent = util.base64ToString(file?.data64);
+ let content: FileInfo[] = JSON.parse(serializedContent);
+ let filtered = content.filter((fileInfo) => {
+ return fileInfo.path.toLowerCase().includes(searchText);
+ });
+ setContent(filtered);
+ };
+ getContent();
+ }, [fileName, searchText]);
+
+ const handleKeyDown = React.useCallback(
+ (e) => {
+ switch (e.key) {
+ case "Escape":
+ //todo: escape block focus
+ break;
+ case "ArrowUp":
+ e.preventDefault();
+ setFocusIndex((idx) => Math.max(idx - 1, 0));
+ break;
+ case "ArrowDown":
+ e.preventDefault();
+ setFocusIndex((idx) => Math.min(idx + 1, content.length - 1));
+ break;
+ case "Enter":
+ e.preventDefault();
+ console.log("enter thinks focus Index is ", focusIndex);
+ let newFileName = content[focusIndex].path;
+ console.log(
+ "enter thinks contents are",
+ content.slice(0, focusIndex + 1).map((fi) => fi.path)
+ );
+ setEnter((current) => !current);
+ /*
+ const fullPath = fileName.concat("/", newFileName);
+ setFileName(fullPath);
+ */
+ break;
+ default:
+ }
+ },
+ [content, focusIndex, setEnter]
+ );
+
+ React.useEffect(() => {
+ console.log(focusIndex);
+ }, [focusIndex]);
+
+ React.useEffect(() => {
+ document.addEventListener("keydown", handleKeyDown);
+
+ return () => {
+ document.removeEventListener("keydown", handleKeyDown);
+ };
+ }, [handleKeyDown]);
+
+ return (
+ <>
+
+
+
+ setSearchText(e.target.value.toLowerCase())}
+ maxLength={400}
+ autoFocus={true}
+ />
+
+
+ >
+ );
}
export { DirectoryPreview };
diff --git a/frontend/app/view/preview.tsx b/frontend/app/view/preview.tsx
index 34627378b..37f3e3d92 100644
--- a/frontend/app/view/preview.tsx
+++ b/frontend/app/view/preview.tsx
@@ -251,7 +251,7 @@ function PreviewView({ blockId }: { blockId: string }) {
) {
specializedView = ;
} else if (mimeType === "directory") {
- specializedView = ;
+ specializedView = ;
} else {
specializedView = (