@@ -12,10 +12,6 @@ final class NewOrderViewModel: ObservableObject {
1212
1313 private var cancellables : Set < AnyCancellable > = [ ]
1414
15- /// Order details used to create the order
16- ///
17- @Published var orderDetails = OrderDetails ( )
18-
1915 /// Active navigation bar trailing item.
2016 /// Defaults to no visible button.
2117 ///
@@ -114,10 +110,10 @@ final class NewOrderViewModel: ObservableObject {
114110 ///
115111 @Published private( set) var productRows : [ ProductRowViewModel ] = [ ]
116112
117- /// Item selected from the list of products in the order .
113+ /// Selected product view model to render .
118114 /// Used to open the product details in `ProductInOrder`.
119115 ///
120- @Published var selectedOrderItem : NewOrderItem ? = nil
116+ @Published var selectedProductViewModel : ProductInOrderViewModel ? = nil
121117
122118 // MARK: Payment properties
123119
@@ -171,18 +167,19 @@ final class NewOrderViewModel: ObservableObject {
171167 configurePaymentDataViewModel ( )
172168 }
173169
174- /// Selects an order item.
170+ /// Selects an order item by setting the `selectedProductViewModel` .
175171 ///
176172 /// - Parameter id: ID of the order item to select
177- func selectOrderItem( _ id: String ) {
178- selectedOrderItem = orderDetails . items . first ( where : { $0 . id == id } )
173+ func selectOrderItem( _ id: Int64 ) {
174+ selectedProductViewModel = createSelectedProductViewModel ( itemID : id )
179175 }
180176
181177 /// Removes an item from the order.
182178 ///
183179 /// - Parameter item: Item to remove from the order
184- func removeItemFromOrder( _ item: NewOrderItem ) {
185- orderDetails. items. removeAll ( where: { $0 == item } )
180+ func removeItemFromOrder( _ item: OrderItem ) {
181+ guard let input = createUpdateProductInput ( item: item, quantity: 0 ) else { return }
182+ orderSynchronizer. setProduct. send ( input)
186183 configureProductRowViewModels ( )
187184 }
188185
@@ -271,19 +268,6 @@ extension NewOrderViewModel {
271268 case loading
272269 }
273270
274- /// Type to hold all order detail values
275- ///
276- struct OrderDetails {
277- var items : [ NewOrderItem ] = [ ]
278-
279- func toOrder( ) -> Order {
280- OrderFactory . emptyNewOrder. copy ( status: . pending,
281- items: items. map { $0. orderItem } ,
282- billingAddress: nil ,
283- shippingAddress: nil )
284- }
285- }
286-
287271 /// Representation of order status display properties
288272 ///
289273 struct StatusBadgeViewModel {
@@ -312,52 +296,6 @@ extension NewOrderViewModel {
312296 }
313297 }
314298
315- /// Representation of new items in an order.
316- ///
317- struct NewOrderItem : Equatable , Identifiable {
318- let id : String
319- let productID : Int64
320- let variationID : Int64
321- var quantity : Decimal
322- let price : NSDecimalNumber
323- var subtotal : String {
324- String ( describing: quantity * price. decimalValue)
325- }
326-
327- var orderItem : OrderItem {
328- OrderItem ( itemID: 0 ,
329- name: " " ,
330- productID: productID,
331- variationID: variationID,
332- quantity: quantity,
333- price: price,
334- sku: nil ,
335- subtotal: subtotal,
336- subtotalTax: " " ,
337- taxClass: " " ,
338- taxes: [ ] ,
339- total: " " ,
340- totalTax: " " ,
341- attributes: [ ] )
342- }
343-
344- init ( product: Product , quantity: Decimal ) {
345- self . id = UUID ( ) . uuidString
346- self . productID = product. productID
347- self . variationID = 0 // Products in an order are represented in Core with a variation ID of 0
348- self . quantity = quantity
349- self . price = NSDecimalNumber ( string: product. price)
350- }
351-
352- init ( variation: ProductVariation , quantity: Decimal ) {
353- self . id = UUID ( ) . uuidString
354- self . productID = variation. productID
355- self . variationID = variation. productVariationID
356- self . quantity = quantity
357- self . price = NSDecimalNumber ( string: variation. price)
358- }
359- }
360-
361299 /// Representation of customer data display properties
362300 ///
363301 struct CustomerDataViewModel {
@@ -581,6 +519,23 @@ private extension NewOrderViewModel {
581519 // Return a new input with the new quantity but with the same item id to properly reference the update.
582520 return OrderSyncProductInput ( id: item. itemID, product: product, quantity: quantity)
583521 }
522+
523+ /// Creates a `ProductInOrderViewModel` based on the provided order item id.
524+ ///
525+ func createSelectedProductViewModel( itemID: Int64 ) -> ProductInOrderViewModel ? {
526+ // Find order item based on the provided id.
527+ // Creates the product row view model needed for `ProductInOrderViewModel`.
528+ guard
529+ let orderItem = orderSynchronizer. order. items. first ( where: { $0. itemID == itemID } ) ,
530+ let rowViewModel = createProductRowViewModel ( for: orderItem, canChangeQuantity: false )
531+ else {
532+ return nil
533+ }
534+
535+ return ProductInOrderViewModel ( productRowViewModel: rowViewModel) { [ weak self] in
536+ self ? . removeItemFromOrder ( orderItem)
537+ }
538+ }
584539}
585540
586541private extension NewOrderViewModel {
0 commit comments