Files
drift/src/components/Router.tsx
T
2026-02-27 21:59:55 +01:00

95 lines
2.0 KiB
TypeScript

"use client";
import { Route, Task, Workspace } from "@/lib/types";
import TaskView from "./view/TaskView";
import DocView from "./view/DocView";
import { OutputData } from "@editorjs/editorjs";
const id = (prefix = "t") =>
`${prefix}_${Math.random().toString(36).slice(2, 9)}`;
export default function Router({
route,
workspace,
setWorkspace,
}: {
route: Route;
workspace: Workspace;
setWorkspace: React.Dispatch<React.SetStateAction<Workspace>>;
}) {
const entityId = route.entity;
const entity = entityId ? workspace.entities[entityId] : null;
if (!entity || !entityId) return null;
const updateEntity = (updater: (e: any) => any) => {
setWorkspace((prev) => {
const updated = updater(prev.entities[entityId]);
return {
...prev,
updatedAt: Date.now(),
entities: {
...prev.entities,
[entityId]: updated,
},
};
});
};
switch (entity.type) {
case "todo": {
const createTask = (statusId: string) => {
const task: Task = {
id: id(),
title: "New task",
statusId,
tagIds: [],
createdAt: new Date().getTime(),
updatedAt: new Date().getTime(),
};
updateEntity((e) => ({
...e,
tasks: [...e.tasks, task],
}));
};
const setTasks = (tasks: Task[]) => {
updateEntity((e) => ({
...e,
tasks,
}));
};
return (
<TaskView
key={entity.id}
tasks={entity.tasks}
setTasks={setTasks}
createTask={createTask}
tags={entity.tags}
/>
);
}
case "doc": {
const setDoc = (doc: OutputData) => {
updateEntity((e) => ({
...e,
doc,
}));
};
return (
<div className="h-full w-3xl mx-auto bg-card rounded-2xl p-6 border">
<DocView key={entity.id} doc={entity.content} setDoc={setDoc} />
</div>
);
}
default:
return null;
}
}