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

189 lines
5.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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();