diff --git a/src/shared/NcModal.tsx b/src/shared/NcModal.tsx new file mode 100644 index 0000000..0c6c41c --- /dev/null +++ b/src/shared/NcModal.tsx @@ -0,0 +1,118 @@ +"use client"; + +import React, { FC, Fragment, ReactNode, useEffect, useState } from "react"; +import { Dialog, Transition } from "@headlessui/react"; +import ButtonClose from "@/shared/ButtonClose"; +import Button from "@/shared/Button"; + +export interface NcModalProps { + renderContent: () => ReactNode; + renderTrigger?: (openModal: Function) => ReactNode; + contentExtraClass?: string; + contentPaddingClass?: string; + triggerText?: ReactNode; + modalTitle?: ReactNode; + isOpenProp?: boolean; + onCloseModal?: () => void; +} + +const NcModal: FC = ({ + renderTrigger, + renderContent, + contentExtraClass = "max-w-screen-xl", + contentPaddingClass = "py-4 px-6 md:py-5", + triggerText = "Open Modal", + modalTitle = "Modal title", + isOpenProp, + onCloseModal, +}) => { + let [isOpen, setIsOpen] = useState(!!isOpenProp); + + function closeModal() { + if (typeof isOpenProp !== "boolean") { + setIsOpen(false); + } + onCloseModal && onCloseModal(); + } + + function openModal() { + if (typeof isOpenProp !== "boolean") { + setIsOpen(true); + } + } + + useEffect(() => { + setIsOpen(!!isOpenProp); + }, [isOpenProp]); + + return ( +
+ {renderTrigger ? ( + renderTrigger(openModal) + ) : ( + + )} + + + +
+ + + + + {/* This element is to trick the browser into centering the modal contents. */} + + +
+
+ + {modalTitle && ( + + {modalTitle} + + )} +
+
{renderContent()}
+
+
+
+
+
+
+ ); +}; + +export default NcModal;