Show chat from chatRoomList
This commit is contained in:
1 parent
29ec692fc4
commit
d2c2892f05
6 files changed
+54
-21
No files matched your search
+3
@@ -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(
|
||||||
|
|||||||
+6
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-4
@@ -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()
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-4
@@ -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
|
||||||
|
|||||||
+32
-11
@@ -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
|
||||||
|
|||||||
+8
-2
@@ -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(
|
||||||
|
|||||||
Reference in new issue
Block a user