import { useMutation, useQueryClient } from "@tanstack/react-query"; import type { CreateCandidate, UpdateCandidate } from "../../shared/types"; import { apiDelete, apiPatch, apiPost, apiPut } from "../lib/api"; interface CandidateResponse { id: number; threadId: number; name: string; weightGrams: number | null; priceCents: number | null; categoryId: number; notes: string | null; productUrl: string | null; imageFilename: string | null; status: "researching" | "ordered" | "arrived"; pros: string | null; cons: string | null; createdAt: string; updatedAt: string; } export function useCreateCandidate(threadId: number) { const queryClient = useQueryClient(); return useMutation({ mutationFn: (data: CreateCandidate & { imageFilename?: string }) => apiPost(`/api/threads/${threadId}/candidates`, data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["threads", threadId] }); queryClient.invalidateQueries({ queryKey: ["threads"] }); }, }); } export function useUpdateCandidate(threadId: number) { const queryClient = useQueryClient(); return useMutation({ mutationFn: ({ candidateId, ...data }: UpdateCandidate & { candidateId: number; imageFilename?: string }) => apiPut( `/api/threads/${threadId}/candidates/${candidateId}`, data, ), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["threads", threadId] }); queryClient.invalidateQueries({ queryKey: ["threads"] }); }, }); } export function useDeleteCandidate(threadId: number) { const queryClient = useQueryClient(); return useMutation({ mutationFn: (candidateId: number) => apiDelete<{ success: boolean }>( `/api/threads/${threadId}/candidates/${candidateId}`, ), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["threads", threadId] }); queryClient.invalidateQueries({ queryKey: ["threads"] }); }, }); } export function useReorderCandidates(threadId: number) { const queryClient = useQueryClient(); return useMutation({ mutationFn: (data: { orderedIds: number[] }) => apiPatch<{ success: boolean }>( `/api/threads/${threadId}/candidates/reorder`, data, ), onSettled: () => { queryClient.invalidateQueries({ queryKey: ["threads", threadId] }); }, }); }