123 lines
3.0 KiB
TypeScript
123 lines
3.0 KiB
TypeScript
/**
|
||
* 租户状态管理
|
||
* 使用 Zustand + AsyncStorage 持久化
|
||
*/
|
||
|
||
import { create } from 'zustand';
|
||
import { useShallow } from 'zustand/react/shallow';
|
||
import AsyncStorage from '@react-native-async-storage/async-storage';
|
||
import { STORAGE_KEYS } from '@/utils/storage';
|
||
import { tenantService } from '@/services/tenantService';
|
||
import { useEffect } from 'react';
|
||
|
||
/**
|
||
* 租户信息接口
|
||
*/
|
||
// export interface Tenant {
|
||
// id: string;
|
||
// username: string;
|
||
// email: string;
|
||
// avatar?: string;
|
||
// nickname?: string;
|
||
// phone?: string;
|
||
// createdAt?: string;
|
||
// }
|
||
|
||
/**
|
||
* 租户状态接口
|
||
*/
|
||
interface TenantState {
|
||
// 状态
|
||
tenantInfo: Record<string, any> | null;
|
||
|
||
// 操作
|
||
setTenantInfo: (data: Record<string, any>) => void;
|
||
requestTenantInfo: (data?: Record<string, any>) => Promise<any>;
|
||
}
|
||
|
||
/**
|
||
* 租户状态 Store
|
||
*/
|
||
const useTenantStore = create<TenantState>()((set, get) => ({
|
||
// 初始状态
|
||
tenantInfo: null,
|
||
|
||
|
||
// 设置租户信息(通用方法,包含持久化逻辑)
|
||
setTenantInfo: (data: any) => {
|
||
set({ tenantInfo: data });
|
||
// 手动持久化
|
||
// AsyncStorage.setItem(STORAGE_KEYS.TENANT_STORE, JSON.stringify({ tenantInfo: data }));
|
||
|
||
if (__DEV__) {
|
||
console.log('💾 Tenant info saved:', data);
|
||
}
|
||
},
|
||
|
||
// 获取租户信息(调用 API 并使用 setTenantInfo 保存)
|
||
requestTenantInfo: async () => {
|
||
try {
|
||
const params = {
|
||
domain_addr: 'https://51zhh5.notbug.org',
|
||
};
|
||
const { data } = await tenantService.getPlatformData(params);
|
||
|
||
// 调用 setTenantInfo 来保存数据,避免重复代码
|
||
get().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);
|
||
}
|
||
},
|
||
}));
|
||
|
||
// 从 AsyncStorage 恢复状态的函数
|
||
export const restoreTenantState = async () => {
|
||
try {
|
||
const stored = await AsyncStorage.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 useTenantStates = () =>
|
||
useTenantStore(
|
||
useShallow((state) => ({
|
||
tenantInfo: state.tenantInfo,
|
||
tenantLoad: !!state.tenantInfo?.tid || !!state.tenantInfo?.create_time,
|
||
}))
|
||
);
|
||
|
||
// 获取租户操作方法
|
||
// 使用 useShallow 避免每次渲染都返回新对象
|
||
export const useTenantActions = () =>
|
||
useTenantStore(
|
||
useShallow((state) => ({
|
||
setTenantInfo: state.setTenantInfo,
|
||
requestTenantInfo: state.requestTenantInfo,
|
||
}))
|
||
);
|
||
|
||
export default useTenantStore;
|