Merge pull request #12336 from matrix-org/andybalaam/stas-demydiuk-membership-type3

Introduce Membership type (take 2)
This commit is contained in:
David Baker 2024-03-22 15:36:39 +00:00 committed by GitHub
commit 8f22550f19
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
113 changed files with 711 additions and 517 deletions

View file

@ -31,6 +31,7 @@ import {
EventType,
ClientEvent,
} from "matrix-js-sdk/src/matrix";
import { KnownMembership } from "matrix-js-sdk/src/types";
import { throttle } from "lodash";
import { Button, Tooltip } from "@vector-im/compound-web";
import { Icon as UserAddIcon } from "@vector-im/compound-design-tokens/icons/user-add-solid.svg";
@ -171,7 +172,11 @@ 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 === KnownMembership.Join &&
oldMembership !== KnownMembership.Join
) {
// we just joined the room, load the member list
this.updateListNow(true);
}
@ -363,7 +368,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() === KnownMembership.Join && shouldShowComponent(UIComponent.InviteUsers)) {
const inviteButtonText = room.isSpaceRoom() ? _t("space|invite_this_space") : _t("room|invite_this_room");
const button = (

View file

@ -16,6 +16,7 @@ limitations under the License.
import React, { useContext } from "react";
import { EventType, Room, User, MatrixClient } from "matrix-js-sdk/src/matrix";
import { KnownMembership } from "matrix-js-sdk/src/types";
import MatrixClientContext from "../../../contexts/MatrixClientContext";
import RoomContext from "../../../contexts/RoomContext";
@ -112,7 +113,7 @@ const NewRoomIntro: React.FC = () => {
</React.Fragment>
);
} else {
const inRoom = room && room.getMyMembership() === "join";
const inRoom = room && room.getMyMembership() === KnownMembership.Join;
const topic = room.currentState.getStateEvents(EventType.RoomTopic, "")?.getContent()?.topic;
const canAddTopic = inRoom && room.currentState.maySendStateEvent(EventType.RoomTopic, cli.getSafeUserId());

View file

@ -16,6 +16,7 @@ limitations under the License.
import React, { FC } from "react";
import { Room, JoinRule, MatrixClient } from "matrix-js-sdk/src/matrix";
import { KnownMembership } from "matrix-js-sdk/src/types";
import { _t } from "../../../languageHandler";
import RightPanelStore from "../../../stores/right-panel/RightPanelStore";
@ -33,7 +34,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() !== KnownMembership.Invite) return null;
try {
return await room.client.getRoomSummary(room.roomId);
} catch (e) {
@ -61,7 +62,7 @@ const RoomInfoLine: FC<IProps> = ({ room }) => {
}
let members: JSX.Element | undefined;
if (membership === "invite" && summary) {
if (membership === KnownMembership.Invite && summary) {
// Don't trust local state and instead use the summary API
members = (
<span className="mx_RoomInfoLine_members">

View file

@ -15,6 +15,7 @@ limitations under the License.
*/
import { EventTimeline, JoinRule, MatrixError, Room, RoomStateEvent } from "matrix-js-sdk/src/matrix";
import { KnownMembership } from "matrix-js-sdk/src/types";
import React, { ReactElement, ReactNode, useCallback, useState, VFC } from "react";
import { Icon as CheckIcon } from "../../../../res/img/feather-customised/check.svg";
@ -35,7 +36,7 @@ export const RoomKnocksBar: VFC<{ room: Room }> = ({ room }) => {
const knockMembers = useTypedEventEmitterState(
room,
RoomStateEvent.Update,
useCallback(() => room.getMembersWithMembership("knock"), [room]),
useCallback(() => room.getMembersWithMembership(KnownMembership.Knock), [room]),
);
const knockMembersCount = knockMembers.length;

View file

@ -24,6 +24,7 @@ import {
JoinRule,
MatrixError,
} from "matrix-js-sdk/src/matrix";
import { KnownMembership } from "matrix-js-sdk/src/types";
import classNames from "classnames";
import { RoomPreviewOpts, RoomViewLifecycle } from "@matrix-org/react-sdk-module-api/lib/lifecycles/RoomViewLifecycle";
@ -192,13 +193,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 === KnownMembership.Knock) {
return MessageCase.RequestDenied;
} else if (this.props.promptAskToJoin) {
return MessageCase.PromptAskToJoin;
}
return MessageCase.Kicked;
} else if (myMember.membership === "ban") {
} else if (myMember.membership === KnownMembership.Ban) {
return MessageCase.Banned;
}
}
@ -284,7 +285,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 === KnownMembership.Invite && memberContent.is_direct;
}
private makeScreenAfterLogin(): { screen: string; params: Record<string, any> } {

View file

@ -16,6 +16,7 @@ limitations under the License.
import React, { FC, useContext, useState } from "react";
import { Room, JoinRule } from "matrix-js-sdk/src/matrix";
import { KnownMembership } from "matrix-js-sdk/src/types";
import { _t } from "../../../languageHandler";
import defaultDispatcher from "../../../dispatcher/dispatcher";
@ -73,7 +74,7 @@ const RoomPreviewCard: FC<IProps> = ({ room, onJoinButtonClicked, onRejectButton
let inviterSection: JSX.Element | null = null;
let joinButtons: JSX.Element;
if (myMembership === "join") {
if (myMembership === KnownMembership.Join) {
joinButtons = (
<AccessibleButton
kind="danger_outline"
@ -87,7 +88,7 @@ const RoomPreviewCard: FC<IProps> = ({ room, onJoinButtonClicked, onRejectButton
{_t("action|leave")}
</AccessibleButton>
);
} else if (myMembership === "invite") {
} else if (myMembership === KnownMembership.Invite) {
const inviteSender = room.getMember(cli.getUserId()!)?.events.member?.getSender();
if (inviteSender) {
@ -178,7 +179,7 @@ const RoomPreviewCard: FC<IProps> = ({ room, onJoinButtonClicked, onRejectButton
});
} else if (isVideoRoom && !videoRoomsEnabled) {
notice =
myMembership === "join"
myMembership === KnownMembership.Join
? _t("room|view_failed_enable_video_rooms")
: _t("room|join_failed_enable_video_rooms");

View file

@ -17,6 +17,7 @@ limitations under the License.
import React, { createRef } from "react";
import { Room, RoomEvent } from "matrix-js-sdk/src/matrix";
import { KnownMembership } from "matrix-js-sdk/src/types";
import classNames from "classnames";
import type { Call } from "../../../models/Call";
@ -124,7 +125,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() !== KnownMembership.Knock &&
!isKnockDenied(this.props.room) &&
shouldShowComponent(UIComponent.RoomOptionsMenu)
);
@ -393,7 +394,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() === KnownMembership.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,