เพิ่ม Custom Confirmation Dialog ที่ใช้ Modal Component ของ Daisy UI เพื่อแทนที่ window.confirm()

This commit is contained in:
Flook 2025-11-12 05:38:35 +07:00
parent 5670ef88e1
commit 7686d89fe0
2 changed files with 84 additions and 2 deletions

View File

@ -0,0 +1,50 @@
import React from 'react';
import { FaTrash, FaTimesCircle } from 'react-icons/fa'; // Icons
export default function ConfirmModal({ message, onConfirm, onCancel, isOpen, isDeleting }) {
// open={isOpen} <dialog>
if (!isOpen) return null;
return (
// Div (Backdrop)
<div className="fixed inset-0 bg-gray-300 bg-opacity-30 z-[110] flex justify-center items-center p-4">
<dialog className="modal modal-open" open={isOpen}>
<div className="modal-box max-w-md bg-white p-6 shadow-2xl rounded-lg">
{/* Header/Title */}
<h3 className="font-bold text-xl text-error flex items-center">
<FaTimesCircle className="h-6 w-6 mr-2" />
นยนการลบขอม
</h3>
{/* Message Body */}
<p className="py-4 text-gray-700 whitespace-normal break-words">{message}</p>
{/* Action Buttons */}
<div className="modal-action">
{/* ปุ่มยกเลิก */}
<button
className="btn btn-ghost"
onClick={onCancel}
disabled={isDeleting}
>
ยกเล
</button>
{/* ปุ่มยืนยันการลบ */}
<button
// isDeleting Loading Spinner
className={"btn btn-error " + (isDeleting ? 'loading' : '')}
onClick={onConfirm}
disabled={isDeleting}
>
{isDeleting ? 'กำลังดำเนินการ...' : 'ยืนยันการลบ'}
<FaTrash className="w-4 h-4 ml-2" />
</button>
</div>
</div>
</dialog>
</div>
);
}

View File

@ -12,7 +12,7 @@ import {
} from '../../services/modelRegistryApi'; } from '../../services/modelRegistryApi';
import ModelTable from '../../components/ModelRegistry/ModelTable'; import ModelTable from '../../components/ModelRegistry/ModelTable';
import ModelTopBar from '../../components/ModelRegistry/ModelTopBar'; import ModelTopBar from '../../components/ModelRegistry/ModelTopBar';
import ConfirmModal from '../../components/ConfirmModal';
function ModelRegistry() { function ModelRegistry() {
const [isOpen, setIsOpen] = useState(false); const [isOpen, setIsOpen] = useState(false);
@ -20,6 +20,10 @@ function ModelRegistry() {
const [selectedModel, setSelectedModel] = useState(null); const [selectedModel, setSelectedModel] = useState(null);
const [searchTerm, setSearchTerm] = useState(''); // State Search const [searchTerm, setSearchTerm] = useState(''); // State Search
// State Confirm Modal
const [isConfirmOpen, setIsConfirmOpen] = useState(false);
const [modelToDelete, setModelToDelete] = useState(null);
// TanStack Query Hooks // TanStack Query Hooks
const { data: models, isLoading, isError } = useModelList(); const { data: models, isLoading, isError } = useModelList();
const deleteMutation = useDeleteModel(); const deleteMutation = useDeleteModel();
@ -51,6 +55,26 @@ function ModelRegistry() {
} }
}; };
// ----------------------------------------------------
// Logic ( Custom Confirmation)
// ----------------------------------------------------
// Handler Custom Confirmation Modal
const handleConfirmDelete = (modelId) => {
setModelToDelete(modelId); // ID State
setIsConfirmOpen(true); // Custom Modal
};
// Handler Custom Modal
const executeDelete = () => {
if (modelToDelete) {
deleteMutation.mutate(modelToDelete); // Mutation
}
// Modal State
setIsConfirmOpen(false);
setModelToDelete(null);
};
// ---------------------------------------------------- // ----------------------------------------------------
// Logic (Filter/Search) // Logic (Filter/Search)
// ---------------------------------------------------- // ----------------------------------------------------
@ -78,7 +102,7 @@ function ModelRegistry() {
<ModelTable <ModelTable
models={filteredModels || []} models={filteredModels || []}
handleOpenEdit={(model) => handleOpen('edit', model)} handleOpenEdit={(model) => handleOpen('edit', model)}
handleDelete={handleDelete} handleDelete={handleConfirmDelete}
deleteLoading={deleteMutation.isPending} deleteLoading={deleteMutation.isPending}
// Hook Component // Hook Component
@ -97,6 +121,14 @@ function ModelRegistry() {
model={selectedModel} model={selectedModel}
isSubmitting={isSubmitting} isSubmitting={isSubmitting}
/> />
{/* Confirm Modal Component (ใช้แทน window.confirm) */}
<ConfirmModal
message={`คุณแน่ใจหรือไม่ว่าต้องการลบ Model ID: ${modelToDelete || 'N/A'} นี้? การกระทำนี้ไม่สามารถย้อนกลับได้`}
isOpen={isConfirmOpen}
onConfirm={executeDelete} // Mutation
onCancel={() => setIsConfirmOpen(false)}
isDeleting={deleteMutation.isPending} // Loading Modal
/>
</div> </div>
); );
} }