From f35fd765f0d6923da93c18dbcd4fc985b3fe23bf Mon Sep 17 00:00:00 2001 From: zerosoul Date: Tue, 8 Mar 2022 15:09:39 +0800 Subject: [PATCH] refactor: message handler --- src/app/slices/message.channel.js | 85 +++++-------------------------- src/app/slices/message.handler.js | 82 +++++++++++++++++++++++++++++ src/app/slices/message.user.js | 84 +++++------------------------- 3 files changed, 108 insertions(+), 143 deletions(-) create mode 100644 src/app/slices/message.handler.js diff --git a/src/app/slices/message.channel.js b/src/app/slices/message.channel.js index 198b5730..21fa5487 100644 --- a/src/app/slices/message.channel.js +++ b/src/app/slices/message.channel.js @@ -1,6 +1,12 @@ import { createSlice } from "@reduxjs/toolkit"; -import { isObjectEqual } from "../../common/utils"; - +import { + msgReaction, + msgAdd, + msgSetRead, + msgClearUnread, + msgUpdate, + msgDelete, +} from "./message.handler"; const initialState = {}; const channelMsgSlice = createSlice({ @@ -14,85 +20,22 @@ const channelMsgSlice = createSlice({ return action.payload; }, addChannelMsg(state, action) { - const { - id, - content, - created_at, - mid, - from_uid, - content_type, - unread = true, - } = action.payload; - const newMsg = { content, content_type, created_at, from_uid, unread }; - if (state[id]) { - let replaceMsg = state[id][mid]; - // 如果存在,并且新消息和缓存消息不一样,则替换掉,并且改为已读(可能有问题) - if (replaceMsg) { - const copyMsg = { ...replaceMsg }; - if (!isObjectEqual(copyMsg, newMsg)) { - state[id][mid] = { ...newMsg, unread: false }; - } - } else { - state[id][mid] = newMsg; - } - } else { - state[id] = { [mid]: newMsg }; - } + msgAdd(state, action.payload); }, deleteChannelMsg(state, action) { - const { id, mid } = action.payload; - console.log("delete channel message", id, mid, state[id][mid]); - if (state[id][mid]) { - // 添加removed标识 - // state[id][mid]["removed"] = true; - delete state[id][mid]; - } + msgDelete(state, action.payload); }, updateChannelMsg(state, action) { - const { id, mid, content, time } = action.payload; - console.log("update channel message", id, mid); - if (state[id][mid]) { - state[id][mid].content = content; - state[id][mid].edited = time; - } + msgUpdate(state, action.payload); }, likeChannelMsg(state, action) { - const { id, from_uid, mid, action: reaction } = action.payload; - console.log("channel likes: likes", id, mid, from_uid, reaction); - if (state[id] && state[id][mid]) { - if (!state[id][mid].likes) { - console.log("channel likes: initial "); - state[id][mid].likes = {}; - } - const currLikes = state[id][mid].likes; - // state[id][mid].likes = currLikes ? [...currLikes, reaction] : [reaction]; - if (currLikes[reaction]) { - if (currLikes[reaction].includes(from_uid)) { - const idx = currLikes[reaction].findIndex((id) => { - return id == from_uid; - }); - console.log("remove reaction", currLikes[reaction], idx, from_uid); - currLikes[reaction].splice(idx, 1); - } else { - currLikes[reaction].push(from_uid); - } - } else { - currLikes[reaction] = [from_uid]; - } - // state[id][mid].likes = currLikes; - } + msgReaction(state, action.payload); }, setChannelMsgRead(state, action) { - const { id, mid } = action.payload; - console.log("set unread", id, mid); - state[id][mid].unread = false; + msgSetRead(state, action.payload); }, clearChannelMsgUnread(state, action) { - const gid = action.payload; - console.log("set channel all unread", gid); - Object.entries(state[gid]).forEach(([, obj]) => { - obj.unread = false; - }); + msgClearUnread(state, action.payload); }, }, }); diff --git a/src/app/slices/message.handler.js b/src/app/slices/message.handler.js new file mode 100644 index 00000000..498e0b1a --- /dev/null +++ b/src/app/slices/message.handler.js @@ -0,0 +1,82 @@ +import { isObjectEqual } from "../../common/utils"; + +export const msgReaction = (state, payload) => { + const { id, from_uid, mid, action: reaction } = payload; + console.log("msg reaction: likes", id, mid, from_uid, reaction); + if (state[id] && state[id][mid]) { + if (!state[id][mid].likes) { + console.log("msg reaction: initial "); + state[id][mid].likes = {}; + } + const currLikes = state[id][mid].likes; + // state[id][mid].likes = currLikes ? [...currLikes, reaction] : [reaction]; + if (currLikes[reaction]) { + if (currLikes[reaction].includes(from_uid)) { + const idx = currLikes[reaction].findIndex((id) => { + return id == from_uid; + }); + console.log("remove reaction", currLikes[reaction], idx, from_uid); + currLikes[reaction].splice(idx, 1); + } else { + currLikes[reaction].push(from_uid); + } + } else { + currLikes[reaction] = [from_uid]; + } + // state[id][mid].likes = currLikes; + } +}; + +export const msgAdd = (state, payload) => { + const { + id, + content, + created_at, + mid, + from_uid, + content_type, + unread = true, + } = payload; + const newMsg = { content, content_type, created_at, from_uid, unread }; + if (state[id]) { + let replaceMsg = state[id][mid]; + // 如果存在,并且新消息和缓存消息不一样,则替换掉,并且改为已读(可能有问题) + if (replaceMsg) { + const copyMsg = { ...replaceMsg }; + if (!isObjectEqual(copyMsg, newMsg)) { + state[id][mid] = { ...newMsg, unread: false }; + } + } else { + state[id][mid] = newMsg; + } + } else { + state[id] = { [mid]: newMsg }; + } +}; +export const msgSetRead = (state, payload) => { + const { id, mid } = payload; + console.log("set read", id, mid); + state[id][mid].unread = false; +}; +export const msgDelete = (state, payload) => { + const { id, mid } = payload; + console.log("delete message", id, mid); + if (state[id][mid]) { + // state[id][mid].removed = true; + delete state[id][mid]; + } +}; +export const msgClearUnread = (state, id) => { + console.log("set all unread", id); + Object.entries(state[id]).forEach(([, obj]) => { + obj.unread = false; + }); +}; +export const msgUpdate = (state, payload) => { + const { id, mid, content, time } = payload; + console.log("update channel message", id, mid); + if (state[id][mid]) { + state[id][mid].content = content; + state[id][mid].edited = time; + } +}; diff --git a/src/app/slices/message.user.js b/src/app/slices/message.user.js index b7911672..4c62db96 100644 --- a/src/app/slices/message.user.js +++ b/src/app/slices/message.user.js @@ -1,6 +1,11 @@ import { createSlice } from "@reduxjs/toolkit"; -import { isObjectEqual } from "../../common/utils"; - +import { + msgReaction, + msgAdd, + msgSetRead, + msgUpdate, + msgDelete, +} from "./message.handler"; const initialState = {}; const userMsgSlice = createSlice({ name: "userMessage", @@ -13,83 +18,19 @@ const userMsgSlice = createSlice({ return action.payload; }, addUserMsg(state, action) { - const { - id, - content, - content_type, - created_at, - mid, - from_uid, - unread = true, - } = action.payload; - const newMsg = { content, content_type, created_at, from_uid, unread }; - if (state[id]) { - let replaceMsg = state[id][mid]; - // 如果存在,并且新消息和缓存消息不一样,则替换掉 - if (replaceMsg) { - const copyMsg = { ...replaceMsg }; - if (!isObjectEqual(copyMsg, newMsg)) { - state[id][mid] = { ...newMsg, unread: false }; - } - } else { - state[id][mid] = newMsg; - } - } else { - state[id] = { [mid]: newMsg }; - } + msgAdd(state, action.payload); }, likeUserMsg(state, action) { - const { id, from_uid, mid, action: reaction } = action.payload; - console.log("user likes: likes", id, mid, from_uid, reaction); - if (state[id] && state[id][mid]) { - if (!state[id][mid].likes) { - console.log("user likes: initial "); - state[id][mid].likes = {}; - } - const currLikes = state[id][mid].likes; - // state[id][mid].likes = currLikes ? [...currLikes, reaction] : [reaction]; - if (currLikes[reaction]) { - if (currLikes[reaction].includes(from_uid)) { - const idx = currLikes[reaction].findIndex((id) => { - return id == from_uid; - }); - console.log("remove reaction", currLikes[reaction], idx, from_uid); - currLikes[reaction].splice(idx, 1); - } else { - currLikes[reaction].push(from_uid); - } - } else { - currLikes[reaction] = [from_uid]; - } - // state[id][mid].likes = currLikes; - } + msgReaction(state, action.payload); }, updateUserMsg(state, action) { - const { id, mid, content, time } = action.payload; - console.log("update user message", id, mid); - if (state[id][mid]) { - state[id][mid].content = content; - state[id][mid].edited = time; - } + msgUpdate(state, action.payload); }, deleteUserMsg(state, action) { - const { id, mid } = action.payload; - console.log("delete user message", id, mid); - if (state[id][mid]) { - // 添加removed标识 - // state[id][mid].removed = true; - delete state[id][mid]; - } + msgDelete(state, action.payload); }, setUserMsgRead(state, action) { - const { id, mid } = action.payload; - console.log("set unread", id, mid); - state[id][mid].unread = false; - }, - removeMsg(state, action) { - const { id, mid } = action.payload; - console.log("remove user msg", id, mid); - delete state[id][mid]; + msgSetRead(state, action.payload); }, }, }); @@ -101,6 +42,5 @@ export const { initUserMsg, addUserMsg, setUserMsgRead, - removeMsg, } = userMsgSlice.actions; export default userMsgSlice.reducer;