@@ -2,11 +2,15 @@ import SwiftUI
22
33@available ( iOS 17 . 0 , * )
44struct 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