diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/WooShippingLabelPackageCreationFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/WooShippingLabelPackageCreationFragment.kt index fcdffb3796d..12b6a35b171 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/WooShippingLabelPackageCreationFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/WooShippingLabelPackageCreationFragment.kt @@ -14,15 +14,21 @@ import com.woocommerce.android.extensions.navigateBackWithResult import com.woocommerce.android.extensions.navigateSafely import com.woocommerce.android.ui.base.BaseFragment import com.woocommerce.android.ui.compose.theme.WooThemeWithBackground +import com.woocommerce.android.ui.dialog.WooDialog import com.woocommerce.android.ui.orders.wooshippinglabels.packages.WooShippingLabelPackageCreationViewModel.PackageSelected import com.woocommerce.android.ui.orders.wooshippinglabels.packages.WooShippingLabelPackageCreationViewModel.PackageType +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.WooShippingLabelPackageCreationViewModel.ShowLoadingDialog import com.woocommerce.android.ui.orders.wooshippinglabels.packages.WooShippingLabelPackageCreationViewModel.ShowPackageTypeDialog +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.WooShippingLabelPackageCreationViewModel.ShowTemplateCreationErrorDialog +import com.woocommerce.android.widgets.CustomProgressDialog import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint class WooShippingLabelPackageCreationFragment : BaseFragment() { val viewModel: WooShippingLabelPackageCreationViewModel by viewModels() + private var progressDialog: CustomProgressDialog? = null + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return ComposeView(requireContext()).apply { setViewCompositionStrategy(DisposeOnViewTreeLifecycleDestroyed) @@ -44,6 +50,8 @@ class WooShippingLabelPackageCreationFragment : BaseFragment() { viewModel.event.observe(viewLifecycleOwner) { event -> when (event) { is ShowPackageTypeDialog -> handlePackageTypeSelection(event.currentSelection) + is ShowLoadingDialog -> showLoadingDialog(event.show) + is ShowTemplateCreationErrorDialog -> handleTemplateCreationError() is PackageSelected -> navigateBackWithResult(PACKAGE_SELECTION_RESULT, event.packageData) } } @@ -72,6 +80,31 @@ class WooShippingLabelPackageCreationFragment : BaseFragment() { ).let { findNavController().navigateSafely(it) } } + private fun showLoadingDialog(show: Boolean) { + if (show) { + progressDialog = CustomProgressDialog.show( + title = getString(R.string.loading), + message = getString(R.string.please_wait) + ).also { it.show(parentFragmentManager, CustomProgressDialog.TAG) } + } else { + progressDialog?.dismiss() + progressDialog = null + } + } + + private fun handleTemplateCreationError() { + WooDialog.showDialog( + activity = requireActivity(), + titleId = R.string.woo_shipping_labels_package_creation_error_title, + messageId = R.string.woo_shipping_labels_package_creation_error_message, + positiveButtonId = R.string.woo_shipping_labels_package_creation_error_proceed, + neutralButtonId = R.string.woo_shipping_labels_package_creation_error_cancel, + posBtnAction = { _, _ -> + viewModel.onAddCustomPackageClick(savePackageAsTemplate = false) + } + ) + } + companion object { const val SELECTOR_REQUEST_KEY = "package_type" const val PACKAGE_SELECTION_RESULT = "package_selection" diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/WooShippingLabelPackageCreationViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/WooShippingLabelPackageCreationViewModel.kt index 44039515e08..3a0fd59c767 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/WooShippingLabelPackageCreationViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/WooShippingLabelPackageCreationViewModel.kt @@ -112,12 +112,11 @@ class WooShippingLabelPackageCreationViewModel @Inject constructor( fun onAddCustomPackageClick(savePackageAsTemplate: Boolean) { val customPackage = _viewState.value.customPackageCreationData - selectedSite.getOrNull() - ?.takeIf { savePackageAsTemplate } - ?.let { customPackage.submitToStore(it) } - - customPackage.toPackageData(dimensionUnit = storeOptions.dimensionUnit) - .let { triggerEvent(PackageSelected(it)) } + if (savePackageAsTemplate) { + handleCustomSelectionAsTemplate(customPackage) + } else { + triggerEvent(PackageSelected(customPackage.toPackageData(dimensionUnit = storeOptions.dimensionUnit))) + } } fun onPackageTypeSpinnerClick() { @@ -194,24 +193,55 @@ class WooShippingLabelPackageCreationViewModel @Inject constructor( ?.let { set(it, updatedPackage) } } - private fun CustomPackageCreationData.submitToStore(site: SiteModel) { + private fun handleCustomSelectionAsTemplate( + customPackage: CustomPackageCreationData + ) { + triggerEvent(ShowLoadingDialog(true)) launch { - packageRepository.createCustomPackage( - site = site, - requestData = this@submitToStore.let { - CustomPackageCreationRequestData( - name = it.name, - isLetter = it.type == PackageType.ENVELOPE, - innerDimensions = it.dimensions, - boxWeight = it.weight?.toDoubleOrNull() ?: 0.0, - isUserDefined = true, - maxWeight = 0.0 - ) - }.let { listOf(it) } + selectedSite.getOrNull() + ?.let { sendCustomPackageToStore(it, customPackage) } + ?.fold( + onSuccess = { + triggerEvent(ShowLoadingDialog(false)) + triggerEvent( + PackageSelected(customPackage.toPackageData(dimensionUnit = storeOptions.dimensionUnit)) + ) + }, + onFailure = { + triggerEvent(ShowLoadingDialog(false)) + triggerEvent(ShowTemplateCreationErrorDialog) + } + ) ?: triggerEvent( + PackageSelected( + customPackage.toPackageData(dimensionUnit = storeOptions.dimensionUnit) + ) ) } } + private suspend fun sendCustomPackageToStore( + site: SiteModel, + packageData: CustomPackageCreationData + ): Result { + val response = packageRepository.createCustomPackage( + site = site, + requestData = CustomPackageCreationRequestData( + name = packageData.name, + isLetter = packageData.type == PackageType.ENVELOPE, + innerDimensions = packageData.dimensions, + boxWeight = packageData.weight?.toDoubleOrNull() ?: 0.0, + isUserDefined = true, + maxWeight = 0.0 + ).let { listOf(it) } + ) + + return response.takeIf { it.isError.not() } + ?.model?.firstOrNull() + ?.let { PackageData.fromPackageDAO(it) } + ?.let { Result.success(it) } + ?: Result.failure(Throwable("Failed to save package")) + } + @Parcelize data class ViewState( val pageTabs: List = emptyList(), @@ -260,4 +290,6 @@ class WooShippingLabelPackageCreationViewModel @Inject constructor( data class PackageSelected(val packageData: PackageData) : MultiLiveEvent.Event() data class ShowPackageTypeDialog(val currentSelection: PackageType) : MultiLiveEvent.Event() + data class ShowLoadingDialog(val show: Boolean) : MultiLiveEvent.Event() + object ShowTemplateCreationErrorDialog : MultiLiveEvent.Event() } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/FetchPredefinedPackagesFromStore.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/FetchPredefinedPackagesFromStore.kt index 0e130faa1eb..952560a227e 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/FetchPredefinedPackagesFromStore.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/FetchPredefinedPackagesFromStore.kt @@ -21,27 +21,12 @@ class FetchPredefinedPackagesFromStore @Inject constructor( return PredefinedPackagesState.Data( storeOptions = storePackages.storeOptions.toStoreOptionsForPackages(), - savedPackages = storePackages.filterSavedData(), + savedPackages = storePackages.savedPackages + .map { PackageData.fromPackageDAO(it) }, carrierPackages = storePackages.filterCarrierData() ) } - private fun StorePackagesDAO.filterSavedData() = - savedPackages.map { packageDAO -> - PackageData( - name = packageDAO.name, - dimensions = packageDAO.dimensions, - weight = packageDAO.weight, - isSelected = false, - isPredefined = true, - isLetter = packageDAO.isLetter, - dimensionUnit = packageDAO.dimensionUnit, - weightUnit = packageDAO.weightUnit, - groupName = packageDAO.groupName, - id = packageDAO.id, - ) - } - private fun StorePackagesDAO.filterCarrierData() = mapOf( carrierPackages .parseCarrierData(CarrierType.USPS) @@ -67,18 +52,7 @@ class FetchPredefinedPackagesFromStore @Inject constructor( CarrierPackageGroup( groupName = group.description, packages = group.packages.map { packageItem -> - PackageData( - name = packageItem.name, - dimensions = packageItem.dimensions, - weight = packageItem.weight, - isSelected = false, - isPredefined = true, - isLetter = packageItem.isLetter, - dimensionUnit = packageItem.dimensionUnit, - weightUnit = packageItem.weightUnit, - groupName = packageItem.groupName, - id = packageItem.id, - ) + PackageData.fromPackageDAO(packageItem) } ) } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/ui/UIModels.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/ui/UIModels.kt index 32d5ce5b1da..ee38eb4f333 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/ui/UIModels.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/ui/UIModels.kt @@ -4,6 +4,7 @@ import android.os.Parcelable import com.woocommerce.android.R import com.woocommerce.android.extensions.isNotNullOrEmpty import com.woocommerce.android.ui.orders.wooshippinglabels.packages.WooShippingLabelPackageCreationViewModel.PackageType +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.datasource.PackageDAO import kotlinx.parcelize.IgnoredOnParcel import kotlinx.parcelize.Parcelize @@ -58,6 +59,23 @@ data class PackageData( isLetter = false, groupName = null ) + + fun fromPackageDAO( + dao: PackageDAO, + isSelected: Boolean = false, + isPredefined: Boolean = true + ): PackageData = PackageData( + id = dao.id, + name = dao.name, + dimensions = dao.dimensions, + weight = dao.weight, + isSelected = isSelected, + isPredefined = isPredefined, + isLetter = dao.isLetter, + dimensionUnit = dao.dimensionUnit, + weightUnit = dao.weightUnit, + groupName = dao.groupName + ) } } diff --git a/WooCommerce/src/main/res/values/strings.xml b/WooCommerce/src/main/res/values/strings.xml index 009ebfa0398..1888fe593b9 100644 --- a/WooCommerce/src/main/res/values/strings.xml +++ b/WooCommerce/src/main/res/values/strings.xml @@ -4448,5 +4448,9 @@ Failed to load the package data Box Envelope + We couldn\'t save the package as template + Do you want to proceed without saving it? + Proceed + Cancel Hmm, we can\'t find a WordPress.com account connected to this email address.