// dashboard.jsx — hibank Design System tokens function DashboardPage({ onLogout, onNavigate, pendingApproval = 0, primary, secondary, sidebarColor, role = 'super', user, activeNav: propActiveNav, setActiveNav: propSetActiveNav, merchants, setMerchants }) { const [localActiveNav, setLocalActiveNav] = React.useState('dashboard'); const activeNav = propActiveNav !== undefined ? propActiveNav : localActiveNav; const setActiveNav = propSetActiveNav !== undefined ? propSetActiveNav : setLocalActiveNav; const [sidebarOpen, setSidebarOpen] = React.useState(true); const TEAL = primary || '#0056D2'; const ORANGE = secondary || '#cf5a27'; const U = user || { name: 'Arief Budiman', roleLabel: 'Super Admin', initials: 'AB', greeting: 'Arief' }; const isMerchant = role === 'merchant'; const stats = isMerchant ? [ { label: 'Total Pendapatan', value: 'Rp 45.280.000', sub: 'vs bulan lalu', change: '+8.4%', up: true, icon: 'bx-money' }, { label: 'Transaksi QRIS', value: '342 Transaksi', sub: 'April 2026', change: '+12.1%', up: true, icon: 'bx-qr-scan' }, { label: 'Rata-rata Transaksi', value: 'Rp 132.397', sub: 'keranjang belanja', change: '-1.5%', up: false, icon: 'bx-calculator' }, { label: 'Dana Dicairkan', value: 'Rp 42.850.000', sub: 'settled ke bank', change: '+5.6%', up: true, icon: 'bx-wallet' }, ] : [ { label: 'Total Nasabah', value: '1.284.392', sub: 'vs bulan lalu', change: '+4.2%', up: true, icon: 'bx-user' }, { label: 'Volume Transaksi', value: 'Rp 8,4T', sub: 'April 2026', change: '+12.7%', up: true, icon: 'bx-transfer' }, { label: 'Kartu Aktif', value: '842.711', sub: 'diterbitkan', change: '+1.9%', up: true, icon: 'bx-credit-card' }, { label: 'Klaim Pending', value: '2.847', sub: 'menunggu review', change: '-8.3%', up: false, icon: 'bx-error-circle' }, ]; const txns = isMerchant ? [ { id: 'TRX-8831', name: 'Kopi Senja (QRIS)', type: 'QRIS Dinamis', amount: '+Rp 45.000', time: '10:32', status: 'success' }, { id: 'TRX-8830', name: 'Budi Santoso', type: 'QRIS Statis', amount: '+Rp 150.000', time: '10:18', status: 'success' }, { id: 'TRX-8829', name: 'Siti Rahayu', type: 'QRIS Dinamis', amount: '+Rp 85.000', time: '09:55', status: 'success' }, { id: 'TRX-8828', name: 'Rangga Pratama', type: 'QRIS Statis', amount: '+Rp 25.000', time: '09:41', status: 'success' }, { id: 'TRX-8827', name: 'Dewi Lestari', type: 'QRIS Dinamis', amount: '+Rp 110.000', time: '09:20', status: 'success' }, { id: 'TRX-8826', name: 'Pencairan Settlement', type: 'Transfer Out', amount: '-Rp 12.500.000', time: '09:05', status: 'success' }, ] : [ { id: 'TRX-0041', name: 'Budi Santoso', type: 'Transfer', amount: '+Rp 12.500.000', time: '10:32', status: 'success' }, { id: 'TRX-0040', name: 'Siti Rahayu', type: 'Penarikan', amount: '-Rp 5.000.000', time: '10:18', status: 'success' }, { id: 'TRX-0039', name: 'PT Maju Jaya', type: 'Pembayaran', amount: '+Rp 287.000.000', time: '09:55', status: 'success' }, { id: 'TRX-0038', name: 'Andi Wijaya', type: 'Cicilan', amount: '-Rp 3.200.000', time: '09:41', status: 'pending' }, { id: 'TRX-0037', name: 'Dewi Lestari', type: 'Transfer', amount: '+Rp 750.000', time: '09:20', status: 'failed' }, { id: 'TRX-0036', name: 'CV Sejahtera', type: 'Pembayaran', amount: '+Rp 45.600.000', time: '09:05', status: 'success' }, ]; const barData = isMerchant ? [12, 18, 15, 24, 22, 32, 28, 35, 30, 42, 38, 45] : [52, 68, 55, 80, 72, 90, 68, 95, 74, 88, 78, 100]; const barLabels = ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Agt', 'Sep', 'Okt', 'Nov', 'Des']; const breakdown = isMerchant ? [ { label: 'QRIS Dinamis', pct: 58, color: TEAL }, { label: 'QRIS Statis', pct: 32, color: '#0041A8' }, { label: 'QRIS CPM', pct: 10, color: ORANGE }, ] : [ { label: 'Transfer', pct: 42, color: TEAL }, { label: 'Pembayaran', pct: 28, color: '#0041A8' }, { label: 'Penarikan', pct: 18, color: ORANGE }, { label: 'Lainnya', pct: 12, color: '#efefef' }, ]; const activities = isMerchant ? [ { text: 'Pencairan dana berhasil ditransfer', sub: 'Ke Bank Mandiri a/n Rangga · 10 mnt lalu', dot: '#74b50c' }, { text: 'Transaksi QRIS baru diterima', sub: 'Nominal Rp 45.000 · 15 mnt lalu', dot: TEAL }, { text: 'Update konfigurasi MDR merchant', sub: 'MDR diset 0.50% oleh Checker · 1 jam lalu', dot: ORANGE }, { text: 'Audit kelayakan merchant', sub: 'Status: APPROVED · 2 jam lalu', dot: '#ed3151' }, ] : [ { text: 'Nasabah baru terverifikasi', sub: 'Reza Firmansyah · 2 mnt lalu', dot: '#74b50c' }, { text: 'Limit kartu diperbarui', sub: 'Rina Marlina · 8 mnt lalu', dot: TEAL }, { text: 'Pengajuan pinjaman diterima', sub: 'PT Karya Nusa · 15 mnt lalu', dot: ORANGE }, { text: 'Transaksi mencurigakan', sub: 'ID: TRX-0041 · 24 mnt lalu', dot: '#ed3151' }, ]; const systemStatus = isMerchant ? [ { label: 'QRIS Engine', ok: true }, { label: 'Merchant App API', ok: true }, { label: 'Settlement Engine', ok: true }, ] : [ { label: 'Core Banking', ok: true }, { label: 'API Gateway', ok: true }, { label: 'Fraud Detection', ok: false }, ]; return (
{ if (id === 'approval' || id === 'onboarding_monitor' || id === 'onboarding_portal' || id === 'merchant_management' || id === 'dashboard') { onNavigate(id); } else { setActiveNav(id); } }} sidebarOpen={sidebarOpen} setSidebarOpen={setSidebarOpen} onLogout={onLogout} pendingApproval={pendingApproval} primary={TEAL} secondary={ORANGE} sidebarBg={sidebarColor} role={role} user={user} />
{/* ── TOPBAR ── */}
{/* Search */}
{new Date().toLocaleDateString('id-ID', { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' })} {/* Bell */}
{/* Avatar */}
{U.initials}
{U.name}
{U.roleLabel}
{/* ── CONTENT ── */}
{activeNav === 'dashboard' ? ( <> {/* Page header */}
Dashboard

{isMerchant ? `Selamat pagi, Toko Kopi Senja (${U.greeting}) 🏪` : `Selamat pagi, ${U.greeting} 👋`}

{isMerchant ? 'Berikut ringkasan performa penjualan dan operasional merchant Anda hari ini.' : 'Berikut ringkasan operasional per hari ini.'}

{/* STAT CARDS */}
{stats.map((s, i) => )}
{/* CHARTS ROW */}
{/* Bar chart */}
Volume Transaksi
{isMerchant ? 'Per bulan — dalam juta Rp' : 'Per bulan — dalam miliar Rp'}
2026
{/* Breakdown */}
Komposisi Transaksi
Berdasarkan jenis
{breakdown.map((b, i) => (
{b.label} {b.pct}%
))}
{/* BOTTOM ROW */}
{/* Transactions */}
Transaksi Terbaru
{txns.map((t, i) => )}
{!isMerchant && ( /* Activity + System */
{/* Activity log */}
Aktivitas Sistem
{activities.map((a, i) => (
{a.text}
{a.sub}
))}
{/* System status */}
Status Sistem
{systemStatus.map(({ label, ok }) => (
{label}
{ok ? 'Online' : 'Warning'}
))}
)}
) : activeNav === 'merchant_business' ? ( ) : activeNav === 'transaction_monitor' ? ( ) : activeNav === '4eyes_checker' ? ( ) : activeNav === 'recon_settlement' ? ( ) : activeNav === 'disbursement' ? ( ) : activeNav === 'refund' ? ( ) : (activeNav === 'refund_request' || activeNav === 'refund_management') ? ( ) : activeNav === 'refund_monitor' ? ( ) : activeNav === 'fds_dashboard' ? ( ) : activeNav === 'fds_monitoring' ? ( ) : activeNav === 'fds_parameter' ? ( ) : activeNav === 'fds_suspect' ? ( ) : activeNav === 'report_generator' ? ( ) : ( (() => { const navTitle = { onboarding_portal: 'Onboarding Portal', merchant_management: 'Merchant Management', merchant_business: 'Merchant Business', transaction_monitor: 'Transaction Monitor', '4eyes_checker': 'Checker (4 Eyes)', recon_settlement: 'Recon & Settlement', disbursement: 'Disbursement', refund: 'Refund', fds_dashboard: 'FDS Dashboard', fds_monitoring: 'Monitoring FDS', fds_parameter: 'Parameter FDS', fds_suspect: 'Suspect Management', refund_request: 'Refund Request', refund_monitor: 'Refund Monitor' }[activeNav] || 'Halaman'; return (

{navTitle}

Halaman {navTitle} saat ini sedang dalam tahap pengembangan oleh tim IT hibank. Silakan kembali nanti.

); })() )}
); } Object.assign(window, { DashboardPage });