From 4fce074ef21d672dc9594d450e000fdf77aae983 Mon Sep 17 00:00:00 2001 From: zerosoul Date: Sat, 2 Apr 2022 23:29:34 +0800 Subject: [PATCH] fix: add and remove member from channel --- src/app/slices/channels.js | 32 +++++++++++++++++++++++++-- src/common/hook/useStreaming/index.js | 32 +++++++++++++-------------- 2 files changed, 45 insertions(+), 19 deletions(-) diff --git a/src/app/slices/channels.js b/src/app/slices/channels.js index 8490c549..391dc88a 100644 --- a/src/app/slices/channels.js +++ b/src/app/slices/channels.js @@ -30,8 +30,36 @@ const channelsSlice = createSlice({ }, updateChannel(state, action) { // console.log("set channels store", action); - const { id, ...rest } = action.payload; - state.byId[id] = { ...state.byId[id], ...rest }; + const { id, operation, members, ...rest } = action.payload; + switch (operation) { + case "remove_member": + { + const filtered = state.byId[id].members.filter( + (id) => members.findIndex((uid) => uid == id) == -1 + ); + console.log( + "remove member from channel", + filtered, + members, + state.byId[id].members + ); + state.byId[id].members = filtered; + } + break; + case "add_member": + { + const currs = state.byId[id].members; + const _set = new Set([...currs, ...members]); + console.log("add member to channel", [..._set]); + state.byId[id].members = [..._set]; + } + + break; + + default: + state.byId[id] = { ...state.byId[id], members, ...rest }; + break; + } }, removeChannel(state, action) { const gid = action.payload; diff --git a/src/common/hook/useStreaming/index.js b/src/common/hook/useStreaming/index.js index 18b23a69..908d648e 100644 --- a/src/common/hook/useStreaming/index.js +++ b/src/common/hook/useStreaming/index.js @@ -49,7 +49,6 @@ export default function useStreaming() { const [readyPullData, setReadyPullData] = useState(false); const { authData: { uid: loginUid }, - channels: { byId: channelData }, ui: { ready, online }, footprint: { afterMid, usersVersion, readUsers, readChannels }, } = useSelector((store) => store); @@ -192,28 +191,27 @@ export default function useStreaming() { dispatch(addChannel(data.group)); break; case "user_joined_group": - console.log("new user joined group", data.gid); - // 去重 - dispatch( - updateChannel({ - id: data.gid, - members: [ - ...channelData[data.gid].members, - ...data.uid, - ].filter((v, i, a) => a.indexOf(v) === i), - }) - ); + { + console.log("new user joined group", data.gid); + const { gid, uid: uids } = data; + // 去重 + dispatch( + updateChannel({ + operation: "add_member", + id: gid, + members: uids, + }) + ); + } break; case "user_leaved_group": { const { gid, uid: uids } = data; - const leftMembers = channelData[gid].members.filter( - (id) => uids.findIndex((uid) => id == uid) == -1 - ); dispatch( updateChannel({ - id: data.gid, - members: [...leftMembers], + operation: "remove_member", + id: gid, + members: uids, }) ); }