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; } /** * 실시간 수량 표시 — 값이 변할 때 ±diff를 인라인으로 보여줍니다. */ export function AnimatedQuantity({ value, format = (v) => v.toLocaleString(), className, useColor = false, }: AnimatedQuantityProps) { const prevRef = useRef(value); const [diff, setDiff] = useState(null); const [flash, setFlash] = useState<"up" | "down" | null>(null); useEffect(() => { if (prevRef.current === value) return; const delta = value - prevRef.current; prevRef.current = value; if (delta === 0) return; setDiff(delta); setFlash(delta > 0 ? "up" : "down"); const timer = setTimeout(() => { setDiff(null); setFlash(null); }, 1200); return () => clearTimeout(timer); }, [value]); return ( {/* 배경 깜빡임 */} {useColor && flash && ( )} {/* 수량 값 */} {format(value)} {/* ±diff (인라인 표시) */} {diff != null && diff !== 0 && ( 0 ? "text-red-500" : "text-brand-600", )} > {diff > 0 ? `+${diff.toLocaleString()}` : diff.toLocaleString()} )} ); }