From 43499b9244d785c969b937271e50d6e7fd3a4eb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Mon, 13 Dec 2021 13:44:03 +0100 Subject: [PATCH] Update status message in the member list and user info panel when it is changed (#7338) Co-authored-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/right_panel/UserInfo.tsx | 15 ++------ src/components/views/rooms/MemberTile.tsx | 4 +- src/hooks/useUserStatusMessage.ts | 38 +++++++++++++++++++ 3 files changed, 43 insertions(+), 14 deletions(-) create mode 100644 src/hooks/useUserStatusMessage.ts diff --git a/src/components/views/right_panel/UserInfo.tsx b/src/components/views/right_panel/UserInfo.tsx index dcf900d8067..e36ce74ae77 100644 --- a/src/components/views/right_panel/UserInfo.tsx +++ b/src/components/views/right_panel/UserInfo.tsx @@ -36,7 +36,6 @@ import createRoom, { findDMForUser, privateShouldBeEncrypted } from '../../../cr import DMRoomMap from '../../../utils/DMRoomMap'; import AccessibleButton from '../elements/AccessibleButton'; import SdkConfig from '../../../SdkConfig'; -import SettingsStore from "../../../settings/SettingsStore"; import RoomViewStore from "../../../stores/RoomViewStore"; import MultiInviter from "../../../utils/MultiInviter"; import GroupStore from "../../../stores/GroupStore"; @@ -76,6 +75,7 @@ import { bulkSpaceBehaviour } from "../../../utils/space"; import { shouldShowComponent } from "../../../customisations/helpers/UIComponents"; import { UIComponent } from "../../../settings/UIFeature"; import { TimelineRenderingType } from "../../../contexts/RoomContext"; +import { useUserStatusMessage } from "../../../hooks/useUserStatusMessage"; export interface IDevice { deviceId: string; @@ -1495,13 +1495,14 @@ const BasicUserInfo: React.FC<{ ; }; -type Member = User | RoomMember | GroupMember; +export type Member = User | RoomMember | GroupMember; const UserInfoHeader: React.FC<{ member: Member; e2eStatus: E2EStatus; }> = ({ member, e2eStatus }) => { const cli = useContext(MatrixClientContext); + const statusMessage = useUserStatusMessage(member); const onMemberAvatarClick = useCallback(() => { const avatarUrl = (member as RoomMember).getMxcAvatarUrl @@ -1539,20 +1540,10 @@ const UserInfoHeader: React.FC<{ let presenceState; let presenceLastActiveAgo; let presenceCurrentlyActive; - let statusMessage; - if (member instanceof RoomMember && member.user) { presenceState = member.user.presence; presenceLastActiveAgo = member.user.lastActiveAgo; presenceCurrentlyActive = member.user.currentlyActive; - - if (SettingsStore.getValue("feature_custom_status")) { - if ((member as RoomMember).user) { - statusMessage = member.user.unstable_statusMessage; - } else { - statusMessage = (member as unknown as User).unstable_statusMessage; - } - } } const enablePresenceByHsUrl = SdkConfig.get()["enable_presence_by_hs_url"]; diff --git a/src/components/views/rooms/MemberTile.tsx b/src/components/views/rooms/MemberTile.tsx index 0df5daad96e..792e4b75ad6 100644 --- a/src/components/views/rooms/MemberTile.tsx +++ b/src/components/views/rooms/MemberTile.tsx @@ -66,7 +66,7 @@ export default class MemberTile extends React.Component { if (SettingsStore.getValue("feature_custom_status")) { const { user } = this.props.member; if (user) { - user.on("User._unstable_statusMessage", this.onStatusMessageCommitted); + user.on("User.unstable_statusMessage", this.onStatusMessageCommitted); } } @@ -93,7 +93,7 @@ export default class MemberTile extends React.Component { const { user } = this.props.member; if (user) { user.removeListener( - "User._unstable_statusMessage", + "User.unstable_statusMessage", this.onStatusMessageCommitted, ); } diff --git a/src/hooks/useUserStatusMessage.ts b/src/hooks/useUserStatusMessage.ts new file mode 100644 index 00000000000..ca2dbbf6e87 --- /dev/null +++ b/src/hooks/useUserStatusMessage.ts @@ -0,0 +1,38 @@ +/* +Copyright 2021 Šimon Brandner + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import { MatrixClient } from "matrix-js-sdk/src/client"; +import { User } from "matrix-js-sdk/src/models/user"; +import { useContext } from "react"; + +import MatrixClientContext from "../contexts/MatrixClientContext"; +import { useEventEmitterState } from "./useEventEmitter"; +import { Member } from "../components/views/right_panel/UserInfo"; +import { useFeatureEnabled } from "./useSettings"; + +const getUser = (cli: MatrixClient, user: Member): User => cli.getUser(user?.userId); +const getStatusMessage = (cli: MatrixClient, user: Member): string => { + return getUser(cli, user).unstable_statusMessage; +}; + +// Hook to simplify handling Matrix User status +export const useUserStatusMessage = (user?: Member): string => { + const cli = useContext(MatrixClientContext); + const enabled = useFeatureEnabled("feature_custom_status"); + return useEventEmitterState(enabled && getUser(cli, user), "User.unstable_statusMessage", () => { + return getStatusMessage(cli, user); + }); +};