From ebef167d7bca7cd45abcf5d4c8105578da6944ce Mon Sep 17 00:00:00 2001 From: Konstantin Ivanov <54908981+konstantiniiv@users.noreply.github.com> Date: Tue, 4 Jun 2024 16:12:44 +0200 Subject: [PATCH] DROID-2525 Membership | Hide the membership menu in local only mode (#1259) --- .../anytype/di/feature/settings/ProfileDI.kt | 7 +++-- .../ui/settings/ProfileSettingsFragment.kt | 1 + .../payments/screens/MembershipScreen.kt | 2 +- .../ui_settings/account/ProfileScreen.kt | 30 +++++++++++-------- .../account/ProfileSettingsViewModel.kt | 28 ++++++++++++++--- 5 files changed, 48 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/com/anytypeio/anytype/di/feature/settings/ProfileDI.kt b/app/src/main/java/com/anytypeio/anytype/di/feature/settings/ProfileDI.kt index 8d570359e6..e487a30570 100644 --- a/app/src/main/java/com/anytypeio/anytype/di/feature/settings/ProfileDI.kt +++ b/app/src/main/java/com/anytypeio/anytype/di/feature/settings/ProfileDI.kt @@ -14,6 +14,7 @@ import com.anytypeio.anytype.domain.debugging.DebugSpace import com.anytypeio.anytype.domain.icon.SetDocumentImageIcon import com.anytypeio.anytype.domain.library.StorelessSubscriptionContainer import com.anytypeio.anytype.domain.misc.UrlBuilder +import com.anytypeio.anytype.domain.networkmode.GetNetworkMode import com.anytypeio.anytype.domain.`object`.SetObjectDetails import com.anytypeio.anytype.domain.workspace.SpaceManager import com.anytypeio.anytype.presentation.membership.provider.MembershipProvider @@ -51,7 +52,8 @@ object ProfileModule { configStorage: ConfigStorage, urlBuilder: UrlBuilder, setDocumentImageIcon: SetDocumentImageIcon, - membershipProvider: MembershipProvider + membershipProvider: MembershipProvider, + getNetworkMode: GetNetworkMode ): ProfileSettingsViewModel.Factory = ProfileSettingsViewModel.Factory( deleteAccount = deleteAccount, analytics = analytics, @@ -60,7 +62,8 @@ object ProfileModule { configStorage = configStorage, urlBuilder = urlBuilder, setDocumentImageIcon = setDocumentImageIcon, - membershipProvider = membershipProvider + membershipProvider = membershipProvider, + getNetworkMode = getNetworkMode ) @Provides diff --git a/app/src/main/java/com/anytypeio/anytype/ui/settings/ProfileSettingsFragment.kt b/app/src/main/java/com/anytypeio/anytype/ui/settings/ProfileSettingsFragment.kt index 4ed35487c3..6caa2a735c 100644 --- a/app/src/main/java/com/anytypeio/anytype/ui/settings/ProfileSettingsFragment.kt +++ b/app/src/main/java/com/anytypeio/anytype/ui/settings/ProfileSettingsFragment.kt @@ -115,6 +115,7 @@ class ProfileSettingsFragment : BaseBottomSheetComposeFragment() { } ), membershipStatus = vm.membershipStatusState.collectAsStateWithLifecycle().value, + showMembership = vm.showMembershipState.collectAsStateWithLifecycle().value, onSpacesClicked = throttledClick( onClick = { runCatching { diff --git a/payments/src/main/java/com/anytypeio/anytype/payments/screens/MembershipScreen.kt b/payments/src/main/java/com/anytypeio/anytype/payments/screens/MembershipScreen.kt index 7c1a89aa50..d8dc3e0263 100644 --- a/payments/src/main/java/com/anytypeio/anytype/payments/screens/MembershipScreen.kt +++ b/payments/src/main/java/com/anytypeio/anytype/payments/screens/MembershipScreen.kt @@ -324,7 +324,7 @@ fun BottomText( .fillMaxWidth() .padding(horizontal = 20.dp) .wrapContentHeight() - .clickable { tierAction(TierAction.OpenEmail) }, + .noRippleThrottledClickable { tierAction(TierAction.OpenEmail) }, text = buildString, style = Caption1Regular, color = colorResource(id = R.color.text_primary) diff --git a/ui-settings/src/main/java/com/anytypeio/anytype/ui_settings/account/ProfileScreen.kt b/ui-settings/src/main/java/com/anytypeio/anytype/ui_settings/account/ProfileScreen.kt index f711c826d4..ee6bfa27b5 100644 --- a/ui-settings/src/main/java/com/anytypeio/anytype/ui_settings/account/ProfileScreen.kt +++ b/ui-settings/src/main/java/com/anytypeio/anytype/ui_settings/account/ProfileScreen.kt @@ -49,6 +49,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import coil.compose.rememberAsyncImagePainter +import com.anytypeio.anytype.core_models.NetworkMode import com.anytypeio.anytype.core_ui.foundation.Arrow import com.anytypeio.anytype.core_ui.foundation.Divider import com.anytypeio.anytype.core_ui.foundation.Dragger @@ -60,7 +61,6 @@ import com.anytypeio.anytype.core_ui.views.Caption1Regular import com.anytypeio.anytype.core_ui.views.Title1 import com.anytypeio.anytype.presentation.membership.models.MembershipStatus import com.anytypeio.anytype.presentation.profile.ProfileIconView -import com.anytypeio.anytype.ui_settings.BuildConfig import com.anytypeio.anytype.ui_settings.R import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.flow.debounce @@ -80,7 +80,8 @@ fun ProfileSettingsScreen( onAboutClicked: () -> Unit, onSpacesClicked: () -> Unit, onMembershipClicked: () -> Unit, - membershipStatus: MembershipStatus? + membershipStatus: MembershipStatus?, + showMembership: ShowMembership? ) { LazyColumn( modifier = Modifier @@ -125,16 +126,18 @@ fun ProfileSettingsScreen( onClick = onDataManagementClicked ) } - item { - Divider(paddingStart = 60.dp) - } - item { - OptionMembership( - image = R.drawable.ic_membership, - text = stringResource(R.string.settings_membership), - onClick = onMembershipClicked, - membershipStatus = membershipStatus - ) + if (showMembership?.isShowing == true) { + item { + Divider(paddingStart = 60.dp) + } + item { + OptionMembership( + image = R.drawable.ic_membership, + text = stringResource(R.string.settings_membership), + onClick = onMembershipClicked, + membershipStatus = membershipStatus + ) + } } item { Divider(paddingStart = 60.dp) @@ -499,7 +502,8 @@ private fun ProfileSettingPreview() { onAboutClicked = {}, onSpacesClicked = {}, onMembershipClicked = {}, - membershipStatus = null + membershipStatus = null, + showMembership = ShowMembership(true) ) } diff --git a/ui-settings/src/main/java/com/anytypeio/anytype/ui_settings/account/ProfileSettingsViewModel.kt b/ui-settings/src/main/java/com/anytypeio/anytype/ui_settings/account/ProfileSettingsViewModel.kt index b11f78d39a..db2839e2aa 100644 --- a/ui-settings/src/main/java/com/anytypeio/anytype/ui_settings/account/ProfileSettingsViewModel.kt +++ b/ui-settings/src/main/java/com/anytypeio/anytype/ui_settings/account/ProfileSettingsViewModel.kt @@ -8,6 +8,7 @@ import com.anytypeio.anytype.analytics.base.Analytics import com.anytypeio.anytype.analytics.base.EventsDictionary import com.anytypeio.anytype.analytics.base.sendEvent import com.anytypeio.anytype.core_models.Id +import com.anytypeio.anytype.core_models.NetworkMode import com.anytypeio.anytype.core_models.Relations import com.anytypeio.anytype.core_models.primitives.SpaceId import com.anytypeio.anytype.domain.account.DeleteAccount @@ -19,6 +20,7 @@ import com.anytypeio.anytype.domain.icon.SetImageIcon import com.anytypeio.anytype.domain.library.StoreSearchByIdsParams import com.anytypeio.anytype.domain.library.StorelessSubscriptionContainer import com.anytypeio.anytype.domain.misc.UrlBuilder +import com.anytypeio.anytype.domain.networkmode.GetNetworkMode import com.anytypeio.anytype.domain.`object`.SetObjectDetails import com.anytypeio.anytype.domain.search.PROFILE_SUBSCRIPTION_ID import com.anytypeio.anytype.presentation.common.BaseViewModel @@ -43,7 +45,8 @@ class ProfileSettingsViewModel( private val configStorage: ConfigStorage, private val urlBuilder: UrlBuilder, private val setImageIcon: SetDocumentImageIcon, - private val membershipProvider: MembershipProvider + private val membershipProvider: MembershipProvider, + private val getNetworkMode: GetNetworkMode ) : BaseViewModel() { private val jobs = mutableListOf() @@ -51,6 +54,7 @@ class ProfileSettingsViewModel( val isLoggingOut = MutableStateFlow(false) val debugSyncReportUri = MutableStateFlow(null) val membershipStatusState = MutableStateFlow(null) + val showMembershipState = MutableStateFlow(null) private val profileId = configStorage.get().profile @@ -84,6 +88,18 @@ class ProfileSettingsViewModel( eventName = EventsDictionary.screenSettingsAccount ) } + viewModelScope.launch { + getNetworkMode.async(Unit).fold( + onSuccess = { result -> + showMembershipState.value = when (result.networkMode) { + NetworkMode.DEFAULT -> ShowMembership(true) + NetworkMode.LOCAL -> ShowMembership(false) + NetworkMode.CUSTOM -> ShowMembership(true) + } + }, + onFailure = { Timber.e(it, "Error while getting network mode") } + ) + } viewModelScope.launch { membershipProvider.status().collect { status -> membershipStatusState.value = status @@ -189,7 +205,8 @@ class ProfileSettingsViewModel( private val configStorage: ConfigStorage, private val urlBuilder: UrlBuilder, private val setDocumentImageIcon: SetDocumentImageIcon, - private val membershipProvider: MembershipProvider + private val membershipProvider: MembershipProvider, + private val getNetworkMode: GetNetworkMode ) : ViewModelProvider.Factory { @Suppress("UNCHECKED_CAST") override fun create(modelClass: Class): T { @@ -201,10 +218,13 @@ class ProfileSettingsViewModel( configStorage = configStorage, urlBuilder = urlBuilder, setImageIcon = setDocumentImageIcon, - membershipProvider = membershipProvider + membershipProvider = membershipProvider, + getNetworkMode = getNetworkMode ) as T } } } -private const val STOP_SUBSCRIPTION_TIMEOUT = 1_000L \ No newline at end of file +private const val STOP_SUBSCRIPTION_TIMEOUT = 1_000L + +data class ShowMembership(val isShowing: Boolean) \ No newline at end of file