"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"; import { Drawer, DrawerTrigger } from "~/components/ui/shadcn/drawer"; import { ScrollArea } from "~/components/ui/shadcn/scroll-area"; import History_Drawer from "~/components/ui/History_Drawer"; type 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 [selectedUserId, setSelectedUserId] = useState(-1); const fetch_employees = useCallback(async (): Promise => { const res = await fetch('/api/get_technicians', { 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; } else if (selectedIds.length === 0 && employeeStatus.trim() !== '') { const users_name = session.user?.name ?? ""; const name_arr = users_name.split(' '); const lname = name_arr[name_arr.length - 1] ?? ""; const cur_user = employees.find(employee => employee.name.includes(lname)); if (cur_user) { await fetch('/api/update_status_by_id', { 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/update_status_by_id', { 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 handleStatusClick = (id: number) => { setSelectedUserId(id); }; 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 &&
} {!tvMode && ( )} {employeeData.map((employee) => ( {!tvMode && ( )} ))}
Name Status Updated At
handleCheckboxChange(employee.id)} /> {employee.name} {selectedUserId !== -1 && ( )} {formatTime(employee.updatedAt)}
{!tvMode && (
)}
); } }