feat:update

This commit is contained in:
TuanVT
2026-06-04 15:59:39 +07:00
parent 77dd05932e
commit 7791e1d6a8
19 changed files with 572 additions and 678 deletions
@@ -5,12 +5,14 @@ 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";
@@ -23,6 +25,8 @@ const UpdateSpecialtyClinicId = () => {
const consultationId = searchParams.get("_id") || "";
const specialtyClinicId = searchParams.get("specialtyClinicId") || "";
const [images, setImages] = useState<any[]>([]);
const [uploading, setUploading] = useState(false);
const [form, setForm] = useState<{
specialtyAssignmentId: string;
@@ -31,6 +35,7 @@ const UpdateSpecialtyClinicId = () => {
procedureNotes: string;
glassRequired: boolean;
glassType: string;
fileUrls: string[];
}>({
specialtyAssignmentId: "",
specialtyNotes: "",
@@ -38,6 +43,7 @@ const UpdateSpecialtyClinicId = () => {
procedureNotes: "",
glassRequired: false,
glassType: "",
fileUrls: [],
});
/* =========================
@@ -79,6 +85,7 @@ const UpdateSpecialtyClinicId = () => {
glassType: null,
examinerName: "",
specialtyStatus: 1,
attachmentUrls: [],
sharedItems: [],
},
],
@@ -120,14 +127,23 @@ const UpdateSpecialtyClinicId = () => {
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 () => {
mutationFn: async (body: { paths: string[] }) => {
if (!consultationId) {
throw new Error("Không tìm thấy ID phiên khám!");
}
@@ -145,6 +161,7 @@ const UpdateSpecialtyClinicId = () => {
// 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,
},
),
});
@@ -165,8 +182,39 @@ const UpdateSpecialtyClinicId = () => {
},
});
const handleSubmit = () => {
specialtyResultsMutation.mutate();
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 =
@@ -311,6 +359,15 @@ const UpdateSpecialtyClinicId = () => {
</div>
</div>
)}
<div className="space-y-4">
<label className="text-sm font-medium">Tài liệu đính kèm</label>
<UploadMultipleFile images={images} setImages={setImages} />
{uploading && (
<p className="text-sm text-blue-500">Đang upload file...</p>
)}
</div>
{/* BUTTON ACTION */}
<div className="mt-4 flex items-center justify-end gap-3 border-t pt-5">