"use client"; import { useState, useEffect, useCallback } from 'react'; import { useSession } from "next-auth/react"; import Loading from "~/components/ui/Loading"; import { useTVMode } from "~/components/context/TVModeContext"; // Define the Employee interface to match data fetched on the server interface Employee { id: number; name: string; status: string; updatedAt: Date; } export default function Tech_Table({ employees }: { employees: Employee[] }) { const { data: session, status } = useSession(); const { tvMode } = useTVMode(); const [loading, setLoading] = useState(true); const [selectedIds, setSelectedIds] = useState([]); const [selectAll, setSelectAll] = useState(false); const [employeeStatus, setStatus] = useState(''); const [employeeData, setEmployeeData] = useState(employees); const fetch_employees = useCallback(async (): Promise => { const res = await fetch('/api/v2/get_employees', { method: 'GET', headers: { 'Authorization': `Bearer ${process.env.API_KEY}` } }); return res.json() as Promise; }, []); const update_status = async () => { if (!session) { alert("You must be signed in to update status."); return; } if (selectedIds.length === 0 && employeeStatus.trim() !== '') { const cur_user = employees.find(employee => employee.name === session.user?.name); if (cur_user) { await fetch('/api/v2/update_status', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${process.env.API_KEY}` }, body: JSON.stringify({ employeeIds: [cur_user.id], newStatus: employeeStatus }), }); } } else if (employeeStatus.trim() !== '') { await fetch('/api/v2/update_status', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${process.env.API_KEY}` }, body: JSON.stringify({ employeeIds: selectedIds, newStatus: employeeStatus }), }); } const updatedEmployees = await fetch_employees(); setEmployeeData(updatedEmployees); setSelectedIds([]); setStatus(''); }; const handleCheckboxChange = (id: number) => { setSelectedIds((prevSelected) => prevSelected.includes(id) ? prevSelected.filter((prevId) => prevId !== id) : [...prevSelected, id] ); }; const handleSelectAllChange = () => { setSelectAll(!selectAll); if (!selectAll) { const allIds = employees.map((employee) => employee.id); setSelectedIds(allIds); } else { setSelectedIds([]); } }; const handleStatusChange = (e: React.ChangeEvent) => { setStatus(e.target.value); }; const handleKeyDown = async (e: React.KeyboardEvent) => { if (e.key === 'Enter') { await update_status(); } }; const formatTime = (timestamp: Date) => { const date = new Date(timestamp); const time = date.toLocaleTimeString('en-US', { hour: 'numeric', minute: 'numeric', }); const day = date.getDate(); const month = date.toLocaleString('default', { month: 'long' }); return `${time} - ${month} ${day}`; }; useEffect(() => { if (status !== "loading") { setLoading(false); } }, [status]); useEffect(() => { setEmployeeData(employees); }, [employees]); useEffect(() => { const fetchAndUpdateEmployees = async () => { const updatedEmployees = await fetch_employees(); setEmployeeData(updatedEmployees); }; fetchAndUpdateEmployees().catch((error) => { console.error('Error fetching employees:', error); }); const intervalId = setInterval(() => { (async () => { await fetchAndUpdateEmployees(); })().catch((error) => { console.error('Error fetching employees:', error); }); }, 10000); return () => clearInterval(intervalId); }, [fetch_employees]); useEffect(() => { if (selectedIds.length === employeeData.length && employeeData.length > 0) { setSelectAll(true); } else { setSelectAll(false); } }, [selectedIds, employeeData]); if (loading) return ; else { return (
{!tvMode && ( )} {employeeData.map((employee) => ( {!tvMode && ( )} ))}
Name Status Updated At
handleCheckboxChange(employee.id)} /> {employee.name} {employee.status} {formatTime(employee.updatedAt)}
{!tvMode && (
)}
); } }