Files
cunkebao_v3/Touchkebao/src/store/module/weChat/message.ts

189 lines
5.4 KiB
TypeScript
Raw Normal View History

import { create } from "zustand";
import { persist } from "zustand/middleware";
import { ChatSession } from "@/utils/db";
import { Message, MessageState, SessionsUpdater } from "./message.data";
const computeSortKey = (session: ChatSession) => {
const isTop = session.config?.top ? 1 : 0;
const timestamp = new Date(session.lastUpdateTime || new Date()).getTime();
const displayName = (
session.conRemark ||
session.nickname ||
(session as any).wechatId ||
""
).toLowerCase();
return `${isTop}|${timestamp}|${displayName}`;
};
const normalizeSessions = (sessions: ChatSession[]) => {
if (!Array.isArray(sessions)) {
return [];
}
return [...sessions]
.map(session => ({
...session,
sortKey: computeSortKey(session),
}))
.sort((a, b) => b.sortKey.localeCompare(a.sortKey));
};
const resolveUpdater = (
updater: SessionsUpdater,
previous: ChatSession[],
): ChatSession[] => {
if (typeof updater === "function") {
return updater(previous);
}
return updater;
};
/**
* Store
*
* state + IndexedDB
*/
export const useMessageStore = create<MessageState>()(
persist(
(set, get) => ({
// ==================== 新增状态管理 ====================
loading: false,
refreshing: false,
lastRefreshTime: null,
hasLoadedOnce: false,
setLoading: (loading: boolean) => set({ loading }),
setRefreshing: (refreshing: boolean) => set({ refreshing }),
setHasLoadedOnce: (loaded: boolean) => set({ hasLoadedOnce: loaded }),
resetLoadState: () =>
set({
hasLoadedOnce: false,
loading: false,
refreshing: false,
sessions: [],
}),
// ==================== 保留原有接口(向后兼容) ====================
messageList: [],
currentMessage: null,
updateMessageList: (messageList: Message[]) => set({ messageList }),
updateCurrentMessage: (message: Message) =>
set({ currentMessage: message }),
updateMessageStatus: (messageId: number, status: string) =>
set({
messageList: get().messageList.map(message =>
message.id === messageId ? { ...message, status } : message,
),
}),
// ==================== 会话数据接口 ====================
sessions: [],
setSessions: (updater: SessionsUpdater) =>
set(state => ({
sessions: normalizeSessions(resolveUpdater(updater, state.sessions)),
lastRefreshTime: new Date().toISOString(),
})),
upsertSession: (session: ChatSession) =>
set(state => {
const next = [...state.sessions];
const index = next.findIndex(
s => s.id === session.id && s.type === session.type,
);
if (index > -1) {
next[index] = session;
} else {
next.push(session);
}
return {
sessions: normalizeSessions(next),
lastRefreshTime: new Date().toISOString(),
};
}),
removeSessionById: (sessionId: number, type: ChatSession["type"]) =>
set(state => ({
sessions: normalizeSessions(
state.sessions.filter(
s => !(s.id === sessionId && s.type === type),
),
),
lastRefreshTime: new Date().toISOString(),
})),
clearSessions: () =>
set({
sessions: [],
lastRefreshTime: new Date().toISOString(),
}),
}),
{
name: "message-storage",
partialize: state => ({
// 只持久化必要的状态,不持久化数据
lastRefreshTime: state.lastRefreshTime,
hasLoadedOnce: state.hasLoadedOnce,
// 保留原有持久化字段(向后兼容)
messageList: [],
currentMessage: null,
}),
},
),
);
/**
*
* @param message
* @returns void
*/
export const updateCurrentMessage = (message: Message) =>
useMessageStore.getState().updateCurrentMessage(message);
/**
*
* @param messageList
* @returns void
*/
export const updateMessageList = (messageList: Message[]) =>
useMessageStore.getState().updateMessageList(messageList);
/**
*
* @returns Message | null
*/
export const getCurrentMessage = () =>
useMessageStore.getState().currentMessage;
/**
*
* @param messageId ID
* @param status
* @returns void
*/
export const updateMessageStatus = (messageId: number, status: string) =>
useMessageStore.getState().updateMessageStatus(messageId, status);
// ==================== 新增导出函数 ====================
/**
*
* @param loading
*/
export const setLoading = (loading: boolean) =>
useMessageStore.getState().setLoading(loading);
/**
*
* @param refreshing
*/
export const setRefreshing = (refreshing: boolean) =>
useMessageStore.getState().setRefreshing(refreshing);
/**
*
* @param loaded
*/
export const setHasLoadedOnce = (loaded: boolean) =>
useMessageStore.getState().setHasLoadedOnce(loaded);
/**
*
*/
export const resetLoadState = () => useMessageStore.getState().resetLoadState();