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

@ -87,7 +87,7 @@ const bobJoin = async (page: Page, bob: Bot) => {
async function autoJoin(client: Client) { async function autoJoin(client: Client) {
await client.evaluate((cli) => { await client.evaluate((cli) => {
cli.on(window.matrixcs.RoomMemberEvent.Membership, (event, member) => { cli.on(window.matrixcs.RoomMemberEvent.Membership, (event, member) => {
if (member.membership === "invite" && member.userId === cli.getUserId()) { if (member.membership === Membership.Invite && member.userId === cli.getUserId()) {
cli.joinRoom(member.roomId); cli.joinRoom(member.roomId);
} }
}); });

View file

@ -262,7 +262,7 @@ test.describe("User verification", () => {
const bobVerificationRequest = await bob.evaluateHandle( const bobVerificationRequest = await bob.evaluateHandle(
async (client, { dmRoomId, aliceCredentials }) => { async (client, { dmRoomId, aliceCredentials }) => {
const room = client.getRoom(dmRoomId); const room = client.getRoom(dmRoomId);
while (room.getMember(aliceCredentials.userId)?.membership !== "join") { while (room.getMember(aliceCredentials.userId)?.membership !== Membership.Join) {
await new Promise((resolve) => { await new Promise((resolve) => {
room.once(window.matrixcs.RoomStateEvent.Members, resolve); room.once(window.matrixcs.RoomStateEvent.Members, resolve);
}); });

View file

@ -73,7 +73,7 @@ test.describe("Knock Into Room", () => {
return events.some( return events.some(
(e) => (e) =>
e.getType() === "m.room.member" && e.getType() === "m.room.member" &&
e.getContent()?.membership === "knock" && e.getContent()?.membership === Membership.Knock &&
e.getContent()?.displayname === "Alice", e.getContent()?.displayname === "Alice",
); );
}); });
@ -108,7 +108,7 @@ test.describe("Knock Into Room", () => {
return events.some( return events.some(
(e) => (e) =>
e.getType() === "m.room.member" && e.getType() === "m.room.member" &&
e.getContent()?.membership === "knock" && e.getContent()?.membership === Membership.Knock &&
e.getContent()?.displayname === "Alice", e.getContent()?.displayname === "Alice",
); );
}); });
@ -150,7 +150,7 @@ test.describe("Knock Into Room", () => {
return events.some( return events.some(
(e) => (e) =>
e.getType() === "m.room.member" && e.getType() === "m.room.member" &&
e.getContent()?.membership === "knock" && e.getContent()?.membership === Membership.Knock &&
e.getContent()?.displayname === "Alice", e.getContent()?.displayname === "Alice",
); );
}); });
@ -192,7 +192,7 @@ test.describe("Knock Into Room", () => {
return events.some( return events.some(
(e) => (e) =>
e.getType() === "m.room.member" && e.getType() === "m.room.member" &&
e.getContent()?.membership === "knock" && e.getContent()?.membership === Membership.Knock &&
e.getContent()?.displayname === "Alice", e.getContent()?.displayname === "Alice",
); );
}); });
@ -258,7 +258,7 @@ test.describe("Knock Into Room", () => {
return events.some( return events.some(
(e) => (e) =>
e.getType() === "m.room.member" && e.getType() === "m.room.member" &&
e.getContent()?.membership === "knock" && e.getContent()?.membership === Membership.Knock &&
e.getContent()?.displayname === "Alice", e.getContent()?.displayname === "Alice",
); );
}); });

View file

@ -73,7 +73,7 @@ test.describe("Manage Knocks", () => {
return events.some( return events.some(
(e) => (e) =>
e.getType() === "m.room.member" && e.getType() === "m.room.member" &&
e.getContent()?.membership === "leave" && e.getContent()?.membership === Membership.Leave &&
e.getContent()?.displayname === "Bob", e.getContent()?.displayname === "Bob",
); );
}); });
@ -110,7 +110,7 @@ test.describe("Manage Knocks", () => {
return events.some( return events.some(
(e) => (e) =>
e.getType() === "m.room.member" && e.getType() === "m.room.member" &&
e.getContent()?.membership === "leave" && e.getContent()?.membership === Membership.Leave &&
e.getContent()?.displayname === "Bob", e.getContent()?.displayname === "Bob",
); );
}); });

View file

@ -178,7 +178,7 @@ export class Bot extends Client {
if (opts.autoAcceptInvites) { if (opts.autoAcceptInvites) {
cli.on(window.matrixcs.RoomMemberEvent.Membership, (event, member) => { cli.on(window.matrixcs.RoomMemberEvent.Membership, (event, member) => {
if (member.membership === "invite" && member.userId === cli.getUserId()) { if (member.membership === Membership.Invite && member.userId === cli.getUserId()) {
cli.joinRoom(member.roomId); cli.joinRoom(member.roomId);
} }
}); });

View file

@ -357,7 +357,7 @@ function inviteUser(event: MessageEvent<any>, roomId: string, userId: string): v
if (room) { if (room) {
// if they are already invited or joined we can resolve immediately. // if they are already invited or joined we can resolve immediately.
const member = room.getMember(userId); const member = room.getMember(userId);
if (member && ["join", "invite"].includes(member.membership!)) { if (member && [Membership.Join, Membership.Invite].includes(member.membership)) {
sendResponse(event, { sendResponse(event, {
success: true, success: true,
}); });
@ -669,7 +669,7 @@ function canSendEvent(event: MessageEvent<any>, roomId: string): void {
sendError(event, _t("scalar|error_room_unknown")); sendError(event, _t("scalar|error_room_unknown"));
return; return;
} }
if (room.getMyMembership() !== "join") { if (room.getMyMembership() !== Membership.Join) {
sendError(event, _t("scalar|error_membership")); sendError(event, _t("scalar|error_membership"));
return; return;
} }

View file

@ -241,7 +241,7 @@ export const Commands = [
if (args) { if (args) {
const ev = cli.getRoom(roomId)?.currentState.getStateEvents("m.room.member", cli.getSafeUserId()); const ev = cli.getRoom(roomId)?.currentState.getStateEvents("m.room.member", cli.getSafeUserId());
const content = { const content = {
...(ev ? ev.getContent() : { membership: "join" }), ...(ev ? ev.getContent() : { membership: Membership.Join }),
displayname: args, displayname: args,
}; };
return success(cli.sendStateEvent(roomId, "m.room.member", content, cli.getSafeUserId())); return success(cli.sendStateEvent(roomId, "m.room.member", content, cli.getSafeUserId()));
@ -291,7 +291,7 @@ export const Commands = [
if (!url) return; if (!url) return;
const ev = room?.currentState.getStateEvents("m.room.member", userId); const ev = room?.currentState.getStateEvents("m.room.member", userId);
const content = { const content = {
...(ev ? ev.getContent() : { membership: "join" }), ...(ev ? ev.getContent() : { membership: Membership.Join }),
avatar_url: url, avatar_url: url,
}; };
return cli.sendStateEvent(roomId, "m.room.member", content, userId); return cli.sendStateEvent(roomId, "m.room.member", content, userId);

View file

@ -122,7 +122,7 @@ function textForMemberEvent(
const reason = content.reason; const reason = content.reason;
switch (content.membership) { switch (content.membership) {
case "invite": { case Membership.Invite: {
const threePidContent = content.third_party_invite; const threePidContent = content.third_party_invite;
if (threePidContent) { if (threePidContent) {
if (threePidContent.display_name) { if (threePidContent.display_name) {
@ -138,13 +138,13 @@ function textForMemberEvent(
return () => _t("timeline|m.room.member|invite", { senderName, targetName }); return () => _t("timeline|m.room.member|invite", { senderName, targetName });
} }
} }
case "ban": case Membership.Ban:
return () => return () =>
reason reason
? _t("timeline|m.room.member|ban_reason", { senderName, targetName, reason }) ? _t("timeline|m.room.member|ban_reason", { senderName, targetName, reason })
: _t("timeline|m.room.member|ban", { senderName, targetName }); : _t("timeline|m.room.member|ban", { senderName, targetName });
case "join": case Membership.Join:
if (prevContent && prevContent.membership === "join") { if (prevContent && prevContent.membership === Membership.Join) {
const modDisplayname = getModification(prevContent.displayname, content.displayname); const modDisplayname = getModification(prevContent.displayname, content.displayname);
const modAvatarUrl = getModification(prevContent.avatar_url, content.avatar_url); const modAvatarUrl = getModification(prevContent.avatar_url, content.avatar_url);
@ -194,9 +194,9 @@ function textForMemberEvent(
if (!ev.target) logger.warn("Join message has no target! -- " + ev.getContent().state_key); if (!ev.target) logger.warn("Join message has no target! -- " + ev.getContent().state_key);
return () => _t("timeline|m.room.member|join", { targetName }); return () => _t("timeline|m.room.member|join", { targetName });
} }
case "leave": case Membership.Leave:
if (ev.getSender() === ev.getStateKey()) { if (ev.getSender() === ev.getStateKey()) {
if (prevContent.membership === "invite") { if (prevContent.membership === Membership.Invite) {
return () => _t("timeline|m.room.member|reject_invite", { targetName }); return () => _t("timeline|m.room.member|reject_invite", { targetName });
} else { } else {
return () => return () =>
@ -204,9 +204,9 @@ function textForMemberEvent(
? _t("timeline|m.room.member|left_reason", { targetName, reason }) ? _t("timeline|m.room.member|left_reason", { targetName, reason })
: _t("timeline|m.room.member|left", { targetName }); : _t("timeline|m.room.member|left", { targetName });
} }
} else if (prevContent.membership === "ban") { } else if (prevContent.membership === Membership.Ban) {
return () => _t("timeline|m.room.member|unban", { senderName, targetName }); return () => _t("timeline|m.room.member|unban", { senderName, targetName });
} else if (prevContent.membership === "invite") { } else if (prevContent.membership === Membership.Invite) {
return () => return () =>
reason reason
? _t("timeline|m.room.member|withdrew_invite_reason", { ? _t("timeline|m.room.member|withdrew_invite_reason", {
@ -215,7 +215,7 @@ function textForMemberEvent(
reason, reason,
}) })
: _t("timeline|m.room.member|withdrew_invite", { senderName, targetName }); : _t("timeline|m.room.member|withdrew_invite", { senderName, targetName });
} else if (prevContent.membership === "join") { } else if (prevContent.membership === Membership.Join) {
return () => return () =>
reason reason
? _t("timeline|m.room.member|kick_reason", { ? _t("timeline|m.room.member|kick_reason", {

View file

@ -95,7 +95,7 @@ export default class VoipUserMapper {
if (!virtualRoomEvent || !virtualRoomEvent.getContent()) return null; if (!virtualRoomEvent || !virtualRoomEvent.getContent()) return null;
const nativeRoomID = virtualRoomEvent.getContent()["native_room"]; const nativeRoomID = virtualRoomEvent.getContent()["native_room"];
const nativeRoom = cli.getRoom(nativeRoomID); const nativeRoom = cli.getRoom(nativeRoomID);
if (!nativeRoom || nativeRoom.getMyMembership() !== "join") return null; if (!nativeRoom || nativeRoom.getMyMembership() !== Membership.Join) return null;
return nativeRoomID; return nativeRoomID;
} }

View file

@ -159,7 +159,7 @@ export default class UserProvider extends AutocompleteProvider {
const currentUserId = MatrixClientPeg.safeGet().credentials.userId; const currentUserId = MatrixClientPeg.safeGet().credentials.userId;
this.users = this.room.getJoinedMembers().filter(({ userId }) => userId !== currentUserId); this.users = this.room.getJoinedMembers().filter(({ userId }) => userId !== currentUserId);
this.users = this.users.concat(this.room.getMembersWithMembership("invite")); this.users = this.users.concat(this.room.getMembersWithMembership(Membership.Invite));
this.users = sortBy(this.users, (member) => 1e20 - lastSpoken[member.userId] || 1e20); this.users = sortBy(this.users, (member) => 1e20 - lastSpoken[member.userId] || 1e20);

View file

@ -1454,7 +1454,7 @@ export class RoomView extends React.Component<IRoomProps, IRoomState> {
private async loadMembersIfJoined(room: Room): Promise<void> { private async loadMembersIfJoined(room: Room): Promise<void> {
// lazy load members if enabled // lazy load members if enabled
if (this.context.client?.hasLazyLoadMembersEnabled()) { if (this.context.client?.hasLazyLoadMembersEnabled()) {
if (room && room.getMyMembership() === "join") { if (room && room.getMyMembership() === Membership.Join) {
try { try {
await room.loadMembersIfNeeded(); await room.loadMembersIfNeeded();
if (!this.unmounted) { if (!this.unmounted) {
@ -1588,7 +1588,7 @@ export class RoomView extends React.Component<IRoomProps, IRoomState> {
if (room && this.context.client) { if (room && this.context.client) {
const me = this.context.client.getSafeUserId(); const me = this.context.client.getSafeUserId();
const canReact = const canReact =
room.getMyMembership() === "join" && room.currentState.maySendEvent(EventType.Reaction, me); room.getMyMembership() === Membership.Join && room.currentState.maySendEvent(EventType.Reaction, me);
const canSendMessages = room.maySendMessage(); const canSendMessages = room.maySendMessage();
const canSelfRedact = room.currentState.maySendEvent(EventType.RoomRedaction, me); const canSelfRedact = room.currentState.maySendEvent(EventType.RoomRedaction, me);
@ -1622,7 +1622,7 @@ export class RoomView extends React.Component<IRoomProps, IRoomState> {
private updateDMState(): void { private updateDMState(): void {
const room = this.state.room; const room = this.state.room;
if (room?.getMyMembership() !== "join") { if (room.getMyMembership() != Membership.Join) {
return; return;
} }
const dmInviter = room.getDMInviter(); const dmInviter = room.getDMInviter();
@ -1662,7 +1662,8 @@ export class RoomView extends React.Component<IRoomProps, IRoomState> {
action: Action.JoinRoom, action: Action.JoinRoom,
roomId, roomId,
opts: { inviteSignUrl: signUrl }, opts: { inviteSignUrl: signUrl },
metricsTrigger: this.state.room?.getMyMembership() === "invite" ? "Invite" : "RoomPreview", metricsTrigger:
this.state.room?.getMyMembership() === Membership.Invite ? "Invite" : "RoomPreview",
canAskToJoin: this.state.canAskToJoin, canAskToJoin: this.state.canAskToJoin,
}); });
} }
@ -2183,7 +2184,7 @@ export class RoomView extends React.Component<IRoomProps, IRoomState> {
const myMembership = this.state.room.getMyMembership(); const myMembership = this.state.room.getMyMembership();
if ( if (
isVideoRoom(this.state.room) && isVideoRoom(this.state.room) &&
!(SettingsStore.getValue("feature_video_rooms") && myMembership === "join") !(SettingsStore.getValue("feature_video_rooms") && myMembership === Membership.Join)
) { ) {
return ( return (
<ErrorBoundary> <ErrorBoundary>
@ -2200,7 +2201,7 @@ export class RoomView extends React.Component<IRoomProps, IRoomState> {
} }
// SpaceRoomView handles invites itself // SpaceRoomView handles invites itself
if (myMembership === "invite" && !this.state.room.isSpaceRoom()) { if (myMembership === Membership.Invite && !this.state.room.isSpaceRoom()) {
if (this.state.joining || this.state.rejecting) { if (this.state.joining || this.state.rejecting) {
return ( return (
<ErrorBoundary> <ErrorBoundary>
@ -2247,16 +2248,16 @@ export class RoomView extends React.Component<IRoomProps, IRoomState> {
} }
} }
if (this.state.canAskToJoin && ["knock", "leave"].includes(myMembership)) { if (this.state.canAskToJoin && [Membership.Knock, Membership.Leave].includes(myMembership)) {
return ( return (
<div className="mx_RoomView" data-room-header={roomHeaderType}> <div className="mx_RoomView" data-room-header={roomHeaderType}>
<ErrorBoundary> <ErrorBoundary>
<RoomPreviewBar <RoomPreviewBar
onJoinClick={this.onJoinButtonClicked} onJoinClick={this.onJoinButtonClicked}
room={this.state.room} room={this.state.room}
canAskToJoinAndMembershipIsLeave={myMembership === "leave"} canAskToJoinAndMembershipIsLeave={myMembership === Membership.Leave}
promptAskToJoin={this.state.promptAskToJoin} promptAskToJoin={this.state.promptAskToJoin}
knocked={myMembership === "knock"} knocked={myMembership === Membership.Knock}
onSubmitAskToJoin={this.onSubmitAskToJoin} onSubmitAskToJoin={this.onSubmitAskToJoin}
onCancelAskToJoin={this.onCancelAskToJoin} onCancelAskToJoin={this.onCancelAskToJoin}
onForgetClick={this.onForgetClick} onForgetClick={this.onForgetClick}
@ -2288,7 +2289,7 @@ export class RoomView extends React.Component<IRoomProps, IRoomState> {
statusBar = ( statusBar = (
<RoomStatusBar <RoomStatusBar
room={this.state.room} room={this.state.room}
isPeeking={myMembership !== "join"} isPeeking={myMembership !== Membership.Join}
onInviteClick={this.onInviteClick} onInviteClick={this.onInviteClick}
onVisible={this.onStatusBarVisible} onVisible={this.onStatusBarVisible}
onHidden={this.onStatusBarHidden} onHidden={this.onStatusBarHidden}
@ -2332,7 +2333,7 @@ export class RoomView extends React.Component<IRoomProps, IRoomState> {
); );
} else if (showRoomUpgradeBar) { } else if (showRoomUpgradeBar) {
aux = <RoomUpgradeWarningBar room={this.state.room} />; aux = <RoomUpgradeWarningBar room={this.state.room} />;
} else if (myMembership !== "join") { } else if (myMembership !== Membership.Join) {
// We do have a room object for this room, but we're not currently in it. // We do have a room object for this room, but we're not currently in it.
// We may have a 3rd party invite to it. // We may have a 3rd party invite to it.
let inviterName: string | undefined; let inviterName: string | undefined;
@ -2406,7 +2407,7 @@ export class RoomView extends React.Component<IRoomProps, IRoomState> {
let messageComposer; let messageComposer;
const showComposer = const showComposer =
// joined and not showing search results // joined and not showing search results
myMembership === "join" && !this.state.search; myMembership === Membership.Join && !this.state.search;
if (showComposer) { if (showComposer) {
messageComposer = ( messageComposer = (
<MessageComposer <MessageComposer
@ -2603,7 +2604,8 @@ export class RoomView extends React.Component<IRoomProps, IRoomState> {
const myMember = this.state.room!.getMember(this.context.client!.getSafeUserId()); const myMember = this.state.room!.getMember(this.context.client!.getSafeUserId());
const showForgetButton = const showForgetButton =
!this.context.client.isGuest() && (["leave", "ban"].includes(myMembership) || myMember?.isKicked()); !this.context.client.isGuest() &&
([Membership.Leave, Membership.Ban].includes(myMembership) || myMember?.isKicked());
return ( return (
<RoomContext.Provider value={this.state}> <RoomContext.Provider value={this.state}>
@ -2640,7 +2642,7 @@ export class RoomView extends React.Component<IRoomProps, IRoomState> {
room={this.state.room} room={this.state.room}
searchInfo={this.state.search} searchInfo={this.state.search}
oobData={this.props.oobData} oobData={this.props.oobData}
inRoom={myMembership === "join"} inRoom={myMembership === Membership.Join}
onSearchClick={onSearchClick} onSearchClick={onSearchClick}
onInviteClick={onInviteClick} onInviteClick={onInviteClick}
onForgetClick={showForgetButton ? onForgetClick : null} onForgetClick={showForgetButton ? onForgetClick : null}

View file

@ -112,7 +112,7 @@ const Tile: React.FC<ITileProps> = ({
const cli = useContext(MatrixClientContext); const cli = useContext(MatrixClientContext);
const joinedRoom = useTypedEventEmitterState(cli, ClientEvent.Room, () => { const joinedRoom = useTypedEventEmitterState(cli, ClientEvent.Room, () => {
const cliRoom = cli?.getRoom(room.room_id); const cliRoom = cli?.getRoom(room.room_id);
return cliRoom?.getMyMembership() === "join" ? cliRoom : undefined; return cliRoom?.getMyMembership() === Membership.Join ? cliRoom : undefined;
}); });
const joinedRoomName = useTypedEventEmitterState(joinedRoom, RoomEvent.Name, (room) => room?.name); const joinedRoomName = useTypedEventEmitterState(joinedRoom, RoomEvent.Name, (room) => room?.name);
const name = const name =
@ -828,7 +828,7 @@ const SpaceHierarchy: React.FC<IProps> = ({ space, initialText = "", showRoom, a
content = <Spinner />; content = <Spinner />;
} else { } else {
const hasPermissions = const hasPermissions =
space?.getMyMembership() === "join" && space?.getMyMembership() === Membership.Join &&
space.currentState.maySendStateEvent(EventType.SpaceChild, cli.getSafeUserId()); space.currentState.maySendStateEvent(EventType.SpaceChild, cli.getSafeUserId());
const root = hierarchy.roomMap.get(space.roomId); const root = hierarchy.roomMap.get(space.roomId);
@ -846,7 +846,7 @@ const SpaceHierarchy: React.FC<IProps> = ({ space, initialText = "", showRoom, a
onViewRoomClick={(roomId, roomType) => showRoom(cli, hierarchy, roomId, roomType)} onViewRoomClick={(roomId, roomType) => showRoom(cli, hierarchy, roomId, roomType)}
onJoinRoomClick={async (roomId, parents) => { onJoinRoomClick={async (roomId, parents) => {
for (const parent of parents) { for (const parent of parents) {
if (cli.getRoom(parent)?.getMyMembership() !== "join") { if (cli.getRoom(parent)?.getMyMembership() !== Membership.Join) {
await joinRoom(cli, hierarchy, parent); await joinRoom(cli, hierarchy, parent);
} }
} }

View file

@ -237,7 +237,7 @@ const SpaceLanding: React.FC<{ space: Room }> = ({ space }) => {
} }
const hasAddRoomPermissions = const hasAddRoomPermissions =
myMembership === "join" && space.currentState.maySendStateEvent(EventType.SpaceChild, userId); myMembership === Membership.Join && space.currentState.maySendStateEvent(EventType.SpaceChild, userId);
let addRoomButton; let addRoomButton;
if (hasAddRoomPermissions) { if (hasAddRoomPermissions) {
@ -678,7 +678,7 @@ export default class SpaceRoomView extends React.PureComponent<IProps, IState> {
private renderBody(): JSX.Element { private renderBody(): JSX.Element {
switch (this.state.phase) { switch (this.state.phase) {
case Phase.Landing: case Phase.Landing:
if (this.state.myMembership === "join") { if (this.state.myMembership === Membership.Join) {
return <SpaceLanding space={this.props.space} />; return <SpaceLanding space={this.props.space} />;
} else { } else {
return ( return (

View file

@ -1824,7 +1824,7 @@ class TimelinePanel extends React.Component<IProps, IState> {
// that the event belongs to, and traversing the timeline looking for // that the event belongs to, and traversing the timeline looking for
// that event, while keeping track of the user's membership // that event, while keeping track of the user's membership
let i = events.length - 1; let i = events.length - 1;
let userMembership = "leave"; let userMembership = Membership.Leave;
for (; i >= 0; i--) { for (; i >= 0; i--) {
const timeline = this.props.timelineSet.getTimelineForEvent(events[i].getId()!); const timeline = this.props.timelineSet.getTimelineForEvent(events[i].getId()!);
if (!timeline) { if (!timeline) {
@ -1837,14 +1837,15 @@ class TimelinePanel extends React.Component<IProps, IState> {
continue; continue;
} }
userMembership = timeline.getState(EventTimeline.FORWARDS)?.getMember(userId)?.membership ?? "leave"; userMembership =
timeline.getState(EventTimeline.FORWARDS)?.getMember(userId)?.membership ?? Membership.Leave;
const timelineEvents = timeline.getEvents(); const timelineEvents = timeline.getEvents();
for (let j = timelineEvents.length - 1; j >= 0; j--) { for (let j = timelineEvents.length - 1; j >= 0; j--) {
const event = timelineEvents[j]; const event = timelineEvents[j];
if (event.getId() === events[i].getId()) { if (event.getId() === events[i].getId()) {
break; break;
} else if (event.getStateKey() === userId && event.getType() === EventType.RoomMember) { } else if (event.getStateKey() === userId && event.getType() === EventType.RoomMember) {
userMembership = event.getPrevContent().membership || "leave"; userMembership = event.getPrevContent().membership || Membership.Leave;
} }
} }
break; break;
@ -1855,8 +1856,11 @@ class TimelinePanel extends React.Component<IProps, IState> {
for (; i >= 0; i--) { for (; i >= 0; i--) {
const event = events[i]; const event = events[i];
if (event.getStateKey() === userId && event.getType() === EventType.RoomMember) { if (event.getStateKey() === userId && event.getType() === EventType.RoomMember) {
userMembership = event.getPrevContent().membership || "leave"; userMembership = event.getPrevContent().membership || Membership.Leave;
} else if (userMembership === "leave" && (event.isDecryptionFailure() || event.isBeingDecrypted())) { } else if (
userMembership === Membership.Leave &&
(event.isDecryptionFailure() || event.isBeingDecrypted())
) {
// reached an undecryptable message when the user wasn't in the room -- don't try to load any more // reached an undecryptable message when the user wasn't in the room -- don't try to load any more
// Note: for now, we assume that events that are being decrypted are // Note: for now, we assume that events that are being decrypted are
// not decryptable - we will be called once more when it is decrypted. // not decryptable - we will be called once more when it is decrypted.

View file

@ -48,7 +48,7 @@ export class CreationGrouper extends BaseGrouper {
const eventType = event.getType(); const eventType = event.getType();
if ( if (
eventType === EventType.RoomMember && eventType === EventType.RoomMember &&
(event.getStateKey() !== createEvent.getSender() || event.getContent()["membership"] !== "join") (event.getStateKey() !== createEvent.getSender() || event.getContent()["membership"] !== Membership.Join)
) { ) {
return false; return false;
} }

View file

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

View file

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

View file

@ -267,7 +267,7 @@ const ForwardDialog: React.FC<IProps> = ({ matrixClient: cli, event, permalinkCr
sortRooms( sortRooms(
cli cli
.getVisibleRooms(msc3946DynamicRoomPredecessors) .getVisibleRooms(msc3946DynamicRoomPredecessors)
.filter((room) => room.getMyMembership() === "join" && !room.isSpaceRoom()), .filter((room) => room.getMyMembership() === Membership.Join && !room.isSpaceRoom()),
), ),
[cli, msc3946DynamicRoomPredecessors], [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 room = MatrixClientPeg.safeGet().getRoom(props.roomId);
const isFederated = room?.currentState.getStateEvents(EventType.RoomCreate, "")?.getContent()["m.federate"]; 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"); 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(Membership.Invite).forEach((m) => excludedIds.add(m.userId));
room.getMembersWithMembership("join").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 // 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) { if (isFederated === false) {
// exclude users from external servers // exclude users from external servers
const homeserver = props.roomId.split(":")[1]; const homeserver = props.roomId.split(":")[1];

View file

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

View file

@ -27,7 +27,7 @@ const ServersInRoom: React.FC<IDevtoolsProps> = ({ onBack }) => {
const servers = useMemo<Record<string, number>>(() => { const servers = useMemo<Record<string, number>>(() => {
const servers: Record<string, number> = {}; const servers: Record<string, number> = {};
context.room.currentState.getStateEvents(EventType.RoomMember).forEach((ev) => { 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]; const server = ev.getSender()!.split(":")[1];
servers[server] = (servers[server] ?? 0) + 1; servers[server] = (servers[server] ?? 0) + 1;
}); });

View file

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

View file

@ -219,7 +219,10 @@ export default class AppTile extends React.Component<IProps, IState> {
} }
private onMyMembership = (room: Room, membership: string): void => { 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(); this.onUserLeftRoom();
} }
}; };

View file

@ -416,12 +416,12 @@ export default class EventListSummary extends React.Component<
case EventType.RoomMember: case EventType.RoomMember:
switch (e.mxEvent.getContent().membership) { switch (e.mxEvent.getContent().membership) {
case "invite": case Membership.Invite:
return TransitionType.Invited; return TransitionType.Invited;
case "ban": case Membership.Ban:
return TransitionType.Banned; return TransitionType.Banned;
case "join": case Membership.Join:
if (e.mxEvent.getPrevContent().membership === "join") { if (e.mxEvent.getPrevContent().membership === Membership.Join) {
if (e.mxEvent.getContent().displayname !== e.mxEvent.getPrevContent().displayname) { if (e.mxEvent.getContent().displayname !== e.mxEvent.getPrevContent().displayname) {
return TransitionType.ChangedName; return TransitionType.ChangedName;
} else if (e.mxEvent.getContent().avatar_url !== e.mxEvent.getPrevContent().avatar_url) { } else if (e.mxEvent.getContent().avatar_url !== e.mxEvent.getPrevContent().avatar_url) {
@ -431,17 +431,17 @@ export default class EventListSummary extends React.Component<
} else { } else {
return TransitionType.Joined; return TransitionType.Joined;
} }
case "leave": case Membership.Leave:
if (e.mxEvent.getSender() === e.mxEvent.getStateKey()) { 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.InviteReject;
} }
return TransitionType.Left; return TransitionType.Left;
} }
switch (e.mxEvent.getPrevContent().membership) { switch (e.mxEvent.getPrevContent().membership) {
case "invite": case Membership.Invite:
return TransitionType.InviteWithdrawal; return TransitionType.InviteWithdrawal;
case "ban": case Membership.Ban:
return TransitionType.Unbanned; return TransitionType.Unbanned;
// sender is not target and made the target leave, if not from invite/ban then this is a kick // sender is not target and made the target leave, if not from invite/ban then this is a kick
default: 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 RoomFacePile: FC<IProps> = ({ room, onlyKnownUsers = true, numShown = DEFAULT_NUM_FACES, ...props }) => {
const cli = useContext(MatrixClientContext); const cli = useContext(MatrixClientContext);
const isJoined = room.getMyMembership() === "join"; const isJoined = room.getMyMembership() === Membership.Join;
let members = useRoomMembers(room); let members = useRoomMembers(room);
const count = members.length; 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 isUploading = ContentMessages.sharedInstance().getCurrentUploads(this.props.composerRelation).length > 0;
const myMembership = this.props.room.getMyMembership(); const myMembership = this.props.room.getMyMembership();
const showComposer = myMembership === "join"; const showComposer = myMembership === Membership.Join;
return ( return (
<RoomContext.Provider <RoomContext.Provider

View file

@ -473,7 +473,7 @@ export const UserOptionsSection: React.FC<{
if ( if (
member instanceof RoomMember && member instanceof RoomMember &&
canInvite && canInvite &&
(member?.membership ?? "leave") === "leave" && (member?.membership ?? Membership.Leave) === Membership.Leave &&
shouldShowComponent(UIComponent.InviteUsers) shouldShowComponent(UIComponent.InviteUsers)
) { ) {
const roomId = member && member.roomId ? member.roomId : SdkContextClass.instance.roomViewStore.getRoomId(); const roomId = member && member.roomId ? member.roomId : SdkContextClass.instance.roomViewStore.getRoomId();
@ -638,7 +638,7 @@ export const RoomKickButton = ({
const cli = useContext(MatrixClientContext); const cli = useContext(MatrixClientContext);
// check if user can be kicked/disinvited // 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> => { const onKick = async (): Promise<void> => {
if (isUpdating) return; // only allow one operation at a time if (isUpdating) return; // only allow one operation at a time
@ -647,17 +647,17 @@ export const RoomKickButton = ({
const commonProps = { const commonProps = {
member, member,
action: room.isSpaceRoom() action: room.isSpaceRoom()
? member.membership === "invite" ? member.membership === Membership.Invite
? _t("user_info|disinvite_button_space") ? _t("user_info|disinvite_button_space")
: _t("user_info|kick_button_space") : _t("user_info|kick_button_space")
: member.membership === "invite" : member.membership === Membership.Invite
? _t("user_info|disinvite_button_room") ? _t("user_info|disinvite_button_room")
: _t("user_info|kick_button_room"), : _t("user_info|kick_button_room"),
title: title:
member.membership === "invite" member.membership === Membership.Invite
? _t("user_info|disinvite_button_room_name", { roomName: room.name }) ? _t("user_info|disinvite_button_room_name", { roomName: room.name })
: _t("user_info|kick_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, danger: true,
}; };
@ -718,10 +718,10 @@ export const RoomKickButton = ({
}; };
const kickLabel = room.isSpaceRoom() const kickLabel = room.isSpaceRoom()
? member.membership === "invite" ? member.membership === Membership.Invite
? _t("user_info|disinvite_button_space") ? _t("user_info|disinvite_button_space")
: _t("user_info|kick_button_space") : _t("user_info|kick_button_space")
: member.membership === "invite" : member.membership === Membership.Invite
? _t("user_info|disinvite_button_room") ? _t("user_info|disinvite_button_room")
: _t("user_info|kick_button_room"); : _t("user_info|kick_button_room");
@ -771,7 +771,7 @@ export const BanToggleButton = ({
}: Omit<IBaseRoomProps, "powerLevels">): JSX.Element => { }: Omit<IBaseRoomProps, "powerLevels">): JSX.Element => {
const cli = useContext(MatrixClientContext); const cli = useContext(MatrixClientContext);
const isBanned = member.membership === "ban"; const isBanned = member.membership === Membership.Ban;
const onBanOrUnban = async (): Promise<void> => { const onBanOrUnban = async (): Promise<void> => {
if (isUpdating) return; // only allow one operation at a time if (isUpdating) return; // only allow one operation at a time
startUpdating(); startUpdating();
@ -808,9 +808,9 @@ export const BanToggleButton = ({
return ( return (
!!myMember && !!myMember &&
!!theirMember && !!theirMember &&
theirMember.membership === "ban" && theirMember.membership === Membership.Ban &&
myMember.powerLevel > theirMember.powerLevel && myMember.powerLevel > theirMember.powerLevel &&
child.currentState.hasSufficientPowerLevelFor("ban", myMember.powerLevel) child.currentState.hasSufficientPowerLevelFor(Membership.Ban, myMember.powerLevel)
); );
} }
: (child: Room) => { : (child: Room) => {
@ -820,9 +820,9 @@ export const BanToggleButton = ({
return ( return (
!!myMember && !!myMember &&
!!theirMember && !!theirMember &&
theirMember.membership !== "ban" && theirMember.membership !== Membership.Ban &&
myMember.powerLevel > theirMember.powerLevel && 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"), 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); const cli = useContext(MatrixClientContext);
// Don't show the mute/unmute option if the user is not in the room // 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 muted = isMuted(member, powerLevels);
const onMuteToggle = async (): Promise<void> => { 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 => { 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 // we just joined the room, load the member list
this.updateListNow(true); this.updateListNow(true);
} }
@ -363,7 +363,7 @@ export default class MemberList extends React.Component<IProps, IState> {
const room = cli.getRoom(this.props.roomId); const room = cli.getRoom(this.props.roomId);
let inviteButton: JSX.Element | undefined; 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 inviteButtonText = room.isSpaceRoom() ? _t("space|invite_this_space") : _t("room|invite_this_room");
const button = ( const button = (

View file

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

View file

@ -33,7 +33,7 @@ interface IProps {
const RoomInfoLine: FC<IProps> = ({ room }) => { 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. // 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> => { const summary = useAsyncMemo(async (): Promise<Awaited<ReturnType<MatrixClient["getRoomSummary"]>> | null> => {
if (room.getMyMembership() !== "invite") return null; if (room.getMyMembership() !== Membership.Invite) return null;
try { try {
return await room.client.getRoomSummary(room.roomId); return await room.client.getRoomSummary(room.roomId);
} catch (e) { } catch (e) {
@ -61,7 +61,7 @@ const RoomInfoLine: FC<IProps> = ({ room }) => {
} }
let members: JSX.Element | undefined; 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 // Don't trust local state and instead use the summary API
members = ( members = (
<span className="mx_RoomInfoLine_members"> <span className="mx_RoomInfoLine_members">

View file

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

View file

@ -192,13 +192,13 @@ export default class RoomPreviewBar extends React.Component<IProps, IState> {
if (myMember) { if (myMember) {
const previousMembership = myMember.events.member?.getPrevContent().membership; const previousMembership = myMember.events.member?.getPrevContent().membership;
if (myMember.isKicked()) { if (myMember.isKicked()) {
if (previousMembership === "knock") { if (previousMembership === Membership.Knock) {
return MessageCase.RequestDenied; return MessageCase.RequestDenied;
} else if (this.props.promptAskToJoin) { } else if (this.props.promptAskToJoin) {
return MessageCase.PromptAskToJoin; return MessageCase.PromptAskToJoin;
} }
return MessageCase.Kicked; return MessageCase.Kicked;
} else if (myMember.membership === "ban") { } else if (myMember.membership === Membership.Ban) {
return MessageCase.Banned; return MessageCase.Banned;
} }
} }
@ -284,7 +284,7 @@ export default class RoomPreviewBar extends React.Component<IProps, IState> {
return false; return false;
} }
const memberContent = myMember.events.member?.getContent(); 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> } { 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 inviterSection: JSX.Element | null = null;
let joinButtons: JSX.Element; let joinButtons: JSX.Element;
if (myMembership === "join") { if (myMembership === Membership.Join) {
joinButtons = ( joinButtons = (
<AccessibleButton <AccessibleButton
kind="danger_outline" kind="danger_outline"
@ -87,7 +87,7 @@ const RoomPreviewCard: FC<IProps> = ({ room, onJoinButtonClicked, onRejectButton
{_t("action|leave")} {_t("action|leave")}
</AccessibleButton> </AccessibleButton>
); );
} else if (myMembership === "invite") { } else if (myMembership === Membership.Invite) {
const inviteSender = room.getMember(cli.getUserId()!)?.events.member?.getSender(); const inviteSender = room.getMember(cli.getUserId()!)?.events.member?.getSender();
if (inviteSender) { if (inviteSender) {
@ -178,7 +178,7 @@ const RoomPreviewCard: FC<IProps> = ({ room, onJoinButtonClicked, onRejectButton
}); });
} else if (isVideoRoom && !videoRoomsEnabled) { } else if (isVideoRoom && !videoRoomsEnabled) {
notice = notice =
myMembership === "join" myMembership === Membership.Join
? _t("room|view_failed_enable_video_rooms") ? _t("room|view_failed_enable_video_rooms")
: _t("room|join_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 { private get showContextMenu(): boolean {
return ( return (
this.props.tag !== DefaultTagID.Invite && this.props.tag !== DefaultTagID.Invite &&
this.props.room.getMyMembership() !== "knock" && this.props.room.getMyMembership() !== Membership.Knock &&
!isKnockDenied(this.props.room) && !isKnockDenied(this.props.room) &&
shouldShowComponent(UIComponent.RoomOptionsMenu) shouldShowComponent(UIComponent.RoomOptionsMenu)
); );
@ -387,7 +387,7 @@ export class RoomTile extends React.PureComponent<ClassProps, State> {
mx_RoomTile: true, mx_RoomTile: true,
mx_RoomTile_sticky: mx_RoomTile_sticky:
SettingsStore.getValue("feature_ask_to_join") && 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_selected: this.state.selected,
mx_RoomTile_hasMenuOpen: !!(this.state.generalMenuPosition || this.state.notificationsMenuPosition), mx_RoomTile_hasMenuOpen: !!(this.state.generalMenuPosition || this.state.notificationsMenuPosition),
mx_RoomTile_minimized: this.props.isMinimized, mx_RoomTile_minimized: this.props.isMinimized,

View file

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

View file

@ -145,7 +145,7 @@ export const PeopleRoomSettingsTab: VFC<{ room: Room }> = ({ room }) => {
const knockMembers = useTypedEventEmitterState( const knockMembers = useTypedEventEmitterState(
room, room,
RoomStateEvent.Update, RoomStateEvent.Update,
useCallback(() => room.getMembersWithMembership("knock"), [room]), useCallback(() => room.getMembersWithMembership(Membership.Knock), [room]),
); );
return ( 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; let bannedUsersSection: JSX.Element | undefined;
if (banned?.length) { if (banned?.length) {
const canBanUsers = currentUserLevel >= banLevel; 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); MatrixClientPeg.safeGet().removeListener(RoomEvent.MyMembership, this.onMyMembership);
} }
private onMyMembership = (room: Room, membership: string): void => { private onMyMembership = (room: Room, membership: Membership): void => {
if (room.isSpaceRoom()) { if (room.isSpaceRoom()) {
return; return;
} }
if (membership === "invite") { if (membership === Membership.Invite) {
this.addInvitedRoom(room); this.addInvitedRoom(room);
} else if (this.state.invitedRoomIds.has(room.roomId)) { } else if (this.state.invitedRoomIds.has(room.roomId)) {
// The user isn't invited anymore // The user isn't invited anymore
@ -167,7 +167,7 @@ export default class SecurityUserSettingsTab extends React.Component<IProps, ISt
return MatrixClientPeg.safeGet() return MatrixClientPeg.safeGet()
.getRooms() .getRooms()
.filter((r) => { .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; let notifBadge;
if (spaceKey && notificationState) { if (spaceKey && notificationState) {
let ariaLabel = _t("a11y_jump_first_unread_room"); let ariaLabel = _t("a11y_jump_first_unread_room");
if (space?.getMyMembership() === "invite") { if (space?.getMyMembership() === Membership.Invite) {
ariaLabel = _t("a11y|jump_first_invite"); ariaLabel = _t("a11y|jump_first_invite");
} }
@ -325,7 +325,7 @@ export class SpaceItem extends React.PureComponent<IItemProps, IItemState> {
hasSubSpaces: this.state.childSpaces?.length, hasSubSpaces: this.state.childSpaces?.length,
}); });
const isInvite = space.getMyMembership() === "invite"; const isInvite = space.getMyMembership() === Membership.Invite;
const notificationState = isInvite const notificationState = isInvite
? StaticNotificationState.forSymbol("!", NotificationLevel.Highlight) ? StaticNotificationState.forSymbol("!", NotificationLevel.Highlight)
@ -378,7 +378,9 @@ export class SpaceItem extends React.PureComponent<IItemProps, IItemState> {
isNarrow={isPanelCollapsed} isNarrow={isPanelCollapsed}
size={isNested ? "24px" : "32px"} size={isNested ? "24px" : "32px"}
onKeyDown={this.onKeyDown} onKeyDown={this.onKeyDown}
ContextMenuComponent={this.props.space.getMyMembership() === "join" ? SpaceContextMenu : undefined} ContextMenuComponent={
this.props.space.getMyMembership() === Membership.Join ? SpaceContextMenu : undefined
}
> >
{toggleCollapseButton} {toggleCollapseButton}
</SpaceButton> </SpaceButton>

View file

@ -81,8 +81,8 @@ export const useRoomMemberCount = (
}; };
// Hook to simplify watching the local user's membership in a room // Hook to simplify watching the local user's membership in a room
export const useMyRoomMembership = (room: Room): string => { export const useMyRoomMembership = (room: Room): Membership => {
const [membership, setMembership] = useState<string>(room.getMyMembership()); const [membership, setMembership] = useState<Membership>(room.getMyMembership());
useTypedEventEmitter(room, RoomEvent.MyMembership, () => { useTypedEventEmitter(room, RoomEvent.MyMembership, () => {
setMembership(room.getMyMembership()); setMembership(room.getMyMembership());
}); });

View file

@ -57,7 +57,7 @@ export const useSpaceResults = (space: Room | undefined, query: string): [Hierar
return rooms?.filter((r) => { return rooms?.filter((r) => {
return ( return (
r.room_type !== RoomType.Space && r.room_type !== RoomType.Space &&
cli.getRoom(r.room_id)?.getMyMembership() !== "join" && cli.getRoom(r.room_id)?.getMyMembership() !== Membership.Join &&
(normalize(r.name || "").includes(normalizedQuery) || (r.canonical_alias || "").includes(lcQuery)) (normalize(r.name || "").includes(normalizedQuery) || (r.canonical_alias || "").includes(lcQuery))
); );
}); });

View file

@ -533,7 +533,7 @@ export default class EventIndex extends EventEmitter {
const profiles: Record<string, IMatrixProfile> = {}; const profiles: Record<string, IMatrixProfile> = {};
stateEvents.forEach((ev) => { stateEvents.forEach((ev) => {
if (ev.getContent().membership === "join") { if (ev.getContent().membership === Membership.Join) {
profiles[ev.getSender()!] = { profiles[ev.getSender()!] = {
displayname: ev.getContent().displayname, displayname: ev.getContent().displayname,
avatar_url: ev.getContent().avatar_url, avatar_url: ev.getContent().avatar_url,
@ -754,7 +754,7 @@ export default class EventIndex extends EventEmitter {
// This is sets the avatar URL. // This is sets the avatar URL.
const memberEvent = eventMapper({ const memberEvent = eventMapper({
content: { content: {
membership: "join", membership: Membership.Join,
avatar_url: e.profile.avatar_url, avatar_url: e.profile.avatar_url,
displayname: e.profile.displayname, displayname: e.profile.displayname,
}, },

View file

@ -307,8 +307,8 @@ export abstract class Call extends TypedEventEmitter<CallEvent, CallEventHandler
this.emit(CallEvent.Destroy); this.emit(CallEvent.Destroy);
} }
private onMyMembership = async (_room: Room, membership: string): Promise<void> => { private onMyMembership = async (_room: Room, membership: Membership): Promise<void> => {
if (membership !== "join") this.setDisconnected(); if (membership !== Membership.Join) this.setDisconnected();
}; };
private onStopMessaging = (uid: string): void => { private onStopMessaging = (uid: string): void => {
@ -386,7 +386,7 @@ export class JitsiCall extends Call {
devices = devices.filter((d) => d !== this.client.getDeviceId()); devices = devices.filter((d) => d !== this.client.getDeviceId());
} }
// Must have a connected device and still be joined to the room // Must have a connected device and still be joined to the room
if (devices.length > 0 && member?.membership === "join") { if (devices.length > 0 && member?.membership === Membership.Join) {
participants.set(member, new Set(devices)); participants.set(member, new Set(devices));
if (expiresAt < allExpireAt) allExpireAt = expiresAt; if (expiresAt < allExpireAt) allExpireAt = expiresAt;
} }
@ -416,7 +416,7 @@ export class JitsiCall extends Call {
* returns null, the update is skipped. * returns null, the update is skipped.
*/ */
private async updateDevices(fn: (devices: string[]) => string[] | null): Promise<void> { private async updateDevices(fn: (devices: string[]) => string[] | null): Promise<void> {
if (this.room.getMyMembership() !== "join") return; if (this.room.getMyMembership() !== Membership.Join) return;
const event = this.room.currentState.getStateEvents(JitsiCall.MEMBER_EVENT_TYPE, this.client.getUserId()!); const event = this.room.currentState.getStateEvents(JitsiCall.MEMBER_EVENT_TYPE, this.client.getUserId()!);
const content = event?.getContent<JitsiCallMemberContent>(); const content = event?.getContent<JitsiCallMemberContent>();

View file

@ -39,10 +39,10 @@ function memberEventDiff(ev: MatrixEvent): IDiff {
const prevContent = ev.getPrevContent(); const prevContent = ev.getPrevContent();
const isMembershipChanged = content.membership !== prevContent.membership; const isMembershipChanged = content.membership !== prevContent.membership;
diff.isJoin = isMembershipChanged && content.membership === "join"; diff.isJoin = isMembershipChanged && content.membership === Membership.Join;
diff.isPart = isMembershipChanged && content.membership === "leave" && ev.getStateKey() === ev.getSender(); diff.isPart = isMembershipChanged && content.membership === Membership.Leave && ev.getStateKey() === ev.getSender();
const isJoinToJoin = !isMembershipChanged && content.membership === "join"; const isJoinToJoin = !isMembershipChanged && content.membership === Membership.Join;
diff.isDisplaynameChange = isJoinToJoin && content.displayname !== prevContent.displayname; diff.isDisplaynameChange = isJoinToJoin && content.displayname !== prevContent.displayname;
diff.isAvatarChange = isJoinToJoin && content.avatar_url !== prevContent.avatar_url; diff.isAvatarChange = isJoinToJoin && content.avatar_url !== prevContent.avatar_url;
return diff; return diff;

View file

@ -91,7 +91,7 @@ export class BreadcrumbsStore extends AsyncStoreWithClient<IState> {
// The tests might not result in a valid room object. // The tests might not result in a valid room object.
const room = this.matrixClient.getRoom(payload.room_id); const room = this.matrixClient.getRoom(payload.room_id);
const membership = room?.getMyMembership(); const membership = room?.getMyMembership();
if (room && membership === "join") await this.appendRoom(room); if (room && membership === Membership.Join) await this.appendRoom(room);
} }
} else if (payload.action === Action.JoinRoom) { } else if (payload.action === Action.JoinRoom) {
const room = this.matrixClient.getRoom(payload.roomId); const room = this.matrixClient.getRoom(payload.roomId);

View file

@ -90,7 +90,7 @@ export class MemberListStore {
// pull straight from the server. Don't use a since token as we don't have earlier deltas // pull straight from the server. Don't use a since token as we don't have earlier deltas
// accumulated. // accumulated.
room.currentState.markOutOfBandMembersStarted(); room.currentState.markOutOfBandMembersStarted();
const response = await this.stores.client!.members(roomId, undefined, "leave"); const response = await this.stores.client!.members(roomId, undefined, Membership.Leave);
const memberEvents = response.chunk.map(this.stores.client!.getEventMapper()); const memberEvents = response.chunk.map(this.stores.client!.getEventMapper());
room.currentState.setOutOfBandMembers(memberEvents); room.currentState.setOutOfBandMembers(memberEvents);
} else { } else {
@ -167,7 +167,7 @@ export class MemberListStore {
invited: [], invited: [],
}; };
members.forEach((m) => { members.forEach((m) => {
if (m.membership !== "join" && m.membership !== "invite") { if (m.membership !== Membership.Join && m.membership !== Membership.Invite) {
return; // bail early for left/banned users return; // bail early for left/banned users
} }
if (query) { if (query) {
@ -179,10 +179,10 @@ export class MemberListStore {
} }
} }
switch (m.membership) { switch (m.membership) {
case "join": case Membership.Join:
result.joined.push(m); result.joined.push(m);
break; break;
case "invite": case Membership.Invite:
result.invited.push(m); result.invited.push(m);
break; break;
} }

View file

@ -313,7 +313,7 @@ export class OwnBeaconStore extends AsyncStoreWithClient<OwnBeaconStoreState> {
// in PSF-797 // in PSF-797
// stop watching beacons in rooms where user is no longer a member // stop watching beacons in rooms where user is no longer a member
if (member.membership === "leave" || member.membership === "ban") { if (member.membership === Membership.Leave || member.membership === Membership.Ban) {
this.beaconsByRoomId.get(roomState.roomId)?.forEach(this.removeBeacon); this.beaconsByRoomId.get(roomState.roomId)?.forEach(this.removeBeacon);
this.beaconsByRoomId.delete(roomState.roomId); this.beaconsByRoomId.delete(roomState.roomId);
} }

View file

@ -607,7 +607,7 @@ export class RoomViewStore extends EventEmitter {
private getInvitingUserId(roomId: string): string | undefined { private getInvitingUserId(roomId: string): string | undefined {
const cli = MatrixClientPeg.safeGet(); const cli = MatrixClientPeg.safeGet();
const room = cli.getRoom(roomId); const room = cli.getRoom(roomId);
if (room?.getMyMembership() === "invite") { if (room?.getMyMembership() === Membership.Invite) {
const myMember = room.getMember(cli.getSafeUserId()); const myMember = room.getMember(cli.getSafeUserId());
const inviteEvent = myMember ? myMember.events.member : null; const inviteEvent = myMember ? myMember.events.member : null;
return inviteEvent?.getSender(); return inviteEvent?.getSender();

View file

@ -96,7 +96,8 @@ export class RoomNotificationState extends NotificationState implements IDestroy
const { level, symbol, count } = RoomNotifs.determineUnreadState(this.room, undefined, this.includeThreads); const { level, symbol, count } = RoomNotifs.determineUnreadState(this.room, undefined, this.includeThreads);
const muted = const muted =
RoomNotifs.getRoomNotifsState(this.room.client, this.room.roomId) === RoomNotifs.RoomNotifState.Mute; RoomNotifs.getRoomNotifsState(this.room.client, this.room.roomId) === RoomNotifs.RoomNotifState.Mute;
const knocked = SettingsStore.getValue("feature_ask_to_join") && this.room.getMyMembership() === "knock"; const knocked =
SettingsStore.getValue("feature_ask_to_join") && this.room.getMyMembership() === Membership.Knock;
this._level = level; this._level = level;
this._symbol = symbol; this._symbol = symbol;
this._count = count; this._count = count;

View file

@ -350,7 +350,7 @@ export class RoomListStoreClass extends AsyncStoreWithClient<IState> implements
} }
private async handleRoomUpdate(room: Room, cause: RoomUpdateCause): Promise<any> { private async handleRoomUpdate(room: Room, cause: RoomUpdateCause): Promise<any> {
if (cause === RoomUpdateCause.NewRoom && room.getMyMembership() === "invite") { if (cause === RoomUpdateCause.NewRoom && room.getMyMembership() === Membership.Invite) {
// Let the visibility provider know that there is a new invited room. It would be nice // Let the visibility provider know that there is a new invited room. It would be nice
// if this could just be an event that things listen for but the point of this is that // if this could just be an event that things listen for but the point of this is that
// we delay doing anything about this room until the VoipUserMapper had had a chance // we delay doing anything about this room until the VoipUserMapper had had a chance

View file

@ -172,7 +172,7 @@ export class Algorithm extends EventEmitter {
} }
private doUpdateStickyRoom(val: Room | null): void { private doUpdateStickyRoom(val: Room | null): void {
if (val?.isSpaceRoom() && val.getMyMembership() !== "invite") { if (val?.isSpaceRoom() && val.getMyMembership() !== Membership.Invite) {
// no-op sticky rooms for spaces - they're effectively virtual rooms // no-op sticky rooms for spaces - they're effectively virtual rooms
val = null; val = null;
} }

View file

@ -255,8 +255,8 @@ export class SpaceStoreClass extends AsyncStoreWithClient<IState> {
// else view space home or home depending on what is being clicked on // else view space home or home depending on what is being clicked on
if ( if (
roomId && roomId &&
cliSpace?.getMyMembership() !== "invite" && cliSpace?.getMyMembership() !== Membership.Invite &&
this.matrixClient.getRoom(roomId)?.getMyMembership() === "join" && this.matrixClient.getRoom(roomId)?.getMyMembership() === Membership.Join &&
this.isRoomInSpace(space, roomId) this.isRoomInSpace(space, roomId)
) { ) {
defaultDispatcher.dispatch<ViewRoomPayload>({ defaultDispatcher.dispatch<ViewRoomPayload>({
@ -325,7 +325,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient<IState> {
.filter((roomInfo) => { .filter((roomInfo) => {
return ( return (
roomInfo.room_type !== RoomType.Space && roomInfo.room_type !== RoomType.Space &&
this.matrixClient?.getRoom(roomInfo.room_id)?.getMyMembership() !== "join" this.matrixClient.getRoom(roomInfo.room_id)?.getMyMembership() !== Membership.Join
); );
}) })
.map((roomInfo) => ({ .map((roomInfo) => ({
@ -368,7 +368,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient<IState> {
return history[history.length - 1]; return history[history.length - 1];
}) })
.filter((room) => { .filter((room) => {
return room?.getMyMembership() === "join" || room?.getMyMembership() === "invite"; return room?.getMyMembership() === Membership.Join || room?.getMyMembership() === Membership.Invite;
}) || [] }) || []
); );
} }
@ -379,7 +379,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient<IState> {
public getChildSpaces(spaceId: string): Room[] { public getChildSpaces(spaceId: string): Room[] {
// don't show invited subspaces as they surface at the top level for better visibility // don't show invited subspaces as they surface at the top level for better visibility
return this.getChildren(spaceId).filter((r) => r.isSpaceRoom() && r.getMyMembership() === "join"); return this.getChildren(spaceId).filter((r) => r.isSpaceRoom() && r.getMyMembership() === Membership.Join);
} }
public getParents(roomId: string, canonicalOnly = false): Room[] { public getParents(roomId: string, canonicalOnly = false): Room[] {
@ -593,7 +593,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient<IState> {
private rebuildParentMap = (): void => { private rebuildParentMap = (): void => {
if (!this.matrixClient) return; if (!this.matrixClient) return;
const joinedSpaces = this.matrixClient.getVisibleRooms(this._msc3946ProcessDynamicPredecessor).filter((r) => { const joinedSpaces = this.matrixClient.getVisibleRooms(this._msc3946ProcessDynamicPredecessor).filter((r) => {
return r.isSpaceRoom() && r.getMyMembership() === "join"; return r.isSpaceRoom() && r.getMyMembership() === Membership.Join;
}); });
this.parentMap = new EnhancedMap<string, Set<string>>(); this.parentMap = new EnhancedMap<string, Set<string>>();
@ -717,12 +717,12 @@ export class SpaceStoreClass extends AsyncStoreWithClient<IState> {
return ( return (
!this.parentMap.get(room.roomId)?.size || // put all orphaned rooms in the Home Space !this.parentMap.get(room.roomId)?.size || // put all orphaned rooms in the Home Space
!!DMRoomMap.shared().getUserIdForRoomId(room.roomId) || // put all DMs in the Home Space !!DMRoomMap.shared().getUserIdForRoomId(room.roomId) || // put all DMs in the Home Space
room.getMyMembership() === "invite" room.getMyMembership() === Membership.Invite
); // put all invites in the Home Space ); // put all invites in the Home Space
}; };
private static isInSpace(member?: RoomMember | null): boolean { private static isInSpace(member: RoomMember): boolean {
return member?.membership === "join" || member?.membership === "invite"; return member.membership === Membership.Join || member.membership === Membership.Invite;
} }
// Method for resolving the impact of a single user's membership change in the given Space and its hierarchy // Method for resolving the impact of a single user's membership change in the given Space and its hierarchy
@ -766,7 +766,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient<IState> {
const hiddenChildren = new EnhancedMap<string, Set<string>>(); const hiddenChildren = new EnhancedMap<string, Set<string>>();
visibleRooms.forEach((room) => { visibleRooms.forEach((room) => {
if (!["join", "invite"].includes(room.getMyMembership())) return; if (![Membership.Join, Membership.Invite].includes(room.getMyMembership())) return;
this.getParents(room.roomId).forEach((parent) => { this.getParents(room.roomId).forEach((parent) => {
hiddenChildren.getOrCreate(parent.roomId, new Set()).add(room.roomId); hiddenChildren.getOrCreate(parent.roomId, new Set()).add(room.roomId);
}); });
@ -796,7 +796,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient<IState> {
space space
?.getMembers() ?.getMembers()
.filter((m) => { .filter((m) => {
return m.membership === "join" || m.membership === "invite"; return m.membership === Membership.Join || m.membership === Membership.Invite;
}) })
.map((m) => m.userId), .map((m) => m.userId),
); );
@ -924,7 +924,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient<IState> {
if (!room.isSpaceRoom()) { if (!room.isSpaceRoom()) {
this.onRoomsUpdate(); this.onRoomsUpdate();
if (membership === "join") { if (membership === Membership.Join) {
// the user just joined a room, remove it from the suggested list if it was there // the user just joined a room, remove it from the suggested list if it was there
const numSuggestedRooms = this._suggestedRooms.length; const numSuggestedRooms = this._suggestedRooms.length;
this._suggestedRooms = this._suggestedRooms.filter((r) => r.room_id !== room.roomId); this._suggestedRooms = this._suggestedRooms.filter((r) => r.room_id !== room.roomId);
@ -935,7 +935,10 @@ export class SpaceStoreClass extends AsyncStoreWithClient<IState> {
} }
// if the room currently being viewed was just joined then switch to its related space // if the room currently being viewed was just joined then switch to its related space
if (newMembership === "join" && room.roomId === SdkContextClass.instance.roomViewStore.getRoomId()) { if (
newMembership === Membership.Join &&
room.roomId === SdkContextClass.instance.roomViewStore.getRoomId()
) {
this.switchSpaceIfNeeded(room.roomId); this.switchSpaceIfNeeded(room.roomId);
} }
} }
@ -943,13 +946,13 @@ export class SpaceStoreClass extends AsyncStoreWithClient<IState> {
} }
// Space // Space
if (membership === "invite") { if (membership === Membership.Invite) {
const len = this._invitedSpaces.size; const len = this._invitedSpaces.size;
this._invitedSpaces.add(room); this._invitedSpaces.add(room);
if (len !== this._invitedSpaces.size) { if (len !== this._invitedSpaces.size) {
this.emit(UPDATE_INVITED_SPACES, this.invitedSpaces); this.emit(UPDATE_INVITED_SPACES, this.invitedSpaces);
} }
} else if (oldMembership === "invite" && membership !== "join") { } else if (oldMembership === Membership.Invite && membership !== Membership.Join) {
if (this._invitedSpaces.delete(room)) { if (this._invitedSpaces.delete(room)) {
this.emit(UPDATE_INVITED_SPACES, this.invitedSpaces); this.emit(UPDATE_INVITED_SPACES, this.invitedSpaces);
} }
@ -962,10 +965,10 @@ export class SpaceStoreClass extends AsyncStoreWithClient<IState> {
this.emit(room.roomId); this.emit(room.roomId);
} }
if (membership === "join" && room.roomId === SdkContextClass.instance.roomViewStore.getRoomId()) { if (membership === Membership.Join && room.roomId === SdkContextClass.instance.roomViewStore.getRoomId()) {
// if the user was looking at the space and then joined: select that space // if the user was looking at the space and then joined: select that space
this.setActiveSpace(room.roomId, false); this.setActiveSpace(room.roomId, false);
} else if (membership === "leave" && room.roomId === this.activeSpace) { } else if (membership === Membership.Leave && room.roomId === this.activeSpace) {
// user's active space has gone away, go back to home // user's active space has gone away, go back to home
this.goToFirstSpace(true); this.goToFirstSpace(true);
} }
@ -1000,7 +1003,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient<IState> {
if ( if (
room.roomId === this.activeSpace && // current space room.roomId === this.activeSpace && // current space
target?.getMyMembership() !== "join" && // target not joined target?.getMyMembership() !== Membership.Join && // target not joined
ev.getPrevContent().suggested !== ev.getContent().suggested // suggested flag changed ev.getPrevContent().suggested !== ev.getContent().suggested // suggested flag changed
) { ) {
this.loadSuggestedRooms(room); this.loadSuggestedRooms(room);

View file

@ -550,7 +550,7 @@ export class StopGapWidget extends EventEmitter {
const evId = ev.getId(); const evId = ev.getId();
if (evRoomId && evId) { if (evRoomId && evId) {
const room = this.client.getRoom(evRoomId); const room = this.client.getRoom(evRoomId);
if (room && room.getMyMembership() === "join" && !isRelationToUnknown) { if (room && room.getMyMembership() === Membership.Join && !isRelationToUnknown) {
this.readUpToMap[evRoomId] = evId; this.readUpToMap[evRoomId] = evId;
} }
} }

View file

@ -172,7 +172,7 @@ export default class DMRoomMap {
const joinedRooms = commonRooms const joinedRooms = commonRooms
.map((r) => this.matrixClient.getRoom(r)) .map((r) => this.matrixClient.getRoom(r))
.filter((r) => r && r.getMyMembership() === "join"); .filter((r) => r && r.getMyMembership() === Membership.Join);
return joinedRooms[0]; return joinedRooms[0];
} }

View file

@ -159,17 +159,17 @@ export default class MultiInviter {
if (!room) throw new Error("Room not found"); if (!room) throw new Error("Room not found");
const member = room.getMember(addr); const member = room.getMember(addr);
if (member?.membership === "join") { if (member?.membership === Membership.Join) {
throw new MatrixError({ throw new MatrixError({
errcode: USER_ALREADY_JOINED, errcode: USER_ALREADY_JOINED,
error: "Member already joined", error: "Member already joined",
}); });
} else if (member?.membership === "invite") { } else if (member?.membership === Membership.Invite) {
throw new MatrixError({ throw new MatrixError({
errcode: USER_ALREADY_INVITED, errcode: USER_ALREADY_INVITED,
error: "Member already invited", error: "Member already invited",
}); });
} else if (member?.membership === "ban") { } else if (member?.membership === Membership.Ban) {
let proceed = false; let proceed = false;
// Check if we can unban the invitee. // Check if we can unban the invitee.
// See https://spec.matrix.org/v1.7/rooms/v10/#authorization-rules, particularly 4.5.3 and 4.5.4. // See https://spec.matrix.org/v1.7/rooms/v10/#authorization-rules, particularly 4.5.3 and 4.5.4.
@ -177,8 +177,8 @@ export default class MultiInviter {
if ( if (
!!ourMember && !!ourMember &&
member.powerLevel < ourMember.powerLevel && member.powerLevel < ourMember.powerLevel &&
room.currentState.hasSufficientPowerLevelFor("ban", ourMember.powerLevel) && room.currentState.hasSufficientPowerLevelFor(Membership.Ban, ourMember.powerLevel) &&
room.currentState.hasSufficientPowerLevelFor("kick", ourMember.powerLevel) room.currentState.hasSufficientPowerLevelFor(Membership.Kick, ourMember.powerLevel)
) { ) {
const { finished } = Modal.createDialog(ConfirmUserActionDialog, { const { finished } = Modal.createDialog(ConfirmUserActionDialog, {
member, member,

View file

@ -67,7 +67,10 @@ export async function upgradeRoom(
let toInvite: string[] = []; let toInvite: string[] = [];
if (inviteUsers) { if (inviteUsers) {
toInvite = [...room.getMembersWithMembership("join"), ...room.getMembersWithMembership("invite")] toInvite = [
...room.getMembersWithMembership(Membership.Join),
...room.getMembersWithMembership(Membership.Invite),
]
.map((m) => m.userId) .map((m) => m.userId)
.filter((m) => m !== cli.getUserId()); .filter((m) => m !== cli.getUserId());
} }

View file

@ -52,7 +52,7 @@ function joinedRooms(cli: MatrixClient): Room[] {
return ( return (
cli cli
.getRooms() .getRooms()
.filter((r) => r.getMyMembership() === "join") .filter((r) => r.getMyMembership() === Membership.Join)
// Skip low priority rooms and DMs // Skip low priority rooms and DMs
.filter((r) => !DMRoomMap.shared().getUserIdForRoomId(r.roomId)) .filter((r) => !DMRoomMap.shared().getUserIdForRoomId(r.roomId))
.filter((r) => !Object.keys(r.tags).includes("m.lowpriority")) .filter((r) => !Object.keys(r.tags).includes("m.lowpriority"))

View file

@ -83,7 +83,7 @@ export default class WidgetUtils {
return false; return false;
} }
if (room.getMyMembership() !== "join") { if (room.getMyMembership() !== Membership.Join) {
logger.warn(`User ${me} is not in room ${roomId}`); logger.warn(`User ${me} is not in room ${roomId}`);
return false; return false;
} }

View file

@ -76,7 +76,7 @@ export async function createDmLocalRoom(client: MatrixClient, targets: Member[])
type: EventType.RoomMember, type: EventType.RoomMember,
content: { content: {
displayname: userId, displayname: userId,
membership: "join", membership: MembershipJoin,
}, },
state_key: userId, state_key: userId,
user_id: userId, user_id: userId,
@ -93,7 +93,7 @@ export async function createDmLocalRoom(client: MatrixClient, targets: Member[])
content: { content: {
displayname: target.name, displayname: target.name,
avatar_url: target.getMxcAvatarUrl() ?? undefined, avatar_url: target.getMxcAvatarUrl() ?? undefined,
membership: "invite", membership: Membership.Invite,
isDirect: true, isDirect: true,
}, },
state_key: target.userId, state_key: target.userId,
@ -108,7 +108,7 @@ export async function createDmLocalRoom(client: MatrixClient, targets: Member[])
content: { content: {
displayname: target.name, displayname: target.name,
avatar_url: target.getMxcAvatarUrl() ?? undefined, avatar_url: target.getMxcAvatarUrl() ?? undefined,
membership: "join", membership: Membership.Join,
}, },
state_key: target.userId, state_key: target.userId,
sender: target.userId, sender: target.userId,
@ -118,7 +118,7 @@ export async function createDmLocalRoom(client: MatrixClient, targets: Member[])
}); });
localRoom.targets = targets; localRoom.targets = targets;
localRoom.updateMyMembership("join"); localRoom.updateMyMembership(Membership.Join);
localRoom.addLiveEvents(events); localRoom.addLiveEvents(events);
localRoom.currentState.setStateEvents(events); localRoom.currentState.setStateEvents(events);
localRoom.name = localRoom.getDefaultRoomName(client.getUserId()!); localRoom.name = localRoom.getDefaultRoomName(client.getUserId()!);

View file

@ -42,7 +42,7 @@ function extractSuitableRoom(rooms: Room[], userId: string, findRoomWithThirdpar
// a DM is a room of two people that contains those two people exactly. This does mean // a DM is a room of two people that contains those two people exactly. This does mean
// that bots, assistants, etc will ruin a room's DM-ness, though this is a problem for // that bots, assistants, etc will ruin a room's DM-ness, though this is a problem for
// canonical DMs to solve. // canonical DMs to solve.
if (r && r.getMyMembership() === "join") { if (r && r.getMyMembership() === Membership.Join) {
if (isLocalRoom(r)) return false; if (isLocalRoom(r)) return false;
const functionalUsers = getFunctionalMembers(r); const functionalUsers = getFunctionalMembers(r);

View file

@ -65,10 +65,13 @@ export function splitRoomsByMembership(rooms: Room[]): MembershipSplit {
return split; return split;
} }
export function getEffectiveMembership(membership: string): EffectiveMembership { export function getEffectiveMembership(membership: Membership): EffectiveMembership {
if (membership === "invite") { if (membership === Membership.Invite) {
return EffectiveMembership.Invite; return EffectiveMembership.Invite;
} else if (membership === "join" || (SettingsStore.getValue("feature_ask_to_join") && membership === "knock")) { } else if (
membership === Membership.Join ||
(SettingsStore.getValue("feature_ask_to_join") && membership === Membership.Knock)
) {
return EffectiveMembership.Join; return EffectiveMembership.Join;
} else { } else {
// Probably a leave, kick, or ban // Probably a leave, kick, or ban
@ -81,7 +84,7 @@ export function isKnockDenied(room: Room): boolean | undefined {
const member = memberId ? room.getMember(memberId) : null; const member = memberId ? room.getMember(memberId) : null;
const previousMembership = member?.events.member?.getPrevContent().membership; const previousMembership = member?.events.member?.getPrevContent().membership;
return member?.isKicked() && previousMembership === "knock"; return member?.isKicked() && previousMembership === Membership.Knock;
} }
export function getEffectiveMembershipTag(room: Room, membership?: string): EffectiveMembership { export function getEffectiveMembershipTag(room: Room, membership?: string): EffectiveMembership {
@ -90,7 +93,7 @@ export function getEffectiveMembershipTag(room: Room, membership?: string): Effe
: getEffectiveMembership(membership ?? room.getMyMembership()); : getEffectiveMembership(membership ?? room.getMyMembership());
} }
export function isJoinedOrNearlyJoined(membership: string): boolean { export function isJoinedOrNearlyJoined(membership: Membership): boolean {
const effective = getEffectiveMembership(membership); const effective = getEffectiveMembership(membership);
return effective === EffectiveMembership.Join || effective === EffectiveMembership.Invite; return effective === EffectiveMembership.Join || effective === EffectiveMembership.Invite;
} }

View file

@ -178,7 +178,7 @@ export class RoomPermalinkCreator {
const entries = Object.entries(users); const entries = Object.entries(users);
const allowedEntries = entries.filter(([userId]) => { const allowedEntries = entries.filter(([userId]) => {
const member = this.room?.getMember(userId); const member = this.room?.getMember(userId);
if (!member || member.membership !== "join") { if (!member || member.membership !== Membership.Join) {
return false; return false;
} }
const serverName = getServerName(userId); const serverName = getServerName(userId);

View file

@ -29,5 +29,5 @@ export function canInviteTo(room: Room): boolean {
const canInvite = const canInvite =
!!room.canInvite(client.getSafeUserId()) || !!(room.isSpaceRoom() && room.getJoinRule() === JoinRule.Public); !!room.canInvite(client.getSafeUserId()) || !!(room.isSpaceRoom() && room.getJoinRule() === JoinRule.Public);
return canInvite && room.getMyMembership() === "join" && shouldShowComponent(UIComponent.InviteUsers); return canInvite && room.getMyMembership() === Membership.Join && shouldShowComponent(UIComponent.InviteUsers);
} }

View file

@ -40,7 +40,7 @@ import { SdkContextClass } from "../contexts/SDKContext";
export const shouldShowSpaceSettings = (space: Room): boolean => { export const shouldShowSpaceSettings = (space: Room): boolean => {
const userId = space.client.getUserId()!; const userId = space.client.getUserId()!;
return ( return (
space.getMyMembership() === "join" && space.getMyMembership() === Membership.Join &&
(space.currentState.maySendStateEvent(EventType.RoomAvatar, userId) || (space.currentState.maySendStateEvent(EventType.RoomAvatar, userId) ||
space.currentState.maySendStateEvent(EventType.RoomName, userId) || space.currentState.maySendStateEvent(EventType.RoomName, userId) ||
space.currentState.maySendStateEvent(EventType.RoomTopic, userId) || space.currentState.maySendStateEvent(EventType.RoomTopic, userId) ||
@ -85,7 +85,7 @@ export const showCreateNewRoom = async (space: Room, type?: RoomType): Promise<b
}; };
export const shouldShowSpaceInvite = (space: Room): boolean => export const shouldShowSpaceInvite = (space: Room): boolean =>
((space?.getMyMembership() === "join" && space.canInvite(space.client.getUserId()!)) || ((space?.getMyMembership() === Membership.Join && space.canInvite(space.client.getUserId()!)) ||
space.getJoinRule() === JoinRule.Public) && space.getJoinRule() === JoinRule.Public) &&
shouldShowComponent(UIComponent.InviteUsers); shouldShowComponent(UIComponent.InviteUsers);

View file

@ -102,7 +102,7 @@ function mkStubDM(roomId: string, userId: string) {
name: "Member", name: "Member",
rawDisplayName: "Member", rawDisplayName: "Member",
roomId: roomId, roomId: roomId,
membership: "join", membership: Membership.Join,
getAvatarUrl: () => "mxc://avatar.url/image.png", getAvatarUrl: () => "mxc://avatar.url/image.png",
getMxcAvatarUrl: () => "mxc://avatar.url/image.png", getMxcAvatarUrl: () => "mxc://avatar.url/image.png",
}, },
@ -111,7 +111,7 @@ function mkStubDM(roomId: string, userId: string) {
name: "Member", name: "Member",
rawDisplayName: "Member", rawDisplayName: "Member",
roomId: roomId, roomId: roomId,
membership: "join", membership: Membership.Join,
getAvatarUrl: () => "mxc://avatar.url/image.png", getAvatarUrl: () => "mxc://avatar.url/image.png",
getMxcAvatarUrl: () => "mxc://avatar.url/image.png", getMxcAvatarUrl: () => "mxc://avatar.url/image.png",
}, },
@ -120,7 +120,7 @@ function mkStubDM(roomId: string, userId: string) {
name: "Bot user", name: "Bot user",
rawDisplayName: "Bot user", rawDisplayName: "Bot user",
roomId: roomId, roomId: roomId,
membership: "join", membership: Membership.Join,
getAvatarUrl: () => "mxc://avatar.url/image.png", getAvatarUrl: () => "mxc://avatar.url/image.png",
getMxcAvatarUrl: () => "mxc://avatar.url/image.png", getMxcAvatarUrl: () => "mxc://avatar.url/image.png",
}, },

View file

@ -277,7 +277,7 @@ describe("RoomNotifs test", () => {
}); });
it("indicates the user has been invited to a channel", async () => { it("indicates the user has been invited to a channel", async () => {
room.updateMyMembership("invite"); room.updateMyMembership(Membership.Invite);
const { level, symbol, count } = determineUnreadState(room); const { level, symbol, count } = determineUnreadState(room);
@ -290,9 +290,15 @@ describe("RoomNotifs test", () => {
jest.spyOn(SettingsStore, "getValue").mockImplementation((name) => { jest.spyOn(SettingsStore, "getValue").mockImplementation((name) => {
return name === "feature_ask_to_join"; return name === "feature_ask_to_join";
}); });
const roomMember = mkRoomMember(room.roomId, MatrixClientPeg.get()!.getSafeUserId(), "leave", true, { const roomMember = mkRoomMember(
membership: "knock", room.roomId,
}); MatrixClientPeg.get()!.getSafeUserId(),
Membership.Leave,
true,
{
membership: Membership.Knock,
},
);
jest.spyOn(room, "getMember").mockReturnValue(roomMember); jest.spyOn(room, "getMember").mockReturnValue(roomMember);
const { level, symbol, count } = determineUnreadState(room); const { level, symbol, count } = determineUnreadState(room);

View file

@ -162,7 +162,7 @@ describe("SlashCommands", () => {
it("should warn about self demotion", async () => { it("should warn about self demotion", async () => {
setCurrentRoom(); setCurrentRoom();
const member = new RoomMember(roomId, client.getSafeUserId()); const member = new RoomMember(roomId, client.getSafeUserId());
member.membership = "join"; member.membership = Membership.Join;
member.powerLevel = 100; member.powerLevel = 100;
room.getMember = () => member; room.getMember = () => member;
command.run(client, roomId, null, `${client.getUserId()} 0`); command.run(client, roomId, null, `${client.getUserId()} 0`);
@ -172,7 +172,7 @@ describe("SlashCommands", () => {
it("should default to 50 if no powerlevel specified", async () => { it("should default to 50 if no powerlevel specified", async () => {
setCurrentRoom(); setCurrentRoom();
const member = new RoomMember(roomId, "@user:server"); const member = new RoomMember(roomId, "@user:server");
member.membership = "join"; member.membership = Membership.Join;
room.getMember = () => member; room.getMember = () => member;
command.run(client, roomId, null, member.userId); command.run(client, roomId, null, member.userId);
expect(client.setPowerLevel).toHaveBeenCalledWith(roomId, member.userId, 50); expect(client.setPowerLevel).toHaveBeenCalledWith(roomId, member.userId, 50);
@ -191,7 +191,7 @@ describe("SlashCommands", () => {
it("should warn about self demotion", async () => { it("should warn about self demotion", async () => {
setCurrentRoom(); setCurrentRoom();
const member = new RoomMember(roomId, client.getSafeUserId()); const member = new RoomMember(roomId, client.getSafeUserId());
member.membership = "join"; member.membership = Membership.Join;
member.powerLevel = 100; member.powerLevel = 100;
room.getMember = () => member; room.getMember = () => member;
command.run(client, roomId, null, client.getSafeUserId()); command.run(client, roomId, null, client.getSafeUserId());
@ -366,7 +366,7 @@ describe("SlashCommands", () => {
describe("/join", () => { describe("/join", () => {
beforeEach(() => { beforeEach(() => {
jest.spyOn(dispatcher, "dispatch"); jest.spyOn(dispatcher, "dispatch");
command = findCommand("join")!; command = findCommand(Membership.Join)!;
}); });
it("should return usage if no args", () => { it("should return usage if no args", () => {

View file

@ -504,12 +504,12 @@ describe("TextForEvent", () => {
type: "m.room.member", type: "m.room.member",
sender: "@a:foo", sender: "@a:foo",
content: { content: {
membership: "join", membership: Membership.Join,
avatar_url: "b", avatar_url: "b",
displayname: "Bob", displayname: "Bob",
}, },
prev_content: { prev_content: {
membership: "join", membership: Membership.Join,
avatar_url: "a", avatar_url: "a",
displayname: "Andy", displayname: "Andy",
}, },

View file

@ -171,8 +171,8 @@ describe("MessagePanel", function () {
user: "@user:id", user: "@user:id",
target: bobMember, target: bobMember,
ts: ts0 + i * 1000, ts: ts0 + i * 1000,
mship: "join", mship: Membership.Join,
prevMship: "join", prevMship: Membership.Join,
name: "A user", name: "A user",
}), }),
); );
@ -205,8 +205,8 @@ describe("MessagePanel", function () {
user: "@user:id", user: "@user:id",
target: bobMember, target: bobMember,
ts: ts0 + i * 1000, ts: ts0 + i * 1000,
mship: "join", mship: Membership.Join,
prevMship: "join", prevMship: Membership.Join,
name: "A user", name: "A user",
}), }),
); );
@ -245,7 +245,7 @@ describe("MessagePanel", function () {
user: alice, user: alice,
target: aliceMember, target: aliceMember,
ts: ts0 + 1, ts: ts0 + 1,
mship: "join", mship: Membership.Join,
name: "Alice", name: "Alice",
}), }),
mkEvent({ mkEvent({
@ -285,7 +285,7 @@ describe("MessagePanel", function () {
skey: "@bob:example.org", skey: "@bob:example.org",
target: bobMember, target: bobMember,
ts: ts0 + 5, ts: ts0 + 5,
mship: "invite", mship: Membership.Invite,
name: "Bob", name: "Bob",
}), }),
]; ];
@ -542,8 +542,8 @@ describe("MessagePanel", function () {
user: "@user:id", user: "@user:id",
target: bobMember, target: bobMember,
ts: Date.now(), ts: Date.now(),
mship: "join", mship: Membership.Join,
prevMship: "join", prevMship: Membership.Join,
name: "A user", name: "A user",
}), }),
]; ];
@ -571,8 +571,8 @@ describe("MessagePanel", function () {
user: "@user:id", user: "@user:id",
target: bobMember, target: bobMember,
ts: Date.now(), ts: Date.now(),
mship: "join", mship: Membership.Join,
prevMship: "join", prevMship: Membership.Join,
name: "A user", name: "A user",
}), }),
...events, ...events,
@ -695,8 +695,8 @@ describe("MessagePanel", function () {
for (let i = 0; i < 100; i++) { for (let i = 0; i < 100; i++) {
events.push( events.push(
TestUtilsMatrix.mkMembership({ TestUtilsMatrix.mkMembership({
mship: "join", mship: Membership.Join,
prevMship: "join", prevMship: Membership.Join,
room: "!room:id", room: "!room:id",
user: "@user:id", user: "@user:id",
event: true, event: true,
@ -716,8 +716,8 @@ describe("MessagePanel", function () {
for (let i = 0; i < 100; i++) { for (let i = 0; i < 100; i++) {
events.push( events.push(
TestUtilsMatrix.mkMembership({ TestUtilsMatrix.mkMembership({
mship: "join", mship: Membership.Join,
prevMship: "join", prevMship: Membership.Join,
room: "!room:id", room: "!room:id",
user: "@user:id", user: "@user:id",
event: true, event: true,

View file

@ -238,7 +238,7 @@ describe("RoomView", () => {
}); });
it("updates url preview visibility on encryption state change", async () => { it("updates url preview visibility on encryption state change", async () => {
room.getMyMembership = jest.fn().mockReturnValue("join"); room.getMyMembership = jest.fn().mockReturnValue(Membership.Join);
// we should be starting unencrypted // we should be starting unencrypted
expect(cli.isCryptoEnabled()).toEqual(false); expect(cli.isCryptoEnabled()).toEqual(false);
expect(cli.isRoomEncrypted(room.roomId)).toEqual(false); expect(cli.isRoomEncrypted(room.roomId)).toEqual(false);
@ -583,7 +583,7 @@ describe("RoomView", () => {
it("allows to cancel a join request", async () => { it("allows to cancel a join request", async () => {
jest.spyOn(MatrixClientPeg, "safeGet").mockReturnValue(client); jest.spyOn(MatrixClientPeg, "safeGet").mockReturnValue(client);
jest.spyOn(client, "leave").mockResolvedValue({}); jest.spyOn(client, "leave").mockResolvedValue({});
jest.spyOn(room, "getMyMembership").mockReturnValue("knock"); jest.spyOn(room, "getMyMembership").mockReturnValue(Membership.Knock);
await mountRoomView(); await mountRoomView();
fireEvent.click(screen.getByRole("button", { name: "Cancel request" })); fireEvent.click(screen.getByRole("button", { name: "Cancel request" }));
@ -594,7 +594,7 @@ describe("RoomView", () => {
}); });
it("should close search results when edit is clicked", async () => { it("should close search results when edit is clicked", async () => {
room.getMyMembership = jest.fn().mockReturnValue("join"); room.getMyMembership = jest.fn().mockReturnValue(Membership.Join);
const eventMapper = (obj: Partial<IEvent>) => new MatrixEvent(obj); const eventMapper = (obj: Partial<IEvent>) => new MatrixEvent(obj);
@ -655,7 +655,7 @@ describe("RoomView", () => {
const room2 = new Room(`!${roomCount++}:example.org`, cli, "@alice:example.org"); const room2 = new Room(`!${roomCount++}:example.org`, cli, "@alice:example.org");
rooms.set(room2.roomId, room2); rooms.set(room2.roomId, room2);
room.getMyMembership = jest.fn().mockReturnValue("join"); room.getMyMembership = jest.fn().mockReturnValue(Membership.Join);
const eventMapper = (obj: Partial<IEvent>) => new MatrixEvent(obj); const eventMapper = (obj: Partial<IEvent>) => new MatrixEvent(obj);

View file

@ -181,7 +181,7 @@ describe("SpaceHierarchy", () => {
mocked(client.getRoom).mockImplementation( mocked(client.getRoom).mockImplementation(
(roomId) => client.getRooms().find((room) => room.roomId === roomId) ?? null, (roomId) => client.getRooms().find((room) => room.roomId === roomId) ?? null,
); );
[room1, room2, space1, room3].forEach((r) => mocked(r.getMyMembership).mockReturnValue("leave")); [room1, room2, space1, room3].forEach((r) => mocked(r.getMyMembership).mockReturnValue(Membership.Leave));
const hierarchyRoot: HierarchyRoom = { const hierarchyRoot: HierarchyRoom = {
room_id: root.roomId, room_id: root.roomId,

View file

@ -988,8 +988,8 @@ describe("TimelinePanel", () => {
events.forEach((event) => timelineSet.getLiveTimeline().addEvent(event, { toStartOfTimeline: true })); events.forEach((event) => timelineSet.getLiveTimeline().addEvent(event, { toStartOfTimeline: true }));
const roomMembership = mkMembership({ const roomMembership = mkMembership({
mship: "join", mship: Membership.Join,
prevMship: "join", prevMship: Membership.Join,
user: authorId, user: authorId,
room: room.roomId, room: room.roomId,
event: true, event: true,
@ -999,7 +999,7 @@ describe("TimelinePanel", () => {
events.push(roomMembership); events.push(roomMembership);
const member = new RoomMember(room.roomId, authorId); const member = new RoomMember(room.roomId, authorId);
member.membership = "join"; member.membership = Membership.Join;
const roomState = new RoomState(room.roomId); const roomState = new RoomState(room.roomId);
jest.spyOn(roomState, "getMember").mockReturnValue(member); jest.spyOn(roomState, "getMember").mockReturnValue(member);

View file

@ -106,7 +106,7 @@ describe("RoomContextMenu", () => {
it("should render notification option for joined rooms", () => { it("should render notification option for joined rooms", () => {
const chamber = EchoChamber.forRoom(room); const chamber = EchoChamber.forRoom(room);
chamber.notificationVolume = RoomNotifState.Mute; chamber.notificationVolume = RoomNotifState.Mute;
jest.spyOn(room, "getMyMembership").mockReturnValue("join"); jest.spyOn(room, "getMyMembership").mockReturnValue(Membership.Join);
renderComponent(); renderComponent();
expect( expect(

View file

@ -105,7 +105,7 @@ describe("RoomGeneralContextMenu", () => {
}); });
it("does not render invite menu item when UIComponent customisations disable room invite", () => { it("does not render invite menu item when UIComponent customisations disable room invite", () => {
room.updateMyMembership("join"); room.updateMyMembership(Membership.Join);
jest.spyOn(room, "canInvite").mockReturnValue(true); jest.spyOn(room, "canInvite").mockReturnValue(true);
mocked(shouldShowComponent).mockReturnValue(false); mocked(shouldShowComponent).mockReturnValue(false);
@ -116,7 +116,7 @@ describe("RoomGeneralContextMenu", () => {
}); });
it("renders invite menu item when UIComponent customisations enables room invite", () => { it("renders invite menu item when UIComponent customisations enables room invite", () => {
room.updateMyMembership("join"); room.updateMyMembership(Membership.Join);
jest.spyOn(room, "canInvite").mockReturnValue(true); jest.spyOn(room, "canInvite").mockReturnValue(true);
mocked(shouldShowComponent).mockReturnValue(true); mocked(shouldShowComponent).mockReturnValue(true);

View file

@ -25,7 +25,7 @@ describe("ConfirmUserActionDialog", () => {
const { asFragment } = render( const { asFragment } = render(
<ConfirmUserActionDialog <ConfirmUserActionDialog
onFinished={jest.fn()} onFinished={jest.fn()}
member={mkRoomMember("123", "@user:test.com", "join")} member={mkRoomMember("123", "@user:test.com", Membership.Join)}
action="Ban" action="Ban"
title="Ban this " // eg. 'Ban this user?' title="Ban this " // eg. 'Ban this user?'
/>, />,

View file

@ -163,7 +163,7 @@ describe("InviteDialog", () => {
mkMembership({ mkMembership({
event: true, event: true,
room: roomId, room: roomId,
mship: "join", mship: Membership.Join,
user: aliceId, user: aliceId,
skey: aliceId, skey: aliceId,
}), }),

View file

@ -158,9 +158,9 @@ describe("Spotlight Dialog", () => {
beforeEach(() => { beforeEach(() => {
mockedClient = mockClient({ rooms: [testPublicRoom], users: [testPerson] }); mockedClient = mockClient({ rooms: [testPublicRoom], users: [testPerson] });
testRoom = mkRoom(mockedClient, "!test23:example.com"); testRoom = mkRoom(mockedClient, "!test23:example.com");
mocked(testRoom.getMyMembership).mockReturnValue("join"); mocked(testRoom.getMyMembership).mockReturnValue(Membership.Join);
testLocalRoom = new LocalRoom(LOCAL_ROOM_ID_PREFIX + "test23", mockedClient, mockedClient.getUserId()!); testLocalRoom = new LocalRoom(LOCAL_ROOM_ID_PREFIX + "test23", mockedClient, mockedClient.getUserId()!);
testLocalRoom.updateMyMembership("join"); testLocalRoom.updateMyMembership(Membership.Join);
mocked(mockedClient.getVisibleRooms).mockReturnValue([testRoom, testLocalRoom]); mocked(mockedClient.getVisibleRooms).mockReturnValue([testRoom, testLocalRoom]);
jest.spyOn(DMRoomMap, "shared").mockReturnValue({ jest.spyOn(DMRoomMap, "shared").mockReturnValue({
@ -169,7 +169,7 @@ describe("Spotlight Dialog", () => {
testDM = mkRoom(mockedClient, testDMRoomId); testDM = mkRoom(mockedClient, testDMRoomId);
testDM.name = "Chat with Alice"; testDM.name = "Chat with Alice";
mocked(testDM.getMyMembership).mockReturnValue("join"); mocked(testDM.getMyMembership).mockReturnValue(Membership.Join);
mocked(DMRoomMap.shared().getUserIdForRoomId).mockImplementation((roomId: string) => { mocked(DMRoomMap.shared().getUserIdForRoomId).mockImplementation((roomId: string) => {
if (roomId === testDMRoomId) { if (roomId === testDMRoomId) {

View file

@ -61,8 +61,8 @@ describe("EventListSummary", function () {
interface MembershipEventParams { interface MembershipEventParams {
senderId?: string; senderId?: string;
userId?: string; userId?: string;
membership: string; membership: Membership;
prevMembership?: string; prevMembership?: Membership;
} }
const generateMembershipEvent = ( const generateMembershipEvent = (
eventId: string, eventId: string,
@ -145,7 +145,9 @@ describe("EventListSummary", function () {
}); });
it("renders expanded events if there are less than props.threshold", function () { it("renders expanded events if there are less than props.threshold", function () {
const events = generateEvents([{ userId: "@user_1:some.domain", prevMembership: "leave", membership: "join" }]); const events = generateEvents([
{ userId: "@user_1:some.domain", prevMembership: Membership.Leave, membership: Membership.Join },
]);
const props = { const props = {
events: events, events: events,
children: generateTiles(events), children: generateTiles(events),
@ -163,8 +165,8 @@ describe("EventListSummary", function () {
it("renders expanded events if there are less than props.threshold for join and leave", function () { it("renders expanded events if there are less than props.threshold for join and leave", function () {
const events = generateEvents([ const events = generateEvents([
{ userId: "@user_1:some.domain", prevMembership: "leave", membership: "join" }, { userId: "@user_1:some.domain", prevMembership: Membership.Leave, membership: Membership.Join },
{ userId: "@user_1:some.domain", prevMembership: "join", membership: "leave" }, { userId: "@user_1:some.domain", prevMembership: Membership.Join, membership: Membership.Leave },
]); ]);
const props = { const props = {
events: events, events: events,
@ -184,9 +186,9 @@ describe("EventListSummary", function () {
it("renders collapsed events if events.length = props.threshold", function () { it("renders collapsed events if events.length = props.threshold", function () {
const events = generateEvents([ const events = generateEvents([
{ userId: "@user_1:some.domain", prevMembership: "leave", membership: "join" }, { userId: "@user_1:some.domain", prevMembership: Membership.Leave, membership: Membership.Join },
{ userId: "@user_1:some.domain", prevMembership: "join", membership: "leave" }, { userId: "@user_1:some.domain", prevMembership: Membership.Join, membership: Membership.Leave },
{ userId: "@user_1:some.domain", prevMembership: "leave", membership: "join" }, { userId: "@user_1:some.domain", prevMembership: Membership.Leave, membership: Membership.Join },
]); ]);
const props = { const props = {
events: events, events: events,
@ -203,20 +205,20 @@ describe("EventListSummary", function () {
it("truncates long join,leave repetitions", function () { it("truncates long join,leave repetitions", function () {
const events = generateEvents([ const events = generateEvents([
{ userId: "@user_1:some.domain", prevMembership: "leave", membership: "join" }, { userId: "@user_1:some.domain", prevMembership: Membership.Leave, membership: Membership.Join },
{ userId: "@user_1:some.domain", prevMembership: "join", membership: "leave" }, { userId: "@user_1:some.domain", prevMembership: Membership.Join, membership: Membership.Leave },
{ userId: "@user_1:some.domain", prevMembership: "leave", membership: "join" }, { userId: "@user_1:some.domain", prevMembership: Membership.Leave, membership: Membership.Join },
{ userId: "@user_1:some.domain", prevMembership: "join", membership: "leave" }, { userId: "@user_1:some.domain", prevMembership: Membership.Join, membership: Membership.Leave },
{ userId: "@user_1:some.domain", prevMembership: "leave", membership: "join" }, { userId: "@user_1:some.domain", prevMembership: Membership.Leave, membership: Membership.Join },
{ userId: "@user_1:some.domain", prevMembership: "join", membership: "leave" }, { userId: "@user_1:some.domain", prevMembership: Membership.Join, membership: Membership.Leave },
{ userId: "@user_1:some.domain", prevMembership: "leave", membership: "join" }, { userId: "@user_1:some.domain", prevMembership: Membership.Leave, membership: Membership.Join },
{ userId: "@user_1:some.domain", prevMembership: "join", membership: "leave" }, { userId: "@user_1:some.domain", prevMembership: Membership.Join, membership: Membership.Leave },
{ userId: "@user_1:some.domain", prevMembership: "leave", membership: "join" }, { userId: "@user_1:some.domain", prevMembership: Membership.Leave, membership: Membership.Join },
{ userId: "@user_1:some.domain", prevMembership: "join", membership: "leave" }, { userId: "@user_1:some.domain", prevMembership: Membership.Join, membership: Membership.Leave },
{ userId: "@user_1:some.domain", prevMembership: "leave", membership: "join" }, { userId: "@user_1:some.domain", prevMembership: Membership.Leave, membership: Membership.Join },
{ userId: "@user_1:some.domain", prevMembership: "join", membership: "leave" }, { userId: "@user_1:some.domain", prevMembership: Membership.Join, membership: Membership.Leave },
{ userId: "@user_1:some.domain", prevMembership: "leave", membership: "join" }, { userId: "@user_1:some.domain", prevMembership: Membership.Leave, membership: Membership.Join },
{ userId: "@user_1:some.domain", prevMembership: "join", membership: "leave" }, { userId: "@user_1:some.domain", prevMembership: Membership.Join, membership: Membership.Leave },
]); ]);
const props = { const props = {
events: events, events: events,
@ -235,28 +237,28 @@ describe("EventListSummary", function () {
const events = generateEvents([ const events = generateEvents([
{ {
userId: "@user_1:some.domain", userId: "@user_1:some.domain",
prevMembership: "ban", prevMembership: Membership.Ban,
membership: "leave", membership: Membership.Leave,
senderId: "@some_other_user:some.domain", senderId: "@some_other_user:some.domain",
}, },
{ userId: "@user_1:some.domain", prevMembership: "leave", membership: "join" }, { userId: "@user_1:some.domain", prevMembership: Membership.Leave, membership: Membership.Join },
{ userId: "@user_1:some.domain", prevMembership: "join", membership: "leave" }, { userId: "@user_1:some.domain", prevMembership: Membership.Join, membership: Membership.Leave },
{ userId: "@user_1:some.domain", prevMembership: "leave", membership: "join" }, { userId: "@user_1:some.domain", prevMembership: Membership.Leave, membership: Membership.Join },
{ userId: "@user_1:some.domain", prevMembership: "join", membership: "leave" }, { userId: "@user_1:some.domain", prevMembership: Membership.Join, membership: Membership.Leave },
{ userId: "@user_1:some.domain", prevMembership: "leave", membership: "join" }, { userId: "@user_1:some.domain", prevMembership: Membership.Leave, membership: Membership.Join },
{ userId: "@user_1:some.domain", prevMembership: "join", membership: "leave" }, { userId: "@user_1:some.domain", prevMembership: Membership.Join, membership: Membership.Leave },
{ userId: "@user_1:some.domain", prevMembership: "leave", membership: "join" }, { userId: "@user_1:some.domain", prevMembership: Membership.Leave, membership: Membership.Join },
{ userId: "@user_1:some.domain", prevMembership: "join", membership: "leave" }, { userId: "@user_1:some.domain", prevMembership: Membership.Join, membership: Membership.Leave },
{ userId: "@user_1:some.domain", prevMembership: "leave", membership: "join" }, { userId: "@user_1:some.domain", prevMembership: Membership.Leave, membership: Membership.Join },
{ userId: "@user_1:some.domain", prevMembership: "join", membership: "leave" }, { userId: "@user_1:some.domain", prevMembership: Membership.Join, membership: Membership.Leave },
{ userId: "@user_1:some.domain", prevMembership: "leave", membership: "join" }, { userId: "@user_1:some.domain", prevMembership: Membership.Leave, membership: Membership.Join },
{ userId: "@user_1:some.domain", prevMembership: "join", membership: "leave" }, { userId: "@user_1:some.domain", prevMembership: Membership.Join, membership: Membership.Leave },
{ userId: "@user_1:some.domain", prevMembership: "leave", membership: "join" }, { userId: "@user_1:some.domain", prevMembership: Membership.Leave, membership: Membership.Join },
{ userId: "@user_1:some.domain", prevMembership: "join", membership: "leave" }, { userId: "@user_1:some.domain", prevMembership: Membership.Join, membership: Membership.Leave },
{ {
userId: "@user_1:some.domain", userId: "@user_1:some.domain",
prevMembership: "leave", prevMembership: Membership.Leave,
membership: "invite", membership: Membership.Invite,
senderId: "@some_other_user:some.domain", senderId: "@some_other_user:some.domain",
}, },
]); ]);
@ -277,30 +279,30 @@ describe("EventListSummary", function () {
const events = generateEvents([ const events = generateEvents([
{ {
userId: "@user_1:some.domain", userId: "@user_1:some.domain",
prevMembership: "ban", prevMembership: Membership.Ban,
membership: "leave", membership: Membership.Leave,
senderId: "@some_other_user:some.domain", senderId: "@some_other_user:some.domain",
}, },
{ userId: "@user_1:some.domain", prevMembership: "leave", membership: "join" }, { userId: "@user_1:some.domain", prevMembership: Membership.Leave, membership: Membership.Join },
{ userId: "@user_1:some.domain", prevMembership: "join", membership: "leave" }, { userId: "@user_1:some.domain", prevMembership: Membership.Join, membership: Membership.Leave },
{ userId: "@user_1:some.domain", prevMembership: "leave", membership: "join" }, { userId: "@user_1:some.domain", prevMembership: Membership.Leave, membership: Membership.Join },
{ userId: "@user_1:some.domain", prevMembership: "join", membership: "leave" }, { userId: "@user_1:some.domain", prevMembership: Membership.Join, membership: Membership.Leave },
{ {
userId: "@user_1:some.domain", userId: "@user_1:some.domain",
prevMembership: "leave", prevMembership: Membership.Leave,
membership: "ban", membership: Membership.Ban,
senderId: "@some_other_user:some.domain", senderId: "@some_other_user:some.domain",
}, },
{ userId: "@user_1:some.domain", prevMembership: "ban", membership: "join" }, { userId: "@user_1:some.domain", prevMembership: Membership.Ban, membership: Membership.Join },
{ userId: "@user_1:some.domain", prevMembership: "join", membership: "leave" }, { userId: "@user_1:some.domain", prevMembership: Membership.Join, membership: Membership.Leave },
{ userId: "@user_1:some.domain", prevMembership: "leave", membership: "join" }, { userId: "@user_1:some.domain", prevMembership: Membership.Leave, membership: Membership.Join },
{ userId: "@user_1:some.domain", prevMembership: "join", membership: "leave" }, { userId: "@user_1:some.domain", prevMembership: Membership.Join, membership: Membership.Leave },
{ userId: "@user_1:some.domain", prevMembership: "leave", membership: "join" }, { userId: "@user_1:some.domain", prevMembership: Membership.Leave, membership: Membership.Join },
{ userId: "@user_1:some.domain", prevMembership: "join", membership: "leave" }, { userId: "@user_1:some.domain", prevMembership: Membership.Join, membership: Membership.Leave },
{ {
userId: "@user_1:some.domain", userId: "@user_1:some.domain",
prevMembership: "leave", prevMembership: Membership.Leave,
membership: "invite", membership: Membership.Invite,
senderId: "@some_other_user:some.domain", senderId: "@some_other_user:some.domain",
}, },
]); ]);
@ -324,35 +326,35 @@ describe("EventListSummary", function () {
// user_1 // user_1
{ {
userId: "@user_1:some.domain", userId: "@user_1:some.domain",
prevMembership: "ban", prevMembership: Membership.Ban,
membership: "leave", membership: Membership.Leave,
senderId: "@some_other_user:some.domain", senderId: "@some_other_user:some.domain",
}, },
{ userId: "@user_1:some.domain", prevMembership: "leave", membership: "join" }, { userId: "@user_1:some.domain", prevMembership: Membership.Leave, membership: Membership.Join },
{ userId: "@user_1:some.domain", prevMembership: "join", membership: "leave" }, { userId: "@user_1:some.domain", prevMembership: Membership.Join, membership: Membership.Leave },
{ userId: "@user_1:some.domain", prevMembership: "leave", membership: "join" }, { userId: "@user_1:some.domain", prevMembership: Membership.Leave, membership: Membership.Join },
{ userId: "@user_1:some.domain", prevMembership: "join", membership: "leave" }, { userId: "@user_1:some.domain", prevMembership: Membership.Join, membership: Membership.Leave },
{ {
userId: "@user_1:some.domain", userId: "@user_1:some.domain",
prevMembership: "leave", prevMembership: Membership.Leave,
membership: "ban", membership: Membership.Ban,
senderId: "@some_other_user:some.domain", senderId: "@some_other_user:some.domain",
}, },
// user_2 // user_2
{ {
userId: "@user_2:some.domain", userId: "@user_2:some.domain",
prevMembership: "ban", prevMembership: Membership.Ban,
membership: "leave", membership: Membership.Leave,
senderId: "@some_other_user:some.domain", senderId: "@some_other_user:some.domain",
}, },
{ userId: "@user_2:some.domain", prevMembership: "leave", membership: "join" }, { userId: "@user_2:some.domain", prevMembership: Membership.Leave, membership: Membership.Join },
{ userId: "@user_2:some.domain", prevMembership: "join", membership: "leave" }, { userId: "@user_2:some.domain", prevMembership: Membership.Join, membership: Membership.Leave },
{ userId: "@user_2:some.domain", prevMembership: "leave", membership: "join" }, { userId: "@user_2:some.domain", prevMembership: Membership.Leave, membership: Membership.Join },
{ userId: "@user_2:some.domain", prevMembership: "join", membership: "leave" }, { userId: "@user_2:some.domain", prevMembership: Membership.Join, membership: Membership.Leave },
{ {
userId: "@user_2:some.domain", userId: "@user_2:some.domain",
prevMembership: "leave", prevMembership: Membership.Leave,
membership: "ban", membership: Membership.Ban,
senderId: "@some_other_user:some.domain", senderId: "@some_other_user:some.domain",
}, },
]); ]);
@ -374,17 +376,17 @@ describe("EventListSummary", function () {
it("handles many users following the same sequence of memberships", function () { it("handles many users following the same sequence of memberships", function () {
const events = generateEventsForUsers("@user_$:some.domain", 20, [ const events = generateEventsForUsers("@user_$:some.domain", 20, [
{ {
prevMembership: "ban", prevMembership: Membership.Ban,
membership: "leave", membership: Membership.Leave,
senderId: "@some_other_user:some.domain", senderId: "@some_other_user:some.domain",
}, },
{ prevMembership: "leave", membership: "join" }, { prevMembership: Membership.Leave, membership: Membership.Join },
{ prevMembership: "join", membership: "leave" }, { prevMembership: Membership.Join, membership: Membership.Leave },
{ prevMembership: "leave", membership: "join" }, { prevMembership: Membership.Leave, membership: Membership.Join },
{ prevMembership: "join", membership: "leave" }, { prevMembership: Membership.Join, membership: Membership.Leave },
{ {
prevMembership: "leave", prevMembership: Membership.Leave,
membership: "ban", membership: Membership.Ban,
senderId: "@some_other_user:some.domain", senderId: "@some_other_user:some.domain",
}, },
]); ]);
@ -407,30 +409,30 @@ describe("EventListSummary", function () {
const events = generateEvents([ const events = generateEvents([
{ {
userId: "@user_2:some.domain", userId: "@user_2:some.domain",
prevMembership: "ban", prevMembership: Membership.Ban,
membership: "leave", membership: Membership.Leave,
senderId: "@some_other_user:some.domain", senderId: "@some_other_user:some.domain",
}, },
{ {
userId: "@user_1:some.domain", userId: "@user_1:some.domain",
prevMembership: "ban", prevMembership: Membership.Ban,
membership: "leave", membership: Membership.Leave,
senderId: "@some_other_user:some.domain", senderId: "@some_other_user:some.domain",
}, },
{ userId: "@user_1:some.domain", prevMembership: "leave", membership: "join" }, { userId: "@user_1:some.domain", prevMembership: Membership.Leave, membership: Membership.Join },
{ userId: "@user_1:some.domain", prevMembership: "join", membership: "leave" }, { userId: "@user_1:some.domain", prevMembership: Membership.Join, membership: Membership.Leave },
{ userId: "@user_1:some.domain", prevMembership: "leave", membership: "join" }, { userId: "@user_1:some.domain", prevMembership: Membership.Leave, membership: Membership.Join },
{ userId: "@user_1:some.domain", prevMembership: "join", membership: "leave" }, { userId: "@user_1:some.domain", prevMembership: Membership.Join, membership: Membership.Leave },
{ {
userId: "@user_1:some.domain", userId: "@user_1:some.domain",
prevMembership: "leave", prevMembership: Membership.Leave,
membership: "ban", membership: Membership.Ban,
senderId: "@some_other_user:some.domain", senderId: "@some_other_user:some.domain",
}, },
{ userId: "@user_2:some.domain", prevMembership: "leave", membership: "join" }, { userId: "@user_2:some.domain", prevMembership: Membership.Leave, membership: Membership.Join },
{ userId: "@user_2:some.domain", prevMembership: "join", membership: "leave" }, { userId: "@user_2:some.domain", prevMembership: Membership.Join, membership: Membership.Leave },
{ userId: "@user_2:some.domain", prevMembership: "leave", membership: "join" }, { userId: "@user_2:some.domain", prevMembership: Membership.Leave, membership: Membership.Join },
{ userId: "@user_2:some.domain", prevMembership: "join", membership: "leave" }, { userId: "@user_2:some.domain", prevMembership: Membership.Join, membership: Membership.Leave },
]); ]);
const props = { const props = {
events: events, events: events,
@ -451,52 +453,52 @@ describe("EventListSummary", function () {
it("correctly identifies transitions", function () { it("correctly identifies transitions", function () {
const events = generateEvents([ const events = generateEvents([
// invited // invited
{ userId: "@user_1:some.domain", membership: "invite" }, { userId: "@user_1:some.domain", membership: Membership.Invite },
// banned // banned
{ userId: "@user_1:some.domain", membership: "ban" }, { userId: "@user_1:some.domain", membership: Membership.Ban },
// joined // joined
{ userId: "@user_1:some.domain", membership: "join" }, { userId: "@user_1:some.domain", membership: Membership.Join },
// invite_reject // invite_reject
{ {
userId: "@user_1:some.domain", userId: "@user_1:some.domain",
prevMembership: "invite", prevMembership: Membership.Invite,
membership: "leave", membership: Membership.Leave,
}, },
// left // left
{ userId: "@user_1:some.domain", prevMembership: "join", membership: "leave" }, { userId: "@user_1:some.domain", prevMembership: Membership.Join, membership: Membership.Leave },
// invite_withdrawal // invite_withdrawal
{ {
userId: "@user_1:some.domain", userId: "@user_1:some.domain",
prevMembership: "invite", prevMembership: Membership.Invite,
membership: "leave", membership: Membership.Leave,
senderId: "@some_other_user:some.domain", senderId: "@some_other_user:some.domain",
}, },
// unbanned // unbanned
{ {
userId: "@user_1:some.domain", userId: "@user_1:some.domain",
prevMembership: "ban", prevMembership: Membership.Ban,
membership: "leave", membership: Membership.Leave,
senderId: "@some_other_user:some.domain", senderId: "@some_other_user:some.domain",
}, },
// kicked // kicked
{ {
userId: "@user_1:some.domain", userId: "@user_1:some.domain",
prevMembership: "join", prevMembership: Membership.Join,
membership: "leave", membership: Membership.Leave,
senderId: "@some_other_user:some.domain", senderId: "@some_other_user:some.domain",
}, },
// default for sender=target (leave) // default for sender=target (leave)
{ {
userId: "@user_1:some.domain", userId: "@user_1:some.domain",
prevMembership: "????", prevMembership: "????" as Membership,
membership: "leave", membership: Membership.Leave,
senderId: "@user_1:some.domain", senderId: "@user_1:some.domain",
}, },
// default for sender<>target (kicked) // default for sender<>target (kicked)
{ {
userId: "@user_1:some.domain", userId: "@user_1:some.domain",
prevMembership: "????", prevMembership: "????" as Membership,
membership: "leave", membership: Membership.Leave,
senderId: "@some_other_user:some.domain", senderId: "@some_other_user:some.domain",
}, },
]); ]);
@ -520,24 +522,24 @@ describe("EventListSummary", function () {
const events = generateEvents([ const events = generateEvents([
{ {
userId: "@user_1:some.domain", userId: "@user_1:some.domain",
prevMembership: "invite", prevMembership: Membership.Invite,
membership: "leave", membership: Membership.Leave,
}, },
{ {
userId: "@user_1:some.domain", userId: "@user_1:some.domain",
prevMembership: "invite", prevMembership: Membership.Invite,
membership: "leave", membership: Membership.Leave,
senderId: "@some_other_user:some.domain", senderId: "@some_other_user:some.domain",
}, },
{ {
userId: "@user_2:some.domain", userId: "@user_2:some.domain",
prevMembership: "invite", prevMembership: Membership.Invite,
membership: "leave", membership: Membership.Leave,
}, },
{ {
userId: "@user_2:some.domain", userId: "@user_2:some.domain",
prevMembership: "invite", prevMembership: Membership.Invite,
membership: "leave", membership: Membership.Leave,
senderId: "@some_other_user:some.domain", senderId: "@some_other_user:some.domain",
}, },
]); ]);
@ -560,13 +562,13 @@ describe("EventListSummary", function () {
const events = generateEvents([ const events = generateEvents([
{ {
userId: "@user_1:some.domain", userId: "@user_1:some.domain",
prevMembership: "invite", prevMembership: Membership.Invite,
membership: "leave", membership: Membership.Leave,
}, },
{ {
userId: "@user_1:some.domain", userId: "@user_1:some.domain",
prevMembership: "invite", prevMembership: Membership.Invite,
membership: "leave", membership: Membership.Leave,
}, },
]); ]);
const props = { const props = {
@ -584,10 +586,10 @@ describe("EventListSummary", function () {
it('handles a summary length = 2, with no "others"', function () { it('handles a summary length = 2, with no "others"', function () {
const events = generateEvents([ const events = generateEvents([
{ userId: "@user_1:some.domain", membership: "join" }, { userId: "@user_1:some.domain", membership: Membership.Join },
{ userId: "@user_1:some.domain", membership: "join" }, { userId: "@user_1:some.domain", membership: Membership.Join },
{ userId: "@user_2:some.domain", membership: "join" }, { userId: "@user_2:some.domain", membership: Membership.Join },
{ userId: "@user_2:some.domain", membership: "join" }, { userId: "@user_2:some.domain", membership: Membership.Join },
]); ]);
const props = { const props = {
events: events, events: events,
@ -604,9 +606,9 @@ describe("EventListSummary", function () {
it('handles a summary length = 2, with 1 "other"', function () { it('handles a summary length = 2, with 1 "other"', function () {
const events = generateEvents([ const events = generateEvents([
{ userId: "@user_1:some.domain", membership: "join" }, { userId: "@user_1:some.domain", membership: Membership.Join },
{ userId: "@user_2:some.domain", membership: "join" }, { userId: "@user_2:some.domain", membership: Membership.Join },
{ userId: "@user_3:some.domain", membership: "join" }, { userId: "@user_3:some.domain", membership: Membership.Join },
]); ]);
const props = { const props = {
events: events, events: events,
@ -622,7 +624,7 @@ describe("EventListSummary", function () {
}); });
it('handles a summary length = 2, with many "others"', function () { it('handles a summary length = 2, with many "others"', function () {
const events = generateEventsForUsers("@user_$:some.domain", 20, [{ membership: "join" }]); const events = generateEventsForUsers("@user_$:some.domain", 20, [{ membership: Membership.Join }]);
const props = { const props = {
events: events, events: events,
children: generateTiles(events), children: generateTiles(events),

View file

@ -21,7 +21,7 @@ import { mkRoomMember } from "../../../test-utils";
describe("<FacePile />", () => { describe("<FacePile />", () => {
it("renders with a tooltip", () => { it("renders with a tooltip", () => {
const member = mkRoomMember("123", "456", "join"); const member = mkRoomMember("123", "456", Membership.Join);
const { asFragment } = render( const { asFragment } = render(
<FacePile members={[member]} size="36px" overflow={false} tooltipLabel="tooltip" />, <FacePile members={[member]} size="36px" overflow={false} tooltipLabel="tooltip" />,

View file

@ -27,7 +27,9 @@ describe("<RoomFacePile />", () => {
DMRoomMap.makeShared(cli); DMRoomMap.makeShared(cli);
const room = mkRoom(cli, "!123"); const room = mkRoom(cli, "!123");
jest.spyOn(room, "getJoinedMembers").mockReturnValue([mkRoomMember(room.roomId, "@bob:example.org", "join")]); jest.spyOn(room, "getJoinedMembers").mockReturnValue([
mkRoomMember(room.roomId, "@bob:example.org", Membership.Join),
]);
const { asFragment } = render( const { asFragment } = render(
<TooltipProvider> <TooltipProvider>

View file

@ -86,7 +86,7 @@ describe("<RoomSummaryCard />", () => {
state_key: "", state_key: "",
}); });
room.currentState.setStateEvents([roomCreateEvent]); room.currentState.setStateEvents([roomCreateEvent]);
room.updateMyMembership("join"); room.updateMyMembership(Membership.Join);
jest.spyOn(Modal, "createDialog"); jest.spyOn(Modal, "createDialog");
jest.spyOn(RightPanelStore.instance, "pushCard"); jest.spyOn(RightPanelStore.instance, "pushCard");

View file

@ -943,8 +943,8 @@ describe("<PowerLevelEditor />", () => {
describe("<RoomKickButton />", () => { describe("<RoomKickButton />", () => {
const defaultMember = new RoomMember(defaultRoomId, defaultUserId); const defaultMember = new RoomMember(defaultRoomId, defaultUserId);
const memberWithInviteMembership = { ...defaultMember, membership: "invite" }; const memberWithInviteMembership = { ...defaultMember, membership: Membership.Invite };
const memberWithJoinMembership = { ...defaultMember, membership: "join" }; const memberWithJoinMembership = { ...defaultMember, membership: Membership.Join };
let defaultProps: Parameters<typeof RoomKickButton>[0]; let defaultProps: Parameters<typeof RoomKickButton>[0];
beforeEach(() => { beforeEach(() => {
@ -1031,7 +1031,7 @@ describe("<RoomKickButton />", () => {
// null vs their member followed by // null vs their member followed by
// my member vs their member // my member vs their member
const mockMyMember = { powerLevel: 1 }; const mockMyMember = { powerLevel: 1 };
const mockTheirMember = { membership: "invite", powerLevel: 0 }; const mockTheirMember = { membership: Membership.Invite, powerLevel: 0 };
const mockRoom = { const mockRoom = {
getMember: jest getMember: jest
@ -1052,7 +1052,7 @@ describe("<RoomKickButton />", () => {
describe("<BanToggleButton />", () => { describe("<BanToggleButton />", () => {
const defaultMember = new RoomMember(defaultRoomId, defaultUserId); const defaultMember = new RoomMember(defaultRoomId, defaultUserId);
const memberWithBanMembership = { ...defaultMember, membership: "ban" }; const memberWithBanMembership = { ...defaultMember, membership: Membership.Ban };
let defaultProps: Parameters<typeof BanToggleButton>[0]; let defaultProps: Parameters<typeof BanToggleButton>[0];
beforeEach(() => { beforeEach(() => {
defaultProps = { defaultProps = {
@ -1161,7 +1161,7 @@ describe("<BanToggleButton />", () => {
// null vs their member followed by // null vs their member followed by
// my member vs their member // my member vs their member
const mockMyMember = { powerLevel: 1 }; const mockMyMember = { powerLevel: 1 };
const mockTheirMember = { membership: "ban", powerLevel: 0 }; const mockTheirMember = { membership: Membership.Ban, powerLevel: 0 };
const mockRoom = { const mockRoom = {
getMember: jest getMember: jest
@ -1182,7 +1182,7 @@ describe("<BanToggleButton />", () => {
describe("<RoomAdminToolsContainer />", () => { describe("<RoomAdminToolsContainer />", () => {
const defaultMember = new RoomMember(defaultRoomId, defaultUserId); const defaultMember = new RoomMember(defaultRoomId, defaultUserId);
defaultMember.membership = "invite"; defaultMember.membership = Membership.Invite;
let defaultProps: Parameters<typeof RoomAdminToolsContainer>[0]; let defaultProps: Parameters<typeof RoomAdminToolsContainer>[0];
beforeEach(() => { beforeEach(() => {
@ -1245,7 +1245,11 @@ describe("<RoomAdminToolsContainer />", () => {
mockMeMember.powerLevel = 51; // defaults to 50 mockMeMember.powerLevel = 51; // defaults to 50
mockRoom.getMember.mockReturnValueOnce(mockMeMember); mockRoom.getMember.mockReturnValueOnce(mockMeMember);
const defaultMemberWithPowerLevelAndJoinMembership = { ...defaultMember, powerLevel: 0, membership: "join" }; const defaultMemberWithPowerLevelAndJoinMembership = {
...defaultMember,
powerLevel: 0,
membership: Membership.Join,
};
renderComponent({ renderComponent({
member: defaultMemberWithPowerLevelAndJoinMembership, member: defaultMemberWithPowerLevelAndJoinMembership,
@ -1263,7 +1267,11 @@ describe("<RoomAdminToolsContainer />", () => {
mockMeMember.powerLevel = 51; // defaults to 50 mockMeMember.powerLevel = 51; // defaults to 50
mockRoom.getMember.mockReturnValueOnce(mockMeMember); mockRoom.getMember.mockReturnValueOnce(mockMeMember);
const defaultMemberWithPowerLevelAndJoinMembership = { ...defaultMember, powerLevel: 0, membership: "join" }; const defaultMemberWithPowerLevelAndJoinMembership = {
...defaultMember,
powerLevel: 0,
membership: Membership.Join,
};
renderComponent({ renderComponent({
member: defaultMemberWithPowerLevelAndJoinMembership, member: defaultMemberWithPowerLevelAndJoinMembership,

View file

@ -906,7 +906,7 @@ function mkJoinEvent(roomId: string, userId: string) {
room: roomId, room: roomId,
user: userId, user: userId,
content: { content: {
membership: "join", membership: Membership.Join,
avatar_url: "mxc://example.org/" + userId, avatar_url: "mxc://example.org/" + userId,
}, },
}); });

View file

@ -170,7 +170,7 @@ describe("MemberList", () => {
const usersPerLevel = 2; const usersPerLevel = 2;
for (let i = 0; i < usersPerLevel; i++) { for (let i = 0; i < usersPerLevel; i++) {
const adminUser = new RoomMember(memberListRoom.roomId, `@admin${i}:localhost`); const adminUser = new RoomMember(memberListRoom.roomId, `@admin${i}:localhost`);
adminUser.membership = "join"; adminUser.membership = Membership.Join;
adminUser.powerLevel = 100; adminUser.powerLevel = 100;
adminUser.user = User.createUser(adminUser.userId, client); adminUser.user = User.createUser(adminUser.userId, client);
adminUser.user.currentlyActive = true; adminUser.user.currentlyActive = true;
@ -180,7 +180,7 @@ describe("MemberList", () => {
adminUsers.push(adminUser); adminUsers.push(adminUser);
const moderatorUser = new RoomMember(memberListRoom.roomId, `@moderator${i}:localhost`); const moderatorUser = new RoomMember(memberListRoom.roomId, `@moderator${i}:localhost`);
moderatorUser.membership = "join"; moderatorUser.membership = Membership.Join;
moderatorUser.powerLevel = 50; moderatorUser.powerLevel = 50;
moderatorUser.user = User.createUser(moderatorUser.userId, client); moderatorUser.user = User.createUser(moderatorUser.userId, client);
moderatorUser.user.currentlyActive = true; moderatorUser.user.currentlyActive = true;
@ -190,7 +190,7 @@ describe("MemberList", () => {
moderatorUsers.push(moderatorUser); moderatorUsers.push(moderatorUser);
const defaultUser = new RoomMember(memberListRoom.roomId, `@default${i}:localhost`); const defaultUser = new RoomMember(memberListRoom.roomId, `@default${i}:localhost`);
defaultUser.membership = "join"; defaultUser.membership = Membership.Join;
defaultUser.powerLevel = 0; defaultUser.powerLevel = 0;
defaultUser.user = User.createUser(defaultUser.userId, client); defaultUser.user = User.createUser(defaultUser.userId, client);
defaultUser.user.currentlyActive = true; defaultUser.user.currentlyActive = true;
@ -402,7 +402,7 @@ describe("MemberList", () => {
}); });
it("renders disabled invite button when current user is a member but does not have rights to invite", async () => { it("renders disabled invite button when current user is a member but does not have rights to invite", async () => {
jest.spyOn(room, "getMyMembership").mockReturnValue("join"); jest.spyOn(room, "getMyMembership").mockReturnValue(Membership.Join);
jest.spyOn(room, "canInvite").mockReturnValue(false); jest.spyOn(room, "canInvite").mockReturnValue(false);
renderComponent(); renderComponent();
@ -413,7 +413,7 @@ describe("MemberList", () => {
}); });
it("renders enabled invite button when current user is a member and has rights to invite", async () => { it("renders enabled invite button when current user is a member and has rights to invite", async () => {
jest.spyOn(room, "getMyMembership").mockReturnValue("join"); jest.spyOn(room, "getMyMembership").mockReturnValue(Membership.Join);
jest.spyOn(room, "canInvite").mockReturnValue(true); jest.spyOn(room, "canInvite").mockReturnValue(true);
renderComponent(); renderComponent();
@ -424,7 +424,7 @@ describe("MemberList", () => {
it("opens room inviter on button click", async () => { it("opens room inviter on button click", async () => {
jest.spyOn(defaultDispatcher, "dispatch"); jest.spyOn(defaultDispatcher, "dispatch");
jest.spyOn(room, "getMyMembership").mockReturnValue("join"); jest.spyOn(room, "getMyMembership").mockReturnValue(Membership.Join);
jest.spyOn(room, "canInvite").mockReturnValue(true); jest.spyOn(room, "canInvite").mockReturnValue(true);
renderComponent(); renderComponent();

View file

@ -140,7 +140,7 @@ describe("UnreadNotificationBadge", () => {
}); });
it("adds a warning for invites", () => { it("adds a warning for invites", () => {
room.updateMyMembership("invite"); room.updateMyMembership(Membership.Invite);
render(getComponent()); render(getComponent());
expect(screen.queryByText("!")).not.toBeNull(); expect(screen.queryByText("!")).not.toBeNull();
}); });

View file

@ -154,7 +154,7 @@ describe("RoomHeader", () => {
name: "Member", name: "Member",
rawDisplayName: "Member", rawDisplayName: "Member",
roomId: room.roomId, roomId: room.roomId,
membership: "join", membership: Membership.Join,
getAvatarUrl: () => "mxc://avatar.url/image.png", getAvatarUrl: () => "mxc://avatar.url/image.png",
getMxcAvatarUrl: () => "mxc://avatar.url/image.png", getMxcAvatarUrl: () => "mxc://avatar.url/image.png",
}, },
@ -172,7 +172,7 @@ describe("RoomHeader", () => {
name: "Member", name: "Member",
rawDisplayName: "Member", rawDisplayName: "Member",
roomId: room.roomId, roomId: room.roomId,
membership: "join", membership: Membership.Join,
getAvatarUrl: () => "mxc://avatar.url/image.png", getAvatarUrl: () => "mxc://avatar.url/image.png",
getMxcAvatarUrl: () => "mxc://avatar.url/image.png", getMxcAvatarUrl: () => "mxc://avatar.url/image.png",
}, },
@ -181,7 +181,7 @@ describe("RoomHeader", () => {
name: "Member", name: "Member",
rawDisplayName: "Member", rawDisplayName: "Member",
roomId: room.roomId, roomId: room.roomId,
membership: "join", membership: Membership.Join,
getAvatarUrl: () => "mxc://avatar.url/image.png", getAvatarUrl: () => "mxc://avatar.url/image.png",
getMxcAvatarUrl: () => "mxc://avatar.url/image.png", getMxcAvatarUrl: () => "mxc://avatar.url/image.png",
}, },
@ -190,7 +190,7 @@ describe("RoomHeader", () => {
name: "Member", name: "Member",
rawDisplayName: "Member", rawDisplayName: "Member",
roomId: room.roomId, roomId: room.roomId,
membership: "join", membership: Membership.Join,
getAvatarUrl: () => "mxc://avatar.url/image.png", getAvatarUrl: () => "mxc://avatar.url/image.png",
getMxcAvatarUrl: () => "mxc://avatar.url/image.png", getMxcAvatarUrl: () => "mxc://avatar.url/image.png",
}, },
@ -199,7 +199,7 @@ describe("RoomHeader", () => {
name: "Bot user", name: "Bot user",
rawDisplayName: "Bot user", rawDisplayName: "Bot user",
roomId: room.roomId, roomId: room.roomId,
membership: "join", membership: Membership.Join,
getAvatarUrl: () => "mxc://avatar.url/image.png", getAvatarUrl: () => "mxc://avatar.url/image.png",
getMxcAvatarUrl: () => "mxc://avatar.url/image.png", getMxcAvatarUrl: () => "mxc://avatar.url/image.png",
}, },
@ -703,7 +703,7 @@ function mockRoomMembers(room: Room, count: number) {
name: `Member ${index}`, name: `Member ${index}`,
rawDisplayName: `Member ${index}`, rawDisplayName: `Member ${index}`,
roomId: room.roomId, roomId: room.roomId,
membership: "join", membership: Membership.Join,
getAvatarUrl: () => `mxc://avatar.url/user-${index}.png`, getAvatarUrl: () => `mxc://avatar.url/user-${index}.png`,
getMxcAvatarUrl: () => `mxc://avatar.url/user-${index}.png`, getMxcAvatarUrl: () => `mxc://avatar.url/user-${index}.png`,
})); }));

View file

@ -111,15 +111,26 @@ describe("RoomKnocksBar", () => {
const other = new RoomMember(roomId, "@doe:example.org"); const other = new RoomMember(roomId, "@doe:example.org");
bob.setMembershipEvent( bob.setMembershipEvent(
new MatrixEvent({ content: { displayname: "Bob", membership: "knock" }, type: EventType.RoomMember }), new MatrixEvent({
content: { displayname: "Bob", membership: Membership.Knock },
type: EventType.RoomMember,
}),
); );
jane.setMembershipEvent( jane.setMembershipEvent(
new MatrixEvent({ content: { displayname: "Jane", membership: "knock" }, type: EventType.RoomMember }), new MatrixEvent({
content: { displayname: "Jane", membership: Membership.Knock },
type: EventType.RoomMember,
}),
); );
john.setMembershipEvent( john.setMembershipEvent(
new MatrixEvent({ content: { displayname: "John", membership: "knock" }, type: EventType.RoomMember }), new MatrixEvent({
content: { displayname: "John", membership: Membership.Knock },
type: EventType.RoomMember,
}),
);
other.setMembershipEvent(
new MatrixEvent({ content: { membership: Membership.Knock }, type: EventType.RoomMember }),
); );
other.setMembershipEvent(new MatrixEvent({ content: { membership: "knock" }, type: EventType.RoomMember }));
beforeEach(async () => { beforeEach(async () => {
await clearAllModals(); await clearAllModals();
@ -178,7 +189,7 @@ describe("RoomKnocksBar", () => {
it("renders a link to open the room settings people tab", () => { it("renders a link to open the room settings people tab", () => {
bob.setMembershipEvent( bob.setMembershipEvent(
new MatrixEvent({ new MatrixEvent({
content: { displayname: "Bob", membership: "knock", reason: "some reason" }, content: { displayname: "Bob", membership: Membership.Knock, reason: "some reason" },
type: EventType.RoomMember, type: EventType.RoomMember,
}), }),
); );

View file

@ -49,10 +49,10 @@ const makeMockRoomMember = ({
}: { }: {
userId?: string; userId?: string;
isKicked?: boolean; isKicked?: boolean;
membership?: "invite" | "ban" | "leave"; membership?: Membership.Invite | Membership.Ban | Membership.Leave;
content?: Partial<IContent>; content?: Partial<IContent>;
memberContent?: Partial<IContent>; memberContent?: Partial<IContent>;
oldMembership?: "join" | "knock"; oldMembership?: Membership.Join | Membership.Knock;
}) => }) =>
({ ({
userId, userId,
@ -180,7 +180,7 @@ describe("<RoomPreviewBar />", () => {
it("renders denied request message", () => { it("renders denied request message", () => {
const room = createRoom(roomId, otherUserId); const room = createRoom(roomId, otherUserId);
jest.spyOn(room, "getMember").mockReturnValue( jest.spyOn(room, "getMember").mockReturnValue(
makeMockRoomMember({ isKicked: true, membership: "leave", oldMembership: "knock" }), makeMockRoomMember({ isKicked: true, membership: Membership.Leave, oldMembership: Membership.Knock }),
); );
const component = getComponent({ room, promptAskToJoin: true }); const component = getComponent({ room, promptAskToJoin: true });
@ -191,7 +191,7 @@ describe("<RoomPreviewBar />", () => {
const onForgetClick = jest.fn(); const onForgetClick = jest.fn();
const room = createRoom(roomId, otherUserId); const room = createRoom(roomId, otherUserId);
jest.spyOn(room, "getMember").mockReturnValue( jest.spyOn(room, "getMember").mockReturnValue(
makeMockRoomMember({ isKicked: true, membership: "leave", oldMembership: "knock" }), makeMockRoomMember({ isKicked: true, membership: Membership.Leave, oldMembership: Membership.Knock }),
); );
const component = getComponent({ room, promptAskToJoin: true, onForgetClick }); const component = getComponent({ room, promptAskToJoin: true, onForgetClick });
@ -201,7 +201,7 @@ describe("<RoomPreviewBar />", () => {
it("renders banned message", () => { it("renders banned message", () => {
const room = createRoom(roomId, otherUserId); const room = createRoom(roomId, otherUserId);
jest.spyOn(room, "getMember").mockReturnValue(makeMockRoomMember({ membership: "ban" })); jest.spyOn(room, "getMember").mockReturnValue(makeMockRoomMember({ membership: Membership.Ban }));
const component = getComponent({ loading: true, room }); const component = getComponent({ loading: true, room });
expect(getMessage(component)).toMatchSnapshot(); expect(getMessage(component)).toMatchSnapshot();
@ -244,8 +244,8 @@ describe("<RoomPreviewBar />", () => {
const userMember = makeMockRoomMember({ userId }); const userMember = makeMockRoomMember({ userId });
const userMemberWithDmInvite = makeMockRoomMember({ const userMemberWithDmInvite = makeMockRoomMember({
userId, userId,
membership: "invite", membership: Membership.Invite,
memberContent: { is_direct: true, membership: "invite" }, memberContent: { is_direct: true, membership: Membership.Invite },
}); });
const inviterMember = makeMockRoomMember({ const inviterMember = makeMockRoomMember({
userId: inviterUserId, userId: inviterUserId,

View file

@ -68,7 +68,7 @@ describe("RoomPreviewCard", () => {
it("shows a beta pill on Jitsi video room invites", async () => { it("shows a beta pill on Jitsi video room invites", async () => {
jest.spyOn(room, "getType").mockReturnValue(RoomType.ElementVideo); jest.spyOn(room, "getType").mockReturnValue(RoomType.ElementVideo);
jest.spyOn(room, "getMyMembership").mockReturnValue("invite"); jest.spyOn(room, "getMyMembership").mockReturnValue(Membership.Invite);
enabledFeatures = ["feature_video_rooms"]; enabledFeatures = ["feature_video_rooms"];
await renderPreview(); await renderPreview();
@ -77,7 +77,7 @@ describe("RoomPreviewCard", () => {
it("shows a beta pill on Element video room invites", async () => { it("shows a beta pill on Element video room invites", async () => {
jest.spyOn(room, "getType").mockReturnValue(RoomType.UnstableCall); jest.spyOn(room, "getType").mockReturnValue(RoomType.UnstableCall);
jest.spyOn(room, "getMyMembership").mockReturnValue("invite"); jest.spyOn(room, "getMyMembership").mockReturnValue(Membership.Invite);
enabledFeatures = ["feature_video_rooms", "feature_element_call_video_rooms"]; enabledFeatures = ["feature_video_rooms", "feature_element_call_video_rooms"];
await renderPreview(); await renderPreview();
@ -85,7 +85,7 @@ describe("RoomPreviewCard", () => {
}); });
it("doesn't show a beta pill on normal invites", async () => { it("doesn't show a beta pill on normal invites", async () => {
jest.spyOn(room, "getMyMembership").mockReturnValue("invite"); jest.spyOn(room, "getMyMembership").mockReturnValue(Membership.Invite);
await renderPreview(); await renderPreview();
expect(screen.queryByRole("button", { name: /beta/i })).toBeNull(); expect(screen.queryByRole("button", { name: /beta/i })).toBeNull();
@ -93,7 +93,7 @@ describe("RoomPreviewCard", () => {
it("shows instructions on Jitsi video rooms invites if video rooms are disabled", async () => { it("shows instructions on Jitsi video rooms invites if video rooms are disabled", async () => {
jest.spyOn(room, "getType").mockReturnValue(RoomType.ElementVideo); jest.spyOn(room, "getType").mockReturnValue(RoomType.ElementVideo);
jest.spyOn(room, "getMyMembership").mockReturnValue("invite"); jest.spyOn(room, "getMyMembership").mockReturnValue(Membership.Invite);
await renderPreview(); await renderPreview();
screen.getByText(/enable video rooms in labs/i); screen.getByText(/enable video rooms in labs/i);
@ -101,7 +101,7 @@ describe("RoomPreviewCard", () => {
it("shows instructions on Element video rooms invites if video rooms are disabled", async () => { it("shows instructions on Element video rooms invites if video rooms are disabled", async () => {
jest.spyOn(room, "getType").mockReturnValue(RoomType.UnstableCall); jest.spyOn(room, "getType").mockReturnValue(RoomType.UnstableCall);
jest.spyOn(room, "getMyMembership").mockReturnValue("invite"); jest.spyOn(room, "getMyMembership").mockReturnValue(Membership.Invite);
enabledFeatures = ["feature_element_call_video_rooms"]; enabledFeatures = ["feature_element_call_video_rooms"];
await renderPreview(); await renderPreview();

View file

@ -187,7 +187,7 @@ describe("RoomTile", () => {
return name === "feature_ask_to_join"; return name === "feature_ask_to_join";
}); });
mocked(shouldShowComponent).mockReturnValue(true); mocked(shouldShowComponent).mockReturnValue(true);
jest.spyOn(room, "getMyMembership").mockReturnValue("knock"); jest.spyOn(room, "getMyMembership").mockReturnValue(Membership.Knock);
const { container } = renderRoomTile(); const { container } = renderRoomTile();
expect(container.querySelector(".mx_RoomTile_sticky")).toBeInTheDocument(); expect(container.querySelector(".mx_RoomTile_sticky")).toBeInTheDocument();
expect(screen.queryByRole("button", { name: "Room options" })).not.toBeInTheDocument(); expect(screen.queryByRole("button", { name: "Room options" })).not.toBeInTheDocument();
@ -198,9 +198,15 @@ describe("RoomTile", () => {
return name === "feature_ask_to_join"; return name === "feature_ask_to_join";
}); });
mocked(shouldShowComponent).mockReturnValue(true); mocked(shouldShowComponent).mockReturnValue(true);
const roomMember = mkRoomMember(room.roomId, MatrixClientPeg.get()!.getSafeUserId(), "leave", true, { const roomMember = mkRoomMember(
membership: "knock", room.roomId,
}); MatrixClientPeg.get()!.getSafeUserId(),
Membership.Leave,
true,
{
membership: Membership.Knock,
},
);
jest.spyOn(room, "getMember").mockReturnValue(roomMember); jest.spyOn(room, "getMember").mockReturnValue(roomMember);
const { container } = renderRoomTile(); const { container } = renderRoomTile();
expect(container.querySelector(".mx_RoomTile_sticky")).toBeInTheDocument(); expect(container.querySelector(".mx_RoomTile_sticky")).toBeInTheDocument();

View file

@ -177,7 +177,7 @@ describe("<JoinRuleSettings />", () => {
const memberBob = new RoomMember(roomId, "@bob:server.org"); const memberBob = new RoomMember(roomId, "@bob:server.org");
const memberCharlie = new RoomMember(roomId, "@charlie:server.org"); const memberCharlie = new RoomMember(roomId, "@charlie:server.org");
jest.spyOn(room, "getMembersWithMembership").mockImplementation((membership) => jest.spyOn(room, "getMembersWithMembership").mockImplementation((membership) =>
membership === "join" ? [memberAlice, memberBob] : [memberCharlie], membership === Membership.Join ? [memberAlice, memberBob] : [memberCharlie],
); );
const upgradedRoom = new Room(newRoomId, client, userId); const upgradedRoom = new Room(newRoomId, client, userId);
setRoomStateEvents(upgradedRoom, preferredRoomVersion); setRoomStateEvents(upgradedRoom, preferredRoomVersion);

View file

@ -91,7 +91,7 @@ describe("PeopleRoomSettingsTab", () => {
content: { content: {
avatar_url: "mxc://example.org/albert-einstein.png", avatar_url: "mxc://example.org/albert-einstein.png",
displayname: "Albert Einstein", displayname: "Albert Einstein",
membership: "knock", membership: Membership.Knock,
reason, reason,
}, },
origin_server_ts: -464140800000, origin_server_ts: -464140800000,
@ -110,7 +110,7 @@ describe("PeopleRoomSettingsTab", () => {
new MatrixEvent({ new MatrixEvent({
content: { content: {
displayname: "albert.einstein", displayname: "albert.einstein",
membership: "knock", membership: Membership.Knock,
}, },
type: EventType.RoomMember, type: EventType.RoomMember,
}), }),
@ -138,7 +138,7 @@ describe("PeopleRoomSettingsTab", () => {
new MatrixEvent({ new MatrixEvent({
content: { content: {
displayname: "albert.einstein", displayname: "albert.einstein",
membership: "knock", membership: Membership.Knock,
reason, reason,
}, },
type: EventType.RoomMember, type: EventType.RoomMember,

View file

@ -197,7 +197,7 @@ describe("RolesRoomSettingsTab", () => {
new MatrixEvent({ new MatrixEvent({
type: EventType.RoomMember, type: EventType.RoomMember,
content: { content: {
membership: "ban", membership: Membership.Ban,
reason: "just testing", reason: "just testing",
}, },
sender: userId, sender: userId,
@ -218,7 +218,7 @@ describe("RolesRoomSettingsTab", () => {
new MatrixEvent({ new MatrixEvent({
type: EventType.RoomMember, type: EventType.RoomMember,
content: { content: {
membership: "ban", membership: Membership.Ban,
reason: "just testing", reason: "just testing",
}, },
sender: userId, sender: userId,

View file

@ -49,7 +49,7 @@ describe("useRoomMembers", () => {
state_key: "!user:server", state_key: "!user:server",
room_id: room.roomId, room_id: room.roomId,
content: { content: {
membership: "join", membership: Membership.Join,
}, },
}), }),
]); ]);
@ -85,7 +85,7 @@ describe("useRoomMemberCount", () => {
state_key: "!user:server", state_key: "!user:server",
room_id: room.roomId, room_id: room.roomId,
content: { content: {
membership: "join", membership: Membership.Join,
}, },
}), }),
]); ]);
@ -109,14 +109,14 @@ describe("useMyRoomMembership", () => {
}); });
it("should update on RoomState.Members events", async () => { it("should update on RoomState.Members events", async () => {
room.updateMyMembership("join"); room.updateMyMembership(Membership.Join);
const { result } = render(room); const { result } = render(room);
expect(result.current).toBe("join"); expect(result.current).toBe(Membership.Join);
act(() => { act(() => {
room.updateMyMembership("leave"); room.updateMyMembership(Membership.Leave);
}); });
await waitFor(() => expect(result.current).toBe("leave")); await waitFor(() => expect(result.current).toBe(Membership.Leave));
}); });
}); });

View file

@ -66,7 +66,7 @@ describe("useUnreadNotifications", () => {
}); });
it("indicates the user has been invited to a channel", async () => { it("indicates the user has been invited to a channel", async () => {
room.updateMyMembership("invite"); room.updateMyMembership(Membership.Invite);
const { result } = renderHook(() => useUnreadNotifications(room)); const { result } = renderHook(() => useUnreadNotifications(room));
const { level, symbol, count } = result.current; const { level, symbol, count } = result.current;

View file

@ -95,7 +95,7 @@ const setUpClientRoomAndStores = (): {
} }
}); });
jest.spyOn(room, "getMyMembership").mockReturnValue("join"); jest.spyOn(room, "getMyMembership").mockReturnValue(Membership.Join);
client.getRoom.mockImplementation((roomId) => (roomId === room.roomId ? room : null)); client.getRoom.mockImplementation((roomId) => (roomId === room.roomId ? room : null));
client.getRoom.mockImplementation((roomId) => (roomId === room.roomId ? room : null)); client.getRoom.mockImplementation((roomId) => (roomId === room.roomId ? room : null));
@ -380,7 +380,7 @@ describe("JitsiCall", () => {
it("disconnects when we leave the room", async () => { it("disconnects when we leave the room", async () => {
await call.start(); await call.start();
expect(call.connectionState).toBe(ConnectionState.Connected); expect(call.connectionState).toBe(ConnectionState.Connected);
room.emit(RoomEvent.MyMembership, room, "leave"); room.emit(RoomEvent.MyMembership, room, Membership.Leave);
expect(call.connectionState).toBe(ConnectionState.Disconnected); expect(call.connectionState).toBe(ConnectionState.Disconnected);
}); });
@ -395,7 +395,7 @@ describe("JitsiCall", () => {
it("remains connected if we stay in the room", async () => { it("remains connected if we stay in the room", async () => {
await call.start(); await call.start();
expect(call.connectionState).toBe(ConnectionState.Connected); expect(call.connectionState).toBe(ConnectionState.Connected);
room.emit(RoomEvent.MyMembership, room, "join"); room.emit(RoomEvent.MyMembership, room, Membership.Join);
expect(call.connectionState).toBe(ConnectionState.Connected); expect(call.connectionState).toBe(ConnectionState.Connected);
}); });
@ -911,14 +911,14 @@ describe("ElementCall", () => {
it("disconnects when we leave the room", async () => { it("disconnects when we leave the room", async () => {
await callConnectProcedure(call); await callConnectProcedure(call);
expect(call.connectionState).toBe(ConnectionState.Connected); expect(call.connectionState).toBe(ConnectionState.Connected);
room.emit(RoomEvent.MyMembership, room, "leave"); room.emit(RoomEvent.MyMembership, room, Membership.Leave);
expect(call.connectionState).toBe(ConnectionState.Disconnected); expect(call.connectionState).toBe(ConnectionState.Disconnected);
}); });
it("remains connected if we stay in the room", async () => { it("remains connected if we stay in the room", async () => {
await callConnectProcedure(call); await callConnectProcedure(call);
expect(call.connectionState).toBe(ConnectionState.Connected); expect(call.connectionState).toBe(ConnectionState.Connected);
room.emit(RoomEvent.MyMembership, room, "join"); room.emit(RoomEvent.MyMembership, room, Membership.Join);
expect(call.connectionState).toBe(ConnectionState.Connected); expect(call.connectionState).toBe(ConnectionState.Connected);
}); });

View file

@ -55,7 +55,7 @@ describe("MemberListStore", () => {
type: EventType.RoomMember, type: EventType.RoomMember,
state_key: alice, state_key: alice,
content: { content: {
membership: "join", membership: Membership.Join,
}, },
sender: alice, sender: alice,
room_id: roomId, room_id: roomId,
@ -77,8 +77,8 @@ describe("MemberListStore", () => {
}); });
it("loads members in a room", async () => { it("loads members in a room", async () => {
addMember(room, bob, "invite"); addMember(room, bob, Membership.Invite);
addMember(room, charlie, "leave"); addMember(room, charlie, Membership.Leave);
const { invited, joined } = await store.loadMemberList(roomId); const { invited, joined } = await store.loadMemberList(roomId);
expect(invited).toEqual([room.getMember(bob)]); expect(invited).toEqual([room.getMember(bob)]);
@ -92,8 +92,8 @@ describe("MemberListStore", () => {
}); });
it("sorts by power level", async () => { it("sorts by power level", async () => {
addMember(room, bob, "join"); addMember(room, bob, Membership.Join);
addMember(room, charlie, "join"); addMember(room, charlie, Membership.Join);
setPowerLevels(room, { setPowerLevels(room, {
users: { users: {
[alice]: 100, [alice]: 100,
@ -109,8 +109,8 @@ describe("MemberListStore", () => {
it("sorts by name if power level is equal", async () => { it("sorts by name if power level is equal", async () => {
const doris = "@doris:bar"; const doris = "@doris:bar";
addMember(room, bob, "join"); addMember(room, bob, Membership.Join);
addMember(room, charlie, "join"); addMember(room, charlie, Membership.Join);
setPowerLevels(room, { setPowerLevels(room, {
users_default: 10, users_default: 10,
}); });
@ -120,7 +120,7 @@ describe("MemberListStore", () => {
expect(joined).toEqual([room.getMember(alice), room.getMember(bob), room.getMember(charlie)]); expect(joined).toEqual([room.getMember(alice), room.getMember(bob), room.getMember(charlie)]);
// Ensure it sorts by display name if they are set // Ensure it sorts by display name if they are set
addMember(room, doris, "join", "AAAAA"); addMember(room, doris, Membership.Join, "AAAAA");
({ invited, joined } = await store.loadMemberList(roomId)); ({ invited, joined } = await store.loadMemberList(roomId));
expect(invited).toEqual([]); expect(invited).toEqual([]);
expect(joined).toEqual([ expect(joined).toEqual([
@ -134,15 +134,15 @@ describe("MemberListStore", () => {
it("filters based on a search query", async () => { it("filters based on a search query", async () => {
const mice = "@mice:bar"; const mice = "@mice:bar";
const zorro = "@zorro:bar"; const zorro = "@zorro:bar";
addMember(room, bob, "join"); addMember(room, bob, Membership.Join);
addMember(room, mice, "join"); addMember(room, mice, Membership.Join);
let { invited, joined } = await store.loadMemberList(roomId, "ice"); let { invited, joined } = await store.loadMemberList(roomId, "ice");
expect(invited).toEqual([]); expect(invited).toEqual([]);
expect(joined).toEqual([room.getMember(alice), room.getMember(mice)]); expect(joined).toEqual([room.getMember(alice), room.getMember(mice)]);
// Ensure it filters by display name if they are set // Ensure it filters by display name if they are set
addMember(room, zorro, "join", "ice ice baby"); addMember(room, zorro, Membership.Join, "ice ice baby");
({ invited, joined } = await store.loadMemberList(roomId, "ice")); ({ invited, joined } = await store.loadMemberList(roomId, "ice"));
expect(invited).toEqual([]); expect(invited).toEqual([]);
expect(joined).toEqual([room.getMember(alice), room.getMember(zorro), room.getMember(mice)]); expect(joined).toEqual([room.getMember(alice), room.getMember(zorro), room.getMember(mice)]);
@ -180,7 +180,7 @@ describe("MemberListStore", () => {
type: EventType.RoomMember, type: EventType.RoomMember,
state_key: bob, state_key: bob,
content: { content: {
membership: "join", membership: Membership.Join,
displayname: "Bob", displayname: "Bob",
}, },
sender: bob, sender: bob,

View file

@ -556,7 +556,7 @@ describe("OwnBeaconStore", () => {
it("destroys and removes beacons when current user leaves room", async () => { it("destroys and removes beacons when current user leaves room", async () => {
// alice leaves room1 // alice leaves room1
const membershipEvent = makeMembershipEvent(room1Id, aliceId, "leave"); const membershipEvent = makeMembershipEvent(room1Id, aliceId, Membership.Leave);
const member = new RoomMember(room1Id, aliceId); const member = new RoomMember(room1Id, aliceId);
member.setMembershipEvent(membershipEvent); member.setMembershipEvent(membershipEvent);

View file

@ -57,13 +57,13 @@ const fav2 = "!fav2:server";
const fav3 = "!fav3:server"; const fav3 = "!fav3:server";
const dm1 = "!dm1:server"; const dm1 = "!dm1:server";
const dm1Partner = new RoomMember(dm1, "@dm1Partner:server"); const dm1Partner = new RoomMember(dm1, "@dm1Partner:server");
dm1Partner.membership = "join"; dm1Partner.membership = Membership.Join;
const dm2 = "!dm2:server"; const dm2 = "!dm2:server";
const dm2Partner = new RoomMember(dm2, "@dm2Partner:server"); const dm2Partner = new RoomMember(dm2, "@dm2Partner:server");
dm2Partner.membership = "join"; dm2Partner.membership = Membership.Join;
const dm3 = "!dm3:server"; const dm3 = "!dm3:server";
const dm3Partner = new RoomMember(dm3, "@dm3Partner:server"); const dm3Partner = new RoomMember(dm3, "@dm3Partner:server");
dm3Partner.membership = "join"; dm3Partner.membership = Membership.Join;
const orphan1 = "!orphan1:server"; const orphan1 = "!orphan1:server";
const orphan2 = "!orphan2:server"; const orphan2 = "!orphan2:server";
const invite1 = "!invite1:server"; const invite1 = "!invite1:server";
@ -289,7 +289,7 @@ describe("SpaceStore", () => {
}); });
it("invite to a subspace is only shown at the top level", async () => { it("invite to a subspace is only shown at the top level", async () => {
mkSpace(invite1).getMyMembership.mockReturnValue("invite"); mkSpace(invite1).getMyMembership.mockReturnValue(Membership.Invite);
mkSpace(space1, [invite1]); mkSpace(space1, [invite1]);
await run(); await run();
@ -335,20 +335,20 @@ describe("SpaceStore", () => {
}); });
[invite1, invite2].forEach((roomId) => { [invite1, invite2].forEach((roomId) => {
mocked(client.getRoom(roomId)!).getMyMembership.mockReturnValue("invite"); mocked(client.getRoom(roomId)).getMyMembership.mockReturnValue(Membership.Invite);
}); });
// have dmPartner1 be in space1 with you // have dmPartner1 be in space1 with you
const mySpace1Member = new RoomMember(space1, testUserId); const mySpace1Member = new RoomMember(space1, testUserId);
mySpace1Member.membership = "join"; mySpace1Member.membership = Membership.Join;
(rooms.find((r) => r.roomId === space1)!.getMembers as jest.Mock).mockReturnValue([ (rooms.find((r) => r.roomId === space1).getMembers as jest.Mock).mockReturnValue([
mySpace1Member, mySpace1Member,
dm1Partner, dm1Partner,
]); ]);
// have dmPartner2 be in space2 with you // have dmPartner2 be in space2 with you
const mySpace2Member = new RoomMember(space2, testUserId); const mySpace2Member = new RoomMember(space2, testUserId);
mySpace2Member.membership = "join"; mySpace2Member.membership = Membership.Join;
(rooms.find((r) => r.roomId === space2)!.getMembers as jest.Mock).mockReturnValue([ (rooms.find((r) => r.roomId === space2).getMembers as jest.Mock).mockReturnValue([
mySpace2Member, mySpace2Member,
dm2Partner, dm2Partner,
]); ]);
@ -683,16 +683,16 @@ describe("SpaceStore", () => {
it("should add new DM Invites to the People Space Notification State", async () => { it("should add new DM Invites to the People Space Notification State", async () => {
mkRoom(dm1); mkRoom(dm1);
mocked(client.getRoom(dm1)!).getMyMembership.mockReturnValue("join"); mocked(client.getRoom(dm1)!).getMyMembership.mockReturnValue(Membership.Join);
mocked(client).getRoom.mockImplementation((roomId) => rooms.find((room) => room.roomId === roomId) || null); mocked(client).getRoom.mockImplementation((roomId) => rooms.find((room) => room.roomId === roomId) || null);
await run(); await run();
mkRoom(dm2); mkRoom(dm2);
const cliDm2 = client.getRoom(dm2)!; const cliDm2 = client.getRoom(dm2)!;
mocked(cliDm2).getMyMembership.mockReturnValue("invite"); mocked(cliDm2).getMyMembership.mockReturnValue(Membership.Invite);
mocked(client).getRoom.mockImplementation((roomId) => rooms.find((room) => room.roomId === roomId) || null); mocked(client).getRoom.mockImplementation((roomId) => rooms.find((room) => room.roomId === roomId) || null);
client.emit(RoomEvent.MyMembership, cliDm2, "invite"); client.emit(RoomEvent.MyMembership, cliDm2, Membership.Invite);
[dm1, dm2].forEach((d) => { [dm1, dm2].forEach((d) => {
expect( expect(
@ -721,9 +721,9 @@ describe("SpaceStore", () => {
await run(); await run();
expect(store.spacePanelSpaces).toStrictEqual([space]); expect(store.spacePanelSpaces).toStrictEqual([space]);
space.getMyMembership.mockReturnValue("leave"); space.getMyMembership.mockReturnValue(Membership.Leave);
const prom = testUtils.emitPromise(store, UPDATE_TOP_LEVEL_SPACES); const prom = testUtils.emitPromise(store, UPDATE_TOP_LEVEL_SPACES);
client.emit(RoomEvent.MyMembership, space, "leave", "join"); client.emit(RoomEvent.MyMembership, space, Membership.Leave, Membership.Join);
await prom; await prom;
expect(store.spacePanelSpaces).toStrictEqual([]); expect(store.spacePanelSpaces).toStrictEqual([]);
}); });
@ -733,7 +733,7 @@ describe("SpaceStore", () => {
expect(store.spacePanelSpaces).toStrictEqual([]); expect(store.spacePanelSpaces).toStrictEqual([]);
expect(store.invitedSpaces).toStrictEqual([]); expect(store.invitedSpaces).toStrictEqual([]);
const space = mkSpace(space1); const space = mkSpace(space1);
space.getMyMembership.mockReturnValue("invite"); space.getMyMembership.mockReturnValue(Membership.Invite);
const prom = testUtils.emitPromise(store, UPDATE_INVITED_SPACES); const prom = testUtils.emitPromise(store, UPDATE_INVITED_SPACES);
client.emit(ClientEvent.Room, space); client.emit(ClientEvent.Room, space);
await prom; await prom;
@ -743,14 +743,14 @@ describe("SpaceStore", () => {
it("updates state when space invite is accepted", async () => { it("updates state when space invite is accepted", async () => {
const space = mkSpace(space1); const space = mkSpace(space1);
space.getMyMembership.mockReturnValue("invite"); space.getMyMembership.mockReturnValue(Membership.Invite);
await run(); await run();
expect(store.spacePanelSpaces).toStrictEqual([]); expect(store.spacePanelSpaces).toStrictEqual([]);
expect(store.invitedSpaces).toStrictEqual([space]); expect(store.invitedSpaces).toStrictEqual([space]);
space.getMyMembership.mockReturnValue("join"); space.getMyMembership.mockReturnValue(Membership.Join);
const prom = testUtils.emitPromise(store, UPDATE_TOP_LEVEL_SPACES); const prom = testUtils.emitPromise(store, UPDATE_TOP_LEVEL_SPACES);
client.emit(RoomEvent.MyMembership, space, "join", "invite"); client.emit(RoomEvent.MyMembership, space, Membership.Join, Membership.Invite);
await prom; await prom;
expect(store.spacePanelSpaces).toStrictEqual([space]); expect(store.spacePanelSpaces).toStrictEqual([space]);
expect(store.invitedSpaces).toStrictEqual([]); expect(store.invitedSpaces).toStrictEqual([]);
@ -758,14 +758,14 @@ describe("SpaceStore", () => {
it("updates state when space invite is rejected", async () => { it("updates state when space invite is rejected", async () => {
const space = mkSpace(space1); const space = mkSpace(space1);
space.getMyMembership.mockReturnValue("invite"); space.getMyMembership.mockReturnValue(Membership.Invite);
await run(); await run();
expect(store.spacePanelSpaces).toStrictEqual([]); expect(store.spacePanelSpaces).toStrictEqual([]);
expect(store.invitedSpaces).toStrictEqual([space]); expect(store.invitedSpaces).toStrictEqual([space]);
space.getMyMembership.mockReturnValue("leave"); space.getMyMembership.mockReturnValue(Membership.Leave);
const prom = testUtils.emitPromise(store, UPDATE_INVITED_SPACES); const prom = testUtils.emitPromise(store, UPDATE_INVITED_SPACES);
client.emit(RoomEvent.MyMembership, space, "leave", "invite"); client.emit(RoomEvent.MyMembership, space, Membership.Leave, Membership.Invite);
await prom; await prom;
expect(store.spacePanelSpaces).toStrictEqual([]); expect(store.spacePanelSpaces).toStrictEqual([]);
expect(store.invitedSpaces).toStrictEqual([]); expect(store.invitedSpaces).toStrictEqual([]);
@ -783,7 +783,7 @@ describe("SpaceStore", () => {
expect(store.isRoomInSpace(MetaSpace.Home, invite1)).toBeFalsy(); expect(store.isRoomInSpace(MetaSpace.Home, invite1)).toBeFalsy();
const invite = mkRoom(invite1); const invite = mkRoom(invite1);
invite.getMyMembership.mockReturnValue("invite"); invite.getMyMembership.mockReturnValue(Membership.Invite);
const prom = testUtils.emitPromise(store, space1); const prom = testUtils.emitPromise(store, space1);
client.emit(ClientEvent.Room, space); client.emit(ClientEvent.Room, space);
await prom; await prom;
@ -845,7 +845,7 @@ describe("SpaceStore", () => {
room: spaceId, room: spaceId,
user: client.getUserId()!, user: client.getUserId()!,
skey: user.userId, skey: user.userId,
content: { membership: "join" }, content: { membership: Membership.Join },
ts: Date.now(), ts: Date.now(),
}); });
const spaceRoom = client.getRoom(spaceId)!; const spaceRoom = client.getRoom(spaceId)!;
@ -926,7 +926,7 @@ describe("SpaceStore", () => {
beforeEach(async () => { beforeEach(async () => {
mkRoom(room1); // not a space mkRoom(room1); // not a space
mkSpace(space1, [mkSpace(space2).roomId]); mkSpace(space1, [mkSpace(space2).roomId]);
mkSpace(space3).getMyMembership.mockReturnValue("invite"); mkSpace(space3).getMyMembership.mockReturnValue(Membership.Invite);
await run(); await run();
store.setActiveSpace(MetaSpace.Home); store.setActiveSpace(MetaSpace.Home);
expect(store.activeSpace).toBe(MetaSpace.Home); expect(store.activeSpace).toBe(MetaSpace.Home);
@ -986,7 +986,7 @@ describe("SpaceStore", () => {
const event = mkEvent({ const event = mkEvent({
event: true, event: true,
type: EventType.RoomMember, type: EventType.RoomMember,
content: { membership: "join" }, content: { membership: Membership.Join },
skey: dm1Partner.userId, skey: dm1Partner.userId,
user: dm1Partner.userId, user: dm1Partner.userId,
room: space1, room: space1,
@ -994,7 +994,7 @@ describe("SpaceStore", () => {
space.getMember.mockImplementation((userId) => { space.getMember.mockImplementation((userId) => {
if (userId === dm1Partner.userId) { if (userId === dm1Partner.userId) {
const member = new RoomMember(space1, dm1Partner.userId); const member = new RoomMember(space1, dm1Partner.userId);
member.membership = "join"; member.membership = Membership.Join;
return member; return member;
} }
return null; return null;
@ -1249,15 +1249,15 @@ describe("SpaceStore", () => {
// receive invite to space // receive invite to space
const rootSpace = mkSpace(space1, [room1, room2, space2]); const rootSpace = mkSpace(space1, [room1, room2, space2]);
rootSpace.getMyMembership.mockReturnValue("invite"); rootSpace.getMyMembership.mockReturnValue(Membership.Invite);
client.emit(ClientEvent.Room, rootSpace); client.emit(ClientEvent.Room, rootSpace);
jest.runOnlyPendingTimers(); jest.runOnlyPendingTimers();
expect(SpaceStore.instance.invitedSpaces).toStrictEqual([rootSpace]); expect(SpaceStore.instance.invitedSpaces).toStrictEqual([rootSpace]);
expect(SpaceStore.instance.spacePanelSpaces).toStrictEqual([]); expect(SpaceStore.instance.spacePanelSpaces).toStrictEqual([]);
// accept invite to space // accept invite to space
rootSpace.getMyMembership.mockReturnValue("join"); rootSpace.getMyMembership.mockReturnValue(Membership.Join);
client.emit(RoomEvent.MyMembership, rootSpace, "join", "invite"); client.emit(RoomEvent.MyMembership, rootSpace, Membership.Join, Membership.Invite);
jest.runOnlyPendingTimers(); jest.runOnlyPendingTimers();
expect(SpaceStore.instance.invitedSpaces).toStrictEqual([]); expect(SpaceStore.instance.invitedSpaces).toStrictEqual([]);
expect(SpaceStore.instance.spacePanelSpaces).toStrictEqual([rootSpace]); expect(SpaceStore.instance.spacePanelSpaces).toStrictEqual([rootSpace]);
@ -1265,7 +1265,7 @@ describe("SpaceStore", () => {
// join room in space // join room in space
expect(SpaceStore.instance.isRoomInSpace(space1, room1)).toBeFalsy(); expect(SpaceStore.instance.isRoomInSpace(space1, room1)).toBeFalsy();
const rootSpaceRoom1 = mkRoom(room1); const rootSpaceRoom1 = mkRoom(room1);
rootSpaceRoom1.getMyMembership.mockReturnValue("join"); rootSpaceRoom1.getMyMembership.mockReturnValue(Membership.Join);
client.emit(ClientEvent.Room, rootSpaceRoom1); client.emit(ClientEvent.Room, rootSpaceRoom1);
jest.runOnlyPendingTimers(); jest.runOnlyPendingTimers();
expect(SpaceStore.instance.invitedSpaces).toStrictEqual([]); expect(SpaceStore.instance.invitedSpaces).toStrictEqual([]);
@ -1279,7 +1279,7 @@ describe("SpaceStore", () => {
// receive room invite // receive room invite
expect(SpaceStore.instance.isRoomInSpace(space1, room2)).toBeFalsy(); expect(SpaceStore.instance.isRoomInSpace(space1, room2)).toBeFalsy();
const rootSpaceRoom2 = mkRoom(room2); const rootSpaceRoom2 = mkRoom(room2);
rootSpaceRoom2.getMyMembership.mockReturnValue("invite"); rootSpaceRoom2.getMyMembership.mockReturnValue(Membership.Invite);
client.emit(ClientEvent.Room, rootSpaceRoom2); client.emit(ClientEvent.Room, rootSpaceRoom2);
jest.runOnlyPendingTimers(); jest.runOnlyPendingTimers();
expect(SpaceStore.instance.invitedSpaces).toStrictEqual([]); expect(SpaceStore.instance.invitedSpaces).toStrictEqual([]);
@ -1292,9 +1292,9 @@ describe("SpaceStore", () => {
// start DM in space // start DM in space
const myRootSpaceMember = new RoomMember(space1, testUserId); const myRootSpaceMember = new RoomMember(space1, testUserId);
myRootSpaceMember.membership = "join"; myRootSpaceMember.membership = Membership.Join;
const rootSpaceFriend = new RoomMember(space1, dm1Partner.userId); const rootSpaceFriend = new RoomMember(space1, dm1Partner.userId);
rootSpaceFriend.membership = "join"; rootSpaceFriend.membership = Membership.Join;
rootSpace.getMembers.mockReturnValue([myRootSpaceMember, rootSpaceFriend]); rootSpace.getMembers.mockReturnValue([myRootSpaceMember, rootSpaceFriend]);
rootSpace.getMember.mockImplementation((userId) => { rootSpace.getMember.mockImplementation((userId) => {
switch (userId) { switch (userId) {
@ -1310,7 +1310,7 @@ describe("SpaceStore", () => {
event: true, event: true,
type: EventType.RoomMember, type: EventType.RoomMember,
content: { content: {
membership: "join", membership: Membership.Join,
}, },
skey: dm1Partner.userId, skey: dm1Partner.userId,
user: dm1Partner.userId, user: dm1Partner.userId,
@ -1320,7 +1320,7 @@ describe("SpaceStore", () => {
jest.runOnlyPendingTimers(); jest.runOnlyPendingTimers();
expect(SpaceStore.instance.getSpaceFilteredUserIds(space1)!.has(dm1Partner.userId)).toBeTruthy(); expect(SpaceStore.instance.getSpaceFilteredUserIds(space1)!.has(dm1Partner.userId)).toBeTruthy();
const dm1Room = mkRoom(dm1); const dm1Room = mkRoom(dm1);
dm1Room.getMyMembership.mockReturnValue("join"); dm1Room.getMyMembership.mockReturnValue(Membership.Join);
client.emit(ClientEvent.Room, dm1Room); client.emit(ClientEvent.Room, dm1Room);
jest.runOnlyPendingTimers(); jest.runOnlyPendingTimers();
expect(SpaceStore.instance.invitedSpaces).toStrictEqual([]); expect(SpaceStore.instance.invitedSpaces).toStrictEqual([]);
@ -1333,7 +1333,7 @@ describe("SpaceStore", () => {
// join subspace // join subspace
const subspace = mkSpace(space2); const subspace = mkSpace(space2);
subspace.getMyMembership.mockReturnValue("join"); subspace.getMyMembership.mockReturnValue(Membership.Join);
const prom = testUtils.emitPromise(SpaceStore.instance, space1); const prom = testUtils.emitPromise(SpaceStore.instance, space1);
client.emit(ClientEvent.Room, subspace); client.emit(ClientEvent.Room, subspace);
jest.runOnlyPendingTimers(); jest.runOnlyPendingTimers();

View file

@ -119,7 +119,7 @@ describe("RoomNotificationState", () => {
muteRoom(room); muteRoom(room);
setUnreads(room, 1234, 0); setUnreads(room, 1234, 0);
room.updateMyMembership("join"); // emit room.updateMyMembership(Membership.Join); // emit
expect(roomNotifState.level).toBe(NotificationLevel.None); expect(roomNotifState.level).toBe(NotificationLevel.None);
expect(roomNotifState.symbol).toBe(null); expect(roomNotifState.symbol).toBe(null);
@ -129,7 +129,7 @@ describe("RoomNotificationState", () => {
it("suggests a red ! if the user has been invited to a room", () => { it("suggests a red ! if the user has been invited to a room", () => {
const roomNotifState = new RoomNotificationState(room, false); const roomNotifState = new RoomNotificationState(room, false);
room.updateMyMembership("invite"); // emit room.updateMyMembership(Membership.Invite); // emit
expect(roomNotifState.level).toBe(NotificationLevel.Highlight); expect(roomNotifState.level).toBe(NotificationLevel.Highlight);
expect(roomNotifState.symbol).toBe("!"); expect(roomNotifState.symbol).toBe("!");
@ -140,7 +140,7 @@ describe("RoomNotificationState", () => {
const roomNotifState = new RoomNotificationState(room, false); const roomNotifState = new RoomNotificationState(room, false);
setUnreads(room, 4321, 0); setUnreads(room, 4321, 0);
room.updateMyMembership("join"); // emit room.updateMyMembership(Membership.Join); // emit
expect(roomNotifState.level).toBe(NotificationLevel.Notification); expect(roomNotifState.level).toBe(NotificationLevel.Notification);
expect(roomNotifState.symbol).toBe(null); expect(roomNotifState.symbol).toBe(null);
@ -151,7 +151,7 @@ describe("RoomNotificationState", () => {
const roomNotifState = new RoomNotificationState(room, false); const roomNotifState = new RoomNotificationState(room, false);
setUnreads(room, 0, 69); setUnreads(room, 0, 69);
room.updateMyMembership("join"); // emit room.updateMyMembership(Membership.Join); // emit
expect(roomNotifState.level).toBe(NotificationLevel.Highlight); expect(roomNotifState.level).toBe(NotificationLevel.Highlight);
expect(roomNotifState.symbol).toBe(null); expect(roomNotifState.symbol).toBe(null);
@ -171,7 +171,7 @@ describe("RoomNotificationState", () => {
); );
addThread(room); addThread(room);
room.updateMyMembership("join"); // emit room.updateMyMembership(Membership.Join); // emit
expect(roomNotifState.level).toBe(NotificationLevel.Activity); expect(roomNotifState.level).toBe(NotificationLevel.Activity);
expect(roomNotifState.symbol).toBe(null); expect(roomNotifState.symbol).toBe(null);

Some files were not shown because too many files have changed in this diff Show more