Skip to content

Commit df467ff

Browse files
committed
Update sample apps
1 parent 28d1f12 commit df467ff

File tree

1 file changed

+100
-65
lines changed
  • Samples/ShopifyAcceleratedCheckoutsApp/ShopifyAcceleratedCheckoutsApp/Views/Components

1 file changed

+100
-65
lines changed

Samples/ShopifyAcceleratedCheckoutsApp/ShopifyAcceleratedCheckoutsApp/Views/Components/ButtonSet.swift

Lines changed: 100 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -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

138173
private struct CheckoutSection<Content: View>: View {

0 commit comments

Comments
 (0)