"use client"; import CustomButton from "@/components/customs/custom-button"; import CustomDialog from "@/components/customs/custom-dialog"; import DataWrapper from "@/components/customs/DataWrapper"; import Search from "@/components/customs/custom-search"; import StateActive from "@/components/customs/StateActive"; import Table from "@/components/customs/custom-table"; import { QUERY_KEY, TYPE_STATUS } from "@/constant/config/enum"; import { httpRequest } from "@/services"; import consultationServices, { ConsultationItem, ConsultationResponse, } from "@/services/consultationServices"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import Link from "next/link"; import { Pencil, ClipboardPlus } from "lucide-react"; import { usePathname, useRouter, useSearchParams } from "next/navigation"; import React, { useMemo, useState } from "react"; import Pagination from "@/components/customs/custom-pagination"; import moment from "moment"; import specialtyServices, { SpecialtyItem } from "@/services/specialtyServices"; import FilterCustom from "@/components/customs/FilterCustom"; const MainPageConsultation = () => { const router = useRouter(); const pathname = usePathname(); const searchParams = useSearchParams(); const queryClient = useQueryClient(); /* ========================= QUERY PARAMS ========================= */ const _page = searchParams.get("_page"); const _pageSize = searchParams.get("_pageSize"); const _keyword = searchParams.get("_keyword"); const _status = searchParams.get("_status"); const _specialtyId = searchParams.get("_specialtyId"); /* ========================= STATE ========================= */ const [selectedConsultationId, setSelectedConsultationId] = useState(""); const [openCancelDialog, setOpenCancelDialog] = useState(false); const [openCompleteDialog, setOpenCompleteDialog] = useState(false); /* ========================= GET LIST ========================= */ const consultationQuery = useQuery({ queryKey: [QUERY_KEY.table_list_consultation, _page, _pageSize, _keyword], queryFn: async () => { const res = await httpRequest({ showMessageFailed: true, http: consultationServices.getConsultations({ Page: Number(_page || 1), PageSize: Number(_pageSize || 10), Search: _keyword || "", SortBy: _specialtyId || undefined, Desc: true, }), }); return ( res || { items: [], page: 1, pageSize: 10, total: 0, totalPages: 0, } ); }, }); /* ========================= DATA ========================= */ const specialtyQuery = useQuery({ queryKey: [QUERY_KEY.list_specialty_lookup], queryFn: async () => { const res = await httpRequest({ http: specialtyServices.getSpecialty(), showMessageFailed: true, }); return res || []; }, }); const consultationData = useMemo(() => { let data = consultationQuery.data?.items || []; if (_status) { data = data.filter((item) => item.status === Number(_status)); } if (_specialtyId) { data = data.filter((item) => item.specialtyClinics?.some( (specialty) => specialty.specialtyId === _specialtyId, ), ); } return data; }, [consultationQuery.data, _status, _specialtyId]); /* ========================= UPDATE QUERY ========================= */ const page = _page ? Number(_page) : 1; const pageSize = _pageSize ? Number(_pageSize) : 10; const updateQuery = (key: string, value: string | number) => { const params = new URLSearchParams(searchParams.toString()); if (!value || value === "") { params.delete(key); } else { params.set(key, String(value)); } if ( key === "_pageSize" || key === "_keyword" || key === "_status" || key === "_specialtyId" ) { params.delete("_page"); } const queryString = params.toString(); router.push(queryString ? `?${queryString}` : pathname); }; /* ========================= CLOSE POPUP ========================= */ // const handleClosePopup = () => { // const params = new URLSearchParams(searchParams.toString()); // params.delete("_create"); // params.delete("_update"); // const queryString = params.toString(); // router.push(queryString ? `?${queryString}` : pathname); // }; /* ========================= DIALOG ========================= */ const handleOpenCancel = (item: ConsultationItem) => { setSelectedConsultationId(item.id); setOpenCancelDialog(true); }; const handleOpenComplete = (item: ConsultationItem) => { setSelectedConsultationId(item.id); setOpenCompleteDialog(true); }; const handleCloseDialog = () => { setOpenCancelDialog(false); setOpenCompleteDialog(false); }; /* ========================= CANCEL ========================= */ const cancelConsultationMutation = useMutation({ mutationFn: async () => { return await httpRequest({ showMessageFailed: true, showMessageSuccess: true, msgSuccess: "Hủy phiên khám thành công!", http: consultationServices.cancelConsultations(selectedConsultationId), }); }, onSuccess() { queryClient.invalidateQueries({ queryKey: [QUERY_KEY.table_list_consultation], }); handleCloseDialog(); }, }); /* ========================= COMPLETE ========================= */ const completeConsultationMutation = useMutation({ mutationFn: async () => { return await httpRequest({ showMessageFailed: true, showMessageSuccess: true, msgSuccess: "Hoàn thành phiên khám thành công!", http: consultationServices.completeConsultations( selectedConsultationId, ), }); }, onSuccess() { queryClient.invalidateQueries({ queryKey: [QUERY_KEY.table_list_consultation], }); handleCloseDialog(); }, }); /* ========================= CONFIRM ========================= */ const handleConfirmCancel = () => { cancelConsultationMutation.mutate(); }; const handleConfirmComplete = () => { completeConsultationMutation.mutate(); }; return (
{/* HEADER */}

Phiên khám

} // onClick={handleOpenCreate} href="/consultation/create" > Tạo phiên khám
{/* SEARCH */}
updateQuery("_keyword", value)} placeholder="Tìm kiếm phiên khám..." />
name="Chuyên khoa" value={_specialtyId} onChange={(value) => updateQuery("_specialtyId", value ?? "")} listOption={useMemo(() => { return ( specialtyQuery.data?.map((item) => ({ uuid: item.id, name: item.name, })) || [] ); }, [specialtyQuery.data])} /> name="Trạng thái" value={_status ? Number(_status) : null} onChange={(value) => updateQuery("_status", value ?? "")} listOption={[ { uuid: TYPE_STATUS.Draft, name: "Đang chờ khám", }, { uuid: TYPE_STATUS.InProgress, name: "Đang khám tổng quát", }, { uuid: TYPE_STATUS.ToSpecialty, name: "Chờ khám chuyên khoa", }, { uuid: TYPE_STATUS.PendingPrescription, name: "Chờ nhận thuốc/kính", }, { uuid: TYPE_STATUS.Completed, name: "Hoàn thành", }, { uuid: TYPE_STATUS.Cancelled, name: "Đã hủy", }, ]} />
{/* TABLE */} item.id} data={consultationData} column={[ { title: "TÊN BỆNH NHÂN", render: (item: ConsultationItem) => ( {item.patientName} ), }, { title: "MÃ PHIÊN KHÁM", fixedLeft: true, render: (item: ConsultationItem) => ( {item.sessionCode} ), }, { title: "NGÀY KHÁM", render: (item: ConsultationItem) => ( {item.visitDate ? moment(item.visitDate).format("DD/MM/YYYY") : "---"} ), }, { title: "DẤU HIỆU", render: (item: ConsultationItem) => ( {item.symptomsText || "---"} ), }, { title: "CHUẨN ĐOÁN", render: (item: ConsultationItem) => ( {item.diagnosis || "---"} ), }, { title: "KẾ HOẠCH ĐIỀU TRỊ", render: (item: ConsultationItem) => ( {item.treatmentPlan || "---"} ), }, { title: "GHI CHÚ BÁC SĨ", render: (item: ConsultationItem) => ( {item.doctorNotes || "---"} ), }, { title: "CÁC CHUYÊN KHOA ĐANG CHỜ KHÁM", render: (item: ConsultationItem) => { const waitingSpecialties = item.specialtyClinics ?.filter((specialty) => specialty.specialtyStatus === 1) .map((specialty) => specialty.specialtyName) .join(", "); return {waitingSpecialties || "---"}; }, }, { title: "CÁC CHUYÊN KHOA ĐÃ KHÁM", render: (item: ConsultationItem) => { const completedSpecialties = item.specialtyClinics ?.filter((specialty) => specialty.specialtyStatus === 3) .map((specialty) => specialty.specialtyName) .join(", "); return {completedSpecialties || "---"}; }, }, { title: "TRẠNG THÁI", render: (item: ConsultationItem) => ( ), }, { fixedRight: true, title: "ACTION", render: (item: ConsultationItem) => { const isCancelled = item.status === TYPE_STATUS.Cancelled; const isCompleted = item.status === TYPE_STATUS.Completed; const isDisabled = isCancelled || isCompleted; // Tìm chuyên khoa có specialtyStatus = 1 const specialtyClinicActive = item.specialtyClinics?.find( (specialty) => specialty.specialtyStatus === 1, ); return (
{/* UPDATE */} ) } href={ specialtyClinicActive ? `/consultation/update-specialty?_id=${item.id}&specialtyClinicId=${specialtyClinicActive.id}` : `/consultation/update?_id=${item.id}` } > {specialtyClinicActive ? `Cập nhật ${specialtyClinicActive.specialtyName}` : undefined} {/* CANCEL */} handleOpenCancel(item)} > Hủy {/* COMPLETE */} handleOpenComplete(item)} > Hoàn thành
); }, }, ]} /> updateQuery("_page", value)} onSetPageSize={(value) => updateQuery("_pageSize", value)} dependencies={[_pageSize, _keyword, _specialtyId, _status]} /> {/* CANCEL DIALOG */} {/* COMPLETE DIALOG */} ); }; export default MainPageConsultation;