Show chat from chatRoomList

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

View File

@@ -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(

View File

@@ -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
}

View File

@@ -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
)
}

View File

@@ -339,11 +339,9 @@ fun AuxNavHost(
route = SearchRoute
)
},
onNavigateToDirectMessageDetail = {
onNavigateToDirectMessageDetail = { chatRoomDetailRoute ->
navController.navigate(
route = ChatRoomDetailRoute(
directMessageIdentifier = ""
)
route = chatRoomDetailRoute
)
},
nostrRepository = databaseNostrRepository

View File

@@ -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

View File

@@ -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(