lynxkite / web /app /page.tsx
darabos's picture
Start converting directory page to React.
2fb9e9d
raw
history blame
2.63 kB
// The directory browser.
import Image from "next/image";
import Link from 'next/link';
// @ts-ignore
import Home from '~icons/tabler/home'
// @ts-ignore
import Folder from '~icons/tabler/folder'
// @ts-ignore
import FolderPlus from '~icons/tabler/folder-plus'
// @ts-ignore
import File from '~icons/tabler/file'
// @ts-ignore
import FilePlus from '~icons/tabler/file-plus'
export default async function Home({
searchParams,
}: {
searchParams?: Promise<{ [key: string]: string | string[] | undefined }>;
}) {
;
async function fetchList(path) {
const encodedPath = encodeURIComponent(path || '');
const res = await fetch(`http://localhost:8000/api/dir/list?path=${encodedPath}`);
const j = await res.json();
return j;
}
const path = (await searchParams)?.path || '';
const list = await fetchList(path);
function link(item) {
if (item.type === 'directory') {
return `/dir?path=${item.name}`;
} else {
return `/workspace?path=${item.name}`;
}
}
function shortName(item) {
return item.name.split('/').pop();
}
function newName(list) {
let i = 0;
while (true) {
const name = `Untitled${i ? ` ${i}` : ''}`;
if (!list.find(item => item.name === name)) {
return name;
}
i++;
}
}
function newWorkspaceIn(path, list) {
const pathSlash = path ? `${path}/` : '';
return `/workspace?path=${pathSlash}${newName(list)}`;
}
async function newFolderIn(path, list) {
const pathSlash = path ? `${path}/` : '';
const name = newName(list);
const res = await fetch(`/api/dir/mkdir`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ path: pathSlash + name }),
});
list = await res.json();
}
return (
<div className="directory-page">
<div className="logo">
<Link href="https://lynxkite.com/"><img src='/logo.png' className="logo-image" alt="LynxKite logo" /></Link>
<div className="tagline">The Complete Graph Data Science Platform</div>
</div>
<div className="entry-list">
<div className="actions">
<a href={newWorkspaceIn(path, list)}><FilePlus /> New workspace</a>
<a href="" onClick={() => newFolderIn(path, list)}><FolderPlus /> New folder</a>
</div>
{path && <div className="breadcrumbs"><a href="#dir"><Home /></a> {path} </div>}
{list.map(item =>
<a className="entry" href={link(item)}>
{item.type === 'directory' ? <Folder /> : <File />}
{shortName(item)}
</a>
)}
</div>
</div>
);
}