"use client" import { motion } from "framer-motion" import { type PropsWithChildren, useEffect, useState } from "react" import { Dialog, DialogTrigger, Modal as AriaModal, ModalOverlay, } from "react-aria-components" import { useIntl } from "react-intl" import { CloseLargeIcon } from "@/components/Icons" import Preamble from "@/components/TempDesignSystem/Text/Preamble" import Subtitle from "@/components/TempDesignSystem/Text/Subtitle" import { type AnimationState, AnimationStateEnum, type InnerModalProps, type ModalProps, } from "./modal" import { fade, slideInOut } from "./motionVariants" import styles from "./modal.module.css" const MotionOverlay = motion(ModalOverlay) const MotionModal = motion(AriaModal) function InnerModal({ animation, onAnimationComplete = () => undefined, setAnimation, onToggle, isOpen, children, title, subtitle, }: PropsWithChildren) { const intl = useIntl() 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 }) => ( <>
{title && ( {title} )} {subtitle && ( {subtitle} )}
{children}
)}
) } export default function Modal({ onAnimationComplete = () => undefined, trigger, isOpen, onToggle, title, subtitle, children, }: 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]) if (!trigger) { return ( {children} ) } return ( setAnimation( isOpen ? AnimationStateEnum.visible : AnimationStateEnum.hidden ) } > {trigger} {children} ) }