import { useState, useEffect, useCallback } from "react"; import { getCareersApi, updateCareerApi, createCareerApi } from "@/api/career"; 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 { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Badge } from "@/components/ui/badge"; import { Switch } from "@/components/ui/switch"; import { Label } from "@/components/ui/label"; import { Loader2, Plus, Pencil, RefreshCw, ChevronLeft, ChevronRight, } from "lucide-react"; export default function CareerPage() { const [careers, setCareers] = useState([]); const [loading, setLoading] = useState(true); const [openModal, setOpenModal] = useState(false); const [editing, setEditing] = useState(null); const [searchText, setSearchText] = useState(""); const [currentPage, setCurrentPage] = useState(1); const itemsPerPage = 10; const [form, setForm] = useState({ post: "", designation: "", qualification: "", experienceNeed: "", email: "", number: "", status: "new", isActive: true, sortOrder: 0, }); const fetchAll = useCallback(async () => { setLoading(true); try { const res = await getCareersApi(); setCareers(res?.data || []); } catch (err) { console.error(err); } finally { setLoading(false); } }, []); useEffect(() => { fetchAll(); }, [fetchAll]); const filteredCareers = careers.filter( (item) => item.post?.toLowerCase().includes(searchText.toLowerCase()) || item.designation?.toLowerCase().includes(searchText.toLowerCase()), ); useEffect(() => { setCurrentPage(1); }, [searchText]); const totalPages = Math.ceil(filteredCareers.length / itemsPerPage); const indexOfLastItem = currentPage * itemsPerPage; const indexOfFirstItem = indexOfLastItem - itemsPerPage; const currentItems = filteredCareers.slice(indexOfFirstItem, indexOfLastItem); function handleChange(e: any) { setForm({ ...form, [e.target.name]: e.target.value }); } const handleToggleStatus = async (item: any) => { try { await updateCareerApi(item.id, { ...item, isActive: !item.isActive, } as any); fetchAll(); } catch (error) { console.error("Failed to toggle status", error); } }; function openAdd() { setEditing(null); setForm({ post: "", designation: "", qualification: "", experienceNeed: "", email: "", number: "", status: "new", isActive: true, sortOrder: 0, }); setOpenModal(true); } function openEdit(item: any) { setEditing(item); setForm({ post: item.post || "", designation: item.designation || "", qualification: item.qualification || "", experienceNeed: item.experienceNeed || "", email: item.email || "", number: item.number || "", status: item.status || "new", isActive: item.isActive ?? true, sortOrder: item.sortOrder ?? 0, }); setOpenModal(true); } async function handleSubmit() { try { if (editing) { await updateCareerApi(editing.id, form); } else { await createCareerApi(form); } setOpenModal(false); fetchAll(); } catch (err) { console.error(err); } } return (

Careers

setSearchText(e.target.value)} className="w-[250px] text-base" />
Career Opportunities
Priority Post & Designation Qualification Experience Status (Active) Actions {loading ? ( ) : currentItems.length === 0 ? ( No careers found ) : ( currentItems.map((item) => ( {item.sortOrder}
{item.post}
{item.designation}
{item.qualification}
{item.experienceNeed}
handleToggleStatus(item)} /> {item.isActive ? "Active" : "Hidden"}
)) )}
{!loading && filteredCareers.length > 0 && (
Showing{" "} {indexOfFirstItem + 1} to{" "} {Math.min(indexOfLastItem, filteredCareers.length)} {" "} of{" "} {filteredCareers.length}{" "} careers
Page {currentPage} of {totalPages}
)}
{editing ? "Edit Career" : "Add New Career"}
setForm({ ...form, isActive: val })} />
); }