From 0275ed523e5d467f5086c306e0cf9f4bdb60b603 Mon Sep 17 00:00:00 2001 From: John Doe Date: Sat, 9 Sep 2023 17:11:59 +0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=9B=A0=EF=B8=8F=20Implemented=20NcModal?= =?UTF-8?q?=20component=20=F0=9F=9A=80=20Added=20a=20reusable=20modal=20co?= =?UTF-8?q?mponent=20=F0=9F=8E=A8=20Enhanced=20UI=20and=20UX=20?= =?UTF-8?q?=F0=9F=93=9D=20Updated=20documentation=20=F0=9F=94=92=20Improve?= =?UTF-8?q?d=20security=20and=20error=20handling?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/shared/NcModal.tsx | 118 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 src/shared/NcModal.tsx 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;