diff --git a/src/stores/SpaceStore.tsx b/src/stores/SpaceStore.tsx index e6fc793c4f..9a2dc027c2 100644 --- a/src/stores/SpaceStore.tsx +++ b/src/stores/SpaceStore.tsx @@ -19,6 +19,8 @@ import { ListIteratee, Many, sortBy, throttle } from "lodash"; import { EventType, RoomType } from "matrix-js-sdk/src/@types/event"; import { Room } from "matrix-js-sdk/src/models/room"; import { MatrixEvent } from "matrix-js-sdk/src/models/event"; +import { JoinRule } from "matrix-js-sdk/src/@types/partials"; +import { IRoomCapability } from "matrix-js-sdk/src/client"; import { AsyncStoreWithClient } from "./AsyncStoreWithClient"; import defaultDispatcher from "../dispatcher/dispatcher"; @@ -45,7 +47,6 @@ import { _t } from "../languageHandler"; import GenericToast from "../components/views/toasts/GenericToast"; import Modal from "../Modal"; import InfoDialog from "../components/views/dialogs/InfoDialog"; -import { JoinRule } from "../../../matrix-js-sdk/src/@types/partials"; type SpaceKey = string | symbol; @@ -115,6 +116,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient { private _suggestedRooms: ISuggestedRoom[] = []; private _invitedSpaces = new Set(); private spaceOrderLocalEchoMap = new Map(); + private _restrictedJoinRuleSupport?: IRoomCapability; public get invitedSpaces(): Room[] { return Array.from(this._invitedSpaces); @@ -132,6 +134,10 @@ export class SpaceStoreClass extends AsyncStoreWithClient { return this._suggestedRooms; } + public get restrictedJoinRuleSupport(): IRoomCapability { + return this._restrictedJoinRuleSupport; + } + /** * Sets the active space, updates room list filters, * optionally switches the user's room back to where they were when they last viewed that space. @@ -182,66 +188,63 @@ export class SpaceStoreClass extends AsyncStoreWithClient { } // New in Spaces beta toast for Restricted Join Rule - (async () => { - const lsKey = "mx_SpaceBeta_restrictedJoinRuleToastSeen"; - if (contextSwitch && space?.getJoinRule() === JoinRule.Invite && shouldShowSpaceSettings(space) && - space.getJoinedMemberCount() > 1 && !localStorage.getItem(lsKey) /*&& - (await this.matrixClient.getCapabilities()) - ?.["m.room_versions"]?.["org.matrix.msc3244.room_capabilities"]?.["restricted"]?.preferred*/ - ) { - const toastKey = "restrictedjoinrule"; - ToastStore.sharedInstance().addOrReplaceToast({ - key: toastKey, - title: _t("New in the Spaces beta"), - props: { - description: _t("Help people in spaces to find and join private rooms"), - acceptLabel: _t("Learn more"), - onAccept: () => { - localStorage.setItem(lsKey, "true"); - ToastStore.sharedInstance().dismissToast(toastKey); + const lsKey = "mx_SpaceBeta_restrictedJoinRuleToastSeen"; + if (contextSwitch && space?.getJoinRule() === JoinRule.Invite && shouldShowSpaceSettings(space) && + space.getJoinedMemberCount() > 1 && !localStorage.getItem(lsKey) + && this.restrictedJoinRuleSupport?.preferred + ) { + const toastKey = "restrictedjoinrule"; + ToastStore.sharedInstance().addOrReplaceToast({ + key: toastKey, + title: _t("New in the Spaces beta"), + props: { + description: _t("Help people in spaces to find and join private rooms"), + acceptLabel: _t("Learn more"), + onAccept: () => { + localStorage.setItem(lsKey, "true"); + ToastStore.sharedInstance().dismissToast(toastKey); - Modal.createTrackedDialog("New in the Spaces beta", "restricted join rule", InfoDialog, { - title: _t("Help space members find private rooms"), - description: <> -

{ _t("To help space members find and join a private room, " + - "go to that room's Security & Privacy settings.") }

+ Modal.createTrackedDialog("New in the Spaces beta", "restricted join rule", InfoDialog, { + title: _t("Help space members find private rooms"), + description: <> +

{ _t("To help space members find and join a private room, " + + "go to that room's Security & Privacy settings.") }

- { /* Reuses classes from TabbedView for simplicity, non-interactive */ } -
-
- - { _t("General") } -
-
- - { _t("Security & Privacy") } -
-
- - { _t("Roles & Permissions") } -
+ { /* Reuses classes from TabbedView for simplicity, non-interactive */ } +
+
+ + { _t("General") }
+
+ + { _t("Security & Privacy") } +
+
+ + { _t("Roles & Permissions") } +
+
-

{ _t("This make it easy for rooms to stay private to a space, " + - "while letting people in the space find and join them. " + - "All new rooms in a space will have this option available.")}

- , - button: _t("OK"), - hasCloseButton: false, - fixedWidth: true, - }); - }, - rejectLabel: _t("Skip"), - onReject: () => { - localStorage.setItem(lsKey, "true"); - ToastStore.sharedInstance().dismissToast(toastKey); - }, +

{ _t("This make it easy for rooms to stay private to a space, " + + "while letting people in the space find and join them. " + + "All new rooms in a space will have this option available.")}

+ , + button: _t("OK"), + hasCloseButton: false, + fixedWidth: true, + }); }, - component: GenericToast, - priority: 35, - }); - } - })().then(); + rejectLabel: _t("Skip"), + onReject: () => { + localStorage.setItem(lsKey, "true"); + ToastStore.sharedInstance().dismissToast(toastKey); + }, + }, + component: GenericToast, + priority: 35, + }); + } if (space) { const suggestedRooms = await this.fetchSuggestedRooms(space); @@ -709,6 +712,11 @@ export class SpaceStoreClass extends AsyncStoreWithClient { this.matrixClient.on("accountData", this.onAccountData); } + this.matrixClient.getCapabilities().then(capabilities => { + this._restrictedJoinRuleSupport = capabilities + ?.["m.room_versions"]?.["org.matrix.msc3244.room_capabilities"]?.["restricted"]; + }); + await this.onSpaceUpdate(); // trigger an initial update // restore selected state from last session if any and still valid