|
|
|
|
/**
|
|
|
|
|
* 租户状态管理
|
|
|
|
|
* 使用 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;
|