From b593f7321b7feef20e080c3b04d86f4b2cf5c37f Mon Sep 17 00:00:00 2001 From: James Graham Date: Sat, 13 Jan 2024 12:06:00 +0000 Subject: [PATCH] Cherrypick 24.02 Readonly Room Add readonly property to a room and use it to decide whether to show chatbar, replies and edits BUG: 479590 (cherry picked from commit ec4aa73e371dffc5c40ce438222537c08855c00f) --- src/neochatroom.cpp | 6 ++++++ src/neochatroom.h | 8 ++++++++ src/qml/HoverActions.qml | 4 +++- src/qml/RoomPage.qml | 2 +- 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/neochatroom.cpp b/src/neochatroom.cpp index 4fd7e9dd3..c16925ea7 100644 --- a/src/neochatroom.cpp +++ b/src/neochatroom.cpp @@ -114,6 +114,7 @@ NeoChatRoom::NeoChatRoom(Connection *connection, QString roomId, JoinState joinS Q_EMIT parentIdsChanged(); Q_EMIT canonicalParentChanged(); Q_EMIT joinRuleChanged(); + Q_EMIT readOnlyChanged(); }); connect(connection, &Connection::capabilitiesLoaded, this, &NeoChatRoom::maxRoomVersionChanged); connect(this, &Room::changed, this, [this]() { @@ -662,6 +663,11 @@ bool NeoChatRoom::isInvite() const return joinState() == JoinState::Invite; } +bool NeoChatRoom::readOnly() const +{ + return !canSendEvent("m.room.message"_ls); +} + bool NeoChatRoom::isUserBanned(const QString &user) const { auto roomMemberEvent = currentState().get(user); diff --git a/src/neochatroom.h b/src/neochatroom.h index dfb2a505e..742cabc4c 100644 --- a/src/neochatroom.h +++ b/src/neochatroom.h @@ -133,6 +133,11 @@ class NeoChatRoom : public Quotient::Room */ Q_PROPERTY(bool isInvite READ isInvite NOTIFY isInviteChanged) + /** + * @brief Whether the local user can send messages in the room. + */ + Q_PROPERTY(bool readOnly READ readOnly NOTIFY readOnlyChanged) + /** * @brief The current join rule for the room as a QString. * @@ -552,6 +557,8 @@ public: bool isInvite() const; + bool readOnly() const; + Q_INVOKABLE void clearInvitationNotification(); [[nodiscard]] QString joinRule() const; @@ -809,6 +816,7 @@ Q_SIGNALS: void canonicalParentChanged(); void lastActiveTimeChanged(); void isInviteChanged(); + void readOnlyChanged(); void displayNameChanged(); void pushNotificationStateChanged(PushNotificationState::State state); void showMessage(MessageType messageType, const QString &message); diff --git a/src/qml/HoverActions.qml b/src/qml/HoverActions.qml index faf92c2d9..e6c3d7269 100644 --- a/src/qml/HoverActions.qml +++ b/src/qml/HoverActions.qml @@ -89,7 +89,7 @@ QQC2.Control { onTriggered: emojiDialog.open() }, Kirigami.Action { - visible: root.delegate && root.delegate.author.isLocalUser && (root.delegate.delegateType === DelegateType.Emote || root.delegate.delegateType === DelegateType.Message) + visible: root.delegate && root.delegate.author.isLocalUser && (root.delegate.delegateType === DelegateType.Emote || root.delegate.delegateType === DelegateType.Message) && !root.currentRoom.readOnly text: i18n("Edit") icon.name: "document-edit" onTriggered: { @@ -98,6 +98,7 @@ QQC2.Control { } }, Kirigami.Action { + visible: !root.currentRoom.readOnly text: i18n("Reply") icon.name: "mail-replied-symbolic" onTriggered: { @@ -107,6 +108,7 @@ QQC2.Control { } }, Kirigami.Action { + visible: !root.currentRoom.readOnly text: i18n("Reply in Thread") icon.name: "dialog-messages" onTriggered: { diff --git a/src/qml/RoomPage.qml b/src/qml/RoomPage.qml index 6bda95329..60de6e3c9 100644 --- a/src/qml/RoomPage.qml +++ b/src/qml/RoomPage.qml @@ -158,7 +158,7 @@ Kirigami.Page { footer: Loader { id: chatBarLoader - active: timelineViewLoader.active && root.currentRoom.canSendEvent("m.room.message") // TODO make this update in real time + active: timelineViewLoader.active && !root.currentRoom.readOnly sourceComponent: ChatBar { id: chatBar width: parent.width