Add option to select role on roomCreation
authorAjay Bura <ajbura@gmail.com>
Fri, 29 Oct 2021 09:29:16 +0000 (14:59 +0530)
committerAjay Bura <ajbura@gmail.com>
Fri, 29 Oct 2021 09:29:16 +0000 (14:59 +0530)
Signed-off-by: Ajay Bura <ajbura@gmail.com>
src/app/organisms/create-room/CreateRoom.jsx
src/app/organisms/create-room/CreateRoom.scss
src/client/action/room.js

index d94c4b17e7d156b8cf0fa0f680266bb2a69b67e5..22ec87fabc966a9737b60865da9951147ee53691 100644 (file)
@@ -5,6 +5,7 @@ import './CreateRoom.scss';
 import initMatrix from '../../../client/initMatrix';
 import { isRoomAliasAvailable } from '../../../util/matrixUtil';
 import * as roomActions from '../../../client/action/room';
+import { selectRoom } from '../../../client/action/navigation';
 
 import Text from '../../atoms/text/Text';
 import Button from '../../atoms/button/Button';
@@ -12,6 +13,7 @@ import Toggle from '../../atoms/button/Toggle';
 import IconButton from '../../atoms/button/IconButton';
 import Input from '../../atoms/input/Input';
 import Spinner from '../../atoms/spinner/Spinner';
+import SegmentControl from '../../atoms/segmented-controls/SegmentedControls';
 import PopupWindow from '../../molecules/popup-window/PopupWindow';
 import SettingTile from '../../molecules/setting-tile/SettingTile';
 
@@ -28,6 +30,7 @@ function CreateRoom({ isOpen, onRequestClose }) {
   const [titleValue, updateTitleValue] = useState(undefined);
   const [topicValue, updateTopicValue] = useState(undefined);
   const [addressValue, updateAddressValue] = useState(undefined);
+  const [roleIndex, setRoleIndex] = useState(0);
 
   const addressRef = useRef(null);
   const topicRef = useRef(null);
@@ -45,6 +48,7 @@ function CreateRoom({ isOpen, onRequestClose }) {
     updateTitleValue(undefined);
     updateTopicValue(undefined);
     updateAddressValue(undefined);
+    setRoleIndex(0);
   }
 
   async function createRoom() {
@@ -60,12 +64,15 @@ function CreateRoom({ isOpen, onRequestClose }) {
       if (roomAlias.trim() === '') roomAlias = undefined;
     }
 
+    const powerLevel = roleIndex === 1 ? 101 : undefined;
+
     try {
-      await roomActions.create({
-        name, topic, isPublic, roomAlias, isEncrypted,
+      const result = 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') {
@@ -139,6 +146,19 @@ function CreateRoom({ isOpen, onRequestClose }) {
               content={<Text variant="b3">You can’t disable this later. Bridges & most bots won’t work yet.</Text>}
             />
           )}
+          <SettingTile
+            title="Select your role"
+            options={(
+              <SegmentControl
+                selected={roleIndex}
+                segments={[{ text: 'Admin' }, { text: 'Founder' }]}
+                onSelect={setRoleIndex}
+              />
+            )}
+            content={(
+              <Text variant="b3">Override the default (100) power level.</Text>
+            )}
+          />
           <Input value={topicValue} onChange={handleTopicChange} forwardRef={topicRef} minHeight={174} resizable label="Topic (optional)" />
           <div className="create-room__name-wrapper">
             <Input value={titleValue} onChange={handleTitleChange} forwardRef={nameRef} label="Room name" required />
index c587fa2f22040ddd2fea7221168ece6d70dd4df2..cb2d5565d9749ad04f5a43b36b015267d9c30b83 100644 (file)
@@ -9,6 +9,13 @@
     }
   }
 
+  & .segment-btn {
+    padding: var(--sp-ultra-tight) 0;
+    &__base {
+      padding: 0 var(--sp-tight);
+    }
+  }
+
   &__address {
     display: flex;
     &__label {
index c887d247a8494ee4d6b1ee7d7f7cf1ac462f94af..f16b97f245b775d090d6f957faa3925f658789c1 100644 (file)
@@ -132,9 +132,11 @@ function leave(roomId) {
  * @param {boolean} [opts.isEncrypted=false] Makes room encrypted
  * @param {boolean} [opts.isDirect=false] Makes room as direct message
  * @param {string[]} [opts.invite=[]] An array of userId's to invite
+ * @param{number} [opts.powerLevel=100] My power level
  */
 async function create(opts) {
   const mx = initMatrix.matrixClient;
+  const customPowerLevels = [101];
   const options = {
     name: opts.name,
     topic: opts.topic,
@@ -144,6 +146,9 @@ async function create(opts) {
     invite: opts.invite || [],
     initial_state: [],
     preset: opts.isDirect === true ? 'trusted_private_chat' : undefined,
+    power_level_content_override: customPowerLevels.indexOf(opts.powerLevel) === -1 ? undefined : {
+      users: { [initMatrix.matrixClient.getUserId()]: opts.powerLevel },
+    },
   };
 
   if (opts.isPublic !== true && opts.isEncrypted === true) {