import { useQuery } from "@tanstack/react-query"; import { api } from "@/lib/api"; import { useFinanceData } from "@/context/FinanceDataContext"; import { Button } from "@/components/ui/button"; import { ToolCard, QueryError, useToolAction } from "./shared"; type Status = { provider: string; status: string; attemptedAt: string; succeededAt: string | null; error: string | null; stale: boolean }; export function SyncTools() { const query = useQuery({ queryKey: ["enhanced", "sync-status"], queryFn: () => api.enhanced.get("sync-status"), refetchInterval: 15000 }); const { syncPlaid, plaidItems } = useFinanceData(); const action = useToolAction(); return {!query.isPending && !query.error && !query.data?.length &&

No sync attempts recorded yet.

} {query.data?.map(s =>

{s.provider}: {s.status}{s.stale ? " · needs refresh" : ""}

Last attempt: {new Date(s.attemptedAt).toLocaleString()}. Last complete success: {s.succeededAt ? new Date(s.succeededAt).toLocaleString() : "none"}.

{s.error &&

{s.error}

}
)} {plaidItems.filter(item => item.sync_error).map(item =>

{item.institution_name || "Linked bank"}: {item.requires_reconnect ? "Sign-in required" : "Sync needs attention"}

{item.sync_error}

{item.requires_reconnect && Reconnect this bank}
)}

Retries update saved bank records by their provider IDs. A failed source does not remove its saved data.

{plaidItems.some(item => item.requires_reconnect) &&

Banks requiring sign-in must be reconnected below before they can sync again.

}
; }