From 6417281c760a79d015804d01d9c68610d085c063 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 6 Jan 2025 18:23:30 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../components/appbar/TopBarWithRefresh.kt | 18 ++++++ .../components/appbar/TopBarWithRefreshUM.kt | 12 ++++ .../notification/CustomSetupNotification.kt | 21 ++++++ .../ExcludedBlockchainsScreen.kt | 2 +- .../state/FeatureTogglesContentState.kt | 28 ++------ .../featuretoggles/ui/FeatureTogglesScreen.kt | 64 ++++++------------- .../viewmodels/FeatureTogglesViewModel.kt | 48 ++++++++------ .../providers/entity/BlockchainProvidersUM.kt | 3 +- .../providers/ui/BlockchainProvidersScreen.kt | 52 ++++++++------- .../viewmodel/BlockchainProvidersViewModel.kt | 30 ++++++++- .../impl/src/main/res/values/strings.xml | 3 +- 11 files changed, 165 insertions(+), 116 deletions(-) create mode 100644 features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/common/components/appbar/TopBarWithRefresh.kt create mode 100644 features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/common/components/appbar/TopBarWithRefreshUM.kt create mode 100644 features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/common/components/notification/CustomSetupNotification.kt diff --git a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/common/components/appbar/TopBarWithRefresh.kt b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/common/components/appbar/TopBarWithRefresh.kt new file mode 100644 index 0000000000..5c9b785bd2 --- /dev/null +++ b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/common/components/appbar/TopBarWithRefresh.kt @@ -0,0 +1,18 @@ +package com.tangem.feature.tester.presentation.common.components.appbar + +import androidx.compose.runtime.Composable +import com.tangem.core.ui.components.appbar.AppBarWithBackButtonAndIcon +import com.tangem.core.ui.extensions.stringResourceSafe +import com.tangem.core.ui.res.TangemTheme +import com.tangem.feature.tester.impl.R + +@Composable +internal fun TopBarWithRefresh(state: TopBarWithRefreshUM) { + AppBarWithBackButtonAndIcon( + onBackClick = state.onBackClick, + text = stringResourceSafe(state.titleResId), + iconRes = R.drawable.ic_refresh_24.takeIf { state.refreshButton.isVisible }, + onIconClick = state.refreshButton.onRefreshClick, + backgroundColor = TangemTheme.colors.background.primary, + ) +} \ No newline at end of file diff --git a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/common/components/appbar/TopBarWithRefreshUM.kt b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/common/components/appbar/TopBarWithRefreshUM.kt new file mode 100644 index 0000000000..c942dcf83f --- /dev/null +++ b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/common/components/appbar/TopBarWithRefreshUM.kt @@ -0,0 +1,12 @@ +package com.tangem.feature.tester.presentation.common.components.appbar + +import androidx.annotation.StringRes + +internal data class TopBarWithRefreshUM( + @StringRes val titleResId: Int, + val onBackClick: () -> Unit, + val refreshButton: RefreshButton, +) { + + data class RefreshButton(val isVisible: Boolean, val onRefreshClick: () -> Unit) +} \ No newline at end of file diff --git a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/common/components/notification/CustomSetupNotification.kt b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/common/components/notification/CustomSetupNotification.kt new file mode 100644 index 0000000000..e2a70bea3b --- /dev/null +++ b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/common/components/notification/CustomSetupNotification.kt @@ -0,0 +1,21 @@ +package com.tangem.feature.tester.presentation.common.components.notification + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import com.tangem.core.ui.components.notifications.Notification +import com.tangem.core.ui.components.notifications.NotificationConfig +import com.tangem.core.ui.extensions.TextReference +import com.tangem.core.ui.extensions.resourceReference +import com.tangem.feature.tester.impl.R + +@Composable +internal fun CustomSetupNotification(subtitle: TextReference, modifier: Modifier = Modifier) { + Notification( + config = NotificationConfig( + subtitle = subtitle, + iconResId = R.drawable.ic_alert_triangle_20, + title = resourceReference(id = R.string.custom_setup_warning_title), + ), + modifier = modifier, + ) +} \ No newline at end of file diff --git a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/excludedblockchains/ExcludedBlockchainsScreen.kt b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/excludedblockchains/ExcludedBlockchainsScreen.kt index 2909504146..772c22afab 100644 --- a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/excludedblockchains/ExcludedBlockchainsScreen.kt +++ b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/excludedblockchains/ExcludedBlockchainsScreen.kt @@ -114,7 +114,7 @@ private fun TogglesNotification(appVersion: String, isVisible: Boolean, modifier wrappedList(appVersion), ), iconResId = R.drawable.ic_alert_triangle_20, - title = resourceReference(id = R.string.feature_toggles_custom_setup_warning_title), + title = resourceReference(id = R.string.custom_setup_warning_title), ), ) } diff --git a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/featuretoggles/state/FeatureTogglesContentState.kt b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/featuretoggles/state/FeatureTogglesContentState.kt index fb97f05a55..8ead0deb5e 100644 --- a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/featuretoggles/state/FeatureTogglesContentState.kt +++ b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/featuretoggles/state/FeatureTogglesContentState.kt @@ -1,42 +1,22 @@ package com.tangem.feature.tester.presentation.featuretoggles.state +import com.tangem.feature.tester.presentation.common.components.appbar.TopBarWithRefreshUM import com.tangem.feature.tester.presentation.featuretoggles.models.TesterFeatureToggle import kotlinx.collections.immutable.ImmutableList /** * Content state of feature toggles screen * - * @property topBarState top bar state + * @property topBar top bar state * @property appVersion app version * @property featureToggles feature toggles list - * @property onBackClick the lambda to be invoked when back button is pressed * @property onToggleValueChange the lambda to be invoked when switch button is pressed * @property onRestartAppClick the lambda to be invoked when restart app button is pressed */ internal data class FeatureTogglesContentState( - val topBarState: TopBarState, + val topBar: TopBarWithRefreshUM, val appVersion: String, val featureToggles: ImmutableList, - val onBackClick: () -> Unit, val onToggleValueChange: (String, Boolean) -> Unit, val onRestartAppClick: () -> Unit, -) { - - /** Top bar state */ - sealed interface TopBarState { - - /** - * Config setup - * - * @property onBackClick the lambda to be invoked when back button is pressed - */ - data object ConfigSetup : TopBarState - - /** - * Custom setup - * - * @property onRecoverClick the lambda to be invoked when recover button is pressed - */ - data class CustomSetup(val onRecoverClick: () -> Unit) : TopBarState - } -} \ No newline at end of file +) \ No newline at end of file diff --git a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/featuretoggles/ui/FeatureTogglesScreen.kt b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/featuretoggles/ui/FeatureTogglesScreen.kt index d03303bda6..6db389959c 100644 --- a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/featuretoggles/ui/FeatureTogglesScreen.kt +++ b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/featuretoggles/ui/FeatureTogglesScreen.kt @@ -15,15 +15,15 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.tangem.core.ui.components.PrimaryButton import com.tangem.core.ui.components.TangemSwitch -import com.tangem.core.ui.components.appbar.AppBarWithBackButtonAndIcon -import com.tangem.core.ui.components.notifications.Notification -import com.tangem.core.ui.components.notifications.NotificationConfig import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.extensions.stringResourceSafe import com.tangem.core.ui.extensions.wrappedList import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.res.TangemThemePreview import com.tangem.feature.tester.impl.R +import com.tangem.feature.tester.presentation.common.components.appbar.TopBarWithRefresh +import com.tangem.feature.tester.presentation.common.components.appbar.TopBarWithRefreshUM +import com.tangem.feature.tester.presentation.common.components.notification.CustomSetupNotification import com.tangem.feature.tester.presentation.featuretoggles.models.TesterFeatureToggle import com.tangem.feature.tester.presentation.featuretoggles.state.FeatureTogglesContentState import kotlinx.collections.immutable.persistentListOf @@ -41,12 +41,15 @@ internal fun FeatureTogglesScreen(state: FeatureTogglesContentState) { .fillMaxSize() .background(TangemTheme.colors.background.secondary), ) { - stickyHeader { TopAppBar(state = state.topBarState, onBackClick = state.onBackClick) } + stickyHeader { TopBarWithRefresh(state = state.topBar) } - if (state.topBarState is FeatureTogglesContentState.TopBarState.CustomSetup) { + if (state.topBar.refreshButton.isVisible) { item(key = "warning_notification", contentType = "warning_notification") { - WarningNotification( - appVersion = state.appVersion, + CustomSetupNotification( + subtitle = resourceReference( + id = R.string.feature_toggles_custom_setup_warning_description, + wrappedList(state.appVersion), + ), modifier = Modifier .animateItem() .padding(horizontal = 16.dp) @@ -78,39 +81,6 @@ internal fun FeatureTogglesScreen(state: FeatureTogglesContentState) { } } -@Composable -private fun TopAppBar(state: FeatureTogglesContentState.TopBarState, onBackClick: () -> Unit) { - AppBarWithBackButtonAndIcon( - onBackClick = onBackClick, - text = stringResourceSafe(id = R.string.feature_toggles), - iconRes = if (state is FeatureTogglesContentState.TopBarState.CustomSetup) { - R.drawable.ic_refresh_24 - } else { - null - }, - onIconClick = if (state is FeatureTogglesContentState.TopBarState.CustomSetup) { - state.onRecoverClick - } else { - null - }, - ) -} - -@Composable -private fun WarningNotification(appVersion: String, modifier: Modifier = Modifier) { - Notification( - config = NotificationConfig( - subtitle = resourceReference( - id = R.string.feature_toggles_custom_setup_warning_description, - wrappedList(appVersion), - ), - iconResId = R.drawable.ic_alert_triangle_20, - title = resourceReference(id = R.string.feature_toggles_custom_setup_warning_title), - ), - modifier = modifier, - ) -} - @Composable private fun FeatureToggleItem(toggle: TesterFeatureToggle, onCheckedChange: (Boolean) -> Unit) { Row( @@ -145,17 +115,19 @@ private fun PreviewFeatureTogglesScreen() { FeatureTogglesScreen( state = FeatureTogglesContentState( - topBarState = if (isCustomSetup) { - FeatureTogglesContentState.TopBarState.CustomSetup(onRecoverClick = { isCustomSetup = false }) - } else { - FeatureTogglesContentState.TopBarState.ConfigSetup - }, + topBar = TopBarWithRefreshUM( + titleResId = R.string.feature_toggles, + onBackClick = {}, + refreshButton = TopBarWithRefreshUM.RefreshButton( + isVisible = isCustomSetup, + onRefreshClick = { isCustomSetup = false }, + ), + ), appVersion = "5.15", featureToggles = persistentListOf( TesterFeatureToggle(name = "FEATURE_TOGGLE_1", isEnabled = true), TesterFeatureToggle(name = "FEATURE_TOGGLE_2", isEnabled = false), ), - onBackClick = {}, onToggleValueChange = { _, _ -> isCustomSetup = true }, onRestartAppClick = {}, ), diff --git a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/featuretoggles/viewmodels/FeatureTogglesViewModel.kt b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/featuretoggles/viewmodels/FeatureTogglesViewModel.kt index 0da5a80bad..0c85993387 100644 --- a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/featuretoggles/viewmodels/FeatureTogglesViewModel.kt +++ b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/featuretoggles/viewmodels/FeatureTogglesViewModel.kt @@ -8,6 +8,8 @@ import androidx.lifecycle.viewModelScope import com.tangem.core.configtoggle.feature.FeatureTogglesManager import com.tangem.core.configtoggle.feature.MutableFeatureTogglesManager import com.tangem.core.navigation.finisher.AppFinisher +import com.tangem.feature.tester.impl.R +import com.tangem.feature.tester.presentation.common.components.appbar.TopBarWithRefreshUM import com.tangem.feature.tester.presentation.featuretoggles.models.TesterFeatureToggle import com.tangem.feature.tester.presentation.featuretoggles.state.FeatureTogglesContentState import com.tangem.feature.tester.presentation.navigation.InnerTesterRouter @@ -45,22 +47,40 @@ internal class FeatureTogglesViewModel @Inject constructor( /** Setup navigation state property by router [router] and provides app restart method by [appFinisher] */ fun setupInteractions(router: InnerTesterRouter, appFinisher: AppFinisher) { uiState = uiState.copy( - onBackClick = router::back, + topBar = uiState.topBar.copy(onBackClick = router::back), onRestartAppClick = appFinisher::restart, ) } private fun initState(): FeatureTogglesContentState { return FeatureTogglesContentState( - topBarState = getConfigSetupState(), + topBar = getConfigSetupState(isPrimarySetup = true), appVersion = appVersionProvider.versionName, featureToggles = mutableFeatureTogglesManager.getTesterFeatureToggles(), onToggleValueChange = ::onToggleValueChange, - onBackClick = {}, onRestartAppClick = {}, ) } + private fun getConfigSetupState(isPrimarySetup: Boolean): TopBarWithRefreshUM { + val isMatchLocalConfig = mutableFeatureTogglesManager.isMatchLocalConfig() + + return if (isPrimarySetup) { + TopBarWithRefreshUM( + titleResId = R.string.feature_toggles, + onBackClick = {}, + refreshButton = TopBarWithRefreshUM.RefreshButton( + isVisible = false, + onRefreshClick = ::onRefreshClick, + ), + ) + } else { + uiState.topBar.copy( + refreshButton = uiState.topBar.refreshButton.copy(isVisible = isMatchLocalConfig), + ) + } + } + private fun onToggleValueChange(name: String, isEnabled: Boolean) { viewModelScope.launch { mutableFeatureTogglesManager.changeToggle(name = name, isEnabled = isEnabled) @@ -70,25 +90,17 @@ internal class FeatureTogglesViewModel @Inject constructor( // delay for smoothly update animations delay(timeMillis = 300) - uiState = uiState.copy(topBarState = getConfigSetupState()) + uiState = uiState.copy(topBar = getConfigSetupState(isPrimarySetup = false)) } } - private fun getConfigSetupState(): FeatureTogglesContentState.TopBarState { - return if (mutableFeatureTogglesManager.isMatchLocalConfig()) { - FeatureTogglesContentState.TopBarState.ConfigSetup - } else { - FeatureTogglesContentState.TopBarState.CustomSetup( - onRecoverClick = { - viewModelScope.launch { - mutableFeatureTogglesManager.recoverLocalConfig() + private fun onRefreshClick() { + viewModelScope.launch { + mutableFeatureTogglesManager.recoverLocalConfig() - uiState = uiState.copy( - topBarState = getConfigSetupState(), - featureToggles = mutableFeatureTogglesManager.getTesterFeatureToggles(), - ) - } - }, + uiState = uiState.copy( + topBar = getConfigSetupState(isPrimarySetup = false), + featureToggles = mutableFeatureTogglesManager.getTesterFeatureToggles(), ) } } diff --git a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/providers/entity/BlockchainProvidersUM.kt b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/providers/entity/BlockchainProvidersUM.kt index 6f280851dc..cfebe28ed5 100644 --- a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/providers/entity/BlockchainProvidersUM.kt +++ b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/providers/entity/BlockchainProvidersUM.kt @@ -2,10 +2,11 @@ package com.tangem.feature.tester.presentation.providers.entity import androidx.compose.runtime.Immutable import com.tangem.blockchain.common.network.providers.ProviderType +import com.tangem.feature.tester.presentation.common.components.appbar.TopBarWithRefreshUM import kotlinx.collections.immutable.ImmutableList internal data class BlockchainProvidersUM( - val onBackClick: () -> Unit, + val topBar: TopBarWithRefreshUM, val blockchainProviders: ImmutableList, ) { diff --git a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/providers/ui/BlockchainProvidersScreen.kt b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/providers/ui/BlockchainProvidersScreen.kt index 32691867a6..ce048035c0 100644 --- a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/providers/ui/BlockchainProvidersScreen.kt +++ b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/providers/ui/BlockchainProvidersScreen.kt @@ -27,13 +27,13 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.util.fastForEachIndexed -import com.tangem.core.ui.components.SpacerH8 -import com.tangem.core.ui.components.appbar.AppBarWithBackButton import com.tangem.core.ui.components.rows.RowText import com.tangem.core.ui.extensions.getActiveIconRes -import com.tangem.core.ui.extensions.stringResourceSafe +import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.res.TangemTheme import com.tangem.feature.tester.impl.R +import com.tangem.feature.tester.presentation.common.components.appbar.TopBarWithRefresh +import com.tangem.feature.tester.presentation.common.components.notification.CustomSetupNotification import com.tangem.feature.tester.presentation.providers.entity.BlockchainProvidersUM import com.tangem.feature.tester.presentation.providers.entity.BlockchainProvidersUM.ProviderUM import com.tangem.feature.tester.presentation.providers.entity.BlockchainProvidersUM.ProvidersUM @@ -50,12 +50,20 @@ internal fun BlockchainProvidersScreen(state: BlockchainProvidersUM) { .background(TangemTheme.colors.background.primary), ) { LazyColumn { - stickyHeader { - AppBarWithBackButton( - onBackClick = state.onBackClick, - text = stringResourceSafe(id = R.string.blockchain_providers), - containerColor = TangemTheme.colors.background.primary, - ) + stickyHeader { TopBarWithRefresh(state = state.topBar) } + + if (state.topBar.refreshButton.isVisible) { + item(key = "notification", contentType = "notification") { + CustomSetupNotification( + subtitle = resourceReference( + id = R.string.blockchain_providers_custom_setup_warning_description, + ), + modifier = Modifier + .animateItem() + .padding(horizontal = 16.dp) + .padding(bottom = 8.dp), + ) + } } items( @@ -74,8 +82,8 @@ private fun BlockchainProvidersItem(state: ProvidersUM) { ExpandableBlockchainRow( state = state, - modifier = Modifier.clickable { isExpanded = !isExpanded }, content = { Providers(state = state, isExpanded = isExpanded) }, + onExpandStateChange = { isExpanded = !isExpanded }, ) } @@ -83,25 +91,23 @@ private fun BlockchainProvidersItem(state: ProvidersUM) { private fun ExpandableBlockchainRow( state: ProvidersUM, content: @Composable () -> Unit, - modifier: Modifier = Modifier, + onExpandStateChange: () -> Unit, ) { - Column( - modifier = modifier - .fillMaxWidth() - .padding(horizontal = 16.dp), - ) { - BlockchainRow(state) + Column { + BlockchainRow(state = state, onExpandStateChange = onExpandStateChange) content() } } @Composable -private fun BlockchainRow(state: ProvidersUM) { +private fun BlockchainRow(state: ProvidersUM, onExpandStateChange: () -> Unit) { Row( modifier = Modifier + .clickable { onExpandStateChange() } + .padding(horizontal = 16.dp) .fillMaxWidth() - .padding(vertical = 16.dp), + .padding(vertical = 12.dp), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically, ) { @@ -145,11 +151,15 @@ private fun BlockchainRow(state: ProvidersUM) { private fun Providers(state: ProvidersUM, isExpanded: Boolean) { AnimatedVisibility( visible = isExpanded, + modifier = Modifier.padding(horizontal = 16.dp), enter = fadeIn() + expandVertically(), exit = fadeOut() + shrinkVertically(), label = "providers_visibility", ) { - Column(verticalArrangement = Arrangement.spacedBy(12.dp)) { + Column( + modifier = Modifier.padding(vertical = 8.dp), + verticalArrangement = Arrangement.spacedBy(12.dp), + ) { state.providers.fastForEachIndexed { index, provider -> key("${provider.name}_$index") { ProviderItem( @@ -157,8 +167,6 @@ private fun Providers(state: ProvidersUM, isExpanded: Boolean) { state = provider, onDrop = { prev, new -> state.onDrop(state.blockchainId, prev, new) }, ) - - if (index == state.providers.lastIndex) SpacerH8() } } } diff --git a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/providers/viewmodel/BlockchainProvidersViewModel.kt b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/providers/viewmodel/BlockchainProvidersViewModel.kt index f8f6981bc8..f6ba96ab7d 100644 --- a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/providers/viewmodel/BlockchainProvidersViewModel.kt +++ b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/providers/viewmodel/BlockchainProvidersViewModel.kt @@ -6,6 +6,8 @@ import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.network.providers.ProviderType import com.tangem.blockchainsdk.providers.BlockchainProvidersTypesManager import com.tangem.blockchainsdk.providers.MutableBlockchainProvidersTypesManager +import com.tangem.feature.tester.impl.R +import com.tangem.feature.tester.presentation.common.components.appbar.TopBarWithRefreshUM import com.tangem.feature.tester.presentation.navigation.InnerTesterRouter import com.tangem.feature.tester.presentation.providers.entity.BlockchainProvidersUM import com.tangem.feature.tester.presentation.providers.entity.BlockchainProvidersUM.ProviderUM @@ -26,7 +28,14 @@ internal class BlockchainProvidersViewModel @Inject constructor( val state: StateFlow get() = _state.asStateFlow() private val _state = MutableStateFlow( - value = BlockchainProvidersUM(onBackClick = {}, blockchainProviders = persistentListOf()), + value = BlockchainProvidersUM( + topBar = TopBarWithRefreshUM( + titleResId = R.string.blockchain_providers, + onBackClick = {}, + refreshButton = TopBarWithRefreshUM.RefreshButton(isVisible = false, onRefreshClick = ::onRefreshClick), + ), + blockchainProviders = persistentListOf(), + ), ) private val manager = blockchainProvidersTypesManager as MutableBlockchainProvidersTypesManager @@ -37,15 +46,24 @@ internal class BlockchainProvidersViewModel @Inject constructor( fun setupNavigation(router: InnerTesterRouter) { _state.update { state -> - state.copy(onBackClick = router::back) + state.copy( + topBar = state.topBar.copy(onBackClick = router::back), + ) } } private fun subscribeOnBlockchainProviderTypesUpdates() { manager.get() .onEach { blockchainProviderTypes -> + val isChanged = !manager.isMatchWithMerged() + _state.update { state -> - state.copy(blockchainProviders = blockchainProviderTypes.toProvidersUM()) + state.copy( + topBar = state.topBar.copy( + refreshButton = state.topBar.refreshButton.copy(isVisible = isChanged), + ), + blockchainProviders = blockchainProviderTypes.toProvidersUM(), + ) } } .launchIn(viewModelScope) @@ -67,6 +85,12 @@ internal class BlockchainProvidersViewModel @Inject constructor( .toImmutableList() } + private fun onRefreshClick() { + viewModelScope.launch { + manager.update() + } + } + private fun onDrop(id: String, prev: Int, current: Int) { val providers = _state.value .blockchainProviders.first { it.blockchainId == id } diff --git a/features/tester/impl/src/main/res/values/strings.xml b/features/tester/impl/src/main/res/values/strings.xml index ae85c60e3b..77b8a9c63d 100644 --- a/features/tester/impl/src/main/res/values/strings.xml +++ b/features/tester/impl/src/main/res/values/strings.xml @@ -2,8 +2,9 @@ Tester menu Feature toggles - Custom setup + Custom setup Toggles differs from v%s config + Providers differs from release config Restart app Environment toggles Tester actions