@@ -34,49 +34,28 @@ struct ButtonSet: View {
3434 @State private var cartRenderState : RenderState = . loading
3535 @State private var variantRenderState : RenderState = . loading
3636
37+ // Create CheckoutDelegate implementations
38+ private var cartCheckoutDelegate : CheckoutDelegate {
39+ CartCheckoutDelegate ( onComplete: onComplete)
40+ }
41+
42+ private var variantCheckoutDelegate : CheckoutDelegate {
43+ VariantCheckoutDelegate ( )
44+ }
45+
3746 var body : some View {
3847 VStack ( spacing: 16 ) {
3948 if let cartID = cart? . id {
4049 CheckoutSection (
4150 title: " AcceleratedCheckoutButtons(cartID:) " ,
4251 renderState: $cartRenderState
4352 ) {
44- // Cart-based checkout example with event handlers
53+ // Cart-based checkout example with CheckoutDelegate
4554 AcceleratedCheckoutButtons ( cartID: cartID)
4655 . applePayLabel ( . plain)
47- . onComplete { event in
48- print (
49- " ✅ Checkout completed successfully. Order ID: \( event. orderDetails. id) "
50- )
51- onComplete ( )
52- }
53- . onFail { error in
54- print ( " ❌ Checkout failed: \( error) " )
55- }
56- . onCancel {
57- print ( " 🚫 Checkout cancelled " )
58- }
59- . onShouldRecoverFromError { error in
60- print ( " 🔄 Should recover from error: \( error) " )
61- // Return true to attempt recovery, false to fail
62- return true
63- }
64- . onClickLink { url in
65- print ( " 🔗 Link clicked: \( url) " )
66- }
67- . onWebPixelEvent { event in
68- let eventName : String = {
69- switch event {
70- case let . customEvent( customEvent) :
71- return customEvent. name ?? " Unknown custom event "
72- case let . standardEvent( standardEvent) :
73- return standardEvent. name ?? " Unknown standard event "
74- }
75- } ( )
76- print ( " 📊 Web pixel event: \( eventName) " )
77- }
78- . onRenderStateChange {
79- cartRenderState = $0
56+ . checkout ( delegate: cartCheckoutDelegate)
57+ . onRenderStateChange { state in
58+ cartRenderState = state
8059 }
8160 }
8261 }
@@ -88,51 +67,107 @@ struct ButtonSet: View {
8867 title: " AcceleratedCheckoutButtons(variantID: quantity:) " ,
8968 renderState: $variantRenderState
9069 ) {
91- // Variant-based checkout with separate handlers and custom corner radius
70+ // Variant-based checkout with CheckoutDelegate and custom corner radius
9271 AcceleratedCheckoutButtons (
9372 variantID: productVariant. id,
9473 quantity: firstVariantQuantity
9574 )
9675 . applePayLabel ( . buy)
9776 . cornerRadius ( 24 )
9877 . wallets ( [ . applePay, . shopPay] )
99- . onComplete { event in
100- print ( " ✅ Variant checkout completed " )
101- print ( " Order ID: \( event. orderDetails. id) " )
102- }
103- . onFail { error in
104- print ( " ❌ Variant checkout failed: \( error) " )
105- }
106- . onCancel {
107- print ( " 🚫 Variant checkout cancelled " )
108- }
109- . onShouldRecoverFromError { error in
110- print ( " 🔄 Variant - Should recover from error: \( error) " )
111- return false // Example: don't recover for variant checkout
112- }
113- . onClickLink { url in
114- print ( " 🔗 Variant - Link clicked: \( url) " )
115- }
116- . onWebPixelEvent { event in
117- let eventName : String = {
118- switch event {
119- case let . customEvent( customEvent) :
120- return customEvent. name ?? " Unknown custom event "
121- case let . standardEvent( standardEvent) :
122- return standardEvent. name ?? " Unknown standard event "
123- }
124- } ( )
125- print ( " 📊 Variant - Web pixel event: \( eventName) " )
126- }
127- . onRenderStateChange {
128- variantRenderState = $0
78+ . checkout ( delegate: variantCheckoutDelegate)
79+ . onRenderStateChange { state in
80+ variantRenderState = state
12981 }
13082 }
13183 }
13284 }
13385 }
13486}
13587
88+ // MARK: - CheckoutDelegate Implementations
89+
90+ /// CheckoutDelegate implementation for cart-based checkout
91+ class CartCheckoutDelegate : CheckoutDelegate {
92+ private let onComplete : ( ) -> Void
93+
94+ init ( onComplete: @escaping ( ) -> Void ) {
95+ self . onComplete = onComplete
96+ }
97+
98+ func checkoutDidComplete( event: CheckoutCompletedEvent ) {
99+ print ( " ✅ Checkout completed successfully. Order ID: \( event. orderDetails. id) " )
100+ onComplete ( )
101+ }
102+
103+ func checkoutDidFail( error: CheckoutError ) {
104+ print ( " ❌ Checkout failed: \( error) " )
105+ }
106+
107+ func checkoutDidCancel( ) {
108+ print ( " 🚫 Checkout cancelled " )
109+ }
110+
111+ func shouldRecoverFromError( error: CheckoutError ) -> Bool {
112+ print ( " 🔄 Should recover from error: \( error) " )
113+ // Return true to attempt recovery, false to fail
114+ return true
115+ }
116+
117+ func checkoutDidClickLink( url: URL ) {
118+ print ( " 🔗 Link clicked: \( url) " )
119+ }
120+
121+ func checkoutDidEmitWebPixelEvent( event: PixelEvent ) {
122+ let eventName : String = {
123+ switch event {
124+ case let . customEvent( customEvent) :
125+ return customEvent. name ?? " Unknown custom event "
126+ case let . standardEvent( standardEvent) :
127+ return standardEvent. name ?? " Unknown standard event "
128+ }
129+ } ( )
130+ print ( " 📊 Web pixel event: \( eventName) " )
131+ }
132+ }
133+
134+ /// CheckoutDelegate implementation for variant-based checkout
135+ class VariantCheckoutDelegate : CheckoutDelegate {
136+ func checkoutDidComplete( event: CheckoutCompletedEvent ) {
137+ print ( " ✅ Variant checkout completed " )
138+ print ( " Order ID: \( event. orderDetails. id) " )
139+ }
140+
141+ func checkoutDidFail( error: CheckoutError ) {
142+ print ( " ❌ Variant checkout failed: \( error) " )
143+ }
144+
145+ func checkoutDidCancel( ) {
146+ print ( " 🚫 Variant checkout cancelled " )
147+ }
148+
149+ func shouldRecoverFromError( error: CheckoutError ) -> Bool {
150+ print ( " 🔄 Variant - Should recover from error: \( error) " )
151+ return false // Example: don't recover for variant checkout
152+ }
153+
154+ func checkoutDidClickLink( url: URL ) {
155+ print ( " 🔗 Variant - Link clicked: \( url) " )
156+ }
157+
158+ func checkoutDidEmitWebPixelEvent( event: PixelEvent ) {
159+ let eventName : String = {
160+ switch event {
161+ case let . customEvent( customEvent) :
162+ return customEvent. name ?? " Unknown custom event "
163+ case let . standardEvent( standardEvent) :
164+ return standardEvent. name ?? " Unknown standard event "
165+ }
166+ } ( )
167+ print ( " 📊 Variant - Web pixel event: \( eventName) " )
168+ }
169+ }
170+
136171// MARK: - Local Components
137172
138173private struct CheckoutSection < Content: View > : View {
0 commit comments