-
-
-
-
-
-
-
-
-
{disease.commonName}
-
{disease.label}
-
-
-
-
{disease.summary}
-
-
-
-
- Deskripsi
-
-
- {disease.description}
-
-
-
-
-
- Gejala
- Tanda-tanda yang perlu diperhatikan
-
-
-
- {disease.symptoms.map((symptom, index) => (
- -
-
- {symptom}
-
- ))}
-
-
-
-
-
-
- Rekomendasi Penanganan
- Langkah-langkah untuk mengendalikan penyakit
-
-
-
- {disease.recommendations.map((recommendation, index) => (
- -
-
- {index + 1}
-
- {recommendation}
-
- ))}
-
-
-
-
-
-
-
-
+
+
+
+
-
+
+
+
+
+
{disease.commonName}
+
{disease.label}
+
+
+
+
{disease.summary}
+
+
+
+
+ Deskripsi
+
+
+ {disease.description}
+
+
+
+
+
+ Gejala
+ Tanda-tanda yang perlu diperhatikan
+
+
+
+ {disease.symptoms.map((symptom, index) => (
+ -
+
+ {symptom}
+
+ ))}
+
+
+
+
+
+
+ Rekomendasi Penanganan
+ Langkah-langkah untuk mengendalikan penyakit
+
+
+
+ {disease.recommendations.map((recommendation, index) => (
+ -
+
+ {index + 1}
+
+ {recommendation}
+
+ ))}
+
+
+
+
+
+
+
+
+
);
}
diff --git a/apps/web/src/pages/expert-reviews-page.tsx b/apps/web/src/pages/expert-reviews-page.tsx
index 48ae300..a2f8117 100644
--- a/apps/web/src/pages/expert-reviews-page.tsx
+++ b/apps/web/src/pages/expert-reviews-page.tsx
@@ -1,7 +1,7 @@
import { FormEvent, useMemo, useState } from 'react';
-import { Link, useSearchParams } from 'react-router-dom';
+import { useSearchParams } from 'react-router-dom';
import { useMutation, useQueries, useQueryClient } from '@tanstack/react-query';
-import type { DiseaseSlug, DiagnosisStatus } from '@zeavis/shared';
+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';
@@ -24,14 +24,18 @@ export function ExpertReviewsPage() {
const reviews = reviewsQuery.data || [];
const diseases = diseasesQuery.data || [];
- const selected = useMemo(() => reviews.find((item) => item.id === selectedId) ?? reviews[0] ?? null, [reviews, selectedId]);
+ 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,
- }),
+ mutationFn: () =>
+ apiClient.reviewDiagnosis(selected!.id, {
+ verdict,
+ correctedDiseaseSlug: verdict === 'corrected' ? correctedDiseaseSlug || undefined : undefined,
+ notes,
+ }),
onSuccess: () => {
setNotes('');
setVerdict('verified');
@@ -47,244 +51,224 @@ export function ExpertReviewsPage() {
await mutation.mutateAsync();
}
- const statusLabel = (status: DiagnosisStatus) => {
- switch (status) {
- case 'ai_verified': return 'Terverifikasi AI';
- case 'needs_review': return 'Menunggu Review';
- case 'expert_verified': return 'Diverifikasi Pakar';
- case 'expert_corrected': return 'Dikoreksi Pakar';
- case 'failed': return 'Gagal';
- }
- };
+ const isLoading = reviewsQuery.isPending || diseasesQuery.isPending;
return (
-
-
-
-
-
Review Pakar
-
Diagnosis Menunggu Review
-
-
-
-
+
+
+
+
Review Pakar
+
Diagnosis Menunggu Review
-
+
-
-
- {/* Left: List of reviews */}
-
-
-
Daftar Diagnosis
- {reviews.length}
-
-
-
- {reviewsQuery.isPending || diseasesQuery.isPending ? (
-
Memuat diagnosis...
- ) : reviews.length === 0 ? (
-
Tidak ada diagnosis yang menunggu review
- ) : (
- reviews.map((review) => (
-
- ))
- )}
-
+
+ {/* Left: List of reviews */}
+
+
+
Daftar Diagnosis
+ {reviews.length}
- {/* Right: Detail and form */}
-
- {reviewsQuery.isPending || diseasesQuery.isPending ? (
-
-
- Memuat diagnosis...
-
-
- ) : selected ? (
- <>
- {/* Detail card */}
-
-
- {selected.disease?.commonName ?? 'Diagnosis gagal'}
-
- {new Date(selected.createdAt).toLocaleString('id-ID')}
-
-
-
-
-
-
-
- Status
-
-
-
- Confidence
-
- {selected.confidence === null ? 'N/A' : `${(selected.confidence * 100).toFixed(1)}%`}
-
-
-
-
- {/* Top predictions */}
- {selected.predictions.length > 0 && (
-
-
Prediksi Teratas
-
- {selected.predictions.map((pred) => (
-
- {pred.modelLabel}
- {(pred.confidence * 100).toFixed(1)}%
-
- ))}
-
-
- )}
-
-
-
- {/* Review form */}
-
-
- Review Pakar
-
-
-
-
-
- >
+
+ {isLoading ? (
+
Memuat diagnosis...
+ ) : reviews.length === 0 ? (
+
Tidak ada diagnosis yang menunggu review
) : (
-
-
- Tidak ada diagnosis yang tersedia untuk 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')}
+
+
+
+
+
+
+
+ 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
+
+
+
+
+
+ >
+ ) : (
+
+
+ Tidak ada diagnosis yang tersedia untuk review
+
+
+ )}
+
-
+
);
}