Skip to content

Commit e094eb0

Browse files
committed
fix: remove infinite render loops
1 parent d082834 commit e094eb0

File tree

1 file changed

+12
-13
lines changed

1 file changed

+12
-13
lines changed

site/src/components/Spinner/Spinner.tsx

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,8 @@ export const Spinner: FC<SpinnerProps> = ({
7777
...delegatedProps
7878
}) => {
7979
// 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
8282
let safeDelay = Math.trunc(spinnerStartDelayMs);
8383
if (safeDelay < 100) {
8484
safeDelay = 0;
@@ -90,22 +90,21 @@ export const Spinner: FC<SpinnerProps> = ({
9090
// only bails out of redundant state updates if they happen outside of a
9191
// render. Inside a render, if you keep calling a state dispatch, you will
9292
// 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);
9697
}
97-
if (!delayExpired && safeDelay === 0) {
98-
setDelayExpired(true);
98+
if (!delayLapsed && safeDelay === 0 && cachedDelay !== safeDelay) {
99+
setDelayLapsed(true);
100+
setCachedDelay(safeDelay);
99101
}
100102
useEffect(() => {
101103
if (safeDelay === 0) {
102104
return;
103105
}
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);
109108
}, [safeDelay]);
110109

111110
/**
@@ -114,7 +113,7 @@ export const Spinner: FC<SpinnerProps> = ({
114113
* unmountedWhileLoading is false. I would hope not, since the children prop
115114
* is the same in both cases, but I need to test this out
116115
*/
117-
const showSpinner = loading && delayExpired;
116+
const showSpinner = loading && delayLapsed;
118117
if (!showSpinner) {
119118
return children;
120119
}

0 commit comments

Comments
 (0)