重构聊天消息处理和分页逻辑。为消息记录参数引入一个新的接口,以增强类型安全性。更新获取聊天消息和聊天室消息的API调用,以支持分页。通过删除不必要的刷新触发器和优化会话状态管理来优化MessageList组件。改进加载状态处理,并确保组件之间消息加载行为的一致性。
This commit is contained in:
@@ -1,6 +1,43 @@
|
||||
import { create } from "zustand";
|
||||
import { persist } from "zustand/middleware";
|
||||
import { Message, MessageState } from "./message.data";
|
||||
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
|
||||
@@ -13,24 +50,18 @@ export const useMessageStore = create<MessageState>()(
|
||||
// ==================== 新增状态管理 ====================
|
||||
loading: false,
|
||||
refreshing: false,
|
||||
refreshTrigger: 0,
|
||||
lastRefreshTime: null,
|
||||
hasLoadedOnce: false,
|
||||
|
||||
setLoading: (loading: boolean) => set({ loading }),
|
||||
setRefreshing: (refreshing: boolean) => set({ refreshing }),
|
||||
triggerRefresh: () =>
|
||||
set({
|
||||
refreshTrigger: get().refreshTrigger + 1,
|
||||
lastRefreshTime: new Date().toISOString(),
|
||||
}),
|
||||
setHasLoadedOnce: (loaded: boolean) => set({ hasLoadedOnce: loaded }),
|
||||
resetLoadState: () =>
|
||||
set({
|
||||
hasLoadedOnce: false,
|
||||
loading: false,
|
||||
refreshing: false,
|
||||
refreshTrigger: 0,
|
||||
sessions: [],
|
||||
}),
|
||||
|
||||
// ==================== 保留原有接口(向后兼容) ====================
|
||||
@@ -45,6 +76,45 @@ export const useMessageStore = create<MessageState>()(
|
||||
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",
|
||||
@@ -105,11 +175,6 @@ export const setLoading = (loading: boolean) =>
|
||||
export const setRefreshing = (refreshing: boolean) =>
|
||||
useMessageStore.getState().setRefreshing(refreshing);
|
||||
|
||||
/**
|
||||
* 触发刷新(通知组件重新查询数据库)
|
||||
*/
|
||||
export const triggerRefresh = () => useMessageStore.getState().triggerRefresh();
|
||||
|
||||
/**
|
||||
* 设置已加载标识
|
||||
* @param loaded 是否已加载
|
||||
|
||||
Reference in New Issue
Block a user