diff --git a/src/app/workspace/page.tsx b/src/app/workspace/page.tsx index 3407d29..195c873 100644 --- a/src/app/workspace/page.tsx +++ b/src/app/workspace/page.tsx @@ -42,7 +42,7 @@ export default function Workspace() { - + ) : (
`${prefix}_${Math.random().toString(36).slice(2, 9)}`; -export default function Router({ workspace }: { workspace: Workspace }) { - const entity = workspace.entities[workspace.route]; - switch (entity.kind) { - case "todo": - const createTask = (status: string) => { +export default function Router({ + route, + workspace, + setWorkspace, +}: { + route: Route; + workspace: Workspace; + setWorkspace: React.Dispatch>; +}) { + 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", - status: status, + statusId, + tagIds: [], + createdAt: new Date().getTime(), + updatedAt: new Date().getTime(), }; - entity.setTasks((c: Task[]) => [...c, task]); + + updateEntity((e) => ({ + ...e, + tasks: [...e.tasks, task], + })); + }; + + const setTasks = (tasks: Task[]) => { + updateEntity((e) => ({ + ...e, + tasks, + })); }; return ( ); - case "doc": + } + + case "doc": { + const setDoc = (doc: OutputData) => { + updateEntity((e) => ({ + ...e, + doc, + })); + }; + return ( -
- +
+
); + } + + default: + return null; } } diff --git a/src/components/view/TaskView.tsx b/src/components/view/TaskView.tsx index e3c334e..32f5320 100644 --- a/src/components/view/TaskView.tsx +++ b/src/components/view/TaskView.tsx @@ -1,15 +1,20 @@ "use client"; -import { SetState, Task } from "@/lib/types"; +import { Tag, TagId, Task, TaskId } from "@/lib/types"; import { Color } from "@/lib/ui/color"; import BoardView from "./board/BoardView"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "../ui/tabs"; import { TableView } from "./table/TableView"; export type TaskViewProps = { - tags: Record; - tasks: Task[]; - setTasks: SetState; + tags: Record; + + tasks: Record; + + /** Replace entire task array */ + setTasks: (tasks: Task[]) => void; + + /** Create a new task with a status */ createTask: (status: string) => void; }; @@ -20,13 +25,14 @@ export default function TaskView({ createTask, }: TaskViewProps) { return ( -
- - +
+ + Board Table - + + - + +