Skip to content

Commit c77f0d5

Browse files
authored
Merge pull request #6175 from woocommerce/issue/6128-update-product-support]
Order Creation: Wire update product quantity support to LocalOrderSynchronizer
2 parents 32077ba + 24127d2 commit c77f0d5

File tree

2 files changed

+32
-8
lines changed

2 files changed

+32
-8
lines changed

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

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -466,8 +466,10 @@ private extension NewOrderViewModel {
466466
// Observe changes to the product quantity
467467
productRowViewModel.$quantity
468468
.sink { [weak self] newQuantity in
469-
// TODO: Add update quantity support
470-
// self?.orderDetails.items[index].quantity = newQuantity
469+
guard let self = self, let newInput = self.createUpdateProductInput(item: item, quantity: newQuantity) else {
470+
return
471+
}
472+
self.orderSynchronizer.setProduct.send(newInput)
471473
}
472474
.store(in: &cancellables)
473475

@@ -553,6 +555,32 @@ private extension NewOrderViewModel {
553555
}
554556
return OrderSyncAddressesInput(billing: billingAddress, shipping: shippingAddress)
555557
}
558+
559+
/// Creates a new `OrderSyncProductInput` type meant to update an existing input from `OrderSynchronizer`
560+
/// If the referenced product can't be found, `nil` is returned.
561+
///
562+
private func createUpdateProductInput(item: OrderItem, quantity: Decimal) -> OrderSyncProductInput? {
563+
// Finds the product or productVariation associated with the order item.
564+
let product: OrderSyncProductInput.ProductType? = {
565+
if item.variationID != 0, let variation = allProductVariations.first(where: { $0.productVariationID == item.variationID }) {
566+
return .variation(variation)
567+
}
568+
569+
if let product = allProducts.first(where: { $0.productID == item.productID }) {
570+
return .product(product)
571+
}
572+
573+
return nil
574+
}()
575+
576+
guard let product = product else {
577+
DDLogError("⛔️ Product with ID: \(item.productID) not found.")
578+
return nil
579+
}
580+
581+
// Return a new input with the new quantity but with the same item id to properly reference the update.
582+
return OrderSyncProductInput(id: item.itemID, product: product, quantity: quantity)
583+
}
556584
}
557585

558586
private extension NewOrderViewModel {

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

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,6 @@ class NewOrderViewModelTests: XCTestCase {
161161
viewModel.addProductViewModel.selectProduct(product.productID)
162162

163163
// Then
164-
let expectedOrderItem = NewOrderViewModel.NewOrderItem(product: product, quantity: 1).orderItem
165164
XCTAssertTrue(viewModel.productRows.contains(where: { $0.productOrVariationID == sampleProductID }), "Product rows do not contain expected product")
166165
}
167166

@@ -180,10 +179,8 @@ class NewOrderViewModelTests: XCTestCase {
180179
viewModel.addProductViewModel.selectProduct(product.productID)
181180

182181
// Then
183-
throw XCTSkip("Test disabled while we enable update quantity support on OrderSynchronizer")
184-
let expectedOrderItem = NewOrderViewModel.NewOrderItem(product: product, quantity: 2).orderItem
185-
XCTAssertTrue(viewModel.orderDetails.items.contains(where: { $0.orderItem == expectedOrderItem }),
186-
"Order details do not contain order item with updated quantity")
182+
XCTAssertEqual(viewModel.productRows[safe: 0]?.quantity, 2)
183+
XCTAssertEqual(viewModel.productRows[safe: 1]?.quantity, 1)
187184
}
188185

189186
func test_selectOrderItem_selects_expected_order_item() throws {
@@ -355,7 +352,6 @@ class NewOrderViewModelTests: XCTestCase {
355352
XCTAssertEqual(viewModel.paymentDataViewModel.orderTotal, "£8.50")
356353

357354
// When & Then
358-
throw XCTSkip("Test disabled while we enable update quantity support on OrderSynchronizer")
359355
viewModel.productRows[0].incrementQuantity()
360356
XCTAssertEqual(viewModel.paymentDataViewModel.itemsTotal, "£17.00")
361357
XCTAssertEqual(viewModel.paymentDataViewModel.orderTotal, "£17.00")

0 commit comments

Comments
 (0)