"use client"; import CustomButton from "@/components/customs/custom-button"; import GridColumn from "@/components/layouts/GridColumn"; import FormCustom from "@/components/utils/FormCustom"; import InputForm from "@/components/utils/FormCustom/components/InputForm"; import TextArea from "@/components/utils/FormCustom/components/TextArea"; import UploadMultipleFile from "@/components/utils/UploadMultipleFile"; import { PATH } from "@/constant/config"; import { QUERY_KEY } from "@/constant/config/enum"; import { httpRequest } from "@/services"; import consultationServices, { ConsultationDetail, } from "@/services/consultationServices"; import uploadServices from "@/services/uploadServices"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import moment from "moment"; import { useParams, useRouter, useSearchParams } from "next/navigation"; import React, { useEffect, useState } from "react"; const UpdateSpecialtyClinicId = () => { const router = useRouter(); const params = useParams(); const searchParams = useSearchParams(); const queryClient = useQueryClient(); const consultationId = searchParams.get("_id") || ""; const specialtyClinicId = searchParams.get("specialtyClinicId") || ""; const [images, setImages] = useState([]); const [uploading, setUploading] = useState(false); const [form, setForm] = useState<{ specialtyAssignmentId: string; specialtyNotes: string; diagnosis: string; procedureNotes: string; glassRequired: boolean; glassType: string; fileUrls: string[]; }>({ specialtyAssignmentId: "", specialtyNotes: "", diagnosis: "", procedureNotes: "", glassRequired: false, glassType: "", fileUrls: [], }); /* ========================= GET DETAIL API ========================= */ 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: "", patientName: "", sessionCode: "", visitDate: "", status: 1, chiefComplaint: null, symptomsText: null, vitalSigns: null, diagnosis: null, treatmentPlan: null, doctorNotes: null, isGlassesDelivered: false, createdBy: "", createdByName: "", isDeleted: false, generalAttachmentUrls: [], specialtyClinics: [], aggregatedPrescriptionItems: [], } ); }, }); // Khai báo dữ liệu lấy từ Query phục vụ hiển thị const generalData = consulDetailQuery.data; // Tìm chuyên khoa hiện tại từ data trả về const selectedSpecialtyClinic = generalData?.specialtyClinics?.find( (item) => item.id === specialtyClinicId, ); const isEyeClinic = selectedSpecialtyClinic?.specialtyName?.toLowerCase().includes("mắt") || selectedSpecialtyClinic?.specialtyId?.toLowerCase().includes("mat"); useEffect(() => { if (!generalData) return; const specialtyClinic = generalData.specialtyClinics?.find( (item) => item.id === specialtyClinicId, ); if (!specialtyClinic) return; setForm({ specialtyAssignmentId: specialtyClinic.id || "", specialtyNotes: specialtyClinic.specialtyNotes || "", diagnosis: specialtyClinic.diagnosis || "", procedureNotes: specialtyClinic.procedureNotes || "", glassRequired: specialtyClinic.glassRequired || false, glassType: specialtyClinic.glassType || "", fileUrls: specialtyClinic.attachmentUrls || [], }); setImages( (specialtyClinic.attachmentUrls || []).map((url) => ({ file: null, img: url, path: url, })), ); }, [generalData, specialtyClinicId]); /* ========================= UPDATE MUTATION ========================= */ const specialtyResultsMutation = useMutation({ mutationFn: async (body: { paths: string[] }) => { if (!consultationId) { throw new Error("Không tìm thấy ID phiên khám!"); } return httpRequest({ showMessageFailed: true, showMessageSuccess: true, msgSuccess: "Cập nhật kết quả khám chuyên khoa thành công!", http: consultationServices.specialtyResults( form.specialtyAssignmentId, { specialtyNotes: form.specialtyNotes, diagnosis: form.diagnosis, procedureNotes: form.procedureNotes, glassRequired: isEyeClinic ? form.glassRequired : false, glassType: isEyeClinic ? form.glassType : "", fileUrls: body.paths, }, ), }); }, onSuccess(data) { if (!data) return; queryClient.invalidateQueries({ queryKey: [QUERY_KEY.table_list_consultation], }); queryClient.invalidateQueries({ queryKey: [QUERY_KEY.chi_tiet_phien_kham, consultationId], }); router.back(); router.push(PATH.CONSULTATION || "/consultation"); }, }); const handleSubmit = async () => { try { const currentImage = images .filter((item) => !!item.img) .map((item) => item.img); const files = images .filter((item) => !!item.file) .map((item) => item.file); if (files.length > 0) { const uploadResult: any = await uploadServices.uploadImage({ Files: files, SessionCode: generalData?.sessionCode, }); const uploadedUrls = uploadResult?.fileUrls || uploadResult?.data?.fileUrls || []; return specialtyResultsMutation.mutate({ paths: [...currentImage, ...uploadedUrls], }); } return specialtyResultsMutation.mutate({ paths: currentImage, }); } catch (error) { console.error(error); } }; const isLoading = consulDetailQuery.isLoading || specialtyResultsMutation.isPending; if (consulDetailQuery.isLoading) { return (
Đang tải dữ liệu phiên khám...
); } return (
{/* HEADER */}

Phiên khám chuyên khoa

Cập nhật kết quả chi tiết quá trình khám bệnh của bệnh nhân

{/* THÔNG TIN HÀNH CHÍNH & PHIÊN KHÁM TỔNG QUÁT */}

Thông tin tổng quan phiên khám

Tên bệnh nhân {generalData?.patientName || "Chưa có thông tin"}
Ngày sinh {generalData?.patientDateOfBirth ? moment(generalData?.patientDateOfBirth).format("DD/MM/YYYY") : "---"}
Mã phiên khám tổng quát #{generalData?.sessionCode || "Chưa có mã"}
{/* KHỐI THÔNG TIN KHÁM CHUYÊN KHOA */}

Kết quả khám chuyên khoa đảm nhận

setForm((prev) => ({ ...prev, specialtyNotes: String(v) })) } /> setForm((prev) => ({ ...prev, diagnosis: String(v) })) } /> setForm((prev) => ({ ...prev, procedureNotes: String(v) })) } />
{/* KHỐI THÔNG TIN KHÁM MẮT (Chỉ hiển thị khi là khoa mắt) */} {isEyeClinic && (

Chỉ định thị lực (Khoa Mắt)

{form.glassRequired && (