/* eslint-disable @typescript-eslint/no-explicit-any */ import { Dialog, Transition } from '@headlessui/react'; import { Fragment, ReactNode, useCallback, useEffect, useState } from 'react'; import { atom, useRecoilState } from 'recoil'; import { DismissIcon } from '../icons-colored'; import { Title } from '../text'; import { Button } from '@atoms/button/button'; const ModalsCountState = atom({ key: 'ModalsState', default: 0, }); let visibleModals = 0; export const Modal = (props: { open?: boolean; onClose?: () => void; children?: React.ReactNode; closable?: boolean; closeIcon?: ReactNode, className?: string; style?: React.CSSProperties; positioned?: boolean; }) => { const [open, setOpen] = useState(false); const [, setModalsCountState] = useRecoilState(ModalsCountState); const [level, setLevel] = useState(0); const [didOpenOnce, setDidOpenOnce] = useState(false); const onClose = useCallback(() => { visibleModals += -1; setModalsCountState(visibleModals); }, [setModalsCountState]); const onOpen = useCallback(() => { visibleModals += 1; setLevel(visibleModals); setModalsCountState(visibleModals); }, [setModalsCountState]); useEffect(() => { if (props.open !== open) { setOpen(props.open || false); if (props.open) { onOpen(); } else { onClose(); } } if (!didOpenOnce && props.open) setDidOpenOnce(true); }, [props.open]); useEffect(() => { return () => { if (open) onClose(); }; }, []); const zIndex = 'z-' + level + '0'; return ( props.onClose && props.closable && props.onClose()} >
{ /* This element is to trick the browser into centering the modal contents. */ !props.positioned && ( ) } {props.closable !== false && (
)} {didOpenOnce && props.children}
); }; export type ModalContentTheme = 'success' | 'danger' | 'warning' | 'gray'; export const ModalContent = (props: { title: ReactNode | string; text?: string; textCenter?: boolean; buttons?: ReactNode; children?: ReactNode; icon?: any; theme?: ModalContentTheme; }) => { let color = 'blue'; if (props.theme === 'success') color = 'green'; if (props.theme === 'danger') color = 'rose'; if (props.theme === 'warning') color = 'orange'; if (props.theme === 'gray') color = 'gray'; return ( <>
{props.icon && (
)}
{props.title}

{props.text || ''}

{props.buttons && (
{props.buttons}
)} {props.children} ); };