feat: 优化对 funds 的同步逻辑
This commit is contained in:
38
app/page.jsx
38
app/page.jsx
@@ -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 => {
|
||||
|
||||
Reference in New Issue
Block a user