refactor(ckchat): 重构联系人列表获取逻辑并添加缓存机制

- 将联系人列表获取逻辑从直接调用改为使用useEffect异步获取
- 为getNewContractList添加缓存机制避免重复计算
- 在相关状态变更时自动清除缓存
- 新增asyncNewContractList方法用于设置联系人列表
This commit is contained in:
2025-09-01 14:58:15 +08:00
parent aec0bad35f
commit 832be374b5
2 changed files with 74 additions and 7 deletions

View File

@@ -30,12 +30,21 @@ export const useCkChatStore = createPersistStore<CkChatState>(
return await kfUserService.findAll();
},
// 异步设置标签列表
asyncCountLables: (data: ContactGroupByLabel[]) => {
asyncCountLables: async (data: ContactGroupByLabel[]) => {
set({ countLables: data });
// 清除getNewContractList缓存
const state = useCkChatStore.getState();
if (
state.getNewContractList &&
typeof state.getNewContractList === "function"
) {
// 触发缓存重新计算
await state.getNewContractList();
}
},
asyncKfSelected: (data: number) => {
asyncKfSelected: async (data: number) => {
set({ kfSelected: data });
// 清除getChatSessions缓存
// 清除getChatSessions、getContractList和getNewContractList缓存
const state = useCkChatStore.getState();
if (
state.getChatSessions &&
@@ -56,14 +65,50 @@ export const useCkChatStore = createPersistStore<CkChatState>(
typeof state.getNewContractList === "function"
) {
// 触发缓存重新计算
state.getNewContractList();
await state.getNewContractList();
}
},
// 获取联系人分组列表 - 使用缓存避免无限循环
getNewContractList: async () => {
getNewContractList: (() => {
let cachedResult: any = null;
let lastKfSelected: number | null = null;
let lastCountLablesLength: number = 0;
return async () => {
const state = useCkChatStore.getState();
// 检查是否需要重新计算缓存
const shouldRecalculate =
cachedResult === null ||
lastKfSelected !== state.kfSelected ||
lastCountLablesLength !== (state.countLables?.length || 0);
if (shouldRecalculate) {
// 使用createContractList构建联系人分组数据
cachedResult = await createContractList(
state.kfSelected,
state.countLables,
);
lastKfSelected = state.kfSelected;
lastCountLablesLength = state.countLables?.length || 0;
}
return cachedResult;
};
})(),
// 异步设置联系人分组列表
asyncNewContractList: async (data: any[]) => {
set({ newContractList: data });
// 清除getNewContractList缓存
const state = useCkChatStore.getState();
return await createContractList(state.kfSelected, state.countLables);
if (
state.getNewContractList &&
typeof state.getNewContractList === "function"
) {
// 触发缓存重新计算
await state.getNewContractList();
}
},
// 异步设置会话列表
asyncChatSessions: data => {
@@ -351,5 +396,7 @@ export const getNewContractList = () =>
useCkChatStore.getState().getNewContractList();
export const asyncCountLables = (data: ContactGroupByLabel[]) =>
useCkChatStore.getState().asyncCountLables(data);
export const asyncNewContractList = (data: any[]) =>
useCkChatStore.getState().asyncNewContractList(data);
export const getCountLables = () => useCkChatStore.getState().countLables;
useCkChatStore.getState().getKfSelectedUser();