From 9d8d6b4bcaec0994776bf91a556a7e27cb862c30 Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Fri, 5 Aug 2022 21:44:40 +0200 Subject: Show a room preview in the join confirmation dialog Requires MSC3266 Fixes #1129 --- src/ui/NhekoGlobalObject.cpp | 1 + src/ui/NhekoGlobalObject.h | 3 ++ src/ui/RoomSummary.cpp | 54 ++++++++++++++++++++++++++++ src/ui/RoomSummary.h | 86 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 144 insertions(+) create mode 100644 src/ui/RoomSummary.cpp create mode 100644 src/ui/RoomSummary.h (limited to 'src/ui') diff --git a/src/ui/NhekoGlobalObject.cpp b/src/ui/NhekoGlobalObject.cpp index 2e1aadf0..5891f8cd 100644 --- a/src/ui/NhekoGlobalObject.cpp +++ b/src/ui/NhekoGlobalObject.cpp @@ -22,6 +22,7 @@ Nheko::Nheko() connect( UserSettings::instance().get(), &UserSettings::themeChanged, this, &Nheko::colorsChanged); connect(ChatPage::instance(), &ChatPage::contentLoaded, this, &Nheko::updateUserProfile); + connect(ChatPage::instance(), &ChatPage::showRoomJoinPrompt, this, &Nheko::showRoomJoinPrompt); connect(this, &Nheko::joinRoom, ChatPage::instance(), &ChatPage::joinRoom); } diff --git a/src/ui/NhekoGlobalObject.h b/src/ui/NhekoGlobalObject.h index f9de489d..c8c6f667 100644 --- a/src/ui/NhekoGlobalObject.h +++ b/src/ui/NhekoGlobalObject.h @@ -11,6 +11,7 @@ #include "AliasEditModel.h" #include "PowerlevelsEditModels.h" +#include "RoomSummary.h" #include "Theme.h" #include "UserProfile.h" @@ -76,6 +77,8 @@ signals: void openJoinRoomDialog(); void joinRoom(QString roomId, QString reason = ""); + void showRoomJoinPrompt(RoomSummary *summary); + private: QScopedPointer currentUser_; }; diff --git a/src/ui/RoomSummary.cpp b/src/ui/RoomSummary.cpp new file mode 100644 index 00000000..dc035fe0 --- /dev/null +++ b/src/ui/RoomSummary.cpp @@ -0,0 +1,54 @@ +// SPDX-FileCopyrightText: 2022 Nheko Contributors +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "RoomSummary.h" + +#include + +#include "ChatPage.h" +#include "MatrixClient.h" + +RoomSummary::RoomSummary(std::string roomIdOrAlias_, + std::vector vias_, + QString r_, + QObject *p) + : QObject(p) + , roomIdOrAlias(std::move(roomIdOrAlias_)) + , vias(std::move(vias_)) + , reason_(std::move(r_)) +{ + auto ctx = std::make_shared(); + + connect(ctx.get(), &RoomSummaryProxy::failed, this, [this]() { + loaded_ = true; + emit loaded(); + }); + connect( + ctx.get(), &RoomSummaryProxy::loaded, this, [this](const mtx::responses::PublicRoom &resp) { + loaded_ = true; + room = resp; + emit loaded(); + }); + + http::client()->get_summary( + roomIdOrAlias, + [proxy = std::move(ctx)](const mtx::responses::PublicRoom &room, mtx::http::RequestErr e) { + if (e) { + emit proxy->failed(); + } else { + emit proxy->loaded(room); + } + }, + vias); +} + +void +RoomSummary::join() +{ + if (isKnockOnly()) + ChatPage::instance()->knockRoom( + QString::fromStdString(roomIdOrAlias), vias, reason_, false, false); + else + ChatPage::instance()->joinRoomVia(roomIdOrAlias, vias, false, reason_); +} diff --git a/src/ui/RoomSummary.h b/src/ui/RoomSummary.h new file mode 100644 index 00000000..8d6e0e23 --- /dev/null +++ b/src/ui/RoomSummary.h @@ -0,0 +1,86 @@ +// SPDX-FileCopyrightText: 2022 Nheko Contributors +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include + +#include + +#include + +class RoomSummaryProxy : public QObject +{ + Q_OBJECT + +public: + RoomSummaryProxy() {} +signals: + void loaded(mtx::responses::PublicRoom room); + void failed(); +}; + +class RoomSummary : public QObject +{ + Q_OBJECT + + Q_PROPERTY(QString reason READ reason WRITE setReason NOTIFY reasonChanged) + + Q_PROPERTY(QString roomid READ roomid NOTIFY loaded) + Q_PROPERTY(QString roomName READ roomName NOTIFY loaded) + Q_PROPERTY(QString roomTopic READ roomTopic NOTIFY loaded) + Q_PROPERTY(QString roomAvatarUrl READ roomAvatarUrl NOTIFY loaded) + Q_PROPERTY(bool isInvite READ isInvite NOTIFY loaded) + Q_PROPERTY(bool isSpace READ isInvite NOTIFY loaded) + Q_PROPERTY(bool isKnockOnly READ isKnockOnly NOTIFY loaded) + Q_PROPERTY(bool isLoaded READ isLoaded NOTIFY loaded) + Q_PROPERTY(int memberCount READ memberCount NOTIFY loaded) + +public: + explicit RoomSummary(std::string roomIdOrAlias_, + std::vector vias_, + QString reason_, + QObject *p = nullptr); + + void setReason(const QString &r) + { + reason_ = r; + emit reasonChanged(); + } + QString reason() const { return reason_; } + + QString roomid() const { return room ? QString::fromStdString(room->room_id) : ""; } + QString roomName() const + { + return QString::fromStdString(room ? room->room_id : roomIdOrAlias); + } + QString roomTopic() const { return room ? QString::fromStdString(room->topic) : ""; } + QString roomAvatarUrl() const { return room ? QString::fromStdString(room->avatar_url) : ""; } + bool isInvite() const + { + return room && room->membership == mtx::events::state::Membership::Invite; + } + bool isSpace() const { return room && room->room_type == mtx::events::state::room_type::space; } + int memberCount() const { return room ? room->num_joined_members : 0; } + bool isKnockOnly() const + { + return room && (room->join_rule == mtx::events::state::JoinRule::Knock || + room->join_rule == mtx::events::state::JoinRule::KnockRestricted); + } + + bool isLoaded() const { return room.has_value() || loaded_; } + + Q_INVOKABLE void join(); + +signals: + void loaded(); + void reasonChanged(); + +private: + std::string roomIdOrAlias; + std::vector vias; + std::optional room; + QString reason_; + bool loaded_ = false; +}; -- cgit 1.5.1