From 3b7ed375f99ba781e476876e440ce1edac94a6a8 Mon Sep 17 00:00:00 2001
From: ialokim <ialokim@mailbox.org>
Date: Thu, 12 Jan 2023 20:04:14 +0100
Subject: [PATCH] WIP: first try without proper navigation results in a lot of
 callbacks

---
 .../desktop/conversation/ConversationList.kt  |  5 ++++-
 .../conversation/ConversationScreen.kt        |  4 +++-
 .../conversation/PrivateMessageScreen.kt      |  3 ++-
 .../desktop/navigation/SidebarViewModel.kt    | 20 +++++++++++++++++--
 .../briar/desktop/ui/MainScreen.kt            |  4 +++-
 5 files changed, 30 insertions(+), 6 deletions(-)

diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationList.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationList.kt
index 5a39243773..f716f77b6c 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationList.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationList.kt
@@ -155,7 +155,8 @@ fun main() = preview(
                     { _, it -> it.markRead() }
                 )
             },
-            respondToRequest = { _, _ -> },
+            respondToRequest = { _,_ -> },
+            openRequestedShareable = {},
             deleteMessage = {},
         )
     }
@@ -170,6 +171,7 @@ fun ConversationList(
     onMessageAddedToBottom: SingleStateEvent<ConversationViewModel.MessageAddedType>,
     markMessagesRead: (List<Int>) -> Unit,
     respondToRequest: (ConversationRequestItem, Boolean) -> Unit,
+    openRequestedShareable: (ConversationRequestItem) -> Unit,
     deleteMessage: (MessageId) -> Unit,
 ) {
     // we need to make sure the ConversationList is out of composition before showing new messages
@@ -201,6 +203,7 @@ fun ConversationList(
                         ConversationRequestItemView(
                             m,
                             onResponse = { accept -> respondToRequest(m, accept) },
+                            onOpenRequestedShareable = { openRequestedShareable(m) },
                             onDelete = deleteMessage
                         )
                 }
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationScreen.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationScreen.kt
index 0826283aa4..52cc79a1c8 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationScreen.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationScreen.kt
@@ -29,16 +29,17 @@ import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.ui.Modifier
 import org.briarproject.bramble.api.contact.ContactId
+import org.briarproject.briar.api.sharing.Shareable
 import org.briarproject.briar.desktop.contact.ContactInfoDrawer
 import org.briarproject.briar.desktop.contact.ContactInfoDrawerState
 import org.briarproject.briar.desktop.ui.Loader
 import org.briarproject.briar.desktop.ui.getInfoDrawerHandler
 import org.briarproject.briar.desktop.viewmodel.viewModel
 
-@OptIn(ExperimentalMaterialApi::class)
 @Composable
 fun ConversationScreen(
     contactId: ContactId,
+    openRequestedShareable: (ConversationRequestItem) -> Unit,
     viewModel: ConversationViewModel = viewModel(),
 ) {
     LaunchedEffect(contactId) {
@@ -103,6 +104,7 @@ fun ConversationScreen(
                     viewModel.onMessageAddedToBottom,
                     viewModel::markMessagesRead,
                     viewModel::respondToRequest,
+                    openRequestedShareable,
                     viewModel::deleteMessage,
                 )
             },
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/PrivateMessageScreen.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/PrivateMessageScreen.kt
index 42065c51fb..4e088e4d2b 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/PrivateMessageScreen.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/PrivateMessageScreen.kt
@@ -52,6 +52,7 @@ import org.briarproject.briar.desktop.viewmodel.viewModel
 
 @Composable
 fun PrivateMessageScreen(
+    openRequestedShareable: (ConversationRequestItem) -> Unit,
     viewModel: ContactListViewModel = viewModel(),
     addContactViewModel: AddContactViewModel = viewModel(),
 ) {
@@ -85,7 +86,7 @@ fun PrivateMessageScreen(
                 NoContactSelected()
             } else when (id) {
                 is RealContactIdWrapper -> {
-                    ConversationScreen(id.contactId)
+                    ConversationScreen(id.contactId, openRequestedShareable)
                 }
                 is PendingContactIdWrapper -> {
                     PendingContactSelected()
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/navigation/SidebarViewModel.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/navigation/SidebarViewModel.kt
index 223e98e9ab..7586506cc0 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/navigation/SidebarViewModel.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/navigation/SidebarViewModel.kt
@@ -20,10 +20,15 @@ package org.briarproject.briar.desktop.navigation
 
 import androidx.compose.runtime.State
 import androidx.compose.runtime.mutableStateOf
+import mu.KotlinLogging
 import org.briarproject.bramble.api.identity.IdentityManager
 import org.briarproject.bramble.api.identity.LocalAuthor
+import org.briarproject.briar.desktop.conversation.ConversationRequestItem
+import org.briarproject.briar.desktop.conversation.ConversationRequestItem.RequestType.FORUM
 import org.briarproject.briar.desktop.ui.UiMode
+import org.briarproject.briar.desktop.utils.KLoggerUtils.w
 import org.briarproject.briar.desktop.viewmodel.ViewModel
+import org.briarproject.briar.desktop.viewmodel.asState
 import javax.inject.Inject
 
 class SidebarViewModel
@@ -32,6 +37,10 @@ constructor(
     private val identityManager: IdentityManager,
 ) : ViewModel() {
 
+    companion object {
+        private val LOG = KotlinLogging.logger {}
+    }
+
     override fun onInit() {
         loadAccountInfo()
     }
@@ -39,8 +48,8 @@ constructor(
     private var _uiMode = mutableStateOf(UiMode.CONTACTS)
     private var _account = mutableStateOf<LocalAuthor?>(null)
 
-    val uiMode: State<UiMode> = _uiMode
-    val account: State<LocalAuthor?> = _account
+    val uiMode = _uiMode.asState()
+    val account = _account.asState()
 
     fun setUiMode(uiMode: UiMode) {
         _uiMode.value = uiMode
@@ -49,4 +58,11 @@ constructor(
     fun loadAccountInfo() {
         _account.value = identityManager.localAuthor
     }
+
+    fun openRequestedShareable(m: ConversationRequestItem) {
+        when (m.requestType) {
+            FORUM -> setUiMode(UiMode.FORUMS)
+            else -> LOG.w { "Currently only forums are supported." }
+        }
+    }
 }
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/MainScreen.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/MainScreen.kt
index 4dcdf9c52c..94b53bf2d6 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/MainScreen.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/MainScreen.kt
@@ -27,6 +27,8 @@ import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
 import androidx.compose.runtime.staticCompositionLocalOf
+import org.briarproject.briar.desktop.conversation.ConversationRequestItem
+import org.briarproject.briar.desktop.conversation.ConversationRequestItem.RequestType.FORUM
 import org.briarproject.briar.desktop.conversation.PrivateMessageScreen
 import org.briarproject.briar.desktop.forums.ForumScreen
 import org.briarproject.briar.desktop.navigation.BriarSidebar
@@ -58,7 +60,7 @@ fun MainScreen(viewModel: SidebarViewModel = viewModel()) {
                 )
                 VerticalDivider()
                 when (viewModel.uiMode.value) {
-                    UiMode.CONTACTS -> PrivateMessageScreen()
+                    UiMode.CONTACTS -> PrivateMessageScreen(viewModel::openRequestedShareable)
                     UiMode.GROUPS -> PrivateGroupScreen()
                     UiMode.FORUMS -> ForumScreen()
                     UiMode.SETTINGS -> SettingsScreen()
-- 
GitLab