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.
122 lines
3.0 KiB
122 lines
3.0 KiB
/** |
|
* 租户状态管理 |
|
* 使用 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;
|
|
|