Skip to content

Commit 9ac12f9

Browse files
committed
test: mvvm userinfoadmintools and view
1 parent 9b8b82b commit 9ac12f9

File tree

5 files changed

+834
-491
lines changed

5 files changed

+834
-491
lines changed

src/components/viewmodels/right_panel/UserInfoAdminToolsContainerViewModel.tsx

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,19 @@ Please see LICENSE files in the repository root for full details.
55
*/
66

77
import { useContext } from "react";
8-
import { type Room, RoomMember, KnownMembership, IPowerLevelsContent } from "matrix-js-sdk/src/matrix";
8+
import { type Room, type RoomMember, KnownMembership, type IPowerLevelsContent } from "matrix-js-sdk/src/matrix";
9+
import { logger } from "matrix-js-sdk/src/logger";
910

1011
import ConfirmSpaceUserActionDialog from "../../views/dialogs/ConfirmSpaceUserActionDialog";
1112
import Modal from "../../../Modal";
12-
import { logger } from "matrix-js-sdk/src/logger";
1313
import MatrixClientContext from "../../../contexts/MatrixClientContext";
1414
import { _t } from "../../../languageHandler";
1515
import { bulkSpaceBehaviour } from "../../../utils/space";
1616
import ConfirmUserActionDialog from "../../views/dialogs/ConfirmUserActionDialog";
1717
import ErrorDialog from "../../views/dialogs/ErrorDialog";
1818
import BulkRedactDialog from "../../views/dialogs/BulkRedactDialog";
1919

20-
interface RoomAdminToolsProps {
20+
export interface RoomAdminToolsProps {
2121
room: Room;
2222
member: RoomMember;
2323
isUpdating: boolean;
@@ -40,8 +40,8 @@ interface RoomKickButtonState {
4040
* @param stopUpdating - a function to stop the operation
4141
* @returns the room kick button state
4242
*/
43-
export function useRoomKickButtonViewModel( props: RoomAdminToolsProps ): RoomKickButtonState {
44-
const {isUpdating, startUpdating, stopUpdating, room, member} = props;
43+
export function useRoomKickButtonViewModel(props: RoomAdminToolsProps): RoomKickButtonState {
44+
const { isUpdating, startUpdating, stopUpdating, room, member } = props;
4545

4646
const cli = useContext(MatrixClientContext);
4747

@@ -122,7 +122,7 @@ export function useRoomKickButtonViewModel( props: RoomAdminToolsProps ): RoomKi
122122
});
123123
};
124124

125-
const canUserBeKicked = member.membership !== KnownMembership.Invite && member.membership !== KnownMembership.Join;
125+
const canUserBeKicked = member.membership === KnownMembership.Invite || member.membership === KnownMembership.Join;
126126

127127
const kickLabel = room.isSpaceRoom()
128128
? member.membership === KnownMembership.Invite
@@ -139,7 +139,6 @@ export function useRoomKickButtonViewModel( props: RoomAdminToolsProps ): RoomKi
139139
};
140140
}
141141

142-
143142
export interface RedactMessagesButtonState {
144143
onRedactAllMessagesClick: () => void;
145144
}
@@ -149,7 +148,7 @@ export interface RedactMessagesButtonState {
149148
* @param member - the member to redact messages for
150149
* @returns the redact messages button state
151150
*/
152-
export const userRedactMessagesButtonViewModel = (member: RoomMember): RedactMessagesButtonState => {
151+
export const useRedactMessagesButtonViewModel = (member: RoomMember): RedactMessagesButtonState => {
153152
const cli = useContext(MatrixClientContext);
154153

155154
const onRedactAllMessagesClick = (): void => {
@@ -168,12 +167,12 @@ export const userRedactMessagesButtonViewModel = (member: RoomMember): RedactMes
168167
};
169168
};
170169

171-
export interface BanToggleButtonState {
170+
export interface BanButtonState {
172171
onBanOrUnbanClick: () => void;
173172
banLabel: string;
174173
}
175174

176-
export const userBanToggleButtonViewModel = (props: RoomAdminToolsProps): BanToggleButtonState => {
175+
export const useBanButtonViewModel = (props: RoomAdminToolsProps): BanButtonState => {
177176
const { isUpdating, startUpdating, stopUpdating, room, member } = props;
178177

179178
const cli = useContext(MatrixClientContext);
@@ -281,17 +280,17 @@ export const userBanToggleButtonViewModel = (props: RoomAdminToolsProps): BanTog
281280
stopUpdating();
282281
});
283282
};
284-
283+
285284
return {
286285
onBanOrUnbanClick,
287286
banLabel,
288287
};
289-
}
288+
};
290289

291290
interface MuteButtonState {
292291
isMemberInTheRoom: boolean;
293292
muteLabel: string;
294-
onMutebuttonClick: () => void;
293+
onMuteButtonClick: () => void;
295294
}
296295

297296
export const useMuteButtonViewModel = (props: RoomAdminToolsProps): MuteButtonState => {
@@ -320,7 +319,7 @@ export const useMuteButtonViewModel = (props: RoomAdminToolsProps): MuteButtonSt
320319

321320
const isMemberInTheRoom = member.membership !== KnownMembership.Join;
322321

323-
const onMutebuttonClick = async (): Promise<void> => {
322+
const onMuteButtonClick = async (): Promise<void> => {
324323
if (isUpdating) return; // only allow one operation at a time
325324
startUpdating();
326325

@@ -367,7 +366,7 @@ export const useMuteButtonViewModel = (props: RoomAdminToolsProps): MuteButtonSt
367366

368367
return {
369368
isMemberInTheRoom,
370-
onMutebuttonClick,
369+
onMuteButtonClick,
371370
muteLabel,
372371
};
373372
};
@@ -380,12 +379,12 @@ interface UserInfoAdminToolsContainerState {
380379
isCurrentUserInTheRoom: boolean;
381380
}
382381

383-
interface RoomAdminToolsContainerProps {
382+
export interface RoomAdminToolsContainerProps {
384383
room: Room;
385384
member: RoomMember;
386385
powerLevels: IPowerLevelsContent;
387386
children: React.ReactNode;
388-
};
387+
}
389388

390389
export const useUserInfoAdminToolsContainerViewModel = (
391390
props: RoomAdminToolsContainerProps,
@@ -409,7 +408,7 @@ export const useUserInfoAdminToolsContainerViewModel = (
409408
shouldShowMuteButton: false,
410409
shouldShowRedactButton: false,
411410
isCurrentUserInTheRoom: false,
412-
}
411+
};
413412
}
414413

415414
const isMe = me.userId === member.userId;
@@ -422,4 +421,4 @@ export const useUserInfoAdminToolsContainerViewModel = (
422421
shouldShowMuteButton: !isMe && canAffectUser && me.powerLevel >= Number(editPowerLevel) && !room.isSpaceRoom(),
423422
isCurrentUserInTheRoom,
424423
};
425-
};
424+
};

src/components/views/right_panel/user_info/UserInfoAdminToolsContainer.tsx

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,22 @@ Please see LICENSE files in the repository root for full details.
77

88
import React, { type JSX, type ReactNode } from "react";
99
import classNames from "classnames";
10-
import {
11-
RoomMember,
12-
type Room,
13-
} from "matrix-js-sdk/src/matrix";
10+
import { type RoomMember, type Room } from "matrix-js-sdk/src/matrix";
1411
import { MenuItem } from "@vector-im/compound-web";
1512
import CloseIcon from "@vector-im/compound-design-tokens/assets/web/icons/close";
1613
import ChatProblemIcon from "@vector-im/compound-design-tokens/assets/web/icons/chat-problem";
1714
import VisibilityOffIcon from "@vector-im/compound-design-tokens/assets/web/icons/visibility-off";
1815
import LeaveIcon from "@vector-im/compound-design-tokens/assets/web/icons/leave";
1916

2017
import { _t } from "../../../../languageHandler";
21-
import { IPowerLevelsContent } from "../UserInfo";
22-
import { useMuteButtonViewModel, userBanToggleButtonViewModel, useRoomKickButtonViewModel, userRedactMessagesButtonViewModel, useUserInfoAdminToolsContainerViewModel } from "../../../viewmodels/right_panel/UserInfoAdminToolsContainerViewModel";
23-
24-
18+
import { type IPowerLevelsContent } from "../UserInfo";
19+
import {
20+
useMuteButtonViewModel,
21+
useBanButtonViewModel,
22+
useRoomKickButtonViewModel,
23+
useRedactMessagesButtonViewModel,
24+
useUserInfoAdminToolsContainerViewModel,
25+
} from "../../../viewmodels/right_panel/UserInfoAdminToolsContainerViewModel";
2526

2627
const Container: React.FC<{
2728
children: ReactNode;
@@ -31,8 +32,6 @@ const Container: React.FC<{
3132
return <div className={classes}>{children}</div>;
3233
};
3334

34-
35-
3635
interface IBaseProps {
3736
member: RoomMember;
3837
isUpdating: boolean;
@@ -47,9 +46,9 @@ export const RoomKickButton = ({
4746
startUpdating,
4847
stopUpdating,
4948
}: Omit<IBaseRoomProps, "powerLevels">): JSX.Element | null => {
50-
const vm = useRoomKickButtonViewModel({room, member, isUpdating, startUpdating, stopUpdating});
49+
const vm = useRoomKickButtonViewModel({ room, member, isUpdating, startUpdating, stopUpdating });
5150
// check if user can be kicked/disinvited
52-
if (vm.canUserBeKicked) return <></>;
51+
if (!vm.canUserBeKicked) return <></>;
5352

5453
return (
5554
<MenuItem
@@ -67,7 +66,7 @@ export const RoomKickButton = ({
6766
};
6867

6968
const RedactMessagesButton: React.FC<IBaseProps> = ({ member }) => {
70-
const vm = userRedactMessagesButtonViewModel(member);
69+
const vm = useRedactMessagesButtonViewModel(member);
7170

7271
return (
7372
<MenuItem
@@ -90,8 +89,7 @@ export const BanToggleButton = ({
9089
startUpdating,
9190
stopUpdating,
9291
}: Omit<IBaseRoomProps, "powerLevels">): JSX.Element => {
93-
94-
const vm = userBanToggleButtonViewModel({room, member, isUpdating, startUpdating, stopUpdating});
92+
const vm = useBanButtonViewModel({ room, member, isUpdating, startUpdating, stopUpdating });
9593

9694
return (
9795
<MenuItem
@@ -114,7 +112,6 @@ interface IBaseRoomProps extends IBaseProps {
114112
children?: ReactNode;
115113
}
116114

117-
118115
// We do not show a Mute button for ourselves so it doesn't need to handle warning self demotion
119116
const MuteToggleButton: React.FC<IBaseRoomProps> = ({
120117
member,
@@ -124,7 +121,7 @@ const MuteToggleButton: React.FC<IBaseRoomProps> = ({
124121
startUpdating,
125122
stopUpdating,
126123
}) => {
127-
const vm = useMuteButtonViewModel({room, member, isUpdating, startUpdating, stopUpdating});
124+
const vm = useMuteButtonViewModel({ room, member, isUpdating, startUpdating, stopUpdating });
128125

129126
// Don't show the mute/unmute option if the user is not in the room
130127
if (!vm.isMemberInTheRoom) return null;
@@ -134,7 +131,7 @@ const MuteToggleButton: React.FC<IBaseRoomProps> = ({
134131
role="button"
135132
onSelect={async (ev) => {
136133
ev.preventDefault();
137-
vm.onMutebuttonClick();
134+
vm.onMuteButtonClick();
138135
}}
139136
disabled={isUpdating}
140137
label={vm.muteLabel}
@@ -160,10 +157,10 @@ export const UserInfoAdminToolsContainer: React.FC<IBaseRoomProps> = ({
160157

161158
const vm = useUserInfoAdminToolsContainerViewModel({ room, member, powerLevels, children });
162159

163-
if (!vm.isCurrentUserInTheRoom) {
164-
// we aren't in the room, so return no admin tooling
165-
return <div />;
166-
}
160+
if (!vm.isCurrentUserInTheRoom) {
161+
// we aren't in the room, so return no admin tooling
162+
return <div />;
163+
}
167164

168165
if (vm.shouldShowKickButton) {
169166
kickButton = (

0 commit comments

Comments
 (0)