Skip to content

Commit 4560c24

Browse files
committed
fix: more render stabilization
1 parent b0d020e commit 4560c24

File tree

1 file changed

+7
-4
lines changed

1 file changed

+7
-4
lines changed

site/src/components/Spinner/Spinner.tsx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,16 +146,19 @@ function useShowSpinner(loading: boolean, spinnerDelayMs: number): boolean {
146146
// render. Inside a render, if you keep calling a state dispatch, you will
147147
// get an infinite render loop, no matter what the state value is. There
148148
// must be a "base case" that causes re-renders to stabilize/stop
149-
const [cachedDelay, setCachedDelay] = useState(safeDelay);
150149
const [delayLapsed, setDelayLapsed] = useState(safeDelay === 0);
151-
if (delayLapsed && !loading) {
150+
const [renderCache, setRenderCache] = useState({ loading, safeDelay });
151+
const resetOnRerender =
152+
delayLapsed && !loading && loading !== renderCache.loading;
153+
if (resetOnRerender) {
152154
setDelayLapsed(false);
155+
setRenderCache((current) => ({ ...current, loading }));
153156
}
154157
const delayWasRemovedOnRerender =
155-
!delayLapsed && safeDelay === 0 && cachedDelay !== safeDelay;
158+
!delayLapsed && safeDelay === 0 && renderCache.safeDelay !== safeDelay;
156159
if (delayWasRemovedOnRerender) {
157160
setDelayLapsed(true);
158-
setCachedDelay(safeDelay);
161+
setRenderCache((current) => ({ ...current, safeDelay }));
159162
}
160163
useEffect(() => {
161164
if (safeDelay === 0) {

0 commit comments

Comments
 (0)