Skip to content

Commit d7d8c88

Browse files
committed
Updates NewOrderViewModel to support product deletion & selection
1 parent 24127d2 commit d7d8c88

File tree

3 files changed

+35
-23
lines changed

3 files changed

+35
-23
lines changed

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

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -106,11 +106,10 @@ private struct ProductsSection: View {
106106
ForEach(viewModel.productRows) { productRow in
107107
ProductRow(viewModel: productRow)
108108
.onTapGesture {
109-
// TODO: Support selecting an order item
110-
// viewModel.selectOrderItem(productRow.id)
109+
viewModel.selectOrderItem(productRow.id)
111110
}
112-
.sheet(item: $viewModel.selectedOrderItem) { item in
113-
createProductInOrderView(for: item)
111+
.sheet(item: $viewModel.selectedProductViewModel) { productViewModel in
112+
ProductInOrder(viewModel: productViewModel)
114113
}
115114

116115
Divider()
@@ -138,17 +137,6 @@ private struct ProductsSection: View {
138137
Divider()
139138
}
140139
}
141-
142-
@ViewBuilder private func createProductInOrderView(for item: NewOrderViewModel.NewOrderItem) -> some View {
143-
// TODO: Support selecting an order item
144-
// if let productRowViewModel = viewModel.createProductRowViewModel(for: item, canChangeQuantity: false) {
145-
// let productInOrderViewModel = ProductInOrderViewModel(productRowViewModel: productRowViewModel) {
146-
// viewModel.removeItemFromOrder(item)
147-
// }
148-
// ProductInOrder(viewModel: productInOrderViewModel)
149-
// }
150-
EmptyView()
151-
}
152140
}
153141

154142
// MARK: Constants

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

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -114,10 +114,10 @@ final class NewOrderViewModel: ObservableObject {
114114
///
115115
@Published private(set) var productRows: [ProductRowViewModel] = []
116116

117-
/// Item selected from the list of products in the order.
117+
/// Selected product view model to render.
118118
/// Used to open the product details in `ProductInOrder`.
119119
///
120-
@Published var selectedOrderItem: NewOrderItem? = nil
120+
@Published var selectedProductViewModel: ProductInOrderViewModel? = nil
121121

122122
// MARK: Payment properties
123123

@@ -171,18 +171,19 @@ final class NewOrderViewModel: ObservableObject {
171171
configurePaymentDataViewModel()
172172
}
173173

174-
/// Selects an order item.
174+
/// Selects an order item by setting the `selectedProductViewModel`.
175175
///
176176
/// - Parameter id: ID of the order item to select
177-
func selectOrderItem(_ id: String) {
178-
selectedOrderItem = orderDetails.items.first(where: { $0.id == id })
177+
func selectOrderItem(_ id: Int64) {
178+
selectedProductViewModel = createSelectedProductViewModel(itemID: id)
179179
}
180180

181181
/// Removes an item from the order.
182182
///
183183
/// - Parameter item: Item to remove from the order
184-
func removeItemFromOrder(_ item: NewOrderItem) {
185-
orderDetails.items.removeAll(where: { $0 == item })
184+
func removeItemFromOrder(_ item: OrderItem) {
185+
guard let input = createUpdateProductInput(item: item, quantity: 0) else { return }
186+
orderSynchronizer.setProduct.send(input)
186187
configureProductRowViewModels()
187188
}
188189

@@ -581,6 +582,23 @@ private extension NewOrderViewModel {
581582
// Return a new input with the new quantity but with the same item id to properly reference the update.
582583
return OrderSyncProductInput(id: item.itemID, product: product, quantity: quantity)
583584
}
585+
586+
/// Creates a `ProductInOrderViewModel` based on the provided order item id.
587+
///
588+
func createSelectedProductViewModel(itemID: Int64) -> ProductInOrderViewModel? {
589+
// Find order item based on the provided id.
590+
// Creates the product row view model needed for `ProductInOrderViewModel`.
591+
guard
592+
let orderItem = orderSynchronizer.order.items.first(where: { $0.itemID == itemID }),
593+
let rowViewModel = createProductRowViewModel(for: orderItem, canChangeQuantity: false)
594+
else {
595+
return nil
596+
}
597+
598+
return ProductInOrderViewModel(productRowViewModel: rowViewModel) { [weak self] in
599+
self?.removeItemFromOrder(orderItem)
600+
}
601+
}
584602
}
585603

586604
private extension NewOrderViewModel {

WooCommerce/Classes/ViewRelated/Orders/Order Creation/ProductsSection/ProductInOrderViewModel.swift

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,13 @@ import Yosemite
22

33
/// View model for `ProductInOrder`.
44
///
5-
final class ProductInOrderViewModel {
5+
final class ProductInOrderViewModel: Identifiable {
6+
7+
/// Underlying row ID.
8+
///
9+
var ID: Int64 {
10+
productRowViewModel.id
11+
}
612

713
/// The product being edited.
814
///

0 commit comments

Comments
 (0)