From d2c2892f05fb626fa0c88846245dce538fc341dd Mon Sep 17 00:00:00 2001 From: Kgothatso Ngako Date: Mon, 1 Jun 2026 00:57:38 +0200 Subject: [PATCH] Show chat from chatRoomList --- .../repository/DatabaseChatRepository.kt | 3 ++ .../compose/repository/ChatRepository.kt | 6 +++ .../compose/ui/composable/HomeScreen.kt | 7 ++- .../ui/composable/navigation/AuxNavHost.kt | 6 +-- .../ui/view/model/ChatRoomDetailViewModel.kt | 43 ++++++++++++++----- .../ui/view/model/ChatRoomListViewModel.kt | 10 ++++- 6 files changed, 54 insertions(+), 21 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/repository/DatabaseChatRepository.kt b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/repository/DatabaseChatRepository.kt index efe9584d..cf67bdf0 100644 --- a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/repository/DatabaseChatRepository.kt +++ b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/repository/DatabaseChatRepository.kt @@ -10,6 +10,9 @@ class DatabaseChatRepository( private val database: AuxDatabase, private val scope: CoroutineScope ): ChatRepository { + override suspend fun getChatRoomByIdentifier(id: String): LocalChatRoom? { + return database.chatRoomDao().findChatRoomById(id) + } override suspend fun getOrCreateChatRoom(publicKey: String, defaultSubject: String?): LocalChatRoom? { return database.nostrNip17Dao().getOrCreateChatRoom( diff --git a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/repository/ChatRepository.kt b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/repository/ChatRepository.kt index 9fd72f4c..eef8b58c 100644 --- a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/repository/ChatRepository.kt +++ b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/repository/ChatRepository.kt @@ -4,12 +4,18 @@ import ac.cord.auxiliary.compose.database.model.ChatRoom import ac.cord.auxiliary.compose.database.model.intermdiate.LocalChatRoom interface ChatRepository { + suspend fun getChatRoomByIdentifier(id: String): LocalChatRoom? + suspend fun getOrCreateChatRoom(publicKey: String, defaultSubject: String? = null): LocalChatRoom? fun updateChatRoomSubject(publicKey: String, subject: String): ChatRoom? companion object { val NO_OP_CHAT_REPOSITORY = object: ChatRepository { + override suspend fun getChatRoomByIdentifier(id: String): LocalChatRoom? { + TODO("Not yet implemented") + } + override suspend fun getOrCreateChatRoom(publicKey: String, defaultSubject: String?): LocalChatRoom? { return null } diff --git a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/ui/composable/HomeScreen.kt b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/ui/composable/HomeScreen.kt index 34b15ae2..946a4c01 100644 --- a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/ui/composable/HomeScreen.kt +++ b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/ui/composable/HomeScreen.kt @@ -4,6 +4,7 @@ import ac.cord.auxiliary.compose.database.model.NostrEvent import ac.cord.auxiliary.compose.database.model.Profile import ac.cord.auxiliary.compose.database.model.intermdiate.LocalProfileWithFollowing import ac.cord.auxiliary.compose.repository.NostrRepository +import ac.cord.auxiliary.compose.ui.composable.navigation.routes.ChatRoomDetailRoute import ac.cord.auxiliary.compose.ui.composable.navigation.routes.NostrEventDetailRoute import ac.cord.auxiliary.compose.ui.composable.navigation.routes.Route import ac.cord.auxiliary.compose.ui.composable.widgets.LoadingDataIndicator @@ -56,7 +57,7 @@ import kotlinx.coroutines.launch fun HomeScreen( initialHomeScreenUIState: HomeScreenUIState = HomeScreenUIState.Loading, onNavigateToEvent: (Route) -> Unit, - onNavigateToDirectMessageDetail: () -> Unit, + onNavigateToDirectMessageDetail: (Route) -> Unit, onNavigateToWriteNewNote: () -> Unit, onNavigateToSearch: () -> Unit, nostrRepository: NostrRepository, @@ -226,9 +227,7 @@ fun HomeScreen( key(true) { chatRoomListViewModel.RenderFeed( - onNavigateToDirectMessageDetail = { - onNavigateToDirectMessageDetail.invoke() - } + onNavigateToDirectMessageDetail = onNavigateToDirectMessageDetail ) } diff --git a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/ui/composable/navigation/AuxNavHost.kt b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/ui/composable/navigation/AuxNavHost.kt index c961cba6..c322e772 100644 --- a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/ui/composable/navigation/AuxNavHost.kt +++ b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/ui/composable/navigation/AuxNavHost.kt @@ -339,11 +339,9 @@ fun AuxNavHost( route = SearchRoute ) }, - onNavigateToDirectMessageDetail = { + onNavigateToDirectMessageDetail = { chatRoomDetailRoute -> navController.navigate( - route = ChatRoomDetailRoute( - directMessageIdentifier = "" - ) + route = chatRoomDetailRoute ) }, nostrRepository = databaseNostrRepository diff --git a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/ui/view/model/ChatRoomDetailViewModel.kt b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/ui/view/model/ChatRoomDetailViewModel.kt index 138130e0..3fc790c6 100644 --- a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/ui/view/model/ChatRoomDetailViewModel.kt +++ b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/ui/view/model/ChatRoomDetailViewModel.kt @@ -13,10 +13,13 @@ import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewmodel.initializer import androidx.lifecycle.viewmodel.viewModelFactory import co.touchlab.kermit.Logger +import fr.acinq.bitcoin.Crypto +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.IO import kotlinx.coroutines.launch class ChatRoomDetailViewModel( - val publicKey: String, + val directMessageId: String, initialChatRoomDetailUIState: ChatRoomDetailUIState, val nostrRepository: NostrRepository, val chatRepository: ChatRepository @@ -38,19 +41,37 @@ class ChatRoomDetailViewModel( // TODO: Render MessageList... fun initiateChatRoomDetail() { // TODO: GetOrCreateChatRoom - viewModelScope.launch { - val localChatRoom = chatRepository.getOrCreateChatRoom(publicKey) + if (Crypto.isPubKeyCompressed(directMessageId.hexToByteArray())) { + logger.d("compressed: $directMessageId") + // Get ChatRoomById + viewModelScope.launch(Dispatchers.IO) { + val localChatRoom = chatRepository.getChatRoomByIdentifier(directMessageId) + + chatRoomDetailUIState = if (localChatRoom == null) { + ChatRoomDetailUIState.Error + } else { + ChatRoomDetailUIState.Loaded( + localChatRoom = localChatRoom + ) + } - chatRoomDetailUIState = if (localChatRoom == null) { - ChatRoomDetailUIState.Error - } else { - ChatRoomDetailUIState.Loaded( - localChatRoom = localChatRoom - ) } + } else { + logger.d("Not compressed key publicKey: $directMessageId") + viewModelScope.launch(Dispatchers.IO) { + // We need to get or create a chat with the user on this publicKey... + val localChatRoom = chatRepository.getOrCreateChatRoom(directMessageId) - queueSynchronization() + chatRoomDetailUIState = if (localChatRoom == null) { + ChatRoomDetailUIState.Error + } else { + ChatRoomDetailUIState.Loaded( + localChatRoom = localChatRoom + ) + } + } } + queueSynchronization() } @@ -65,7 +86,7 @@ class ChatRoomDetailViewModel( ): ViewModelProvider.Factory = viewModelFactory { initializer { ChatRoomDetailViewModel( - publicKey = publicKey, + directMessageId = publicKey, initialChatRoomDetailUIState = initialChatRoomDetailUIState, nostrRepository = nostrRepository, chatRepository = chatRepository diff --git a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/ui/view/model/ChatRoomListViewModel.kt b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/ui/view/model/ChatRoomListViewModel.kt index afb69970..34628b26 100755 --- a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/ui/view/model/ChatRoomListViewModel.kt +++ b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/ui/view/model/ChatRoomListViewModel.kt @@ -5,6 +5,8 @@ import ac.cord.auxiliary.compose.database.model.NegentropySynchronizeRequest import ac.cord.auxiliary.compose.database.model.types.SynchronizationFilter import ac.cord.auxiliary.compose.nostr.Relays import ac.cord.auxiliary.compose.repository.NostrRepository +import ac.cord.auxiliary.compose.ui.composable.navigation.routes.ChatRoomDetailRoute +import ac.cord.auxiliary.compose.ui.composable.navigation.routes.Route import ac.cord.auxiliary.compose.ui.view.state.ChatRoomListUIState import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -91,7 +93,7 @@ class ChatRoomListViewModel( @OptIn(ExperimentalMaterial3ExpressiveApi::class) @Composable fun RenderFeed( - onNavigateToDirectMessageDetail: (String) -> Unit + onNavigateToDirectMessageDetail: (Route) -> Unit ) { Column( modifier = Modifier.fillMaxWidth(), @@ -140,7 +142,11 @@ class ChatRoomListViewModel( Card( modifier = Modifier.fillMaxWidth(), onClick = { - onNavigateToDirectMessageDetail.invoke("") + onNavigateToDirectMessageDetail.invoke( + ChatRoomDetailRoute( + directMessageIdentifier = localChatRoom.chatRoom.id + ) + ) } ) { Column(