const useModal = () => {
const [open, setOpen] = useState(false);
// any other modal-related state can go in this hook
return { open, setOpen }
};
interface AddGeneralModalProps
extends DialogProps,
VariantProps<typeof contentVariants> {
modal: ReturnType<typeof useModal>
}
const AddGeneralModal = ({ children, size, modal }: AddGeneralModalProps) => {
return (
<Dialog open={modal.open} onOpenChange={modal.setOpen}>
<DialogTrigger asChild>
<Button className={buttonVariants()}>Open Modal</Button>
</DialogTrigger>
<DialogContent className={cn(contentVariants({ size }))}>
<DialogHeader>
<DialogTitle>Modal Title</DialogTitle>
<DialogDescription>
Modal Desc
</DialogDescription>
</DialogHeader>
{children}
</DialogContent>
</Dialog>
);
};
export default AddGeneralModal;
// Usage:
const SpecificForm = (props: { onSuccess: () => void | Promise<void>}) => {
const { mutate } = api.model.post.useMutation({
onSuccess: async () => {
await props.onSuccess()
},
});
return (
<Form>
<Button onClick={ () => mutate() }> Submit < /Button>
</Form>
)
}
const MyPage = () => {
const modal = useModal();
return (
<AddGeneralModal modal={modal}>
<SpecificForm onSuccess={() => modal.setOpen(false)} />
</AddGeneralModal>
)
}
const useModal = () => {
const [open, setOpen] = useState(false);
// any other modal-related state can go in this hook
return { open, setOpen }
};
interface AddGeneralModalProps
extends DialogProps,
VariantProps<typeof contentVariants> {
modal: ReturnType<typeof useModal>
}
const AddGeneralModal = ({ children, size, modal }: AddGeneralModalProps) => {
return (
<Dialog open={modal.open} onOpenChange={modal.setOpen}>
<DialogTrigger asChild>
<Button className={buttonVariants()}>Open Modal</Button>
</DialogTrigger>
<DialogContent className={cn(contentVariants({ size }))}>
<DialogHeader>
<DialogTitle>Modal Title</DialogTitle>
<DialogDescription>
Modal Desc
</DialogDescription>
</DialogHeader>
{children}
</DialogContent>
</Dialog>
);
};
export default AddGeneralModal;
// Usage:
const SpecificForm = (props: { onSuccess: () => void | Promise<void>}) => {
const { mutate } = api.model.post.useMutation({
onSuccess: async () => {
await props.onSuccess()
},
});
return (
<Form>
<Button onClick={ () => mutate() }> Submit < /Button>
</Form>
)
}
const MyPage = () => {
const modal = useModal();
return (
<AddGeneralModal modal={modal}>
<SpecificForm onSuccess={() => modal.setOpen(false)} />
</AddGeneralModal>
)
}