Spaces:
Paused
Paused
File size: 4,468 Bytes
a0fda44 |
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 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
import { createSlice, current } from "@reduxjs/toolkit";
const chatList = createSlice({
initialState: [],
name: "chatList",
reducers: {
setChatList: (state, { payload }) => payload.chatList,
markMessagesInChatRoomAsRead: (state, { payload }) => {
const currentState = current(state);
const chatRoomIndex = currentState.findIndex(
(chat) => chat.chatRoomId === payload.chatRoomId
);
state[chatRoomIndex].unreadMessagesCount = 0;
},
IncreaseMessageCountInChatRoom: (state, { payload }) => {
const currentState = current(state);
const chatRoomIndex = currentState.findIndex(
(chat) => chat.chatRoomId === payload.chatRoomId
);
state[chatRoomIndex].unreadMessagesCount += 1;
},
setLatestMessage: (state, { payload }) => {
const currentState = current(state);
const chatRoomIndex = currentState.findIndex(
(chat) => chat.chatRoomId === payload.chatRoomId
);
const chatRoom = {
...currentState[chatRoomIndex],
latestMessage: payload.latestMessage,
};
const remainingChatRooms = currentState.filter(
(_, index) => index !== chatRoomIndex
);
// If chatRoom is pinned, put directly to the start of the array
if (chatRoom.pinned) {
return [chatRoom].concat(remainingChatRooms);
}
// Else find lastIndexOf last pinned chat and put chat room after it
else {
const newIndexOfChatRoom =
remainingChatRooms.findLastIndex((chatRoom) => chatRoom.pinned) + 1;
return [
...remainingChatRooms.slice(0, newIndexOfChatRoom),
chatRoom,
...remainingChatRooms.slice(newIndexOfChatRoom),
];
}
},
updateMessageStatus: (state, { payload }) => {
const currentState = current(state);
const chatRoomIndex = currentState.findIndex(
(chat) => chat.chatRoomId === payload.chatRoomId
);
if (currentState[chatRoomIndex]?.latestMessage._id !== payload.messageId)
return;
state[chatRoomIndex].latestMessage[payload.status] = true;
},
setChatMode: (state, { payload }) => {
const currentState = current(state);
const chatRoomIndex = currentState.findIndex(
(chat) => chat.chatRoomId === payload.chatRoomId
);
state[chatRoomIndex].mode = payload.mode;
},
pinOrUnpinChat: (state, { payload }) => {
let currentState = current(state);
currentState = currentState.map((chatRoom) =>
Object.assign({}, chatRoom)
);
const chatRoomIndex = currentState.findIndex(
(chat) => chat.chatRoomId === payload.chatRoomId
);
currentState[chatRoomIndex].pinned = payload.pinned;
// Get pinned chats and sort based on latest message
const pinnedChats = currentState
.filter((chatRoom) => chatRoom.pinned)
.sort((a, b) => {
const latestMessageInATime = new Date(
a.latestMessage.timeSent
).getTime();
const latestMessageInBTime = new Date(
b.latestMessage.timeSent
).getTime();
return latestMessageInBTime - latestMessageInATime;
});
// Get unpinned chats and sort based on latest message
const unpinnedChats = currentState
.filter((chatRoom) => !chatRoom.pinned)
.sort((a, b) => {
const latestMessageInATime = new Date(
a.latestMessage.timeSent
).getTime();
const latestMessageInBTime = new Date(
b.latestMessage.timeSent
).getTime();
return latestMessageInBTime - latestMessageInATime;
});
// Concatenate both arrays and return as new state
return pinnedChats.concat(unpinnedChats);
},
addToChatList: (state, { payload }) => {
const currentState = current(state);
if (
currentState.some(
(chatRoom) => chatRoom.chatRoomId === payload.newChat.chatRoomId
)
)
return;
else {
state.push(payload.newChat);
}
},
removeFromChatList: (state, { payload }) => {
const currentState = current(state);
const chatRoomIndex = currentState.findIndex(
(chat) => chat.chatRoomId === payload.chatRoomId
);
state[chatRoomIndex].latestMessage = {};
},
},
});
export const chatListActions = chatList.actions;
export default chatList.reducer;
|