diff --git a/src/app/molecules/room-intro/RoomIntro.jsx b/src/app/molecules/room-intro/RoomIntro.jsx
index 2c6f944..2ec46cb 100644
--- a/src/app/molecules/room-intro/RoomIntro.jsx
+++ b/src/app/molecules/room-intro/RoomIntro.jsx
@@ -2,7 +2,6 @@ import React from 'react';
import PropTypes from 'prop-types';
import './RoomIntro.scss';
-import { twemojify } from '../../../util/twemojify';
import colorMXID from '../../../util/colorMXID';
import Text from '../../atoms/text/Text';
@@ -15,8 +14,8 @@ function RoomIntro({
- {twemojify(heading)}
- {twemojify(desc, undefined, true)}
+ {heading}
+ {desc}
{ time !== null && {time}}
@@ -35,9 +34,9 @@ RoomIntro.propTypes = {
PropTypes.bool,
]),
name: PropTypes.string.isRequired,
- heading: PropTypes.string.isRequired,
- desc: PropTypes.string.isRequired,
- time: PropTypes.string,
+ heading: PropTypes.node.isRequired,
+ desc: PropTypes.node.isRequired,
+ time: PropTypes.node,
};
export default RoomIntro;
diff --git a/src/app/organisms/room/RoomViewContent.jsx b/src/app/organisms/room/RoomViewContent.jsx
index 96839b2..ab1dfba 100644
--- a/src/app/organisms/room/RoomViewContent.jsx
+++ b/src/app/organisms/room/RoomViewContent.jsx
@@ -8,6 +8,7 @@ import PropTypes from 'prop-types';
import './RoomViewContent.scss';
import dateFormat from 'dateformat';
+import { twemojify } from '../../../util/twemojify';
import initMatrix from '../../../client/initMatrix';
import cons from '../../../client/state/cons';
@@ -50,21 +51,54 @@ function loadingMsgPlaceholders(key, count = 2) {
);
}
-function genRoomIntro(mEvent, roomTimeline) {
+function RoomIntroContainer({ event, timeline }) {
+ const [, nameForceUpdate] = useForceUpdate();
const mx = initMatrix.matrixClient;
- const roomTopic = roomTimeline.room.currentState.getStateEvents('m.room.topic')[0]?.getContent().topic;
- const isDM = initMatrix.roomList.directs.has(roomTimeline.roomId);
- let avatarSrc = roomTimeline.room.getAvatarUrl(mx.baseUrl, 80, 80, 'crop');
- avatarSrc = isDM ? roomTimeline.room.getAvatarFallbackMember()?.getAvatarUrl(mx.baseUrl, 80, 80, 'crop') : avatarSrc;
+ const { roomList } = initMatrix;
+ const { room } = timeline;
+ const roomTopic = room.currentState.getStateEvents('m.room.topic')[0]?.getContent().topic;
+ const isDM = roomList.directs.has(timeline.roomId);
+ let avatarSrc = room.getAvatarUrl(mx.baseUrl, 80, 80, 'crop');
+ avatarSrc = isDM ? room.getAvatarFallbackMember()?.getAvatarUrl(mx.baseUrl, 80, 80, 'crop') : avatarSrc;
+
+ const heading = isDM ? room.name : `Welcome to ${room.name}`;
+ const topic = twemojify(roomTopic || '', undefined, true);
+ const nameJsx = twemojify(room.name);
+ const desc = isDM
+ ? (
+ <>
+ This is the beginning of your direct message history with @
+ {nameJsx}
+ {'. '}
+ {topic}
+ >
+ )
+ : (
+ <>
+ {'This is the beginning of the '}
+ {nameJsx}
+ {' room. '}
+ {topic}
+ >
+ );
+
+ useEffect(() => {
+ const handleUpdate = () => nameForceUpdate();
+
+ roomList.on(cons.events.roomList.ROOM_PROFILE_UPDATED, handleUpdate);
+ return () => {
+ roomList.removeListener(cons.events.roomList.ROOM_PROFILE_UPDATED, handleUpdate);
+ };
+ }, []);
+
return (
);
}
@@ -199,7 +233,7 @@ function usePaginate(
};
roomTimeline.on(cons.events.roomTimeline.PAGINATED, handlePaginatedFromServer);
return () => {
- roomTimeline.on(cons.events.roomTimeline.PAGINATED, handlePaginatedFromServer);
+ roomTimeline.removeListener(cons.events.roomTimeline.PAGINATED, handlePaginatedFromServer);
};
}, [roomTimeline]);
@@ -470,12 +504,14 @@ function RoomViewContent({ eventId, roomTimeline }) {
if (i === 0 && !roomTimeline.canPaginateBackward()) {
if (mEvent.getType() === 'm.room.create') {
- tl.push(genRoomIntro(mEvent, roomTimeline));
+ tl.push(
+ ,
+ );
itemCountIndex += 1;
// eslint-disable-next-line no-continue
continue;
} else {
- tl.push(genRoomIntro(undefined, roomTimeline));
+ tl.push();
itemCountIndex += 1;
}
}