Skip to content

Commit 7305fa4

Browse files
authored
Merge pull request #4938 from woocommerce/issue/4599-form-view-model-multi-package
Shipping Labels: Update purchase form view model to support multi-package
2 parents a22ae35 + 7b13c02 commit 7305fa4

File tree

10 files changed

+159
-131
lines changed

10 files changed

+159
-131
lines changed
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import Foundation
2+
3+
/// A structure to hold the basic details for a selected package on Package Details screen of Shipping Label purchase flow.
4+
///
5+
struct ShippingLabelPackageAttributes: Hashable, Equatable {
6+
7+
/// ID of the selected package.
8+
let packageID: String
9+
10+
/// Total weight of the package in string value.
11+
let totalWeight: String
12+
13+
/// List of product or variation IDs for items in the package.
14+
let productIDs: [Int64]
15+
}

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,7 @@ struct ShippingLabelPackageList_Previews: PreviewProvider {
9696
static var previews: some View {
9797
let viewModel = ShippingLabelPackageDetailsViewModel(order: ShippingLabelPackageDetailsViewModel.sampleOrder(),
9898
packagesResponse: ShippingLabelPackageDetailsViewModel.samplePackageDetails(),
99-
selectedPackageID: nil,
100-
totalWeight: nil)
99+
selectedPackages: [])
101100

102101
ShippingLabelPackageList(viewModel: viewModel)
103102
}

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,10 @@ struct ShippingLabelPackageSelection_Previews: PreviewProvider {
1818
static var previews: some View {
1919
let viewModelWithPackages = ShippingLabelPackageDetailsViewModel(order: ShippingLabelPackageDetailsViewModel.sampleOrder(),
2020
packagesResponse: ShippingLabelPackageDetailsViewModel.samplePackageDetails(),
21-
selectedPackageID: nil,
22-
totalWeight: nil)
21+
selectedPackages: [])
2322
let viewModelWithoutPackages = ShippingLabelPackageDetailsViewModel(order: ShippingLabelPackageDetailsViewModel.sampleOrder(),
2423
packagesResponse: nil,
25-
selectedPackageID: nil,
26-
totalWeight: nil)
24+
selectedPackages: [])
2725

2826
ShippingLabelPackageSelection(viewModel: viewModelWithPackages)
2927

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

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ struct ShippingLabelPackageDetails: View {
88

99
/// Completion callback
1010
///
11-
typealias Completion = (_ selectedPackageID: String?, _ totalPackageWeight: String?) -> Void
11+
typealias Completion = (_ selectedPackages: [ShippingLabelPackageAttributes]) -> Void
1212
private let onCompletion: Completion
1313

1414
init(viewModel: ShippingLabelPackageDetailsViewModel, completion: @escaping Completion) {
@@ -82,7 +82,7 @@ struct ShippingLabelPackageDetails: View {
8282
.navigationBarItems(trailing: Button(action: {
8383
ServiceLocator.analytics.track(.shippingLabelPurchaseFlow,
8484
withProperties: ["state": "packages_selected"])
85-
onCompletion(viewModel.selectedPackageID, viewModel.totalWeight)
85+
onCompletion(viewModel.selectedPackagesDetails)
8686
presentation.wrappedValue.dismiss()
8787
}, label: {
8888
Text(Localization.doneButton)
@@ -117,15 +117,14 @@ struct ShippingLabelPackageDetails_Previews: PreviewProvider {
117117

118118
let viewModel = ShippingLabelPackageDetailsViewModel(order: ShippingLabelPackageDetailsViewModel.sampleOrder(),
119119
packagesResponse: ShippingLabelPackageDetailsViewModel.samplePackageDetails(),
120-
selectedPackageID: nil,
121-
totalWeight: nil)
120+
selectedPackages: [])
122121

123-
ShippingLabelPackageDetails(viewModel: viewModel, completion: { (selectedPackageID, totalPackageWeight) in
122+
ShippingLabelPackageDetails(viewModel: viewModel, completion: { _ in
124123
})
125124
.environment(\.colorScheme, .light)
126125
.previewDisplayName("Light")
127126

128-
ShippingLabelPackageDetails(viewModel: viewModel, completion: { (selectedPackageID, totalPackageWeight) in
127+
ShippingLabelPackageDetails(viewModel: viewModel, completion: { _ in
129128
})
130129
.environment(\.colorScheme, .dark)
131130
.previewDisplayName("Dark")

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

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,16 @@ final class ShippingLabelPackageDetailsViewModel: ObservableObject {
5656
///
5757
@Published var selectedPackageID: String?
5858

59+
/// List of selected package with basic info.
60+
/// TODO-4599: update this to properly support multi-package.
61+
///
62+
var selectedPackagesDetails: [ShippingLabelPackageAttributes] {
63+
guard let id = selectedPackageID, totalWeight.isNotEmpty else {
64+
return []
65+
}
66+
return [ShippingLabelPackageAttributes(packageID: id, totalWeight: totalWeight, productIDs: orderItems.map { $0.productOrVariationID })]
67+
}
68+
5969
/// The title of the selected package, if any.
6070
///
6171
var selectedPackageName: String {
@@ -87,8 +97,7 @@ final class ShippingLabelPackageDetailsViewModel: ObservableObject {
8797

8898
init(order: Order,
8999
packagesResponse: ShippingLabelPackagesResponse?,
90-
selectedPackageID: String?,
91-
totalWeight: String?,
100+
selectedPackages: [ShippingLabelPackageAttributes],
92101
formatter: CurrencyFormatter = CurrencyFormatter(currencySettings: ServiceLocator.currencySettings),
93102
stores: StoresManager = ServiceLocator.stores,
94103
storageManager: StorageManagerType = ServiceLocator.storageManager,
@@ -101,14 +110,14 @@ final class ShippingLabelPackageDetailsViewModel: ObservableObject {
101110
self.storageManager = storageManager
102111
self.weightUnit = weightUnit
103112
self.packagesResponse = packagesResponse
104-
self.selectedPackageID = selectedPackageID
113+
self.selectedPackageID = selectedPackages.first?.packageID // TODO-4599: fix this
105114

106115
configureResultsControllers()
107116
setDefaultPackage()
108117
syncProducts()
109118
syncProductVariations()
110119
configureItemRows()
111-
configureTotalWeights(initialTotalWeight: totalWeight)
120+
configureTotalWeights(initialTotalWeight: selectedPackages.first?.totalWeight) // TODO-4599: fix this
112121
}
113122

114123
/// Observe changes in products and variations to update item rows.

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

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -159,8 +159,7 @@ extension ShippingLabelFormViewController: UITableViewDelegate {
159159
case Row(type: .shipTo, dataState: .validated, displayMode: .editable):
160160
displayEditAddressFormVC(address: viewModel.destinationAddress, validationError: nil, type: .destination)
161161
case Row(type: .packageDetails, dataState: .validated, displayMode: .editable):
162-
displayPackageDetailsVC(selectedPackageID: viewModel.selectedPackageID,
163-
totalPackageWeight: viewModel.totalPackageWeight)
162+
displayPackageDetailsVC(inputPackages: viewModel.selectedPackagesDetails)
164163
case Row(type: .customs, dataState: .validated, displayMode: .editable):
165164
displayCustomsFormListVC(customsForms: viewModel.customsForms)
166165
case Row(type: .shippingCarrierAndRates, dataState: .validated, displayMode: .editable):
@@ -278,8 +277,8 @@ private extension ShippingLabelFormViewController {
278277
title: Localization.packageDetailsCellTitle,
279278
body: viewModel.getPackageDetailsBody(),
280279
buttonTitle: Localization.continueButtonInCells) { [weak self] in
281-
self?.displayPackageDetailsVC(selectedPackageID: self?.viewModel.selectedPackageID,
282-
totalPackageWeight: self?.viewModel.totalPackageWeight)
280+
guard let self = self else { return }
281+
self.displayPackageDetailsVC(inputPackages: self.viewModel.selectedPackagesDetails)
283282
}
284283
}
285284

@@ -417,13 +416,12 @@ private extension ShippingLabelFormViewController {
417416
navigationController?.pushViewController(vc, animated: true)
418417
}
419418

420-
func displayPackageDetailsVC(selectedPackageID: String?, totalPackageWeight: String?) {
419+
func displayPackageDetailsVC(inputPackages: [ShippingLabelPackageAttributes]) {
421420
let vm = ShippingLabelPackageDetailsViewModel(order: viewModel.order,
422421
packagesResponse: viewModel.packagesResponse,
423-
selectedPackageID: selectedPackageID,
424-
totalWeight: totalPackageWeight)
425-
let packageDetails = ShippingLabelPackageDetails(viewModel: vm) { [weak self] (selectedPackageID, totalPackageWeight) in
426-
self?.viewModel.handlePackageDetailsValueChanges(selectedPackageID: selectedPackageID, totalPackageWeight: totalPackageWeight)
422+
selectedPackages: inputPackages)
423+
let packageDetails = ShippingLabelPackageDetails(viewModel: vm) { [weak self] selectedPackages in
424+
self?.viewModel.handlePackageDetailsValueChanges(details: selectedPackages)
427425
}
428426

429427
let hostingVC = UIHostingController(rootView: packageDetails)
@@ -451,14 +449,14 @@ private extension ShippingLabelFormViewController {
451449
selectedAdultSignatureRate: ShippingLabelCarrierRate?) {
452450
guard let originAddress = viewModel.originAddress,
453451
let destinationAddress = viewModel.destinationAddress,
454-
let selectedPackage = viewModel.selectedPackage else {
452+
viewModel.selectedPackages.isNotEmpty else {
455453
return
456454
}
457455

458456
let vm = ShippingLabelCarriersViewModel(order: viewModel.order,
459457
originAddress: originAddress,
460458
destinationAddress: destinationAddress,
461-
packages: [selectedPackage],
459+
packages: viewModel.selectedPackages,
462460
selectedRate: selectedRate,
463461
selectedSignatureRate: selectedSignatureRate,
464462
selectedAdultSignatureRate: selectedAdultSignatureRate)
@@ -500,9 +498,10 @@ private extension ShippingLabelFormViewController {
500498

501499
/// Removes the Shipping Label Form from the navigation stack and displays the Print Shipping Label screen.
502500
/// This prevents navigating back to the purchase form after successfully purchasing the label.
501+
/// TODO-4599: Update for multi-package support
503502
///
504503
func displayPrintShippingLabelVC() {
505-
guard let purchasedShippingLabel = viewModel.purchasedShippingLabel,
504+
guard let purchasedShippingLabel = viewModel.purchasedShippingLabels.first,
506505
let navigationController = navigationController else {
507506
return
508507
}

0 commit comments

Comments
 (0)