import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import type { AgentCheckCreate, ScheduleBoard, ScheduledJob, ScheduledJobRun, ScheduleRunNowResult, ScheduleUpdate, } from "@umt/contracts"; import { apiData } from "~/lib/api.ts"; import { qk } from "~/lib/query-keys.ts"; // 定时任务看板(W7-C):GET /schedules 一次取全部卡片;写操作成功后整块失效(SSE schedule.changed 也会触发)。 const AREA = "schedules"; export function useScheduleBoard() { return useQuery({ queryKey: qk.list(AREA), queryFn: ({ signal }) => apiData("/schedules", { signal }), // SSE 是主路径,30 秒兜底 refetchInterval: 30_000, }); } export function useScheduleRuns(id: string | null, enabled = true) { return useQuery({ queryKey: qk.sub(AREA, "runs", id ?? ""), queryFn: ({ signal }) => apiData<{ items: ScheduledJobRun[] }>("/schedules/{id}/runs", { pathParams: { id: id ?? "" }, params: { limit: 50 }, signal, }), enabled: !!id && enabled, }); } function useInvalidate() { const qc = useQueryClient(); return () => qc.invalidateQueries({ queryKey: qk.all(AREA) }); } export function useUpdateSchedule() { const invalidate = useInvalidate(); return useMutation({ mutationFn: ({ id, body }: { id: string; body: ScheduleUpdate }) => apiData("/schedules/{id}", { method: "PATCH", pathParams: { id }, body }), onSettled: invalidate, }); } export function useRunScheduleNow() { const invalidate = useInvalidate(); return useMutation({ mutationFn: ({ id }: { id: string }) => apiData("/schedules/{id}/run-now", { method: "POST", pathParams: { id } }), onSettled: invalidate, }); } export function useSkipSchedule() { const invalidate = useInvalidate(); return useMutation({ mutationFn: ({ id }: { id: string }) => apiData("/schedules/{id}/skip", { method: "POST", pathParams: { id } }), onSettled: invalidate, }); } export function useCreateAgentCheck() { const invalidate = useInvalidate(); return useMutation({ mutationFn: (body: AgentCheckCreate) => apiData("/schedules", { method: "POST", body }), onSettled: invalidate, }); } export function useDeleteSchedule() { const invalidate = useInvalidate(); return useMutation({ mutationFn: ({ id }: { id: string }) => apiData<{ ok: true }>("/schedules/{id}", { method: "DELETE", pathParams: { id } }), onSettled: invalidate, }); }