"use client"; import React, { useEffect, useMemo, useState } from "react"; import { useParams, useRouter, useSearchParams } from "next/navigation"; import { useQuery } from "@tanstack/react-query"; import { httpRequest } from "@/services"; import { QUERY_KEY, TYPE_STATUS } from "@/constant/config/enum"; import { ArrowLeft, Pencil } from "lucide-react"; import consultationServices, { AttachmentFile, ConsultationDetail, } from "@/services/consultationServices"; import StateActive from "@/components/customs/StateActive"; import TabNavLink from "@/components/customs/custom-tabs"; import moment from "moment"; import GridColumn from "@/components/layouts/GridColumn"; import DataWrapper from "@/components/customs/DataWrapper"; import Table from "@/components/customs/custom-table"; import CustomButton from "@/components/customs/custom-button"; import Pagination from "@/components/customs/custom-pagination"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "@radix-ui/react-tooltip"; const DetailConsultation = () => { const params = useParams(); const router = useRouter(); const searchParams = useSearchParams(); const specialtyId = searchParams.get("_type"); const consultationId = params?.id as string; const [prescriptionPage, setPrescriptionPage] = useState(1); const [prescriptionPageSize, setPrescriptionPageSize] = useState(10); const consulDetailQuery = useQuery({ queryKey: [QUERY_KEY.chi_tiet_phien_kham, consultationId], enabled: !!consultationId, queryFn: async () => { const res = await httpRequest({ showMessageFailed: true, http: consultationServices.detailConsultations(consultationId), }); return ( res || { id: "", patientId: "", sessionCode: "", visitDate: "", status: 1, chiefComplaint: null, symptomsText: null, vitalSigns: null, diagnosis: null, treatmentPlan: null, doctorNotes: null, createdBy: "", isDeleted: false, specialtyClinics: [], } ); }, }); const consultation = consulDetailQuery.data; const canUpdateConsultation = consultation?.status !== TYPE_STATUS.Completed && consultation?.status !== TYPE_STATUS.Cancelled; const specialtyTabs = useMemo(() => { return ( consultation?.specialtyClinics?.map((item) => ({ pathname: `/consultation/${consultationId}`, query: item.id, title: item.specialtyName, })) || [] ); }, [consultation?.specialtyClinics, consultationId]); // Tính toán cắt mảng dữ liệu thuốc để hiển thị phân trang trên Client const paginatedPrescriptionItems = useMemo(() => { const items = consultation?.aggregatedPrescriptionItems || []; const startIndex = (prescriptionPage - 1) * prescriptionPageSize; const endIndex = startIndex + prescriptionPageSize; return items.slice(startIndex, endIndex); }, [ consultation?.aggregatedPrescriptionItems, prescriptionPage, prescriptionPageSize, ]); const specialtyClinics = consultation?.specialtyClinics; const selectedSpecialty = useMemo(() => { if (!specialtyClinics?.length) return null; return ( specialtyClinics.find((item) => item.id === specialtyId) || specialtyClinics[0] ); }, [specialtyClinics, specialtyId]); useEffect(() => { if (consultation?.specialtyClinics?.length && !specialtyId) { router.replace(`?&_type=${consultation.specialtyClinics[0].id}`); } }, [consultation?.specialtyClinics, specialtyId, router]); if (consulDetailQuery.isLoading) { return
Đang tải dữ liệu...
; } if (!consultation) { return
Không tìm thấy dữ liệu phiên khám
; } type PrescriptionItem = ConsultationDetail["aggregatedPrescriptionItems"][number]; // const getFileInfo = (file: AttachmentFile | string, index: number) => { // if (typeof file === "string") { // return { // fileName: file.split("/").pop() || `File ${index + 1}`, // path: file, // }; // } // return file; // }; const getFileInfo = (file: AttachmentFile | string, index: number) => { if (typeof file === "string") { return { fileName: file.split("/").pop() || `File ${index + 1}`, path: `${process.env.NEXT_PUBLIC_IMAGE}${file}`, }; } return { ...file, path: `${process.env.NEXT_PUBLIC_IMAGE}${file.path}`, }; }; return (
{/* HEADER */}
router.back()} >

Chi tiết phiên khám

{consultation.status === TYPE_STATUS.PendingPrescription && canUpdateConsultation && ( } href={`/consultation/update?_id=${consultation.id}`} > Cập nhật tổng quát )}
{/* ID PHIÊN KHÁM */} {/*

ID PHIÊN KHÁM

{consultation.id}

*/} {/* MÃ PHIÊN KHÁM */}

MÃ PHIÊN KHÁM

{consultation.sessionCode}

{/* TÊN BỆNH NHÂN */}

TÊN BỆNH NHÂN

{consultation.patientName}

{/* NGÀY GIỜ KHÁM */}

NGÀY, GIỜ KHÁM

{consultation.visitDate ? moment(consultation.visitDate).format("DD/MM/YYYY") : "---"}

{/* TRIỆU CHỨNG */}

DẤU HIỆU

{consultation.symptomsText || "---"}

{/* KHIẾU NẠI CHÍNH */}

KHIẾU NẠI CHÍNH

{consultation.chiefComplaint || "---"}

{/* CHỈ SỐ HUYẾT ÁP, CHỈ SỐ MẠCH */}

CHỈ SỐ HUYẾT ÁP, CHỈ SỐ MẠCH

{consultation.vitalSigns || "---"}

{/* CHẨN ĐOÁN */}

CHUẨN ĐOÁN

{consultation.diagnosis || "---"}

{/* KẾ HOẠCH ĐIỀU TRỊ */}

KẾ HOẠCH ĐIỀU TRỊ

{consultation.treatmentPlan || "---"}

{/* GHI CHÚ BÁC SĨ */}

GHI CHÚ BÁC SĨ

{consultation.doctorNotes || "---"}

{/* NGƯỜI TẠO */}

NGƯỜI TẠO

{consultation.createdByName || "---"}

CÁC CHUYÊN KHOA ĐANG CHỜ KHÁM

{consultation.specialtyClinics ?.filter((specialty) => specialty.specialtyStatus === 1) .map((specialty) => specialty.specialtyName) .join(", ") || "---"}

CÁC CHUYÊN KHOA ĐÃ KHÁM

{consultation.specialtyClinics ?.filter((specialty) => specialty.specialtyStatus === 3) .map((specialty) => specialty.specialtyName) .join(", ") || "---"}

FILE UPLOAD

{consultation.generalAttachmentUrls?.length > 0 ? (
📎 Chi tiết các file

Danh sách file đính kèm

{consultation.generalAttachmentUrls.map( (item, index) => { const file = getFileInfo(item, index); const extension = file.fileName .split(".") .pop() ?.toLowerCase() || ""; const isImage = [ "jpg", "jpeg", "png", "gif", "webp", "bmp", "svg", ].includes(extension); return (
{isImage ? "🖼️" : "📄"}

{file.fileName}

{extension || "FILE"}

Mở
); }, )}
) : (
Không có file nào được tải lên
)}

TRẠNG THÁI

{/* HEADER */}

Danh sách đơn thuốc

String(index) rowKey={(item: PrescriptionItem) => { // Tìm vị trí của item hiện tại trong mảng paginatedPrescriptionItems const idx = paginatedPrescriptionItems.indexOf(item); return item.id || String(idx); }} data={paginatedPrescriptionItems} // Hiển thị dữ liệu trang hiện tại column={[ { title: "Tên thuốc", render: (item: PrescriptionItem) => ( {item.medicineName} ), }, { title: "Liều dùng", render: (item: PrescriptionItem) => ( {item.dosage} ), }, { title: "Tần suất", render: (item: PrescriptionItem) => ( {item.frequency} ), }, { title: "Thời gian", render: (item: PrescriptionItem) => ( {item.duration} ), }, { title: "Hướng dẫn", render: (item: PrescriptionItem) => ( {item.instructions || "---"} ), }, ]} /> {/* Chỉ hiển thị phân trang khi tổng số lượng thuốc lớn hơn 10 phần tử */} {(consultation.aggregatedPrescriptionItems?.length || 0) > 10 && ( setPrescriptionPage(value)} onSetPageSize={(value) => { setPrescriptionPageSize(value); setPrescriptionPage(1); // Reset về trang 1 khi thay đổi kích thước hiển thị hàng }} dependencies={[prescriptionPage, prescriptionPageSize]} /> )} {/* TAB CHUYÊN KHOA */} {specialtyTabs.length > 0 && (
)} {/* CHI TIẾT CHUYÊN KHOA */} {selectedSpecialty && (

Thông tin chuyên khoa: {selectedSpecialty.specialtyName}

{canUpdateConsultation && ( } href={`/consultation/update-specialty?_id=${consultation.id}&specialtyClinicId=${selectedSpecialty.id}`} > Cập nhật chuyên khoa )}

CHUYÊN KHOA

{/* Thêm class để bọc text */}

{selectedSpecialty.specialtyName || "---"}

CHẨN ĐOÁN

{/* Thêm class để bọc text */}

{selectedSpecialty.diagnosis || "---"}

GHI CHÚ KHÁM

{/* Thêm class để bọc text */}

{selectedSpecialty.specialtyNotes || "---"}

THỦ THUẬT

{/* Thêm class để bọc text */}

{selectedSpecialty.procedureNotes || "---"}

FILE UPLOAD

{selectedSpecialty.attachmentUrls?.length > 0 ? (
📎 Chi tiết các file

Danh sách file đính kèm

{selectedSpecialty.attachmentUrls.map( (item, index) => { const file = getFileInfo(item, index); const extension = file.fileName.split(".").pop()?.toLowerCase() || ""; const isImage = [ "jpg", "jpeg", "png", "gif", "webp", "bmp", "svg", ].includes(extension); return (
{isImage ? "🖼️" : "📄"}

{file.fileName}

{extension || "FILE"}

Mở
); }, )}
) : (
Không có file nào được tải lên
)}
{selectedSpecialty.glassRequired && ( <>

CẦN ĐEO KÍNH

LOẠI KÍNH

{selectedSpecialty.glassType || "---"}

ĐÃ PHÁT KÍNH CHƯA

{selectedSpecialty.isGlassesDelivered ? (

Đã phát kính

) : (

Chưa phát kính

)}
)}
)} ); }; export default DetailConsultation;