Spaces:
Sleeping
Sleeping
File size: 3,860 Bytes
4bae792 8c762ac 57f5158 4bae792 8c762ac 57f5158 4bae792 57f5158 4bae792 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | import { configureStore } from "@reduxjs/toolkit";
import appReducer from "./slices/appSlice";
import themeReducer from "./slices/themeSlice";
import chatReducer from "./slices/chatSlice";
import memberReducer from "./slices/memberSlice";
import messageReducer from "./slices/messageSlice";
import authReducer from "./slices/authSlice";
import dmReducer from "./slices/dmSlice";
import spaceReducer from "./slices/spaceSlice";
import {
setCachedMessages,
setCachedConversations,
setCachedSpaces,
setCachedMembers,
} from "./messageCache";
/**
* Middleware tự động lưu messages vào localStorage
* Chỉ intercept các action thay đổi messages để tránh performance issue
*/
const messageCacheMiddleware = (storeAPI) => (next) => (action) => {
const result = next(action);
// Auto-save DM messages to cache
if (
action.type === "dm/addMessage" ||
action.type === "dm/prependMessages" ||
action.type === "dm/setMessagesPreloaded" ||
action.type === "dm/fetchMessages/fulfilled"
) {
const { dm } = storeAPI.getState();
const conversationId = action.payload?.conversationId;
if (conversationId && dm.messages[conversationId]) {
setCachedMessages("dm", conversationId, dm.messages[conversationId]);
}
// Also save all conversations on bulk operations
if (action.type === "dm/setMessagesPreloaded" || action.type === "dm/fetchMessages/fulfilled") {
Object.entries(dm.messages).forEach(([id, messages]) => {
setCachedMessages("dm", id, messages);
});
}
}
// Auto-save room messages to cache
if (
action.type === "message/addMessage" ||
action.type === "message/prependRoomMessages" ||
action.type === "message/setRoomMessagesPreloaded" ||
action.type === "message/fetchRoomMessages/fulfilled"
) {
const { message } = storeAPI.getState();
const roomId = action.payload?.roomId;
if (roomId && message.messages[roomId]) {
setCachedMessages("room", roomId, message.messages[roomId]);
}
// Also save all rooms on bulk operations
if (action.type === "message/setRoomMessagesPreloaded" || action.type === "message/fetchRoomMessages/fulfilled") {
Object.entries(message.messages).forEach(([id, messages]) => {
setCachedMessages("room", id, messages);
});
}
}
// Auto-save conversations list to cache
if (
action.type === "dm/fetchConversations/fulfilled" ||
action.type === "dm/setConversationsPreloaded" ||
action.type === "dm/addConversation" ||
action.type === "dm/replaceTempConversation" ||
action.type === "dm/updateConversationLastMessage"
) {
const { dm } = storeAPI.getState();
if (dm.conversations && dm.conversations.length > 0) {
setCachedConversations(dm.conversations);
}
}
// Auto-save spaces and rooms to cache
if (
action.type === "space/fetchSpaces/fulfilled" ||
action.type === "space/createSpace/fulfilled" ||
action.type === "space/joinSpaceByInvite/fulfilled" ||
action.type === "space/addSpace"
) {
const { space } = storeAPI.getState();
if (space.spaces && space.spaces.length > 0) {
setCachedSpaces(space.spaces, space.roomsMap);
}
}
// Auto-save members to cache
if (
action.type === "space/fetchSpaceMembers/fulfilled"
) {
const { space } = storeAPI.getState();
if (space.membersMap && Object.keys(space.membersMap).length > 0) {
setCachedMembers(space.membersMap);
}
}
return result;
};
export const store = configureStore({
reducer: {
app: appReducer,
theme: themeReducer,
chat: chatReducer,
member: memberReducer,
message: messageReducer,
auth: authReducer,
dm: dmReducer,
space: spaceReducer,
},
middleware: (getDefaultMiddleware) =>
getDefaultMiddleware().concat(messageCacheMiddleware),
});
|