From b8ee2d2b5b47f780a8b6b7496ced207a555a9b10 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 14 Sep 2021 16:14:25 +0100 Subject: [PATCH] Add warning that some spaces may not be relinked to the newly upgraded room --- .../views/settings/JoinRuleSettings.tsx | 56 +++++++++++++------ src/i18n/strings/en_EN.json | 3 + 2 files changed, 43 insertions(+), 16 deletions(-) diff --git a/src/components/views/settings/JoinRuleSettings.tsx b/src/components/views/settings/JoinRuleSettings.tsx index 94c70f861e..4713223ec4 100644 --- a/src/components/views/settings/JoinRuleSettings.tsx +++ b/src/components/views/settings/JoinRuleSettings.tsx @@ -28,6 +28,7 @@ import { MatrixClientPeg } from "../../../MatrixClientPeg"; import Modal from "../../../Modal"; import ManageRestrictedJoinRuleDialog from "../dialogs/ManageRestrictedJoinRuleDialog"; import RoomUpgradeWarningDialog from "../dialogs/RoomUpgradeWarningDialog"; +import QuestionDialog from "../dialogs/QuestionDialog"; import { upgradeRoom } from "../../../utils/RoomUpgrade"; import { arrayHasDiff } from "../../../utils/arrays"; import { useLocalEcho } from "../../../hooks/useLocalEcho"; @@ -207,27 +208,50 @@ const JoinRuleSettings = ({ room, promptUpgrade, onError, beforeChange, closeSet } else if (preferredRestrictionVersion) { // Block this action on a room upgrade otherwise it'd make their room unjoinable const targetVersion = preferredRestrictionVersion; - Modal.createTrackedDialog('Restricted join rule upgrade', '', RoomUpgradeWarningDialog, { + + const modal = Modal.createTrackedDialog('Restricted join rule upgrade', '', RoomUpgradeWarningDialog, { roomId: room.roomId, targetVersion, description: _t("This upgrade will allow members of selected spaces " + "access to this room without an invite."), - onFinished: async (resp) => { - if (!resp?.continue) return; - const roomId = await upgradeRoom(room, targetVersion, resp.invite, true, true, true); - closeSettingsFn(); - // switch to the new room in the background - dis.dispatch({ - action: "view_room", - room_id: roomId, - }); - // open new settings on this tab - dis.dispatch({ - action: "open_room_settings", - initial_tab_id: ROOM_SECURITY_TAB, - }); - }, }); + + const [resp] = await modal.finished; + if (!resp?.continue) return; + + const userId = cli.getUserId(); + const unableToUpdateSomeParents = Array.from(SpaceStore.instance.getKnownParents(room.roomId)) + .some(roomId => !cli.getRoom(roomId)?.currentState.maySendStateEvent(EventType.SpaceChild, userId)); + if (unableToUpdateSomeParents) { + const modal = Modal.createTrackedDialog<[boolean]>('Parent relink warning', '', QuestionDialog, { + title: _t("Before you upgrade"), + description: ( +
{ _t("This room is in some spaces you’re not an admin of. " + + "In those spaces, the old room will still be shown, " + + "but people will be prompted to join the new one.") }
+ ), + hasCancelButton: true, + button: _t("Upgrade anyway"), + danger: true, + }); + + const [shouldUpgrade] = await modal.finished; + if (!shouldUpgrade) return; + } + + const roomId = await upgradeRoom(room, targetVersion, resp.invite, true, true, true); + closeSettingsFn(); + // switch to the new room in the background + dis.dispatch({ + action: "view_room", + room_id: roomId, + }); + // open new settings on this tab + dis.dispatch({ + action: "open_room_settings", + initial_tab_id: ROOM_SECURITY_TAB, + }); + return; } diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 90c02aa1b3..2925aaa5d4 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1162,6 +1162,9 @@ "Anyone in a space can find and join. You can select multiple spaces.": "Anyone in a space can find and join. You can select multiple spaces.", "Space members": "Space members", "This upgrade will allow members of selected spaces access to this room without an invite.": "This upgrade will allow members of selected spaces access to this room without an invite.", + "Before you upgrade": "Before you upgrade", + "This room is in some spaces you’re not an admin of. In those spaces, the old room will still be shown, but people will be prompted to join the new one.": "This room is in some spaces you’re not an admin of. In those spaces, the old room will still be shown, but people will be prompted to join the new one.", + "Upgrade anyway": "Upgrade anyway", "Message layout": "Message layout", "IRC": "IRC", "Modern": "Modern",