mirror of
https://github.com/multica-ai/multica.git
synced 2026-06-17 03:38:32 +02:00
47 lines
1.7 KiB
TypeScript
47 lines
1.7 KiB
TypeScript
import { useMutation, useQueryClient } from "@tanstack/react-query";
|
|
import type { Workspace } from "../types";
|
|
import { api } from "../api";
|
|
import { workspaceKeys } from "./queries";
|
|
|
|
export function useCreateWorkspace() {
|
|
const qc = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: (data: { name: string; slug: string; description?: string }) =>
|
|
api.createWorkspace(data),
|
|
// Seed the workspace list cache BEFORE callers navigate to /{newWs.slug}/issues.
|
|
// The destination [workspaceSlug]/layout queries by slug from this cache;
|
|
// without seeding, it would briefly show "loading" before the background
|
|
// invalidation completes. TanStack Query guarantees this onSuccess runs
|
|
// before mutateAsync's resolver / before any callback-style onSuccess
|
|
// passed to mutate(), so any caller that navigates after the mutation
|
|
// resolves will see the seeded data synchronously. Switching workspaces
|
|
// is pure navigation now — no imperative store writes needed.
|
|
onSuccess: (newWs) => {
|
|
qc.setQueryData(workspaceKeys.list(), (old: Workspace[] = []) => [...old, newWs]);
|
|
},
|
|
onSettled: () => {
|
|
qc.invalidateQueries({ queryKey: workspaceKeys.list() });
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useLeaveWorkspace() {
|
|
const qc = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: (workspaceId: string) => api.leaveWorkspace(workspaceId),
|
|
onSettled: () => {
|
|
qc.invalidateQueries({ queryKey: workspaceKeys.list() });
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useDeleteWorkspace() {
|
|
const qc = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: (workspaceId: string) => api.deleteWorkspace(workspaceId),
|
|
onSettled: () => {
|
|
qc.invalidateQueries({ queryKey: workspaceKeys.list() });
|
|
},
|
|
});
|
|
}
|