Modal dialogs using the useDialog hook and DialogCreator component
📚 See docs/MODAL_DIALOG_DOCUMENTATION.md for full documentation
Complete examples using useDialog hook and DialogCreator component directly
Using useDialog hook for automatic state management
Middle button: auto-loading | Action button: external control
Using DialogCreator component directly without hook
Lightweight, direct state management
Direct component with form content
Manage loading state from parent
const dialog = useDialog({
title: "Delete User",
subtitle: "Are you sure?",
size: "md",
cancelButton: { label: "Cancel" },
actionButton: {
label: "Delete",
variant: "destructive",
onClick: async () => await deleteUser()
}
});
// Usage
<button onClick={dialog.openDialog}>Delete</button>
{dialog.dialog}const [isOpen, setIsOpen] = useState(false);
const config: DialogConfig = {
title: "Delete User",
size: "md",
cancelButton: { label: "Cancel" },
actionButton: {
label: "Delete",
onClick: async () => {
await deleteUser();
setIsOpen(false);
}
}
};
// Usage
<button onClick={() => setIsOpen(true)}>Delete</button>
<DialogCreator
isOpen={isOpen}
config={config}
onClose={() => setIsOpen(false)}
/>const [submitLoading, setSubmitLoading] = useState(false);
const dialog = useDialog({
actionButton: {
label: "Save",
loading: submitLoading, // External state
onClick: async () => {
setSubmitLoading(true);
try {
await save();
} finally {
setSubmitLoading(false);
}
}
},
middleButton: {
label: "Draft",
// No loading param = internal auto-loading
onClick: async () => await saveDraft()
}
});