'use client' import React, { useEffect, useState } from "react"; import { motion, AnimatePresence } from "framer-motion"; import { AreaChart, Area, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, } from "recharts"; import { AlertTriangle, CheckCircle, CalendarDays } from "lucide-react"; // Elegant RDM/RDB Dashboard — PLTU Tanjung Jadi B // Combines predictive alert, KPI metrics, and calendar popup for RDM/RDB view. const MOCK_RDM = (() => { const today = new Date(); return Array.from({ length: 14 }).map((_, i) => { const d = new Date(today); d.setDate(today.getDate() + i); const failed = today.getDate() + i == today.getDate() + 6; return { date: d.toISOString().slice(0, 10), daya_mw: Math.round(280 + 15 * Math.sin(i / 2) + Math.random() * 6), failed, note: failed ? "Gagal mencapai RDM (perbaikan unit)" : "Rencana tercapai", }; }); })(); const MOCK_RDB = (() => { const today = new Date(); return Array.from({ length: 8 }).map((_, i) => { const d = new Date(today); d.setDate(today.getDate() + i * 7); const failed = (today.getDate() + i) * 7 == (today.getDate() + 6) * 7; return { week: i + 1, startDate: d.toISOString().slice(0, 10), daya_mw: Math.round(285 + 10 * Math.cos(i / 2) + Math.random() * 8), failed, note: failed ? "RDB tidak tercapai (maintenance)" : "RDB tercapai", }; }); })(); const MOCK_ALERT = { exists: true, type: "Predictive Failure", component: "Boiler Feed Pump 2", days_to_failure: 7, severity: "High", recommended_actions: [ "Jadwalkan maintenance 2 hari ke depan", "Siapkan spare part dan inspeksi getaran", "Pantau tekanan sistem harian hingga perbaikan", ], }; export default function DashboardRdmRdbElegant() { const [mode, setMode] = useState("rdm"); // 'rdm' or 'rdb' const [rdmData, setRdmData] = useState(MOCK_RDM); const [rdbData, setRdbData] = useState(MOCK_RDB); const [alert, setAlert] = useState(MOCK_ALERT); const [showCalendar, setShowCalendar] = useState(false); const [selectedItem, setSelectedItem] = useState(null); const data = mode === "rdm" ? rdmData : rdbData; const maxDaya = Math.max(...data.map((d) => d.daya_mw)); const avgDaya = Math.round( data.reduce((sum, d) => sum + d.daya_mw, 0) / data.length ); const successRate = Math.round( (data.filter((d) => !d.failed).length / data.length) * 100 ); return (
Prediksi Thermodinamika & HHV Batubara
Keparahan: {alert.severity}
{alert.days_to_failure} hari
hingga estimasi kegagalan
{mode === "rdm" ? `Tanggal: ${selectedItem.date}` : `Minggu ke-${selectedItem.week}`}
Daya: {selectedItem.daya_mw} MW
Status: {selectedItem.failed ? {selectedItem.note} : {selectedItem.note}}