1"use client";
2
3
6import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
7import { workspaceApi } from "@/lib/api";
8import type { Workspace, WorkspaceRole } from "@/lib/types";
9
10export function useWorkspaces() {
11 return useQuery({
12 queryKey: ["workspaces"],
13 queryFn: () => workspaceApi.list()
14 });
15}
16
17
28export function useWorkspace(slugOrId: string) {
29 return useQuery({
30 queryKey: ["workspaces", slugOrId],
31 queryFn: () => workspaceApi.get(slugOrId),
32 enabled: slugOrId.length > 0 && slugOrId !== "default"
33 });
34}
35
36export function useWorkspaceMembers(workspaceId: string) {
37 return useQuery({
38 queryKey: ["workspaces", workspaceId, "members"],
39 queryFn: () => workspaceApi.members(workspaceId),
40 enabled: workspaceId.length > 0
41 });
42}
43
44export function useCreateWorkspace() {
45 const qc = useQueryClient();
46 return useMutation({
47 mutationFn: (input: { name: string; emoji?: string }) => workspaceApi.create(input.name, input.emoji),
48 onSuccess: () => qc.invalidateQueries({ queryKey: ["workspaces"] })
49 });
50}
51
52export function useUpdateWorkspace(workspaceId: string) {
53 const qc = useQueryClient();
54 return useMutation({
55 mutationFn: (patch: Partial<Pick<Workspace, "name" | "emoji">>) => workspaceApi.update(workspaceId, patch),
56 onSuccess: (ws) => {
57 qc.setQueryData(["workspaces", ws.id], ws);
58 qc.invalidateQueries({ queryKey: ["workspaces"] });
59 }
60 });
61}
62
63export function useInviteMember(workspaceId: string) {
64 const qc = useQueryClient();
65 return useMutation({
66 mutationFn: (input: { email: string; role: WorkspaceRole }) => workspaceApi.invite(workspaceId, input.email, input.role),
67 onSuccess: () => qc.invalidateQueries({ queryKey: ["workspaces", workspaceId, "invites"] })
68 });
69}
70