Nav: improve error handling, add lazy DOM, simplify
This commit is contained in:
parent
9238099746
commit
a585e7627b
|
|
@ -5,7 +5,7 @@ import type { FolderTree } from "../types/global";
|
||||||
const folderTreeState = van.state<FolderTree | null>(null);
|
const folderTreeState = van.state<FolderTree | null>(null);
|
||||||
|
|
||||||
async function openFolder() {
|
async function openFolder() {
|
||||||
const folderTree = await window.electronAPI.openFolder();
|
const folderTree = await window.electronAPI.openFolder().catch(alert);
|
||||||
if (!folderTree) return;
|
if (!folderTree) return;
|
||||||
folderTreeState.val = folderTree;
|
folderTreeState.val = folderTree;
|
||||||
}
|
}
|
||||||
|
|
@ -15,19 +15,7 @@ const FolderTreeView = () => {
|
||||||
return v.div(
|
return v.div(
|
||||||
{ style: "text-align: center; margin-top: 25px;" },
|
{ style: "text-align: center; margin-top: 25px;" },
|
||||||
v.p("No folder selected!"),
|
v.p("No folder selected!"),
|
||||||
v.p(
|
v.button({ onclick: openFolder }, "Open Folder"),
|
||||||
v.button(
|
|
||||||
{
|
|
||||||
onclick: async () => {
|
|
||||||
const folderTree =
|
|
||||||
await window.electronAPI.openFolder();
|
|
||||||
if (!folderTree) return;
|
|
||||||
folderTreeState.val = folderTree;
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"Open Folder",
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return v.div(
|
return v.div(
|
||||||
|
|
@ -55,36 +43,22 @@ const FolderTreeView = () => {
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const FsItemView = (tree: FolderTree): HTMLElement | string => {
|
// TODO: determine if lazy DOM creation is better or not.
|
||||||
|
// Alternatively, investigate lazy FS traversal in main.
|
||||||
|
const FsItemView = (tree: FolderTree): HTMLElement => {
|
||||||
if (tree.type === "file") return v.p(tree.name);
|
if (tree.type === "file") return v.p(tree.name);
|
||||||
return v.details(v.summary(tree.name), tree.children?.map(FsItemView));
|
const isOpen = van.state(false);
|
||||||
|
const children = () =>
|
||||||
|
isOpen.val
|
||||||
|
? v.div(tree.children?.map(FsItemView))
|
||||||
|
: v.div({ ariaBusy: true });
|
||||||
|
const folder = v.details(
|
||||||
|
{ ontoggle: () => (isOpen.val = folder.open) },
|
||||||
|
v.summary(tree.name),
|
||||||
|
children,
|
||||||
|
);
|
||||||
|
|
||||||
// if (tree.type === "file") return v.div(" ", tree.name);
|
return folder;
|
||||||
// // Use a state to track open/close instead of <details>
|
|
||||||
// const isOpen = van.state(0);
|
|
||||||
// return v.div(
|
|
||||||
// {
|
|
||||||
// style: "cursor: pointer; user-select: none; font-weight: bold;",
|
|
||||||
// onclick: () => isOpen.val++,
|
|
||||||
// },
|
|
||||||
// () => (isOpen.val ? "▼ " : "▶ "),
|
|
||||||
// tree.name,
|
|
||||||
// );
|
|
||||||
// // return v.div(
|
|
||||||
// // v.span(
|
|
||||||
// // {
|
|
||||||
// // style: "cursor: pointer; user-select: none; font-weight: bold;",
|
|
||||||
// // onclick: () => {
|
|
||||||
// // console.log("opening");
|
|
||||||
// // isOpen.val++;
|
|
||||||
// // },
|
|
||||||
// // },
|
|
||||||
// // () => (isOpen.val ? "▼ " : "▶ "),
|
|
||||||
// // tree.name,
|
|
||||||
// // ),
|
|
||||||
// // " ",
|
|
||||||
// // isOpen.val,
|
|
||||||
// // );
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Mount the folder tree view to the nav
|
// Mount the folder tree view to the nav
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue