import React, { useState, useRef, useEffect } from "react"; import styles from "./Dashboard.module.css"; import { useNavigate } from "react-router-dom"; // Pastikan Anda sudah menginstal Recharts: npm install recharts // import { BarChart, Bar, XAxis, YAxis, Tooltip, ResponsiveContainer } from 'recharts'; // Contoh Recharts const Dashboard = () => { const navigate = useNavigate(); const [isMenuOpen, setIsMenuOpen] = useState(false); const menuRef = useRef(null); const [username, setUsername] = useState(""); const [password, setPassword] = useState(""); const [selectedRole, setSelectedRole] = useState("officer"); const [successMessage, setSuccessMessage] = useState(""); const [errorMessage, setErrorMessage] = useState(""); const [user, setUser] = useState({}); const [totalFilesSentToday, setTotalFilesSentToday] = useState(0); const [totalFilesSentMonth, setTotalFilesSentMonth] = useState(0); const [totalFilesSentOverall, setTotalFilesSentOverall] = useState(0); const [officerPerformanceData, setOfficerPerformanceData] = useState([]); useEffect(() => { const token = localStorage.getItem("token"); if (!token) { window.location.href = "/login"; } }, []); useEffect(() => { const verifyTokenAndFetchData = async () => { const token = localStorage.getItem("token"); if (!token) { window.location.href = "/login"; return; } try { const response = await fetch( "https://bot.kediritechnopark.com/webhook/dashboard/psi", { method: "GET", headers: { Authorization: `Bearer ${token}`, }, } ); const data = await response.json(); if (!response.ok || !data[0].payload.username) { throw new Error("Unauthorized"); } setUser(data[0].payload); // Pastikan API Anda mengembalikan data ini, contoh: // data[0].payload.stats = { today: 120, month: 2500, overall: 15000 }; // data[0].payload.officerPerformance = [{ name: "Budi", filesSent: 50 }, { name: "Ani", filesSent: 70 }]; if (data[0].payload.stats) { setTotalFilesSentToday(data[0].payload.stats.today); setTotalFilesSentMonth(data[0].payload.stats.month); setTotalFilesSentOverall(data[0].payload.stats.overall); } if (data[0].payload.officerPerformance) { setOfficerPerformanceData(data[0].payload.officerPerformance); } } catch (error) { console.error("Token tidak valid:", error.message); localStorage.removeItem("token"); window.location.href = "/login"; } }; verifyTokenAndFetchData(); }, []); const handleLogout = () => { localStorage.removeItem("token"); localStorage.removeItem("user"); localStorage.removeItem("role"); window.location.reload(); }; const handleAddOfficer = async (e) => { e.preventDefault(); const token = localStorage.getItem("token"); try { const response = await fetch( "https://bot.kediritechnopark.com/webhook/add-officer", { method: "POST", headers: { "Content-Type": "application/json", Authorization: `Bearer ${token}`, }, body: JSON.stringify({ username, password, role: selectedRole, }), } ); const data = await response.json(); if (!response.ok || data.success === false) { throw new Error(data.message || "Gagal menambahkan officer"); } setSuccessMessage("Officer berhasil ditambahkan"); setUsername(""); setPassword(""); setSelectedRole("officer"); setErrorMessage(""); // Pertimbangkan untuk memuat ulang data performa jika penambahan officer baru mempengaruhi grafik } catch (error) { setErrorMessage(error.message || "Gagal menambahkan officer"); setSuccessMessage(""); } }; useEffect(() => { const handleClickOutside = (event) => { if (menuRef.current && !menuRef.current.contains(event.target)) { setIsMenuOpen(false); } }; document.addEventListener("mousedown", handleClickOutside); return () => document.removeEventListener("mousedown", handleClickOutside); }, []); return (
Bot Avatar

PSI Dashboard

{user.username || "Guest"} {isMenuOpen && (
)}
{/* Summary Cards */}

Total Hari Ini

{totalFilesSentToday}

Total Bulan Ini

{totalFilesSentMonth}

Total Keseluruhan

{totalFilesSentOverall}

{/* Grid for Form (Admin) and Chart (Admin & Officer) */}
{user.role === "admin" && ( /* Render form hanya jika admin */

Tambah Officer Baru

{successMessage &&

{successMessage}

} {errorMessage &&

{errorMessage}

}
)} {/* Chart Section - Visible to both Admin and Officer */}

Performa Pengiriman File Petugas

{officerPerformanceData.length > 0 ? ( // Contoh implementasi Recharts: /* */
Grafik performa petugas akan ditampilkan di sini. (Integrasikan library grafik seperti Recharts/Chart.js)
) : (

Tidak ada data performa petugas untuk ditampilkan.

)}
© 2025 Kediri Technopark
); }; export default Dashboard;