"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 { 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: "", sessionCode: "", visitDate: "", status: 1, chiefComplaint: null, symptomsText: null, vitalSigns: null, diagnosis: null, treatmentPlan: null, doctorNotes: null, createdBy: "", isDeleted: false, specialtyClinics: [ { id: "", specialtyId: "", specialtyName: "", specialtyNotes: null, diagnosis: null, procedureNotes: null, glassRequired: null, glassType: null, examinerName: "", specialtyStatus: 1, attachmentUrls: [], sharedItems: [], }, ], aggregatedPrescriptionItems: [], } ); }, }); // Tìm chuyên khoa hiện tại từ data trả về const selectedSpecialtyClinic = consulDetailQuery.data?.specialtyClinics?.find( (item) => item.id === specialtyClinicId, ); /** * ĐIỀU KIỆN KIỂM TRA KHOA MẮT * Bạn hãy thay đổi điều kiện này tùy thuộc vào database của bạn. * Ví dụ: selectedSpecialtyClinic?.specialtyId === "MẮT" hoặc kiểm tra theo tên. */ const isEyeClinic = selectedSpecialtyClinic?.specialtyName?.toLowerCase().includes("mắt") || selectedSpecialtyClinic?.specialtyId?.toLowerCase().includes("mat"); useEffect(() => { const consul = consulDetailQuery.data; if (!consul) return; const specialtyClinic = consul.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( (consul.generalAttachmentUrls || []).map((url) => ({ file: null, img: url, path: url, })), ); }, [consulDetailQuery.data, 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 phiên khám thành công!", http: consultationServices.specialtyResults( form.specialtyAssignmentId, { specialtyNotes: form.specialtyNotes, diagnosis: form.diagnosis, procedureNotes: form.procedureNotes, // Nếu không phải khoa mắt, gán mặc định false và chuỗi rỗng khi gửi API 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: consulDetailQuery.data?.sessionCode, }); console.log("Cấu trúc log kiểm tra uploadResult:", uploadResult); // CẬP NHẬT Ở ĐÂY: Lấy trực tiếp từ uploadResult hoặc bóc tách đúng tầng data 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

{/* CHUYÊN KHOA INFO */} {/* KHỐI THÔNG TIN KHÁM CHUNG (Luôn cố định 3 cột đẹp mắt) */}

Thông tin khám chung

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)

{/* Radio Chọn Có/Không */}
{/* TextArea Loại Kính (Trải rộng ra 100% dòng tạo cảm giác thoáng đãng) */} {form.glassRequired && (