DocWeave / frontend /src /context /WorkspaceContext.jsx
shak3008's picture
perf: optimize login transition and dashboard loading performance
d135b0e
Raw
History Blame Contribute Delete
3.77 kB
import { createContext, useContext, useCallback, useEffect, useState } from "react";
import { listWorkspaces, createWorkspace } from "../api/workspaces";
const WorkspaceContext = createContext();
const getInitialCache = () => {
try {
const raw = localStorage.getItem("dw_workspaces_cache");
return raw ? JSON.parse(raw) : [];
} catch {
return [];
}
};
export function WorkspaceProvider({ children }) {
const [workspaces, setWorkspaces] = useState(getInitialCache);
const [currentId, setCurrentId] = useState(() => localStorage.getItem("dw_workspace_id") || null);
const [loading, setLoading] = useState(() => {
const cached = getInitialCache();
const savedId = localStorage.getItem("dw_workspace_id");
return !(cached.length > 0 && (savedId ? cached.some((w) => w.id === savedId) : true));
});
const [error, setError] = useState(null);
const refresh = useCallback(async () => {
setError(null);
try {
const list = await listWorkspaces();
if (!Array.isArray(list)) {
if (list?.detail) setError(list.detail);
return;
}
if (list.length === 0) {
const created = await createWorkspace({
name: "Default Workspace",
description: "Created automatically for document uploads.",
});
if (created?.detail) {
setError(created.detail);
return;
}
setWorkspaces([created]);
setCurrentId(created.id);
localStorage.setItem("dw_workspace_id", created.id);
localStorage.setItem("dw_workspaces_cache", JSON.stringify([created]));
return;
}
setWorkspaces(list);
localStorage.setItem("dw_workspaces_cache", JSON.stringify(list));
setCurrentId((prev) => {
const saved = prev || localStorage.getItem("dw_workspace_id");
if (saved && list.some((w) => w.id === saved)) return saved;
localStorage.setItem("dw_workspace_id", list[0].id);
return list[0].id;
});
} catch (err) {
setError("Couldn't load workspaces.");
} finally {
setLoading(false);
}
}, []);
useEffect(() => {
refresh();
}, [refresh]);
const selectWorkspace = useCallback((id) => {
setCurrentId(id);
localStorage.setItem("dw_workspace_id", id);
}, []);
const addWorkspace = useCallback(async (name, description = "") => {
const created = await createWorkspace({ name, description });
if (created?.detail) {
setError(created.detail);
return null;
}
setWorkspaces((prev) => {
const next = [...prev, created];
localStorage.setItem("dw_workspaces_cache", JSON.stringify(next));
return next;
});
setCurrentId(created.id);
localStorage.setItem("dw_workspace_id", created.id);
return created;
}, []);
const currentWorkspace = workspaces.find((w) => w.id === currentId) || (workspaces.length > 0 ? workspaces[0] : null);
const value = {
workspace: currentWorkspace,
workspaces,
loading,
error,
selectWorkspace,
addWorkspace,
refresh,
};
return <WorkspaceContext.Provider value={value}>{children}</WorkspaceContext.Provider>;
}
export const useWorkspaceContext = () => useContext(WorkspaceContext);