Add AbortController cleanup to async frontend effects

This commit is contained in:
2026-04-18 21:30:57 +02:00
parent 2105f8b435
commit 6c053cdaee
16 changed files with 128 additions and 37 deletions

View File

@@ -14,23 +14,31 @@ export function useTimezoneData(): UseTimezoneDataResult {
const [loading, setLoading] = useState<boolean>(true);
const [error, setError] = useState<string | null>(null);
const load = useCallback(async (): Promise<void> => {
const load = useCallback(async (signal?: AbortSignal): Promise<void> => {
setLoading(true);
setError(null);
try {
const resp = await fetchTimezone();
const resp = await fetchTimezone(signal);
if (signal?.aborted) return;
setTimezone(resp.timezone);
} catch (err: unknown) {
if (signal?.aborted) return;
handleFetchError(err, setError, "Failed to fetch timezone");
setTimezone("UTC");
} finally {
setLoading(false);
if (!signal?.aborted) {
setLoading(false);
}
}
}, []);
useEffect(() => {
void load();
const controller = new AbortController();
void load(controller.signal);
return (): void => {
controller.abort();
};
}, [load]);
return {