94 lines
3.5 KiB
TypeScript
94 lines
3.5 KiB
TypeScript
import type { StateCreator } from "zustand";
|
|
import type { WorkspaceSlice, WorkspaceSliceState } from "./types";
|
|
|
|
export const defaultWorkspaceState: WorkspaceSliceState = {
|
|
workspaces: { items: [], activeId: null },
|
|
repositories: { itemsByWorkspaceId: {}, loadingByWorkspaceId: {}, loadedByWorkspaceId: {} },
|
|
repositoryBranches: {
|
|
itemsByRepositoryId: {},
|
|
loadingByRepositoryId: {},
|
|
loadedByRepositoryId: {},
|
|
fetchedAtByRepositoryId: {},
|
|
fetchErrorByRepositoryId: {},
|
|
},
|
|
repositoryScripts: {
|
|
itemsByRepositoryId: {},
|
|
loadingByRepositoryId: {},
|
|
loadedByRepositoryId: {},
|
|
},
|
|
};
|
|
|
|
export const createWorkspaceSlice: StateCreator<
|
|
WorkspaceSlice,
|
|
[["zustand/immer", never]],
|
|
[],
|
|
WorkspaceSlice
|
|
> = (set, get) => ({
|
|
...defaultWorkspaceState,
|
|
setActiveWorkspace: (workspaceId) => {
|
|
if (get().workspaces.activeId === workspaceId) {
|
|
return;
|
|
}
|
|
set((draft) => {
|
|
draft.workspaces.activeId = workspaceId;
|
|
});
|
|
},
|
|
setWorkspaces: (workspaces) =>
|
|
set((draft) => {
|
|
draft.workspaces.items = workspaces;
|
|
if (!draft.workspaces.activeId && workspaces.length) {
|
|
draft.workspaces.activeId = workspaces[0].id;
|
|
}
|
|
}),
|
|
setRepositories: (workspaceId, repositories) =>
|
|
set((draft) => {
|
|
draft.repositories.itemsByWorkspaceId[workspaceId] = repositories;
|
|
draft.repositories.loadingByWorkspaceId[workspaceId] = false;
|
|
draft.repositories.loadedByWorkspaceId[workspaceId] = true;
|
|
}),
|
|
setRepositoriesLoading: (workspaceId, loading) =>
|
|
set((draft) => {
|
|
draft.repositories.loadingByWorkspaceId[workspaceId] = loading;
|
|
}),
|
|
setRepositoryBranches: (repositoryId, branches, meta) =>
|
|
set((draft) => {
|
|
draft.repositoryBranches.itemsByRepositoryId[repositoryId] = branches;
|
|
draft.repositoryBranches.loadingByRepositoryId[repositoryId] = false;
|
|
draft.repositoryBranches.loadedByRepositoryId[repositoryId] = true;
|
|
if (meta?.fetchedAt !== undefined) {
|
|
draft.repositoryBranches.fetchedAtByRepositoryId[repositoryId] = meta.fetchedAt;
|
|
}
|
|
// fetchError is replaced on every successful response (empty string clears it).
|
|
draft.repositoryBranches.fetchErrorByRepositoryId[repositoryId] =
|
|
meta?.fetchError ?? undefined;
|
|
}),
|
|
setRepositoryBranchesLoading: (repositoryId, loading) =>
|
|
set((draft) => {
|
|
draft.repositoryBranches.loadingByRepositoryId[repositoryId] = loading;
|
|
}),
|
|
setRepositoryBranchesFetchError: (repositoryId, error) =>
|
|
set((draft) => {
|
|
draft.repositoryBranches.fetchErrorByRepositoryId[repositoryId] = error;
|
|
}),
|
|
setRepositoryScripts: (repositoryId, scripts) =>
|
|
set((draft) => {
|
|
draft.repositoryScripts.itemsByRepositoryId[repositoryId] = scripts;
|
|
draft.repositoryScripts.loadingByRepositoryId[repositoryId] = false;
|
|
draft.repositoryScripts.loadedByRepositoryId[repositoryId] = true;
|
|
}),
|
|
setRepositoryScriptsLoading: (repositoryId, loading) =>
|
|
set((draft) => {
|
|
draft.repositoryScripts.loadingByRepositoryId[repositoryId] = loading;
|
|
}),
|
|
clearRepositoryScripts: (repositoryId) =>
|
|
set((draft) => {
|
|
delete draft.repositoryScripts.itemsByRepositoryId[repositoryId];
|
|
delete draft.repositoryScripts.loadingByRepositoryId[repositoryId];
|
|
delete draft.repositoryScripts.loadedByRepositoryId[repositoryId];
|
|
}),
|
|
invalidateRepositories: (workspaceId) =>
|
|
set((draft) => {
|
|
draft.repositories.loadedByWorkspaceId[workspaceId] = false;
|
|
}),
|
|
});
|