Add room topic and animation (#11352)

* Create useRoomName hook

Mark RoomName component as deprecated

* Pass out-of-band data to relevant RoomHeader component

* Mark LegacyRoomHeader as deprecated

* Fix incorrect search&replace in _RoomHeader.pcss

* lintfix

* Mark room as optional in room topic hook

* Fix i18n

* Discard use of useCallback

* Change export of useRoomName

* fix ts issue

* lints

* Add room topic to room header

* lintfix

* lintfix & clamp to one line

* Revert optimisations to DecoratedRoomAvatar

* Add test for opening the room summary

* Make transition honour prefer-reduced-motion

* Fallback when room is undefined

* fix snapshot
This commit is contained in:
Germain
2023-08-02 10:54:06 +00:00
committed by GitHub
parent 8166306e0f
commit 33299af5c9
5 changed files with 122 additions and 39 deletions
+23 -3
View File
@@ -19,16 +19,36 @@ import React from "react";
import type { Room } from "matrix-js-sdk/src/models/room";
import { IOOBData } from "../../../stores/ThreepidInviteStore";
import { useRoomName } from "../../../hooks/useRoomName";
import DecoratedRoomAvatar from "../avatars/DecoratedRoomAvatar";
import { RightPanelPhases } from "../../../stores/right-panel/RightPanelStorePhases";
import RightPanelStore from "../../../stores/right-panel/RightPanelStore";
import { useTopic } from "../../../hooks/room/useTopic";
import RoomAvatar from "../avatars/RoomAvatar";
export default function RoomHeader({ room, oobData }: { room?: Room; oobData?: IOOBData }): JSX.Element {
const roomName = useRoomName(room, oobData);
const roomTopic = useTopic(room);
return (
<header className="mx_RoomHeader light-panel">
<div className="mx_RoomHeader_wrapper">
<div className="mx_RoomHeader_name" dir="auto" title={roomName} role="heading" aria-level={1}>
<header
className="mx_RoomHeader light-panel"
onClick={() => {
const rightPanel = RightPanelStore.instance;
rightPanel.isOpen
? rightPanel.togglePanel(null)
: rightPanel.setCard({ phase: RightPanelPhases.RoomSummary });
}}
>
{room ? (
<DecoratedRoomAvatar room={room} oobData={oobData} avatarSize={40} displayBadge={false} />
) : (
<RoomAvatar oobData={oobData} width={40} height={40} />
)}
<div className="mx_RoomHeader_info">
<div dir="auto" title={roomName} role="heading" aria-level={1} className="mx_RoomHeader_name">
{roomName}
</div>
{roomTopic && <div className="mx_RoomHeader_topic">{roomTopic.text}</div>}
</div>
</header>
);
+3 -3
View File
@@ -25,14 +25,14 @@ import { Optional } from "matrix-events-sdk";
import { useTypedEventEmitter } from "../useEventEmitter";
export const getTopic = (room: Room): Optional<TopicState> => {
export const getTopic = (room?: Room): Optional<TopicState> => {
const content = room?.currentState?.getStateEvents(EventType.RoomTopic, "")?.getContent<MRoomTopicEventContent>();
return !!content ? parseTopicContent(content) : null;
};
export function useTopic(room: Room): Optional<TopicState> {
export function useTopic(room?: Room): Optional<TopicState> {
const [topic, setTopic] = useState(getTopic(room));
useTypedEventEmitter(room.currentState, RoomStateEvent.Events, (ev: MatrixEvent) => {
useTypedEventEmitter(room?.currentState, RoomStateEvent.Events, (ev: MatrixEvent) => {
if (ev.getType() !== EventType.RoomTopic) return;
setTopic(getTopic(room));
});