"use client"; import { useSelector } from "react-redux"; import { RootState } from "@/store/store"; import { SafeHTMLRenderer } from "@/components/ui/parse/SafeHTMLRenderer"; import { useRouter } from "next/navigation"; import { useState } from "react"; import { apiDeleteHistorianCV } from "@/service/historianService"; import Swal from "sweetalert2"; import { statusConfig } from "@/service/handler"; import Lightbox from "yet-another-react-lightbox"; import Zoom from "yet-another-react-lightbox/plugins/zoom"; import Captions from "yet-another-react-lightbox/plugins/captions"; import "yet-another-react-lightbox/styles.css"; import "yet-another-react-lightbox/plugins/captions.css"; import { URL_MEDIA } from "../../../../../../api"; import Image from "next/image"; export default function ApplicationDetailPage() { const application = useSelector( (state: RootState) => state.user.selectedApplication, ); const router = useRouter(); const [isDeleting, setIsDeleting] = useState(false); const [errMessage, setErrMessage] = useState( "Không thể xóa đơn đăng ký này.", ); const [index, setIndex] = useState(-1); if (!application) { return (
Đang tải hoặc không có dữ liệu...
); } const config = statusConfig[application.status] || statusConfig.PENDING; const isImageFile = (file: any) => { const isImageMime = file.mime_type?.startsWith("image/"); const isImageExt = /\.(jpg|jpeg|png|webp|gif)$/i.test(file.storage_key); return isImageMime || isImageExt; }; const imageMediaOnly = (application.media || []).filter(isImageFile); const imageSlides = imageMediaOnly.map((item: any) => ({ src: `${URL_MEDIA}${item.storage_key}`, title: item.original_name, description: `Dung lượng: ${(item.size / 1024).toFixed(2)} KB`, })); const handleMediaClick = (item: any) => { const fileUrl = `${URL_MEDIA}${item.storage_key}`; if (isImageFile(item)) { const photoIndex = imageMediaOnly.findIndex( (img: any) => img.id === item.id, ); setIndex(photoIndex); } else { const googleDocsUrl = `https://docs.google.com/viewer?url=${encodeURIComponent(fileUrl)}&embedded=true`; window.open(googleDocsUrl, "_blank"); } }; const handleDelete = async () => { const isDarkMode = document.documentElement.classList.contains("dark"); const result = await Swal.fire({ title: "Xác nhận xóa?", text: "Bạn sẽ không thể khôi phục lại đơn đăng ký này!", icon: "warning", showCancelButton: true, confirmButtonColor: "#ef4444", cancelButtonColor: "#71717a", confirmButtonText: "Xóa ngay", cancelButtonText: "Hủy", background: isDarkMode ? "#18181b" : "#fff", color: isDarkMode ? "#fff" : "#000", }); if (result.isConfirmed) { try { setIsDeleting(true); await apiDeleteHistorianCV(application.id); // Thành công (200 OK) await Swal.fire({ title: "Đã xóa!", icon: "success", timer: 1500, showConfirmButton: false, background: isDarkMode ? "#18181b" : "#fff", color: isDarkMode ? "#fff" : "#000", }); router.push("/account"); } catch (error: any) { setErrMessage( error.response?.data?.message || "Có lỗi xảy ra khi xóa!", ); if ( error.response?.data?.message === "You don't have permission to access this resource." ) { setErrMessage("Bạn không có quyền xóa đơn đăng ký này."); } Swal.fire({ title: "Lỗi!", text: errMessage, icon: "error", background: isDarkMode ? "#18181b" : "#fff", color: isDarkMode ? "#fff" : "#000", }); } finally { setIsDeleting(false); } } }; const formatDate = (dateString: string | null | undefined) => { if (!dateString) return "-"; const date = new Date(dateString); return date.toLocaleDateString("vi-VN", { day: "2-digit", month: "2-digit", year: "numeric", hour: "2-digit", minute: "2-digit", }); }; // console.log("Application Detail:", application); return (

Chi tiết đơn đăng ký

{application.status}
{application.media && application.media.length > 0 && (
{application.media.map((item: any) => { const isImg = isImageFile(item); return (
handleMediaClick(item)} className="group relative min-w-[160px] h-[160px] overflow-hidden rounded-2xl border-2 border-zinc-100 dark:border-zinc-800 cursor-pointer bg-zinc-100 dark:bg-zinc-900 flex flex-col items-center justify-center transition-all hover:border-blue-500" > {isImg ? ( <> {item.original_name}

Xem ảnh

) : (
📄

.{item.storage_key.split(".").pop()}

{item.original_name}

Preview
)}
); })}
)} {application.status !== "APPROVED" && application.status !== "REJECTED" && (
)} {application?.reviewer && (
{application?.reviewer?.avatar_url ? ( {application.reviewer.display_name ) : (
{application?.reviewer?.display_name?.charAt(0) || "R"}
)}

{application?.reviewer?.display_name}

{application?.reviewer?.email}

{formatDate(application?.reviewed_at)}
{application?.review_note ? (

{application.review_note}

) : (

Không có ghi chú bổ sung.

)}
)}
= 0} close={() => setIndex(-1)} slides={imageSlides} plugins={[Zoom, Captions]} styles={{ root: { zIndex: 99999, "--yarl__color_backdrop": "rgba(0, 0, 0, 0.95)", }, }} />
); }