More robust RHS handling of websocket events (#3648)
* More robust RHS handling of websocket events * Fixing tests
This commit is contained in:
parent
1e2e3fb055
commit
2f29266767
4 changed files with 37 additions and 7 deletions
|
@ -37,6 +37,11 @@ describe('components/rhsChannelBoards', () => {
|
||||||
current: team,
|
current: team,
|
||||||
currentId: team.id,
|
currentId: team.id,
|
||||||
},
|
},
|
||||||
|
users: {
|
||||||
|
me: {
|
||||||
|
id: 'user-id',
|
||||||
|
},
|
||||||
|
},
|
||||||
language: {
|
language: {
|
||||||
value: 'en',
|
value: 'en',
|
||||||
},
|
},
|
||||||
|
|
|
@ -10,9 +10,17 @@ import {useWebsockets} from '../../../../webapp/src/hooks/websockets'
|
||||||
|
|
||||||
import {Board, BoardMember} from '../../../../webapp/src/blocks/board'
|
import {Board, BoardMember} from '../../../../webapp/src/blocks/board'
|
||||||
import {getCurrentTeamId} from '../../../../webapp/src/store/teams'
|
import {getCurrentTeamId} from '../../../../webapp/src/store/teams'
|
||||||
|
import {IUser} from '../../../../webapp/src/user'
|
||||||
|
import {getMe, fetchMe} from '../../../../webapp/src/store/users'
|
||||||
import {loadBoards} from '../../../../webapp/src/store/initialLoad'
|
import {loadBoards} from '../../../../webapp/src/store/initialLoad'
|
||||||
import {getCurrentChannel} from '../../../../webapp/src/store/channels'
|
import {getCurrentChannel} from '../../../../webapp/src/store/channels'
|
||||||
import {getMySortedBoards, setLinkToChannel, updateBoards, updateMembers} from '../../../../webapp/src/store/boards'
|
import {
|
||||||
|
getMySortedBoards,
|
||||||
|
setLinkToChannel,
|
||||||
|
updateBoards,
|
||||||
|
updateMembersEnsuringBoardsAndUsers,
|
||||||
|
addMyBoardMemberships,
|
||||||
|
} from '../../../../webapp/src/store/boards'
|
||||||
import {useAppSelector, useAppDispatch} from '../../../../webapp/src/store/hooks'
|
import {useAppSelector, useAppDispatch} from '../../../../webapp/src/store/hooks'
|
||||||
import AddIcon from '../../../../webapp/src/widgets/icons/add'
|
import AddIcon from '../../../../webapp/src/widgets/icons/add'
|
||||||
import Button from '../../../../webapp/src/widgets/buttons/button'
|
import Button from '../../../../webapp/src/widgets/buttons/button'
|
||||||
|
@ -29,11 +37,13 @@ const RHSChannelBoards = () => {
|
||||||
const boards = useAppSelector(getMySortedBoards)
|
const boards = useAppSelector(getMySortedBoards)
|
||||||
const teamId = useAppSelector(getCurrentTeamId)
|
const teamId = useAppSelector(getCurrentTeamId)
|
||||||
const currentChannel = useAppSelector(getCurrentChannel)
|
const currentChannel = useAppSelector(getCurrentChannel)
|
||||||
|
const me = useAppSelector<IUser|null>(getMe)
|
||||||
const dispatch = useAppDispatch()
|
const dispatch = useAppDispatch()
|
||||||
const intl = useIntl()
|
const intl = useIntl()
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
dispatch(loadBoards())
|
dispatch(loadBoards())
|
||||||
|
dispatch(fetchMe())
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
useWebsockets(teamId || '', (wsClient: WSClient) => {
|
useWebsockets(teamId || '', (wsClient: WSClient) => {
|
||||||
|
@ -41,7 +51,12 @@ const RHSChannelBoards = () => {
|
||||||
dispatch(updateBoards(boards))
|
dispatch(updateBoards(boards))
|
||||||
}
|
}
|
||||||
const onChangeMemberHandler = (_: WSClient, members: BoardMember[]): void => {
|
const onChangeMemberHandler = (_: WSClient, members: BoardMember[]): void => {
|
||||||
dispatch(updateMembers(members))
|
dispatch(updateMembersEnsuringBoardsAndUsers(members))
|
||||||
|
|
||||||
|
if (me) {
|
||||||
|
const myBoardMemberships = members.filter((boardMember) => boardMember.userId === me.id)
|
||||||
|
dispatch(addMyBoardMemberships(myBoardMemberships))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
wsClient.addOnChange(onChangeBoardHandler, 'board')
|
wsClient.addOnChange(onChangeBoardHandler, 'board')
|
||||||
|
@ -51,7 +66,7 @@ const RHSChannelBoards = () => {
|
||||||
wsClient.removeOnChange(onChangeBoardHandler, 'board')
|
wsClient.removeOnChange(onChangeBoardHandler, 'board')
|
||||||
wsClient.removeOnChange(onChangeMemberHandler, 'boardMembers')
|
wsClient.removeOnChange(onChangeMemberHandler, 'boardMembers')
|
||||||
}
|
}
|
||||||
}, [])
|
}, [me])
|
||||||
|
|
||||||
if (!boards) {
|
if (!boards) {
|
||||||
return null
|
return null
|
||||||
|
|
|
@ -575,7 +575,7 @@ func (pa *PluginAdapter) BroadcastMemberChange(teamID, boardID string, member *m
|
||||||
Member: member,
|
Member: member,
|
||||||
}
|
}
|
||||||
|
|
||||||
pa.sendBoardMessage(teamID, boardID, utils.StructToMap(message))
|
pa.sendBoardMessage(teamID, boardID, utils.StructToMap(message), member.UserID)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (pa *PluginAdapter) BroadcastMemberDelete(teamID, boardID, userID string) {
|
func (pa *PluginAdapter) BroadcastMemberDelete(teamID, boardID, userID string) {
|
||||||
|
|
|
@ -107,7 +107,11 @@ export const updateMembersHandler = (state: BoardsState, action: PayloadAction<B
|
||||||
|
|
||||||
for (const member of action.payload) {
|
for (const member of action.payload) {
|
||||||
if (state.myBoardMemberships[member.boardId] && state.myBoardMemberships[member.boardId].userId === member.userId) {
|
if (state.myBoardMemberships[member.boardId] && state.myBoardMemberships[member.boardId].userId === member.userId) {
|
||||||
state.myBoardMemberships[member.boardId] = member
|
if (!member.schemeAdmin && !member.schemeEditor && !member.schemeViewer && !member.schemeCommenter) {
|
||||||
|
delete state.myBoardMemberships[member.boardId]
|
||||||
|
} else {
|
||||||
|
state.myBoardMemberships[member.boardId] = member
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -136,8 +140,14 @@ const boardsSlice = createSlice({
|
||||||
},
|
},
|
||||||
updateMembers: updateMembersHandler,
|
updateMembers: updateMembersHandler,
|
||||||
addMyBoardMemberships: (state, action: PayloadAction<BoardMember[]>) => {
|
addMyBoardMemberships: (state, action: PayloadAction<BoardMember[]>) => {
|
||||||
action.payload.forEach((boardMember) => state.myBoardMemberships[boardMember.boardId] = boardMember)
|
action.payload.forEach((member) => {
|
||||||
}
|
if (!member.schemeAdmin && !member.schemeEditor && !member.schemeViewer && !member.schemeCommenter) {
|
||||||
|
delete state.myBoardMemberships[member.boardId]
|
||||||
|
} else {
|
||||||
|
state.myBoardMemberships[member.boardId] = member
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
extraReducers: (builder) => {
|
extraReducers: (builder) => {
|
||||||
|
|
Loading…
Reference in a new issue