import { useEffect, useRef, useState } from "react"; import { cn } from "@/lib/utils"; import { AnimatePresence, motion } from "framer-motion"; interface AnimatedQuantityProps { value: number; format?: (val: number) => string; className?: string; useColor?: boolean; // 값이 증가하면 빨강, 감소하면 파랑 배경 깜빡임 여부 } export function AnimatedQuantity({ value, format = (v) => v.toLocaleString(), className, useColor = false, }: AnimatedQuantityProps) { const prevValueRef = useRef(value); const [diff, setDiff] = useState(null); const [flash, setFlash] = useState<"up" | "down" | null>(null); useEffect(() => { if (prevValueRef.current !== value) { const difference = value - prevValueRef.current; setDiff(difference); prevValueRef.current = value; if (difference !== 0) { setFlash(difference > 0 ? "up" : "down"); const timer = setTimeout(() => { setDiff(null); setFlash(null); }, 1200); // 1.2초 후 초기화 return () => clearTimeout(timer); } } }, [value]); return (
{/* Background Flash Effect */} {useColor && flash && ( )} {/* Main Value */} {format(value)} {/* Diff Indicator */} {diff !== null && diff !== 0 && ( 0 ? "text-red-500" : "text-blue-500", )} style={{ pointerEvents: "none" }} // 클릭 방해 방지 > {diff > 0 ? `+${diff.toLocaleString()}` : diff.toLocaleString()} )}
); }