swarm / companies/starter/work/project/src/console/components/DataQualityDashboard.tsx

raw file 1626 bytes
import React, { useEffect, useState } from "react";
import { fetchJson } from "../api/http";

interface CustomerData {
    customer_id: string;
    customer_name: string;
    total_rows: number;
    last_successful_sync: string;
    drift_status: string;
}

const REFRESH_INTERVAL_MS = 30_000;

export const DataQualityDashboard: React.FC = () => {
    const [data, setData] = useState<CustomerData[]>([]);
    const [error, setError] = useState<string | null>(null);
    const [lastUpdated, setLastUpdated] = useState<Date>(new Date());

    useEffect(() => {
        let isMounted = true;

        const load = async () => {
            try {
                const res = await fetchJson<CustomerData[]>("/api/data-quality");
                if (isMounted) {
                    setData(res);
                    setError(null);
                    setLastUpdated(new Date());
                }
            } catch (e) {
                if (isMounted) {
                    setError(e instanceof Error ? e.message : "Unknown error");
                }
            }
        };

        load();
        const interval = setInterval(load, REFRESH_INTERVAL_MS);

        return () => {
            isMounted = false;
            clearInterval(interval);
        };
    }, []);

    return (
        <div className="p-4">
            <h1 className="text-2xl font-bold mb-2">Data Quality Dashboard</h1>
            <p className="text-sm text-gray-500 mb-4">
                Last updated: {lastUpdated.toLocaleTimeString()} | Auto-refresh every 30s
            </p>
            {error && <div className="text-red-500 mb-4">Error: {