Show chat from chatRoomList
This commit is contained in:
@@ -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(
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -339,11 +339,9 @@ fun AuxNavHost(
|
||||
route = SearchRoute
|
||||
)
|
||||
},
|
||||
onNavigateToDirectMessageDetail = {
|
||||
onNavigateToDirectMessageDetail = { chatRoomDetailRoute ->
|
||||
navController.navigate(
|
||||
route = ChatRoomDetailRoute(
|
||||
directMessageIdentifier = ""
|
||||
)
|
||||
route = chatRoomDetailRoute
|
||||
)
|
||||
},
|
||||
nostrRepository = databaseNostrRepository
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user