新增消息列表API,优化消息列表组件以支持加载状态和数据同步,提升用户体验和代码可读性。
This commit is contained in:
@@ -24,16 +24,33 @@ export interface Message {
|
||||
[key: string]: any;
|
||||
}
|
||||
|
||||
//Store State
|
||||
//Store State - 会话列表状态管理(不存储数据,只管理状态)
|
||||
export interface MessageState {
|
||||
//消息列表
|
||||
//加载状态
|
||||
loading: boolean;
|
||||
//后台同步状态
|
||||
refreshing: boolean;
|
||||
//刷新触发器(用于通知组件重新查询数据库)
|
||||
refreshTrigger: number;
|
||||
//最后刷新时间
|
||||
lastRefreshTime: string | null;
|
||||
|
||||
//设置加载状态
|
||||
setLoading: (loading: boolean) => void;
|
||||
//设置同步状态
|
||||
setRefreshing: (refreshing: boolean) => void;
|
||||
//触发刷新(通知组件重新查询)
|
||||
triggerRefresh: () => void;
|
||||
|
||||
// ==================== 保留原有接口(向后兼容) ====================
|
||||
//消息列表(废弃,保留兼容)
|
||||
messageList: Message[];
|
||||
//当前选中的消息
|
||||
//当前选中的消息(废弃,保留兼容)
|
||||
currentMessage: Message | null;
|
||||
//更新消息列表
|
||||
//更新消息列表(废弃,保留兼容)
|
||||
updateMessageList: (messageList: Message[]) => void;
|
||||
//更新消息状态
|
||||
//更新消息状态(废弃,保留兼容)
|
||||
updateMessageStatus: (messageId: number, status: string) => void;
|
||||
//更新当前选中的消息
|
||||
//更新当前选中的消息(废弃,保留兼容)
|
||||
updateCurrentMessage: (message: Message) => void;
|
||||
}
|
||||
|
||||
@@ -1,24 +1,48 @@
|
||||
import { create } from "zustand";
|
||||
import { persist } from "zustand/middleware";
|
||||
import { Message, MessageState } from "./message.data";
|
||||
|
||||
/**
|
||||
* 会话列表状态管理Store
|
||||
* 职责:只管理状态,不存储会话列表数据
|
||||
* 数据存储在:组件state + IndexedDB
|
||||
*/
|
||||
export const useMessageStore = create<MessageState>()(
|
||||
persist(
|
||||
(set, get) => ({
|
||||
messageList: [], //消息列表
|
||||
currentMessage: null, //当前选中的消息
|
||||
updateMessageList: (messageList: Message[]) => set({ messageList }), //更新消息列表
|
||||
// ==================== 新增状态管理 ====================
|
||||
loading: false,
|
||||
refreshing: false,
|
||||
refreshTrigger: 0,
|
||||
lastRefreshTime: null,
|
||||
|
||||
setLoading: (loading: boolean) => set({ loading }),
|
||||
setRefreshing: (refreshing: boolean) => set({ refreshing }),
|
||||
triggerRefresh: () =>
|
||||
set({
|
||||
refreshTrigger: get().refreshTrigger + 1,
|
||||
lastRefreshTime: new Date().toISOString(),
|
||||
}),
|
||||
|
||||
// ==================== 保留原有接口(向后兼容) ====================
|
||||
messageList: [],
|
||||
currentMessage: null,
|
||||
updateMessageList: (messageList: Message[]) => set({ messageList }),
|
||||
updateCurrentMessage: (message: Message) =>
|
||||
set({ currentMessage: message }), //更新当前选中的消息
|
||||
set({ currentMessage: message }),
|
||||
updateMessageStatus: (messageId: number, status: string) =>
|
||||
set({
|
||||
messageList: get().messageList.map(message =>
|
||||
message.id === messageId ? { ...message, status } : message,
|
||||
),
|
||||
}), //更新消息状态
|
||||
}),
|
||||
}),
|
||||
{
|
||||
name: "message-storage",
|
||||
partialize: state => ({
|
||||
// 只持久化必要的状态,不持久化数据
|
||||
lastRefreshTime: state.lastRefreshTime,
|
||||
// 保留原有持久化字段(向后兼容)
|
||||
messageList: [],
|
||||
currentMessage: null,
|
||||
}),
|
||||
@@ -54,3 +78,24 @@ export const getCurrentMessage = () =>
|
||||
*/
|
||||
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);
|
||||
|
||||
/**
|
||||
* 触发刷新(通知组件重新查询数据库)
|
||||
*/
|
||||
export const triggerRefresh = () => useMessageStore.getState().triggerRefresh();
|
||||
|
||||
@@ -57,8 +57,28 @@ const messageHandlers: Record<string, MessageHandler> = {
|
||||
},
|
||||
//收到消息
|
||||
CmdNewMessage: (message: Messages) => {
|
||||
// 在这里添加具体的处理逻辑
|
||||
// 处理消息本身
|
||||
receivedMsg(message.friendMessage || message.chatroomMessage);
|
||||
|
||||
// 触发会话列表更新事件
|
||||
const msgData = message.friendMessage || message.chatroomMessage;
|
||||
if (msgData) {
|
||||
const sessionId = message.friendMessage
|
||||
? message.friendMessage.wechatFriendId
|
||||
: message.chatroomMessage?.wechatChatroomId;
|
||||
const type = message.friendMessage ? "friend" : "group";
|
||||
|
||||
// 发送自定义事件通知MessageList组件
|
||||
window.dispatchEvent(
|
||||
new CustomEvent("chatMessageReceived", {
|
||||
detail: {
|
||||
message: msgData,
|
||||
sessionId,
|
||||
type,
|
||||
},
|
||||
}),
|
||||
);
|
||||
}
|
||||
},
|
||||
CmdFriendInfoChanged: () => {
|
||||
// console.log("好友信息变更", message);
|
||||
|
||||
Reference in New Issue
Block a user