+
closeOnBackdrop && onClose()}
+ />
+
+
+ {title ? {title} : null}
+
+
{children}
+
+ {footer ?? (
+
+ Tutup
+
+ )}
+
+
+
+ );
+}
diff --git a/apps/web/src/data/mock-diseases.ts b/apps/web/src/data/mock-diseases.ts
new file mode 100644
index 0000000..06d0ea4
--- /dev/null
+++ b/apps/web/src/data/mock-diseases.ts
@@ -0,0 +1,61 @@
+export const mockDiseases = [
+ {
+ id: "nlb",
+ name: "Hawar Daun",
+ slug: "hawar-daun",
+ severity: "Tinggi",
+ imageUrl: "https://via.placeholder.com/320x180?text=Hawar+Daun",
+ pathogen: "Exserohilum turcicum",
+ description:
+ "Penyakit jamur yang menyebabkan lesi pada daun dan dapat menurunkan hasil panen.",
+ symptoms: [
+ "Lesi lonjong berbentuk cerutu, 2.5 - 15 cm",
+ "Warna abu-kehijauan berkembang menjadi coklat -abu",
+ "Nekrosis parah pada seluruh permukaan daun",
+ ],
+ prevention:
+ "Gunakan varietas tahan, rotasi tanaman, dan hapus sisa tanaman terinfeksi.",
+ },
+ {
+ id: "rust",
+ name: "Karat Daun",
+ slug: "karat-daun",
+ imageUrl: "https://via.placeholder.com/320x180?text=Karat+Daun",
+ pathogen: "Puccinia spp.",
+ severity: "Sedang",
+ description:
+ "Pustulan oranye pada permukaan daun yang dapat mengurangi fotosintesis.",
+ symptoms: [
+ "Pustula oranye pada permukaan daun",
+ "Daun menguning dan rontok pada serangan berat",
+ ],
+ prevention:
+ "Hindari kelembapan tinggi, gunakan fungisida bila perlu, dan perbaiki sirkulasi udara.",
+ },
+ {
+ id: "spot",
+ name: "Bercak Abu-abu",
+ slug: "bercak-abu-abu",
+ imageUrl: "https://via.placeholder.com/320x180?text=Bercak+Abu-abu",
+ pathogen: "Cercospora spp.",
+ severity: "Rendah",
+ description:
+ "Bercak kecil berwarna abu-abu yang umumnya tidak menyebabkan kematian tanaman.",
+ symptoms: [
+ "Bercak kecil bundar hingga tidak beraturan",
+ "Daun kering pada area bercak",
+ ],
+ prevention:
+ "Praktek sanitasi, buang daun yang berat terinfeksi, dan pemantauan rutin.",
+ },
+ {
+ id: "healthy",
+ name: "Daun Sehat",
+ slug: "daun-sehat",
+ imageUrl: "https://via.placeholder.com/320x180?text=Daun+Sehat",
+ severity: "Sehat",
+ description: "Daun tanpa tanda penyakit.",
+ symptoms: [],
+ prevention: "-",
+ },
+];
diff --git a/apps/web/src/env.d.ts b/apps/web/src/env.d.ts
new file mode 100644
index 0000000..21056aa
--- /dev/null
+++ b/apps/web/src/env.d.ts
@@ -0,0 +1,4 @@
+declare module "*.jpg";
+declare module "*.jpeg";
+declare module "*.png";
+declare module "*.svg";
diff --git a/apps/web/src/pages/dashboard-page.tsx b/apps/web/src/pages/dashboard-page.tsx
index 68748ab..aadf457 100644
--- a/apps/web/src/pages/dashboard-page.tsx
+++ b/apps/web/src/pages/dashboard-page.tsx
@@ -1,118 +1,116 @@
-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';
+import { useQuery } from "@tanstack/react-query";
+import { Link } from "react-router-dom";
+import { BookOpen, ChevronRight, Pill, Shield, Scan } from "lucide-react";
+import { Button } from "@/components/ui/button";
+import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
+import { useUiStore } from "@/store/ui-store";
+import { apiClient } from "@/lib/api-client";
+import bg from "@/assets/images/dashboard-bg.png";
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 { dashboardCompact } = useUiStore();
+ const summaryQuery = useQuery({
+ queryKey: ["dashboard-summary"],
+ queryFn: () => apiClient.getDashboardSummary(),
});
- 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;
+ const missionCards = [
+ {
+ icon: Scan,
+ title: "Deteksi Otomatis",
+ description:
+ "Upload foto daun jagung dan AI kami akan mengidentifikasi penyakit secara instan.",
+ accent: "text-lime-600",
+ },
+ {
+ icon: BookOpen,
+ title: "Modul Edukasi",
+ description:
+ "Informasi detail tentang gejala, penyebab, dan dampak setiap penyakit daun jagung.",
+ accent: "text-amber-600",
+ },
+ {
+ icon: Shield,
+ title: "Panduan Pencegahan",
+ description:
+ "Strategi pencegahan berbasis sains untuk melindungi tanaman Anda dari infeksi.",
+ accent: "text-blue-600",
+ },
+ {
+ icon: Pill,
+ title: "Rekomendasi Obat",
+ description:
+ "Saran fungisida dan perawatan mandiri yang tepat sesuai jenis penyakit.",
+ accent: "text-violet-600",
+ },
+ ];
+
+ const diseasesQuick = [
+ { name: "Hawar Daun", sci: "Northern Leaf Blight", color: "#b91c1c" },
+ { name: "Karat Daun", sci: "Common Rust", color: "#d97706" },
+ { name: "Bercak Abu-abu", sci: "Gray Leaf Spot", color: "#6b7280" },
+ { name: "Daun Sehat", sci: "Healthy", color: "#16a34a" },
+ ];
+
+ const isLoadingData = summaryQuery.isLoading;
+ const hasError = Boolean(summaryQuery.error);
return (
-
+
-
-
-
-
Dashboard
+ {/* Hero header */}
+
+ {/* Loading / Error states */}
{isLoadingData && (
Memuat data dashboard...
@@ -121,43 +119,66 @@ export function DashboardPage() {
{hasError && (
- Gagal memuat data dashboard
+ Gagal memuat data dashboard
+
+ {String(summaryQuery.error?.message)}
+
)}
+ {/* Main dashboard content */}
{!isLoadingData && !hasError && (
<>
{summary && (
-
+
+
+
+ Proyek Urgensi
+
+
+ Data ringkasan terbaru dari proyek Anda untuk memantau
+ perkembangan dan hasil deteksi penyakit daun jagung
+
+
-
+
Total Penyakit
-
- {summary.diseaseCount}
+
+
+ {summary.diseaseCount}
+
-
+
Total Diagnosis
-
- {summary.imageClassificationCount}
+
+
+ {summary.imageClassificationCount}
+
-
+
Menunggu Review
-
+
{summary.needsReviewCount}
@@ -165,12 +186,12 @@ export function DashboardPage() {
-
+
Risiko Tinggi
-
+
{summary.riskDistribution.high}
@@ -179,91 +200,119 @@ export function DashboardPage() {
)}
-
-
-
-
-
- Katalog Penyakit
-
-
- Pelajari tentang {diseases.length} penyakit daun jagung
-
-
-
-
- Buka Katalog
-
-
-
+ {/* Mission section */}
+
+
+
+ Misi Platform
+
+
+ Fitur inti yang kami sediakan untuk mendukung petani jagung
+ Indonesia
+
+
-
-
-
-
- Distribusi Risiko
-
-
- Penyakit berdasarkan tingkat risiko
-
-
-
- {summary && (
-
-
- Risiko Tinggi
- {summary.riskDistribution.high}
-
-
- Risiko Sedang
- {summary.riskDistribution.medium}
-
-
- Risiko Rendah
- {summary.riskDistribution.low}
-
-
- )}
-
-
+
+ {missionCards.map((card) => {
+ const Icon = card.icon;
+
+ return (
+
+
+
+
+
+
+
+ {card.title}
+
+
+ {card.description}
+
+
+
+
+ );
+ })}
+
- {
- await createDiagnosisMutation.mutateAsync(file);
- }}
- isSubmitting={createDiagnosisMutation.isPending}
- latestResult={diagnoses[0] ?? null}
- />
+ {/* Diseases quick access */}
+
+
+
+
+ Penyakit yang Dapat Dideteksi
+
+
+ 4 kelas penyakit dan kondisi daun jagung dalam sistem kami
+
+
+
+ Lihat Pustaka
+
+
- {
- await createClassificationMutation.mutateAsync(payload);
- }}
- isSubmitting={createClassificationMutation.isPending}
- />
+
+ {diseasesQuick.map((d) => (
+
+
+
+
+
+
+ {d.name}
+
+
+ {d.sci}
+
+
+
+
+
+ ))}
+
+
- {diagnoses.length > 0 && (
-
-
-
-
- Riwayat Diagnosis
-
-
- {diagnoses.length} diagnosis yang telah dibuat
-
-
-
-
- {diagnoses.slice(0, 6).map((diagnosis) => (
-
- ))}
-
-
-
- )}
+ {/* Scan quick access */}
+
+
+
Siap Mendeteksi Penyakit Daun?
+
+
+ Unggah foto daun jagung Anda dan dapatkan hasil analisis AI
+ dalam hitungan detik.
+
+
+
+
+
+
+ Mulai Scan Sekarang
+
+
+
+
>
)}
diff --git a/apps/web/src/pages/landing-page.tsx b/apps/web/src/pages/landing-page.tsx
index 58a0913..d6eea0a 100644
--- a/apps/web/src/pages/landing-page.tsx
+++ b/apps/web/src/pages/landing-page.tsx
@@ -1,23 +1,31 @@
-import { ArrowRight, Leaf, ShieldCheck, Sprout } from 'lucide-react';
-import { Link } from 'react-router-dom';
-import { Button } from '@/components/ui/button';
-import { Card, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';
+import { ArrowRight, Leaf, ShieldCheck, Sprout } from "lucide-react";
+import { Link } from "react-router-dom";
+import { Button } from "@/components/ui/button";
+import {
+ Card,
+ CardDescription,
+ CardHeader,
+ CardTitle,
+} from "@/components/ui/card";
const features = [
{
icon: Leaf,
- title: 'Katalog Penyakit Lengkap',
- description: 'Pelajari tentang empat penyakit daun jagung utama dengan gejala dan rekomendasi penanganan.',
+ title: "Katalog Penyakit Lengkap",
+ description:
+ "Pelajari tentang empat penyakit daun jagung utama dengan gejala dan rekomendasi penanganan.",
},
{
icon: ShieldCheck,
- title: 'Pantau Risiko Penyakit',
- description: 'Lacak distribusi risiko penyakit dan lihat laporan pengamatan terbaru di dashboard.',
+ title: "Pantau Risiko Penyakit",
+ description:
+ "Lacak distribusi risiko penyakit dan lihat laporan pengamatan terbaru di dashboard.",
},
{
icon: Sprout,
- title: 'Laporkan Pengamatan',
- description: 'Kirimkan laporan penyakit yang Anda temukan untuk membantu penelitian dan edukasi.',
+ title: "Laporkan Pengamatan",
+ description:
+ "Kirimkan laporan penyakit yang Anda temukan untuk membantu penelitian dan edukasi.",
},
];
@@ -44,23 +52,26 @@ export function LandingPage() {
- Belajar mengenali penyakit daun jagung dan pantau pengamatan Anda.
+ Belajar mengenali penyakit daun jagung dan pantau pengamatan
+ Anda.
- Jelajahi katalog penyakit daun jagung, pelajari gejala dan cara penanganannya,
- serta laporkan pengamatan Anda untuk membantu penelitian dan edukasi.
+ Jelajahi katalog penyakit daun jagung, pelajari gejala dan cara
+ penanganannya, serta laporkan pengamatan Anda untuk membantu
+ penelitian dan edukasi.
-
- Buka Dashboard
+
+ Mulai Scan Sekarang
-
- Lihat Katalog Penyakit
-
+ Pustaka Penyakit
+
+
+ Dashboard
@@ -74,7 +85,9 @@ export function LandingPage() {