import { FormEvent, useMemo, useState } from "react"; import { useSearchParams } from "react-router-dom"; import { useMutation, useQueries, useQueryClient } from "@tanstack/react-query"; import type { DiseaseSlug } from "@zeavis/shared"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { DiagnosisStatusBadge } from "@/components/diagnosis-status-badge"; import { apiClient } from "@/lib/api-client"; export function ExpertReviewsPage() { const [searchParams, setSearchParams] = useSearchParams(); const selectedId = searchParams.get("diagnosis"); const [verdict, setVerdict] = useState<"verified" | "corrected">("verified"); const [correctedDiseaseSlug, setCorrectedDiseaseSlug] = useState< DiseaseSlug | "" >(""); const [notes, setNotes] = useState(""); const queryClient = useQueryClient(); const [reviewsQuery, diseasesQuery] = useQueries({ queries: [ { queryKey: ["expert-reviews"], queryFn: () => apiClient.getExpertReviews(), }, { queryKey: ["diseases"], queryFn: () => apiClient.getDiseases() }, ], }); const reviews = reviewsQuery.data || []; const diseases = diseasesQuery.data || []; const selected = useMemo( () => reviews.find((item) => item.id === selectedId) ?? reviews[0] ?? null, [reviews, selectedId], ); const mutation = useMutation({ mutationFn: () => apiClient.reviewDiagnosis(selected!.id, { verdict, correctedDiseaseSlug: verdict === "corrected" ? correctedDiseaseSlug || undefined : undefined, notes, }), onSuccess: () => { setNotes(""); setVerdict("verified"); setCorrectedDiseaseSlug(""); queryClient.invalidateQueries({ queryKey: ["expert-reviews"] }); queryClient.invalidateQueries({ queryKey: ["dashboard-summary"] }); }, }); async function handleSubmit(event: FormEvent) { event.preventDefault(); if (!selected) return; await mutation.mutateAsync(); } const isLoading = reviewsQuery.isPending || diseasesQuery.isPending; return (

Tinjauan Pakar

Tinjau hasil diagnosa dari scan yang telah dilakukan dan berikan feedback untuk meningkatkan akurasi sistem AI ZeaVis Edu

{/* Left: List of reviews */}

Daftar Diagnosis

{reviews.length}
{isLoading ? (

Memuat diagnosis...

) : reviews.length === 0 ? (

Tidak ada diagnosis yang menunggu review

) : ( reviews.map((review) => ( )) )}
{/* Right: Detail and form */}
{isLoading ? ( Memuat diagnosis... ) : selected ? ( <> {/* Detail card */} {selected.disease?.commonName ?? "Diagnosis gagal"} {new Date(selected.createdAt).toLocaleString("id-ID")} {`Gambar
Status
Confidence {selected.confidence === null ? "N/A" : `${(selected.confidence * 100).toFixed(1)}%`}
{selected.predictions.length > 0 && (

Prediksi Teratas

{selected.predictions.map((pred) => (
{pred.modelLabel} {(pred.confidence * 100).toFixed(1)}%
))}
)}
{/* Review form */} Review Pakar
{verdict === "corrected" && (
)}