Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | import { useEffect, useRef, useState } from "react" import { formatCreditsBalance } from "@/utils/format" // Custom hook for animated credit display with styled decimals const useAnimatedCredits = (targetValue: number, duration: number = 660) => { const [currentValue, setCurrentValue] = useState(0) const animationRef = useRef<number>() const startTimeRef = useRef<number>() useEffect(() => { const animate = (timestamp: number) => { if (!startTimeRef.current) { startTimeRef.current = timestamp } const elapsed = timestamp - startTimeRef.current const progress = Math.min(elapsed / duration, 1) // Easing function (ease-out) const easedProgress = 1 - (1 - progress) ** 3 const newValue = easedProgress * targetValue setCurrentValue(newValue) if (progress < 1) { animationRef.current = requestAnimationFrame(animate) } } // Reset and start animation startTimeRef.current = undefined animationRef.current = requestAnimationFrame(animate) return () => { if (animationRef.current) { cancelAnimationFrame(animationRef.current) } } }, [targetValue, duration]) return currentValue } // Custom component to handle styled credit display export const StyledCreditDisplay = ({ balance }: { balance: number }) => { const animatedValue = useAnimatedCredits(formatCreditsBalance(balance)) const formatted = animatedValue.toFixed(4) const parts = formatted.split(".") const wholePart = parts[0] const decimalPart = parts[1] || "0000" const firstTwoDecimals = decimalPart.slice(0, 2) const lastTwoDecimals = decimalPart.slice(2) return ( <span className="font-azeret-mono font-light tabular-nums"> {wholePart}.{firstTwoDecimals} <span className="text-[var(--vscode-descriptionForeground)]">{lastTwoDecimals}</span> </span> ) } |