Show a room preview in the join confirmation dialog
Requires MSC3266 Fixes #1129
This commit is contained in:
parent
213a28eee3
commit
9d8d6b4bca
13 changed files with 355 additions and 27 deletions
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
54
src/ui/RoomSummary.cpp
Normal 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
86
src/ui/RoomSummary.h
Normal 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;
|
||||
};
|
||||
Loading…
Add table
Add a link
Reference in a new issue