From d551469543c97202d5115c86c8a81ca96d1a62d0 Mon Sep 17 00:00:00 2001 From: Germain <germains@element.io> Date: Fri, 1 Sep 2023 10:45:50 +0100 Subject: [PATCH] Room header UI updates (#11507) * Fix performance issues with useRoomMembers With the current implementation it would create a new function, with leading: true, rendering the whole throttling useless * Add public room indicator * Format room members count better * Add public room test * Add search to room summary card * Update settings UI * Update snapshot * Remove default title attribute --- res/css/_common.pcss | 8 +++++ .../views/right_panel/_RoomSummaryCard.pcss | 4 +++ res/css/views/rooms/_RoomHeader.pcss | 6 ++++ src/components/structures/RightPanel.tsx | 2 ++ src/components/structures/RoomView.tsx | 1 + src/components/views/avatars/BaseAvatar.tsx | 2 +- .../views/right_panel/RoomSummaryCard.tsx | 11 +++++- src/components/views/rooms/RoomHeader.tsx | 30 ++++++++++++---- src/hooks/useRoomMembers.ts | 31 +++++++++-------- src/i18n/strings/en_EN.json | 5 +-- src/settings/Settings.tsx | 1 + .../__snapshots__/RoomView-test.tsx.snap | 14 ++++---- .../SpaceHierarchy-test.tsx.snap | 8 ++--- .../__snapshots__/UserMenu-test.tsx.snap | 2 +- .../__snapshots__/RoomAvatar-test.tsx.snap | 6 ++-- ...nageRestrictedJoinRuleDialog-test.tsx.snap | 2 +- .../__snapshots__/AppTile-test.tsx.snap | 3 -- .../__snapshots__/FacePile-test.tsx.snap | 2 +- .../elements/__snapshots__/Pill-test.tsx.snap | 16 ++++----- .../__snapshots__/RoomFacePile-test.tsx.snap | 2 +- .../views/messages/TextualBody-test.tsx | 2 +- .../__snapshots__/TextualBody-test.tsx.snap | 22 +++++------- .../RoomSummaryCard-test.tsx.snap | 9 ++++- .../__snapshots__/UserInfo-test.tsx.snap | 2 +- .../views/rooms/RoomHeader-test.tsx | 22 +++++++++++- .../PinnedEventTile-test.tsx.snap | 2 +- .../__snapshots__/RoomHeader-test.tsx.snap | 34 ++++++++----------- .../RoomPreviewBar-test.tsx.snap | 8 ++--- .../__snapshots__/RoomTile-test.tsx.snap | 8 ++--- .../AddExistingToSpaceDialog-test.tsx.snap | 3 +- .../__snapshots__/HTMLExport-test.ts.snap | 4 +-- yarn.lock | 16 ++++----- 32 files changed, 176 insertions(+), 112 deletions(-) diff --git a/res/css/_common.pcss b/res/css/_common.pcss index a560474a0b..c24ee60a82 100644 --- a/res/css/_common.pcss +++ b/res/css/_common.pcss @@ -134,6 +134,14 @@ code { color: $muted-fg-color; } +.text-primary { + color: $primary-content; +} + +.text-secondary { + color: $secondary-content; +} + .mx_Verified { color: $e2e-verified-color; } diff --git a/res/css/views/right_panel/_RoomSummaryCard.pcss b/res/css/views/right_panel/_RoomSummaryCard.pcss index 0c11cab73b..ec3911c17f 100644 --- a/res/css/views/right_panel/_RoomSummaryCard.pcss +++ b/res/css/views/right_panel/_RoomSummaryCard.pcss @@ -268,3 +268,7 @@ limitations under the License. .mx_RoomSummaryCard_icon_poll::before { mask-image: url("$(res)/img/element-icons/room/composer/poll.svg"); } + +.mx_RoomSummaryCard_icon_search::before { + mask-image: url("$(res)/img/element-icons/room/search-inset.svg"); +} diff --git a/res/css/views/rooms/_RoomHeader.pcss b/res/css/views/rooms/_RoomHeader.pcss index edb596aa29..2614e1713a 100644 --- a/res/css/views/rooms/_RoomHeader.pcss +++ b/res/css/views/rooms/_RoomHeader.pcss @@ -26,6 +26,12 @@ limitations under the License. flex: 1; } +.mx_RoomHeader_heading { + display: flex; + gap: var(--cpd-space-1x); + align-items: center; +} + .mx_RoomHeader_topic { height: 0; opacity: 0; diff --git a/src/components/structures/RightPanel.tsx b/src/components/structures/RightPanel.tsx index fa4269b312..c9d64df968 100644 --- a/src/components/structures/RightPanel.tsx +++ b/src/components/structures/RightPanel.tsx @@ -57,6 +57,7 @@ interface RoomlessProps extends BaseProps { interface RoomProps extends BaseProps { room: Room; permalinkCreator: RoomPermalinkCreator; + onSearchClick?: () => void; } type Props = XOR<RoomlessProps, RoomProps>; @@ -293,6 +294,7 @@ export default class RightPanel extends React.Component<Props, IState> { onClose={this.onClose} // whenever RightPanel is passed a room it is passed a permalinkcreator permalinkCreator={this.props.permalinkCreator!} + onSearchClick={this.props.onSearchClick} /> ); } diff --git a/src/components/structures/RoomView.tsx b/src/components/structures/RoomView.tsx index e8521aee24..59906c5a74 100644 --- a/src/components/structures/RoomView.tsx +++ b/src/components/structures/RoomView.tsx @@ -2443,6 +2443,7 @@ export class RoomView extends React.Component<IRoomProps, IRoomState> { resizeNotifier={this.props.resizeNotifier} permalinkCreator={this.permalinkCreator} e2eStatus={this.state.e2eStatus} + onSearchClick={this.onSearchClick} /> ) : undefined; diff --git a/src/components/views/avatars/BaseAvatar.tsx b/src/components/views/avatars/BaseAvatar.tsx index 40932cf724..d01a5affe0 100644 --- a/src/components/views/avatars/BaseAvatar.tsx +++ b/src/components/views/avatars/BaseAvatar.tsx @@ -99,7 +99,7 @@ const BaseAvatar: React.FC<IProps> = (props) => { const { name, idName, - title = "", + title, url, urls, size = "40px", diff --git a/src/components/views/right_panel/RoomSummaryCard.tsx b/src/components/views/right_panel/RoomSummaryCard.tsx index 94c2069af4..2fbccfb57f 100644 --- a/src/components/views/right_panel/RoomSummaryCard.tsx +++ b/src/components/views/right_panel/RoomSummaryCard.tsx @@ -58,6 +58,7 @@ interface IProps { room: Room; permalinkCreator: RoomPermalinkCreator; onClose(): void; + onSearchClick?: () => void; } interface IAppsSectionProps { @@ -272,7 +273,7 @@ const onRoomSettingsClick = (ev: ButtonEvent): void => { PosthogTrackers.trackInteraction("WebRightPanelRoomInfoSettingsButton", ev); }; -const RoomSummaryCard: React.FC<IProps> = ({ room, permalinkCreator, onClose }) => { +const RoomSummaryCard: React.FC<IProps> = ({ room, permalinkCreator, onClose, onSearchClick }) => { const cli = useContext(MatrixClientContext); const onShareRoomClick = (): void => { @@ -342,6 +343,14 @@ const RoomSummaryCard: React.FC<IProps> = ({ room, permalinkCreator, onClose }) {_t("common|people")} <span className="mx_BaseCard_Button_sublabel">{memberCount}</span> </Button> + <Button + className="mx_RoomSummaryCard_icon_search" + onClick={() => { + onSearchClick?.(); + }} + > + {_t("Search")} + </Button> {!isVideoRoom && ( <Button className="mx_RoomSummaryCard_icon_files" onClick={onRoomFilesClick}> {_t("Files")} diff --git a/src/components/views/rooms/RoomHeader.tsx b/src/components/views/rooms/RoomHeader.tsx index 188c44f51b..cdfd6d833d 100644 --- a/src/components/views/rooms/RoomHeader.tsx +++ b/src/components/views/rooms/RoomHeader.tsx @@ -22,18 +22,18 @@ import { Icon as ThreadsIcon } from "@vector-im/compound-design-tokens/icons/thr import { Icon as NotificationsIcon } from "@vector-im/compound-design-tokens/icons/notifications-solid.svg"; import { Icon as VerifiedIcon } from "@vector-im/compound-design-tokens/icons/verified.svg"; import { Icon as ErrorIcon } from "@vector-im/compound-design-tokens/icons/error.svg"; +import { Icon as PublicIcon } from "@vector-im/compound-design-tokens/icons/public.svg"; import { CallType } from "matrix-js-sdk/src/webrtc/call"; -import { EventType, type Room } from "matrix-js-sdk/src/matrix"; +import { EventType, JoinRule, type Room } from "matrix-js-sdk/src/matrix"; 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 { useAccountData } from "../../../hooks/useAccountData"; import { useMatrixClientContext } from "../../../contexts/MatrixClientContext"; import { useRoomMemberCount, useRoomMembers } from "../../../hooks/useRoomMembers"; -import { _t, getCurrentLanguage } from "../../../languageHandler"; +import { _t } from "../../../languageHandler"; import { Flex } from "../../utils/Flex"; import { Box } from "../../utils/Box"; import { useRoomCallStatus } from "../../../hooks/room/useRoomCallStatus"; @@ -46,6 +46,9 @@ import { placeCall } from "../../../utils/room/placeCall"; import { useEncryptionStatus } from "../../../hooks/useEncryptionStatus"; import { E2EStatus } from "../../../utils/ShieldUtils"; import FacePile from "../elements/FacePile"; +import { useRoomState } from "../../../hooks/useRoomState"; +import RoomAvatar from "../avatars/RoomAvatar"; +import { formatCount } from "../../../utils/FormattingUtils"; /** * A helper to transform a notification color to the what the Compound Icon Button @@ -76,9 +79,10 @@ export default function RoomHeader({ room }: { room: Room }): JSX.Element { const roomName = useRoomName(room); const roomTopic = useTopic(room); + const roomState = useRoomState(room); - const members = useRoomMembers(room); - const memberCount = useRoomMemberCount(room); + const members = useRoomMembers(room, 2500); + const memberCount = useRoomMemberCount(room, { throttleWait: 2500 }); const { voiceCallDisabledReason, voiceCallType, videoCallDisabledReason, videoCallType } = useRoomCallStatus(room); @@ -116,7 +120,7 @@ export default function RoomHeader({ room }: { room: Room }): JSX.Element { showOrHidePanel(RightPanelPhases.RoomSummary); }} > - <DecoratedRoomAvatar room={room} size="40px" displayBadge={false} /> + <RoomAvatar room={room} size="40px" /> <Box flex="1" className="mx_RoomHeader_info"> <BodyText as="div" @@ -126,9 +130,21 @@ export default function RoomHeader({ room }: { room: Room }): JSX.Element { title={roomName} role="heading" aria-level={1} + className="mx_RoomHeader_heading" > {roomName} + {!isDirectMessage && roomState.getJoinRule() === JoinRule.Public && ( + <Tooltip label={_t("Public room")}> + <PublicIcon + width="16px" + height="16px" + className="text-secondary" + aria-label={_t("Public room")} + /> + </Tooltip> + )} + {isDirectMessage && e2eStatus === E2EStatus.Verified && ( <Tooltip label={_t("common|verified")}> <VerifiedIcon @@ -214,7 +230,7 @@ export default function RoomHeader({ room }: { room: Room }): JSX.Element { size="20px" overflow={false} > - {memberCount.toLocaleString(getCurrentLanguage())} + {formatCount(memberCount)} </FacePile> </BodyText> )} diff --git a/src/hooks/useRoomMembers.ts b/src/hooks/useRoomMembers.ts index f054d7337b..c0436562df 100644 --- a/src/hooks/useRoomMembers.ts +++ b/src/hooks/useRoomMembers.ts @@ -23,17 +23,20 @@ import { useTypedEventEmitter } from "./useEventEmitter"; // Hook to simplify watching Matrix Room joined members export const useRoomMembers = (room: Room, throttleWait = 250): RoomMember[] => { const [members, setMembers] = useState<RoomMember[]>(room.getJoinedMembers()); - useTypedEventEmitter( - room.currentState, - RoomStateEvent.Members, - throttle( - () => { - setMembers(room.getJoinedMembers()); - }, - throttleWait, - { leading: true, trailing: true }, - ), + + const throttledUpdate = useMemo( + () => + throttle( + () => { + setMembers(room.getJoinedMembers()); + }, + throttleWait, + { leading: true, trailing: true }, + ), + [room, throttleWait], ); + + useTypedEventEmitter(room.currentState, RoomStateEvent.Members, throttledUpdate); return members; }; @@ -50,11 +53,11 @@ type RoomMemberCountOpts = { * @param opts The options. * @returns the room member count. */ -export const useRoomMemberCount = (room: Room, opts: RoomMemberCountOpts = { throttleWait: 250 }): number => { +export const useRoomMemberCount = ( + room: Room, + { throttleWait }: RoomMemberCountOpts = { throttleWait: 250 }, +): number => { const [count, setCount] = useState<number>(room.getJoinedMemberCount()); - - const { throttleWait } = opts; - const throttledUpdate = useMemo( () => throttle( diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 963e5093bd..020d14db73 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -897,7 +897,7 @@ "hidebold": "Hide notification dot (only display counters badges)", "intentional_mentions": "Enable intentional mentions", "ask_to_join": "Enable ask to join", - "new_room_decoration_ui": "Under active development, new room header & details interface" + "new_room_decoration_ui": "New room header & details interface" }, "Thank you for trying the beta, please go into as much detail as you can so we can improve it.": "Thank you for trying the beta, please go into as much detail as you can so we can improve it.", "Notification Settings": "Notification Settings", @@ -1876,6 +1876,7 @@ "Room %(name)s": "Room %(name)s", "Recently visited rooms": "Recently visited rooms", "No recently visited rooms": "No recently visited rooms", + "Public room": "Public room", "Untrusted": "Untrusted", "%(count)s members": { "other": "%(count)s members", @@ -1883,7 +1884,6 @@ }, "Video room": "Video room", "Public space": "Public space", - "Public room": "Public room", "Private space": "Private space", "Private room": "Private room", "%(names)s and %(name)s": "%(names)s and %(name)s", @@ -2112,6 +2112,7 @@ "Edit widgets, bridges & bots": "Edit widgets, bridges & bots", "Add widgets, bridges & bots": "Add widgets, bridges & bots", "Not encrypted": "Not encrypted", + "Search": "Search", "Files": "Files", "Poll history": "Poll history", "Pinned": "Pinned", diff --git a/src/settings/Settings.tsx b/src/settings/Settings.tsx index 5cbf836965..58ed0f705e 100644 --- a/src/settings/Settings.tsx +++ b/src/settings/Settings.tsx @@ -548,6 +548,7 @@ export const SETTINGS: { [setting: string]: ISetting } = { isFeature: true, labsGroup: LabGroup.Rooms, displayName: _td("labs|new_room_decoration_ui"), + description: _td("labs|under_active_development"), supportedLevels: LEVELS_FEATURE, default: false, controller: new ReloadOnChangeController(), diff --git a/test/components/structures/__snapshots__/RoomView-test.tsx.snap b/test/components/structures/__snapshots__/RoomView-test.tsx.snap index 6d678141dc..1efaa2bbb5 100644 --- a/test/components/structures/__snapshots__/RoomView-test.tsx.snap +++ b/test/components/structures/__snapshots__/RoomView-test.tsx.snap @@ -24,7 +24,7 @@ exports[`RoomView for a local room in state CREATING should match the snapshot 1 data-type="round" role="presentation" style="--cpd-avatar-size: 24px;" - title="" + title="@user:example.com" > u </span> @@ -107,7 +107,7 @@ exports[`RoomView for a local room in state ERROR should match the snapshot 1`] data-type="round" role="presentation" style="--cpd-avatar-size: 24px;" - title="" + title="@user:example.com" > u </span> @@ -187,7 +187,7 @@ exports[`RoomView for a local room in state ERROR should match the snapshot 1`] data-type="round" role="button" style="--cpd-avatar-size: 52px;" - title="" + title="@user:example.com" > u </button> @@ -276,7 +276,7 @@ exports[`RoomView for a local room in state NEW should match the snapshot 1`] = data-type="round" role="presentation" style="--cpd-avatar-size: 24px;" - title="" + title="@user:example.com" > u </span> @@ -356,7 +356,7 @@ exports[`RoomView for a local room in state NEW should match the snapshot 1`] = data-type="round" role="button" style="--cpd-avatar-size: 52px;" - title="" + title="@user:example.com" > u </button> @@ -520,7 +520,7 @@ exports[`RoomView for a local room in state NEW that is encrypted should match t data-type="round" role="presentation" style="--cpd-avatar-size: 24px;" - title="" + title="@user:example.com" > u </span> @@ -599,7 +599,7 @@ exports[`RoomView for a local room in state NEW that is encrypted should match t data-type="round" role="button" style="--cpd-avatar-size: 52px;" - title="" + title="@user:example.com" > u </button> diff --git a/test/components/structures/__snapshots__/SpaceHierarchy-test.tsx.snap b/test/components/structures/__snapshots__/SpaceHierarchy-test.tsx.snap index 1e7edb176c..407bf372bc 100644 --- a/test/components/structures/__snapshots__/SpaceHierarchy-test.tsx.snap +++ b/test/components/structures/__snapshots__/SpaceHierarchy-test.tsx.snap @@ -77,7 +77,7 @@ exports[`SpaceHierarchy <SpaceHierarchy /> renders 1`] = ` data-type="round" role="presentation" style="--cpd-avatar-size: 20px;" - title="" + title="room-id-2" > U </span> @@ -148,7 +148,7 @@ exports[`SpaceHierarchy <SpaceHierarchy /> renders 1`] = ` data-type="round" role="presentation" style="--cpd-avatar-size: 20px;" - title="" + title="room-id-3" > U </span> @@ -220,7 +220,7 @@ exports[`SpaceHierarchy <SpaceHierarchy /> renders 1`] = ` data-type="round" role="presentation" style="--cpd-avatar-size: 20px;" - title="" + title="space-id-4" > N </span> @@ -298,7 +298,7 @@ exports[`SpaceHierarchy <SpaceHierarchy /> renders 1`] = ` data-type="round" role="presentation" style="--cpd-avatar-size: 20px;" - title="" + title="room-id-5" > N </span> diff --git a/test/components/structures/__snapshots__/UserMenu-test.tsx.snap b/test/components/structures/__snapshots__/UserMenu-test.tsx.snap index d8003602f4..a445cdf303 100644 --- a/test/components/structures/__snapshots__/UserMenu-test.tsx.snap +++ b/test/components/structures/__snapshots__/UserMenu-test.tsx.snap @@ -24,7 +24,7 @@ exports[`<UserMenu> when rendered should render as expected 1`] = ` data-type="round" role="presentation" style="--cpd-avatar-size: 32px;" - title="" + title="@userId:matrix.org" > u </span> diff --git a/test/components/views/avatars/__snapshots__/RoomAvatar-test.tsx.snap b/test/components/views/avatars/__snapshots__/RoomAvatar-test.tsx.snap index cd545107be..f3dffc1a26 100644 --- a/test/components/views/avatars/__snapshots__/RoomAvatar-test.tsx.snap +++ b/test/components/views/avatars/__snapshots__/RoomAvatar-test.tsx.snap @@ -9,7 +9,7 @@ exports[`RoomAvatar should render as expected for a DM room 1`] = ` data-type="round" role="presentation" style="--cpd-avatar-size: 36px;" - title="" + title="@dm_user@example.com" > D </span> @@ -25,7 +25,7 @@ exports[`RoomAvatar should render as expected for a LocalRoom 1`] = ` data-type="round" role="presentation" style="--cpd-avatar-size: 36px;" - title="" + title="@local_room_user@example.com" > l </span> @@ -41,7 +41,7 @@ exports[`RoomAvatar should render as expected for a Room 1`] = ` data-type="round" role="presentation" style="--cpd-avatar-size: 36px;" - title="" + title="!room:example.com" > t </span> diff --git a/test/components/views/dialogs/__snapshots__/ManageRestrictedJoinRuleDialog-test.tsx.snap b/test/components/views/dialogs/__snapshots__/ManageRestrictedJoinRuleDialog-test.tsx.snap index 0e29403ed5..bc886f39ec 100644 --- a/test/components/views/dialogs/__snapshots__/ManageRestrictedJoinRuleDialog-test.tsx.snap +++ b/test/components/views/dialogs/__snapshots__/ManageRestrictedJoinRuleDialog-test.tsx.snap @@ -77,7 +77,7 @@ exports[`<ManageRestrictedJoinRuleDialog /> should list spaces which are not par data-type="round" role="presentation" style="--cpd-avatar-size: 20px;" - title="" + title="!space:server" > O </span> diff --git a/test/components/views/elements/__snapshots__/AppTile-test.tsx.snap b/test/components/views/elements/__snapshots__/AppTile-test.tsx.snap index 682bb61314..5f30df761f 100644 --- a/test/components/views/elements/__snapshots__/AppTile-test.tsx.snap +++ b/test/components/views/elements/__snapshots__/AppTile-test.tsx.snap @@ -120,7 +120,6 @@ exports[`AppTile for a pinned widget should render 1`] = ` loading="lazy" referrerpolicy="no-referrer" src="image-file-stub" - title="" width="20px" /> </span> @@ -209,7 +208,6 @@ exports[`AppTile for a pinned widget should render permission request 1`] = ` loading="lazy" referrerpolicy="no-referrer" src="image-file-stub" - title="" width="20px" /> </span> @@ -366,7 +364,6 @@ exports[`AppTile preserves non-persisted widget on container move 1`] = ` loading="lazy" referrerpolicy="no-referrer" src="image-file-stub" - title="" width="20px" /> </span> diff --git a/test/components/views/elements/__snapshots__/FacePile-test.tsx.snap b/test/components/views/elements/__snapshots__/FacePile-test.tsx.snap index ab12a66b22..bb39ac6ba4 100644 --- a/test/components/views/elements/__snapshots__/FacePile-test.tsx.snap +++ b/test/components/views/elements/__snapshots__/FacePile-test.tsx.snap @@ -16,7 +16,7 @@ exports[`<FacePile /> renders with a tooltip 1`] = ` data-type="round" role="presentation" style="--cpd-avatar-size: 36px;" - title="" + title="456" > 4 </span> diff --git a/test/components/views/elements/__snapshots__/Pill-test.tsx.snap b/test/components/views/elements/__snapshots__/Pill-test.tsx.snap index a7bedd5f48..b7fb9d0380 100644 --- a/test/components/views/elements/__snapshots__/Pill-test.tsx.snap +++ b/test/components/views/elements/__snapshots__/Pill-test.tsx.snap @@ -41,7 +41,7 @@ exports[`<Pill> should render the expected pill for @room 1`] = ` data-type="round" role="presentation" style="--cpd-avatar-size: 16px;" - title="" + title="!room1:example.com" > R </span> @@ -73,7 +73,7 @@ exports[`<Pill> should render the expected pill for a known user not in the room data-type="round" role="presentation" style="--cpd-avatar-size: 16px;" - title="" + title="@user2:example.com" > U </span> @@ -105,7 +105,7 @@ exports[`<Pill> should render the expected pill for a message in another room 1` data-type="round" role="presentation" style="--cpd-avatar-size: 16px;" - title="" + title="!room1:example.com" > R </span> @@ -137,7 +137,7 @@ exports[`<Pill> should render the expected pill for a message in the same room 1 data-type="round" role="presentation" style="--cpd-avatar-size: 16px;" - title="" + title="@user1:example.com" > U </span> @@ -169,7 +169,7 @@ exports[`<Pill> should render the expected pill for a room alias 1`] = ` data-type="round" role="presentation" style="--cpd-avatar-size: 16px;" - title="" + title="!room1:example.com" > R </span> @@ -201,7 +201,7 @@ exports[`<Pill> should render the expected pill for a space 1`] = ` data-type="round" role="presentation" style="--cpd-avatar-size: 16px;" - title="" + title="!space1:example.com" > S </span> @@ -256,7 +256,7 @@ exports[`<Pill> when rendering a pill for a room should render the expected pill data-type="round" role="presentation" style="--cpd-avatar-size: 16px;" - title="" + title="!room1:example.com" > R </span> @@ -288,7 +288,7 @@ exports[`<Pill> when rendering a pill for a user in the room should render as ex data-type="round" role="presentation" style="--cpd-avatar-size: 16px;" - title="" + title="@user1:example.com" > U </span> diff --git a/test/components/views/elements/__snapshots__/RoomFacePile-test.tsx.snap b/test/components/views/elements/__snapshots__/RoomFacePile-test.tsx.snap index d77162bc53..68c82187ba 100644 --- a/test/components/views/elements/__snapshots__/RoomFacePile-test.tsx.snap +++ b/test/components/views/elements/__snapshots__/RoomFacePile-test.tsx.snap @@ -16,7 +16,7 @@ exports[`<RoomFacePile /> renders 1`] = ` data-type="round" role="presentation" style="--cpd-avatar-size: 28px;" - title="" + title="@bob:example.org" > b </span> diff --git a/test/components/views/messages/TextualBody-test.tsx b/test/components/views/messages/TextualBody-test.tsx index a6b22a7412..b2e09fa48f 100644 --- a/test/components/views/messages/TextualBody-test.tsx +++ b/test/components/views/messages/TextualBody-test.tsx @@ -199,7 +199,7 @@ describe("<TextualBody />", () => { const { container } = getComponent({ mxEvent: ev }); const content = container.querySelector(".mx_EventTile_body"); expect(content.innerHTML).toMatchInlineSnapshot( - `"Chat with <span><bdi><a class="mx_Pill mx_UserPill mx_UserPill_me" href="https://matrix.to/#/@user:example.com" aria-describedby="mx_Pill_0.123456"><span title="" aria-label="Profile picture" aria-hidden="true" data-testid="avatar-img" data-type="round" data-color="8" class="_avatar_2lhia_17 mx_BaseAvatar" style="--cpd-avatar-size: 16px;"><img loading="lazy" alt="" src="mxc://avatar.url/image.png" crossorigin="anonymous" referrerpolicy="no-referrer" class="_image_2lhia_45" data-type="round" width="16px" height="16px" title="@member:domain.bla"></span><span class="mx_Pill_text">Member</span></a></bdi></span>"`, + `"Chat with <span><bdi><a class="mx_Pill mx_UserPill mx_UserPill_me" href="https://matrix.to/#/@user:example.com" aria-describedby="mx_Pill_0.123456"><span title="@member:domain.bla" aria-label="Profile picture" aria-hidden="true" data-testid="avatar-img" data-type="round" data-color="8" class="_avatar_2lhia_17 mx_BaseAvatar" style="--cpd-avatar-size: 16px;"><img loading="lazy" alt="" src="mxc://avatar.url/image.png" crossorigin="anonymous" referrerpolicy="no-referrer" class="_image_2lhia_45" data-type="round" width="16px" height="16px"></span><span class="mx_Pill_text">Member</span></a></bdi></span>"`, ); }); diff --git a/test/components/views/messages/__snapshots__/TextualBody-test.tsx.snap b/test/components/views/messages/__snapshots__/TextualBody-test.tsx.snap index 6c3434ce72..518e2b8299 100644 --- a/test/components/views/messages/__snapshots__/TextualBody-test.tsx.snap +++ b/test/components/views/messages/__snapshots__/TextualBody-test.tsx.snap @@ -62,7 +62,7 @@ exports[`<TextualBody /> renders formatted m.text correctly pills appear for an data-testid="avatar-img" data-type="round" style="--cpd-avatar-size: 16px;" - title="" + title="@member:domain.bla" > <img alt="" @@ -73,7 +73,6 @@ exports[`<TextualBody /> renders formatted m.text correctly pills appear for an loading="lazy" referrerpolicy="no-referrer" src="mxc://avatar.url/image.png" - title="@member:domain.bla" width="16px" /> </span> @@ -113,7 +112,7 @@ exports[`<TextualBody /> renders formatted m.text correctly pills appear for eve data-testid="avatar-img" data-type="round" style="--cpd-avatar-size: 16px;" - title="" + title="!room1:example.com" > <img alt="" @@ -124,7 +123,6 @@ exports[`<TextualBody /> renders formatted m.text correctly pills appear for eve loading="lazy" referrerpolicy="no-referrer" src="mxc://avatar.url/room.png" - title="!room1:example.com" width="16px" /> </span> @@ -166,7 +164,7 @@ exports[`<TextualBody /> renders formatted m.text correctly pills appear for roo data-testid="avatar-img" data-type="round" style="--cpd-avatar-size: 16px;" - title="" + title="!room1:example.com" > <img alt="" @@ -177,7 +175,6 @@ exports[`<TextualBody /> renders formatted m.text correctly pills appear for roo loading="lazy" referrerpolicy="no-referrer" src="mxc://avatar.url/room.png" - title="!room1:example.com" width="16px" /> </span> @@ -278,7 +275,7 @@ exports[`<TextualBody /> renders formatted m.text correctly pills get injected c data-testid="avatar-img" data-type="round" style="--cpd-avatar-size: 16px;" - title="" + title="@member:domain.bla" > <img alt="" @@ -289,7 +286,6 @@ exports[`<TextualBody /> renders formatted m.text correctly pills get injected c loading="lazy" referrerpolicy="no-referrer" src="mxc://avatar.url/image.png" - title="@member:domain.bla" width="16px" /> </span> @@ -313,7 +309,7 @@ exports[`<TextualBody /> renders plain-text m.text correctly should pillify a pe href="https://matrix.to/#/!room1:example.com/%event_id%" aria-describedby="mx_Pill_0.123456" ><span - title="" + title="@member:domain.bla" aria-label="Profile picture" aria-hidden="true" data-testid="avatar-img" @@ -330,8 +326,7 @@ exports[`<TextualBody /> renders plain-text m.text correctly should pillify a pe class="_image_2lhia_45" data-type="round" width="16px" - height="16px" - title="@member:domain.bla" /></span + height="16px" /></span ><span class="mx_Pill_text">Message from Member</span></a ></bdi ></span @@ -348,7 +343,7 @@ exports[`<TextualBody /> renders plain-text m.text correctly should pillify a pe href="https://matrix.to/#/!room2:example.com/%event_id%" aria-describedby="mx_Pill_0.123456" ><span - title="" + title="!room2:example.com" aria-label="Avatar" aria-hidden="true" data-testid="avatar-img" @@ -365,8 +360,7 @@ exports[`<TextualBody /> renders plain-text m.text correctly should pillify a pe class="_image_2lhia_45" data-type="round" width="16px" - height="16px" - title="!room2:example.com" /></span + height="16px" /></span ><span class="mx_Pill_text">Message in Room 2</span></a ></bdi ></span diff --git a/test/components/views/right_panel/__snapshots__/RoomSummaryCard-test.tsx.snap b/test/components/views/right_panel/__snapshots__/RoomSummaryCard-test.tsx.snap index ed88d908e6..9061bf9f94 100644 --- a/test/components/views/right_panel/__snapshots__/RoomSummaryCard-test.tsx.snap +++ b/test/components/views/right_panel/__snapshots__/RoomSummaryCard-test.tsx.snap @@ -26,7 +26,7 @@ exports[`<RoomSummaryCard /> renders the room summary 1`] = ` data-type="round" role="presentation" style="--cpd-avatar-size: 54px;" - title="" + title="!room:domain.org" > ! </span> @@ -69,6 +69,13 @@ exports[`<RoomSummaryCard /> renders the room summary 1`] = ` 0 </span> </div> + <div + class="mx_AccessibleButton mx_BaseCard_Button mx_RoomSummaryCard_Button mx_RoomSummaryCard_icon_search" + role="button" + tabindex="0" + > + Search + </div> <div class="mx_AccessibleButton mx_BaseCard_Button mx_RoomSummaryCard_Button mx_RoomSummaryCard_icon_files" role="button" diff --git a/test/components/views/right_panel/__snapshots__/UserInfo-test.tsx.snap b/test/components/views/right_panel/__snapshots__/UserInfo-test.tsx.snap index 19f00150bd..7bf070ff2c 100644 --- a/test/components/views/right_panel/__snapshots__/UserInfo-test.tsx.snap +++ b/test/components/views/right_panel/__snapshots__/UserInfo-test.tsx.snap @@ -102,7 +102,7 @@ exports[`<UserInfo /> with crypto enabled renders <BasicUserInfo /> 1`] = ` data-type="round" role="button" style="--cpd-avatar-size: 230.39999999999998px;" - title="" + title="@user:example.com" > u </button> diff --git a/test/components/views/rooms/RoomHeader-test.tsx b/test/components/views/rooms/RoomHeader-test.tsx index abd0a93639..0e02733d2a 100644 --- a/test/components/views/rooms/RoomHeader-test.tsx +++ b/test/components/views/rooms/RoomHeader-test.tsx @@ -17,7 +17,7 @@ limitations under the License. import React from "react"; import userEvent from "@testing-library/user-event"; import { CallType, MatrixCall } from "matrix-js-sdk/src/webrtc/call"; -import { EventType, MatrixClient, MatrixEvent, PendingEventOrdering, Room } from "matrix-js-sdk/src/matrix"; +import { EventType, JoinRule, MatrixClient, MatrixEvent, PendingEventOrdering, Room } from "matrix-js-sdk/src/matrix"; import { getAllByTitle, getByLabelText, getByText, getByTitle, render, screen, waitFor } from "@testing-library/react"; import { mkEvent, stubClient, withClientContextRenderOptions } from "../../../test-utils"; @@ -422,6 +422,26 @@ describe("RoomHeader", () => { }); }); + describe("public room", () => { + it("shows a globe", () => { + const joinRuleEvent = new MatrixEvent({ + type: EventType.RoomJoinRules, + content: { join_rule: JoinRule.Public }, + sender: MatrixClientPeg.get()!.getSafeUserId(), + state_key: "", + room_id: room.roomId, + }); + room.addLiveEvents([joinRuleEvent]); + + const { container } = render( + <RoomHeader room={room} />, + withClientContextRenderOptions(MatrixClientPeg.get()!), + ); + + expect(getByLabelText(container, "Public room")).toBeInTheDocument(); + }); + }); + describe("dm", () => { let client: MatrixClient; beforeEach(() => { diff --git a/test/components/views/rooms/__snapshots__/PinnedEventTile-test.tsx.snap b/test/components/views/rooms/__snapshots__/PinnedEventTile-test.tsx.snap index acba439812..2da4fca0b6 100644 --- a/test/components/views/rooms/__snapshots__/PinnedEventTile-test.tsx.snap +++ b/test/components/views/rooms/__snapshots__/PinnedEventTile-test.tsx.snap @@ -12,7 +12,7 @@ exports[`<PinnedEventTile /> should render pinned event 1`] = ` data-type="round" role="presentation" style="--cpd-avatar-size: 24px;" - title="" + title="@alice:server.org" > a </span> diff --git a/test/components/views/rooms/__snapshots__/RoomHeader-test.tsx.snap b/test/components/views/rooms/__snapshots__/RoomHeader-test.tsx.snap index bfcc954454..d1ddaeeb42 100644 --- a/test/components/views/rooms/__snapshots__/RoomHeader-test.tsx.snap +++ b/test/components/views/rooms/__snapshots__/RoomHeader-test.tsx.snap @@ -6,28 +6,24 @@ exports[`RoomHeader does not show the face pile for DMs 1`] = ` class="mx_Flex mx_RoomHeader light-panel" style="--mx-flex-display: flex; --mx-flex-direction: row; --mx-flex-align: center; --mx-flex-justify: start; --mx-flex-gap: var(--cpd-space-3x);" > - <div - class="mx_DecoratedRoomAvatar" + <span + class="_avatar_2lhia_17 mx_BaseAvatar _avatar-imageless_2lhia_56" + data-color="7" + data-testid="avatar-img" + data-type="round" + role="presentation" + style="--cpd-avatar-size: 40px;" + title="!1:example.org" > - <span - class="_avatar_2lhia_17 mx_BaseAvatar _avatar-imageless_2lhia_56" - data-color="7" - data-testid="avatar-img" - data-type="round" - role="presentation" - style="--cpd-avatar-size: 40px;" - title="" - > - ! - </span> - </div> + ! + </span> <div class="mx_Box mx_RoomHeader_info mx_Box--flex" style="--mx-box-flex: 1;" > <div aria-level="1" - class="_font-body-lg-semibold_1g2sj_89" + class="_font-body-lg-semibold_1g2sj_89 mx_RoomHeader_heading" dir="auto" role="heading" title="!1:example.org" @@ -40,7 +36,7 @@ exports[`RoomHeader does not show the face pile for DMs 1`] = ` style="--mx-flex-display: flex; --mx-flex-direction: row; --mx-flex-align: center; --mx-flex-justify: start; --mx-flex-gap: var(--cpd-space-2x);" > <button - class="_icon-button_yvmcf_17" + class="_icon-button_1k9cw_17" disabled="" style="--cpd-icon-button-size: 32px;" title="There's no one here to call" @@ -48,7 +44,7 @@ exports[`RoomHeader does not show the face pile for DMs 1`] = ` <div /> </button> <button - class="_icon-button_yvmcf_17" + class="_icon-button_1k9cw_17" disabled="" style="--cpd-icon-button-size: 32px;" title="There's no one here to call" @@ -56,14 +52,14 @@ exports[`RoomHeader does not show the face pile for DMs 1`] = ` <div /> </button> <button - class="_icon-button_yvmcf_17" + class="_icon-button_1k9cw_17" style="--cpd-icon-button-size: 32px;" title="Threads" > <div /> </button> <button - class="_icon-button_yvmcf_17" + class="_icon-button_1k9cw_17" style="--cpd-icon-button-size: 32px;" title="Notifications" > diff --git a/test/components/views/rooms/__snapshots__/RoomPreviewBar-test.tsx.snap b/test/components/views/rooms/__snapshots__/RoomPreviewBar-test.tsx.snap index 888a42edae..8de940ba83 100644 --- a/test/components/views/rooms/__snapshots__/RoomPreviewBar-test.tsx.snap +++ b/test/components/views/rooms/__snapshots__/RoomPreviewBar-test.tsx.snap @@ -29,7 +29,7 @@ exports[`<RoomPreviewBar /> message case AskToJoin renders the corresponding mes data-type="round" role="presentation" style="--cpd-avatar-size: 36px;" - title="" + title="RoomPreviewBar-test-room" > R </span> @@ -222,7 +222,7 @@ exports[`<RoomPreviewBar /> with an invite with an invited email when client has data-type="round" role="presentation" style="--cpd-avatar-size: 36px;" - title="" + title="RoomPreviewBar-test-room" > R </span> @@ -281,7 +281,7 @@ exports[`<RoomPreviewBar /> with an invite without an invited email for a dm roo data-type="round" role="presentation" style="--cpd-avatar-size: 36px;" - title="" + title="RoomPreviewBar-test-room" > R </span> @@ -347,7 +347,7 @@ exports[`<RoomPreviewBar /> with an invite without an invited email for a non-dm data-type="round" role="presentation" style="--cpd-avatar-size: 36px;" - title="" + title="RoomPreviewBar-test-room" > R </span> diff --git a/test/components/views/rooms/__snapshots__/RoomTile-test.tsx.snap b/test/components/views/rooms/__snapshots__/RoomTile-test.tsx.snap index 397d1cd221..358c377db2 100644 --- a/test/components/views/rooms/__snapshots__/RoomTile-test.tsx.snap +++ b/test/components/views/rooms/__snapshots__/RoomTile-test.tsx.snap @@ -20,7 +20,7 @@ exports[`RoomTile when message previews are enabled and there is a message in a data-type="round" role="presentation" style="--cpd-avatar-size: 32px;" - title="" + title="!1:example.org" > ! </span> @@ -95,7 +95,7 @@ exports[`RoomTile when message previews are enabled and there is a message in th data-type="round" role="presentation" style="--cpd-avatar-size: 32px;" - title="" + title="!1:example.org" > ! </span> @@ -170,7 +170,7 @@ exports[`RoomTile when message previews are enabled should render a room without data-type="round" role="presentation" style="--cpd-avatar-size: 32px;" - title="" + title="!1:example.org" > ! </span> @@ -233,7 +233,7 @@ exports[`RoomTile when message previews are not enabled should render the room 1 data-type="round" role="presentation" style="--cpd-avatar-size: 32px;" - title="" + title="!1:example.org" > ! </span> diff --git a/test/components/views/spaces/__snapshots__/AddExistingToSpaceDialog-test.tsx.snap b/test/components/views/spaces/__snapshots__/AddExistingToSpaceDialog-test.tsx.snap index 62791aea98..487a9006d7 100644 --- a/test/components/views/spaces/__snapshots__/AddExistingToSpaceDialog-test.tsx.snap +++ b/test/components/views/spaces/__snapshots__/AddExistingToSpaceDialog-test.tsx.snap @@ -31,7 +31,7 @@ exports[`<AddExistingToSpaceDialog /> looks as expected 1`] = ` data-testid="avatar-img" data-type="square" style="--cpd-avatar-size: 40px;" - title="" + title="!spaceid:example.com" > <img alt="" @@ -42,7 +42,6 @@ exports[`<AddExistingToSpaceDialog /> looks as expected 1`] = ` loading="lazy" referrerpolicy="no-referrer" src="http://this.is.a.url/avatar.url/room.png" - title="!spaceid:example.com" width="40px" /> </span> diff --git a/test/utils/exportUtils/__snapshots__/HTMLExport-test.ts.snap b/test/utils/exportUtils/__snapshots__/HTMLExport-test.ts.snap index 1bb59a96bb..7bd9001f6f 100644 --- a/test/utils/exportUtils/__snapshots__/HTMLExport-test.ts.snap +++ b/test/utils/exportUtils/__snapshots__/HTMLExport-test.ts.snap @@ -25,7 +25,7 @@ exports[`HTMLExport should export 1`] = ` <div class="mx_LegacyRoomHeader_wrapper" aria-owns="mx_RightPanel"> <div class="mx_LegacyRoomHeader_avatar"> <div class="mx_DecoratedRoomAvatar"> - <span role="presentation" title="!myroom:example.org" data-testid="avatar-img" data-type="round" data-color="1" class="_avatar_2lhia_17 mx_BaseAvatar _avatar-imageless_2lhia_56" style="--cpd-avatar-size:32px">!</span> + <span role="presentation" title="" data-testid="avatar-img" data-type="round" data-color="1" class="_avatar_2lhia_17 mx_BaseAvatar _avatar-imageless_2lhia_56" style="--cpd-avatar-size:32px">!</span> </div> </div> <div class="mx_LegacyRoomHeader_name"> @@ -60,7 +60,7 @@ exports[`HTMLExport should export 1`] = ` role="list" > <div class="mx_NewRoomIntro"> - <span role="presentation" title="!myroom:example.org" data-testid="avatar-img" data-type="round" data-color="1" class="_avatar_2lhia_17 mx_BaseAvatar _avatar-imageless_2lhia_56" style="--cpd-avatar-size:32px">!</span> + <span role="presentation" title="" data-testid="avatar-img" data-type="round" data-color="1" class="_avatar_2lhia_17 mx_BaseAvatar _avatar-imageless_2lhia_56" style="--cpd-avatar-size:32px">!</span> <h2> !myroom:example.org </h2> <p> created this room. <br/><br/> <p><span>This is the start of export of <b>!myroom:example.org</b>. Exported by <a href="https://matrix.to/#/%40userId%3Amatrix.org" target="_blank" rel="noopener noreferrer"><b>@userId:matrix.org</b></a> at 11/17/2022.</span></p> </p> <br/> diff --git a/yarn.lock b/yarn.lock index b6ab5b90a4..36fdf79b8b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1443,7 +1443,7 @@ dependencies: "@floating-ui/utils" "^0.1.1" -"@floating-ui/dom@^1.3.0": +"@floating-ui/dom@^1.5.1": version "1.5.1" resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.5.1.tgz#88b70defd002fe851f17b4a25efb2d3c04d7a8d7" integrity sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw== @@ -1452,11 +1452,11 @@ "@floating-ui/utils" "^0.1.1" "@floating-ui/react-dom@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.0.1.tgz#7972a4fc488a8c746cded3cfe603b6057c308a91" - integrity sha512-rZtAmSht4Lry6gdhAJDrCp/6rKN7++JnL1/Anbr/DdeyYXQPxvg/ivrbYvJulbRf4vL8b212suwMM2lxbv+RQA== + version "2.0.2" + resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.0.2.tgz#fab244d64db08e6bed7be4b5fcce65315ef44d20" + integrity sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ== dependencies: - "@floating-ui/dom" "^1.3.0" + "@floating-ui/dom" "^1.5.1" "@floating-ui/utils@^0.1.1": version "0.1.1" @@ -3064,9 +3064,9 @@ svg2vectordrawable "^2.9.1" "@vector-im/compound-web@^0.2.3": - version "0.2.15" - resolved "https://registry.yarnpkg.com/@vector-im/compound-web/-/compound-web-0.2.15.tgz#89121053cae95cc4fa82b84fc4ebf87cdf75c564" - integrity sha512-F4ay88XJH9LkGrHcpHyJnqqkWOdYmzwLbTQjbjokKwOPeDvcLJDZkTyRR03GbU8Ir/tlGYSx0TbrXA5XQI0g3A== + version "0.2.16" + resolved "https://registry.yarnpkg.com/@vector-im/compound-web/-/compound-web-0.2.16.tgz#cdc578ec846999a7312d572131b5749b2cf7f86f" + integrity sha512-3ffijtHf4ibjLPsRoawTchf+DyaGbxtN6h/9WRvdOSTv+ML7oR7Aoo+jAPSTN+rNFuCIHKrayHJLl2YJOdeH8Q== dependencies: "@radix-ui/react-form" "^0.0.3" "@radix-ui/react-tooltip" "^1.0.6"