Skip to content

Commit fd2c95e

Browse files
committed
Refactor complex dependency in useEffect
1 parent 1682bd1 commit fd2c95e

File tree

1 file changed

+21
-9
lines changed

1 file changed

+21
-9
lines changed

ui/hooks/useMultiPolling.ts

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,28 @@ const useMultiPolling = <PollingInput>(
1717
const completedOnboarding = useSelector(getCompletedOnboarding);
1818
const pollingTokens = useRef<Map<string, string>>(new Map());
1919

20+
const prevPollingInputStringified = useRef<string | null>(null);
21+
const hasPollingInputChanged =
22+
JSON.stringify(usePollingOptions.input) !==
23+
prevPollingInputStringified.current;
24+
25+
const isMounted = useRef(true);
26+
2027
useEffect(() => {
21-
if (!completedOnboarding) {
22-
// don't start polling if no selected account or onboarding is not completed yet
28+
if (!completedOnboarding || !hasPollingInputChanged) {
29+
// don't start polling if no selected account, or onboarding is incomplete, or polling inputs haven't changed
2330
return;
2431
}
2532

2633
// start new polls
2734
for (const input of usePollingOptions.input) {
2835
const key = JSON.stringify(input);
2936
if (!pollingTokens.current.has(key)) {
30-
usePollingOptions
31-
.startPolling(input)
32-
.then((token) => pollingTokens.current.set(key, token));
37+
usePollingOptions.startPolling(input).then((token) => {
38+
if (isMounted.current) {
39+
pollingTokens.current.set(key, token);
40+
}
41+
});
3342
}
3443
}
3544

@@ -44,17 +53,20 @@ const useMultiPolling = <PollingInput>(
4453
pollingTokens.current.delete(inputKey);
4554
}
4655
}
47-
}, [
48-
completedOnboarding,
49-
usePollingOptions.input && JSON.stringify(usePollingOptions.input),
50-
]);
56+
57+
prevPollingInputStringified.current = JSON.stringify(
58+
usePollingOptions.input,
59+
);
60+
}, [usePollingOptions, hasPollingInputChanged, completedOnboarding]);
5161

5262
// stop all polling on dismount
5363
useEffect(() => {
5464
return () => {
5565
for (const token of pollingTokens.current.values()) {
5666
usePollingOptions.stopPollingByPollingToken(token);
5767
}
68+
prevPollingInputStringified.current = null;
69+
isMounted.current = false;
5870
};
5971
}, []);
6072
};

0 commit comments

Comments
 (0)