diff --git a/src/Pages/InternshipDetailsAdmin.tsx b/src/Pages/InternshipDetailsAdmin.tsx index ecd1e3c..b9e45b1 100644 --- a/src/Pages/InternshipDetailsAdmin.tsx +++ b/src/Pages/InternshipDetailsAdmin.tsx @@ -4,16 +4,35 @@ import NavbarAdmin from "../Layout/NavbarAdmin"; import SidebarAdmin from "../Layout/SidebarAdmin"; import axios from "axios"; +type Applicant = { + id: number; + nama_depan: string; + nama_belakang: string; + email: string; + kontak: string; + jurusan: string; + motivasi: string; + relevant_skills: string; + cv_path: string; + portofolio_path: string; + posisi: string; + kelompok_peminatan?: string; + status: string; +}; + const InternshipDetailsAdmin = () => { const { id } = useParams(); // id lamaran magang - const [applicant, setApplicant] = useState(null); - - const token = document.cookie - .split("; ") - .find((row) => row.startsWith("token=")) - ?.split("=")[1]; + const [applicant, setApplicant] = useState(null); + const [error, setError] = useState(null); useEffect(() => { + if (!id) return; + + const token = document.cookie + .split("; ") + .find((row) => row.startsWith("token=")) + ?.split("=")[1]; + axios .get( `${import.meta.env.VITE_API_BASE_URL}/lamaran-magang-api/get/${id}`, @@ -24,14 +43,74 @@ const InternshipDetailsAdmin = () => { } ) .then((res) => { - setApplicant(res.data.data[0]); + console.log("Detail lamaran:", res.data); + + const raw = + Array.isArray(res.data?.data) && res.data.data.length > 0 + ? res.data.data[0] + : Array.isArray(res.data) + ? res.data[0] + : res.data?.data ?? res.data; + + if (!raw) { + setError("Data lamaran tidak ditemukan."); + return; + } + + console.log("Raw detail:", raw); // cek struktur asli + + const mapped: Applicant = { + id: raw.id, + + // dari relasi mahasiswa + nama_depan: raw.mahasiswa?.nama_depan ?? "", + nama_belakang: raw.mahasiswa?.nama_belakang ?? "", + email: raw.mahasiswa?.email ?? raw.email ?? "", + kontak: raw.mahasiswa?.kontak ?? raw.kontak ?? "", + jurusan: raw.mahasiswa?.jurusan ?? raw.jurusan ?? "", + + // dari relasi lowongan_magang + posisi: raw.lowongan_magang?.posisi ?? raw.posisi ?? "", + kelompok_peminatan: + raw.lowongan_magang?.kelompok_peminatan ?? + raw.kelompok_peminatan ?? + "", + + // 🔥 ini dia: ambil dari mahasiswa + motivasi: raw.mahasiswa?.motivasi ?? raw.motivasi ?? "", + + relevant_skills: + raw.mahasiswa?.relevant_skills ?? + raw.relevant_skills ?? + raw.relevant_skill ?? + "", + + // sekalian amankan CV & portofolio kalau memang ikut di object mahasiswa + cv_path: raw.cv_path ?? raw.mahasiswa?.cv_path ?? "", + portofolio_path: + raw.portofolio_path ?? raw.mahasiswa?.portofolio_path ?? "", + + status: raw.status ?? "diproses", + }; + + setApplicant(mapped); + setError(null); }) + .catch((err) => { console.error("Gagal fetch detail lamaran", err); + setError("Gagal mengambil detail lamaran."); }); }, [id]); + const token = document.cookie + .split("; ") + .find((row) => row.startsWith("token=")) + ?.split("=")[1]; + const handleStatusUpdate = (status: "diterima" | "ditolak") => { + if (!id) return; + axios .patch( `${import.meta.env.VITE_API_BASE_URL}/lamaran-magang-api/update/${id}`, @@ -44,13 +123,17 @@ const InternshipDetailsAdmin = () => { ) .then(() => { alert(`Status berhasil diubah menjadi ${status}`); - setApplicant((prev: any) => ({ ...prev, status })); + setApplicant((prev) => (prev ? { ...prev, status } : prev)); }) .catch((err) => { console.error("Gagal update status", err); }); }; + if (error) { + return

{error}

; + } + if (!applicant) return

Loading...

; return ( @@ -117,9 +200,10 @@ const InternshipDetailsAdmin = () => {

Skill:

- {applicant.relevant_skills + {(applicant.relevant_skills || "") .split(",") - .map((skill: string, idx: number) => ( + .filter((s) => s.trim() !== "") + .map((skill, idx) => ( { }, }) .then((res) => { - setApplications(res.data.data || []); + const raw = Array.isArray(res.data.data) ? res.data.data : []; + + const mapped: Application[] = raw.map((item: any) => ({ + id: item.id, + nama_depan: item.mahasiswa?.nama_depan ?? "", + posisi: item.lowongan_magang?.posisi ?? "", + status: item.status ?? "diproses", + })); + + setApplications(mapped); }) .catch((err) => { console.error("Gagal mengambil data lamaran:", err); @@ -42,7 +51,6 @@ const InternshipList = () => { fetchApplications(); const interval = setInterval(fetchApplications, 10000); - return () => clearInterval(interval); }, []); @@ -62,11 +70,13 @@ const InternshipList = () => { const indexOfLastItem = currentPage * itemsPerPage; const indexOfFirstItem = indexOfLastItem - itemsPerPage; - const filteredApplications = applications.filter( - (app) => - app.nama_depan.toLowerCase().includes(searchTerm.toLowerCase()) || - app.posisi.toLowerCase().includes(searchTerm.toLowerCase()) - ); + const filteredApplications = applications.filter((app) => { + const term = searchTerm.toLowerCase(); + const nama = (app.nama_depan ?? "").toLowerCase(); + const posisi = (app.posisi ?? "").toLowerCase(); + + return nama.includes(term) || posisi.includes(term); + }); const currentItems = filteredApplications.slice( indexOfFirstItem, @@ -213,17 +223,17 @@ const InternshipList = () => { - {app.status.charAt(0).toUpperCase() + - app.status.slice(1)} + {(app.status ?? "diproses").charAt(0).toUpperCase() + + (app.status ?? "diproses").slice(1)}