"use client"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import toast from "react-hot-toast"; import { get, post } from "../../lib/api"; import Card from "./Card"; export default function TaskProcessingCard() { const queryClient = useQueryClient(); const { data: filesSuccessful, isLoading: filesSuccessfulLoading } = useQuery( { queryKey: ["files-stats-successful"], queryFn: () => get("/files/stats/successful"), } ); const { data: filesProcessedTotal, isLoading: filesProcessedLoading } = useQuery({ queryKey: ["files-stats-processed"], queryFn: () => get("/files/stats/processed"), }); const { data: taskProcessingStatus, isLoading: taskProcessingLoading, refetch: refetchTaskProcessingStatus, } = useQuery({ queryKey: ["tasks", "processing-status"], queryFn: () => get("/tasks/processing-status"), staleTime: 0, gcTime: 0, }); const { data: queueStatus } = useQuery({ queryKey: ["tasks", "queue", "status"], queryFn: () => get("/tasks/queue/status"), }); const startTaskProcessingMutation = useMutation({ mutationFn: () => post("/tasks/start-processing"), onSuccess: async () => { // Small delay to let backend update state await new Promise((resolve) => setTimeout(resolve, 200)); await refetchTaskProcessingStatus(); queryClient.invalidateQueries({ queryKey: ["tasks", "queue", "status"] }); toast.success("Task processing started"); }, onError: () => { toast.error("Failed to start task processing"); }, }); const stopTaskProcessingMutation = useMutation({ mutationFn: () => post("/tasks/stop-processing"), onSuccess: async () => { // Small delay to let backend update state await new Promise((resolve) => setTimeout(resolve, 200)); await refetchTaskProcessingStatus(); queryClient.invalidateQueries({ queryKey: ["tasks", "queue", "status"] }); toast.success("Task processing stopped"); }, onError: () => { toast.error("Failed to stop task processing"); }, }); const filesProcessed = filesSuccessful || 0; const totalProcessed = filesProcessedTotal || 0; const successRate = totalProcessed > 0 ? Math.round((filesProcessed / totalProcessed) * 100) : 0; const isTaskProcessingActive = taskProcessingStatus?.isProcessing; return (
{taskProcessingLoading ? (
) : ( {isTaskProcessingActive ? "Active" : "Idle"} )}
Task Processing
{filesSuccessfulLoading || filesProcessedLoading ? "..." : `${successRate}% success`}
{queueStatus && (
Pending
{queueStatus.pending || 0}
Active
{queueStatus.processing || 0}
Done
{queueStatus.completed || 0}
Failed
{queueStatus.failed || 0}
)}
); }