From 29a81bbe85ca1ca1c4c54534fe94e9d477aef22c Mon Sep 17 00:00:00 2001
From: Aaron Raimist <aaron@raim.ist>
Date: Tue, 10 Nov 2020 15:04:01 -0600
Subject: [PATCH] Warn when you attempt to leave room that you are the only
 member of

Signed-off-by: Aaron Raimist <aaron@raim.ist>
---
 src/components/structures/MatrixChat.tsx | 17 ++++++++++++++++-
 src/i18n/strings/en_EN.json              |  1 +
 2 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/src/components/structures/MatrixChat.tsx b/src/components/structures/MatrixChat.tsx
index 22cd73eff7..43e1798c6e 100644
--- a/src/components/structures/MatrixChat.tsx
+++ b/src/components/structures/MatrixChat.tsx
@@ -1056,8 +1056,21 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> {
     private leaveRoomWarnings(roomId: string) {
         const roomToLeave = MatrixClientPeg.get().getRoom(roomId);
         // Show a warning if there are additional complications.
-        const joinRules = roomToLeave.currentState.getStateEvents('m.room.join_rules', '');
         const warnings = [];
+
+        const memberCount = roomToLeave.currentState.getJoinedMemberCount();
+        if (memberCount === 1) {
+            warnings.push(
+                <span className="warning" key="only_member_warning">
+                    {' '/* Whitespace, otherwise the sentences get smashed together */ }
+                    { _t("You are the only member of this room. This room will become unjoinable if you leave.") }
+                </span>
+            );
+
+            return warnings;
+        }
+
+        const joinRules = roomToLeave.currentState.getStateEvents('m.room.join_rules', '');
         if (joinRules) {
             const rule = joinRules.getContent().join_rule;
             if (rule !== "public") {
@@ -1076,6 +1089,7 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> {
         const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog");
         const roomToLeave = MatrixClientPeg.get().getRoom(roomId);
         const warnings = this.leaveRoomWarnings(roomId);
+        const hasWarnings = warnings.length > 0;
 
         Modal.createTrackedDialog('Leave room', '', QuestionDialog, {
             title: _t("Leave room"),
@@ -1086,6 +1100,7 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> {
                 </span>
             ),
             button: _t("Leave"),
+            danger: hasWarnings,
             onFinished: (shouldLeave) => {
                 if (shouldLeave) {
                     const d = leaveRoomBehaviour(roomId);
diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json
index 78340447f3..b412db5ca0 100644
--- a/src/i18n/strings/en_EN.json
+++ b/src/i18n/strings/en_EN.json
@@ -2317,6 +2317,7 @@
     "Cannot create rooms in this community": "Cannot create rooms in this community",
     "You do not have permission to create rooms in this community.": "You do not have permission to create rooms in this community.",
     "This room is not public. You will not be able to rejoin without an invite.": "This room is not public. You will not be able to rejoin without an invite.",
+    "You are the only member of this room. This room will become unjoinable if you leave.": "You are the only member of this room. This room will become unjoinable if you leave.",
     "Are you sure you want to leave the room '%(roomName)s'?": "Are you sure you want to leave the room '%(roomName)s'?",
     "Failed to forget room %(errCode)s": "Failed to forget room %(errCode)s",
     "Signed Out": "Signed Out",