diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/settings/WooPosSettingsState.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/settings/WooPosSettingsState.kt index 4d21bd2c409e..11d0fcc963db 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/settings/WooPosSettingsState.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/settings/WooPosSettingsState.kt @@ -49,6 +49,14 @@ sealed class WooPosSettingsDetailDestination { } } + sealed class LocalCatalog : WooPosSettingsDetailDestination() { + data object Overview : LocalCatalog() { + override val titleRes: Int = R.string.woopos_settings_local_catalog_category + override val parentDestination: WooPosSettingsDetailDestination? = null + override val childDestinations: List = emptyList() + } + } + sealed class Help : WooPosSettingsDetailDestination() { data object Overview : Help() { override val titleRes: Int = R.string.woopos_settings_help_category diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/settings/WooPosSettingsViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/settings/WooPosSettingsViewModel.kt index 559df6e31465..8027b4647bc3 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/settings/WooPosSettingsViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/settings/WooPosSettingsViewModel.kt @@ -6,6 +6,7 @@ import com.woocommerce.android.ui.woopos.settings.categories.WooPosSettingsCateg import com.woocommerce.android.ui.woopos.util.analytics.WooPosAnalyticsEvent import com.woocommerce.android.ui.woopos.util.analytics.WooPosAnalyticsEvent.Event.HardwareTapped import com.woocommerce.android.ui.woopos.util.analytics.WooPosAnalyticsEvent.Event.HelpTapped +import com.woocommerce.android.ui.woopos.util.analytics.WooPosAnalyticsEvent.Event.LocalCatalogTapped import com.woocommerce.android.ui.woopos.util.analytics.WooPosAnalyticsEvent.Event.SettingsClosed import com.woocommerce.android.ui.woopos.util.analytics.WooPosAnalyticsEvent.Event.SettingsOpened import com.woocommerce.android.ui.woopos.util.analytics.WooPosAnalyticsEvent.Event.StoreDetailsTapped @@ -38,6 +39,7 @@ class WooPosSettingsViewModel @Inject constructor( private fun trackCategorySelection(category: WooPosSettingsCategory) { val event = when (category) { WooPosSettingsCategory.STORE -> StoreDetailsTapped + WooPosSettingsCategory.LOCAL_CATALOG -> LocalCatalogTapped WooPosSettingsCategory.HARDWARE -> HardwareTapped WooPosSettingsCategory.HELP -> HelpTapped } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/settings/categories/WooPosSettingsCategoriesState.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/settings/categories/WooPosSettingsCategoriesState.kt index b878c5a9c51c..601743bcdbb5 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/settings/categories/WooPosSettingsCategoriesState.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/settings/categories/WooPosSettingsCategoriesState.kt @@ -4,6 +4,7 @@ import androidx.annotation.StringRes import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.Help import androidx.compose.material.icons.filled.Hardware +import androidx.compose.material.icons.filled.Inventory import androidx.compose.material.icons.filled.Store import androidx.compose.ui.graphics.vector.ImageVector import com.woocommerce.android.R @@ -22,6 +23,12 @@ enum class WooPosSettingsCategory( Icons.Default.Store, WooPosSettingsDetailDestination.Store.Overview ), + LOCAL_CATALOG( + R.string.woopos_settings_local_catalog_category, + R.string.woopos_settings_local_catalog_category_subtitle, + Icons.Default.Inventory, + WooPosSettingsDetailDestination.LocalCatalog.Overview + ), HARDWARE( R.string.woopos_settings_hardware_category, R.string.woopos_settings_hardware_category_subtitle, diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/settings/categories/WooPosSettingsCategoriesViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/settings/categories/WooPosSettingsCategoriesViewModel.kt index 8f82c4203a83..35bbfb637ab6 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/settings/categories/WooPosSettingsCategoriesViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/settings/categories/WooPosSettingsCategoriesViewModel.kt @@ -1,14 +1,28 @@ package com.woocommerce.android.ui.woopos.settings.categories +import android.content.Context import androidx.lifecycle.ViewModel +import com.woocommerce.android.util.FeatureFlag import dagger.hilt.android.lifecycle.HiltViewModel +import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import javax.inject.Inject @HiltViewModel -class WooPosSettingsCategoriesViewModel @Inject constructor() : ViewModel() { - private val _state = MutableStateFlow(WooPosSettingsCategoriesState()) +class WooPosSettingsCategoriesViewModel @Inject constructor( + @ApplicationContext private val context: Context +) : ViewModel() { + private val _state = MutableStateFlow(createInitialState()) val state: StateFlow = _state.asStateFlow() + private fun createInitialState(): WooPosSettingsCategoriesState { + val allCategories = WooPosSettingsCategory.entries + val visibleCategories = if (FeatureFlag.WOO_POS_LOCAL_CATALOG_M1.isEnabled(context)) { + allCategories + } else { + allCategories.filter { it != WooPosSettingsCategory.LOCAL_CATALOG } + } + return WooPosSettingsCategoriesState(categories = visibleCategories) + } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/settings/details/WooPosSettingsDetailPaneScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/settings/details/WooPosSettingsDetailPaneScreen.kt index 0232818edef1..9262c358e9d1 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/settings/details/WooPosSettingsDetailPaneScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/settings/details/WooPosSettingsDetailPaneScreen.kt @@ -23,6 +23,7 @@ import com.woocommerce.android.ui.woopos.settings.details.hardware.WooPosHardwar import com.woocommerce.android.ui.woopos.settings.details.hardware.barcodescanner.WooPosSettingsHardwareBarcodeScannerScreen import com.woocommerce.android.ui.woopos.settings.details.hardware.cardreader.WooPosSettingsHardwareCardReaderScreen import com.woocommerce.android.ui.woopos.settings.details.help.WooPosHelpDetailScreen +import com.woocommerce.android.ui.woopos.settings.details.localcatalog.WooPosSettingsLocalCatalogScreen import com.woocommerce.android.ui.woopos.settings.details.store.WooPosSettingsStoreScreen @Composable @@ -93,6 +94,10 @@ fun WooPosSettingsDetailPaneScreen( WooPosSettingsStoreScreen() } + is WooPosSettingsDetailDestination.LocalCatalog.Overview -> { + WooPosSettingsLocalCatalogScreen() + } + is WooPosSettingsDetailDestination.Help.Overview -> { WooPosHelpDetailScreen(onShowProductInfoDialog = onShowProductInfoDialog) } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/settings/details/localcatalog/WooPosSettingsLocalCatalogScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/settings/details/localcatalog/WooPosSettingsLocalCatalogScreen.kt new file mode 100644 index 000000000000..d85fc57531ff --- /dev/null +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/settings/details/localcatalog/WooPosSettingsLocalCatalogScreen.kt @@ -0,0 +1,324 @@ +package com.woocommerce.android.ui.woopos.settings.details.localcatalog + +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.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Switch +import androidx.compose.material3.SwitchDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import com.woocommerce.android.R +import com.woocommerce.android.ui.woopos.common.composeui.WooPosPreview +import com.woocommerce.android.ui.woopos.common.composeui.component.WooPosButton +import com.woocommerce.android.ui.woopos.common.composeui.component.WooPosButtonState +import com.woocommerce.android.ui.woopos.common.composeui.component.WooPosShimmerBox +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 WooPosSettingsLocalCatalogScreen( + modifier: Modifier = Modifier, + viewModel: WooPosSettingsLocalCatalogViewModel = hiltViewModel() +) { + val state by viewModel.state.collectAsState() + + WooPosSettingsLocalCatalogScreen( + state = state, + onToggleCellularData = viewModel::toggleCellularDataUpdate, + onRefreshCatalog = viewModel::runFullCatalogSync, + modifier = modifier + ) +} + +@Composable +private fun WooPosSettingsLocalCatalogScreen( + state: WooPosSettingsLocalCatalogState, + onToggleCellularData: () -> Unit, + onRefreshCatalog: () -> Unit, + modifier: Modifier = Modifier +) { + Column( + modifier = modifier + .fillMaxSize() + .verticalScroll(rememberScrollState()) + .padding(WooPosSpacing.Medium.value) + ) { + CatalogStatusSection( + catalogStatus = state.catalogStatus + ) + + Spacer(modifier = Modifier.height(WooPosSpacing.Large.value)) + + SettingsSection( + allowCellularDataUpdate = state.allowCellularDataUpdate, + onToggleCellularData = onToggleCellularData, + isLoading = state.catalogStatus is WooPosSettingsLocalCatalogState.CatalogStatus.LoadingStatus + ) + + Spacer(modifier = Modifier.height(WooPosSpacing.Large.value)) + + RefreshSection( + onRefreshCatalog = onRefreshCatalog, + catalogStatus = state.catalogStatus + ) + } +} + +@Composable +private fun CatalogStatusSection( + catalogStatus: WooPosSettingsLocalCatalogState.CatalogStatus +) { + Column( + modifier = Modifier + .fillMaxWidth() + .clip(RoundedCornerShape(WooPosCornerRadius.Large.value)) + .background(MaterialTheme.colorScheme.surfaceContainerHigh) + .padding(WooPosSpacing.Medium.value) + ) { + SectionTitle(stringResource(R.string.woopos_settings_local_catalog_status)) + + Spacer(modifier = Modifier.height(WooPosSpacing.Medium.value)) + + when (catalogStatus) { + is WooPosSettingsLocalCatalogState.CatalogStatus.Available -> { + StatusRow( + label = stringResource(R.string.woopos_settings_local_catalog_size), + value = catalogStatus.catalogSize, + isLoading = false + ) + StatusRow( + label = stringResource(R.string.woopos_settings_local_catalog_last_update), + value = catalogStatus.lastUpdate, + isLoading = false + ) + StatusRow( + label = stringResource(R.string.woopos_settings_local_catalog_last_full_update), + value = catalogStatus.lastFullUpdate, + isLoading = false + ) + } + is WooPosSettingsLocalCatalogState.CatalogStatus.LoadingStatus, + is WooPosSettingsLocalCatalogState.CatalogStatus.RefreshingCatalog -> { + StatusRow( + label = stringResource(R.string.woopos_settings_local_catalog_size), + value = null, + isLoading = true + ) + StatusRow( + label = stringResource(R.string.woopos_settings_local_catalog_last_update), + value = null, + isLoading = true + ) + StatusRow( + label = stringResource(R.string.woopos_settings_local_catalog_last_full_update), + value = null, + isLoading = true + ) + } + } + } +} + +@Composable +private fun SettingsSection( + allowCellularDataUpdate: Boolean, + onToggleCellularData: () -> Unit, + isLoading: Boolean +) { + Column( + modifier = Modifier + .fillMaxWidth() + .clip(RoundedCornerShape(WooPosCornerRadius.Large.value)) + .background(MaterialTheme.colorScheme.surfaceContainerHigh) + .padding(WooPosSpacing.Medium.value) + ) { + SectionTitle(stringResource(R.string.woopos_settings_local_catalog_settings)) + + Spacer(modifier = Modifier.height(WooPosSpacing.Medium.value)) + + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Column( + modifier = Modifier.weight(1f) + ) { + WooPosText( + text = stringResource(R.string.woopos_settings_local_catalog_cellular_data), + style = WooPosTypography.BodyLarge, + color = MaterialTheme.colorScheme.onSurface + ) + WooPosText( + text = stringResource(R.string.woopos_settings_local_catalog_cellular_data_subtitle), + style = WooPosTypography.BodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.padding(top = WooPosSpacing.XSmall.value) + ) + } + + Switch( + checked = allowCellularDataUpdate, + onCheckedChange = { onToggleCellularData() }, + enabled = !isLoading, + colors = SwitchDefaults.colors( + checkedThumbColor = MaterialTheme.colorScheme.primary, + checkedTrackColor = MaterialTheme.colorScheme.primary.copy(alpha = 0.5f) + ) + ) + } + } +} + +@Composable +private fun RefreshSection( + onRefreshCatalog: () -> Unit, + catalogStatus: WooPosSettingsLocalCatalogState.CatalogStatus +) { + Column( + modifier = Modifier + .fillMaxWidth() + .clip(RoundedCornerShape(WooPosCornerRadius.Large.value)) + .background(MaterialTheme.colorScheme.surfaceContainerHigh) + .padding(WooPosSpacing.Medium.value) + ) { + SectionTitle(stringResource(R.string.woopos_settings_local_catalog_actions)) + + Spacer(modifier = Modifier.height(WooPosSpacing.Medium.value)) + + WooPosText( + text = stringResource(R.string.woopos_settings_local_catalog_refresh_description), + style = WooPosTypography.BodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.padding(bottom = WooPosSpacing.Medium.value) + ) + + WooPosButton( + modifier = Modifier.fillMaxWidth(), + onClick = onRefreshCatalog, + state = when (catalogStatus) { + is WooPosSettingsLocalCatalogState.CatalogStatus.Available -> WooPosButtonState.ENABLED + WooPosSettingsLocalCatalogState.CatalogStatus.LoadingStatus -> WooPosButtonState.DISABLED + WooPosSettingsLocalCatalogState.CatalogStatus.RefreshingCatalog -> WooPosButtonState.LOADING + }, + text = stringResource(R.string.woopos_settings_local_catalog_refresh_button) + ) + } +} + +@Composable +private fun StatusRow( + label: String, + value: String?, + isLoading: Boolean +) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = WooPosSpacing.Small.value), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + WooPosText( + text = label, + style = WooPosTypography.BodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + + if (isLoading) { + WooPosShimmerBox( + modifier = Modifier + .width(100.dp) + .height(20.dp), + ) + } else { + WooPosText( + text = value ?: "-", + style = WooPosTypography.BodyMedium, + fontWeight = FontWeight.Medium, + color = MaterialTheme.colorScheme.onSurface + ) + } + } +} + +@Composable +private fun SectionTitle(title: String) { + WooPosText( + text = title, + style = WooPosTypography.BodyXLarge, + fontWeight = FontWeight.SemiBold, + color = MaterialTheme.colorScheme.onSurface + ) +} + +@WooPosPreview +@Composable +fun WooPosSettingsLocalCatalogScreenPreview() { + WooPosTheme { + WooPosSettingsLocalCatalogScreen( + state = WooPosSettingsLocalCatalogState( + catalogStatus = WooPosSettingsLocalCatalogState.CatalogStatus.Available( + catalogSize = "12.5 MB", + lastUpdate = "2 hours ago", + lastFullUpdate = "Yesterday at 3:45 PM" + ), + allowCellularDataUpdate = true + ), + onToggleCellularData = {}, + onRefreshCatalog = {} + ) + } +} + +@WooPosPreview +@Composable +fun WooPosSettingsLocalCatalogScreenLoadingPreview() { + WooPosTheme { + WooPosSettingsLocalCatalogScreen( + state = WooPosSettingsLocalCatalogState( + catalogStatus = WooPosSettingsLocalCatalogState.CatalogStatus.LoadingStatus, + allowCellularDataUpdate = true + ), + onToggleCellularData = {}, + onRefreshCatalog = {} + ) + } +} + +@WooPosPreview +@Composable +fun WooPosSettingsLocalCatalogRefreshingPreview() { + WooPosTheme { + WooPosSettingsLocalCatalogScreen( + state = WooPosSettingsLocalCatalogState( + catalogStatus = WooPosSettingsLocalCatalogState.CatalogStatus.RefreshingCatalog, + allowCellularDataUpdate = true + ), + onToggleCellularData = {}, + onRefreshCatalog = {} + ) + } +} diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/settings/details/localcatalog/WooPosSettingsLocalCatalogState.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/settings/details/localcatalog/WooPosSettingsLocalCatalogState.kt new file mode 100644 index 000000000000..b41e0c8595d8 --- /dev/null +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/settings/details/localcatalog/WooPosSettingsLocalCatalogState.kt @@ -0,0 +1,17 @@ +package com.woocommerce.android.ui.woopos.settings.details.localcatalog + +data class WooPosSettingsLocalCatalogState( + val catalogStatus: CatalogStatus = CatalogStatus.LoadingStatus, + val allowCellularDataUpdate: Boolean = false, +) { + sealed class CatalogStatus { + data class Available( + val catalogSize: String, + val lastUpdate: String, + val lastFullUpdate: String + ) : CatalogStatus() + + object LoadingStatus : CatalogStatus() + object RefreshingCatalog : CatalogStatus() + } +} diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/settings/details/localcatalog/WooPosSettingsLocalCatalogViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/settings/details/localcatalog/WooPosSettingsLocalCatalogViewModel.kt new file mode 100644 index 000000000000..e9d59b82aacf --- /dev/null +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/settings/details/localcatalog/WooPosSettingsLocalCatalogViewModel.kt @@ -0,0 +1,85 @@ +package com.woocommerce.android.ui.woopos.settings.details.localcatalog + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.woocommerce.android.tools.SelectedSite +import com.woocommerce.android.ui.woopos.localcatalog.PosLocalCatalogSyncResult +import com.woocommerce.android.ui.woopos.localcatalog.WooPosLocalCatalogSyncRepository +import com.woocommerce.android.ui.woopos.util.datastore.WooPosSyncTimestampManager +import com.woocommerce.android.ui.woopos.util.format.WooPosDateFormatter +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class WooPosSettingsLocalCatalogViewModel @Inject constructor( + private val syncTimestampManager: WooPosSyncTimestampManager, + private val localCatalogSyncRepository: WooPosLocalCatalogSyncRepository, + private val selectedSite: SelectedSite, + private val dateFormatter: WooPosDateFormatter, +) : ViewModel() { + private val _state = MutableStateFlow(WooPosSettingsLocalCatalogState()) + val state: StateFlow = _state.asStateFlow() + + init { + loadCatalogStatus() + } + + private fun loadCatalogStatus() { + viewModelScope.launch { + _state.update { it.copy(catalogStatus = WooPosSettingsLocalCatalogState.CatalogStatus.LoadingStatus) } + + val productsTimestamp = syncTimestampManager.getProductsLastSyncTimestamp() + val variationsTimestamp = syncTimestampManager.getVariationsLastSyncTimestamp() + + val formattedTimestamp = dateFormatter.formatCatalogLastUpdate( + productsTimestamp, + variationsTimestamp + ) + + val catalogStatus = WooPosSettingsLocalCatalogState.CatalogStatus.Available( + catalogSize = "8.3 MB", // TBD local catalog: Replace with actual catalog size + lastUpdate = formattedTimestamp, + lastFullUpdate = formattedTimestamp // TBD local catalog: Replace with full sync timestamp + ) + + _state.update { + it.copy(catalogStatus = catalogStatus) + } + } + } + + fun toggleCellularDataUpdate() { + viewModelScope.launch { + _state.update { + it.copy(allowCellularDataUpdate = !it.allowCellularDataUpdate) + } + // TBD local catalog: Save preference to shared preferences or data store + } + } + + fun runFullCatalogSync() { + viewModelScope.launch { + val backupCatalogData = + (_state.value.catalogStatus as? WooPosSettingsLocalCatalogState.CatalogStatus.Available) + + _state.update { it.copy(catalogStatus = WooPosSettingsLocalCatalogState.CatalogStatus.RefreshingCatalog) } + + val result = localCatalogSyncRepository.syncLocalCatalogFull(selectedSite.get()) + + when (result) { + is PosLocalCatalogSyncResult.Success -> { + loadCatalogStatus() + } + is PosLocalCatalogSyncResult.Failure -> { + // TBD local catalog: Handle errors + backupCatalogData?.let { _state.update { it.copy(catalogStatus = backupCatalogData) } } + } + } + } + } +} diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/util/analytics/WooPosAnalyticsEvent.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/util/analytics/WooPosAnalyticsEvent.kt index 70bcc65e5fd3..83534602b730 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/util/analytics/WooPosAnalyticsEvent.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/util/analytics/WooPosAnalyticsEvent.kt @@ -344,6 +344,10 @@ sealed class WooPosAnalyticsEvent : IAnalyticsEvent { override val name: String = "store_details_tapped" } + data object LocalCatalogTapped : Event() { + override val name: String = "local_catalog_tapped" + } + data object HardwareTapped : Event() { override val name: String = "hardware_tapped" } diff --git a/WooCommerce/src/main/res/values/strings.xml b/WooCommerce/src/main/res/values/strings.xml index 0000a7b389db..b0043f3a1164 100644 --- a/WooCommerce/src/main/res/values/strings.xml +++ b/WooCommerce/src/main/res/values/strings.xml @@ -3645,6 +3645,18 @@ Configure barcode scanner settings Card Readers Manage card reader connections + Catalog + Manage catalog settings + Catalog Status + Catalog Size + Last Update + Last Full Update + Manage Data Usage + Allow full update on cellular data + Download catalog updates using mobile data + Manual Catalog Update + Use this refresh only when something seems off - POS keeps data current automatically. + Refresh Catalog Never Just now