Skip to content

Commit

Permalink
BC-8954 - remove room member directly (#3547)
Browse files Browse the repository at this point in the history
Removing a single room member by using the corresponding button in the three dot menu of the "actions"-column of the room members page does not work.

---------

Co-authored-by: Murat Merdoglu <[email protected]>
  • Loading branch information
hoeppner-dataport and muratmerdoglu-dp authored Feb 11, 2025
1 parent ba23b01 commit 997c7ff
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 18 deletions.
28 changes: 20 additions & 8 deletions src/modules/data/room/roomMembers/roomMembers.composable.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ export const useRoomMembers = (roomId: string) => {
};
});
isLoading.value = false;
} catch (error) {
} catch {
showFailure(t("pages.rooms.members.error.load"));
isLoading.value = false;
}
Expand Down Expand Up @@ -96,7 +96,7 @@ export const useRoomMembers = (roomId: string) => {
!roomMembers.value.some((member) => member.userId === user.id)
);
});
} catch (error) {
} catch {
showFailure(t("pages.rooms.members.error.load"));
}
};
Expand Down Expand Up @@ -132,25 +132,36 @@ export const useRoomMembers = (roomId: string) => {
displaySchoolRole: schoolRole[member.schoolRoleName],
}))
);
} catch (error) {
} catch {
showFailure(t("pages.rooms.members.error.add"));
}
};

const removeMembers = async () => {
const removeMembers = async (userIds: string[]) => {
try {
await roomApi.roomControllerRemoveMembers(roomId, {
userIds: selectedIds.value,
userIds,
});
roomMembers.value = roomMembers.value.filter(
(member) => !selectedIds.value.includes(member.userId)
(member) => !userIds.includes(member.userId)
);
selectedIds.value = [];
} catch (error) {
} catch {
showFailure(t("pages.rooms.members.error.remove"));
}
};

const leaveRoom = async () => {
isLoading.value = true;
try {
await roomApi.roomControllerLeaveRoom(roomId);
} catch {
showFailure(t("pages.rooms.members.error.remove"));
} finally {
isLoading.value = false;
}
};

const updateMembersRole = async (
roleName: ChangeRoomRoleBodyParamsRoleNameEnum,
id?: string
Expand All @@ -177,7 +188,7 @@ export const useRoomMembers = (roomId: string) => {
member.displayRoomRole = roomRole[roleName];
}
});
} catch (error) {
} catch {
showFailure(t("pages.rooms.members.error.updateRole"));
}
};
Expand All @@ -187,6 +198,7 @@ export const useRoomMembers = (roomId: string) => {
fetchMembers,
getPotentialMembers,
getSchools,
leaveRoom,
removeMembers,
updateMembersRole,
currentUser,
Expand Down
36 changes: 30 additions & 6 deletions src/modules/data/room/roomMembers/roomMembers.composable.unit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -303,8 +303,7 @@ describe("useRoomMembers", () => {

describe("removeMembers", () => {
it("should remove a members from the room", async () => {
const { removeMembers, roomMembers, selectedIds } =
useRoomMembers(roomId);
const { removeMembers, roomMembers } = useRoomMembers(roomId);

roomApiMock.roomControllerRemoveMembers.mockResolvedValue(
mockApiResponse({})
Expand All @@ -313,9 +312,7 @@ describe("useRoomMembers", () => {
const membersMock = roomMemberFactory(RoleName.Roomeditor).buildList(3);
roomMembers.value = membersMock;

selectedIds.value = [membersMock[1].userId];

await removeMembers();
await removeMembers([membersMock[1].userId]);

expect(roomApiMock.roomControllerRemoveMembers).toHaveBeenCalledWith(
roomId,
Expand All @@ -333,7 +330,34 @@ describe("useRoomMembers", () => {
const error = new Error("Test error");
roomApiMock.roomControllerRemoveMembers.mockRejectedValue(error);

await removeMembers();
await removeMembers(["id"]);

expect(mockedBoardNotifierCalls.showFailure).toHaveBeenCalledWith(
"pages.rooms.members.error.remove"
);
});
});

describe("leaveRoom", () => {
it("should call the leaveRoom api", async () => {
const { leaveRoom } = useRoomMembers(roomId);

roomApiMock.roomControllerLeaveRoom.mockResolvedValue(
mockApiResponse({})
);

await leaveRoom();

expect(roomApiMock.roomControllerLeaveRoom).toHaveBeenCalledWith(roomId);
});

it("should throw an error if the API call fails", async () => {
const { leaveRoom } = useRoomMembers(roomId);

const error = new Error("Test error");
roomApiMock.roomControllerLeaveRoom.mockRejectedValue(error);

await leaveRoom();

expect(mockedBoardNotifierCalls.showFailure).toHaveBeenCalledWith(
"pages.rooms.members.error.remove"
Expand Down
2 changes: 1 addition & 1 deletion src/modules/page/room/RoomMembers.page.unit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,7 @@ describe("RoomMembersPage", () => {
);
await leaveMenu.trigger("click");

expect(mockRoomMemberCalls.removeMembers).toHaveBeenCalled();
expect(mockRoomMemberCalls.leaveRoom).toHaveBeenCalled();
});

it("should not call remove method when dialog is cancelled", async () => {
Expand Down
7 changes: 4 additions & 3 deletions src/modules/page/room/RoomMembers.page.vue
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ const {
fetchMembers,
getPotentialMembers,
getSchools,
leaveRoom,
removeMembers,
updateMembersRole,
} = useRoomMembers(roomId);
Expand Down Expand Up @@ -179,8 +180,8 @@ const onUpdateRoleOrSchool = async (payload: {
await getPotentialMembers(payload.schoolRole, payload.schoolId);
};
const onRemoveMembers = async () => {
await removeMembers();
const onRemoveMembers = async (userIds: string[]) => {
await removeMembers(userIds);
};
const onLeaveRoom = async () => {
Expand All @@ -192,7 +193,7 @@ const onLeaveRoom = async () => {
});
if (!shouldLeave) return;
await removeMembers();
await leaveRoom();
router.push("/rooms");
};
Expand Down

0 comments on commit 997c7ff

Please sign in to comment.