130 lines
4.0 KiB
TypeScript
130 lines
4.0 KiB
TypeScript
|
|
import { useWeChatStore } from "@/store/module/weChat/weChat";
|
|||
|
|
import { useShallow } from "zustand/react/shallow";
|
|||
|
|
import { useMemo } from "react";
|
|||
|
|
import type { WeChatState } from "@/store/module/weChat/weChat.data";
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 合并多个 selector,减少重渲染
|
|||
|
|
* 使用 useShallow 进行 shallow 比较,只有对象属性变化时才触发更新
|
|||
|
|
* 使用 useMemo 稳定 selector 函数引用
|
|||
|
|
*/
|
|||
|
|
export const useWeChatSelectors = () => {
|
|||
|
|
const selector = useMemo(
|
|||
|
|
() => (state: WeChatState) => ({
|
|||
|
|
// 消息相关
|
|||
|
|
currentMessages: state.currentMessages,
|
|||
|
|
currentMessagesHasMore: state.currentMessagesHasMore,
|
|||
|
|
messagesLoading: state.messagesLoading,
|
|||
|
|
isLoadingData: state.isLoadingData,
|
|||
|
|
|
|||
|
|
// 联系人相关
|
|||
|
|
currentContract: state.currentContract,
|
|||
|
|
|
|||
|
|
// UI 状态
|
|||
|
|
showCheckbox: state.showCheckbox,
|
|||
|
|
EnterModule: state.EnterModule,
|
|||
|
|
showChatRecordModel: state.showChatRecordModel,
|
|||
|
|
|
|||
|
|
// AI 相关
|
|||
|
|
isLoadingAiChat: state.isLoadingAiChat,
|
|||
|
|
quoteMessageContent: state.quoteMessageContent,
|
|||
|
|
aiQuoteMessageContent: state.aiQuoteMessageContent,
|
|||
|
|
|
|||
|
|
// 选中记录
|
|||
|
|
selectedChatRecords: state.selectedChatRecords,
|
|||
|
|
}),
|
|||
|
|
[],
|
|||
|
|
);
|
|||
|
|
return useWeChatStore(useShallow(selector));
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 消息相关的 selector
|
|||
|
|
* 使用 useShallow 进行 shallow 比较,避免 getSnapshot 警告
|
|||
|
|
* 使用 useMemo 稳定 selector 函数引用
|
|||
|
|
*/
|
|||
|
|
export const useMessageSelectors = (): Pick<
|
|||
|
|
WeChatState,
|
|||
|
|
| "currentMessages"
|
|||
|
|
| "currentMessagesHasMore"
|
|||
|
|
| "messagesLoading"
|
|||
|
|
| "isLoadingData"
|
|||
|
|
> => {
|
|||
|
|
const selector = useMemo(
|
|||
|
|
() => (state: WeChatState) => ({
|
|||
|
|
currentMessages: state.currentMessages,
|
|||
|
|
currentMessagesHasMore: state.currentMessagesHasMore,
|
|||
|
|
messagesLoading: state.messagesLoading,
|
|||
|
|
isLoadingData: state.isLoadingData,
|
|||
|
|
}),
|
|||
|
|
[],
|
|||
|
|
);
|
|||
|
|
return useWeChatStore(useShallow(selector));
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* UI 状态相关的 selector
|
|||
|
|
* 使用 useShallow 进行 shallow 比较,避免 getSnapshot 警告
|
|||
|
|
* 使用 useMemo 稳定 selector 函数引用
|
|||
|
|
*/
|
|||
|
|
export const useUIStateSelectors = (): Pick<
|
|||
|
|
WeChatState,
|
|||
|
|
"showCheckbox" | "EnterModule" | "showChatRecordModel"
|
|||
|
|
> => {
|
|||
|
|
const selector = useMemo(
|
|||
|
|
() => (state: WeChatState) => ({
|
|||
|
|
showCheckbox: state.showCheckbox,
|
|||
|
|
EnterModule: state.EnterModule,
|
|||
|
|
showChatRecordModel: state.showChatRecordModel,
|
|||
|
|
}),
|
|||
|
|
[],
|
|||
|
|
);
|
|||
|
|
return useWeChatStore(useShallow(selector));
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* AI 相关的 selector
|
|||
|
|
* 使用 useShallow 进行 shallow 比较,避免 getSnapshot 警告
|
|||
|
|
* 使用 useMemo 稳定 selector 函数引用
|
|||
|
|
*/
|
|||
|
|
export const useAISelectors = (): Pick<
|
|||
|
|
WeChatState,
|
|||
|
|
"isLoadingAiChat" | "quoteMessageContent" | "aiQuoteMessageContent"
|
|||
|
|
> => {
|
|||
|
|
const selector = useMemo(
|
|||
|
|
() => (state: WeChatState) => ({
|
|||
|
|
isLoadingAiChat: state.isLoadingAiChat,
|
|||
|
|
quoteMessageContent: state.quoteMessageContent,
|
|||
|
|
aiQuoteMessageContent: state.aiQuoteMessageContent,
|
|||
|
|
}),
|
|||
|
|
[],
|
|||
|
|
);
|
|||
|
|
return useWeChatStore(useShallow(selector));
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 操作方法 selector
|
|||
|
|
* 使用 useShallow 进行 shallow 比较,避免 getSnapshot 警告
|
|||
|
|
* 虽然方法引用稳定,但返回的对象需要 shallow 比较
|
|||
|
|
*/
|
|||
|
|
export const useWeChatActions = () => {
|
|||
|
|
const selector = useMemo(
|
|||
|
|
() => (state: WeChatState) => ({
|
|||
|
|
addMessage: state.addMessage,
|
|||
|
|
updateMessage: state.updateMessage,
|
|||
|
|
recallMessage: state.recallMessage,
|
|||
|
|
loadChatMessages: state.loadChatMessages,
|
|||
|
|
updateShowCheckbox: state.updateShowCheckbox,
|
|||
|
|
updateEnterModule: state.updateEnterModule,
|
|||
|
|
updateQuoteMessageContent: state.updateQuoteMessageContent,
|
|||
|
|
updateIsLoadingAiChat: state.updateIsLoadingAiChat,
|
|||
|
|
updateSelectedChatRecords: state.updateSelectedChatRecords,
|
|||
|
|
updateShowChatRecordModel: state.updateShowChatRecordModel,
|
|||
|
|
setCurrentContact: state.setCurrentContact,
|
|||
|
|
updateAiQuoteMessageContent: state.updateAiQuoteMessageContent,
|
|||
|
|
}),
|
|||
|
|
[],
|
|||
|
|
);
|
|||
|
|
return useWeChatStore(useShallow(selector));
|
|||
|
|
};
|