fix(use-default-subplebbits): prevent state updates after unmount

This commit is contained in:
plebeius
2025-11-04 14:59:22 +01:00
parent c808f0ca21
commit e548198d0e
+58 -5
View File
@@ -95,42 +95,54 @@ export const useDefaultSubplebbits = () => {
return;
}
let isMounted = true;
(async () => {
try {
// Check localStorage first
const cachedData = getFromLocalStorage();
if (cachedData) {
cacheSubplebbits = cachedData.subplebbits;
if (isMounted) {
setState({
subplebbits: cachedData.subplebbits,
loading: false,
error: null,
});
}
// Still try to fetch fresh data in background (don't await)
fetchMultisubData().then((data) => {
fetchMultisubData()
.then((data) => {
if (isMounted) {
cacheSubplebbits = data.subplebbits;
setState({
subplebbits: data.subplebbits,
loading: false,
error: null,
});
}
})
.catch((e) => {
console.warn('Background fetch failed:', e);
});
return;
}
// No cache, fetch fresh data
const multisub = await fetchMultisubData();
if (isMounted) {
cacheSubplebbits = multisub.subplebbits;
setState({
subplebbits: multisub.subplebbits,
loading: false,
error: null,
});
}
} catch (e) {
console.warn('Failed to load subplebbits:', e);
// Fallback to vendored data
const fallbackData = defaultSubplebbitsData as MultisubData;
if (isMounted) {
cacheSubplebbits = fallbackData.subplebbits;
setState({
subplebbits: fallbackData.subplebbits,
@@ -138,7 +150,12 @@ export const useDefaultSubplebbits = () => {
error: null,
});
}
}
})();
return () => {
isMounted = false;
};
}, []);
// To maintain backward compatibility, return the subplebbits array directly
@@ -162,42 +179,54 @@ export const useDefaultSubplebbitsState = () => {
return;
}
let isMounted = true;
(async () => {
try {
// Check localStorage first
const cachedData = getFromLocalStorage();
if (cachedData) {
cacheSubplebbits = cachedData.subplebbits;
if (isMounted) {
setState({
subplebbits: cachedData.subplebbits,
loading: false,
error: null,
});
}
// Still try to fetch fresh data in background (don't await)
fetchMultisubData().then((data) => {
fetchMultisubData()
.then((data) => {
if (isMounted) {
cacheSubplebbits = data.subplebbits;
setState({
subplebbits: data.subplebbits,
loading: false,
error: null,
});
}
})
.catch((e) => {
console.warn('Background fetch failed:', e);
});
return;
}
// No cache, fetch fresh data
const multisub = await fetchMultisubData();
if (isMounted) {
cacheSubplebbits = multisub.subplebbits;
setState({
subplebbits: multisub.subplebbits,
loading: false,
error: null,
});
}
} catch (e) {
console.warn('Failed to load subplebbits:', e);
// Fallback to vendored data
const fallbackData = defaultSubplebbitsData as MultisubData;
if (isMounted) {
cacheSubplebbits = fallbackData.subplebbits;
setState({
subplebbits: fallbackData.subplebbits,
@@ -205,7 +234,12 @@ export const useDefaultSubplebbitsState = () => {
error: null,
});
}
}
})();
return () => {
isMounted = false;
};
}, []);
return state;
@@ -223,6 +257,9 @@ export const useMultisubMetadata = () => {
if (cacheMetadata) {
return;
}
let isMounted = true;
(async () => {
try {
// Check localStorage first
@@ -235,9 +272,13 @@ export const useMultisubMetadata = () => {
updatedAt: cachedData.updatedAt,
};
cacheMetadata = metadata;
if (isMounted) {
setMetadata(metadata);
}
// Still try to fetch fresh data in background (don't await)
fetchMultisubData().then((data) => {
fetchMultisubData()
.then((data) => {
if (isMounted) {
const freshMetadata: MultisubMetadata = {
title: data.title,
description: data.description,
@@ -246,12 +287,17 @@ export const useMultisubMetadata = () => {
};
cacheMetadata = freshMetadata;
setMetadata(freshMetadata);
}
})
.catch((e) => {
console.warn('Background metadata fetch failed:', e);
});
return;
}
// No cache, fetch fresh data
const multisub = await fetchMultisubData();
if (isMounted) {
const metadata: MultisubMetadata = {
title: multisub.title,
description: multisub.description,
@@ -260,10 +306,12 @@ export const useMultisubMetadata = () => {
};
cacheMetadata = metadata;
setMetadata(metadata);
}
} catch (e) {
console.warn('Failed to load metadata, using vendored fallback:', e);
// Fallback to vendored data
const fallbackData = defaultSubplebbitsData as MultisubData;
if (isMounted) {
const metadata: MultisubMetadata = {
title: fallbackData.title,
description: fallbackData.description,
@@ -273,7 +321,12 @@ export const useMultisubMetadata = () => {
cacheMetadata = metadata;
setMetadata(metadata);
}
}
})();
return () => {
isMounted = false;
};
}, []);
return cacheMetadata || metadata;