import React, {useState, useEffect} from 'react'; import {useSpring, animated} from '@react-spring/web'; import './ScoreCounter.css'; let scrollInterval: ReturnType; const points = { attempt: 1, scheduledPoop: 5, selfPoop: 10, cleanUndies: 50, streakBonus: [50, 60, 80, 100, 120, 140, 150] }; const calcPoints = (stats: Stats) => { return stats.attempts * points.attempt + stats.scheduledPoops * points.scheduledPoop + stats.selfPoops * points.selfPoop + stats.cleanUndies * points.cleanUndies; //+ stats.streaks.reduce((p,s,i) => p + s * points.streakBonus[i]); }; const getShakeStyle = () => { const xr = Math.random(); const yr = Math.random(); const rr = Math.random(); const sr = Math.random(); return { x: Math.floor(xr * 30) - 15, y: Math.floor(yr * 30) - 15, rotate: Math.floor((rr * 40)) - 20, scale: sr * 0.3 + .80 }; }; const ScoreCounter = ({stats}: {stats: Stats}) => { const score = calcPoints(stats); const [showing, setShowing] = useState(score); const restState = { x: 0, y: 0, rotate: 0, scale: 1}; const [springs, api] = useSpring(() => (restState)); useEffect(() => { scrollInterval = setInterval(() => { setShowing(n => { const delta = Math.ceil(Math.abs(n - score)/5); if(n < score) { api.start(getShakeStyle()); return n + delta; } else if( n > score) { api.start(getShakeStyle()); return n - delta; } else { clearInterval(scrollInterval); Promise.all(api.start( {x:0, y: -10, rotate: 0, scale: 1.25})).then(() => { api.start(restState); });; return n; } }); }, 80); return () => clearInterval(scrollInterval); }, [score]); return {showing}; }; export default ScoreCounter;