import React, { useRef, useState } from "react"; import { useNavigate, Link } from "react-router-dom"; import { useMutation, useQueryClient, useQuery } from "@tanstack/react-query"; import { apiClient } from "@/lib/api-client"; import { Modal } from "@/components/ui/modal"; import type { DiagnosisRecord } from "@zeavis/shared"; export function ScanPage() { const [fileName, setFileName] = useState(null); const inputRef = useRef(null); const navigate = useNavigate(); const queryClient = useQueryClient(); const mutation = useMutation({ mutationFn: (file: File) => apiClient.createDiagnosis(file), onSuccess: (diagnosis) => { queryClient.invalidateQueries({ queryKey: ["diagnoses"] }); // show preview modal instead of immediate navigation setDiagnosisPreview(diagnosis); setPreviewOpen(true); }, }); const handleFile = (f?: File) => { if (!f) return; setFileName(f.name); mutation.mutate(f); }; const [previewOpen, setPreviewOpen] = useState(false); const [diagnosisPreview, setDiagnosisPreview] = useState(null); const diagnosesQuery = useQuery({ queryKey: ["diagnoses"], queryFn: () => apiClient.getDiagnoses(), enabled: previewOpen, }); return (

Scan Tanaman

handleFile(e.target.files?.[0])} />
{mutation.isPending && (
Mengunggah...
)} {mutation.isError && (
{mutation.error instanceof Error ? mutation.error.message : String(mutation.error) || "Upload gagal"}
)}
{ setPreviewOpen(false); setDiagnosisPreview(null); }} title={diagnosisPreview?.predictedDiseaseSlug ?? "Hasil Diagnosis"} size="sm" footer={ diagnosisPreview && (
) } > {diagnosisPreview ? (
{diagnosisPreview.imageUrl && ( hasil )}

Prediksi:{" "} {diagnosisPreview.predictedDiseaseSlug}

Confidence:{" "} {Math.round((diagnosisPreview.confidence ?? 0) * 100)}%

Daftar Diagnosis Terbaru

{diagnosesQuery.isLoading && (
Memuat daftar...
)} {diagnosesQuery.isError && (
Gagal memuat daftar diagnosis
)} {!diagnosesQuery.isLoading && !diagnosesQuery.isError && (
{(diagnosesQuery.data ?? []).slice(0, 5).map((d) => (
thumb
{d.disease?.commonName ?? d.predictedDiseaseSlug}
{new Date(d.createdAt).toLocaleString("id-ID")}
Lihat
))}
)}
) : null}
); }