Skip to content

Commit a140b84

Browse files
authored
[Woo POS] Create POS Aggregate Model in a task (#15218)
2 parents c4f0fb7 + 77dc305 commit a140b84

File tree

1 file changed

+28
-11
lines changed

1 file changed

+28
-11
lines changed

WooCommerce/Classes/POS/Presentation/PointOfSaleEntryPointView.swift

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,15 @@ import SwiftUI
22

33
@available(iOS 17.0, *)
44
struct PointOfSaleEntryPointView: View {
5-
@State private var posModel: PointOfSaleAggregateModel
5+
@State private var posModel: PointOfSaleAggregateModel?
66
@StateObject private var posModalManager = POSModalManager()
77
@Environment(\.horizontalSizeClass) private var horizontalSizeClass
88

99
private let onPointOfSaleModeActiveStateChange: ((Bool) -> Void)
10+
private let itemsController: PointOfSaleItemsControllerProtocol
11+
private let cardPresentPaymentService: CardPresentPaymentFacade
12+
private let orderController: PointOfSaleOrderControllerProtocol
13+
private let collectOrderPaymentAnalyticsTracker: POSCollectOrderPaymentAnalyticsTracking
1014

1115
init(itemsController: PointOfSaleItemsControllerProtocol,
1216
onPointOfSaleModeActiveStateChange: @escaping ((Bool) -> Void),
@@ -15,26 +19,39 @@ struct PointOfSaleEntryPointView: View {
1519
collectOrderPaymentAnalyticsTracker: POSCollectOrderPaymentAnalyticsTracking) {
1620
self.onPointOfSaleModeActiveStateChange = onPointOfSaleModeActiveStateChange
1721

18-
let posModel = PointOfSaleAggregateModel(
19-
itemsController: itemsController,
20-
cardPresentPaymentService: cardPresentPaymentService,
21-
orderController: orderController,
22-
collectOrderPaymentAnalyticsTracker: collectOrderPaymentAnalyticsTracker)
23-
24-
self._posModel = State(wrappedValue: posModel)
22+
self.itemsController = itemsController
23+
self.cardPresentPaymentService = cardPresentPaymentService
24+
self.orderController = orderController
25+
self.collectOrderPaymentAnalyticsTracker = collectOrderPaymentAnalyticsTracker
2526
}
2627

2728
var body: some View {
28-
PointOfSaleDashboardView()
29+
Group {
30+
if let posModel = posModel {
31+
PointOfSaleDashboardView()
32+
.environment(posModel)
33+
} else {
34+
PointOfSaleLoadingView()
35+
}
36+
}
37+
.task {
38+
// We create the posModel in a task, not init, to avoid creating multiple copies during the view's lifecycle.
39+
// Confusingly, init can be called more than once, but `task` matches the lifecycle.
40+
// See https://developer.apple.com/documentation/swiftui/state#Store-observable-objects for details.
41+
posModel = PointOfSaleAggregateModel(
42+
itemsController: itemsController,
43+
cardPresentPaymentService: cardPresentPaymentService,
44+
orderController: orderController,
45+
collectOrderPaymentAnalyticsTracker: collectOrderPaymentAnalyticsTracker)
46+
}
2947
.environmentObject(posModalManager)
30-
.environment(posModel)
3148
.onAppear {
3249
onPointOfSaleModeActiveStateChange(true)
3350
}
3451
.onDisappear {
3552
onPointOfSaleModeActiveStateChange(false)
3653
posModalManager.onDisappear()
37-
posModel.pointOfSaleClosed()
54+
posModel?.pointOfSaleClosed()
3855
}
3956
}
4057
}

0 commit comments

Comments
 (0)