Skip to content

Commit 3cbee10

Browse files
authored
[Woo POS][Historical Orders] Order List and Details Empty and Error States (Wireframe UI) (#16122)
2 parents a6a131f + b6996cd commit 3cbee10

34 files changed

+932
-368
lines changed
Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
11
import Foundation
22
import struct NetworkingCore.PagedItems
33

4-
public protocol PointOfSaleOrderListFetchStrategy {
4+
public protocol POSOrderListFetchStrategy {
55
func fetchOrders(pageNumber: Int) async throws -> PagedItems<POSOrder>
66
func loadOrder(orderID: Int64) async throws -> POSOrder
77
var supportsCaching: Bool { get }
88
var showsLoadingWithItems: Bool { get }
99
var id: String { get }
1010
}
1111

12-
extension PointOfSaleOrderListFetchStrategy {
12+
extension POSOrderListFetchStrategy {
1313
var id: String {
1414
String(describing: type(of: self))
1515
}
1616
}
1717

18-
struct PointOfSaleDefaultOrderListFetchStrategy: PointOfSaleOrderListFetchStrategy {
19-
private let orderListService: PointOfSaleOrderListServiceProtocol
18+
struct POSDefaultOrderListFetchStrategy: POSOrderListFetchStrategy {
19+
private let orderListService: POSOrderListServiceProtocol
2020
let supportsCaching: Bool = true
2121
var showsLoadingWithItems: Bool = true
2222

23-
init(orderListService: PointOfSaleOrderListServiceProtocol) {
23+
init(orderListService: POSOrderListServiceProtocol) {
2424
self.orderListService = orderListService
2525
}
2626

@@ -33,14 +33,14 @@ struct PointOfSaleDefaultOrderListFetchStrategy: PointOfSaleOrderListFetchStrate
3333
}
3434
}
3535

36-
struct PointOfSaleSearchOrderListFetchStrategy: PointOfSaleOrderListFetchStrategy {
37-
private let orderListService: PointOfSaleOrderListServiceProtocol
36+
struct POSSearchOrderListFetchStrategy: POSOrderListFetchStrategy {
37+
private let orderListService: POSOrderListServiceProtocol
3838
private let searchTerm: String
3939

4040
var supportsCaching: Bool = false
4141
var showsLoadingWithItems = false
4242

43-
init(orderListService: PointOfSaleOrderListServiceProtocol, searchTerm: String) {
43+
init(orderListService: POSOrderListServiceProtocol, searchTerm: String) {
4444
self.orderListService = orderListService
4545
self.searchTerm = searchTerm
4646
}
Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ import class Networking.AlamofireNetwork
33
import class Networking.OrdersRemote
44
import class WooFoundationCore.CurrencyFormatter
55

6-
public protocol PointOfSaleOrderListFetchStrategyFactoryProtocol {
7-
func defaultStrategy() -> PointOfSaleOrderListFetchStrategy
8-
func searchStrategy(searchTerm: String) -> PointOfSaleOrderListFetchStrategy
6+
public protocol POSOrderListFetchStrategyFactoryProtocol {
7+
func defaultStrategy() -> POSOrderListFetchStrategy
8+
func searchStrategy(searchTerm: String) -> POSOrderListFetchStrategy
99
}
1010

11-
public final class PointOfSaleOrderListFetchStrategyFactory: PointOfSaleOrderListFetchStrategyFactoryProtocol {
11+
public final class POSOrderListFetchStrategyFactory: POSOrderListFetchStrategyFactoryProtocol {
1212
private let siteID: Int64
1313
private let ordersRemote: OrdersRemote
1414
private let currencyFormatter: CurrencyFormatter
@@ -22,19 +22,19 @@ public final class PointOfSaleOrderListFetchStrategyFactory: PointOfSaleOrderLis
2222
self.currencyFormatter = currencyFormatter
2323
}
2424

25-
public func defaultStrategy() -> PointOfSaleOrderListFetchStrategy {
26-
PointOfSaleDefaultOrderListFetchStrategy(
27-
orderListService: PointOfSaleOrderListService(
25+
public func defaultStrategy() -> POSOrderListFetchStrategy {
26+
POSDefaultOrderListFetchStrategy(
27+
orderListService: POSOrderListService(
2828
siteID: siteID,
2929
ordersRemote: ordersRemote,
3030
currencyFormatter: currencyFormatter
3131
)
3232
)
3333
}
3434

35-
public func searchStrategy(searchTerm: String) -> PointOfSaleOrderListFetchStrategy {
36-
PointOfSaleSearchOrderListFetchStrategy(
37-
orderListService: PointOfSaleOrderListService(
35+
public func searchStrategy(searchTerm: String) -> POSOrderListFetchStrategy {
36+
POSSearchOrderListFetchStrategy(
37+
orderListService: POSOrderListService(
3838
siteID: siteID,
3939
ordersRemote: ordersRemote,
4040
currencyFormatter: currencyFormatter
Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import struct NetworkingCore.Order
55
import protocol NetworkingCore.POSOrdersRemoteProtocol
66
import class WooFoundationCore.CurrencyFormatter
77

8-
public final class PointOfSaleOrderListService: PointOfSaleOrderListServiceProtocol {
8+
public final class POSOrderListService: POSOrderListServiceProtocol {
99
private let ordersRemote: POSOrdersRemoteProtocol
1010
private let siteID: Int64
1111
private let mapper: POSOrderMapper
@@ -39,9 +39,9 @@ public final class PointOfSaleOrderListService: PointOfSaleOrderListServiceProto
3939
hasMorePages: pagedOrders.hasMorePages,
4040
totalItems: pagedOrders.totalItems)
4141
} catch AFError.explicitlyCancelled {
42-
throw PointOfSaleOrderListServiceError.requestCancelled
42+
throw POSOrderListServiceError.requestCancelled
4343
} catch {
44-
throw PointOfSaleOrderListServiceError.requestFailed
44+
throw POSOrderListServiceError.requestFailed
4545
}
4646
}
4747

@@ -65,9 +65,9 @@ public final class PointOfSaleOrderListService: PointOfSaleOrderListServiceProto
6565
hasMorePages: pagedOrders.hasMorePages,
6666
totalItems: pagedOrders.totalItems)
6767
} catch AFError.explicitlyCancelled {
68-
throw PointOfSaleOrderListServiceError.requestCancelled
68+
throw POSOrderListServiceError.requestCancelled
6969
} catch {
70-
throw PointOfSaleOrderListServiceError.requestFailed
70+
throw POSOrderListServiceError.requestFailed
7171
}
7272
}
7373

@@ -76,9 +76,9 @@ public final class PointOfSaleOrderListService: PointOfSaleOrderListServiceProto
7676
let order = try await ordersRemote.loadPOSOrder(siteID: siteID, orderID: orderID)
7777
return mapper.map(order: order)
7878
} catch AFError.explicitlyCancelled {
79-
throw PointOfSaleOrderListServiceError.requestCancelled
79+
throw POSOrderListServiceError.requestCancelled
8080
} catch {
81-
throw PointOfSaleOrderListServiceError.requestFailed
81+
throw POSOrderListServiceError.requestFailed
8282
}
8383
}
8484
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import Foundation
22
import struct NetworkingCore.PagedItems
33

4-
public enum PointOfSaleOrderListServiceError: Error, Equatable {
4+
public enum POSOrderListServiceError: Error, Equatable {
55
case requestFailed
66
case requestCancelled
77
}
88

9-
public protocol PointOfSaleOrderListServiceProtocol {
9+
public protocol POSOrderListServiceProtocol {
1010
func providePointOfSaleOrders(pageNumber: Int) async throws -> PagedItems<POSOrder>
1111
func searchPointOfSaleOrders(searchTerm: String, pageNumber: Int) async throws -> PagedItems<POSOrder>
1212
func loadOrder(orderID: Int64) async throws -> POSOrder

Modules/Tests/YosemiteTests/PointOfSale/PointOfSaleOrderServiceTests.swift renamed to Modules/Tests/YosemiteTests/PointOfSale/OrderList/POSOrderListServiceTests.swift

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@ import struct NetworkingCore.Order
55
import enum NetworkingCore.OrderStatusEnum
66
import WooFoundation
77

8-
final class PointOfSaleOrderServiceTests: XCTestCase {
8+
final class POSOrderListServiceTests: XCTestCase {
99
private let siteID: Int64 = 13092
10-
private var orderProvider: PointOfSaleOrderListServiceProtocol!
10+
private var orderProvider: POSOrderListServiceProtocol!
1111
private var mockOrdersRemote: MockPOSOrdersRemote!
1212

1313
override func setUp() {
1414
super.setUp()
1515
mockOrdersRemote = MockPOSOrdersRemote()
16-
orderProvider = PointOfSaleOrderListService(
16+
orderProvider = POSOrderListService(
1717
siteID: siteID,
1818
ordersRemote: mockOrdersRemote,
1919
currencyFormatter: CurrencyFormatter(currencySettings: CurrencySettings())
@@ -27,14 +27,14 @@ final class PointOfSaleOrderServiceTests: XCTestCase {
2727
}
2828

2929
func test_PointOfSaleOrderServiceProtocol_when_fails_request_with_requestFailed_then_throws_error() async throws {
30-
let expectedError = PointOfSaleOrderListServiceError.requestFailed
30+
let expectedError = POSOrderListServiceError.requestFailed
3131
mockOrdersRemote.mockPagedOrdersResult = .failure(expectedError)
3232

3333
do {
3434
_ = try await orderProvider.providePointOfSaleOrders(pageNumber: 1)
3535
XCTFail("Expected an error, but got success.")
3636
} catch {
37-
XCTAssertEqual(error as? PointOfSaleOrderListServiceError, expectedError)
37+
XCTAssertEqual(error as? POSOrderListServiceError, expectedError)
3838
}
3939
}
4040

@@ -111,7 +111,7 @@ final class PointOfSaleOrderServiceTests: XCTestCase {
111111
do {
112112
_ = try await orderProvider.providePointOfSaleOrders(pageNumber: 1)
113113
XCTFail("Expected error to be thrown")
114-
} catch PointOfSaleOrderListServiceError.requestFailed {
114+
} catch POSOrderListServiceError.requestFailed {
115115
// Expected
116116
} catch {
117117
XCTFail("Unexpected error occurred: \(error)")
@@ -144,7 +144,7 @@ final class PointOfSaleOrderServiceTests: XCTestCase {
144144
}
145145
}
146146

147-
private extension PointOfSaleOrderServiceTests {
147+
private extension POSOrderListServiceTests {
148148
enum TestError: Error {
149149
case expectedError
150150
}

WooCommerce/Classes/POS/Controllers/PointOfSaleOrderListController.swift renamed to WooCommerce/Classes/POS/Controllers/POSOrderListController.swift

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import Foundation
22
import Observation
3-
import enum Yosemite.PointOfSaleOrderListServiceError
4-
import protocol Yosemite.PointOfSaleOrderListServiceProtocol
5-
import protocol Yosemite.PointOfSaleOrderListFetchStrategyFactoryProtocol
6-
import protocol Yosemite.PointOfSaleOrderListFetchStrategy
3+
import enum Yosemite.POSOrderListServiceError
4+
import protocol Yosemite.POSOrderListServiceProtocol
5+
import protocol Yosemite.POSOrderListFetchStrategyFactoryProtocol
6+
import protocol Yosemite.POSOrderListFetchStrategy
77
import struct Yosemite.POSOrder
88
import struct Yosemite.POSOrderItem
99
import struct Yosemite.POSOrderRefund
1010
import class Yosemite.Store
1111

12-
protocol PointOfSaleOrderListControllerProtocol {
12+
protocol POSOrderListControllerProtocol {
1313
var ordersViewState: POSOrderListState { get }
1414
var selectedOrder: POSOrder? { get }
1515
func loadOrders() async
@@ -19,18 +19,18 @@ protocol PointOfSaleOrderListControllerProtocol {
1919
func updateOrder(orderID: Int64) async throws
2020
}
2121

22-
protocol PointOfSaleSearchingOrderListControllerProtocol: PointOfSaleOrderListControllerProtocol {
22+
protocol POSSearchingOrderListControllerProtocol: POSOrderListControllerProtocol {
2323
func searchOrders(searchTerm: String) async
2424
func clearSearchOrders()
2525
}
2626

27-
@Observable final class PointOfSaleOrderListController: PointOfSaleSearchingOrderListControllerProtocol {
27+
@Observable final class POSOrderListController: POSSearchingOrderListControllerProtocol {
2828
var ordersViewState: POSOrderListState
2929
private var strategyPaginationTracker: [String: AsyncPaginationTracker] = [:]
30-
private var fetchStrategy: PointOfSaleOrderListFetchStrategy
30+
private var fetchStrategy: POSOrderListFetchStrategy
3131
private var cachedOrders: [POSOrder] = []
3232
private(set) var selectedOrder: POSOrder?
33-
private let orderListFetchStrategyFactory: PointOfSaleOrderListFetchStrategyFactoryProtocol
33+
private let orderListFetchStrategyFactory: POSOrderListFetchStrategyFactoryProtocol
3434
private var paginationTracker: AsyncPaginationTracker {
3535
if let existing = strategyPaginationTracker[fetchStrategy.id] {
3636
return existing
@@ -40,7 +40,7 @@ protocol PointOfSaleSearchingOrderListControllerProtocol: PointOfSaleOrderListCo
4040
return tracker
4141
}
4242

43-
init(orderListFetchStrategyFactory: PointOfSaleOrderListFetchStrategyFactoryProtocol,
43+
init(orderListFetchStrategyFactory: POSOrderListFetchStrategyFactoryProtocol,
4444
initialState: POSOrderListState = .loading([])) {
4545
self.ordersViewState = initialState
4646
self.orderListFetchStrategyFactory = orderListFetchStrategyFactory
@@ -133,7 +133,7 @@ protocol PointOfSaleSearchingOrderListControllerProtocol: PointOfSaleOrderListCo
133133
}
134134

135135
return pagedOrders.hasMorePages
136-
} catch PointOfSaleOrderListServiceError.requestCancelled {
136+
} catch POSOrderListServiceError.requestCancelled {
137137
return true
138138
}
139139
}

WooCommerce/Classes/POS/Models/PointOfSaleOrderListModel.swift renamed to WooCommerce/Classes/POS/Models/POSOrderListModel.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ import Foundation
22
import Observation
33
import struct Yosemite.POSOrder
44

5-
@Observable final class PointOfSaleOrderListModel {
6-
let ordersController: PointOfSaleSearchingOrderListControllerProtocol
5+
@Observable final class POSOrderListModel {
6+
let ordersController: POSSearchingOrderListControllerProtocol
77
let receiptSender: POSReceiptSending
88

9-
init(ordersController: PointOfSaleSearchingOrderListControllerProtocol,
9+
init(ordersController: POSSearchingOrderListControllerProtocol,
1010
receiptSender: POSReceiptSending) {
1111
self.ordersController = ordersController
1212
self.receiptSender = receiptSender

WooCommerce/Classes/POS/Presentation/CardReaderConnection/UI States/PointOfSaleItemListEmptyView.swift

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,25 @@
11
import SwiftUI
22

3-
struct PointOfSaleItemListEmptyView: View {
3+
protocol POSEmptyViewModelProtocol {
4+
var title: String { get }
5+
var subtitle: String { get }
6+
var hint: String? { get }
7+
var buttonTitle: String? { get }
8+
var iconName: String { get }
9+
}
10+
11+
struct POSListEmptyView: View {
412
@Environment(\.dynamicTypeSize) private var dynamicTypeSize
513
@Environment(\.floatingControlAreaSize) private var floatingControlAreaSize: CGSize
6-
private let viewModel: PointOfSaleItemListEmptyViewModel
14+
private let viewModel: any POSEmptyViewModelProtocol
715

816
private let onAction: (() -> Void)?
917

1018
@State private var viewWidth: CGFloat = 0
1119

1220
@Environment(\.keyboardObserver) private var keyboard
1321

14-
init(viewModel: PointOfSaleItemListEmptyViewModel, onAction: (() -> Void)? = nil) {
22+
init(viewModel: any POSEmptyViewModelProtocol, onAction: (() -> Void)? = nil) {
1523
self.viewModel = viewModel
1624
self.onAction = onAction
1725
}
@@ -84,7 +92,7 @@ struct PointOfSaleItemListEmptyView: View {
8492
}
8593
}
8694

87-
private extension PointOfSaleItemListEmptyView {
95+
private extension POSListEmptyView {
8896
enum Constants {
8997
static let iconSize: CGFloat = 88
9098
}
@@ -243,7 +251,7 @@ struct PointOfSaleItemListEmptyViewModel {
243251
// MARK: - Preview
244252

245253
#Preview {
246-
PointOfSaleItemListEmptyView(
254+
POSListEmptyView(
247255
viewModel: PointOfSaleItemListEmptyViewModel(
248256
itemListType: .coupons(search: false),
249257
baseItem: .root
@@ -252,10 +260,14 @@ struct PointOfSaleItemListEmptyViewModel {
252260
}
253261

254262
#Preview {
255-
PointOfSaleItemListEmptyView(
263+
POSListEmptyView(
256264
viewModel: PointOfSaleItemListEmptyViewModel(
257265
itemListType: .products(search: true),
258266
baseItem: .root
259267
)
260268
) {}
261269
}
270+
271+
// MARK: - Protocol Conformance
272+
273+
extension PointOfSaleItemListEmptyViewModel: POSEmptyViewModelProtocol {}

WooCommerce/Classes/POS/Presentation/CardReaderConnection/UI States/PointOfSaleItemListFullscreenErrorView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ struct PointOfSaleItemListFullscreenErrorView: View {
1212

1313
var body: some View {
1414
PointOfSaleItemListFullscreenView {
15-
PointOfSaleItemListErrorView(error: error, onAction: onAction)
15+
POSListErrorView(error: error, onAction: onAction)
1616
}
1717
}
1818
}

WooCommerce/Classes/POS/Presentation/CardReaderConnection/UI States/PointOfSaleItemListFullscreenView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ private enum Localization {
3030
#Preview {
3131
PointOfSaleItemListFullscreenView(
3232
content: {
33-
PointOfSaleItemListErrorView(
33+
POSListErrorView(
3434
error: .init(errorType: .productsLoadError, title: "Error", subtitle: "Something went wrong", buttonText: "Fix it"))
3535
})
3636
}

0 commit comments

Comments
 (0)