import React, { useEffect, useRef, useState } from "react"; import { Clock, TrendingUp, Play, Square, ProjectorIcon, Pause } from "lucide-react"; import { useOutletContext } from "react-router-dom"; import NoData from "./NoData"; // Updated Project interface to match JSON structure interface Project { projectId: string; projectName: string; activityStatus: "ACTIVE" | "AWAY"; totalWorkTime: string; totalWorkMs: number; totalLogs: number; } interface ProjectTrackingData { elapsedTime: number; startTime: Date | null; endTime: Date | null; isTracking: boolean; isPaused: boolean; } interface TrackingState { selectedProject: Project | null; projectTrackingMap: Map; isTracking: boolean; isPaused: boolean; elapsedTime: number; startTime: Date | null; endTime: Date | null; handleStartTracking: (project: Project) => void; handlePauseResume: () => void; handleStopTracking: () => void; handleProjectSelect: (projectId: string) => void; projectsData: Project[]; } // Helper function const formatTime = (seconds: number) => { const hrs = Math.floor(seconds / 3600); const mins = Math.floor((seconds % 3600) / 60); const secs = seconds % 60; // return `${hrs}h ${mins}m ${secs}s`; return `${hrs}h ${mins}m `; }; // Widget Component const Widget: React.FC<{ title: string; value: string | number; subtitle?: string; icon?: React.ReactNode; color?: | "primary" | "secondary" | "accent" | "success" | "warning" | "error" | "info"; }> = ({ title, value, subtitle, icon, color = "primary" }) => (

{title}

{value}

{icon}
{subtitle &&

{subtitle}

}
); // Dashboard Component const Dashboard: React.FC = () => { const { selectedProject, projectTrackingMap, isTracking, isPaused, elapsedTime, startTime, handleStartTracking, handlePauseResume, handleStopTracking, handleProjectSelect, projectsData, } = useOutletContext(); // interface AppsListInt { // name: string; // pid: string; // title: string; // } // const [runningApps, setRunningApps] = useState([]); const selectedData = selectedProject ? projectTrackingMap.get(selectedProject.projectId) : null; const formatWorkTime = (time: string) => { if (!time) return "0h 0m"; // Example input: "0h 2m 29s" const parts = time.split(" "); // Always return first two parts: ["0h", "2m"] return parts.slice(0, 2).join(" "); }; return (
{/* Header */}

Dashboard

{/* */}
{/* Widgets */} {/*
} color="primary" /> } color="success" /> } color="warning" />
*/} {/* Tracking Section */}
{/*
Tracking
*/}
{selectedProject ? ( <>

{formatTime(selectedData?.elapsedTime || 0)}

{/*

{selectedData?.isTracking ? "Current Session" : "Ready"}

*/}
Project:{" "} {selectedProject.projectName}
{!selectedData?.isTracking ? ( ) : ( )}
{/*
Status:{" "} {selectedProject.activityStatus}
Tracking:{" "} {selectedData?.isPaused ? "Paused" : selectedData?.isTracking ? "Active" : "Ready"}
Start:{" "} {selectedData?.startTime ? selectedData.startTime.toLocaleTimeString() : "—"}
*/} ) : (

Select a project below to start tracking.

)}
{/* Projects Table */}
{/* 🔹 Sticky Header */}

Projects

{/* 🔹 Table or Empty State */} {projectsData.length > 0 ? (
{projectsData.map((project, index) => { const isCurrentlySelected = selectedProject?.projectId === project.projectId; const isDisabled = isTracking && !isCurrentlySelected; return ( ); })}
# Name Logs Hours Action
{index + 1} {project.projectName} {formatWorkTime(project.totalWorkTime)}
) : (
)}
); }; export default Dashboard;