@@ -77,8 +77,8 @@ export const Spinner: FC<SpinnerProps> = ({
77
77
...delegatedProps
78
78
} ) => {
79
79
// Disallow negative timeout values and fractional values, but also round
80
- // the delay down if it's small enough that it would effectively be
81
- // immediate from a user perspective
80
+ // the delay down if it's small enough that it might as well be immediate
81
+ // from a user perspective
82
82
let safeDelay = Math . trunc ( spinnerStartDelayMs ) ;
83
83
if ( safeDelay < 100 ) {
84
84
safeDelay = 0 ;
@@ -90,22 +90,21 @@ export const Spinner: FC<SpinnerProps> = ({
90
90
// only bails out of redundant state updates if they happen outside of a
91
91
// render. Inside a render, if you keep calling a state dispatch, you will
92
92
// get an infinite render loop, no matter what the state value is.
93
- const [ delayExpired , setDelayExpired ] = useState ( safeDelay === 0 ) ;
94
- if ( delayExpired && ! loading ) {
95
- setDelayExpired ( false ) ;
93
+ const [ cachedDelay , setCachedDelay ] = useState ( safeDelay ) ;
94
+ const [ delayLapsed , setDelayLapsed ] = useState ( safeDelay === 0 ) ;
95
+ if ( delayLapsed && ! loading ) {
96
+ setDelayLapsed ( false ) ;
96
97
}
97
- if ( ! delayExpired && safeDelay === 0 ) {
98
- setDelayExpired ( true ) ;
98
+ if ( ! delayLapsed && safeDelay === 0 && cachedDelay !== safeDelay ) {
99
+ setDelayLapsed ( true ) ;
100
+ setCachedDelay ( safeDelay ) ;
99
101
}
100
102
useEffect ( ( ) => {
101
103
if ( safeDelay === 0 ) {
102
104
return ;
103
105
}
104
-
105
- const delayId = window . setTimeout ( ( ) => {
106
- setDelayExpired ( true ) ;
107
- } , safeDelay ) ;
108
- return ( ) => window . clearTimeout ( delayId ) ;
106
+ const id = window . setTimeout ( ( ) => setDelayLapsed ( true ) , safeDelay ) ;
107
+ return ( ) => window . clearTimeout ( id ) ;
109
108
} , [ safeDelay ] ) ;
110
109
111
110
/**
@@ -114,7 +113,7 @@ export const Spinner: FC<SpinnerProps> = ({
114
113
* unmountedWhileLoading is false. I would hope not, since the children prop
115
114
* is the same in both cases, but I need to test this out
116
115
*/
117
- const showSpinner = loading && delayExpired ;
116
+ const showSpinner = loading && delayLapsed ;
118
117
if ( ! showSpinner ) {
119
118
return children ;
120
119
}
0 commit comments