Fix crash on room create
authorAjay Bura <ajbura@gmail.com>
Tue, 23 Nov 2021 10:54:12 +0000 (16:24 +0530)
committerAjay Bura <ajbura@gmail.com>
Tue, 23 Nov 2021 10:54:12 +0000 (16:24 +0530)
Signed-off-by: Ajay Bura <ajbura@gmail.com>
src/app/organisms/create-room/CreateRoom.jsx
src/app/organisms/profile-viewer/ProfileViewer.jsx
src/app/organisms/room-optons/RoomOptions.jsx

index 22ec87fabc966a9737b60865da9951147ee53691..6c4968ab0b404eebedc17574679fcaccb13cd832 100644 (file)
@@ -1,8 +1,9 @@
-import React, { useState, useRef } from 'react';
+import React, { useState, useEffect, useRef } from 'react';
 import PropTypes from 'prop-types';
 import './CreateRoom.scss';
 
 import initMatrix from '../../../client/initMatrix';
+import cons from '../../../client/state/cons';
 import { isRoomAliasAvailable } from '../../../util/matrixUtil';
 import * as roomActions from '../../../client/action/room';
 import { selectRoom } from '../../../client/action/navigation';
@@ -51,6 +52,20 @@ function CreateRoom({ isOpen, onRequestClose }) {
     setRoleIndex(0);
   }
 
+  const onCreated = (roomId) => {
+    resetForm();
+    selectRoom(roomId);
+    onRequestClose();
+  };
+
+  useEffect(() => {
+    const { roomList } = initMatrix;
+    roomList.on(cons.events.roomList.ROOM_CREATED, onCreated);
+    return () => {
+      roomList.removeListener(cons.events.roomList.ROOM_CREATED, onCreated);
+    };
+  }, []);
+
   async function createRoom() {
     if (isCreatingRoom) return;
     updateIsCreatingRoom(true);
@@ -67,13 +82,9 @@ function CreateRoom({ isOpen, onRequestClose }) {
     const powerLevel = roleIndex === 1 ? 101 : undefined;
 
     try {
-      const result = await roomActions.create({
+      await roomActions.create({
         name, topic, isPublic, roomAlias, isEncrypted, powerLevel,
       });
-
-      resetForm();
-      selectRoom(result.room_id);
-      onRequestClose();
     } catch (e) {
       if (e.message === 'M_UNKNOWN: Invalid characters in room alias') {
         updateCreatingError('ERROR: Invalid characters in room address');
@@ -82,8 +93,8 @@ function CreateRoom({ isOpen, onRequestClose }) {
         updateCreatingError('ERROR: Room address is already in use');
         updateIsValidAddress(false);
       } else updateCreatingError(e.message);
+      updateIsCreatingRoom(false);
     }
-    updateIsCreatingRoom(false);
   }
 
   function validateAddress(e) {
index b9fe44837fef968923d253b751d7eb2439c4b653..41a43fc58e04b132c3c26db0d4f9c29d22b40188 100644 (file)
@@ -97,8 +97,20 @@ function ProfileFooter({ roomId, userId, onRequestClose }) {
   const myPowerlevel = room.getMember(mx.getUserId()).powerLevel;
   const canIKick = room.currentState.hasSufficientPowerLevelFor('kick', myPowerlevel);
 
+  const onCreated = (dmRoomId) => {
+    if (isMountedRef.current === false) return;
+    setIsCreatingDM(false);
+    selectRoom(dmRoomId);
+    onRequestClose();
+  };
+
   useEffect(() => () => {
     isMountedRef.current = false;
+    const { roomList } = initMatrix;
+    roomList.on(cons.events.roomList.ROOM_CREATED, onCreated);
+    return () => {
+      roomList.removeListener(cons.events.roomList.ROOM_CREATED, onCreated);
+    };
   }, []);
   useEffect(() => {
     setIsUserIgnored(initMatrix.matrixClient.isUserIgnored(userId));
@@ -113,7 +125,7 @@ function ProfileFooter({ roomId, userId, onRequestClose }) {
     for (let i = 0; i < directIds.length; i += 1) {
       const dRoom = mx.getRoom(directIds[i]);
       const roomMembers = dRoom.getMembers();
-      if (roomMembers.length <= 2 && dRoom.currentState.members[userId]) {
+      if (roomMembers.length <= 2 && dRoom.getMember(userId)) {
         selectRoom(directIds[i]);
         onRequestClose();
         return;
@@ -123,17 +135,13 @@ function ProfileFooter({ roomId, userId, onRequestClose }) {
     // Create new DM
     try {
       setIsCreatingDM(true);
-      const result = await roomActions.create({
+      await roomActions.create({
         isEncrypted: true,
         isDirect: true,
         invite: [userId],
       });
-
-      if (isMountedRef.current === false) return;
-      setIsCreatingDM(false);
-      selectRoom(result.room_id);
-      onRequestClose();
     } catch {
+      if (isMountedRef.current === false) return;
       setIsCreatingDM(false);
     }
   }
index 0c89008557d8c9d88ca97394f66b2bf5e27d8794..dbacc548ed55e96da4b9fdaa1aa801a427f1bf95 100644 (file)
@@ -147,8 +147,11 @@ function RoomOptions() {
   }, []);
 
   const handleInviteClick = () => openInviteUser(roomId);
-  const handleLeaveClick = () => {
-    if (confirm('Are you really want to leave this room?')) roomActions.leave(roomId);
+  const handleLeaveClick = (toggleMenu) => {
+    if (confirm('Are you really want to leave this room?')) {
+      roomActions.leave(roomId);
+      toggleMenu();
+    }
   };
 
   function setNotif(nState, currentNState) {
@@ -172,7 +175,7 @@ function RoomOptions() {
           >
             Invite
           </MenuItem>
-          <MenuItem iconSrc={LeaveArrowIC} variant="danger" onClick={handleLeaveClick}>Leave</MenuItem>
+          <MenuItem iconSrc={LeaveArrowIC} variant="danger" onClick={() => handleLeaveClick(toggleMenu)}>Leave</MenuItem>
           <MenuHeader>Notification</MenuHeader>
           <MenuItem
             variant={notifState === cons.notifs.DEFAULT ? 'positive' : 'surface'}