// slateMATCH React Query hooks over the tool's namespace client. Keys are prefixed with the tool name // so the three tools never collide in the shared query cache. import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import { slateApi } from './api' export function useSlateRequirements() { return useQuery({ queryKey: ['slatematch', 'requirements'], queryFn: slateApi.requirements }) } export function useSlateCandidates() { return useQuery({ queryKey: ['slatematch', 'candidates'], queryFn: slateApi.candidates }) } export function useGenerateSlateTool() { return useMutation({ mutationFn: (v: { requirementId: string; name: string }) => slateApi.generate(v.requirementId, v.name), }) } export function useSlatesFor(requirementId: string | null) { return useQuery({ queryKey: ['slatematch', 'slates', requirementId], queryFn: () => slateApi.slatesFor(requirementId as string), enabled: !!requirementId, }) } // useSlateDetail reads the stored slate: its members carry the persisted decision and reviewer note, so // the UI rehydrates from the server rather than from one time generate output or local state. export function useSlateDetail(slateId: string | null) { return useQuery({ queryKey: ['slatematch', 'detail', slateId], queryFn: () => slateApi.detail(slateId as string), enabled: !!slateId, }) } export function useSlateReadiness(slateId: string | null) { return useQuery({ queryKey: ['slatematch', 'readiness', slateId], queryFn: () => slateApi.readiness(slateId as string), enabled: !!slateId, }) } // useDecideMember records a human decision and refreshes the stored slate detail and the readiness // rollup so both recompute from the persisted slate after every approve or reject. export function useDecideMember() { const qc = useQueryClient() return useMutation({ mutationFn: (v: { slateId: string; candidateId: string; decision: 'approved' | 'rejected'; note: string }) => slateApi.decide(v.slateId, v.candidateId, v.decision, v.note), onSuccess: (_data, v) => { void qc.invalidateQueries({ queryKey: ['slatematch', 'detail', v.slateId] }) void qc.invalidateQueries({ queryKey: ['slatematch', 'readiness', v.slateId] }) }, }) }