Skip to content

Commit f72fb76

Browse files
authored
Merge pull request #6169 from woocommerce/issue/6128-addresses-support
Order Creation: Wire customer details support to LocalOrderSynchronizer
2 parents b5b60a5 + 083b29d commit f72fb76

File tree

2 files changed

+22
-11
lines changed

2 files changed

+22
-11
lines changed

WooCommerce/Classes/ViewRelated/Orders/Order Creation/NewOrderViewModel.swift

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -216,11 +216,11 @@ final class NewOrderViewModel: ObservableObject {
216216
///
217217
func createOrderAddressFormViewModel() -> CreateOrderAddressFormViewModel {
218218
CreateOrderAddressFormViewModel(siteID: siteID,
219-
addressData: .init(billingAddress: orderDetails.billingAddress,
220-
shippingAddress: orderDetails.shippingAddress),
219+
addressData: .init(billingAddress: orderSynchronizer.order.billingAddress,
220+
shippingAddress: orderSynchronizer.order.shippingAddress),
221221
onAddressUpdate: { [weak self] updatedAddressData in
222-
self?.orderDetails.billingAddress = updatedAddressData.billingAddress
223-
self?.orderDetails.shippingAddress = updatedAddressData.shippingAddress
222+
let input = Self.createAddressesInput(from: updatedAddressData)
223+
self?.orderSynchronizer.setAddresses.send(input)
224224
self?.trackCustomerDetailsAdded()
225225
})
226226
}
@@ -275,14 +275,12 @@ extension NewOrderViewModel {
275275
///
276276
struct OrderDetails {
277277
var items: [NewOrderItem] = []
278-
var billingAddress: Address?
279-
var shippingAddress: Address?
280278

281279
func toOrder() -> Order {
282280
OrderFactory.emptyNewOrder.copy(status: .pending,
283281
items: items.map { $0.orderItem },
284-
billingAddress: billingAddress,
285-
shippingAddress: shippingAddress)
282+
billingAddress: nil,
283+
shippingAddress: nil)
286284
}
287285
}
288286

@@ -479,7 +477,7 @@ private extension NewOrderViewModel {
479477
/// Updates customer data viewmodel based on order addresses.
480478
///
481479
func configureCustomerDataViewModel() {
482-
$orderDetails
480+
orderSynchronizer.orderPublisher
483481
.map {
484482
CustomerDataViewModel(billingAddress: $0.billingAddress, shippingAddress: $0.shippingAddress)
485483
}
@@ -511,7 +509,7 @@ private extension NewOrderViewModel {
511509
///
512510
func trackCustomerDetailsAdded() {
513511
let areAddressesDifferent: Bool = {
514-
guard let billingAddress = orderDetails.billingAddress, let shippingAddress = orderDetails.shippingAddress else {
512+
guard let billingAddress = orderSynchronizer.order.billingAddress, let shippingAddress = orderSynchronizer.order.shippingAddress else {
515513
return false
516514
}
517515
return billingAddress != shippingAddress
@@ -544,6 +542,16 @@ private extension NewOrderViewModel {
544542
analytics.track(event: WooAnalyticsEvent.Orders.orderCreationFailed(errorContext: String(describing: error),
545543
errorDescription: error.localizedDescription))
546544
}
545+
546+
/// Creates an `OrderSyncAddressesInput` type from a `NewOrderAddressData` type.
547+
/// Expects `billing` and `shipping` addresses to exists together,
548+
///
549+
static func createAddressesInput(from data: CreateOrderAddressFormViewModel.NewOrderAddressData) -> OrderSyncAddressesInput? {
550+
guard let billingAddress = data.billingAddress, let shippingAddress = data.shippingAddress else {
551+
return nil
552+
}
553+
return OrderSyncAddressesInput(billing: billingAddress, shipping: shippingAddress)
554+
}
547555
}
548556

549557
private extension NewOrderViewModel {

WooCommerce/WooCommerceTests/ViewRelated/Orders/Order Creation/NewOrderViewModelTests.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,10 +273,13 @@ class NewOrderViewModelTests: XCTestCase {
273273
// Given
274274
let stores = MockStoresManager(sessionManager: .testingInstance)
275275
let viewModel = NewOrderViewModel(siteID: sampleSiteID, stores: stores)
276+
let addressViewModel = viewModel.createOrderAddressFormViewModel()
276277
XCTAssertFalse(viewModel.customerDataViewModel.isDataAvailable)
277278

278279
// When
279-
viewModel.orderDetails.billingAddress = sampleAddress1()
280+
addressViewModel.fields.firstName = sampleAddress1().firstName
281+
addressViewModel.fields.lastName = sampleAddress1().lastName
282+
addressViewModel.saveAddress(onFinish: { _ in })
280283

281284
// Then
282285
XCTAssertTrue(viewModel.customerDataViewModel.isDataAvailable)

0 commit comments

Comments
 (0)