summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorNicolas Werner <nicolas.werner@hotmail.de>2022-09-20 21:26:28 +0200
committerNicolas Werner <nicolas.werner@hotmail.de>2022-09-20 21:26:46 +0200
commit421b15c05c605c8f4adc63433b00e37d56ac9da8 (patch)
tree47d1c7e745b07bda4fe17fe8b4348b1d08265e0e /src
parentMerge pull request #1189 from Bubu/patch-1 (diff)
downloadnheko-421b15c05c605c8f4adc63433b00e37d56ac9da8.tar.xz
Show the community of a room
Diffstat (limited to '')
-rw-r--r--src/timeline/CommunitiesModel.cpp14
-rw-r--r--src/timeline/CommunitiesModel.h1
-rw-r--r--src/timeline/TimelineModel.cpp25
-rw-r--r--src/timeline/TimelineModel.h7
-rw-r--r--src/ui/RoomSummary.cpp43
-rw-r--r--src/ui/RoomSummary.h1
6 files changed, 91 insertions, 0 deletions
diff --git a/src/timeline/CommunitiesModel.cpp b/src/timeline/CommunitiesModel.cpp
index 72d0bdfb..a0c73f84 100644
--- a/src/timeline/CommunitiesModel.cpp
+++ b/src/timeline/CommunitiesModel.cpp
@@ -605,6 +605,20 @@ CommunitiesModel::setCurrentTagId(const QString &tagId)
     emit currentTagIdChanged(currentTagId_);
 }
 
+bool
+CommunitiesModel::trySwitchToSpace(const QString &tag)
+{
+    for (const auto &t : spaceOrder_.tree) {
+        if (t.id == tag) {
+            this->currentTagId_ = "space:" + tag;
+            emit currentTagIdChanged(currentTagId_);
+            return true;
+        }
+    }
+
+    return false;
+}
+
 void
 CommunitiesModel::toggleTagId(QString tagId)
 {
diff --git a/src/timeline/CommunitiesModel.h b/src/timeline/CommunitiesModel.h
index 89f1ed07..3a599476 100644
--- a/src/timeline/CommunitiesModel.h
+++ b/src/timeline/CommunitiesModel.h
@@ -179,6 +179,7 @@ public slots:
     void clear();
     QString currentTagId() const { return currentTagId_; }
     void setCurrentTagId(const QString &tagId);
+    bool trySwitchToSpace(const QString &spaceId);
     void resetCurrentTagId()
     {
         currentTagId_.clear();
diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp
index eaf85b2a..1ddef7b7 100644
--- a/src/timeline/TimelineModel.cpp
+++ b/src/timeline/TimelineModel.cpp
@@ -915,6 +915,9 @@ TimelineModel::syncState(const mtx::responses::State &s)
         } else if (std::holds_alternative<StateEvent<state::Encryption>>(e)) {
             this->isEncrypted_ = cache::isRoomEncrypted(room_id_.toStdString());
             emit encryptionChanged();
+        } else if (std::holds_alternative<StateEvent<state::space::Parent>>(e)) {
+            this->parentChecked = false;
+            emit parentSpaceChanged();
         }
     }
 }
@@ -976,6 +979,9 @@ TimelineModel::addEvents(const mtx::responses::Timeline &timeline)
         } else if (std::holds_alternative<StateEvent<state::Encryption>>(e)) {
             this->isEncrypted_ = cache::isRoomEncrypted(room_id_.toStdString());
             emit encryptionChanged();
+        } else if (std::holds_alternative<StateEvent<state::space::Parent>>(e)) {
+            this->parentChecked = false;
+            emit parentSpaceChanged();
         }
     }
 
@@ -2904,3 +2910,22 @@ TimelineModel::directChatOtherUserId() const
     } else
         return {};
 }
+
+RoomSummary *
+TimelineModel::parentSpace()
+{
+    if (!parentChecked) {
+        auto parents = cache::client()->getStateEventsWithType<mtx::events::state::space::Parent>(
+          this->room_id_.toStdString());
+
+        for (const auto &p : parents) {
+            if (p.content.canonical and p.content.via and not p.content.via->empty()) {
+                parentSummary.reset(new RoomSummary(p.state_key, *p.content.via, ""));
+                QQmlEngine::setObjectOwnership(parentSummary.get(), QQmlEngine::CppOwnership);
+                break;
+            }
+        }
+    }
+
+    return parentSummary.get();
+}
diff --git a/src/timeline/TimelineModel.h b/src/timeline/TimelineModel.h
index 295bc69b..ea6daa34 100644
--- a/src/timeline/TimelineModel.h
+++ b/src/timeline/TimelineModel.h
@@ -22,6 +22,7 @@
 #include "MemberList.h"
 #include "Permissions.h"
 #include "ReadReceiptsModel.h"
+#include "ui/RoomSummary.h"
 
 namespace mtx::http {
 using RequestErr = const std::optional<mtx::http::ClientError> &;
@@ -197,6 +198,7 @@ class TimelineModel : public QAbstractListModel
       QString directChatOtherUserId READ directChatOtherUserId NOTIFY directChatOtherUserIdChanged)
     Q_PROPERTY(InputBar *input READ input CONSTANT)
     Q_PROPERTY(Permissions *permissions READ permissions NOTIFY permissionsChanged)
+    Q_PROPERTY(RoomSummary *parentSpace READ parentSpace NOTIFY parentSpaceChanged)
 
 public:
     explicit TimelineModel(TimelineViewManager *manager,
@@ -397,6 +399,7 @@ public slots:
     Permissions *permissions() { return &permissions_; }
     QString roomAvatarUrl() const;
     QString roomId() const { return room_id_; }
+    RoomSummary *parentSpace();
 
     bool hasMentions() const { return highlight_count > 0; }
     int notificationCount() const { return notification_count; }
@@ -431,6 +434,7 @@ signals:
     void addPendingMessageToStore(mtx::events::collections::TimelineEvents event);
     void updateFlowEventId(std::string event_id);
 
+    void parentSpaceChanged();
     void encryptionChanged();
     void fullyReadEventIdChanged();
     void trustlevelChanged();
@@ -488,6 +492,9 @@ private:
     bool isEncrypted_           = false;
     std::string last_event_id;
     std::string fullyReadEventId_;
+
+    std::unique_ptr<RoomSummary> parentSummary = nullptr;
+    bool parentChecked                         = false;
 };
 
 template<class T>
diff --git a/src/ui/RoomSummary.cpp b/src/ui/RoomSummary.cpp
index da2a547c..6623da10 100644
--- a/src/ui/RoomSummary.cpp
+++ b/src/ui/RoomSummary.cpp
@@ -6,6 +6,7 @@
 
 #include <QMetaType>
 
+#include "Cache.h"
 #include "ChatPage.h"
 #include "MatrixClient.h"
 
@@ -18,6 +19,38 @@ RoomSummary::RoomSummary(std::string roomIdOrAlias_,
   , vias(std::move(vias_))
   , reason_(std::move(r_))
 {
+    if (roomIdOrAlias.empty())
+        return;
+
+    if (roomIdOrAlias[0] == '!') {
+        auto temp = cache::singleRoomInfo(roomIdOrAlias);
+
+        if (temp.member_count) {
+            mtx::responses::PublicRoom newInfo{};
+            // newInfo.aliases;
+            // newInfo.canonical_alias = "";
+            newInfo.name               = temp.name;
+            newInfo.room_id            = roomIdOrAlias;
+            newInfo.topic              = temp.topic;
+            newInfo.num_joined_members = temp.member_count;
+            // newInfo.world_readable;
+            newInfo.guest_can_join = temp.guest_access;
+            newInfo.avatar_url     = temp.avatar_url;
+
+            newInfo.join_rule    = temp.join_rule;
+            newInfo.room_type    = temp.is_space ? mtx::events::state::room_type::space : "";
+            newInfo.room_version = temp.version;
+            newInfo.membership   = mtx::events::state::Membership::Join;
+            // newInfo.encryption;
+
+            this->room = std::move(newInfo);
+            loaded_    = true;
+            return;
+        }
+
+        // newInfo.encryption;
+    }
+
     auto ctx = std::make_shared<RoomSummaryProxy>();
 
     connect(ctx.get(), &RoomSummaryProxy::failed, this, [this]() {
@@ -52,3 +85,13 @@ RoomSummary::join()
     else
         ChatPage::instance()->joinRoomVia(roomIdOrAlias, vias, false, reason_);
 }
+
+void
+RoomSummary::promptJoin()
+{
+    if (isKnockOnly())
+        ChatPage::instance()->knockRoom(
+          QString::fromStdString(roomIdOrAlias), vias, reason_, false, true);
+    else
+        ChatPage::instance()->joinRoomVia(roomIdOrAlias, vias, true, reason_);
+}
diff --git a/src/ui/RoomSummary.h b/src/ui/RoomSummary.h
index 416a4867..f5085054 100644
--- a/src/ui/RoomSummary.h
+++ b/src/ui/RoomSummary.h
@@ -69,6 +69,7 @@ public:
     bool isLoaded() const { return room.has_value() || loaded_; }
 
     Q_INVOKABLE void join();
+    Q_INVOKABLE void promptJoin();
 
 signals:
     void loaded();