perf(ckchat): 优化getChatSessions缓存机制避免无限循环

添加缓存机制来避免getChatSessions方法的重复计算,通过检查kfSelected和chatSessions的变化来决定是否重新计算缓存。同时在相关操作后主动清除缓存以确保数据一致性。
This commit is contained in:
超级老白兔
2025-09-01 10:43:09 +08:00
parent 52430d6466
commit 3cb10e217b

View File

@@ -7,7 +7,12 @@ import {
KfUserListData,
ContactGroupByLabel,
} from "@/pages/pc/ckbox/data";
import { kfUserService, weChatGroupService, contractService } from "@/utils/db";
import {
kfUserService,
weChatGroupService,
contractService,
messageListService,
} from "@/utils/db";
export const useCkChatStore = createPersistStore<CkChatState>(
set => ({
userInfo: null,
@@ -28,6 +33,15 @@ export const useCkChatStore = createPersistStore<CkChatState>(
},
asyncKfSelected: (data: number) => {
set({ kfSelected: data });
// 清除getChatSessions缓存
const state = useCkChatStore.getState();
if (
state.getChatSessions &&
typeof state.getChatSessions === "function"
) {
// 触发缓存重新计算
state.getChatSessions();
}
},
// 异步设置会话列表
asyncNewContractList: (data: ContactGroupByLabel[]) => {
@@ -40,6 +54,15 @@ export const useCkChatStore = createPersistStore<CkChatState>(
// 异步设置会话列表
asyncChatSessions: data => {
set({ chatSessions: data });
// 清除getChatSessions缓存
const state = useCkChatStore.getState();
if (
state.getChatSessions &&
typeof state.getChatSessions === "function"
) {
// 触发缓存重新计算
state.getChatSessions();
}
},
// 异步设置联系人列表
asyncContractList: async (data: ContractData[]) => {
@@ -77,17 +100,35 @@ export const useCkChatStore = createPersistStore<CkChatState>(
clearkfUserList: () => {
set({ kfUserList: [] });
},
// 获取聊天会话
getChatSessions: () => {
const state = useCkChatStore.getState();
if (state.kfSelected != 0) {
return state.chatSessions.filter(
item => item.wechatAccountId === state.kfSelected,
);
} else {
return state.chatSessions;
}
},
// 获取聊天会话 - 使用缓存避免无限循环
getChatSessions: (() => {
let cachedResult: any = null;
let lastKfSelected: number | null = null;
let lastChatSessionsLength: number = 0;
return () => {
const state = useCkChatStore.getState();
// 检查是否需要重新计算缓存
const shouldRecalculate =
cachedResult === null ||
lastKfSelected !== state.kfSelected ||
lastChatSessionsLength !== state.chatSessions.length;
if (shouldRecalculate) {
const filteredSessions = state.chatSessions.filter(
item => item.wechatAccountId === state.kfSelected,
);
cachedResult =
state.kfSelected !== 0 ? filteredSessions : state.chatSessions;
lastKfSelected = state.kfSelected;
lastChatSessionsLength = state.chatSessions.length;
}
return cachedResult;
};
})(),
// 添加聊天会话
addChatSession: (session: ContractData | weChatGroup) => {
set(state => {
@@ -100,6 +141,15 @@ export const useCkChatStore = createPersistStore<CkChatState>(
: [...state.chatSessions, session as ContractData | weChatGroup],
};
});
// 清除getChatSessions缓存
const state = useCkChatStore.getState();
if (
state.getChatSessions &&
typeof state.getChatSessions === "function"
) {
// 触发缓存重新计算
state.getChatSessions();
}
},
// 更新聊天会话
updateChatSession: (session: ContractData | weChatGroup) => {
@@ -108,12 +158,30 @@ export const useCkChatStore = createPersistStore<CkChatState>(
item.id === session.id ? session : item,
),
}));
// 清除getChatSessions缓存
const state = useCkChatStore.getState();
if (
state.getChatSessions &&
typeof state.getChatSessions === "function"
) {
// 触发缓存重新计算
state.getChatSessions();
}
},
// 删除聊天会话
deleteChatSession: (sessionId: string) => {
set(state => ({
chatSessions: state.chatSessions.filter(item => item.id !== sessionId),
}));
// 清除getChatSessions缓存
const state = useCkChatStore.getState();
if (
state.getChatSessions &&
typeof state.getChatSessions === "function"
) {
// 触发缓存重新计算
state.getChatSessions();
}
},
// 设置用户信息
setUserInfo: (userInfo: CkUserInfo) => {