Introduce Membership type

This commit is contained in:
Stanislav Demydiuk 2024-03-11 17:16:53 +00:00 committed by Andy Balaam
parent 3c6fd58628
commit da99bad7b9
115 changed files with 582 additions and 526 deletions

View file

@ -144,7 +144,7 @@ const RoomContextMenu: React.FC<IProps> = ({ room, onFinished, ...props }) => {
let favouriteOption: JSX.Element | undefined;
let lowPriorityOption: JSX.Element | undefined;
let notificationOption: JSX.Element | undefined;
if (room.getMyMembership() === "join") {
if (room.getMyMembership() === Membership.Join) {
const isFavorite = roomTags.includes(DefaultTagID.Favourite);
favouriteOption = (
<IconizedContextMenuCheckbox

View file

@ -140,7 +140,7 @@ export const AddExistingToSpace: React.FC<IAddExistingToSpaceProps> = ({
const msc3946ProcessDynamicPredecessor = useSettingValue<boolean>("feature_dynamic_room_predecessors");
const visibleRooms = useMemo(
() =>
cli?.getVisibleRooms(msc3946ProcessDynamicPredecessor).filter((r) => r.getMyMembership() === "join") ?? [],
cli?.getVisibleRooms(msc3946ProcessDynamicPredecessor).filter((r) => r.getMyMembership() === Membership.Join) ?? [],
[cli, msc3946ProcessDynamicPredecessor],
);

View file

@ -267,7 +267,7 @@ const ForwardDialog: React.FC<IProps> = ({ matrixClient: cli, event, permalinkCr
sortRooms(
cli
.getVisibleRooms(msc3946DynamicRoomPredecessors)
.filter((room) => room.getMyMembership() === "join" && !room.isSpaceRoom()),
.filter((room) => room.getMyMembership() === Membership.Join && !room.isSpaceRoom()),
),
[cli, msc3946DynamicRoomPredecessors],
);

View file

@ -372,10 +372,10 @@ export default class InviteDialog extends React.PureComponent<Props, IInviteDial
const room = MatrixClientPeg.safeGet().getRoom(props.roomId);
const isFederated = room?.currentState.getStateEvents(EventType.RoomCreate, "")?.getContent()["m.federate"];
if (!room) throw new Error("Room ID given to InviteDialog does not look like a room");
room.getMembersWithMembership("invite").forEach((m) => excludedIds.add(m.userId));
room.getMembersWithMembership("join").forEach((m) => excludedIds.add(m.userId));
room.getMembersWithMembership(Membership.Invite).forEach((m) => excludedIds.add(m.userId));
room.getMembersWithMembership(Membership.Join).forEach((m) => excludedIds.add(m.userId));
// add banned users, so we don't try to invite them
room.getMembersWithMembership("ban").forEach((m) => excludedIds.add(m.userId));
room.getMembersWithMembership(Membership.Ban).forEach((m) => excludedIds.add(m.userId));
if (isFederated === false) {
// exclude users from external servers
const homeserver = props.roomId.split(":")[1];

View file

@ -102,7 +102,7 @@ const ManageRestrictedJoinRuleDialog: React.FC<IProps> = ({ room, selected = [],
if (!room) {
return { roomId, name: roomId } as Room;
}
if (room.getMyMembership() !== "join" || !room.isSpaceRoom()) {
if (room.getMyMembership() !== Membership.Join || !room.isSpaceRoom()) {
return room;
}
}),

View file

@ -27,7 +27,7 @@ const ServersInRoom: React.FC<IDevtoolsProps> = ({ onBack }) => {
const servers = useMemo<Record<string, number>>(() => {
const servers: Record<string, number> = {};
context.room.currentState.getStateEvents(EventType.RoomMember).forEach((ev) => {
if (ev.getContent().membership !== "join") return; // only count joined users
if (ev.getContent().membership !== Membership.Join) return; // only count joined users
const server = ev.getSender()!.split(":")[1];
servers[server] = (servers[server] ?? 0) + 1;
});

View file

@ -244,7 +244,7 @@ const findVisibleRooms = (cli: MatrixClient, msc3946ProcessDynamicPredecessor: b
if (isLocalRoom(room)) return false;
// TODO we may want to put invites in their own list
return room.getMyMembership() === "join" || room.getMyMembership() == "invite";
return room.getMyMembership() === Membership.Join || room.getMyMembership() == Membership.Invite;
});
};
@ -675,7 +675,7 @@ const SpotlightDialog: React.FC<IProps> = ({ initialText = "", initialFilter = n
// world readable, a modal will appear asking you to register first. If
// it is readable, the preview appears as normal.
const showViewButton =
clientRoom?.getMyMembership() === "join" ||
clientRoom?.getMyMembership() === Membership.Join ||
(result.publicRoom.world_readable && !canAskToJoin(joinRule)) ||
cli.isGuest();

View file

@ -219,7 +219,10 @@ export default class AppTile extends React.Component<IProps, IState> {
}
private onMyMembership = (room: Room, membership: string): void => {
if ((membership === "leave" || membership === "ban") && room.roomId === this.props.room?.roomId) {
if (
(membership === Membership.Leave || membership === Membership.Ban) &&
room.roomId === this.props.room?.roomId
) {
this.onUserLeftRoom();
}
};

View file

@ -416,12 +416,12 @@ export default class EventListSummary extends React.Component<
case EventType.RoomMember:
switch (e.mxEvent.getContent().membership) {
case "invite":
case Membership.Invite:
return TransitionType.Invited;
case "ban":
case Membership.Ban:
return TransitionType.Banned;
case "join":
if (e.mxEvent.getPrevContent().membership === "join") {
case Membership.Join:
if (e.mxEvent.getPrevContent().membership === Membership.Join) {
if (e.mxEvent.getContent().displayname !== e.mxEvent.getPrevContent().displayname) {
return TransitionType.ChangedName;
} else if (e.mxEvent.getContent().avatar_url !== e.mxEvent.getPrevContent().avatar_url) {
@ -431,17 +431,17 @@ export default class EventListSummary extends React.Component<
} else {
return TransitionType.Joined;
}
case "leave":
case Membership.Leave:
if (e.mxEvent.getSender() === e.mxEvent.getStateKey()) {
if (e.mxEvent.getPrevContent().membership === "invite") {
if (e.mxEvent.getPrevContent().membership === Membership.Invite) {
return TransitionType.InviteReject;
}
return TransitionType.Left;
}
switch (e.mxEvent.getPrevContent().membership) {
case "invite":
case Membership.Invite:
return TransitionType.InviteWithdrawal;
case "ban":
case Membership.Ban:
return TransitionType.Unbanned;
// sender is not target and made the target leave, if not from invite/ban then this is a kick
default:

View file

@ -38,7 +38,7 @@ interface IProps extends HTMLAttributes<HTMLSpanElement> {
const RoomFacePile: FC<IProps> = ({ room, onlyKnownUsers = true, numShown = DEFAULT_NUM_FACES, ...props }) => {
const cli = useContext(MatrixClientContext);
const isJoined = room.getMyMembership() === "join";
const isJoined = room.getMyMembership() === Membership.Join;
let members = useRoomMembers(room);
const count = members.length;

View file

@ -217,7 +217,7 @@ export default class TimelineCard extends React.Component<IProps, IState> {
const isUploading = ContentMessages.sharedInstance().getCurrentUploads(this.props.composerRelation).length > 0;
const myMembership = this.props.room.getMyMembership();
const showComposer = myMembership === "join";
const showComposer = myMembership === Membership.Join;
return (
<RoomContext.Provider

View file

@ -473,7 +473,7 @@ export const UserOptionsSection: React.FC<{
if (
member instanceof RoomMember &&
canInvite &&
(member?.membership ?? "leave") === "leave" &&
(member?.membership ?? Membership.Leave) === Membership.Leave &&
shouldShowComponent(UIComponent.InviteUsers)
) {
const roomId = member && member.roomId ? member.roomId : SdkContextClass.instance.roomViewStore.getRoomId();
@ -638,7 +638,7 @@ export const RoomKickButton = ({
const cli = useContext(MatrixClientContext);
// check if user can be kicked/disinvited
if (member.membership !== "invite" && member.membership !== "join") return <></>;
if (member.membership !== Membership.Invite && member.membership !== Membership.Join) return <></>;
const onKick = async (): Promise<void> => {
if (isUpdating) return; // only allow one operation at a time
@ -647,17 +647,17 @@ export const RoomKickButton = ({
const commonProps = {
member,
action: room.isSpaceRoom()
? member.membership === "invite"
? member.membership === Membership.Invite
? _t("user_info|disinvite_button_space")
: _t("user_info|kick_button_space")
: member.membership === "invite"
: member.membership === Membership.Invite
? _t("user_info|disinvite_button_room")
: _t("user_info|kick_button_room"),
title:
member.membership === "invite"
member.membership === Membership.Invite
? _t("user_info|disinvite_button_room_name", { roomName: room.name })
: _t("user_info|kick_button_room_name", { roomName: room.name }),
askReason: member.membership === "join",
askReason: member.membership === Membership.Join,
danger: true,
};
@ -718,10 +718,10 @@ export const RoomKickButton = ({
};
const kickLabel = room.isSpaceRoom()
? member.membership === "invite"
? member.membership === Membership.Invite
? _t("user_info|disinvite_button_space")
: _t("user_info|kick_button_space")
: member.membership === "invite"
: member.membership === Membership.Invite
? _t("user_info|disinvite_button_room")
: _t("user_info|kick_button_room");
@ -771,7 +771,7 @@ export const BanToggleButton = ({
}: Omit<IBaseRoomProps, "powerLevels">): JSX.Element => {
const cli = useContext(MatrixClientContext);
const isBanned = member.membership === "ban";
const isBanned = member.membership === Membership.Ban;
const onBanOrUnban = async (): Promise<void> => {
if (isUpdating) return; // only allow one operation at a time
startUpdating();
@ -808,9 +808,9 @@ export const BanToggleButton = ({
return (
!!myMember &&
!!theirMember &&
theirMember.membership === "ban" &&
theirMember.membership === Membership.Ban &&
myMember.powerLevel > theirMember.powerLevel &&
child.currentState.hasSufficientPowerLevelFor("ban", myMember.powerLevel)
child.currentState.hasSufficientPowerLevelFor(Membership.Ban, myMember.powerLevel)
);
}
: (child: Room) => {
@ -820,9 +820,9 @@ export const BanToggleButton = ({
return (
!!myMember &&
!!theirMember &&
theirMember.membership !== "ban" &&
theirMember.membership !== Membership.Ban &&
myMember.powerLevel > theirMember.powerLevel &&
child.currentState.hasSufficientPowerLevelFor("ban", myMember.powerLevel)
child.currentState.hasSufficientPowerLevelFor(Membership.Ban, myMember.powerLevel)
);
},
allLabel: isBanned ? _t("user_info|unban_space_everything") : _t("user_info|ban_space_everything"),
@ -903,7 +903,7 @@ const MuteToggleButton: React.FC<IBaseRoomProps> = ({
const cli = useContext(MatrixClientContext);
// Don't show the mute/unmute option if the user is not in the room
if (member.membership !== "join") return null;
if (member.membership !== Membership.Join) return null;
const muted = isMuted(member, powerLevels);
const onMuteToggle = async (): Promise<void> => {

View file

@ -171,7 +171,7 @@ export default class MemberList extends React.Component<IProps, IState> {
};
private onMyMembership = (room: Room, membership: string, oldMembership?: string): void => {
if (room.roomId === this.props.roomId && membership === "join" && oldMembership !== "join") {
if (room.roomId === this.props.roomId && membership === Membership.Join && oldMembership !== Membership.Join) {
// we just joined the room, load the member list
this.updateListNow(true);
}
@ -363,7 +363,7 @@ export default class MemberList extends React.Component<IProps, IState> {
const room = cli.getRoom(this.props.roomId);
let inviteButton: JSX.Element | undefined;
if (room?.getMyMembership() === "join" && shouldShowComponent(UIComponent.InviteUsers)) {
if (room?.getMyMembership() === Membership.Join && shouldShowComponent(UIComponent.InviteUsers)) {
const inviteButtonText = room.isSpaceRoom() ? _t("space|invite_this_space") : _t("room|invite_this_room");
const button = (

View file

@ -112,7 +112,7 @@ const NewRoomIntro: React.FC = () => {
</React.Fragment>
);
} else {
const inRoom = room && room.getMyMembership() === "join";
const inRoom = room && room.getMyMembership() === Membership.Join;
const topic = room.currentState.getStateEvents(EventType.RoomTopic, "")?.getContent()?.topic;
const canAddTopic = inRoom && room.currentState.maySendStateEvent(EventType.RoomTopic, cli.getSafeUserId());

View file

@ -33,7 +33,7 @@ interface IProps {
const RoomInfoLine: FC<IProps> = ({ room }) => {
// summary will begin as undefined whilst loading and go null if it fails to load or we are not invited.
const summary = useAsyncMemo(async (): Promise<Awaited<ReturnType<MatrixClient["getRoomSummary"]>> | null> => {
if (room.getMyMembership() !== "invite") return null;
if (room.getMyMembership() !== Membership.Invite) return null;
try {
return await room.client.getRoomSummary(room.roomId);
} catch (e) {
@ -61,7 +61,7 @@ const RoomInfoLine: FC<IProps> = ({ room }) => {
}
let members: JSX.Element | undefined;
if (membership === "invite" && summary) {
if (membership === Membership.Invite && summary) {
// Don't trust local state and instead use the summary API
members = (
<span className="mx_RoomInfoLine_members">

View file

@ -35,7 +35,7 @@ export const RoomKnocksBar: VFC<{ room: Room }> = ({ room }) => {
const knockMembers = useTypedEventEmitterState(
room,
RoomStateEvent.Update,
useCallback(() => room.getMembersWithMembership("knock"), [room]),
useCallback(() => room.getMembersWithMembership(Membership.Knock), [room]),
);
const knockMembersCount = knockMembers.length;

View file

@ -192,13 +192,13 @@ export default class RoomPreviewBar extends React.Component<IProps, IState> {
if (myMember) {
const previousMembership = myMember.events.member?.getPrevContent().membership;
if (myMember.isKicked()) {
if (previousMembership === "knock") {
if (previousMembership === Membership.Knock) {
return MessageCase.RequestDenied;
} else if (this.props.promptAskToJoin) {
return MessageCase.PromptAskToJoin;
}
return MessageCase.Kicked;
} else if (myMember.membership === "ban") {
} else if (myMember.membership === Membership.Ban) {
return MessageCase.Banned;
}
}
@ -284,7 +284,7 @@ export default class RoomPreviewBar extends React.Component<IProps, IState> {
return false;
}
const memberContent = myMember.events.member?.getContent();
return memberContent?.membership === "invite" && memberContent.is_direct;
return memberContent?.membership === Membership.Invite && memberContent.is_direct;
}
private makeScreenAfterLogin(): { screen: string; params: Record<string, any> } {

View file

@ -73,7 +73,7 @@ const RoomPreviewCard: FC<IProps> = ({ room, onJoinButtonClicked, onRejectButton
let inviterSection: JSX.Element | null = null;
let joinButtons: JSX.Element;
if (myMembership === "join") {
if (myMembership === Membership.Join) {
joinButtons = (
<AccessibleButton
kind="danger_outline"
@ -87,7 +87,7 @@ const RoomPreviewCard: FC<IProps> = ({ room, onJoinButtonClicked, onRejectButton
{_t("action|leave")}
</AccessibleButton>
);
} else if (myMembership === "invite") {
} else if (myMembership === Membership.Invite) {
const inviteSender = room.getMember(cli.getUserId()!)?.events.member?.getSender();
if (inviteSender) {
@ -178,7 +178,7 @@ const RoomPreviewCard: FC<IProps> = ({ room, onJoinButtonClicked, onRejectButton
});
} else if (isVideoRoom && !videoRoomsEnabled) {
notice =
myMembership === "join"
myMembership === Membership.Join
? _t("room|view_failed_enable_video_rooms")
: _t("room|join_failed_enable_video_rooms");

View file

@ -124,7 +124,7 @@ export class RoomTile extends React.PureComponent<ClassProps, State> {
private get showContextMenu(): boolean {
return (
this.props.tag !== DefaultTagID.Invite &&
this.props.room.getMyMembership() !== "knock" &&
this.props.room.getMyMembership() !== Membership.Knock &&
!isKnockDenied(this.props.room) &&
shouldShowComponent(UIComponent.RoomOptionsMenu)
);
@ -387,7 +387,7 @@ export class RoomTile extends React.PureComponent<ClassProps, State> {
mx_RoomTile: true,
mx_RoomTile_sticky:
SettingsStore.getValue("feature_ask_to_join") &&
(this.props.room.getMyMembership() === "knock" || isKnockDenied(this.props.room)),
(this.props.room.getMyMembership() === Membership.Knock || isKnockDenied(this.props.room)),
mx_RoomTile_selected: this.state.selected,
mx_RoomTile_hasMenuOpen: !!(this.state.generalMenuPosition || this.state.notificationsMenuPosition),
mx_RoomTile_minimized: this.props.isMinimized,

View file

@ -73,7 +73,7 @@ export default class GeneralRoomSettingsTab extends React.Component<IProps, ISta
) : null;
let leaveSection;
if (room.getMyMembership() === "join") {
if (room.getMyMembership() === Membership.Join) {
leaveSection = (
<SettingsSubsection heading={_t("action|leave_room")}>
<AccessibleButton kind="danger" onClick={this.onLeaveClick}>

View file

@ -145,7 +145,7 @@ export const PeopleRoomSettingsTab: VFC<{ room: Room }> = ({ room }) => {
const knockMembers = useTypedEventEmitterState(
room,
RoomStateEvent.Update,
useCallback(() => room.getMembersWithMembership("knock"), [room]),
useCallback(() => room.getMembersWithMembership(Membership.Knock), [room]),
);
return (

View file

@ -413,7 +413,7 @@ export default class RolesRoomSettingsTab extends React.Component<IProps> {
}
}
const banned = room.getMembersWithMembership("ban");
const banned = room.getMembersWithMembership(Membership.Ban);
let bannedUsersSection: JSX.Element | undefined;
if (banned?.length) {
const canBanUsers = currentUserLevel >= banLevel;

View file

@ -121,12 +121,12 @@ export default class SecurityUserSettingsTab extends React.Component<IProps, ISt
MatrixClientPeg.safeGet().removeListener(RoomEvent.MyMembership, this.onMyMembership);
}
private onMyMembership = (room: Room, membership: string): void => {
private onMyMembership = (room: Room, membership: Membership): void => {
if (room.isSpaceRoom()) {
return;
}
if (membership === "invite") {
if (membership === Membership.Invite) {
this.addInvitedRoom(room);
} else if (this.state.invitedRoomIds.has(room.roomId)) {
// The user isn't invited anymore
@ -167,7 +167,7 @@ export default class SecurityUserSettingsTab extends React.Component<IProps, ISt
return MatrixClientPeg.safeGet()
.getRooms()
.filter((r) => {
return r.hasMembershipState(MatrixClientPeg.safeGet().getUserId()!, "invite");
return r.hasMembershipState(MatrixClientPeg.safeGet().getUserId()!, Membership.Invite);
});
};

View file

@ -99,7 +99,7 @@ export const SpaceButton = <T extends keyof JSX.IntrinsicElements>({
let notifBadge;
if (spaceKey && notificationState) {
let ariaLabel = _t("a11y_jump_first_unread_room");
if (space?.getMyMembership() === "invite") {
if (space?.getMyMembership() === Membership.Invite) {
ariaLabel = _t("a11y|jump_first_invite");
}
@ -325,7 +325,7 @@ export class SpaceItem extends React.PureComponent<IItemProps, IItemState> {
hasSubSpaces: this.state.childSpaces?.length,
});
const isInvite = space.getMyMembership() === "invite";
const isInvite = space.getMyMembership() === Membership.Invite;
const notificationState = isInvite
? StaticNotificationState.forSymbol("!", NotificationLevel.Highlight)
@ -378,7 +378,9 @@ export class SpaceItem extends React.PureComponent<IItemProps, IItemState> {
isNarrow={isPanelCollapsed}
size={isNested ? "24px" : "32px"}
onKeyDown={this.onKeyDown}
ContextMenuComponent={this.props.space.getMyMembership() === "join" ? SpaceContextMenu : undefined}
ContextMenuComponent={
this.props.space.getMyMembership() === Membership.Join ? SpaceContextMenu : undefined
}
>
{toggleCollapseButton}
</SpaceButton>