Skip to content

Commit 1f22542

Browse files
authored
Merge pull request #12936 from woocommerce/issue/add-package-ui-improvements
[Shipping Labels Revamp] Add Improvements and bug fixes to Packages UI
2 parents 66014e5 + 5bdaf8b commit 1f22542

File tree

5 files changed

+97
-18
lines changed

5 files changed

+97
-18
lines changed

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/Models.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,17 @@ data class CustomPackageCreationData(
6161
val isValid: Boolean
6262
get() = height.isNotEmpty() && length.isNotEmpty() && width.isNotEmpty()
6363

64+
val asPackageData: PackageData
65+
get() = PackageData(
66+
type = type,
67+
name = "",
68+
description = "",
69+
length = length,
70+
width = width,
71+
height = height,
72+
isSelected = true
73+
)
74+
6475
companion object {
6576
val EMPTY = CustomPackageCreationData(
6677
type = PackageType.BOX,

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/WooShippingLabelPackageCreationFragment.kt

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,17 @@ import android.view.View
66
import android.view.ViewGroup
77
import androidx.compose.ui.platform.ComposeView
88
import androidx.compose.ui.platform.ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed
9+
import androidx.fragment.app.setFragmentResult
910
import androidx.fragment.app.viewModels
11+
import androidx.navigation.fragment.findNavController
12+
import com.woocommerce.android.R
13+
import com.woocommerce.android.extensions.handleDialogResult
14+
import com.woocommerce.android.extensions.navigateSafely
1015
import com.woocommerce.android.ui.base.BaseFragment
1116
import com.woocommerce.android.ui.compose.theme.WooThemeWithBackground
17+
import com.woocommerce.android.ui.orders.wooshippinglabels.packages.WooShippingLabelPackageCreationViewModel.PackageSelected
18+
import com.woocommerce.android.ui.orders.wooshippinglabels.packages.WooShippingLabelPackageCreationViewModel.PackageType
19+
import com.woocommerce.android.ui.orders.wooshippinglabels.packages.WooShippingLabelPackageCreationViewModel.ShowPackageTypeDialog
1220
import dagger.hilt.android.AndroidEntryPoint
1321

1422
@AndroidEntryPoint
@@ -25,4 +33,54 @@ class WooShippingLabelPackageCreationFragment : BaseFragment() {
2533
}
2634
}
2735
}
36+
37+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
38+
super.onViewCreated(view, savedInstanceState)
39+
bindEventListener()
40+
bindResultHandlers()
41+
}
42+
43+
private fun bindEventListener() {
44+
viewModel.event.observe(viewLifecycleOwner) { event ->
45+
when (event) {
46+
is ShowPackageTypeDialog -> handlePackageTypeSelection(event.currentSelection)
47+
is PackageSelected -> handlePackageDataAsResult(event.packageData)
48+
}
49+
}
50+
}
51+
52+
private fun bindResultHandlers() {
53+
handleDialogResult<String>(
54+
key = SELECTOR_REQUEST_KEY,
55+
entryId = R.id.wooShippingLabelPackageCreationFragment
56+
) { result ->
57+
PackageType.entries
58+
.firstOrNull { it.toString() == result }
59+
?.let { viewModel.onPackageTypeSelected(it) }
60+
}
61+
}
62+
63+
private fun handlePackageTypeSelection(currentSelection: PackageType) {
64+
WooShippingLabelPackageCreationFragmentDirections
65+
.actionWooShippingLabelPackageCreationFragmentToItemSelectorDialog(
66+
requestKey = SELECTOR_REQUEST_KEY,
67+
selectedItem = currentSelection.name,
68+
values = PackageType.entries.map { it.name }.toTypedArray(),
69+
keys = PackageType.entries
70+
.map { getString(it.resourceId) }
71+
.toTypedArray()
72+
).let { findNavController().navigateSafely(it) }
73+
}
74+
75+
private fun handlePackageDataAsResult(packageData: PackageData) {
76+
setFragmentResult(
77+
PACKAGE_SELECTION_RESULT,
78+
Bundle().apply { putParcelable(PACKAGE_SELECTION_RESULT, packageData) }
79+
)
80+
}
81+
82+
companion object {
83+
const val SELECTOR_REQUEST_KEY = "package_type"
84+
const val PACKAGE_SELECTION_RESULT = "package_selection"
85+
}
2886
}

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/WooShippingLabelPackageCreationViewModel.kt

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ class WooShippingLabelPackageCreationViewModel @Inject constructor(
6868
viewState.savedPackageSelection.packages
6969
.map { it.copy(isSelected = false) }
7070
.toMutableList()
71-
.apply { set(indexOf(selectedPackage), selectedPackage.copy(isSelected = isSelected)) }
71+
.safelyUpdate(selectedPackage, selectedPackage.copy(isSelected = isSelected))
7272
.let { SavedPackageSelection(it) }
7373
.let { viewState.copy(savedPackageSelection = it) }
7474
}
@@ -77,19 +77,21 @@ class WooShippingLabelPackageCreationViewModel @Inject constructor(
7777
fun onAddCarrierPackageClick() {
7878
_viewState.value.carrierPackageSection.carrierPackages
7979
.asSequence()
80-
.map { it.value }.flatten()
81-
.map { it.packages }.flatten()
80+
.flatMap { it.value }
81+
.flatMap { it.packages }
8282
.find { it.isSelected }
83-
?.let { triggerEvent(CarrierPackageSelected(it)) }
83+
?.let { triggerEvent(PackageSelected(it)) }
8484
}
8585

8686
fun onAddSavedPackageClick() {
8787
_viewState.value.savedPackageSelection.packages.find { it.isSelected }
88-
?.let { triggerEvent(SavedPackageSelected(it)) }
88+
?.let { triggerEvent(PackageSelected(it)) }
8989
}
9090

9191
fun onAddCustomPackageClick() {
92-
triggerEvent(CustomPackageCreated(_viewState.value.customPackageCreationData))
92+
_viewState.value.customPackageCreationData
93+
.asPackageData
94+
.let { triggerEvent(PackageSelected(it)) }
9395
}
9496

9597
fun onPackageTypeSpinnerClick() {
@@ -139,15 +141,19 @@ class WooShippingLabelPackageCreationViewModel @Inject constructor(
139141
packageGroup.packages
140142
.map { it.copy(isSelected = false) }
141143
.toMutableList()
142-
.apply {
143-
indexOf(packageData)
144-
.takeIf { it != -1 }
145-
?.let { set(it, packageData.copy(isSelected = isSelected)) }
146-
?: this
147-
}
144+
.safelyUpdate(packageData, packageData.copy(isSelected = isSelected))
148145
.let { packageGroup.copy(packages = it) }
149146
}.let { carrierPackages.key to it }
150147

148+
private fun MutableList<PackageData>.safelyUpdate(
149+
originalPackage: PackageData,
150+
updatedPackage: PackageData
151+
) = apply {
152+
indexOf(originalPackage)
153+
.takeIf { it != -1 }
154+
?.let { set(it, updatedPackage) }
155+
}
156+
151157
@Parcelize
152158
data class ViewState(
153159
val pageTabs: List<PageTab> = emptyList(),
@@ -173,8 +179,6 @@ class WooShippingLabelPackageCreationViewModel @Inject constructor(
173179
ENVELOPE(R.string.woo_shipping_labels_package_creation_envelope_type)
174180
}
175181

176-
data class SavedPackageSelected(val packageData: PackageData) : MultiLiveEvent.Event()
177-
data class CarrierPackageSelected(val packageData: PackageData) : MultiLiveEvent.Event()
178-
data class CustomPackageCreated(val packageData: CustomPackageCreationData) : MultiLiveEvent.Event()
182+
data class PackageSelected(val packageData: PackageData) : MultiLiveEvent.Event()
179183
data class ShowPackageTypeDialog(val currentSelection: PackageType) : MultiLiveEvent.Event()
180184
}

WooCommerce/src/main/res/navigation/nav_graph_orders.xml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -760,7 +760,13 @@
760760
<fragment
761761
android:id="@+id/wooShippingLabelPackageCreationFragment"
762762
android:name="com.woocommerce.android.ui.orders.wooshippinglabels.packages.WooShippingLabelPackageCreationFragment"
763-
android:label="WooShippingLabelPackageCreationFragment" />
763+
android:label="WooShippingLabelPackageCreationFragment" >
764+
765+
<action
766+
android:id="@+id/action_wooShippingLabelPackageCreationFragment_to_itemSelectorDialog"
767+
app:destination="@id/itemSelectorDialog" />
768+
769+
</fragment>
764770
<fragment
765771
android:id="@+id/wooShippingLabelPurchasedFragment"
766772
android:name="com.woocommerce.android.ui.orders.wooshippinglabels.purchased.WooShippingLabelPurchasedFragment"

WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/WooShippingLabelPackageCreationViewModelTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package com.woocommerce.android.ui.orders.wooshippinglabels.packages
22

33
import androidx.lifecycle.SavedStateHandle
44
import com.woocommerce.android.R
5-
import com.woocommerce.android.ui.orders.wooshippinglabels.packages.WooShippingLabelPackageCreationViewModel.CustomPackageCreated
5+
import com.woocommerce.android.ui.orders.wooshippinglabels.packages.WooShippingLabelPackageCreationViewModel.PackageSelected
66
import com.woocommerce.android.ui.orders.wooshippinglabels.packages.WooShippingLabelPackageCreationViewModel.PackageType
77
import com.woocommerce.android.ui.orders.wooshippinglabels.packages.WooShippingLabelPackageCreationViewModel.ShowPackageTypeDialog
88
import com.woocommerce.android.ui.orders.wooshippinglabels.packages.WooShippingLabelPackageCreationViewModel.ViewState
@@ -68,7 +68,7 @@ class WooShippingLabelPackageCreationViewModelTest : BaseUnitTest() {
6868

6969
sut.onAddCustomPackageClick()
7070

71-
assertThat(lastEvent).isEqualTo(CustomPackageCreated(customPackageData))
71+
assertThat(lastEvent).isEqualTo(PackageSelected(customPackageData.asPackageData))
7272
}
7373

7474
@Test

0 commit comments

Comments
 (0)