import React, { useState, useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; import { useAuth, useDashboardStats, useUserDetails, useNumberCards } from '../hooks/useApi'; import ApiTest from '../components/ApiTest'; import ChartTile from '../components/ChartTile'; // Define interfaces locally interface UserDetails { user_id: string; full_name: string; email: string; user_image?: string; roles: string[]; permissions: Record; last_login?: string; enabled: boolean; creation: string; modified: string; language: string; } interface DocTypeRecord { name: string; creation: string; modified: string; modified_by: string; owner: string; docstatus: number; [key: string]: any; } const Dashboard: React.FC = () => { const [user, setUser] = useState(null); const [recentRecords, setRecentRecords] = useState([]); const navigate = useNavigate(); const { logout } = useAuth(); // Use the new API hooks const { loading: statsLoading, error: statsError } = useDashboardStats(); const { data: numberCards } = useNumberCards(); const { data: userDetails, loading: userLoading, error: userError } = useUserDetails(); useEffect(() => { // Set user from stored data or API response const storedUser = localStorage.getItem('user'); if (storedUser) { setUser(JSON.parse(storedUser)); } else if (userDetails) { setUser(userDetails); } // Set demo records for now (you can replace this with real data later) const demoRecords: DocTypeRecord[] = [ { name: 'USER001', full_name: 'John Doe', email: 'john.doe@seeraarabia.com', creation: new Date().toISOString(), modified: new Date().toISOString(), modified_by: 'system', owner: 'system', docstatus: 0 }, { name: 'USER002', full_name: 'Jane Smith', email: 'jane.smith@seeraarabia.com', creation: new Date(Date.now() - 86400000).toISOString(), modified: new Date().toISOString(), modified_by: 'system', owner: 'system', docstatus: 0 }, { name: 'USER003', full_name: 'Ahmed Al-Rashid', email: 'ahmed.alrashid@seeraarabia.com', creation: new Date(Date.now() - 172800000).toISOString(), modified: new Date().toISOString(), modified_by: 'system', owner: 'system', docstatus: 0 }, { name: 'USER004', full_name: 'Sarah Johnson', email: 'sarah.johnson@seeraarabia.com', creation: new Date(Date.now() - 259200000).toISOString(), modified: new Date().toISOString(), modified_by: 'system', owner: 'system', docstatus: 0 }, { name: 'USER005', full_name: 'Mohammed Hassan', email: 'mohammed.hassan@seeraarabia.com', creation: new Date(Date.now() - 345600000).toISOString(), modified: new Date().toISOString(), modified_by: 'system', owner: 'system', docstatus: 0 } ]; setRecentRecords(demoRecords); }, [userDetails]); const handleLogout = async () => { try { await logout(); localStorage.removeItem('user'); navigate('/login'); } catch (err) { console.error('Logout error:', err); // Force logout even if API call fails localStorage.removeItem('user'); navigate('/login'); } }; if (statsLoading || userLoading) { return (
); } return (
{/* Header */}

Dashboard

Welcome, {user?.full_name || 'User'}
{/* Main Content */}
{(statsError || userError) && (
{statsError || userError || 'Failed to load dashboard data'}
)} {/* Stats Cards (from Frappe Number Cards) */}
Total Assets
{numberCards?.total_assets ?? '-'}
Open Work Orders
{numberCards?.work_orders_open ?? '-'}
In Progress
{numberCards?.work_orders_in_progress ?? '-'}
Completed Work Orders
{numberCards?.work_orders_completed ?? '-'}
{/* Charts Grid */}
{[ 'Up & Down Time Chart', 'Work Order Status Chart', 'Maintenance - Asset wise Count', 'Asset Maintenance Assignees Status Count', 'Asset Maintenance Frequency Chart', 'PPM Status', 'PPM Template Counts', 'Repair Cost', ].map((name) => ( ))}
{/* Recent Records */}

Recent Records

Latest entries from your Frappe backend

    {recentRecords.map((record) => (
  • {record.full_name?.charAt(0) || record.name.charAt(0)}
    {record.full_name || record.name}
    {record.email || 'No email'}
    {new Date(record.creation).toLocaleDateString()}
  • ))}
{/* Quick Actions */}

Quick Actions

{/* API Test Component */}
); }; export default Dashboard;