You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
2.5 KiB
102 lines
2.5 KiB
/** |
|
* 租户状态管理 |
|
* 使用 Zustand + AsyncStorage 持久化 |
|
*/ |
|
|
|
import { create } from 'zustand'; |
|
// import { useShallow } from 'zustand/react/shallow'; |
|
import storageManager, { STORAGE_KEYS } from '@/utils/storageManager'; |
|
import { tenantService } from '@/services'; |
|
|
|
|
|
/** |
|
* 租户信息接口 |
|
*/ |
|
export interface Tenant { |
|
tid: number; |
|
proxy: number; |
|
create_time: string; |
|
domain_addr: string |
|
} |
|
|
|
// 状态 |
|
interface State { |
|
tenantInfo: Tenant | null; |
|
} |
|
|
|
// 操作 |
|
interface Actions { |
|
setTenantInfo: (data: Record<string, any>) => void; |
|
} |
|
|
|
|
|
/** |
|
* 租户状态 Store |
|
*/ |
|
const useTenantStore = create<State & Actions>()((set, get) => ({ |
|
// 初始状态 |
|
tenantInfo: null, |
|
|
|
|
|
// 设置租户信息(通用方法,包含持久化逻辑) |
|
setTenantInfo: (data: any) => { |
|
set({ tenantInfo: data }); |
|
// 手动持久化 |
|
storageManager.session.setItem(STORAGE_KEYS.TENANT_STORE, get()); |
|
storageManager.session.setItem(STORAGE_KEYS.TENANT_TID, data?.tid ?? ''); |
|
|
|
if (__DEV__) { |
|
console.log('💾 Tenant info saved:', data); |
|
} |
|
}, |
|
})); |
|
|
|
// 从 AsyncStorage 恢复状态的函数 |
|
export const restoreTenantState = async () => { |
|
try { |
|
const stored = storageManager.session.getItem(STORAGE_KEYS.TENANT_STORE); |
|
if (stored) { |
|
const state = JSON.parse(stored); |
|
useTenantStore.setState(state); |
|
if (__DEV__) { |
|
console.log('✅ Tenant state restored from storage'); |
|
} |
|
} |
|
} catch (error) { |
|
console.error('Failed to restore tenant state:', error); |
|
} |
|
}; |
|
|
|
/** |
|
* 选择器 Hooks(优化性能,避免不必要的重渲染) |
|
*/ |
|
|
|
// 获取用户信息 |
|
export const useTenantInfo = () => useTenantStore((state) => state.tenantInfo); |
|
|
|
// 租户数据是否加载完成 |
|
export const useTenantLoad = () => useTenantStore((state) => !!state.tenantInfo?.tid || !!state.tenantInfo?.create_time); |
|
|
|
// 获取租户信息 |
|
export const requestTenantInfo = async (): Promise<Tenant> => { |
|
try { |
|
// 使用 getState() 而不是 hook |
|
const { setTenantInfo } = useTenantStore.getState(); |
|
const params = { |
|
domain_addr: 'https://51zhh5.notbug.org', |
|
}; |
|
const { data } = await tenantService.getPlatformData(params); |
|
|
|
setTenantInfo(data); |
|
|
|
if (__DEV__) { |
|
console.log('✅ Tenant info loaded:', data); |
|
} |
|
return Promise.resolve(data); |
|
} catch (error) { |
|
console.error('Failed to request tenant info:', error); |
|
return Promise.reject(error); |
|
} |
|
}; |
|
|
|
export default useTenantStore;
|
|
|