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),
});