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<UserProfile> 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 <QMetaType>
+
+#include "ChatPage.h"
+#include "MatrixClient.h"
+
+RoomSummary::RoomSummary(std::string roomIdOrAlias_,
+ std::vector<std::string> vias_,
+ QString r_,
+ QObject *p)
+ : QObject(p)
+ , roomIdOrAlias(std::move(roomIdOrAlias_))
+ , vias(std::move(vias_))
+ , reason_(std::move(r_))
+{
+ auto ctx = std::make_shared<RoomSummaryProxy>();
+
+ 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 <optional>
+
+#include <QObject>
+
+#include <mtx/responses/public_rooms.hpp>
+
+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<std::string> 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<std::string> vias;
+ std::optional<mtx::responses::PublicRoom> room;
+ QString reason_;
+ bool loaded_ = false;
+};
|