"use client" import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query" import api from "@/lib/api" import type { JobListResponse, BatchProgressResponse } from "@/lib/types" const PAGE_SIZE = 25 export function useJobs(status?: string, offset = 0) { return useQuery({ queryKey: ["admin", "jobs", status, offset], queryFn: async () => { const { data } = await api.get("/jobs", { params: { status, limit: PAGE_SIZE, offset }, }) return data }, refetchInterval: 5000, }) } export { PAGE_SIZE as JOBS_PAGE_SIZE } export function useEnqueueJob() { const qc = useQueryClient() return useMutation({ mutationFn: async (body: { job_type: string priority?: number payload?: Record target_asset_id?: string batch_id?: string }) => { const { data } = await api.post("/jobs", body) return data }, onSuccess: () => qc.invalidateQueries({ queryKey: ["admin", "jobs"] }), }) } export function useStartJob() { const qc = useQueryClient() return useMutation({ mutationFn: async (jobId: string) => { await api.post(`/jobs/${jobId}/start`) }, onSuccess: () => qc.invalidateQueries({ queryKey: ["admin", "jobs"] }), }) } export function useCompleteJob() { const qc = useQueryClient() return useMutation({ mutationFn: async ({ jobId, result, }: { jobId: string result: Record }) => { await api.post(`/jobs/${jobId}/complete`, { result }) }, onSuccess: () => qc.invalidateQueries({ queryKey: ["admin", "jobs"] }), }) } export function useFailJob() { const qc = useQueryClient() return useMutation({ mutationFn: async ({ jobId, error }: { jobId: string; error: string }) => { await api.post(`/jobs/${jobId}/fail`, { error }) }, onSuccess: () => qc.invalidateQueries({ queryKey: ["admin", "jobs"] }), }) } export function useBatchProgress(batchId: string) { return useQuery({ queryKey: ["admin", "batch", batchId], queryFn: async () => { const { data } = await api.get( `/jobs/batches/${batchId}`, ) return data }, enabled: !!batchId, refetchInterval: 3000, }) }