import { ManagerStatusDataMap } from "@rahoot/common/types/game/status" import { AnimatePresence, motion, useSpring, useTransform } from "motion/react" import { useEffect, useState } from "react" type Props = { data: ManagerStatusDataMap["SHOW_LEADERBOARD"] } const AnimatedPoints = ({ from, to }: { from: number; to: number }) => { const spring = useSpring(from, { stiffness: 1000, damping: 30 }) const display = useTransform(spring, (value) => Math.round(value)) const [displayValue, setDisplayValue] = useState(from) useEffect(() => { spring.set(to) const unsubscribe = display.on("change", (latest) => { setDisplayValue(latest) }) return unsubscribe }, [to, spring, display]) return {displayValue} } const Leaderboard = ({ data: { oldLeaderboard, leaderboard } }: Props) => { const [displayedLeaderboard, setDisplayedLeaderboard] = useState(oldLeaderboard) const [isAnimating, setIsAnimating] = useState(false) useEffect(() => { setDisplayedLeaderboard(oldLeaderboard) setIsAnimating(false) const timer = setTimeout(() => { setIsAnimating(true) setDisplayedLeaderboard(leaderboard) }, 1600) return () => { clearTimeout(timer) } }, [oldLeaderboard, leaderboard]) return (

Leaderboard

{displayedLeaderboard.map(({ id, username, points }) => ( {username} {isAnimating ? ( u.id === id)?.points || 0} to={leaderboard.find((u) => u.id === id)?.points || 0} /> ) : ( {points} )} ))}
) } export default Leaderboard