Skip to content

Commit d3f2e23

Browse files
committed
Merge branch 'trunk' into woomob-1136-woo-poshistorical-orders-order-list-empty-loading-and-error
2 parents 1b37a57 + a6a131f commit d3f2e23

23 files changed

+615
-30
lines changed

Modules/Sources/NetworkingCore/Remote/OrdersRemote.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -598,6 +598,24 @@ public extension OrdersRemote {
598598
case customerID
599599
case currency
600600
}
601+
602+
/// Loads a single order asynchronously for POS
603+
/// - Parameters:
604+
/// - siteID: Site for which we'll fetch the order.
605+
/// - orderID: ID of the order to load.
606+
/// - Returns: The loaded Order.
607+
/// - Throws: Network or parsing errors.
608+
func loadPOSOrder(siteID: Int64, orderID: Int64) async throws -> Order {
609+
let path = "\(Constants.ordersPath)/\(orderID)"
610+
let request = JetpackRequest(wooApiVersion: .mark3,
611+
method: .get,
612+
siteID: siteID,
613+
path: path,
614+
availableAsRESTRequest: true)
615+
let mapper = OrderMapper(siteID: siteID)
616+
617+
return try await enqueue(request, mapper: mapper)
618+
}
601619
}
602620

603621
private extension OrdersRemote.OrderCreationSource {

Modules/Sources/NetworkingCore/Remote/POSOrdersRemoteProtocol.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ public protocol POSOrdersRemoteProtocol {
1919
order: Order,
2020
fields: [OrdersRemote.CreateOrderField]) async throws -> Order
2121

22+
func loadPOSOrder(siteID: Int64, orderID: Int64) async throws -> Order
23+
2224
func loadPOSOrders(siteID: Int64,
2325
pageNumber: Int,
2426
pageSize: Int) async throws -> PagedItems<Order>

Modules/Sources/Yosemite/Model/Copiable/Models+Copiable.generated.swift

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@ import Codegen
44
import Foundation
55
import Networking
66
import WooFoundation
7+
import enum NetworkingCore.OrderStatusEnum
8+
import struct NetworkingCore.Address
9+
import struct NetworkingCore.MetaData
10+
import struct NetworkingCore.Order
11+
import struct NetworkingCore.OrderItem
12+
import struct NetworkingCore.OrderRefundCondensed
713

814

915
extension Yosemite.JustInTimeMessage {
@@ -51,6 +57,60 @@ extension Yosemite.JustInTimeMessage {
5157
}
5258
}
5359

60+
extension Yosemite.POSOrder {
61+
public func copy(
62+
id: CopiableProp<Int64> = .copy,
63+
number: CopiableProp<String> = .copy,
64+
dateCreated: CopiableProp<Date> = .copy,
65+
status: CopiableProp<OrderStatusEnum> = .copy,
66+
formattedTotal: CopiableProp<String> = .copy,
67+
formattedSubtotal: CopiableProp<String> = .copy,
68+
customerEmail: NullableCopiableProp<String> = .copy,
69+
paymentMethodID: CopiableProp<String> = .copy,
70+
paymentMethodTitle: CopiableProp<String> = .copy,
71+
lineItems: CopiableProp<[POSOrderItem]> = .copy,
72+
refunds: CopiableProp<[POSOrderRefund]> = .copy,
73+
formattedDiscountTotal: NullableCopiableProp<String> = .copy,
74+
formattedTotalTax: CopiableProp<String> = .copy,
75+
formattedPaymentTotal: CopiableProp<String> = .copy,
76+
formattedNetAmount: NullableCopiableProp<String> = .copy
77+
) -> Yosemite.POSOrder {
78+
let id = id ?? self.id
79+
let number = number ?? self.number
80+
let dateCreated = dateCreated ?? self.dateCreated
81+
let status = status ?? self.status
82+
let formattedTotal = formattedTotal ?? self.formattedTotal
83+
let formattedSubtotal = formattedSubtotal ?? self.formattedSubtotal
84+
let customerEmail = customerEmail ?? self.customerEmail
85+
let paymentMethodID = paymentMethodID ?? self.paymentMethodID
86+
let paymentMethodTitle = paymentMethodTitle ?? self.paymentMethodTitle
87+
let lineItems = lineItems ?? self.lineItems
88+
let refunds = refunds ?? self.refunds
89+
let formattedDiscountTotal = formattedDiscountTotal ?? self.formattedDiscountTotal
90+
let formattedTotalTax = formattedTotalTax ?? self.formattedTotalTax
91+
let formattedPaymentTotal = formattedPaymentTotal ?? self.formattedPaymentTotal
92+
let formattedNetAmount = formattedNetAmount ?? self.formattedNetAmount
93+
94+
return Yosemite.POSOrder(
95+
id: id,
96+
number: number,
97+
dateCreated: dateCreated,
98+
status: status,
99+
formattedTotal: formattedTotal,
100+
formattedSubtotal: formattedSubtotal,
101+
customerEmail: customerEmail,
102+
paymentMethodID: paymentMethodID,
103+
paymentMethodTitle: paymentMethodTitle,
104+
lineItems: lineItems,
105+
refunds: refunds,
106+
formattedDiscountTotal: formattedDiscountTotal,
107+
formattedTotalTax: formattedTotalTax,
108+
formattedPaymentTotal: formattedPaymentTotal,
109+
formattedNetAmount: formattedNetAmount
110+
)
111+
}
112+
}
113+
54114
extension Yosemite.POSSimpleProduct {
55115
public func copy(
56116
id: CopiableProp<UUID> = .copy,

Modules/Sources/Yosemite/PointOfSale/OrderList/POSOrder.swift

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import Foundation
2+
import Codegen
23
import struct NetworkingCore.Address
34
import struct NetworkingCore.OrderItem
45
import struct NetworkingCore.OrderRefundCondensed
56
import struct NetworkingCore.MetaData
67
import enum NetworkingCore.OrderStatusEnum
78
import struct NetworkingCore.Order
89

9-
public struct POSOrder: Equatable, Hashable {
10+
public struct POSOrder: Equatable, Hashable, GeneratedCopiable {
1011
public let id: Int64
1112
public let number: String
1213
public let dateCreated: Date
@@ -34,8 +35,8 @@ public struct POSOrder: Equatable, Hashable {
3435
paymentMethodTitle: String,
3536
lineItems: [POSOrderItem] = [],
3637
refunds: [POSOrderRefund] = [],
37-
formattedTotalTax: String,
3838
formattedDiscountTotal: String?,
39+
formattedTotalTax: String,
3940
formattedPaymentTotal: String,
4041
formattedNetAmount: String? = nil) {
4142
self.id = id
@@ -49,8 +50,8 @@ public struct POSOrder: Equatable, Hashable {
4950
self.paymentMethodTitle = paymentMethodTitle
5051
self.lineItems = lineItems
5152
self.refunds = refunds
52-
self.formattedTotalTax = formattedTotalTax
5353
self.formattedDiscountTotal = formattedDiscountTotal
54+
self.formattedTotalTax = formattedTotalTax
5455
self.formattedPaymentTotal = formattedPaymentTotal
5556
self.formattedNetAmount = formattedNetAmount
5657
}

Modules/Sources/Yosemite/PointOfSale/OrderList/POSOrderMapper.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ struct POSOrderMapper {
4545
paymentMethodTitle: order.paymentMethodTitle,
4646
lineItems: posLineItems,
4747
refunds: posRefunds,
48-
formattedTotalTax: currencyFormatter.formatAmount(order.totalTax, with: order.currency) ?? "",
4948
formattedDiscountTotal: formattedDiscountTotal,
49+
formattedTotalTax: currencyFormatter.formatAmount(order.totalTax, with: order.currency) ?? "",
5050
formattedPaymentTotal: order.paymentTotal(currencyFormatter: currencyFormatter),
5151
formattedNetAmount: formattedNetAmount
5252
)

Modules/Sources/Yosemite/PointOfSale/OrderList/PointOfSaleOrderListFetchStrategy.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import struct NetworkingCore.PagedItems
33

44
public protocol PointOfSaleOrderListFetchStrategy {
55
func fetchOrders(pageNumber: Int) async throws -> PagedItems<POSOrder>
6+
func loadOrder(orderID: Int64) async throws -> POSOrder
67
var supportsCaching: Bool { get }
78
var showsLoadingWithItems: Bool { get }
89
var id: String { get }
@@ -26,6 +27,10 @@ struct PointOfSaleDefaultOrderListFetchStrategy: PointOfSaleOrderListFetchStrate
2627
func fetchOrders(pageNumber: Int) async throws -> PagedItems<POSOrder> {
2728
try await orderListService.providePointOfSaleOrders(pageNumber: pageNumber)
2829
}
30+
31+
func loadOrder(orderID: Int64) async throws -> POSOrder {
32+
try await orderListService.loadOrder(orderID: orderID)
33+
}
2934
}
3035

3136
struct PointOfSaleSearchOrderListFetchStrategy: PointOfSaleOrderListFetchStrategy {
@@ -43,4 +48,8 @@ struct PointOfSaleSearchOrderListFetchStrategy: PointOfSaleOrderListFetchStrateg
4348
func fetchOrders(pageNumber: Int) async throws -> PagedItems<POSOrder> {
4449
try await orderListService.searchPointOfSaleOrders(searchTerm: searchTerm, pageNumber: pageNumber)
4550
}
51+
52+
func loadOrder(orderID: Int64) async throws -> POSOrder {
53+
try await orderListService.loadOrder(orderID: orderID)
54+
}
4655
}

Modules/Sources/Yosemite/PointOfSale/OrderList/PointOfSaleOrderListService.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,4 +70,15 @@ public final class PointOfSaleOrderListService: PointOfSaleOrderListServiceProto
7070
throw PointOfSaleOrderListServiceError.requestFailed
7171
}
7272
}
73+
74+
public func loadOrder(orderID: Int64) async throws -> POSOrder {
75+
do {
76+
let order = try await ordersRemote.loadPOSOrder(siteID: siteID, orderID: orderID)
77+
return mapper.map(order: order)
78+
} catch AFError.explicitlyCancelled {
79+
throw PointOfSaleOrderListServiceError.requestCancelled
80+
} catch {
81+
throw PointOfSaleOrderListServiceError.requestFailed
82+
}
83+
}
7384
}

Modules/Sources/Yosemite/PointOfSale/OrderList/PointOfSaleOrderListServiceProtocol.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ public enum PointOfSaleOrderListServiceError: Error, Equatable {
99
public protocol PointOfSaleOrderListServiceProtocol {
1010
func providePointOfSaleOrders(pageNumber: Int) async throws -> PagedItems<POSOrder>
1111
func searchPointOfSaleOrders(searchTerm: String, pageNumber: Int) async throws -> PagedItems<POSOrder>
12+
func loadOrder(orderID: Int64) async throws -> POSOrder
1213
}

Modules/Tests/YosemiteTests/Mocks/MockPOSOrdersRemote.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,4 +91,21 @@ final class MockPOSOrdersRemote: POSOrdersRemoteProtocol {
9191
throw error
9292
}
9393
}
94+
95+
var loadPOSOrderCalled = false
96+
var spyLoadPOSOrderID: Int64?
97+
var loadPOSOrderResult: Result<Order, Error> = .success(Order.fake())
98+
99+
func loadPOSOrder(siteID: Int64, orderID: Int64) async throws -> Order {
100+
loadPOSOrderCalled = true
101+
spySiteID = siteID
102+
spyLoadPOSOrderID = orderID
103+
104+
switch loadPOSOrderResult {
105+
case .success(let order):
106+
return order
107+
case .failure(let error):
108+
throw error
109+
}
110+
}
94111
}

WooCommerce/Classes/POS/Controllers/PointOfSaleOrderListController.swift

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ protocol PointOfSaleOrderListControllerProtocol {
1616
func refreshOrders() async
1717
func loadNextOrders() async
1818
func selectOrder(_ order: POSOrder?)
19+
func updateOrder(orderID: Int64) async throws
1920
}
2021

2122
protocol PointOfSaleSearchingOrderListControllerProtocol: PointOfSaleOrderListControllerProtocol {
@@ -122,6 +123,11 @@ protocol PointOfSaleSearchingOrderListControllerProtocol: PointOfSaleOrderListCo
122123

123124
ordersViewState = allOrders.isEmpty ? .empty : .loaded(allOrders, hasMoreItems: pagedOrders.hasMorePages)
124125

126+
if let selectedOrderID = selectedOrder?.id,
127+
let updatedSelectedOrder = allOrders.first(where: { $0.id == selectedOrderID }) {
128+
selectedOrder = updatedSelectedOrder
129+
}
130+
125131
if fetchStrategy.supportsCaching {
126132
cachedOrders = allOrders
127133
}
@@ -169,4 +175,21 @@ protocol PointOfSaleSearchingOrderListControllerProtocol: PointOfSaleOrderListCo
169175
}
170176
}
171177
}
178+
179+
@MainActor
180+
func updateOrder(orderID: Int64) async throws {
181+
let updatedOrder = try await fetchStrategy.loadOrder(orderID: orderID)
182+
let updatedOrders = ordersViewState.orders.map { order in
183+
order.id == orderID ? updatedOrder : order
184+
}
185+
186+
ordersViewState = ordersViewState.updatingOrders(with: updatedOrders)
187+
cachedOrders = cachedOrders.map { order in
188+
order.id == orderID ? updatedOrder : order
189+
}
190+
191+
if selectedOrder?.id == orderID {
192+
selectedOrder = updatedOrder
193+
}
194+
}
172195
}

0 commit comments

Comments
 (0)