From d3eed07d7c5b6a173d7abc785292ea55c1ff71e0 Mon Sep 17 00:00:00 2001 From: Kgothatso Ngako Date: Mon, 13 Jul 2026 00:44:32 +0200 Subject: [PATCH] Don't show deleted chat --- .../torch/compose/database/dao/ChatRoomDao.kt | 4 +-- .../torch/compose/ui/composable/HomeScreen.kt | 5 ++-- .../ui/view/model/ChatRoomListViewModel.kt | 25 +++++++++++-------- .../ui/view/model/FeedListViewModel.kt | 15 +++++------ .../compose/ui/view/model/HomeViewModel.kt | 11 ++++---- 5 files changed, 33 insertions(+), 27 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/at/torch/compose/database/dao/ChatRoomDao.kt b/composeApp/src/commonMain/kotlin/at/torch/compose/database/dao/ChatRoomDao.kt index ddd4c9a1..98873cdd 100644 --- a/composeApp/src/commonMain/kotlin/at/torch/compose/database/dao/ChatRoomDao.kt +++ b/composeApp/src/commonMain/kotlin/at/torch/compose/database/dao/ChatRoomDao.kt @@ -16,11 +16,11 @@ interface ChatRoomDao { fun findChatRoomById(id: String): LocalChatRoom? @Transaction - @Query("SELECT * FROM ChatRoom WHERE userPublicKey = :userPublicKey") + @Query("SELECT * FROM ChatRoom WHERE userPublicKey = :userPublicKey AND deletedAt IS NULL") fun getChatRoomListByUserPublicKey(userPublicKey: String): List @Transaction - @Query("SELECT * FROM ChatRoom WHERE userPublicKey = :userPublicKey") + @Query("SELECT * FROM ChatRoom WHERE userPublicKey = :userPublicKey AND deletedAt IS NULL") fun observeChatRoomListByUserPublicKey(userPublicKey: String): Flow> @Upsert diff --git a/composeApp/src/commonMain/kotlin/at/torch/compose/ui/composable/HomeScreen.kt b/composeApp/src/commonMain/kotlin/at/torch/compose/ui/composable/HomeScreen.kt index 2cdffb43..eb41afa1 100644 --- a/composeApp/src/commonMain/kotlin/at/torch/compose/ui/composable/HomeScreen.kt +++ b/composeApp/src/commonMain/kotlin/at/torch/compose/ui/composable/HomeScreen.kt @@ -49,6 +49,7 @@ import at.torch.compose.ui.composable.widgets.dialogs.NewChatBottomSheetDialog import at.torch.compose.ui.composable.widgets.dialogs.StartDirectMessageToNpubOrNip05Dialog import at.torch.compose.ui.composable.widgets.profile.ProfileAvatar import at.torch.compose.ui.theme.TorchTheme +import at.torch.compose.ui.view.model.ChatRoomListViewModel import at.torch.compose.ui.view.model.HomeScreenType import at.torch.compose.ui.view.model.HomeViewModel import at.torch.compose.ui.view.state.HomeScreenUIState @@ -202,9 +203,9 @@ fun HomeScreen( ) { pageIndex -> when (val homeScreenTypeType = HomeScreenType.entries[pageIndex]) { HomeScreenType.Messages -> { - val chatRoomListViewModel: at.torch.compose.ui.view.model.ChatRoomListViewModel = viewModel( + val chatRoomListViewModel: ChatRoomListViewModel = viewModel( key = homeScreenTypeType.name, - factory = at.torch.compose.ui.view.model.ChatRoomListViewModel.factory( + factory = ChatRoomListViewModel.factory( initialChatRoomListUIState = at.torch.compose.ui.view.state.ChatRoomListUIState.Loading, publicKey = homeScreenUIState.profileWithFollowing.profile.publicKey, nostrRepository = nostrRepository, diff --git a/composeApp/src/commonMain/kotlin/at/torch/compose/ui/view/model/ChatRoomListViewModel.kt b/composeApp/src/commonMain/kotlin/at/torch/compose/ui/view/model/ChatRoomListViewModel.kt index b73e0889..a9fd6a53 100755 --- a/composeApp/src/commonMain/kotlin/at/torch/compose/ui/view/model/ChatRoomListViewModel.kt +++ b/composeApp/src/commonMain/kotlin/at/torch/compose/ui/view/model/ChatRoomListViewModel.kt @@ -28,6 +28,9 @@ import androidx.lifecycle.viewmodel.viewModelFactory import at.torch.compose.database.model.NegentropySynchronizeRequest import at.torch.compose.database.model.types.SynchronizationFilter import at.torch.compose.nostr.Relays +import at.torch.compose.repository.ChatRepository +import at.torch.compose.repository.NostrRepository +import at.torch.compose.ui.view.state.ChatRoomListUIState import co.touchlab.kermit.Logger import com.vitorpamplona.quartz.marmot.mip03GroupMessages.GroupEvent import com.vitorpamplona.quartz.nip59Giftwrap.wraps.GiftWrapEvent @@ -36,13 +39,13 @@ import kotlinx.coroutines.IO import kotlinx.coroutines.launch class ChatRoomListViewModel( - initialChatRoomListUIState: at.torch.compose.ui.view.state.ChatRoomListUIState, + initialChatRoomListUIState: ChatRoomListUIState, val publicKey: String, - val nostrRepository: at.torch.compose.repository.NostrRepository, - val chatRepository: at.torch.compose.repository.ChatRepository + val nostrRepository: NostrRepository, + val chatRepository: ChatRepository ): ViewModel() { val logger = Logger.withTag(TAG) - var chatRoomListUIState: at.torch.compose.ui.view.state.ChatRoomListUIState by mutableStateOf(initialChatRoomListUIState) + var chatRoomListUIState: ChatRoomListUIState by mutableStateOf(initialChatRoomListUIState) private set fun initiate() { @@ -58,7 +61,7 @@ class ChatRoomListViewModel( publicKey ).collect { chatRooms -> logger.d("ChatRoomList: $chatRooms") - chatRoomListUIState = at.torch.compose.ui.view.state.ChatRoomListUIState.Loaded( + chatRoomListUIState = ChatRoomListUIState.Loaded( chatRoomList = chatRooms ) } @@ -137,7 +140,7 @@ class ChatRoomListViewModel( horizontalAlignment = Alignment.CenterHorizontally ) { when (val chatRoomListUIState = chatRoomListUIState) { - at.torch.compose.ui.view.state.ChatRoomListUIState.Error -> { + ChatRoomListUIState.Error -> { Column( modifier = Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally @@ -150,7 +153,7 @@ class ChatRoomListViewModel( ) } } - is at.torch.compose.ui.view.state.ChatRoomListUIState.Loaded -> { + is ChatRoomListUIState.Loaded -> { Column( modifier = Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally, @@ -194,7 +197,7 @@ class ChatRoomListViewModel( } } } - at.torch.compose.ui.view.state.ChatRoomListUIState.Loading -> { + ChatRoomListUIState.Loading -> { Column( modifier = Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally @@ -221,10 +224,10 @@ class ChatRoomListViewModel( const val TAG = "ChatRoomListViewModel" fun factory( - initialChatRoomListUIState: at.torch.compose.ui.view.state.ChatRoomListUIState = at.torch.compose.ui.view.state.ChatRoomListUIState.Loading, + initialChatRoomListUIState: ChatRoomListUIState = ChatRoomListUIState.Loading, publicKey: String, - nostrRepository: at.torch.compose.repository.NostrRepository, - chatRepository: at.torch.compose.repository.ChatRepository + nostrRepository: NostrRepository, + chatRepository: ChatRepository ): ViewModelProvider.Factory = viewModelFactory { initializer { ChatRoomListViewModel( diff --git a/composeApp/src/commonMain/kotlin/at/torch/compose/ui/view/model/FeedListViewModel.kt b/composeApp/src/commonMain/kotlin/at/torch/compose/ui/view/model/FeedListViewModel.kt index 2b4efd7a..e1000fe6 100755 --- a/composeApp/src/commonMain/kotlin/at/torch/compose/ui/view/model/FeedListViewModel.kt +++ b/composeApp/src/commonMain/kotlin/at/torch/compose/ui/view/model/FeedListViewModel.kt @@ -26,6 +26,7 @@ import androidx.lifecycle.viewmodel.initializer import androidx.lifecycle.viewmodel.viewModelFactory import at.torch.compose.database.model.NegentropySynchronizeRequest import at.torch.compose.ui.composable.widgets.feed.ListView +import at.torch.compose.ui.view.state.FeedListUIState import co.touchlab.kermit.Logger import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.IO @@ -34,12 +35,12 @@ import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch class FeedListViewModel( - initialFeedListUIState: at.torch.compose.ui.view.state.FeedListUIState, + initialFeedListUIState: FeedListUIState, val synchronizationFilter: at.torch.compose.database.model.types.SynchronizationFilter, val nostrRepository: at.torch.compose.repository.NostrRepository ): ViewModel() { val logger = Logger.withTag(TAG) - var feedListUIState: at.torch.compose.ui.view.state.FeedListUIState by mutableStateOf(initialFeedListUIState) + var feedListUIState: FeedListUIState by mutableStateOf(initialFeedListUIState) private set val isSynchronizationPending: MutableState = mutableStateOf(false) @@ -71,7 +72,7 @@ class FeedListViewModel( nostrRepository.observeNostrFeed( synchronizationFilter ).distinctUntilChanged().first().let { localNostrEvents -> - feedListUIState = at.torch.compose.ui.view.state.FeedListUIState.Loaded( + feedListUIState = FeedListUIState.Loaded( localNostrEvents = localNostrEvents ) } @@ -109,7 +110,7 @@ class FeedListViewModel( horizontalAlignment = Alignment.CenterHorizontally ) { when (val feedListUIState = feedListUIState) { - at.torch.compose.ui.view.state.FeedListUIState.Error -> { + FeedListUIState.Error -> { Column( modifier = Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally @@ -122,7 +123,7 @@ class FeedListViewModel( ) } } - is at.torch.compose.ui.view.state.FeedListUIState.Loaded -> { + is FeedListUIState.Loaded -> { if (feedListUIState.localNostrEvents.isEmpty()) { Column( modifier = Modifier.fillMaxWidth(), @@ -160,7 +161,7 @@ class FeedListViewModel( } } - at.torch.compose.ui.view.state.FeedListUIState.Loading -> { + FeedListUIState.Loading -> { Column( modifier = Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally @@ -187,7 +188,7 @@ class FeedListViewModel( const val TAG = "FeedListViewModel" fun factory( - initialFeedListUIState: at.torch.compose.ui.view.state.FeedListUIState = at.torch.compose.ui.view.state.FeedListUIState.Loading, + initialFeedListUIState: FeedListUIState = FeedListUIState.Loading, synchronizationFilter: at.torch.compose.database.model.types.SynchronizationFilter, nostrRepository: at.torch.compose.repository.NostrRepository, ): ViewModelProvider.Factory = viewModelFactory { diff --git a/composeApp/src/commonMain/kotlin/at/torch/compose/ui/view/model/HomeViewModel.kt b/composeApp/src/commonMain/kotlin/at/torch/compose/ui/view/model/HomeViewModel.kt index 43fe5e1c..3e465cb2 100755 --- a/composeApp/src/commonMain/kotlin/at/torch/compose/ui/view/model/HomeViewModel.kt +++ b/composeApp/src/commonMain/kotlin/at/torch/compose/ui/view/model/HomeViewModel.kt @@ -10,6 +10,7 @@ import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewmodel.initializer import androidx.lifecycle.viewmodel.viewModelFactory import at.torch.compose.database.model.types.SynchronizationFilter +import at.torch.compose.ui.view.state.HomeScreenUIState import co.touchlab.kermit.Logger import com.vitorpamplona.quartz.marmot.mip03GroupMessages.GroupEvent import com.vitorpamplona.quartz.nip01Core.core.HexKey @@ -26,7 +27,7 @@ enum class HomeScreenType { class HomeViewModel( val activeUserPublicKey: HexKey, - val initialHomeScreenUIState: at.torch.compose.ui.view.state.HomeScreenUIState, + val initialHomeScreenUIState: HomeScreenUIState, val nostrRepository: at.torch.compose.repository.NostrRepository, val pagerState: PagerState ): ViewModel() { @@ -34,7 +35,7 @@ class HomeViewModel( val logger = Logger.withTag(TAG) - var homeScreenUIState: at.torch.compose.ui.view.state.HomeScreenUIState by mutableStateOf(initialHomeScreenUIState) + var homeScreenUIState: HomeScreenUIState by mutableStateOf(initialHomeScreenUIState) private set fun initiate() { @@ -48,11 +49,11 @@ class HomeViewModel( activeUserPublicKey ).collect { profileWithFollowing -> homeScreenUIState = if (profileWithFollowing != null) { - at.torch.compose.ui.view.state.HomeScreenUIState.Loaded( + HomeScreenUIState.Loaded( profileWithFollowing = profileWithFollowing ) } else { - at.torch.compose.ui.view.state.HomeScreenUIState.Error + HomeScreenUIState.Error } } } @@ -63,7 +64,7 @@ class HomeViewModel( fun factory( activeUserPublicKey: HexKey, - initialHomeScreenUIState: at.torch.compose.ui.view.state.HomeScreenUIState, + initialHomeScreenUIState: HomeScreenUIState, nostrRepository: at.torch.compose.repository.NostrRepository, pagerState: PagerState ): ViewModelProvider.Factory = viewModelFactory {