Loading feature/account/settings/impl/build.gradle.kts +1 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ dependencies { implementation(projects.core.ui.compose.navigation) implementation(projects.core.ui.compose.preference) implementation(projects.core.ui.legacy.theme2.common) implementation(libs.timber) testImplementation(projects.core.ui.compose.testing) } feature/account/settings/impl/src/main/kotlin/net/thunderbird/feature/account/settings/AccountSettingsModule.kt +8 −0 Original line number Diff line number Diff line Loading @@ -4,6 +4,7 @@ import net.thunderbird.feature.account.settings.api.AccountSettingsNavigation import net.thunderbird.feature.account.settings.impl.DefaultAccountSettingsNavigation import net.thunderbird.feature.account.settings.impl.domain.AccountSettingsDomainContract.ResourceProvider import net.thunderbird.feature.account.settings.impl.domain.AccountSettingsDomainContract.UseCase import net.thunderbird.feature.account.settings.impl.domain.usecase.GetAccountName import net.thunderbird.feature.account.settings.impl.domain.usecase.GetGeneralPreferences import net.thunderbird.feature.account.settings.impl.domain.usecase.UpdateGeneralPreferences import net.thunderbird.feature.account.settings.impl.ui.general.GeneralResourceProvider Loading @@ -21,6 +22,12 @@ val featureAccountSettingsModule = module { ) } factory<UseCase.GetAccountName> { GetAccountName( repository = get(), ) } factory<UseCase.GetGeneralPreferences> { GetGeneralPreferences( repository = get(), Loading @@ -37,6 +44,7 @@ val featureAccountSettingsModule = module { viewModel { params -> GeneralSettingsViewModel( accountId = params.get(), getAccountName = get(), getGeneralPreferences = get(), updateGeneralPreferences = get(), ) Loading feature/account/settings/impl/src/main/kotlin/net/thunderbird/feature/account/settings/impl/domain/AccountSettingsDomainContract.kt +5 −0 Original line number Diff line number Diff line Loading @@ -11,12 +11,17 @@ import net.thunderbird.core.ui.compose.preference.api.PreferenceSetting import net.thunderbird.feature.account.api.AccountId import net.thunderbird.feature.account.settings.impl.domain.AccountSettingsDomainContract.SettingsError internal typealias AccountNameOutcome = Outcome<String, SettingsError> internal typealias AccountSettingsOutcome = Outcome<ImmutableList<Preference>, SettingsError> internal interface AccountSettingsDomainContract { interface UseCase { fun interface GetAccountName { operator fun invoke(accountId: AccountId): Flow<AccountNameOutcome> } fun interface GetGeneralPreferences { operator fun invoke(accountId: AccountId): Flow<AccountSettingsOutcome> } Loading feature/account/settings/impl/src/main/kotlin/net/thunderbird/feature/account/settings/impl/domain/usecase/GetAccountName.kt 0 → 100644 +29 −0 Original line number Diff line number Diff line package net.thunderbird.feature.account.settings.impl.domain.usecase import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import net.thunderbird.core.outcome.Outcome import net.thunderbird.feature.account.api.AccountId import net.thunderbird.feature.account.api.profile.AccountProfileRepository import net.thunderbird.feature.account.settings.impl.domain.AccountNameOutcome import net.thunderbird.feature.account.settings.impl.domain.AccountSettingsDomainContract import net.thunderbird.feature.account.settings.impl.domain.AccountSettingsDomainContract.UseCase internal class GetAccountName( private val repository: AccountProfileRepository, ) : UseCase.GetAccountName { override fun invoke(accountId: AccountId): Flow<AccountNameOutcome> { return repository.getById(accountId).map { profile -> if (profile != null) { Outcome.success(profile.name) } else { Outcome.failure( AccountSettingsDomainContract.SettingsError.NotFound( message = "Account profile not found for accountId: ${accountId.value}", ), ) } } } } feature/account/settings/impl/src/main/kotlin/net/thunderbird/feature/account/settings/impl/ui/general/GeneralSettingsViewModel.kt +25 −1 Original line number Diff line number Diff line Loading @@ -6,19 +6,37 @@ import kotlinx.coroutines.launch import net.thunderbird.core.outcome.handle import net.thunderbird.core.ui.compose.preference.api.PreferenceSetting import net.thunderbird.feature.account.api.AccountId import net.thunderbird.feature.account.settings.impl.domain.AccountSettingsDomainContract.SettingsError import net.thunderbird.feature.account.settings.impl.domain.AccountSettingsDomainContract.UseCase import net.thunderbird.feature.account.settings.impl.ui.general.GeneralSettingsContract.Effect import net.thunderbird.feature.account.settings.impl.ui.general.GeneralSettingsContract.Event import net.thunderbird.feature.account.settings.impl.ui.general.GeneralSettingsContract.State import timber.log.Timber internal class GeneralSettingsViewModel( private val accountId: AccountId, private val getAccountName: UseCase.GetAccountName, private val getGeneralPreferences: UseCase.GetGeneralPreferences, private val updateGeneralPreferences: UseCase.UpdateGeneralPreferences, initialState: State = State(), ) : BaseViewModel<State, Event, Effect>(initialState), GeneralSettingsContract.ViewModel { init { viewModelScope.launch { getAccountName(accountId).collect { outcome -> outcome.handle( onSuccess = { accountName -> updateState { state -> state.copy( subtitle = accountName, ) } }, onFailure = { handleError(it) }, ) } } viewModelScope.launch { getGeneralPreferences(accountId).collect { outcome -> outcome.handle( Loading @@ -29,7 +47,7 @@ internal class GeneralSettingsViewModel( ) } }, onFailure = {}, onFailure = { handleError(it) }, ) } } Loading @@ -47,4 +65,10 @@ internal class GeneralSettingsViewModel( updateGeneralPreferences(accountId, preference) } } private fun handleError(error: SettingsError) { when (error) { is SettingsError.NotFound -> Timber.w(error.message) } } } Loading
feature/account/settings/impl/build.gradle.kts +1 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ dependencies { implementation(projects.core.ui.compose.navigation) implementation(projects.core.ui.compose.preference) implementation(projects.core.ui.legacy.theme2.common) implementation(libs.timber) testImplementation(projects.core.ui.compose.testing) }
feature/account/settings/impl/src/main/kotlin/net/thunderbird/feature/account/settings/AccountSettingsModule.kt +8 −0 Original line number Diff line number Diff line Loading @@ -4,6 +4,7 @@ import net.thunderbird.feature.account.settings.api.AccountSettingsNavigation import net.thunderbird.feature.account.settings.impl.DefaultAccountSettingsNavigation import net.thunderbird.feature.account.settings.impl.domain.AccountSettingsDomainContract.ResourceProvider import net.thunderbird.feature.account.settings.impl.domain.AccountSettingsDomainContract.UseCase import net.thunderbird.feature.account.settings.impl.domain.usecase.GetAccountName import net.thunderbird.feature.account.settings.impl.domain.usecase.GetGeneralPreferences import net.thunderbird.feature.account.settings.impl.domain.usecase.UpdateGeneralPreferences import net.thunderbird.feature.account.settings.impl.ui.general.GeneralResourceProvider Loading @@ -21,6 +22,12 @@ val featureAccountSettingsModule = module { ) } factory<UseCase.GetAccountName> { GetAccountName( repository = get(), ) } factory<UseCase.GetGeneralPreferences> { GetGeneralPreferences( repository = get(), Loading @@ -37,6 +44,7 @@ val featureAccountSettingsModule = module { viewModel { params -> GeneralSettingsViewModel( accountId = params.get(), getAccountName = get(), getGeneralPreferences = get(), updateGeneralPreferences = get(), ) Loading
feature/account/settings/impl/src/main/kotlin/net/thunderbird/feature/account/settings/impl/domain/AccountSettingsDomainContract.kt +5 −0 Original line number Diff line number Diff line Loading @@ -11,12 +11,17 @@ import net.thunderbird.core.ui.compose.preference.api.PreferenceSetting import net.thunderbird.feature.account.api.AccountId import net.thunderbird.feature.account.settings.impl.domain.AccountSettingsDomainContract.SettingsError internal typealias AccountNameOutcome = Outcome<String, SettingsError> internal typealias AccountSettingsOutcome = Outcome<ImmutableList<Preference>, SettingsError> internal interface AccountSettingsDomainContract { interface UseCase { fun interface GetAccountName { operator fun invoke(accountId: AccountId): Flow<AccountNameOutcome> } fun interface GetGeneralPreferences { operator fun invoke(accountId: AccountId): Flow<AccountSettingsOutcome> } Loading
feature/account/settings/impl/src/main/kotlin/net/thunderbird/feature/account/settings/impl/domain/usecase/GetAccountName.kt 0 → 100644 +29 −0 Original line number Diff line number Diff line package net.thunderbird.feature.account.settings.impl.domain.usecase import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import net.thunderbird.core.outcome.Outcome import net.thunderbird.feature.account.api.AccountId import net.thunderbird.feature.account.api.profile.AccountProfileRepository import net.thunderbird.feature.account.settings.impl.domain.AccountNameOutcome import net.thunderbird.feature.account.settings.impl.domain.AccountSettingsDomainContract import net.thunderbird.feature.account.settings.impl.domain.AccountSettingsDomainContract.UseCase internal class GetAccountName( private val repository: AccountProfileRepository, ) : UseCase.GetAccountName { override fun invoke(accountId: AccountId): Flow<AccountNameOutcome> { return repository.getById(accountId).map { profile -> if (profile != null) { Outcome.success(profile.name) } else { Outcome.failure( AccountSettingsDomainContract.SettingsError.NotFound( message = "Account profile not found for accountId: ${accountId.value}", ), ) } } } }
feature/account/settings/impl/src/main/kotlin/net/thunderbird/feature/account/settings/impl/ui/general/GeneralSettingsViewModel.kt +25 −1 Original line number Diff line number Diff line Loading @@ -6,19 +6,37 @@ import kotlinx.coroutines.launch import net.thunderbird.core.outcome.handle import net.thunderbird.core.ui.compose.preference.api.PreferenceSetting import net.thunderbird.feature.account.api.AccountId import net.thunderbird.feature.account.settings.impl.domain.AccountSettingsDomainContract.SettingsError import net.thunderbird.feature.account.settings.impl.domain.AccountSettingsDomainContract.UseCase import net.thunderbird.feature.account.settings.impl.ui.general.GeneralSettingsContract.Effect import net.thunderbird.feature.account.settings.impl.ui.general.GeneralSettingsContract.Event import net.thunderbird.feature.account.settings.impl.ui.general.GeneralSettingsContract.State import timber.log.Timber internal class GeneralSettingsViewModel( private val accountId: AccountId, private val getAccountName: UseCase.GetAccountName, private val getGeneralPreferences: UseCase.GetGeneralPreferences, private val updateGeneralPreferences: UseCase.UpdateGeneralPreferences, initialState: State = State(), ) : BaseViewModel<State, Event, Effect>(initialState), GeneralSettingsContract.ViewModel { init { viewModelScope.launch { getAccountName(accountId).collect { outcome -> outcome.handle( onSuccess = { accountName -> updateState { state -> state.copy( subtitle = accountName, ) } }, onFailure = { handleError(it) }, ) } } viewModelScope.launch { getGeneralPreferences(accountId).collect { outcome -> outcome.handle( Loading @@ -29,7 +47,7 @@ internal class GeneralSettingsViewModel( ) } }, onFailure = {}, onFailure = { handleError(it) }, ) } } Loading @@ -47,4 +65,10 @@ internal class GeneralSettingsViewModel( updateGeneralPreferences(accountId, preference) } } private fun handleError(error: SettingsError) { when (error) { is SettingsError.NotFound -> Timber.w(error.message) } } }