import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import { assignmentApi } from './assignmentApi' export function useAssignment(appId: string | null) { return useQuery({ queryKey: ['recruitmatch', 'assignment', appId], queryFn: () => assignmentApi.get(appId as string), enabled: !!appId, }) } export function usePlacements(status?: string) { return useQuery({ queryKey: ['recruitmatch', 'placements', status ?? ''], queryFn: () => assignmentApi.placements(status), }) } // A placement changes the assignment, the pipeline board, the job order's seats and the dashboard, // because creating one moves the application's stage. All four are invalidated. function useInvalidate(appId?: string) { const qc = useQueryClient() return () => { void qc.invalidateQueries({ queryKey: ['recruitmatch', 'assignment', appId] }) void qc.invalidateQueries({ queryKey: ['recruitmatch', 'pipeline'] }) void qc.invalidateQueries({ queryKey: ['recruitmatch', 'placements'] }) void qc.invalidateQueries({ queryKey: ['recruitmatch', 'requisitions'] }) void qc.invalidateQueries({ queryKey: ['recruitmatch', 'application', appId] }) void qc.invalidateQueries({ queryKey: ['recruitmatch', 'dashboard'] }) } } export function useScheduleInterview(appId: string) { const inv = useInvalidate(appId) return useMutation({ mutationFn: (v: Record) => assignmentApi.scheduleInterview(appId, v), onSuccess: inv, }) } export function useUpdateInterview(appId: string) { const inv = useInvalidate(appId) return useMutation({ mutationFn: (v: { id: string; patch: Record }) => assignmentApi.updateInterview(v.id, v.patch), onSuccess: inv, }) } export function useExtendOffer(appId: string) { const inv = useInvalidate(appId) return useMutation({ mutationFn: (v: Record) => assignmentApi.extendOffer(appId, v), onSuccess: inv, }) } export function useRespondToOffer(appId: string) { const inv = useInvalidate(appId) return useMutation({ mutationFn: (v: { id: string; expected_status: string; status: string; decline_reason?: string }) => assignmentApi.respondToOffer(v.id, { expected_status: v.expected_status, status: v.status, decline_reason: v.decline_reason, }), onSuccess: inv, }) } export function useCreatePlacement(appId: string) { const inv = useInvalidate(appId) return useMutation({ mutationFn: (v: Record) => assignmentApi.createPlacement(appId, v), onSuccess: inv, }) } export function useEndPlacement(appId: string) { const inv = useInvalidate(appId) return useMutation({ mutationFn: (v: { id: string; patch: Record }) => assignmentApi.endPlacement(v.id, v.patch), onSuccess: inv, }) }