diff --git a/resources/qml/TimelineView.qml b/resources/qml/TimelineView.qml index 70347009..c53a7415 100644 --- a/resources/qml/TimelineView.qml +++ b/resources/qml/TimelineView.qml @@ -211,7 +211,7 @@ Item { Layout.alignment: Qt.AlignHCenter MatrixText { - text: preview.roomName == "" ? qsTr("No preview available") : preview.roomName + text: !roomPreview.isFetched ? qsTr("No preview available") : preview.roomName font.pixelSize: 24 } @@ -252,7 +252,7 @@ Item { Layout.rightMargin: Nheko.paddingLarge TextArea { - text: TimelineManager.escapeEmoji(preview.roomTopic) + text: roomPreview.isFetched ? TimelineManager.escapeEmoji(preview.roomTopic) : qsTr("This room is possibly inaccessible. If this room is private, you should remove it from the child list of this space.") wrapMode: TextEdit.WordWrap textFormat: TextEdit.RichText readOnly: true diff --git a/src/timeline/RoomlistModel.cpp b/src/timeline/RoomlistModel.cpp index 455ea94f..12fee262 100644 --- a/src/timeline/RoomlistModel.cpp +++ b/src/timeline/RoomlistModel.cpp @@ -222,7 +222,7 @@ RoomlistModel::data(const QModelIndex &index, int role) const case Roles::RoomName: return tr("No preview available"); case Roles::LastMessage: - return QString(); + return tr("This room is possibly inaccessible"); case Roles::Time: return QString(); case Roles::Timestamp: @@ -796,11 +796,13 @@ RoomlistModel::setCurrentRoom(const QString &roomid) p.roomName_ = QString::fromStdString(i->name); p.roomTopic_ = QString::fromStdString(i->topic); p.roomAvatarUrl_ = QString::fromStdString(i->avatar_url); + p.isFetched_ = true; currentRoomPreview_ = std::move(p); nhlog::ui()->debug("Switched to (preview): {}", currentRoomPreview_->roomid_.toStdString()); } else { p.roomid_ = roomid; + p.isFetched_ = false; currentRoomPreview_ = p; nhlog::ui()->debug("Switched to (empty): {}", currentRoomPreview_->roomid_.toStdString()); @@ -1100,6 +1102,15 @@ FilteredRoomlistModel::filterAcceptsRow(int sourceRow, const QModelIndex &) cons .toBool(); } + // If it is a preview but it can't be fetched, it is probably an inaccessible private room. + // Hide it if the user isn't an admin. + auto index = sourceModel()->index(sourceRow, 0); + if (sourceModel()->data(index, RoomlistModel::IsPreview).toBool() && + !sourceModel()->data(index, RoomlistModel::IsPreviewFetched).toBool() && + !Permissions(filterStr).canChange(qml_mtx_events::SpaceChild)) { + return false; + } + return true; } else { return true; diff --git a/src/timeline/RoomlistModel.h b/src/timeline/RoomlistModel.h index 60d22cc0..cd1cdcaf 100644 --- a/src/timeline/RoomlistModel.h +++ b/src/timeline/RoomlistModel.h @@ -32,6 +32,7 @@ class RoomPreview Q_PROPERTY(QString roomAvatarUrl READ roomAvatarUrl CONSTANT) Q_PROPERTY(QString reason READ reason CONSTANT) Q_PROPERTY(bool isInvite READ isInvite CONSTANT) + Q_PROPERTY(bool isFetched READ isFetched CONSTANT) public: RoomPreview() {} @@ -42,9 +43,10 @@ public: QString roomAvatarUrl() const { return roomAvatarUrl_; } QString reason() const { return reason_; } bool isInvite() const { return isInvite_; } + bool isFetched() const { return isFetched_; } QString roomid_, roomName_, roomAvatarUrl_, roomTopic_, reason_; - bool isInvite_ = false; + bool isInvite_ = false, isFetched_ = true; }; class RoomlistModel final : public QAbstractListModel