From 2a54355952979e5d40e152e97acdc82f1bf34e1f Mon Sep 17 00:00:00 2001 From: samiuelson Date: Mon, 6 Oct 2025 17:21:52 +0200 Subject: [PATCH 01/11] Show warning baner in case the full sync is overdue --- .../ui/woopos/home/items/WooPosItemsScreen.kt | 17 ++++ .../woopos/home/items/WooPosItemsViewModel.kt | 23 ++++++ .../home/items/WooPosRefreshCatalogBanner.kt | 80 +++++++++++++++++++ WooCommerce/src/main/res/values/strings.xml | 1 + .../home/items/WooPosItemsViewModelTest.kt | 3 + 5 files changed, 124 insertions(+) create mode 100644 WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosRefreshCatalogBanner.kt diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsScreen.kt index 8327908e08a0..6f51e5fdb3ee 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsScreen.kt @@ -65,6 +65,7 @@ fun WooPosItemsScreen( WooPosItemsScreen( modifier = modifier, itemsStateFlow = productsViewModel.viewState, + catalogSyncBannerStateFlow = productsViewModel.catalogSyncBannerState, productsViewState = productsViewState, couponsListState = couponsListState, catalogSyncState = catalogSyncState, @@ -78,6 +79,7 @@ fun WooPosItemsScreen( private fun WooPosItemsScreen( modifier: Modifier = Modifier, itemsStateFlow: StateFlow, + catalogSyncBannerStateFlow: StateFlow, productsViewState: LazyListState, couponsListState: LazyListState, catalogSyncState: CatalogSyncState, @@ -85,10 +87,12 @@ private fun WooPosItemsScreen( onUIEvent: (WooPosItemsUIEvent) -> Unit, ) { val state = itemsStateFlow.collectAsState() + val bannerState = catalogSyncBannerStateFlow.collectAsState() MainItemsList( modifier = modifier, state = state, + bannerState = bannerState, productsViewState = productsViewState, couponsListState = couponsListState, catalogSyncState = catalogSyncState, @@ -120,6 +124,7 @@ private fun WooPosItemsScreen( private fun MainItemsList( modifier: Modifier, state: State, + bannerState: State, productsViewState: LazyListState, couponsListState: LazyListState, catalogSyncState: CatalogSyncState, @@ -149,6 +154,14 @@ private fun MainItemsList( onAddCouponEvent = onAddCouponEvent, ) + WooPosRefreshCatalogBanner( + bannerState = bannerState.value, + modifier = Modifier.padding( + horizontal = WooPosSpacing.Medium.value.toAdaptivePadding(), + vertical = WooPosSpacing.Small.value.toAdaptivePadding(), + ) + ) + val currentState = state.value Crossfade( @@ -308,10 +321,12 @@ fun WooPosItemsScreenSearchVisiblePreview(modifier: Modifier = Modifier) { tabs = tabs() ) ) + val bannerState = MutableStateFlow(WooPosItemsViewModel.CatalogSyncBannerState.OverdueWarning) WooPosTheme { WooPosItemsScreen( modifier = modifier, itemsStateFlow = productState, + catalogSyncBannerStateFlow = bannerState, productsViewState = rememberLazyListState(), couponsListState = rememberLazyListState(), catalogSyncState = CatalogSyncState.Idle, @@ -336,10 +351,12 @@ fun WooPosItemsScreenSearchHiddenPreview(modifier: Modifier = Modifier) { tabs = tabs() ) ) + val bannerState = MutableStateFlow(WooPosItemsViewModel.CatalogSyncBannerState.OverdueWarning) WooPosTheme { WooPosItemsScreen( modifier = modifier, itemsStateFlow = productState, + catalogSyncBannerStateFlow = bannerState, productsViewState = rememberLazyListState(), couponsListState = rememberLazyListState(), catalogSyncState = CatalogSyncState.Idle, diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsViewModel.kt index 33b11d875f28..bc0ee7cf8dc8 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsViewModel.kt @@ -12,6 +12,8 @@ import com.woocommerce.android.ui.woopos.home.items.WooPosItemsToolbarViewState. import com.woocommerce.android.ui.woopos.home.items.WooPosItemsToolbarViewState.Tab import com.woocommerce.android.ui.woopos.home.items.coupons.creation.WooPosCouponCreationFacade import com.woocommerce.android.ui.woopos.home.items.variations.WooPosVariationsNavigationData +import com.woocommerce.android.ui.woopos.localcatalog.WooPosFullSyncRequirement +import com.woocommerce.android.ui.woopos.localcatalog.WooPosFullSyncStatusChecker import com.woocommerce.android.ui.woopos.util.analytics.WooPosAnalyticsEvent import com.woocommerce.android.ui.woopos.util.analytics.WooPosAnalyticsEvent.Event.SearchButtonTapped import com.woocommerce.android.ui.woopos.util.analytics.WooPosAnalyticsEventConstant @@ -35,6 +37,7 @@ class WooPosItemsViewModel @Inject constructor( private val parentToChildrenEventReceiver: WooPosParentToChildrenEventReceiver, private val preferencesRepository: WooPosPreferencesRepository, private val analyticsTracker: WooPosAnalyticsTracker, + private val syncStatusChecker: WooPosFullSyncStatusChecker, ) : ViewModel() { private var preservedStateBeforeOpeningVariations: WooPosItemsToolbarViewState? = null private val _viewState = MutableStateFlow(initialState()) @@ -45,6 +48,9 @@ class WooPosItemsViewModel @Inject constructor( initialValue = _viewState.value, ) + private val _catalogSyncBannerState = MutableStateFlow(CatalogSyncBannerState.Hidden) + val catalogSyncBannerState: StateFlow = _catalogSyncBannerState + init { listenUpEvents() searchHelper.initialize( @@ -55,6 +61,18 @@ class WooPosItemsViewModel @Inject constructor( viewModelScope.launch { preferencesRepository.setWasOpenedOnce(true) } + + checkSyncStatusAndUpdateBanner() + } + + private fun checkSyncStatusAndUpdateBanner() { + viewModelScope.launch { + val requirement = syncStatusChecker.checkSyncRequirement() + _catalogSyncBannerState.value = when (requirement) { + is WooPosFullSyncRequirement.Overdue -> CatalogSyncBannerState.OverdueWarning + else -> CatalogSyncBannerState.Hidden + } + } } fun onUIEvent(event: WooPosItemsUIEvent) { @@ -241,4 +259,9 @@ class WooPosItemsViewModel @Inject constructor( @Parcelize data class Coupon(override val id: Long, val couponCode: String) : ItemClickedData(id), Parcelable } + + sealed class CatalogSyncBannerState { + data object Hidden : CatalogSyncBannerState() + data object OverdueWarning : CatalogSyncBannerState() + } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosRefreshCatalogBanner.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosRefreshCatalogBanner.kt new file mode 100644 index 000000000000..59f9ffcbdf99 --- /dev/null +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosRefreshCatalogBanner.kt @@ -0,0 +1,80 @@ +package com.woocommerce.android.ui.woopos.home.items + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.core.tween +import androidx.compose.animation.fadeIn +import androidx.compose.animation.scaleIn +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.Info +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import com.woocommerce.android.R +import com.woocommerce.android.ui.woopos.common.composeui.WooPosPreview +import com.woocommerce.android.ui.woopos.common.composeui.component.WooPosText +import com.woocommerce.android.ui.woopos.common.composeui.designsystem.WooPosCornerRadius +import com.woocommerce.android.ui.woopos.common.composeui.designsystem.WooPosSpacing +import com.woocommerce.android.ui.woopos.common.composeui.designsystem.WooPosTheme +import com.woocommerce.android.ui.woopos.common.composeui.designsystem.WooPosTypography + +@Composable +fun WooPosRefreshCatalogBanner( + bannerState: WooPosItemsViewModel.CatalogSyncBannerState, + modifier: Modifier = Modifier +) { + AnimatedVisibility( + visible = bannerState is WooPosItemsViewModel.CatalogSyncBannerState.OverdueWarning, + enter = fadeIn( + animationSpec = tween(durationMillis = 180) + ) + scaleIn( + animationSpec = tween(durationMillis = 180) + ) + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = modifier + .fillMaxWidth() + .background( + color = MaterialTheme.colorScheme.errorContainer, + shape = RoundedCornerShape(WooPosCornerRadius.Medium.value) + ) + .padding( + vertical = WooPosSpacing.Small.value, + horizontal = WooPosSpacing.Medium.value + ), + ) { + Icon( + imageVector = Icons.Outlined.Info, + tint = MaterialTheme.colorScheme.onErrorContainer, + contentDescription = null + ) + Spacer(Modifier.size(WooPosSpacing.Small.value)) + WooPosText( + text = stringResource(R.string.woopos_refresh_catalog_banner_message), + style = WooPosTypography.BodyMedium, + color = MaterialTheme.colorScheme.onErrorContainer, + modifier = Modifier.weight(1f) + ) + } + } +} + +@Composable +@WooPosPreview +fun WooPosRefreshCatalogBannerPreview() { + WooPosTheme { + WooPosRefreshCatalogBanner( + bannerState = WooPosItemsViewModel.CatalogSyncBannerState.OverdueWarning + ) + } +} diff --git a/WooCommerce/src/main/res/values/strings.xml b/WooCommerce/src/main/res/values/strings.xml index a6d44f0440ac..4e035573790d 100644 --- a/WooCommerce/src/main/res/values/strings.xml +++ b/WooCommerce/src/main/res/values/strings.xml @@ -3599,6 +3599,7 @@ Unable to sync We are unable to sync your product catalog. Please check your internet connection and retry. Retry + The catalog hasn\'t been synced in the last 7 days. Either connect your device to WiFi or enable syncing over cellular network in POS settings. Reader connected Connect your reader diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsViewModelTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsViewModelTest.kt index 72aa0356291a..47868930d46e 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsViewModelTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsViewModelTest.kt @@ -9,6 +9,7 @@ import com.woocommerce.android.ui.woopos.home.WooPosChildrenToParentEventSender import com.woocommerce.android.ui.woopos.home.WooPosParentToChildrenEventReceiver import com.woocommerce.android.ui.woopos.home.items.WooPosItemsViewModel.ItemClickedData import com.woocommerce.android.ui.woopos.home.items.coupons.creation.WooPosCouponCreationFacade +import com.woocommerce.android.ui.woopos.localcatalog.WooPosFullSyncStatusChecker import com.woocommerce.android.ui.woopos.util.WooPosCoroutineTestRule import com.woocommerce.android.ui.woopos.util.analytics.WooPosAnalyticsEvent import com.woocommerce.android.ui.woopos.util.analytics.WooPosAnalyticsEvent.Event.SearchButtonTapped @@ -55,6 +56,7 @@ class WooPosItemsViewModelTest { private val fromChildToParentEventSender: WooPosChildrenToParentEventSender = mock() private val parentToChildrenEventReceiver: WooPosParentToChildrenEventReceiver = mock() private val preferencesRepository: WooPosPreferencesRepository = mock() + private val syncStatusChecker: WooPosFullSyncStatusChecker = mock() @Before fun setup() { @@ -457,6 +459,7 @@ class WooPosItemsViewModelTest { parentToChildrenEventReceiver = parentToChildrenEventReceiver, preferencesRepository = preferencesRepository, analyticsTracker = analyticsTracker, + syncStatusChecker = syncStatusChecker, ) } } From 03356bfe3cb7e3fb6b70d5893d943bc1286ddf09 Mon Sep 17 00:00:00 2001 From: samiuelson Date: Tue, 7 Oct 2025 17:05:41 +0200 Subject: [PATCH 02/11] Implement warning banner --- .../home/items/WooPosRefreshCatalogBanner.kt | 91 +++++++++++++------ .../res/drawable/ic_woo_pos_info_banner.xml | 9 ++ WooCommerce/src/main/res/values/strings.xml | 2 + 3 files changed, 72 insertions(+), 30 deletions(-) create mode 100644 WooCommerce/src/main/res/drawable/ic_woo_pos_info_banner.xml diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosRefreshCatalogBanner.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosRefreshCatalogBanner.kt index 59f9ffcbdf99..e2e473b819b0 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosRefreshCatalogBanner.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosRefreshCatalogBanner.kt @@ -4,25 +4,31 @@ import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.tween import androidx.compose.animation.fadeIn import androidx.compose.animation.scaleIn -import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.outlined.Info +import androidx.compose.material.icons.filled.Close import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp import com.woocommerce.android.R import com.woocommerce.android.ui.woopos.common.composeui.WooPosPreview +import com.woocommerce.android.ui.woopos.common.composeui.component.ShadowType +import com.woocommerce.android.ui.woopos.common.composeui.component.WooPosCard import com.woocommerce.android.ui.woopos.common.composeui.component.WooPosText import com.woocommerce.android.ui.woopos.common.composeui.designsystem.WooPosCornerRadius +import com.woocommerce.android.ui.woopos.common.composeui.designsystem.WooPosElevation import com.woocommerce.android.ui.woopos.common.composeui.designsystem.WooPosSpacing import com.woocommerce.android.ui.woopos.common.composeui.designsystem.WooPosTheme import com.woocommerce.android.ui.woopos.common.composeui.designsystem.WooPosTypography @@ -30,7 +36,8 @@ import com.woocommerce.android.ui.woopos.common.composeui.designsystem.WooPosTyp @Composable fun WooPosRefreshCatalogBanner( bannerState: WooPosItemsViewModel.CatalogSyncBannerState, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, + onDismiss: () -> Unit ) { AnimatedVisibility( visible = bannerState is WooPosItemsViewModel.CatalogSyncBannerState.OverdueWarning, @@ -38,33 +45,56 @@ fun WooPosRefreshCatalogBanner( animationSpec = tween(durationMillis = 180) ) + scaleIn( animationSpec = tween(durationMillis = 180) - ) + ), + modifier = modifier.padding(horizontal = WooPosSpacing.Medium.value) ) { - Row( - verticalAlignment = Alignment.CenterVertically, - modifier = modifier - .fillMaxWidth() - .background( - color = MaterialTheme.colorScheme.errorContainer, - shape = RoundedCornerShape(WooPosCornerRadius.Medium.value) - ) - .padding( - vertical = WooPosSpacing.Small.value, - horizontal = WooPosSpacing.Medium.value - ), + WooPosCard( + modifier = Modifier.fillMaxWidth(), + shape = RoundedCornerShape(WooPosCornerRadius.Medium.value), + backgroundColor = MaterialTheme.colorScheme.surfaceContainerLow, + elevation = WooPosElevation.Medium, + shadowType = ShadowType.Soft, ) { - Icon( - imageVector = Icons.Outlined.Info, - tint = MaterialTheme.colorScheme.onErrorContainer, - contentDescription = null - ) - Spacer(Modifier.size(WooPosSpacing.Small.value)) - WooPosText( - text = stringResource(R.string.woopos_refresh_catalog_banner_message), - style = WooPosTypography.BodyMedium, - color = MaterialTheme.colorScheme.onErrorContainer, - modifier = Modifier.weight(1f) - ) + Row( + horizontalArrangement = Arrangement.spacedBy(WooPosSpacing.Medium.value), + modifier = Modifier + .fillMaxWidth() + .padding(WooPosSpacing.Medium.value), + ) { + Icon( + painter = painterResource(id = R.drawable.ic_woo_pos_info_banner), + tint = MaterialTheme.colorScheme.onSurface, + contentDescription = null, + modifier = Modifier.size(48.dp).align(Alignment.CenterVertically) + ) + Column( + verticalArrangement = Arrangement.spacedBy(WooPosSpacing.Small.value), + horizontalAlignment = Alignment.Start, + modifier = Modifier.weight(1f) + ) { + WooPosText( + text = stringResource(R.string.woopos_refresh_catalog_banner_title), + style = WooPosTypography.BodyLarge, + color = MaterialTheme.colorScheme.onSurface, + ) + WooPosText( + text = stringResource(R.string.woopos_refresh_catalog_banner_message), + style = WooPosTypography.BodySmall, + color = MaterialTheme.colorScheme.onSurface, + ) + } + IconButton( + onClick = onDismiss, + modifier = Modifier.size(32.dp) + ) { + Icon( + imageVector = Icons.Filled.Close, + contentDescription = stringResource(R.string.woopos_refresh_catalog_banner_dismiss), + tint = MaterialTheme.colorScheme.onSurface, + modifier = Modifier.size(24.dp) + ) + } + } } } } @@ -74,7 +104,8 @@ fun WooPosRefreshCatalogBanner( fun WooPosRefreshCatalogBannerPreview() { WooPosTheme { WooPosRefreshCatalogBanner( - bannerState = WooPosItemsViewModel.CatalogSyncBannerState.OverdueWarning + bannerState = WooPosItemsViewModel.CatalogSyncBannerState.OverdueWarning, + onDismiss = {} ) } } diff --git a/WooCommerce/src/main/res/drawable/ic_woo_pos_info_banner.xml b/WooCommerce/src/main/res/drawable/ic_woo_pos_info_banner.xml new file mode 100644 index 000000000000..af0dc4bf46ce --- /dev/null +++ b/WooCommerce/src/main/res/drawable/ic_woo_pos_info_banner.xml @@ -0,0 +1,9 @@ + + + diff --git a/WooCommerce/src/main/res/values/strings.xml b/WooCommerce/src/main/res/values/strings.xml index 4e035573790d..f76382adcfec 100644 --- a/WooCommerce/src/main/res/values/strings.xml +++ b/WooCommerce/src/main/res/values/strings.xml @@ -3599,7 +3599,9 @@ Unable to sync We are unable to sync your product catalog. Please check your internet connection and retry. Retry + Refresh catalog The catalog hasn\'t been synced in the last 7 days. Either connect your device to WiFi or enable syncing over cellular network in POS settings. + Dismiss banner Reader connected Connect your reader From 5282805afd99c96ec02b91b32bfaeaea79dd96d7 Mon Sep 17 00:00:00 2001 From: samiuelson Date: Tue, 7 Oct 2025 17:06:26 +0200 Subject: [PATCH 03/11] Update layouts to accommodate banner --- .../ui/woopos/home/items/WooPosItemsScreen.kt | 25 +++++++++++-------- .../home/items/coupons/WooPosCouponsScreen.kt | 6 ++--- .../items/products/WooPosProductsScreen.kt | 1 - .../variations/WooPosVariationsScreen.kt | 12 +++------ 4 files changed, 19 insertions(+), 25 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsScreen.kt index 6f51e5fdb3ee..a0f766305677 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsScreen.kt @@ -116,6 +116,7 @@ private fun WooPosItemsScreen( }, onTabClicked = { onUIEvent(WooPosItemsUIEvent.OnTabClicked(it)) }, onBackClicked = { onUIEvent(WooPosItemsUIEvent.BackFromVariationsClicked) }, + onSyncWarningBannerDismissed = { onUIEvent(WooPosItemsUIEvent.SyncOverdueBannerDismissed) }, ) } @@ -132,15 +133,11 @@ private fun MainItemsList( onTabClicked: (WooPosItemsToolbarViewState.Tab) -> Unit, onAddCouponEvent: () -> Unit, onBackClicked: () -> Unit, + onSyncWarningBannerDismissed: () -> Unit, onRetryCatalogSync: () -> Unit = {}, ) { - Box( - modifier = modifier - .fillMaxSize() - ) { - Column( - modifier.fillMaxHeight() - ) { + Box(modifier = modifier.fillMaxSize()) { + Column(modifier.fillMaxHeight()) { WooPosItemsToolbar( modifier = Modifier .statusBarsPadding() @@ -154,14 +151,20 @@ private fun MainItemsList( onAddCouponEvent = onAddCouponEvent, ) + Spacer(modifier = + Modifier + .height(WooPosSpacing.Small.value) + .padding(horizontal = WooPosSpacing.Medium.value.toAdaptivePadding()) + ) + WooPosRefreshCatalogBanner( bannerState = bannerState.value, - modifier = Modifier.padding( - horizontal = WooPosSpacing.Medium.value.toAdaptivePadding(), - vertical = WooPosSpacing.Small.value.toAdaptivePadding(), - ) + modifier = Modifier, + onDismiss = onSyncWarningBannerDismissed ) + Spacer(modifier = Modifier.height(WooPosSpacing.Small.value)) + val currentState = state.value Crossfade( diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/coupons/WooPosCouponsScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/coupons/WooPosCouponsScreen.kt index dc8b22cc5af8..033627e228e0 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/coupons/WooPosCouponsScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/coupons/WooPosCouponsScreen.kt @@ -2,7 +2,6 @@ package com.woocommerce.android.ui.woopos.home.items.coupons import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material.ExperimentalMaterialApi @@ -21,7 +20,6 @@ import com.woocommerce.android.ui.woopos.common.composeui.WooPosPreview import com.woocommerce.android.ui.woopos.common.composeui.component.Button import com.woocommerce.android.ui.woopos.common.composeui.component.WooPosErrorScreen import com.woocommerce.android.ui.woopos.common.composeui.component.WooPosPaginationErrorIndicator -import com.woocommerce.android.ui.woopos.common.composeui.designsystem.WooPosSpacing import com.woocommerce.android.ui.woopos.common.composeui.designsystem.WooPosTheme import com.woocommerce.android.ui.woopos.home.items.WooPosCouponsViewState import com.woocommerce.android.ui.woopos.home.items.WooPosItemList @@ -74,7 +72,7 @@ private fun WooPosCouponsScreen( when (val itemsState = state.value) { is WooPosCouponsViewState.Content -> { WooPosItemList( - modifier = Modifier.padding(top = WooPosSpacing.Large.value), + modifier = Modifier, state = itemsState, listState = listState, onItemClicked = { item -> onUIEvent(WooPosCouponsUIEvent.CouponClicked(item.id, item.name)) }, @@ -89,7 +87,7 @@ private fun WooPosCouponsScreen( } is WooPosCouponsViewState.Loading -> WooPosItemsLoadingIndicator( - modifier = Modifier.padding(top = WooPosSpacing.Large.value) + modifier = Modifier ) is WooPosCouponsViewState.Empty -> WooPosItemsEmptyList( diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/products/WooPosProductsScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/products/WooPosProductsScreen.kt index 397ac5d99523..7ba9c9bff99e 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/products/WooPosProductsScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/products/WooPosProductsScreen.kt @@ -139,7 +139,6 @@ private fun Content( onEndOfItemListReached: () -> Unit ) { WooPosItemList( - modifier = Modifier.padding(top = WooPosSpacing.Large.value), state = itemsState, listState = listState, onItemClicked = onItemClicked, diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/variations/WooPosVariationsScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/variations/WooPosVariationsScreen.kt index 5c63c77faa58..4b1712a2dd9d 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/variations/WooPosVariationsScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/variations/WooPosVariationsScreen.kt @@ -103,7 +103,6 @@ private fun WooPosVariationsScreens( when (val itemsState = itemState.value) { is WooPosVariationsViewState.Content -> { WooPosItemList( - modifier = Modifier.padding(top = WooPosSpacing.Large.value), state = itemsState, listState = listState, onItemClicked = { @@ -122,16 +121,12 @@ private fun WooPosVariationsScreens( } is WooPosVariationsViewState.Loading -> { - WooPosItemsLoadingIndicator( - modifier = Modifier.padding(top = WooPosSpacing.Large.value), - ) + WooPosItemsLoadingIndicator() } is WooPosVariationsViewState.Error -> { VariationsError( - modifier = Modifier - .width(640.dp) - .padding(top = WooPosSpacing.Large.value) + modifier = Modifier.width(640.dp) ) { onRetryClicked() } @@ -139,8 +134,7 @@ private fun WooPosVariationsScreens( is WooPosVariationsViewState.Empty -> { WooPosItemsEmptyList( - modifier = Modifier.fillMaxSize() - .padding(top = WooPosSpacing.Large.value), + modifier = Modifier.fillMaxSize(), title = stringResource(id = R.string.woopos_variations_empty_list_title), message = stringResource(id = R.string.woopos_variations_empty_list_message), contentDescription = stringResource( From 215cd5a9eb4d3b3a943c3b872a6cd38c1165d226 Mon Sep 17 00:00:00 2001 From: samiuelson Date: Tue, 7 Oct 2025 17:07:47 +0200 Subject: [PATCH 04/11] Handle banner visibility updates --- .../android/ui/woopos/home/items/WooPosItemsScreen.kt | 4 ++-- .../android/ui/woopos/home/items/WooPosItemsUIEvent.kt | 1 + .../android/ui/woopos/home/items/WooPosItemsViewModel.kt | 7 +++++-- .../ui/woopos/home/items/WooPosRefreshCatalogBanner.kt | 4 ++-- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsScreen.kt index a0f766305677..fd47f2dc6b19 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsScreen.kt @@ -324,7 +324,7 @@ fun WooPosItemsScreenSearchVisiblePreview(modifier: Modifier = Modifier) { tabs = tabs() ) ) - val bannerState = MutableStateFlow(WooPosItemsViewModel.CatalogSyncBannerState.OverdueWarning) + val bannerState = MutableStateFlow(WooPosItemsViewModel.CatalogSyncBannerState.OverdueSyncWarning) WooPosTheme { WooPosItemsScreen( modifier = modifier, @@ -354,7 +354,7 @@ fun WooPosItemsScreenSearchHiddenPreview(modifier: Modifier = Modifier) { tabs = tabs() ) ) - val bannerState = MutableStateFlow(WooPosItemsViewModel.CatalogSyncBannerState.OverdueWarning) + val bannerState = MutableStateFlow(WooPosItemsViewModel.CatalogSyncBannerState.OverdueSyncWarning) WooPosTheme { WooPosItemsScreen( modifier = modifier, diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsUIEvent.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsUIEvent.kt index e8c233547568..39a7562caeab 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsUIEvent.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsUIEvent.kt @@ -12,4 +12,5 @@ sealed class WooPosItemsUIEvent { data object CloseSearchClicked : WooPosItemsUIEvent() data object SearchIconClicked : WooPosItemsUIEvent() data object AddCouponIconClicked : WooPosItemsUIEvent() + data object SyncOverdueBannerDismissed : WooPosItemsUIEvent() } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsViewModel.kt index bc0ee7cf8dc8..8bba55db477b 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsViewModel.kt @@ -69,7 +69,7 @@ class WooPosItemsViewModel @Inject constructor( viewModelScope.launch { val requirement = syncStatusChecker.checkSyncRequirement() _catalogSyncBannerState.value = when (requirement) { - is WooPosFullSyncRequirement.Overdue -> CatalogSyncBannerState.OverdueWarning + is WooPosFullSyncRequirement.Overdue -> CatalogSyncBannerState.OverdueSyncWarning else -> CatalogSyncBannerState.Hidden } } @@ -95,6 +95,9 @@ class WooPosItemsViewModel @Inject constructor( } is WooPosItemsUIEvent.AddCouponIconClicked -> createAndAddCoupon() + WooPosItemsUIEvent.SyncOverdueBannerDismissed -> { + _catalogSyncBannerState.value = CatalogSyncBannerState.Hidden + } } } @@ -262,6 +265,6 @@ class WooPosItemsViewModel @Inject constructor( sealed class CatalogSyncBannerState { data object Hidden : CatalogSyncBannerState() - data object OverdueWarning : CatalogSyncBannerState() + data object OverdueSyncWarning : CatalogSyncBannerState() } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosRefreshCatalogBanner.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosRefreshCatalogBanner.kt index e2e473b819b0..e920f2cad59c 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosRefreshCatalogBanner.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosRefreshCatalogBanner.kt @@ -40,7 +40,7 @@ fun WooPosRefreshCatalogBanner( onDismiss: () -> Unit ) { AnimatedVisibility( - visible = bannerState is WooPosItemsViewModel.CatalogSyncBannerState.OverdueWarning, + visible = bannerState is WooPosItemsViewModel.CatalogSyncBannerState.OverdueSyncWarning, enter = fadeIn( animationSpec = tween(durationMillis = 180) ) + scaleIn( @@ -104,7 +104,7 @@ fun WooPosRefreshCatalogBanner( fun WooPosRefreshCatalogBannerPreview() { WooPosTheme { WooPosRefreshCatalogBanner( - bannerState = WooPosItemsViewModel.CatalogSyncBannerState.OverdueWarning, + bannerState = WooPosItemsViewModel.CatalogSyncBannerState.OverdueSyncWarning, onDismiss = {} ) } From 82ea15b098fe1c80df915531c8a01a1192ed3cc9 Mon Sep 17 00:00:00 2001 From: samiuelson Date: Tue, 7 Oct 2025 17:10:58 +0200 Subject: [PATCH 05/11] Satisfy detekt's complaints --- .../android/ui/woopos/home/items/WooPosItemsScreen.kt | 3 ++- .../ui/woopos/home/items/variations/WooPosVariationsScreen.kt | 2 -- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsScreen.kt index fd47f2dc6b19..e11387ce50fb 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsScreen.kt @@ -151,7 +151,8 @@ private fun MainItemsList( onAddCouponEvent = onAddCouponEvent, ) - Spacer(modifier = + Spacer( + modifier = Modifier .height(WooPosSpacing.Small.value) .padding(horizontal = WooPosSpacing.Medium.value.toAdaptivePadding()) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/variations/WooPosVariationsScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/variations/WooPosVariationsScreen.kt index 4b1712a2dd9d..bbc1f7ab6820 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/variations/WooPosVariationsScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/variations/WooPosVariationsScreen.kt @@ -4,7 +4,6 @@ import androidx.activity.compose.BackHandler import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material.ExperimentalMaterialApi @@ -24,7 +23,6 @@ import com.woocommerce.android.ui.woopos.common.composeui.WooPosPreview import com.woocommerce.android.ui.woopos.common.composeui.component.Button import com.woocommerce.android.ui.woopos.common.composeui.component.WooPosErrorScreen import com.woocommerce.android.ui.woopos.common.composeui.component.WooPosPaginationErrorIndicator -import com.woocommerce.android.ui.woopos.common.composeui.designsystem.WooPosSpacing import com.woocommerce.android.ui.woopos.common.composeui.designsystem.WooPosTheme import com.woocommerce.android.ui.woopos.home.items.WooPosItemList import com.woocommerce.android.ui.woopos.home.items.WooPosItemSelectionViewState From 1c67f5bb396ccacb1a6927e9e809451e8a798557 Mon Sep 17 00:00:00 2001 From: samiuelson Date: Tue, 7 Oct 2025 18:34:17 +0200 Subject: [PATCH 06/11] Clean up code --- .../android/ui/woopos/home/items/WooPosItemsScreen.kt | 1 - .../ui/woopos/home/items/coupons/WooPosCouponsScreen.kt | 5 +---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsScreen.kt index e11387ce50fb..bec4099fc6ec 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsScreen.kt @@ -160,7 +160,6 @@ private fun MainItemsList( WooPosRefreshCatalogBanner( bannerState = bannerState.value, - modifier = Modifier, onDismiss = onSyncWarningBannerDismissed ) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/coupons/WooPosCouponsScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/coupons/WooPosCouponsScreen.kt index 033627e228e0..1c0f0b020c1d 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/coupons/WooPosCouponsScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/coupons/WooPosCouponsScreen.kt @@ -72,7 +72,6 @@ private fun WooPosCouponsScreen( when (val itemsState = state.value) { is WooPosCouponsViewState.Content -> { WooPosItemList( - modifier = Modifier, state = itemsState, listState = listState, onItemClicked = { item -> onUIEvent(WooPosCouponsUIEvent.CouponClicked(item.id, item.name)) }, @@ -86,9 +85,7 @@ private fun WooPosCouponsScreen( } } - is WooPosCouponsViewState.Loading -> WooPosItemsLoadingIndicator( - modifier = Modifier - ) + is WooPosCouponsViewState.Loading -> WooPosItemsLoadingIndicator() is WooPosCouponsViewState.Empty -> WooPosItemsEmptyList( modifier = Modifier.fillMaxSize(), From 84eb52d8707af7765a1d352b457418f5b00bb5e3 Mon Sep 17 00:00:00 2001 From: samiuelson Date: Tue, 7 Oct 2025 18:35:46 +0200 Subject: [PATCH 07/11] Clean up code --- .../ui/woopos/home/items/WooPosRefreshCatalogBanner.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosRefreshCatalogBanner.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosRefreshCatalogBanner.kt index e920f2cad59c..9be2217c0aee 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosRefreshCatalogBanner.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosRefreshCatalogBanner.kt @@ -65,7 +65,9 @@ fun WooPosRefreshCatalogBanner( painter = painterResource(id = R.drawable.ic_woo_pos_info_banner), tint = MaterialTheme.colorScheme.onSurface, contentDescription = null, - modifier = Modifier.size(48.dp).align(Alignment.CenterVertically) + modifier = Modifier + .size(48.dp) + .align(Alignment.CenterVertically) ) Column( verticalArrangement = Arrangement.spacedBy(WooPosSpacing.Small.value), From 59358ad7e3f305a94b40c679c085c5606251cb30 Mon Sep 17 00:00:00 2001 From: samiuelson Date: Fri, 17 Oct 2025 16:31:56 +0200 Subject: [PATCH 08/11] Rename val --- .../android/ui/woopos/home/items/WooPosItemsScreen.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsScreen.kt index bec4099fc6ec..f096bcc1a0fc 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsScreen.kt @@ -87,12 +87,12 @@ private fun WooPosItemsScreen( onUIEvent: (WooPosItemsUIEvent) -> Unit, ) { val state = itemsStateFlow.collectAsState() - val bannerState = catalogSyncBannerStateFlow.collectAsState() + val catalogSyncOverdueBannerState = catalogSyncBannerStateFlow.collectAsState() MainItemsList( modifier = modifier, state = state, - bannerState = bannerState, + bannerState = catalogSyncOverdueBannerState, productsViewState = productsViewState, couponsListState = couponsListState, catalogSyncState = catalogSyncState, From 11fac8f350c3f8d61d25854a34741568780b6043 Mon Sep 17 00:00:00 2001 From: samiuelson Date: Fri, 17 Oct 2025 16:33:23 +0200 Subject: [PATCH 09/11] Rename composable --- ...reshCatalogBanner.kt => WooPosCatalogSyncOverdueBanner.kt} | 4 ++-- .../android/ui/woopos/home/items/WooPosItemsScreen.kt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/{WooPosRefreshCatalogBanner.kt => WooPosCatalogSyncOverdueBanner.kt} (98%) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosRefreshCatalogBanner.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosCatalogSyncOverdueBanner.kt similarity index 98% rename from WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosRefreshCatalogBanner.kt rename to WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosCatalogSyncOverdueBanner.kt index 9be2217c0aee..3c3a71766ebd 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosRefreshCatalogBanner.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosCatalogSyncOverdueBanner.kt @@ -34,7 +34,7 @@ import com.woocommerce.android.ui.woopos.common.composeui.designsystem.WooPosThe import com.woocommerce.android.ui.woopos.common.composeui.designsystem.WooPosTypography @Composable -fun WooPosRefreshCatalogBanner( +fun WooPosCatalogSyncOverdueBanner( bannerState: WooPosItemsViewModel.CatalogSyncBannerState, modifier: Modifier = Modifier, onDismiss: () -> Unit @@ -105,7 +105,7 @@ fun WooPosRefreshCatalogBanner( @WooPosPreview fun WooPosRefreshCatalogBannerPreview() { WooPosTheme { - WooPosRefreshCatalogBanner( + WooPosCatalogSyncOverdueBanner( bannerState = WooPosItemsViewModel.CatalogSyncBannerState.OverdueSyncWarning, onDismiss = {} ) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsScreen.kt index f096bcc1a0fc..85852f06cf68 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsScreen.kt @@ -158,7 +158,7 @@ private fun MainItemsList( .padding(horizontal = WooPosSpacing.Medium.value.toAdaptivePadding()) ) - WooPosRefreshCatalogBanner( + WooPosCatalogSyncOverdueBanner( bannerState = bannerState.value, onDismiss = onSyncWarningBannerDismissed ) From 929e1d75e900a5cbbf3491a8d8e017378e37c53c Mon Sep 17 00:00:00 2001 From: samiuelson Date: Fri, 17 Oct 2025 16:36:24 +0200 Subject: [PATCH 10/11] Improve naming of state class and vals --- .../items/WooPosCatalogSyncOverdueBanner.kt | 6 +++--- .../ui/woopos/home/items/WooPosItemsScreen.kt | 18 +++++++++--------- .../woopos/home/items/WooPosItemsViewModel.kt | 18 +++++++++--------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosCatalogSyncOverdueBanner.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosCatalogSyncOverdueBanner.kt index 3c3a71766ebd..0f2a4a043d19 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosCatalogSyncOverdueBanner.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosCatalogSyncOverdueBanner.kt @@ -35,12 +35,12 @@ import com.woocommerce.android.ui.woopos.common.composeui.designsystem.WooPosTyp @Composable fun WooPosCatalogSyncOverdueBanner( - bannerState: WooPosItemsViewModel.CatalogSyncBannerState, + state: WooPosItemsViewModel.CatalogSyncOverdueBannerState, modifier: Modifier = Modifier, onDismiss: () -> Unit ) { AnimatedVisibility( - visible = bannerState is WooPosItemsViewModel.CatalogSyncBannerState.OverdueSyncWarning, + visible = state is WooPosItemsViewModel.CatalogSyncOverdueBannerState.Visible, enter = fadeIn( animationSpec = tween(durationMillis = 180) ) + scaleIn( @@ -106,7 +106,7 @@ fun WooPosCatalogSyncOverdueBanner( fun WooPosRefreshCatalogBannerPreview() { WooPosTheme { WooPosCatalogSyncOverdueBanner( - bannerState = WooPosItemsViewModel.CatalogSyncBannerState.OverdueSyncWarning, + state = WooPosItemsViewModel.CatalogSyncOverdueBannerState.Visible, onDismiss = {} ) } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsScreen.kt index 85852f06cf68..a4e03c676c6b 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsScreen.kt @@ -65,7 +65,7 @@ fun WooPosItemsScreen( WooPosItemsScreen( modifier = modifier, itemsStateFlow = productsViewModel.viewState, - catalogSyncBannerStateFlow = productsViewModel.catalogSyncBannerState, + catalogSyncOverdueBannerStateFlow = productsViewModel.catalogSyncOverdueBannerState, productsViewState = productsViewState, couponsListState = couponsListState, catalogSyncState = catalogSyncState, @@ -79,7 +79,7 @@ fun WooPosItemsScreen( private fun WooPosItemsScreen( modifier: Modifier = Modifier, itemsStateFlow: StateFlow, - catalogSyncBannerStateFlow: StateFlow, + catalogSyncOverdueBannerStateFlow: StateFlow, productsViewState: LazyListState, couponsListState: LazyListState, catalogSyncState: CatalogSyncState, @@ -87,7 +87,7 @@ private fun WooPosItemsScreen( onUIEvent: (WooPosItemsUIEvent) -> Unit, ) { val state = itemsStateFlow.collectAsState() - val catalogSyncOverdueBannerState = catalogSyncBannerStateFlow.collectAsState() + val catalogSyncOverdueBannerState = catalogSyncOverdueBannerStateFlow.collectAsState() MainItemsList( modifier = modifier, @@ -125,7 +125,7 @@ private fun WooPosItemsScreen( private fun MainItemsList( modifier: Modifier, state: State, - bannerState: State, + bannerState: State, productsViewState: LazyListState, couponsListState: LazyListState, catalogSyncState: CatalogSyncState, @@ -159,7 +159,7 @@ private fun MainItemsList( ) WooPosCatalogSyncOverdueBanner( - bannerState = bannerState.value, + state = bannerState.value, onDismiss = onSyncWarningBannerDismissed ) @@ -324,12 +324,12 @@ fun WooPosItemsScreenSearchVisiblePreview(modifier: Modifier = Modifier) { tabs = tabs() ) ) - val bannerState = MutableStateFlow(WooPosItemsViewModel.CatalogSyncBannerState.OverdueSyncWarning) + val bannerState = MutableStateFlow(WooPosItemsViewModel.CatalogSyncOverdueBannerState.Visible) WooPosTheme { WooPosItemsScreen( modifier = modifier, itemsStateFlow = productState, - catalogSyncBannerStateFlow = bannerState, + catalogSyncOverdueBannerStateFlow = bannerState, productsViewState = rememberLazyListState(), couponsListState = rememberLazyListState(), catalogSyncState = CatalogSyncState.Idle, @@ -354,12 +354,12 @@ fun WooPosItemsScreenSearchHiddenPreview(modifier: Modifier = Modifier) { tabs = tabs() ) ) - val bannerState = MutableStateFlow(WooPosItemsViewModel.CatalogSyncBannerState.OverdueSyncWarning) + val bannerState = MutableStateFlow(WooPosItemsViewModel.CatalogSyncOverdueBannerState.Visible) WooPosTheme { WooPosItemsScreen( modifier = modifier, itemsStateFlow = productState, - catalogSyncBannerStateFlow = bannerState, + catalogSyncOverdueBannerStateFlow = bannerState, productsViewState = rememberLazyListState(), couponsListState = rememberLazyListState(), catalogSyncState = CatalogSyncState.Idle, diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsViewModel.kt index 8bba55db477b..998000343b1a 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsViewModel.kt @@ -48,8 +48,8 @@ class WooPosItemsViewModel @Inject constructor( initialValue = _viewState.value, ) - private val _catalogSyncBannerState = MutableStateFlow(CatalogSyncBannerState.Hidden) - val catalogSyncBannerState: StateFlow = _catalogSyncBannerState + private val _catalogSyncOverdueBannerState = MutableStateFlow(CatalogSyncOverdueBannerState.Hidden) + val catalogSyncOverdueBannerState: StateFlow = _catalogSyncOverdueBannerState init { listenUpEvents() @@ -68,9 +68,9 @@ class WooPosItemsViewModel @Inject constructor( private fun checkSyncStatusAndUpdateBanner() { viewModelScope.launch { val requirement = syncStatusChecker.checkSyncRequirement() - _catalogSyncBannerState.value = when (requirement) { - is WooPosFullSyncRequirement.Overdue -> CatalogSyncBannerState.OverdueSyncWarning - else -> CatalogSyncBannerState.Hidden + _catalogSyncOverdueBannerState.value = when (requirement) { + is WooPosFullSyncRequirement.Overdue -> CatalogSyncOverdueBannerState.Visible + else -> CatalogSyncOverdueBannerState.Hidden } } } @@ -96,7 +96,7 @@ class WooPosItemsViewModel @Inject constructor( is WooPosItemsUIEvent.AddCouponIconClicked -> createAndAddCoupon() WooPosItemsUIEvent.SyncOverdueBannerDismissed -> { - _catalogSyncBannerState.value = CatalogSyncBannerState.Hidden + _catalogSyncOverdueBannerState.value = CatalogSyncOverdueBannerState.Hidden } } } @@ -263,8 +263,8 @@ class WooPosItemsViewModel @Inject constructor( data class Coupon(override val id: Long, val couponCode: String) : ItemClickedData(id), Parcelable } - sealed class CatalogSyncBannerState { - data object Hidden : CatalogSyncBannerState() - data object OverdueSyncWarning : CatalogSyncBannerState() + sealed class CatalogSyncOverdueBannerState { + data object Hidden : CatalogSyncOverdueBannerState() + data object Visible : CatalogSyncOverdueBannerState() } } From c2db87ca7b65da0ba0e053875266c0d9f804934b Mon Sep 17 00:00:00 2001 From: samiuelson Date: Fri, 17 Oct 2025 18:22:05 +0200 Subject: [PATCH 11/11] Update padding --- .../ui/woopos/home/items/WooPosCatalogSyncOverdueBanner.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosCatalogSyncOverdueBanner.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosCatalogSyncOverdueBanner.kt index 0f2a4a043d19..f212fe123ea3 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosCatalogSyncOverdueBanner.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosCatalogSyncOverdueBanner.kt @@ -46,7 +46,7 @@ fun WooPosCatalogSyncOverdueBanner( ) + scaleIn( animationSpec = tween(durationMillis = 180) ), - modifier = modifier.padding(horizontal = WooPosSpacing.Medium.value) + modifier = modifier.padding(horizontal = WooPosSpacing.Small.value) ) { WooPosCard( modifier = Modifier.fillMaxWidth(),