import React, { useState, useEffect } from "react"; import { TimeLog, timeLogApi } from "@/services/timeLogApi"; import { Employee, employeeApi } from "@/services/employeeApi"; import { format } from "date-fns"; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { Badge } from "@/components/ui/badge"; import { Clock, Loader2, User } from "lucide-react"; import { Avatar, AvatarFallback } from "@/components/ui/avatar"; import { useQuery } from "@tanstack/react-query"; interface TaskTimeLogCardProps { taskId: number; entityType?: "Task" | "Issue"; } const TaskTimeLogCard: React.FC = ({ taskId, entityType = "Task" }) => { const [timeLogs, setTimeLogs] = useState([]); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); // Fetch employees data const { data: employees = [], isLoading: isLoadingEmployees } = useQuery({ queryKey: ["employees"], queryFn: () => employeeApi.getAll(), }); useEffect(() => { const fetchTimeLogs = async () => { try { setIsLoading(true); setError(null); let logs: TimeLog[] = []; if (entityType === "Issue") { logs = await timeLogApi.getTimeLogByIssueID(taskId); } else { logs = await timeLogApi.getTimeLogByTaskID(taskId); } setTimeLogs(logs); } catch (err) { console.error(`Error fetching time logs for ${entityType}:`, err); setError(`Failed to load time logs for this ${entityType.toLowerCase()}. Please try again later.`); } finally { setIsLoading(false); } }; if (taskId) { fetchTimeLogs(); } }, [taskId, entityType]); // Format date for display const formatDate = (dateString: string) => { try { return format(new Date(dateString), "MMM dd, yyyy"); } catch (error) { return "Invalid date"; } }; // Utility to strip HTML tags from text for tooltips const stripHtmlTags = (html: string): string => { const tempDiv = document.createElement('div'); tempDiv.innerHTML = html; return tempDiv.textContent || tempDiv.innerText || ''; }; // Helper to get employee name by userId const getEmployeeNameByUserId = (userId: string): string => { const employee = employees.find(emp => emp.userId.toString() === userId); if (employee) { return `${employee.firstName} ${employee.lastName}`; } return userId; }; // Calculate total hours spent const totalHoursSpent = timeLogs.reduce((total, log) => total + log.hrsSpent, 0); // Mobile view time log card const renderMobileTimeLog = (log: TimeLog) => (
{log.startTime} - {log.endTime} {log.hrsSpent.toFixed(2)} hrs

Date

{formatDate(log.workDate)}

Comments

{getEmployeeNameByUserId(log.createdBy)?.slice(0, 2).toUpperCase() || 'U'} Logged by {getEmployeeNameByUserId(log.createdBy)}
); return ( Time Logs Time spent on this {entityType.toLowerCase()}: {totalHoursSpent.toFixed(2)} hours {isLoading || isLoadingEmployees ? (
Loading time logs...
) : error ? (
{error}
) : timeLogs.length === 0 ? (
No time logs recorded for this {entityType.toLowerCase()}.
) : ( <> {/* Mobile view - Card layout */}
{timeLogs.map(renderMobileTimeLog)}
{/* Desktop view - Table layout */}
Date Time Range Hours Comments Logged By {timeLogs.map((log) => ( {formatDate(log.workDate)} {log.startTime} - {log.endTime} {log.hrsSpent.toFixed(2)}
{getEmployeeNameByUserId(log.createdBy)?.slice(0, 2).toUpperCase() || 'U'}
{getEmployeeNameByUserId(log.createdBy)}
))}
)}
); }; export default TaskTimeLogCard;