95 lines
2.0 KiB
TypeScript
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;
|
|
}
|
|
}
|