import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { assignFaceToPerson, listFacesForMedia, type AssignFacePayload, } from "@/services/face-service"; import type { FaceRegion } from "@/domain/types"; const FACE_KEY = ["faces"]; const PERSON_KEY = ["people"]; /** * Query hook to fetch all faces for a specific media item. */ export const useListMediaFaces = (mediaId: string) => { return useQuery({ queryKey: [FACE_KEY, "list", mediaId], queryFn: () => listFacesForMedia(mediaId), enabled: !!mediaId, }); }; /** * Mutation hook to assign a face to a person. */ export const useAssignFace = (faceId: string, mediaId: string) => { const queryClient = useQueryClient(); return useMutation({ mutationFn: (payload: AssignFacePayload) => assignFaceToPerson(faceId, payload), onSuccess: (updatedFace) => { // Update the list of faces for this media queryClient.setQueryData( [FACE_KEY, "list", mediaId], (oldData: FaceRegion[] | undefined) => { return oldData?.map((face) => face.id === faceId ? updatedFace : face, ); }, ); // Invalidate the media list for the person if (updatedFace.person_id) { queryClient.invalidateQueries({ queryKey: [PERSON_KEY, "details", updatedFace.person_id, "media"], }); } }, }); };