import { useState, useEffect, useCallback } from "react"; import { getCandidatesApi, deleteCandidateApi } from "@/api/candidates"; import { exportToExcel } from "@/utils/exportToExcel"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Loader2, Trash, RefreshCw, Download } from "lucide-react"; export default function CandidatePage() { const [candidates, setCandidates] = useState([]); const [loading, setLoading] = useState(true); const [searchText, setSearchText] = useState(""); const [filterCareer, setFilterCareer] = useState(""); const fetchAll = useCallback(async () => { setLoading(true); try { const res = await getCandidatesApi(); setCandidates(res?.data || []); } catch (err) { console.error(err); } finally { setLoading(false); } }, []); useEffect(() => { fetchAll(); }, [fetchAll]); const filteredCandidates = candidates.filter((item) => { const matchesSearch = item.fullName?.toLowerCase().includes(searchText.toLowerCase()) || item.mobile?.includes(searchText) || item.email?.toLowerCase().includes(searchText.toLowerCase()); const matchesCareer = filterCareer ? item.career?.post?.toLowerCase().includes(filterCareer.toLowerCase()) : true; return matchesSearch && matchesCareer; }); async function handleDelete(id: number) { if (!confirm("Delete candidate?")) return; await deleteCandidateApi(id); fetchAll(); } const handleExport = () => { const exportData = filteredCandidates.map((item) => ({ ID: item.id, Name: item.fullName, Phone: item.mobile, Email: item.email, Career: item.career?.post, Designation: item.career?.designation, Subject: item.subject, CoverLetter: item.coverLetter, Date: new Date(item.createdAt).toLocaleDateString(), })); exportToExcel(exportData, "candidates"); }; return (

Candidates

setSearchText(e.target.value)} className="w-[220px]" /> setFilterCareer(e.target.value)} className="w-[200px]" />
Candidate List
ID Name Phone Email Career Designation Subject Cover Letter Applied On Actions {loading ? ( ) : filteredCandidates.length === 0 ? ( No candidates found ) : ( filteredCandidates.map((item) => ( {item.id} {item.fullName} {item.mobile} {item.email} {item.career?.post} {item.career?.designation} {item.subject} {item.coverLetter} {new Date(item.createdAt).toLocaleDateString()} )) )}
); }