@@ -2,11 +2,15 @@ import SwiftUI
2
2
3
3
@available ( iOS 17 . 0 , * )
4
4
struct PointOfSaleEntryPointView : View {
5
- @State private var posModel : PointOfSaleAggregateModel
5
+ @State private var posModel : PointOfSaleAggregateModel ?
6
6
@StateObject private var posModalManager = POSModalManager ( )
7
7
@Environment ( \. horizontalSizeClass) private var horizontalSizeClass
8
8
9
9
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
10
14
11
15
init ( itemsController: PointOfSaleItemsControllerProtocol ,
12
16
onPointOfSaleModeActiveStateChange: @escaping ( ( Bool ) -> Void ) ,
@@ -15,26 +19,39 @@ struct PointOfSaleEntryPointView: View {
15
19
collectOrderPaymentAnalyticsTracker: POSCollectOrderPaymentAnalyticsTracking ) {
16
20
self . onPointOfSaleModeActiveStateChange = onPointOfSaleModeActiveStateChange
17
21
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
25
26
}
26
27
27
28
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
+ }
29
47
. environmentObject ( posModalManager)
30
- . environment ( posModel)
31
48
. onAppear {
32
49
onPointOfSaleModeActiveStateChange ( true )
33
50
}
34
51
. onDisappear {
35
52
onPointOfSaleModeActiveStateChange ( false )
36
53
posModalManager. onDisappear ( )
37
- posModel. pointOfSaleClosed ( )
54
+ posModel? . pointOfSaleClosed ( )
38
55
}
39
56
}
40
57
}
0 commit comments