import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { apiFetch } from '../lib/api'; import type { MediaAltStatus, MediaScanChunk, MediaScanResult, MediaScanStart } from '../lib/types'; interface AltTextUpdateArgs { attachment_id: number; alt_text: string; } interface AltTextUpdateResult { ok: boolean; alt?: string; status?: MediaAltStatus; reason?: string; } export function useMediaScan() { const qc = useQueryClient(); // The last persisted scan, if any — loaded once on mount so a page // refresh doesn't lose results until the user explicitly rescans. const lastScan = useQuery({ queryKey: ['media-scan'], queryFn: () => apiFetch('/media-scan'), }); // A scan runs as: one startScan() call (snapshots the attachment list, // returns its total), then repeated scanChunk() calls until one comes // back with done:true — see MediaAccessibility.tsx's runScan(). const startScan = useMutation({ mutationFn: (opts?: { signal?: AbortSignal }) => apiFetch('/media-scan/start', { method: 'POST', signal: opts?.signal }), }); const scanChunk = useMutation({ mutationFn: (opts?: { signal?: AbortSignal }) => apiFetch('/media-scan/chunk', { method: 'POST', signal: opts?.signal }), onSuccess: (data) => { if (data.done) qc.setQueryData(['media-scan'], data); }, }); const applyAltText = useMutation({ mutationFn: ({ attachment_id, alt_text }: AltTextUpdateArgs) => apiFetch('/media-alt-text', { method: 'POST', body: JSON.stringify({ attachment_id, alt_text }), }), }); return { lastScan, startScan, scanChunk, applyAltText }; }