From 3fef6e6b22306b32604f1f05663cf755e66e6794 Mon Sep 17 00:00:00 2001
From: Michael Telatynski <7t3chguy@gmail.com>
Date: Tue, 10 Sep 2019 08:26:10 +0100
Subject: [PATCH 1/2] Support Synapse deactivate on MemberInfo without Room
 (timeline pill)

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---
 src/components/views/rooms/MemberInfo.js | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/src/components/views/rooms/MemberInfo.js b/src/components/views/rooms/MemberInfo.js
index 867e50ba0d..1b4c13db2c 100644
--- a/src/components/views/rooms/MemberInfo.js
+++ b/src/components/views/rooms/MemberInfo.js
@@ -637,7 +637,10 @@ module.exports = withMatrixClient(React.createClass({
 
     _calculateOpsPermissions: async function(member) {
         const defaultPerms = {
-            can: {},
+            can: {
+                // Calculate permissions for Synapse before doing the PL checks
+                synapseDeactivate: await this.context.matrixClient.isSynapseAdministrator(),
+            },
             muted: false,
         };
         const room = this.props.matrixClient.getRoom(member.roomId);
@@ -651,9 +654,10 @@ module.exports = withMatrixClient(React.createClass({
 
         const them = member;
         return {
-            can: await this._calculateCanPermissions(
-                me, them, powerLevels.getContent(),
-            ),
+            can: {
+                ...defaultPerms.can,
+                ...await this._calculateCanPermissions(me, them, powerLevels.getContent()),
+            },
             muted: this._isMuted(them, powerLevels.getContent()),
             isTargetMod: them.powerLevel > powerLevels.getContent().users_default,
         };
@@ -670,9 +674,6 @@ module.exports = withMatrixClient(React.createClass({
             redactMessages: false,
         };
 
-        // Calculate permissions for Synapse before doing the PL checks
-        can.synapseDeactivate = await this.context.matrixClient.isSynapseAdministrator();
-
         const canAffectUser = them.powerLevel < me.powerLevel || isMe;
         if (!canAffectUser) {
             //console.log("Cannot affect user: %s >= %s", them.powerLevel, me.powerLevel);

From f4ebde1596199761e7468eb570f6c7f2682859ec Mon Sep 17 00:00:00 2001
From: Travis Ralston <travpc@gmail.com>
Date: Thu, 12 Sep 2019 18:30:27 -0600
Subject: [PATCH 2/2] Wrap deactivation check with sanity conditions

To ensure the matrixClient is not null (the problem) and that unexpected errors don't brick the app.

Fixes https://github.com/vector-im/riot-web/issues/10854
---
 src/components/views/rooms/MemberInfo.js | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/src/components/views/rooms/MemberInfo.js b/src/components/views/rooms/MemberInfo.js
index 1b4c13db2c..914e2df3d0 100644
--- a/src/components/views/rooms/MemberInfo.js
+++ b/src/components/views/rooms/MemberInfo.js
@@ -636,10 +636,19 @@ module.exports = withMatrixClient(React.createClass({
     },
 
     _calculateOpsPermissions: async function(member) {
+        let canDeactivate = false;
+        if (this.context.matrixClient) {
+            try {
+                canDeactivate = await this.context.matrixClient.isSynapseAdministrator();
+            } catch (e) {
+                console.error(e);
+            }
+        }
+
         const defaultPerms = {
             can: {
                 // Calculate permissions for Synapse before doing the PL checks
-                synapseDeactivate: await this.context.matrixClient.isSynapseAdministrator(),
+                synapseDeactivate: canDeactivate,
             },
             muted: false,
         };