added ReadReceipts component
authorunknown <ajbura@gmail.com>
Mon, 16 Aug 2021 12:07:29 +0000 (17:37 +0530)
committerunknown <ajbura@gmail.com>
Mon, 16 Aug 2021 12:07:29 +0000 (17:37 +0530)
src/app/organisms/read-receipts/ReadReceipts.jsx [new file with mode: 0644]
src/app/templates/client/Client.jsx
src/client/action/navigation.js
src/client/state/cons.js
src/client/state/navigation.js

diff --git a/src/app/organisms/read-receipts/ReadReceipts.jsx b/src/app/organisms/read-receipts/ReadReceipts.jsx
new file mode 100644 (file)
index 0000000..44d623a
--- /dev/null
@@ -0,0 +1,79 @@
+import React, { useState, useEffect } from 'react';
+
+import initMatrix from '../../../client/initMatrix';
+import cons from '../../../client/state/cons';
+import navigation from '../../../client/state/navigation';
+import { getUsername } from '../../../util/matrixUtil';
+import colorMXID from '../../../util/colorMXID';
+
+import IconButton from '../../atoms/button/IconButton';
+import PeopleSelector from '../../molecules/people-selector/PeopleSelector';
+import Dialog from '../../molecules/dialog/Dialog';
+
+import CrossIC from '../../../../public/res/ic/outlined/cross.svg';
+
+function ReadReceipts() {
+  const [isOpen, setIsOpen] = useState(false);
+  const [roomId, setRoomId] = useState(null);
+  const [readReceipts, setReadReceipts] = useState([]);
+
+  function loadReadReceipts(myRoomId, eventId) {
+    const mx = initMatrix.matrixClient;
+    const room = mx.getRoom(myRoomId);
+    const { timeline } = room;
+    const myReadReceipts = [];
+
+    const myEventIndex = timeline.findIndex((mEvent) => mEvent.getId() === eventId);
+
+    for (let eventIndex = myEventIndex; eventIndex < timeline.length; eventIndex += 1) {
+      myReadReceipts.push(...room.getReceiptsForEvent(timeline[eventIndex]));
+    }
+
+    setReadReceipts(myReadReceipts);
+    setRoomId(myRoomId);
+    setIsOpen(true);
+  }
+
+  useEffect(() => {
+    navigation.on(cons.events.navigation.READRECEIPTS_OPENED, loadReadReceipts);
+    return () => {
+      navigation.removeListener(cons.events.navigation.READRECEIPTS_OPENED, loadReadReceipts);
+    };
+  }, []);
+
+  useEffect(() => {
+    if (isOpen === false) {
+      setRoomId(null);
+      setReadReceipts([]);
+    }
+  }, [isOpen]);
+
+  function renderPeople(receipt) {
+    const room = initMatrix.matrixClient.getRoom(roomId);
+    const member = room.getMember(receipt.userId);
+    return (
+      <PeopleSelector
+        key={receipt.userId}
+        onClick={() => alert('Viewing profile is yet to be implemented')}
+        avatarSrc={member?.getAvatarUrl(initMatrix.matrixClient.baseUrl, 24, 24, 'crop')}
+        name={getUsername(receipt.userId)}
+        color={colorMXID(receipt.userId)}
+      />
+    );
+  }
+
+  return (
+    <Dialog
+      isOpen={isOpen}
+      title="Read receipts"
+      onRequestClose={() => setIsOpen(false)}
+      contentOptions={<IconButton src={CrossIC} onClick={() => setIsOpen(false)} tooltip="Close" />}
+    >
+      {
+        readReceipts.map(renderPeople)
+      }
+    </Dialog>
+  );
+}
+
+export default ReadReceipts;
index 9705c4a5fd38861eebdbbb7f4dabb532c26f7c31..3d8b45d069a42a6e3f53ee8cb459d896381fdd8f 100644 (file)
@@ -6,6 +6,7 @@ import Spinner from '../../atoms/spinner/Spinner';
 import Navigation from '../../organisms/navigation/Navigation';
 import Channel from '../../organisms/channel/Channel';
 import Windows from '../../organisms/pw/Windows';
+import Dialogs from '../../organisms/pw/Dialogs';
 import EmojiBoardOpener from '../../organisms/emoji-board/EmojiBoardOpener';
 
 import initMatrix from '../../../client/initMatrix';
@@ -41,6 +42,7 @@ function Client() {
         <Channel />
       </div>
       <Windows />
+      <Dialogs />
       <EmojiBoardOpener />
     </div>
   );
index a9032f2349c9685b7193eb2be5e729556f1d1a70..543ff4ad97ab68138afc46f460b687c679840fc0 100644 (file)
@@ -62,6 +62,14 @@ function openEmojiBoard(cords, requestEmojiCallback) {
   });
 }
 
+function openReadReceipts(roomId, eventId) {
+  appDispatcher.dispatch({
+    type: cons.actions.navigation.OPEN_READRECEIPTS,
+    roomId,
+    eventId,
+  });
+}
+
 export {
   handleTabChange,
   selectRoom,
@@ -72,4 +80,5 @@ export {
   openInviteUser,
   openSettings,
   openEmojiBoard,
+  openReadReceipts,
 };
index d762e07cced712d3aa5c11f949f9cb2af21bfa47..2ff8c5e2522c05ab8cf7e39bfa09fe25c85b371f 100644 (file)
@@ -17,6 +17,7 @@ const cons = {
       OPEN_INVITE_USER: 'OPEN_INVITE_USER',
       OPEN_SETTINGS: 'OPEN_SETTINGS',
       OPEN_EMOJIBOARD: 'OPEN_EMOJIBOARD',
+      OPEN_READRECEIPTS: 'OPEN_READRECEIPTS',
     },
     room: {
       JOIN: 'JOIN',
@@ -41,6 +42,7 @@ const cons = {
       INVITE_USER_OPENED: 'INVITE_USER_OPENED',
       SETTINGS_OPENED: 'SETTINGS_OPENED',
       EMOJIBOARD_OPENED: 'EMOJIBOARD_OPENED',
+      READRECEIPTS_OPENED: 'READRECEIPTS_OPENED',
     },
     roomList: {
       ROOMLIST_UPDATED: 'ROOMLIST_UPDATED',
index c7984020919a6003679c5e9f731f381645e23b58..b482783672bd02cda490e873cec98f1728917028 100644 (file)
@@ -54,6 +54,13 @@ class Navigation extends EventEmitter {
           action.cords, action.requestEmojiCallback,
         );
       },
+      [cons.actions.navigation.OPEN_READRECEIPTS]: () => {
+        this.emit(
+          cons.events.navigation.READRECEIPTS_OPENED,
+          action.roomId,
+          action.eventId,
+        );
+      },
     };
     actions[action.type]?.();
   }