import clsx from "clsx"; import React, { useEffect, useState, useRef } from "react"; import type { AlertProps } from "./types"; import alertTheme from "./alertTheme"; import { useTransition } from "../../hooks/useTransition"; const TEAlert: React.FC = ({ open = false, setOpen, className, autohide, animation = true, children, color = "bg-primary-100 text-primary-800", delay = 1000, dismiss, dismissTemplate, staticAlert, tag: Tag = "div", theme: customTheme, onClose, onClosed, ...props }): JSX.Element => { const [showAlert, setShowAlert] = useState(false); const [isMounted, setIsMounted] = useState(false); const autohideTimeout = useRef(undefined); const alertRef = useRef(null); const theme = { ...alertTheme, ...customTheme, }; const wrapperClasses = clsx( theme.wrapper, color, animation && theme.wrapperTransition, staticAlert ? theme.static : theme.nonStatic, showAlert ? theme.wrapperVisible : theme.wrapperHidden, className ); const { onTransitionShow, onTransitionHide } = useTransition( alertRef.current ); useEffect(() => { if (open) { setIsMounted(true); return; } setShowAlert(false); }, [open]); useEffect(() => { if (!isMounted) { return; } onTransitionShow(() => { setShowAlert(true); if (autohide) { autohideTimeout.current = setTimeout(() => { setShowAlert(false); }, delay); } }); return () => clearTimeout(autohideTimeout.current); }, [isMounted]); useEffect(() => { if (showAlert) { setIsMounted(true); } else if (!showAlert && isMounted) { onClose?.(); onTransitionHide(() => { setIsMounted(false); setOpen?.(false); onClosed?.(); }); } }, [showAlert]); return ( <> {isMounted && ( {children} {dismiss && ( )} )} ); }; export default TEAlert;