From c8b7a0a7718dee76dda6e2d9434b7d831495f160 Mon Sep 17 00:00:00 2001
From: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com>
Date: Thu, 29 Jul 2021 16:10:39 -0400
Subject: [PATCH] swarm: track read-only status for a conversation

If all other members have left the conversation, set a flag to
indicate a read-only status to be consumed by the UI.

Change-Id: I737688e52a2e28b30fb2f1a74ca5167c9c72911f
https://git.jami.net/savoirfairelinux/jami-client-qt/-/issues/475
---
 src/api/conversation.h    |  1 +
 src/conversationmodel.cpp | 12 ++++++++++--
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/src/api/conversation.h b/src/api/conversation.h
index ebaa06ff..fad439b5 100644
--- a/src/api/conversation.h
+++ b/src/api/conversation.h
@@ -86,6 +86,7 @@ struct Info
     Mode mode = Mode::NON_SWARM;
     bool needsSyncing = false;
     bool isRequest = false;
+    bool readOnly = false;
 };
 
 } // namespace conversation
diff --git a/src/conversationmodel.cpp b/src/conversationmodel.cpp
index bb97a279..d1d03dc5 100644
--- a/src/conversationmodel.cpp
+++ b/src/conversationmodel.cpp
@@ -2482,13 +2482,17 @@ ConversationModelPimpl::slotConversationMemberEvent(const QString& accountId,
     const VectorMapStringString& members
         = ConfigurationManager::instance().getConversationMembers(linked.owner.id, conversationId);
     VectorString uris;
-
+    VectorString membersRemaining;
     for (auto& member : members) {
         uris.append(member["uri"]);
+        if (member["role"] != "left")
+            membersRemaining.append(member["uri"]);
     }
     conversation.participants = uris;
+    conversation.readOnly = membersRemaining == VectorString(1, linked.owner.profileInfo.uri);
     invalidateModel();
-    emit linked.modelChanged();
+    Q_EMIT linked.modelChanged();
+    Q_EMIT linked.conversationUpdated(conversationId);
     Q_EMIT linked.dataChanged(indexOf(conversationId));
 }
 
@@ -2722,6 +2726,7 @@ ConversationModelPimpl::addSwarmConversation(const QString& convId)
     conversation.uid = convId;
     conversation.accountId = linked.owner.id;
     QString lastRead;
+    VectorString membersRemaining;
     for (auto& member : members) {
         // this check should be removed once all usage of participants replaced by
         // peersForConversation. We should have ourself in participants list
@@ -2733,7 +2738,10 @@ ConversationModelPimpl::addSwarmConversation(const QString& convId)
             lastRead = member["lastDisplayed"];
         }
         conversation.lastDisplayedMessageUid.emplace(member["uri"], member["lastDisplayed"]);
+        if (member["role"] != "left")
+            membersRemaining.append(member["uri"]);
     }
+    conversation.readOnly = membersRemaining == VectorString(1, accountURI);
     conversation.participants = participants;
     conversation.mode = mode;
     conversation.unreadMessages = ConfigurationManager::instance()
-- 
GitLab