import Lottie, { LottieRefCurrentProps } from "lottie-react"; import React, { useEffect, useRef, useState } from "react"; import { Icon } from "@sparkle/components/Icon"; import { ArrowUpOnSquareIcon } from "@sparkle/icons/app"; import { cn } from "@sparkle/lib"; import anim from "@sparkle/lottie/dragArea"; export interface DropzoneOverlayProps { description: string; isDragActive: boolean; title: string; visual?: React.ReactNode; } export default function DropzoneOverlay({ description, isDragActive, title, visual = ( ), }: DropzoneOverlayProps) { const lottieRef = useRef(null); const [isActiveDelayed, setIsActiveDelayed] = useState(false); // This is used to delay the removal of the overlay when the user stops dragging. useEffect(() => { if (isDragActive) { setIsActiveDelayed(true); } else { const timeoutId = setTimeout(() => { setIsActiveDelayed(false); }, 400); return () => clearTimeout(timeoutId); } }, [isDragActive]); if (!isActiveDelayed) { return null; } return (
{ lottieRef.current?.setDirection(-1); lottieRef.current?.setSpeed(2); lottieRef.current?.play(); }} onDrop={() => { lottieRef.current?.setDirection(-1); lottieRef.current?.play(); }} >
{visual}
{title}
{description}
); }