From ca9205618aa05cfe853e90b6c0449c93a2974b5c Mon Sep 17 00:00:00 2001 From: ValdiANS Date: Thu, 2 Oct 2025 11:45:11 +0700 Subject: [PATCH] feat: add Modal component --- src/components/Modal.tsx | 62 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 src/components/Modal.tsx diff --git a/src/components/Modal.tsx b/src/components/Modal.tsx new file mode 100644 index 00000000..ec503392 --- /dev/null +++ b/src/components/Modal.tsx @@ -0,0 +1,62 @@ +'use client'; + +import { ReactNode, RefObject, useCallback, useRef, useState } from 'react'; +import { cn } from '@/lib/helper'; + +export const useModal = () => { + const ref = useRef(null); + const [open, setOpen] = useState(false); + + const openModal = useCallback(() => { + setOpen(true); + + ref.current?.showModal(); + }, []); + + const closeModal = useCallback(() => { + setOpen(false); + ref.current?.close(); + }, []); + + const toggle = useCallback(() => { + if (open) { + closeModal(); + } else { + openModal(); + } + }, [open]); + + if (ref.current) { + ref.current.addEventListener('close', () => { + closeModal(); + }); + } + + return { ref, open, setOpen, openModal, closeModal, toggle } as const; +}; + +interface ModalProps { + ref: RefObject; + children?: ReactNode; + closeOnBackdrop?: boolean; + className?: { + modal?: string; + modalBox?: string; + }; +} + +const Modal = ({ ref, children, closeOnBackdrop, className }: ModalProps) => { + return ( + +
{children}
+ + {closeOnBackdrop && ( +
+ +
+ )} +
+ ); +}; + +export default Modal;