Show chat from chatRoomList

This commit is contained in:
Kgothatso Ngako committed 2026-06-01 00:57:38 +02:00
1 parent 29ec692fc4
commit d2c2892f05
6 files changed
+54 -21

No files matched your search

@@ -10,6 +10,9 @@ class DatabaseChatRepository(
private val database: AuxDatabase, private val database: AuxDatabase,
private val scope: CoroutineScope private val scope: CoroutineScope
): ChatRepository { ): ChatRepository {
override suspend fun getChatRoomByIdentifier(id: String): LocalChatRoom? {
return database.chatRoomDao().findChatRoomById(id)
}
override suspend fun getOrCreateChatRoom(publicKey: String, defaultSubject: String?): LocalChatRoom? { override suspend fun getOrCreateChatRoom(publicKey: String, defaultSubject: String?): LocalChatRoom? {
return database.nostrNip17Dao().getOrCreateChatRoom( return database.nostrNip17Dao().getOrCreateChatRoom(
@@ -4,12 +4,18 @@ import ac.cord.auxiliary.compose.database.model.ChatRoom
import ac.cord.auxiliary.compose.database.model.intermdiate.LocalChatRoom import ac.cord.auxiliary.compose.database.model.intermdiate.LocalChatRoom
interface ChatRepository { interface ChatRepository {
suspend fun getChatRoomByIdentifier(id: String): LocalChatRoom?
suspend fun getOrCreateChatRoom(publicKey: String, defaultSubject: String? = null): LocalChatRoom? suspend fun getOrCreateChatRoom(publicKey: String, defaultSubject: String? = null): LocalChatRoom?
fun updateChatRoomSubject(publicKey: String, subject: String): ChatRoom? fun updateChatRoomSubject(publicKey: String, subject: String): ChatRoom?
companion object { companion object {
val NO_OP_CHAT_REPOSITORY = object: ChatRepository { 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? { override suspend fun getOrCreateChatRoom(publicKey: String, defaultSubject: String?): LocalChatRoom? {
return null return null
} }
@@ -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.Profile
import ac.cord.auxiliary.compose.database.model.intermdiate.LocalProfileWithFollowing import ac.cord.auxiliary.compose.database.model.intermdiate.LocalProfileWithFollowing
import ac.cord.auxiliary.compose.repository.NostrRepository 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.NostrEventDetailRoute
import ac.cord.auxiliary.compose.ui.composable.navigation.routes.Route import ac.cord.auxiliary.compose.ui.composable.navigation.routes.Route
import ac.cord.auxiliary.compose.ui.composable.widgets.LoadingDataIndicator import ac.cord.auxiliary.compose.ui.composable.widgets.LoadingDataIndicator
@@ -56,7 +57,7 @@ import kotlinx.coroutines.launch
fun HomeScreen( fun HomeScreen(
initialHomeScreenUIState: HomeScreenUIState = HomeScreenUIState.Loading, initialHomeScreenUIState: HomeScreenUIState = HomeScreenUIState.Loading,
onNavigateToEvent: (Route) -> Unit, onNavigateToEvent: (Route) -> Unit,
onNavigateToDirectMessageDetail: () -> Unit, onNavigateToDirectMessageDetail: (Route) -> Unit,
onNavigateToWriteNewNote: () -> Unit, onNavigateToWriteNewNote: () -> Unit,
onNavigateToSearch: () -> Unit, onNavigateToSearch: () -> Unit,
nostrRepository: NostrRepository, nostrRepository: NostrRepository,
@@ -226,9 +227,7 @@ fun HomeScreen(
key(true) { key(true) {
chatRoomListViewModel.RenderFeed( chatRoomListViewModel.RenderFeed(
onNavigateToDirectMessageDetail = { onNavigateToDirectMessageDetail = onNavigateToDirectMessageDetail
onNavigateToDirectMessageDetail.invoke()
}
) )
} }
@@ -339,11 +339,9 @@ fun AuxNavHost(
route = SearchRoute route = SearchRoute
) )
}, },
onNavigateToDirectMessageDetail = { onNavigateToDirectMessageDetail = { chatRoomDetailRoute ->
navController.navigate( navController.navigate(
route = ChatRoomDetailRoute( route = chatRoomDetailRoute
directMessageIdentifier = ""
)
) )
}, },
nostrRepository = databaseNostrRepository nostrRepository = databaseNostrRepository
@@ -13,10 +13,13 @@ import androidx.lifecycle.viewModelScope
import androidx.lifecycle.viewmodel.initializer import androidx.lifecycle.viewmodel.initializer
import androidx.lifecycle.viewmodel.viewModelFactory import androidx.lifecycle.viewmodel.viewModelFactory
import co.touchlab.kermit.Logger import co.touchlab.kermit.Logger
import fr.acinq.bitcoin.Crypto
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.IO
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
class ChatRoomDetailViewModel( class ChatRoomDetailViewModel(
val publicKey: String, val directMessageId: String,
initialChatRoomDetailUIState: ChatRoomDetailUIState, initialChatRoomDetailUIState: ChatRoomDetailUIState,
val nostrRepository: NostrRepository, val nostrRepository: NostrRepository,
val chatRepository: ChatRepository val chatRepository: ChatRepository
@@ -38,19 +41,37 @@ class ChatRoomDetailViewModel(
// TODO: Render MessageList... // TODO: Render MessageList...
fun initiateChatRoomDetail() { fun initiateChatRoomDetail() {
// TODO: GetOrCreateChatRoom // TODO: GetOrCreateChatRoom
viewModelScope.launch { if (Crypto.isPubKeyCompressed(directMessageId.hexToByteArray())) {
val localChatRoom = chatRepository.getOrCreateChatRoom(publicKey) 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 { ): ViewModelProvider.Factory = viewModelFactory {
initializer { initializer {
ChatRoomDetailViewModel( ChatRoomDetailViewModel(
publicKey = publicKey, directMessageId = publicKey,
initialChatRoomDetailUIState = initialChatRoomDetailUIState, initialChatRoomDetailUIState = initialChatRoomDetailUIState,
nostrRepository = nostrRepository, nostrRepository = nostrRepository,
chatRepository = chatRepository chatRepository = chatRepository
@@ -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.database.model.types.SynchronizationFilter
import ac.cord.auxiliary.compose.nostr.Relays import ac.cord.auxiliary.compose.nostr.Relays
import ac.cord.auxiliary.compose.repository.NostrRepository 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 ac.cord.auxiliary.compose.ui.view.state.ChatRoomListUIState
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
@@ -91,7 +93,7 @@ class ChatRoomListViewModel(
@OptIn(ExperimentalMaterial3ExpressiveApi::class) @OptIn(ExperimentalMaterial3ExpressiveApi::class)
@Composable @Composable
fun RenderFeed( fun RenderFeed(
onNavigateToDirectMessageDetail: (String) -> Unit onNavigateToDirectMessageDetail: (Route) -> Unit
) { ) {
Column( Column(
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
@@ -140,7 +142,11 @@ class ChatRoomListViewModel(
Card( Card(
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
onClick = { onClick = {
onNavigateToDirectMessageDetail.invoke("") onNavigateToDirectMessageDetail.invoke(
ChatRoomDetailRoute(
directMessageIdentifier = localChatRoom.chatRoom.id
)
)
} }
) { ) {
Column( Column(