Skip to content

Commit fdb0222

Browse files
committed
Update package confirm for both package item and package details
1 parent 685a75c commit fdb0222

File tree

5 files changed

+65
-13
lines changed

5 files changed

+65
-13
lines changed

WooCommerce/Classes/ViewRelated/Orders/Order Details/Shipping Labels/Create Shipping Label Form/Package Details/Multi-package/ShippingLabelPackageItem.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ struct ShippingLabelPackageItem_Previews: PreviewProvider {
9999
selectedPackageID: "Box 1",
100100
totalWeight: "",
101101
products: [],
102-
productVariations: [])
102+
productVariations: []) { _ in }
103103
ShippingLabelPackageItem(packageNumber: 1, isCollapsible: true, safeAreaInsets: .zero, viewModel: viewModel)
104104
}
105105
}

WooCommerce/Classes/ViewRelated/Orders/Order Details/Shipping Labels/Create Shipping Label Form/Package Details/Multi-package/ShippingLabelPackageItemViewModel.swift

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import Yosemite
55

66
final class ShippingLabelPackageItemViewModel: ObservableObject {
77

8+
typealias PackageSwitchHandler = (_ newPackage: ShippingLabelPackageAttributes) -> Void
9+
810
/// The id of the selected package. Defaults to last selected package, if any.
911
///
1012
let selectedPackageID: String
@@ -35,6 +37,7 @@ final class ShippingLabelPackageItemViewModel: ObservableObject {
3537
private let orderItems: [OrderItem]
3638
private let currency: String
3739
private let currencyFormatter: CurrencyFormatter
40+
private let onPackageSwitch: PackageSwitchHandler
3841

3942
/// The weight unit used in the Store
4043
///
@@ -47,15 +50,18 @@ final class ShippingLabelPackageItemViewModel: ObservableObject {
4750
totalWeight: String,
4851
products: [Product],
4952
productVariations: [ProductVariation],
53+
onPackageSwitch: @escaping PackageSwitchHandler,
5054
formatter: CurrencyFormatter = CurrencyFormatter(currencySettings: ServiceLocator.currencySettings),
5155
weightUnit: String? = ServiceLocator.shippingSettingsService.weightUnit) {
5256
self.order = order
5357
self.orderItems = orderItems
5458
self.currency = order.currency
5559
self.currencyFormatter = formatter
5660
self.weightUnit = weightUnit
57-
self.packageListViewModel = ShippingLabelPackageListViewModel(packagesResponse: packagesResponse)
5861
self.selectedPackageID = selectedPackageID
62+
self.onPackageSwitch = onPackageSwitch
63+
self.packageListViewModel = ShippingLabelPackageListViewModel(packagesResponse: packagesResponse)
64+
self.packageListViewModel.delegate = self
5965

6066
packageListViewModel.didSelectPackage(selectedPackageID)
6167
configureItemRows(products: products, productVariations: productVariations)
@@ -66,6 +72,19 @@ final class ShippingLabelPackageItemViewModel: ObservableObject {
6672
}
6773
}
6874

75+
// MARK: ShippingLabelPackageSelectionDelegate conformance
76+
extension ShippingLabelPackageItemViewModel: ShippingLabelPackageSelectionDelegate {
77+
func didSelectPackage(id: String) {
78+
// TODO-4599: set to current total weight if manually edited
79+
let newTotalWeight = ""
80+
let newPackage = ShippingLabelPackageAttributes(packageID: id,
81+
totalWeight: newTotalWeight,
82+
productIDs: orderItems.map { $0.productOrVariationID })
83+
84+
onPackageSwitch(newPackage)
85+
}
86+
}
87+
6988
// MARK: - Helper methods
7089
private extension ShippingLabelPackageItemViewModel {
7190
/// Generate the items rows, creating an element in the array for every item (eg. if there is an item with quantity 3,

WooCommerce/Classes/ViewRelated/Orders/Order Details/Shipping Labels/Create Shipping Label Form/Package Details/Multi-package/ShippingLabelPackagesFormViewModel.swift

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,9 @@ final class ShippingLabelPackagesFormViewModel: ObservableObject {
8080
selectedPackageID: details.packageID,
8181
totalWeight: details.totalWeight,
8282
products: products,
83-
productVariations: variations)
83+
productVariations: variations) { [weak self] newPackage in
84+
self?.switchPackage(currentID: details.packageID, newPackage: newPackage)
85+
}
8486
}
8587
}
8688
.sink { [weak self] viewModels in
@@ -89,6 +91,18 @@ final class ShippingLabelPackagesFormViewModel: ObservableObject {
8991
.store(in: &cancellables)
9092
}
9193

94+
/// Update selected packages when user switch any package.
95+
///
96+
private func switchPackage(currentID: String, newPackage: ShippingLabelPackageAttributes) {
97+
selectedPackages = selectedPackages.map { package in
98+
if package.packageID == currentID {
99+
return newPackage
100+
} else {
101+
return package
102+
}
103+
}
104+
}
105+
92106
private func configureResultsControllers() {
93107
resultsControllers = ShippingLabelPackageDetailsResultsControllers(siteID: order.siteID,
94108
orderItems: order.items,

WooCommerce/Classes/ViewRelated/Orders/Order Details/Shipping Labels/Create Shipping Label Form/Package Details/Package Selection/ShippingLabelPackageListViewModel.swift

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import Foundation
22
import Yosemite
33

4+
protocol ShippingLabelPackageSelectionDelegate: AnyObject {
5+
func didSelectPackage(id: String)
6+
}
7+
48
/// View model for `ShippingLabelPackageList` and `ShippingLabelPackageSelection`.
59
///
610
final class ShippingLabelPackageListViewModel: ObservableObject {
@@ -31,6 +35,8 @@ final class ShippingLabelPackageListViewModel: ObservableObject {
3135

3236
lazy var addNewPackageViewModel: ShippingLabelAddNewPackageViewModel = ShippingLabelAddNewPackageViewModel(packagesResponse: packagesResponse)
3337

38+
weak var delegate: ShippingLabelPackageSelectionDelegate?
39+
3440
/// The packages response fetched from API
3541
///
3642
private let packagesResponse: ShippingLabelPackagesResponse?
@@ -47,8 +53,20 @@ extension ShippingLabelPackageListViewModel {
4753
selectPredefinedPackage(id)
4854
}
4955

50-
// TODO-4599 - Update selection
51-
func confirmPackageSelection() {}
56+
func confirmPackageSelection() {
57+
let newPackageID: String? = {
58+
if let selectedCustomPackage = selectedCustomPackage {
59+
return selectedCustomPackage.title
60+
} else if let selectedPredefinedPackage = selectedPredefinedPackage {
61+
return selectedPredefinedPackage.id
62+
}
63+
return nil
64+
}()
65+
guard let newPackageID = newPackageID else {
66+
return
67+
}
68+
delegate?.didSelectPackage(id: newPackageID)
69+
}
5270

5371
private func selectCustomPackage(_ id: String) {
5472
guard let packagesResponse = packagesResponse else {

WooCommerce/Classes/ViewRelated/Orders/Order Details/Shipping Labels/Create Shipping Label Form/Package Details/ShippingLabelPackageDetailsViewModel.swift

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ final class ShippingLabelPackageDetailsViewModel: ObservableObject {
8686
self.weightUnit = weightUnit
8787
self.packageListViewModel = ShippingLabelPackageListViewModel(packagesResponse: packagesResponse)
8888
self.selectedPackageID = selectedPackages.first?.packageID // TODO-4599: fix this
89+
self.packageListViewModel.delegate = self
8990

9091
configureResultsControllers()
9192
setDefaultPackage()
@@ -111,7 +112,9 @@ final class ShippingLabelPackageDetailsViewModel: ObservableObject {
111112
///
112113
private func configureTotalWeights(initialTotalWeight: String?) {
113114
if let initialTotalWeight = initialTotalWeight {
114-
let calculatedWeight = calculateTotalWeight(products: products, productVariations: productVariations, customPackage: packageListViewModel.selectedCustomPackage)
115+
let calculatedWeight = calculateTotalWeight(products: products,
116+
productVariations: productVariations,
117+
customPackage: packageListViewModel.selectedCustomPackage)
115118
// Return early if manual input is detected
116119
if initialTotalWeight != String(calculatedWeight) {
117120
isPackageWeightEdited = true
@@ -251,7 +254,11 @@ extension ShippingLabelPackageDetailsViewModel {
251254
}
252255

253256
// MARK: - Package Selection
254-
extension ShippingLabelPackageDetailsViewModel {
257+
extension ShippingLabelPackageDetailsViewModel: ShippingLabelPackageSelectionDelegate {
258+
func didSelectPackage(id: String) {
259+
selectedPackageID = id
260+
}
261+
255262
/// Sets the package passed through the init method, or set the last selected package, if any, as the default selected package
256263
///
257264
func setDefaultPackage() {
@@ -260,12 +267,6 @@ extension ShippingLabelPackageDetailsViewModel {
260267
}
261268
packageListViewModel.didSelectPackage(selectedPackageID)
262269
packageListViewModel.confirmPackageSelection()
263-
// if let selectedCustomPackage = selectedCustomPackage {
264-
// selectedPackageID = selectedCustomPackage.title
265-
// }
266-
// else if let selectedPredefinedPackage = selectedPredefinedPackage {
267-
// selectedPackageID = selectedPredefinedPackage.id
268-
// }
269270
}
270271
}
271272

0 commit comments

Comments
 (0)