Show a room preview in the join confirmation dialog

Requires MSC3266

Fixes #1129
This commit is contained in:
Nicolas Werner 2022-08-05 21:44:40 +02:00
parent 213a28eee3
commit 9d8d6b4bca
No known key found for this signature in database
GPG key ID: C8D75E610773F2D9
13 changed files with 355 additions and 27 deletions

View file

@ -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);
}

View file

@ -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_;
};

54
src/ui/RoomSummary.cpp Normal file
View file

@ -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_);
}

86
src/ui/RoomSummary.h Normal file
View file

@ -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;
};