import { useState } from "react"; // The directory browser. import { Link, useNavigate, useParams } from "react-router"; import useSWR from "swr"; import type { DirectoryEntry } from "./apiTypes.ts"; // @ts-ignore import File from "~icons/tabler/file"; // @ts-ignore import FilePlus from "~icons/tabler/file-plus"; // @ts-ignore import Folder from "~icons/tabler/folder"; // @ts-ignore import FolderPlus from "~icons/tabler/folder-plus"; // @ts-ignore import Home from "~icons/tabler/home"; // @ts-ignore import Trash from "~icons/tabler/trash"; import logo from "./assets/logo.png"; const fetcher = (url: string) => fetch(url).then((res) => res.json()); export default function () { const { path } = useParams(); const encodedPath = encodeURIComponent(path || ""); const list = useSWR(`/api/dir/list?path=${encodedPath}`, fetcher, { dedupingInterval: 0, }); const navigate = useNavigate(); const [isCreatingDir, setIsCreatingDir] = useState(false); const [isCreatingWorkspace, setIsCreatingWorkspace] = useState(false); function link(item: DirectoryEntry) { if (item.type === "directory") { return `/dir/${item.name}`; } return `/edit/${item.name}`; } function shortName(item: DirectoryEntry) { return item.name.split("/").pop(); } function newName(list: DirectoryEntry[], baseName = "Untitled") { let i = 0; while (true) { const name = `${baseName}${i ? ` ${i}` : ""}`; if (!list.find((item) => item.name === name)) { return name; } i++; } } function newWorkspaceIn( path: string, list: DirectoryEntry[], workspaceName?: string, ) { const pathSlash = path ? `${path}/` : ""; const name = workspaceName || newName(list); navigate(`/edit/${pathSlash}${name}`, { replace: true }); } async function newFolderIn( path: string, list: DirectoryEntry[], folderName?: string, ) { const name = folderName || newName(list, "New Folder"); const pathSlash = path ? `${path}/` : ""; const res = await fetch("/api/dir/mkdir", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ path: pathSlash + name }), }); if (res.ok) { navigate(`/dir/${pathSlash}${name}`); } else { alert("Failed to create folder."); } } async function deleteItem(item: DirectoryEntry) { if (!window.confirm(`Are you sure you want to delete "${item.name}"?`)) return; const pathSlash = path ? `${path}/` : ""; const apiPath = item.type === "directory" ? "/api/dir/delete" : "/api/delete"; await fetch(apiPath, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ path: pathSlash + item.name }), }); } return (
LynxKite logo
The Complete Graph Data Science Platform
{list.error &&

{list.error.message}

} {list.isLoading && ( Loading... )} {list.data && ( <>
{isCreatingWorkspace && ( // @ts-ignore
{ e.preventDefault(); newWorkspaceIn( path || "", list.data, ( e.target as HTMLFormElement ).workspaceName.value.trim(), ); }} >
)}
{isCreatingDir && ( // @ts-ignore
{ e.preventDefault(); newFolderIn( path || "", list.data, (e.target as HTMLFormElement).folderName.value.trim(), ); }} >
)}
{path && (
{" "} {path}
)} {list.data.map((item: DirectoryEntry) => (
{item.type === "directory" ? : } {shortName(item)}
))} )}
{" "}
); }