'use client' import { AnimatePresence, motion } from 'motion/react' import { type PropsWithChildren, useEffect, useState } from 'react' import { Dialog, DialogTrigger, Modal as AriaModal, ModalOverlay, } from 'react-aria-components' import { type AnimationState, AnimationStateEnum, type InnerModalProps, type ModalProps, } from './modal' import { fade, slideInOut } from './motionVariants' import styles from './modal.module.css' import { Typography } from '../../Typography' import { MaterialIcon } from '../../Icons/MaterialIcon' const MotionOverlay = motion.create(ModalOverlay) const MotionModal = motion.create(AriaModal) function InnerModal({ animation, onAnimationComplete = () => undefined, setAnimation, onToggle, isOpen, children, title, subtitle, hideHeader, }: PropsWithChildren) { function modalStateHandler(newAnimationState: AnimationState) { setAnimation((currentAnimationState) => newAnimationState === AnimationStateEnum.hidden && currentAnimationState === AnimationStateEnum.hidden ? AnimationStateEnum.unmounted : currentAnimationState ) if (newAnimationState === AnimationStateEnum.visible) { onAnimationComplete() } } function onOpenChange(state: boolean) { onToggle!(state) } return ( {({ close }) => ( <> {!hideHeader && (
{title && (

{title}

)} {subtitle && ( {subtitle} )}
)}
{children}
)}
) } export default function Modal({ onAnimationComplete = () => undefined, trigger, isOpen, onToggle, title, subtitle, children, withActions = false, hideHeader = false, }: PropsWithChildren) { const [animation, setAnimation] = useState( AnimationStateEnum.visible ) useEffect(() => { if (typeof isOpen === 'boolean') { setAnimation( isOpen ? AnimationStateEnum.visible : AnimationStateEnum.hidden ) } if (isOpen === undefined) { setAnimation(AnimationStateEnum.unmounted) } }, [isOpen]) const shouldRender = isOpen || animation !== AnimationStateEnum.unmounted if (!trigger) { return ( {children} ) } return ( setAnimation( isOpen ? AnimationStateEnum.visible : AnimationStateEnum.hidden ) } > {trigger} {shouldRender && ( {children} )} ) }