import { type ReactNode, type Ref, useCallback, useEffect, useImperativeHandle, useRef, useState, } from "react" import { cn } from "@/lib/utils" type CrossfadeIconProps = { from: ReactNode to: ReactNode active?: boolean className?: string ref?: Ref } export type CrossfadeIconHandle = { trigger: () => void } export function CrossfadeIcon({ from, to, active = false, className, ref, }: CrossfadeIconProps) { const [forcedActive, setForcedActive] = useState(false) const timeoutRef = useRef | null>(null) const clearTimer = useCallback(() => { if (timeoutRef.current) { clearTimeout(timeoutRef.current) timeoutRef.current = null } }, []) useImperativeHandle( ref, () => ({ trigger: () => { setForcedActive(true) clearTimer() timeoutRef.current = setTimeout(() => { setForcedActive(false) timeoutRef.current = null }, 3000) }, }), [clearTimer], ) useEffect(() => clearTimer, [clearTimer]) const isActive = active || forcedActive return (
{from} {to}
) }