"use client"; import CustomButton from "@/components/customs/custom-button"; import CustomDialog from "@/components/customs/custom-dialog"; import CustomPopup from "@/components/customs/custom-popup"; 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 { PATH } from "@/constant/config"; import Pagination from "@/components/customs/custom-pagination"; 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"); /* ========================= 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: "id", Desc: true, }), }); return ( res || { items: [], page: 1, pageSize: 10, total: 0, totalPages: 0, } ); }, }); /* ========================= DATA ========================= */ const consultationData = useMemo(() => { return consultationQuery.data?.items || []; }, [consultationQuery.data]); /* ========================= 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 === "" || (key === "_page" && value === 1)) { params.delete(key); } else { params.set(key, String(value)); } if (key === "_pageSize") { 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..." />
{/* TABLE */} item.id} data={consultationData} column={[ { fixedLeft: true, title: "ID PHIÊN KHÁM", render: (item: ConsultationItem) => ( {item.id} ), }, { title: "TÊN BỆNH NHÂN", render: (item: ConsultationItem) => ( {item.patientName} ), }, { title: "MÃ PHIÊN KHÁM", render: (item: ConsultationItem) => ( {item.sessionCode} ), }, { title: "NGÀY KHÁM", render: (item: ConsultationItem) => {item.visitDate}, }, { 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: "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; return (
{/* UPDATE */} } href={`/consultation/update?_id=${item?.id}`} /> {/* CANCEL */} handleOpenCancel(item)} > Hủy {/* COMPLETE */} handleOpenComplete(item)} > Hoàn thành
); }, }, ]} /> updateQuery("_page", value)} onSetPageSize={(value) => updateQuery("_pageSize", value)} dependencies={[_pageSize, _keyword]} /> {/* CANCEL DIALOG */} {/* COMPLETE DIALOG */} ); }; export default MainPageConsultation;