feat: 优化对 funds 的同步逻辑

This commit is contained in:
hzm
2026-02-09 10:49:40 +08:00
parent a3d90a756b
commit 2b5f998ab3

View File

@@ -2362,6 +2362,17 @@ export default function HomePage() {
userIdRef.current = user?.id || null;
}, [user]);
const getFundCodesSignature = useCallback((value) => {
try {
const list = JSON.parse(value || '[]');
if (!Array.isArray(list)) return '';
const codes = list.map((item) => item?.code).filter(Boolean);
return Array.from(new Set(codes)).sort().join('|');
} catch (e) {
return '';
}
}, []);
const scheduleSync = useCallback(() => {
if (!userIdRef.current) return;
if (skipSyncRef.current) return;
@@ -2377,8 +2388,14 @@ export default function HomePage() {
const storageHelper = useMemo(() => {
const keys = new Set(['funds', 'favorites', 'groups', 'collapsedCodes', 'refreshMs', 'holdings', 'pendingTrades']);
const triggerSync = (key) => {
const triggerSync = (key, prevValue, nextValue) => {
if (keys.has(key)) {
if (key === 'funds') {
const prevSig = getFundCodesSignature(prevValue);
const nextSig = getFundCodesSignature(nextValue);
debugger
if (prevSig === nextSig) return;
}
if (!skipSyncRef.current) {
window.localStorage.setItem('localUpdatedAt', nowInTz().toISOString());
}
@@ -2387,12 +2404,14 @@ export default function HomePage() {
};
return {
setItem: (key, value) => {
const prevValue = key === 'funds' ? window.localStorage.getItem(key) : null;
window.localStorage.setItem(key, value);
triggerSync(key);
triggerSync(key, prevValue, value);
},
removeItem: (key) => {
const prevValue = key === 'funds' ? window.localStorage.getItem(key) : null;
window.localStorage.removeItem(key);
triggerSync(key);
triggerSync(key, prevValue, null);
},
clear: () => {
window.localStorage.clear();
@@ -2402,19 +2421,26 @@ export default function HomePage() {
scheduleSync();
}
};
}, [scheduleSync]);
}, [getFundCodesSignature, scheduleSync]);
useEffect(() => {
const keys = new Set(['funds', 'favorites', 'groups', 'collapsedCodes', 'refreshMs', 'holdings', 'pendingTrades']);
const onStorage = (e) => {
if (!e.key || keys.has(e.key)) scheduleSync();
if (!e.key) return;
if (!keys.has(e.key)) return;
if (e.key === 'funds') {
const prevSig = getFundCodesSignature(e.oldValue);
const nextSig = getFundCodesSignature(e.newValue);
if (prevSig === nextSig) return;
}
scheduleSync();
};
window.addEventListener('storage', onStorage);
return () => {
window.removeEventListener('storage', onStorage);
if (syncDebounceRef.current) clearTimeout(syncDebounceRef.current);
};
}, [scheduleSync]);
}, [getFundCodesSignature, scheduleSync]);
const toggleFavorite = (code) => {
setFavorites(prev => {