import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import { clientsApi } from './clientsApi' type ListParams = { status?: string; q?: string; owner?: string } export function useClients(p: ListParams) { return useQuery({ queryKey: ['recruitmatch', 'clients', p.status ?? '', p.q ?? '', p.owner ?? ''], queryFn: () => clientsApi.list(p), }) } export function useClient(id: string | null) { return useQuery({ queryKey: ['recruitmatch', 'client', id], queryFn: () => clientsApi.get(id as string), enabled: !!id, }) } // Every mutation invalidates BOTH the list and the detail. An ownership change alters the row shown in // the list as well as the one on screen, and leaving the list stale would show a client as unassigned // seconds after someone claimed it. function useInvalidate() { const qc = useQueryClient() return (id?: string) => { void qc.invalidateQueries({ queryKey: ['recruitmatch', 'clients'] }) if (id) void qc.invalidateQueries({ queryKey: ['recruitmatch', 'client', id] }) } } export function useCreateClient() { const inv = useInvalidate() return useMutation({ mutationFn: clientsApi.create, onSuccess: () => inv() }) } export function useUpdateClient() { const inv = useInvalidate() return useMutation({ mutationFn: (v: { id: string; patch: Record }) => clientsApi.update(v.id, v.patch), onSuccess: (_d, v) => inv(v.id), }) } export function useClaimClient() { const inv = useInvalidate() return useMutation({ mutationFn: (id: string) => clientsApi.claim(id), onSuccess: (_d, id) => inv(id) }) } export function useReleaseClient() { const inv = useInvalidate() return useMutation({ mutationFn: (id: string) => clientsApi.release(id), onSuccess: (_d, id) => inv(id) }) } export function useAddContact() { const inv = useInvalidate() return useMutation({ mutationFn: (v: { clientId: string; patch: Record }) => clientsApi.addContact(v.clientId, v.patch), onSuccess: (_d, v) => inv(v.clientId), }) } export function useUpdateContact() { const inv = useInvalidate() return useMutation({ mutationFn: (v: { id: string; clientId: string; patch: Record }) => clientsApi.updateContact(v.id, v.patch), onSuccess: (_d, v) => inv(v.clientId), }) }