Updating workspace structure

This commit is contained in:
2026-02-27 21:16:02 +01:00
parent 629f7d7a6d
commit 1a51dc8467
3 changed files with 153 additions and 100 deletions
+22 -91
View File
@@ -1,98 +1,29 @@
import { SidebarEntity } from "@/components/sidebar/Entity";
import { SetState, Task } from "@/lib/types";
import { OutputData } from "@editorjs/editorjs";
import { Entity, EntityId, Workspace } from "@/lib/types";
import {
loadWorkspaceFromLocalStorage,
saveWorkspaceToLocalStorage,
} from "@/lib/workspace";
import { useEffect, useState } from "react";
export type Entity =
| {
name: string;
kind: "todo";
tasks: Task[];
setTasks: SetState<Task[]>;
}
| {
name: string;
kind: "doc";
doc: OutputData;
setDoc: SetState<OutputData>;
};
export function useWorkspace(workspaceId: string) {
const [workspace, setWorkspace] = useState<Workspace>(() =>
loadWorkspaceFromLocalStorage(workspaceId),
);
export interface Workspace {
name: string;
entityLayout: SidebarEntity[];
entities: Record<string, Entity>;
route: string;
setRoute: SetState<string>;
}
export default function useWorkspace(): Workspace {
const [route, setRoute] = useState("alpha_tasks");
const [tasks, setTasks] = useState<Task[]>([]);
const [doc, setDoc] = useState<OutputData>({
blocks: [],
});
const [doc2, setDoc2] = useState<OutputData>({
blocks: [],
});
const updateEntity = (entityId: EntityId, updater: (e: Entity) => Entity) => {
setWorkspace((prev) => ({
...prev,
entities: {
...prev.entities,
[entityId]: updater(prev.entities[entityId]),
},
updatedAt: Date.now(),
}));
};
useEffect(() => {
setTasks([
{ id: "1", title: "Buy groceries", status: "todo" },
{ id: "2", title: "Plan sprint", status: "todo" },
{
id: "3",
title: "Build App",
description: "A simple description",
tags: ["website", "api", "app"],
status: "inprogress",
},
]);
}, []);
saveWorkspaceToLocalStorage(workspace);
}, [workspace]);
return {
name: "Personal Workspace",
entities: {
alpha_tasks: {
name: "Alpha tasks",
kind: "todo",
tasks,
setTasks,
},
beta_tasks: {
name: "Beta tasks",
kind: "todo",
tasks,
setTasks,
},
alpha_doc: {
name: "Alpha docs",
kind: "doc",
doc: doc,
setDoc: setDoc,
},
beta_doc: {
name: "Beta docs",
kind: "doc",
doc: doc2,
setDoc: setDoc2,
},
},
entityLayout: [
{
kind: "group",
name: "Project alpha",
children: [{ id: "alpha_tasks" }, { id: "alpha_doc" }],
},
{
kind: "group",
name: "Project beta",
children: [{ id: "beta_tasks" }, { id: "beta_doc" }],
},
],
route,
setRoute,
};
return { workspace, updateEntity };
}