11'use client' ;
22
33import type { CSSProperties , ReactElement } from 'react' ;
4- import { cloneElement , useEffect , useRef , useState } from 'react' ;
4+ import { cloneElement , useState } from 'react' ;
55import { track } from '@amplitude/analytics-browser' ;
66import clsx from 'clsx' ;
7+ import TextTransition , { presets } from 'react-text-transition' ;
78
89import type { StatsInfo } from '../../../../src/fetches/github' ;
910
@@ -46,11 +47,9 @@ type StatName = (typeof statTypes)[number]['name'];
4647const PluginStatsInfo = ( {
4748 statsInfo,
4849 selectedStatName,
49- isTransitioning,
5050} : {
5151 statsInfo : StatsInfo ;
5252 selectedStatName : StatName ;
53- isTransitioning : boolean ;
5453} ) : React . ReactElement => {
5554 const { name, description} = statsInfo [ selectedStatName ] ;
5655
@@ -61,22 +60,20 @@ const PluginStatsInfo = ({
6160 'flex-1 flex flex-col relative' ,
6261 ) }
6362 >
64- < div
65- className = { clsx (
66- 'body1 font-bold mb-3 text-left transition-opacity duration-300' ,
67- isTransitioning ? 'opacity-0' : 'opacity-100'
68- ) }
63+ < TextTransition
64+ springConfig = { presets . gentle }
65+ direction = "down"
66+ className = "body1 font-bold mb-3 text-left"
6967 >
7068 { name }
71- </ div >
72- < div
73- className = { clsx (
74- 'body3 leading-[160%] text-left transition-opacity duration-500' ,
75- isTransitioning ? 'opacity-0' : 'opacity-100'
76- ) }
69+ </ TextTransition >
70+ < TextTransition
71+ springConfig = { presets . wobbly }
72+ direction = "down"
73+ className = "body3 leading-[160%] text-left"
7774 >
7875 { description }
79- </ div >
76+ </ TextTransition >
8077 </ div >
8178 ) ;
8279} ;
@@ -91,28 +88,12 @@ const StatsSymbols = ({
9188 statsInfo : StatsInfo ;
9289} ) : ReactElement => {
9390 const [ selectedStatName , setSelectedStatName ] = useState < StatName > ( 'tree' ) ;
94- const [ isTransitioning , setIsTransitioning ] = useState ( false ) ;
95- const transitionTimer = useRef < ReturnType < typeof setTimeout > | null > ( null ) ;
9691
9792 const pressStat = ( type : StatName ) : void => {
98- if ( transitionTimer . current ) {
99- clearTimeout ( transitionTimer . current ) ;
100- }
101-
102- setIsTransitioning ( true ) ;
103- transitionTimer . current = setTimeout ( ( ) => setIsTransitioning ( false ) , 50 ) ;
10493 setSelectedStatName ( type ) ;
10594 track ( 'Press Stat Info' , { type} ) ;
10695 } ;
10796
108- useEffect ( ( ) => {
109- return ( ) => {
110- if ( transitionTimer . current ) {
111- clearTimeout ( transitionTimer . current ) ;
112- }
113- } ;
114- } , [ ] ) ;
115-
11697 return (
11798 < div className = { `flex flex-col ${ className } ` } style = { style } >
11899 < div className = { clsx ( 'max-w-[220px]' , 'flex flex-row' ) } >
@@ -139,7 +120,6 @@ const StatsSymbols = ({
139120 < PluginStatsInfo
140121 selectedStatName = { selectedStatName }
141122 statsInfo = { statsInfo }
142- isTransitioning = { isTransitioning }
143123 />
144124 </ div >
145125 ) ;
0 commit comments