'use client'; import { useState, useEffect, useCallback } from 'react'; // Define the Employee interface to match data fetched on the server interface Employee { id: number; name: string; status: string; updatedAt: Date; } export default function Table({ employees }: { employees: Employee[] }) { const [selectedIds, setSelectedIds] = useState([]); const [selectAll, setSelectAll] = useState(false); const [status, setStatus] = useState(''); const [employeeData, setEmployeeData] = useState(employees); useEffect(() => { // Refresh employee data if needed after state updates setEmployeeData(employees); }, [employees]); const fetchEmployees = useCallback(async (): Promise => { const res = await fetch('/api/get_employees', { method: 'GET', headers: { 'Authorization': `Bearer ${process.env.API_KEY}` } }); return res.json() as Promise; }, []); useEffect(() => { const fetchAndUpdateEmployees = async () => { const updatedEmployees = await fetchEmployees(); 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); // Poll every 10 seconds return () => clearInterval(intervalId); // Clear interval on component unmount }, [fetchEmployees]); 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([]); } }; useEffect(() => { if (selectedIds.length === employeeData.length && employeeData.length > 0) { setSelectAll(true); } else { setSelectAll(false); } }, [selectedIds, employeeData]); const handleStatusChange = (e: React.ChangeEvent) => { setStatus(e.target.value); }; const handleSubmit = async () => { if (selectedIds.length > 0 && status.trim() !== '') { await fetch('/api/update_status', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${process.env.API_KEY}` }, body: JSON.stringify({ employeeIds: selectedIds, newStatus: status }), }); // Optionally refresh data on the client-side after update const updatedEmployees = await fetchEmployees(); setEmployeeData(updatedEmployees); setSelectedIds([]); setStatus(''); } }; const handleKeyPress = async (e: React.KeyboardEvent) => { if (e.key === 'Enter') { await handleSubmit(); } }; 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}`; }; return (
{employeeData.map((employee) => ( ))}
Name Status Updated At
handleCheckboxChange(employee.id)} /> {employee.name} {employee.status} {formatTime(employee.updatedAt)}
); }