import { useQueries, useMutation, useQueryClient } from '@tanstack/react-query'; import { Link, useNavigate } from 'react-router-dom'; import { BookOpen, History, LayoutDashboard, TrendingUp, LogOut, CheckCircle2 } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { ManualClassificationForm } from '@/components/manual-classification-form'; import { ImageClassificationForm } from '@/components/image-classification-form'; import { DiagnosisCard } from '@/components/diagnosis-card'; import { useAuthStore } from '@/store/auth-store'; import { useUiStore } from '@/store/ui-store'; import { apiClient } from '@/lib/api-client'; export function DashboardPage() { const { user } = useAuthStore(); const setUser = useAuthStore((state) => state.setUser); const { dashboardCompact, toggleDashboardCompact } = useUiStore(); const queryClient = useQueryClient(); const navigate = useNavigate(); const [diseasesQuery, summaryQuery, diagnosesQuery, classificationsQuery] = useQueries({ queries: [ { queryKey: ['diseases'], queryFn: () => apiClient.getDiseases(), }, { queryKey: ['dashboard-summary'], queryFn: () => apiClient.getDashboardSummary(), }, { queryKey: ['diagnoses'], queryFn: () => apiClient.getDiagnoses(), }, { queryKey: ['manual-classifications'], queryFn: () => apiClient.getManualClassifications(), }, ], }); const createDiagnosisMutation = useMutation({ mutationFn: async (file: File) => { return await apiClient.createDiagnosis(file); }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['diagnoses'] }); queryClient.invalidateQueries({ queryKey: ['dashboard-summary'] }); }, }); const createClassificationMutation = useMutation({ mutationFn: async (payload: Parameters[0]) => { await apiClient.createManualClassification(payload); }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['dashboard-summary'] }); queryClient.invalidateQueries({ queryKey: ['manual-classifications'] }); }, }); const logoutMutation = useMutation({ mutationFn: async () => { await apiClient.logout(); }, onSuccess: () => { setUser(null); queryClient.clear(); navigate('/login'); }, }); const diseases = diseasesQuery.data || []; const summary = summaryQuery.data; const diagnoses = diagnosesQuery.data || []; const classifications = classificationsQuery.data || []; const isLoadingData = diseasesQuery.isLoading || summaryQuery.isLoading; const hasError = diseasesQuery.error || summaryQuery.error; return (
Dashboard

ZeaVis Edu Workspace

{user?.name ? `Selamat datang, ${user.name}` : 'Pantau penyakit daun jagung dan laporkan pengamatan Anda'}

{user?.role === 'expert' && ( )}
{isLoadingData && ( Memuat data dashboard... )} {hasError && ( Gagal memuat data dashboard )} {!isLoadingData && !hasError && ( <> {summary && (
Total Penyakit
{summary.diseaseCount}
Total Diagnosis
{summary.imageClassificationCount}
Menunggu Review
{summary.needsReviewCount}
Risiko Tinggi
{summary.riskDistribution.high}
)}
Katalog Penyakit Pelajari tentang {diseases.length} penyakit daun jagung Distribusi Risiko Penyakit berdasarkan tingkat risiko {summary && (
Risiko Tinggi {summary.riskDistribution.high}
Risiko Sedang {summary.riskDistribution.medium}
Risiko Rendah {summary.riskDistribution.low}
)}
{ await createDiagnosisMutation.mutateAsync(file); }} isSubmitting={createDiagnosisMutation.isPending} latestResult={diagnoses[0] ?? null} /> { await createClassificationMutation.mutateAsync(payload); }} isSubmitting={createClassificationMutation.isPending} /> {diagnoses.length > 0 && ( Riwayat Diagnosis {diagnoses.length} diagnosis yang telah dibuat
{diagnoses.slice(0, 6).map((diagnosis) => ( ))}
)} )}
); }