From 8d34ada1015f2aa6d0bac92af10108d240346db1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolf-Martell=20Montw=C3=A9?= Date: Thu, 12 Sep 2024 15:05:39 +0200 Subject: [PATCH] Add FolderList --- .../drawer/ui/DrawerContentPreview.kt | 6 ++-- .../drawer/NavigationDrawerModule.kt | 1 + .../navigation/drawer/ui/DrawerContent.kt | 35 ++++-------------- .../navigation/drawer/ui/DrawerContract.kt | 10 +++++- .../navigation/drawer/ui/DrawerView.kt | 6 ++-- .../navigation/drawer/ui/DrawerViewModel.kt | 36 +++++++++++++++++-- .../navigation/drawer/ui/folder/FolderList.kt | 32 +++++++++++++++++ .../drawer/ui/DrawerViewModelTest.kt | 3 ++ 8 files changed, 93 insertions(+), 36 deletions(-) create mode 100644 feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/folder/FolderList.kt diff --git a/feature/navigation/drawer/src/debug/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerContentPreview.kt b/feature/navigation/drawer/src/debug/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerContentPreview.kt index ffd065bc82..07f21cc816 100644 --- a/feature/navigation/drawer/src/debug/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerContentPreview.kt +++ b/feature/navigation/drawer/src/debug/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerContentPreview.kt @@ -4,6 +4,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.tooling.preview.Preview import app.k9mail.core.ui.compose.designsystem.PreviewWithTheme import app.k9mail.feature.navigation.drawer.ui.FakeData.DISPLAY_ACCOUNT +import kotlinx.collections.immutable.persistentListOf @Composable @Preview(showBackground = true) @@ -11,8 +12,9 @@ internal fun DrawerContentPreview() { PreviewWithTheme { DrawerContent( state = DrawerContract.State( - accounts = emptyList(), currentAccount = null, + accounts = persistentListOf(), + folders = persistentListOf(), ), ) } @@ -24,7 +26,7 @@ fun DrawerContentWithAccountPreview() { PreviewWithTheme { DrawerContent( state = DrawerContract.State( - accounts = listOf(DISPLAY_ACCOUNT), + accounts = persistentListOf(DISPLAY_ACCOUNT), currentAccount = DISPLAY_ACCOUNT, ), ) diff --git a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/NavigationDrawerModule.kt b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/NavigationDrawerModule.kt index 428809208b..835f3a893e 100644 --- a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/NavigationDrawerModule.kt +++ b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/NavigationDrawerModule.kt @@ -49,6 +49,7 @@ val navigationDrawerModule: Module = module { viewModel { DrawerViewModel( getDisplayAccounts = get(), + getDisplayFoldersForAccount = get(), ) } } diff --git a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerContent.kt b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerContent.kt index fd765cacfe..db0c7ee30a 100644 --- a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerContent.kt +++ b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerContent.kt @@ -4,16 +4,15 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag import app.k9mail.core.ui.compose.designsystem.atom.DividerHorizontal import app.k9mail.core.ui.compose.designsystem.atom.Surface -import app.k9mail.core.ui.compose.designsystem.organism.drawer.NavigationDrawerItem import app.k9mail.core.ui.compose.theme2.MainTheme import app.k9mail.feature.navigation.drawer.ui.DrawerContract.State import app.k9mail.feature.navigation.drawer.ui.account.AccountView +import app.k9mail.feature.navigation.drawer.ui.folder.FolderList @Composable fun DrawerContent( @@ -42,32 +41,12 @@ fun DrawerContent( DividerHorizontal() } - LazyColumn( - modifier = Modifier - .fillMaxSize(), - ) { - item { - NavigationDrawerItem( - label = "Folder1", - selected = true, - onClick = {}, - ) - } - item { - NavigationDrawerItem( - label = "Folder2", - selected = false, - onClick = {}, - ) - } - item { - NavigationDrawerItem( - label = "Folder3", - selected = false, - onClick = {}, - ) - } - } + FolderList( + folders = state.folders, + selectedFolder = state.folders.firstOrNull(), // TODO Use selected folder from state + onFolderClick = { }, + showStarredCount = state.showStarredCount, + ) } } } diff --git a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerContract.kt b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerContract.kt index 3f1cf11f9e..4d9f14a78a 100644 --- a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerContract.kt +++ b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerContract.kt @@ -1,15 +1,23 @@ package app.k9mail.feature.navigation.drawer.ui +import androidx.compose.runtime.Stable import app.k9mail.core.ui.compose.common.mvi.UnidirectionalViewModel import app.k9mail.feature.navigation.drawer.domain.entity.DisplayAccount +import app.k9mail.legacy.ui.folder.DisplayFolder +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.immutableListOf +import kotlinx.collections.immutable.persistentListOf interface DrawerContract { interface ViewModel : UnidirectionalViewModel + @Stable data class State( val currentAccount: DisplayAccount? = null, - val accounts: List = emptyList(), + val accounts: ImmutableList = persistentListOf(), + val folders: ImmutableList = persistentListOf(), + val showStarredCount: Boolean = false, val isLoading: Boolean = false, ) diff --git a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerView.kt b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerView.kt index 01a4b5b6ce..7f7ca2d888 100644 --- a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerView.kt +++ b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerView.kt @@ -4,16 +4,18 @@ import androidx.compose.runtime.Composable import app.k9mail.core.ui.compose.common.mvi.observe import app.k9mail.core.ui.compose.designsystem.molecule.PullToRefreshBox import org.koin.androidx.compose.koinViewModel +import app.k9mail.feature.navigation.drawer.ui.DrawerContract.Event +import app.k9mail.feature.navigation.drawer.ui.DrawerContract.ViewModel @Composable fun DrawerView( - viewModel: DrawerContract.ViewModel = koinViewModel(), + viewModel: ViewModel = koinViewModel(), ) { val (state, dispatch) = viewModel.observe { } PullToRefreshBox( isRefreshing = state.value.isLoading, - onRefresh = { dispatch(DrawerContract.Event.OnRefresh) }, + onRefresh = { dispatch(Event.OnRefresh) }, ) { DrawerContent( state = state.value, diff --git a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerViewModel.kt b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerViewModel.kt index 65b43bb474..92c9430ccb 100644 --- a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerViewModel.kt +++ b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerViewModel.kt @@ -8,12 +8,18 @@ import app.k9mail.feature.navigation.drawer.ui.DrawerContract.Effect import app.k9mail.feature.navigation.drawer.ui.DrawerContract.Event import app.k9mail.feature.navigation.drawer.ui.DrawerContract.State import app.k9mail.feature.navigation.drawer.ui.DrawerContract.ViewModel +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch @Suppress("MagicNumber") class DrawerViewModel( private val getDisplayAccounts: UseCase.GetDisplayAccounts, + private val getDisplayFoldersForAccount: UseCase.GetDisplayFoldersForAccount, initialState: State = State(), ) : BaseViewModel( initialState = initialState, @@ -22,7 +28,17 @@ class DrawerViewModel( init { viewModelScope.launch { - getDisplayAccounts().collect { accounts -> updateAccounts(accounts) } + loadAccounts() + } + + viewModelScope.launch { + loadFolders() + } + } + + private suspend fun loadAccounts() { + getDisplayAccounts().collectLatest { accounts -> + updateAccounts(accounts) } } @@ -32,16 +48,30 @@ class DrawerViewModel( updateState { if (isCurrentAccountAvailable) { - it.copy(accounts = accounts) + it.copy(accounts = accounts.toImmutableList()) } else { it.copy( + accounts = accounts.toImmutableList(), currentAccount = accounts.firstOrNull(), - accounts = accounts, ) } } } + private suspend fun loadFolders() { + state.map { it.currentAccount } + .distinctUntilChanged() + .collectLatest { currentAccount -> + if (currentAccount != null) { + getDisplayFoldersForAccount(currentAccount.account.uuid).collectLatest { folders -> + updateState { + it.copy(folders = folders.toImmutableList()) + } + } + } + } + } + override fun event(event: Event) { when (event) { Event.OnRefresh -> refresh() diff --git a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/folder/FolderList.kt b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/folder/FolderList.kt new file mode 100644 index 0000000000..cfbe88d7c9 --- /dev/null +++ b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/folder/FolderList.kt @@ -0,0 +1,32 @@ +package app.k9mail.feature.navigation.drawer.ui.folder + +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import app.k9mail.legacy.ui.folder.DisplayFolder +import kotlinx.collections.immutable.ImmutableList + +@Composable +fun FolderList( + folders: ImmutableList, + selectedFolder: DisplayFolder?, + onFolderClick: (DisplayFolder) -> Unit, + showStarredCount: Boolean, + modifier: Modifier = Modifier, +) { + LazyColumn( + modifier = modifier + .fillMaxSize(), + ) { + items(folders) { folder -> + FolderListItem( + displayFolder = folder, + selected = folder == selectedFolder, + showStarredCount = showStarredCount, + onClick = onFolderClick, + ) + } + } +} diff --git a/feature/navigation/drawer/src/test/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerViewModelTest.kt b/feature/navigation/drawer/src/test/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerViewModelTest.kt index c1d0725bc4..3ef98c9a39 100644 --- a/feature/navigation/drawer/src/test/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerViewModelTest.kt +++ b/feature/navigation/drawer/src/test/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerViewModelTest.kt @@ -7,6 +7,7 @@ import app.k9mail.feature.navigation.drawer.ui.DrawerContract.Event import app.k9mail.feature.navigation.drawer.ui.DrawerContract.State import app.k9mail.legacy.account.Account import app.k9mail.legacy.account.Identity +import app.k9mail.legacy.ui.folder.DisplayFolder import assertk.assertThat import assertk.assertions.isEqualTo import kotlin.test.Test @@ -91,9 +92,11 @@ class DrawerViewModelTest { private fun createTestSubject( getDisplayAccountsFlow: Flow> = flow { emit(emptyList()) }, + getDisplayFoldersForAccount: Flow> = flow { emit(emptyList()) }, ): DrawerViewModel { return DrawerViewModel( getDisplayAccounts = { getDisplayAccountsFlow }, + getDisplayFoldersForAccount = { getDisplayFoldersForAccount }, ) }