Files
Genarrative/src/stores/usePlatformWalletStore.ts
T
k88936 dee257c16c 收口根认证钱包生命周期
将主站唯一钱包 lifecycle 上移到 AuthGate 根认证边界

在账号切换、StrictMode 重放和根卸载时统一清空钱包 Store

移除平台子壳的重复 owner 声明并补充测试边界

新增 mount、focus、unmount 与 StrictMode 回归测试

同步钱包 lifecycle 长期决策与 Vitest 收集范围
2026-08-07 11:23:18 +08:00

69 lines
2.1 KiB
TypeScript

import { useEffect } from 'react';
import { createProfileWalletStore } from '@/packages/shared/src/stores/createProfileWalletStore';
import { getPlatformProfileRechargeCenter } from '@/src/services/platform-entry/platformProfileClient.ts';
export const usePlatformWalletStore = createProfileWalletStore({
getRechargeCenter: (signal) => getPlatformProfileRechargeCenter({ signal }),
});
export function usePlatformWalletLifecycle(
currentUserId: string | null,
canAccessProtectedData: boolean,
) {
const setWalletOwner = usePlatformWalletStore(
(state) => state.setWalletOwner,
);
const onWalletBalanceMayHaveChanged = usePlatformWalletStore(
(state) => state.onWalletBalanceMayHaveChanged,
);
const resetWalletBalance = usePlatformWalletStore(
(state) => state.resetWalletBalance,
);
useEffect(() => {
const ownerUserId =
canAccessProtectedData && currentUserId ? currentUserId : null;
setWalletOwner(ownerUserId);
if (!ownerUserId) {
return () => {
resetWalletBalance();
};
}
void onWalletBalanceMayHaveChanged();
let foregroundRefreshTimer: number | null = null;
const scheduleWalletRefresh = () => {
if (foregroundRefreshTimer !== null) {
return;
}
foregroundRefreshTimer = window.setTimeout(() => {
foregroundRefreshTimer = null;
void onWalletBalanceMayHaveChanged();
}, 0);
};
const refreshVisibleWallet = () => {
if (document.visibilityState === 'visible') {
scheduleWalletRefresh();
}
};
window.addEventListener('focus', scheduleWalletRefresh);
document.addEventListener('visibilitychange', refreshVisibleWallet);
return () => {
window.removeEventListener('focus', scheduleWalletRefresh);
document.removeEventListener('visibilitychange', refreshVisibleWallet);
if (foregroundRefreshTimer !== null) {
window.clearTimeout(foregroundRefreshTimer);
}
resetWalletBalance();
};
}, [
canAccessProtectedData,
currentUserId,
onWalletBalanceMayHaveChanged,
resetWalletBalance,
setWalletOwner,
]);
}