'use client' import React, { type FC, useRef, useEffect } from 'react' import utils from './utils' import { Disk } from './Disk' const { getArrayOfNumber } = utils interface Props { number: number size: string numberformat?: boolean } function getSize (fontSize: string): [string, 'px' | 'em' | 'rem'] { if (fontSize === '') { throw new Error('Missing param: [fontSize]') } const [size] = fontSize.match(/^[0-9]*/) const [unit] = fontSize.match(/(em|rem|px)$/) if (!size || !['em', 'rem', 'px'].includes(unit)) { throw new Error('Invalid fontSize value was given') } return [size, unit] } export const MemoCounterAnimation: FC = ({ number, numberformat = true, size }) => { const { numbers } = getArrayOfNumber({ number, numberformat }) const prevNumbersRef = useRef(null) const [fontSize, unit] = getSize(size) useEffect(() => { prevNumbersRef.current = numbers }, [numbers]) const isTotalIncreasing = prevNumbersRef.current !== null ? parseInt(prevNumbersRef.current.join(''), 10) < number : number > 0 const prevNumbersCeros = number.toString().length > 1 ? '0'.repeat(number.toString().length - 1) + '0' : '0' return (
{numbers.map((number, i) => { const num = parseInt(number, 10) const prevNumString = prevNumbersRef.current?.[i] ?? '0' const prevNum = parseInt(prevNumString, 10) const isSomethingZero = num === 0 || prevNum === 0 const withSeparator = number === ',' || number === '.' return withSeparator ? ( {number} ) : ( = 2} /> ) })}
) } MemoCounterAnimation.displayName = 'Counter' export const CounterAnimation = React.memo(MemoCounterAnimation, (prevProps, nextProps) => { return prevProps.number === nextProps.number })