import { useState, useCallback } from 'react'; import { Upload, FileSpreadsheet, AlertTriangle } from 'lucide-react'; import { api } from '../../api/client'; import { useStore } from '../../store/useStore'; import { Panel } from '../common/Panel'; import { LoadingSpinner } from '../common/LoadingSpinner'; import { DataTable } from './DataTable'; import { FilterPanel } from './FilterPanel'; import type { ColumnStat, DataResponse } from '../../types'; export function DataExplorer() { const { data, columnStats, setData, dataLoaded } = useStore(); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [activeData, setActiveData] = useState(null); const [activeStats, setActiveStats] = useState([]); const displayData = activeData ?? data; const displayStats = activeStats.length > 0 ? activeStats : columnStats; const handleUpload = async (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (!file) return; setLoading(true); setError(null); try { const res = await api.uploadFile(file); setData(res.data, res.column_stats); setActiveData(null); setActiveStats([]); } catch (err: unknown) { setError(err instanceof Error ? err.message : 'Upload failed'); } finally { setLoading(false); } }; const handleFilter = useCallback( async ( filters: { column: string; type: string; values?: string[]; min_val?: number; max_val?: number; pattern?: string; }[] ) => { if (filters.length === 0) { setActiveData(null); setActiveStats([]); setError(null); return; } setLoading(true); setError(null); try { const res = await api.filterData(filters); setActiveData(res.data); setActiveStats(res.column_stats); } catch (err: unknown) { setError(err instanceof Error ? err.message : 'Filtering failed'); } finally { setLoading(false); } }, [] ); return (
{dataLoaded && displayData && (
{displayData.returned_rows.toLocaleString()} / {displayData.total_rows.toLocaleString()} rows {displayData.columns.length} columns
)}
{error && (
{error}
)} {loading && } {/* Filters */} {dataLoaded && displayStats.length > 0 && ( )} {/* Column Stats */} {dataLoaded && displayStats.length > 0 && (
{displayStats.map((col) => (

{col.name}

{col.dtype} | {col.unique} unique

{col.top_values && col.top_values.length > 0 && (
{col.top_values.slice(0, 3).map((tv) => (
{tv.value.slice(0, 15)}
))}
)}
))}
)} {/* Data Table */} {dataLoaded && displayData && ( )}
); }