import React, { useState, useEffect, useRef } from "react"; import { Clock, TrendingUp, Play, Square, ProjectorIcon, Pause } from "lucide-react"; const projectsData = [ { id: 1, projectName: "Employee Tracker", clientName: "TechCorp Pvt Ltd", status: "Active", action: "Start Tracking", }, { id: 2, projectName: "Sales Dashboard", clientName: "BlueEdge Analytics", status: "Pending", action: "Start Tracking", }, { id: 3, projectName: "Inventory System", clientName: "LogiFlow Inc", status: "Completed", action: "View Report", }, { id: 4, projectName: "CRM Upgrade", clientName: "NextWave Solutions", status: "On Hold", action: "Resume", }, { id: 5, projectName: "Mobile App Redesign", clientName: "PixelFusion", status: "Active", action: "Start Tracking", }, { id: 6, projectName: "E-Commerce Backend", clientName: "ShopEasy", status: "Pending", action: "Start Tracking", }, { id: 7, projectName: "Finance Tracker", clientName: "MoneyWise", status: "Active", action: "Start Tracking", }, { id: 8, projectName: "Helpdesk Portal", clientName: "ServePro", status: "Completed", action: "View Report", }, { id: 9, projectName: "Marketing Automation", clientName: "AdBoost", status: "Active", action: "Start Tracking", }, { id: 10, projectName: "Data Pipeline", clientName: "CloudWave", status: "On Hold", action: "Resume", }, { id: 11, projectName: "Support Chatbot", clientName: "SmartServe", status: "Active", action: "Start Tracking", }, { id: 12, projectName: "Payroll System", clientName: "PeopleFirst HR", status: "Pending", action: "Start Tracking", }, { id: 13, projectName: "IoT Dashboard", clientName: "SensorGrid", status: "Completed", action: "View Report", }, { id: 14, projectName: "Security Portal", clientName: "SafeNet", status: "Active", action: "Start Tracking", }, { id: 15, projectName: "Social Media Tool", clientName: "Buzzify", status: "Pending", action: "Start Tracking", }, { id: 16, projectName: "AI Model Trainer", clientName: "NeuroTech", status: "On Hold", action: "Resume", }, { id: 17, projectName: "Project Tracker", clientName: "TaskFlow", status: "Active", action: "Start Tracking", }, { id: 18, projectName: "Booking Portal", clientName: "GoTravel", status: "Completed", action: "View Report", }, { id: 19, projectName: "Time Logger", clientName: "Clockify Pro", status: "Active", action: "Start Tracking", }, { id: 20, projectName: "Analytics Engine", clientName: "DataStream", status: "Pending", action: "Start Tracking", }, ]; interface WidgetProps { title: string; value: string | number; subtitle?: string; icon?: React.ReactNode; trend?: number; color?: "primary" | "secondary" | "accent" | "success" | "warning" | "error" | "info"; } interface Project { id: number; projectName: string; clientName: string; } // Widget Component const Widget: React.FC = ({ title, value, subtitle, icon, trend, color = "primary", }) => { return (

{title}

{value}

{icon}
); }; // Main Dashboard Component const Dashboard: React.FC = () => { const [selectedProject, setSelectedProject] = useState(null); const [isTracking, setIsTracking] = useState(false); const [isPaused, setIsPaused] = useState(false); const [elapsedTime, setElapsedTime] = useState(0); // in seconds const [startTime, setStartTime] = useState(null); const [endTime, setEndTime] = useState(null); const timerRef = useRef | null>(null); // Load cached project or auto-select single project useEffect(() => { const cachedProject = localStorage.getItem("activeProject"); if (cachedProject) { const parsed = JSON.parse(cachedProject) as Project; setSelectedProject(parsed); } else if (projectsData.length === 1) { setSelectedProject(projectsData[0]); } }, []); // Format elapsed time (hh:mm:ss) const formatTime = (seconds: number) => { const h = Math.floor(seconds / 3600); const m = Math.floor((seconds % 3600) / 60); const s = seconds % 60; return `${h}h ${m}m ${s}s`; }; // Start tracking manually const handleStartTracking = () => { if (!selectedProject) return; setIsTracking(true); setIsPaused(false); setElapsedTime(0); setStartTime(new Date()); setEndTime(null); // Cache selected project localStorage.setItem("activeProject", JSON.stringify(selectedProject)); }; // ⏱ Timer logic useEffect(() => { if (isTracking && !isPaused) { timerRef.current = setInterval(() => { setElapsedTime((prev) => prev + 1); }, 1000); } else if (timerRef.current) { clearInterval(timerRef.current); } return () => { if (timerRef.current) clearInterval(timerRef.current); }; }, [isTracking, isPaused]); // ⏸ Pause/Resume button handler const handlePauseResume = () => { setIsPaused((prev) => !prev); }; // Stop tracking const handleStopTracking = () => { if (!selectedProject) return; setIsTracking(false); setIsPaused(false); setEndTime(new Date()); if (timerRef.current) clearInterval(timerRef.current); // Keep project in view, just stop tracking. // Remove tracking state but keep the selected project cached. const summary = { project: selectedProject.projectName, totalTime: formatTime(elapsedTime), start: startTime?.toLocaleTimeString(), end: new Date().toLocaleTimeString(), }; console.log("✅ Final Tracking Summary:", summary); // Save the stopped state for reference localStorage.setItem( "activeProject", JSON.stringify({ ...selectedProject, lastSession: summary, }) ); // Reset timer values but keep selected project setElapsedTime(0); }; // 🧾 When user picks a project manually const handleProjectSelect = (id: number) => { if (isTracking) return; const project = projectsData.find((item) => item.id === id); if (project) { setSelectedProject(project); localStorage.setItem("activeProject", JSON.stringify(project)); } }; return (
{/* Welcome Section */}

Dashboard

{/* Widgets Grid */}
} trend={12} color="primary" /> } trend={8} color="success" /> } color="warning" />
{/* Tracking Card */}
Tracking {isTracking && ( )}
{selectedProject ? ( <>

{formatTime(elapsedTime)}

{isTracking ? "Current Session" : "Ready to Start"}

{!isTracking ? ( ) : ( )}
{/* Project Name */}
Project: {selectedProject.projectName}
{/* Client Name */}
Client: {selectedProject.clientName}
{/* Status */}
Status: {isPaused ? "Paused" : isTracking ? "Active" : "Ready"}
{/* Start Time */}
Start Time: {startTime?.toLocaleTimeString() || "—"}
) : (

Select a project to start tracking.

)}
{/* Projects Table */}

Projects

{projectsData.map((project) => ( ))}
# Project Name Client Name Action
{project.id} {project.projectName} {project.clientName}
{project.status}
Select
); }; export default Dashboard;