dee257c16c
将主站唯一钱包 lifecycle 上移到 AuthGate 根认证边界 在账号切换、StrictMode 重放和根卸载时统一清空钱包 Store 移除平台子壳的重复 owner 声明并补充测试边界 新增 mount、focus、unmount 与 StrictMode 回归测试 同步钱包 lifecycle 长期决策与 Vitest 收集范围
69 lines
2.1 KiB
TypeScript
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,
|
|
]);
|
|
}
|