Skip to content

Commit ce5878a

Browse files
committed
Improvements
1 parent 2c14d9f commit ce5878a

6 files changed

Lines changed: 64 additions & 40 deletions

File tree

modules/@shopify/checkout-sheet-kit/ios/AcceleratedCheckoutButtons.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ class RCTAcceleratedCheckoutButtonsManager: RCTViewManager {
6161
return RCTAcceleratedCheckoutButtonsView()
6262
}
6363

64-
// Return an empty view for iOS < 17.0 (silent fallback)
64+
// Return an empty view for iOS < 16.0 (silent fallback)
6565
return UIView()
6666
}
6767

modules/@shopify/checkout-sheet-kit/ios/ShopifyCheckoutSheetKit.swift

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -240,11 +240,19 @@ class RCTShopifyCheckoutSheetKit: RCTEventEmitter, CheckoutDelegate {
240240
)
241241

242242
if let merchantIdentifier = applePayMerchantIdentifier, let contactFields = applyPayContactFields {
243-
acceleratedCheckoutsApplePayConfiguration = ShopifyAcceleratedCheckouts.ApplePayConfiguration(
244-
merchantIdentifier: merchantIdentifier,
245-
contactFields: contactFieldsToRequiredContactFields(contactFields)
246-
)
247-
AcceleratedCheckoutConfiguration.shared.applePayConfiguration = acceleratedCheckoutsApplePayConfiguration as? ShopifyAcceleratedCheckouts.ApplePayConfiguration
243+
do {
244+
let fields = try contactFieldsToRequiredContactFields(contactFields)
245+
246+
acceleratedCheckoutsApplePayConfiguration = ShopifyAcceleratedCheckouts.ApplePayConfiguration(
247+
merchantIdentifier: merchantIdentifier,
248+
contactFields: fields
249+
)
250+
251+
AcceleratedCheckoutConfiguration.shared.applePayConfiguration = acceleratedCheckoutsApplePayConfiguration as? ShopifyAcceleratedCheckouts.ApplePayConfiguration
252+
} catch {
253+
resolve(false)
254+
return
255+
}
248256
}
249257

250258
AcceleratedCheckoutConfiguration.shared.configuration = acceleratedCheckoutsConfiguration as? ShopifyAcceleratedCheckouts.Configuration
@@ -283,15 +291,17 @@ class RCTShopifyCheckoutSheetKit: RCTEventEmitter, CheckoutDelegate {
283291
// MARK: - Private
284292

285293
@available(iOS 16.0, *)
286-
private func contactFieldsToRequiredContactFields(_ contactFields: [String]) -> [ShopifyAcceleratedCheckouts.RequiredContactFields] {
287-
return contactFields.compactMap {
294+
private func contactFieldsToRequiredContactFields(_ contactFields: [String]) throws -> [ShopifyAcceleratedCheckouts.RequiredContactFields] {
295+
return try contactFields.compactMap {
288296
switch $0 {
289297
case "email":
290298
return ShopifyAcceleratedCheckouts.RequiredContactFields.email
291299
case "phone":
292300
return ShopifyAcceleratedCheckouts.RequiredContactFields.phone
293301
default:
294-
return nil
302+
let message = "Unknown contactField option: \(String(describing: $0))"
303+
print("[ShopifyCheckoutSheetKit] \(message)")
304+
throw NSError(domain: "ShopifyCheckoutSheetKit", code: 1, userInfo: ["message": message])
295305
}
296306
}
297307
}

modules/@shopify/checkout-sheet-kit/src/components/AcceleratedCheckoutButtons.tsx

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ export enum RenderState {
3535
Loading = 'loading',
3636
Rendered = 'rendered',
3737
Error = 'error',
38+
Unknown = 'unknown',
3839
}
3940

4041
export enum ApplePayLabel {
@@ -102,7 +103,13 @@ interface CommonAcceleratedCheckoutButtonsProps {
102103
* Called when the render state changes
103104
* States from SDK: loading, rendered, error
104105
*/
105-
onRenderStateChange?: (state: RenderState, reason?: string) => void;
106+
onRenderStateChange?: (
107+
event:
108+
| {state: RenderState.Error; reason?: string}
109+
| {state: RenderState.Loading}
110+
| {state: RenderState.Rendered}
111+
| {state: RenderState.Unknown},
112+
) => void;
106113

107114
/**
108115
* Called when a web pixel event is triggered
@@ -151,7 +158,9 @@ interface NativeAcceleratedCheckoutButtonsProps {
151158
onFail?: (event: {nativeEvent: CheckoutException}) => void;
152159
onComplete?: (event: {nativeEvent: CheckoutCompletedEvent}) => void;
153160
onCancel?: () => void;
154-
onRenderStateChange?: (event: {nativeEvent: {state: string}}) => void;
161+
onRenderStateChange?: (event: {
162+
nativeEvent: {state: string; reason?: string | undefined};
163+
}) => void;
155164
onWebPixelEvent?: (event: {nativeEvent: PixelEvent}) => void;
156165
onClickLink?: (event: {nativeEvent: {url: string}}) => void;
157166
onSizeChange?: (event: {nativeEvent: {height: number}}) => void;
@@ -220,17 +229,14 @@ export const AcceleratedCheckoutButtons: React.FC<
220229
}, [onCancel]);
221230

222231
const handleRenderStateChange = useCallback(
223-
(event: {nativeEvent: {state: string; reason?: string}}) => {
224-
if (event.nativeEvent?.state) {
225-
if (isRenderStateError(event.nativeEvent.state)) {
226-
onRenderStateChange?.(
227-
event.nativeEvent.state,
228-
event.nativeEvent.reason ?? '',
229-
);
230-
return;
231-
}
232-
233-
onRenderStateChange?.(event.nativeEvent.state as RenderState);
232+
(event: {nativeEvent: {state: string; reason?: string | undefined}}) => {
233+
const state = validRenderState(event.nativeEvent.state);
234+
const reason = event.nativeEvent.reason;
235+
236+
if (state === RenderState.Error) {
237+
onRenderStateChange?.({state, reason});
238+
} else {
239+
onRenderStateChange?.({state});
234240
}
235241
},
236242
[onRenderStateChange],
@@ -319,8 +325,11 @@ export const AcceleratedCheckoutButtons: React.FC<
319325

320326
export default AcceleratedCheckoutButtons;
321327

322-
function isRenderStateError(state: string): state is RenderState.Error {
323-
return state === RenderState.Error;
328+
function validRenderState(state: string): RenderState {
329+
return (
330+
Object.values(RenderState).find(renderState => renderState === state) ??
331+
RenderState.Unknown
332+
);
324333
}
325334

326335
function isCartProps(

modules/@shopify/checkout-sheet-kit/src/index.ts

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -224,17 +224,25 @@ class ShopifyCheckoutSheet implements ShopifyCheckoutSheetKit {
224224

225225
this.validateAcceleratedCheckoutsConfiguration(config);
226226

227-
const configured =
228-
await RNShopifyCheckoutSheetKit.configureAcceleratedCheckouts(
229-
config.storefrontDomain,
230-
config.storefrontAccessToken,
231-
config.customer?.email || null,
232-
config.customer?.phoneNumber || null,
233-
config.wallets?.applePay?.merchantIdentifier || null,
234-
config.wallets?.applePay?.contactFields || [],
227+
try {
228+
const configured =
229+
await RNShopifyCheckoutSheetKit.configureAcceleratedCheckouts(
230+
config.storefrontDomain,
231+
config.storefrontAccessToken,
232+
config.customer?.email || null,
233+
config.customer?.phoneNumber || null,
234+
config.wallets?.applePay?.merchantIdentifier || null,
235+
config.wallets?.applePay?.contactFields || [],
236+
);
237+
return configured;
238+
} catch (error) {
239+
// eslint-disable-next-line no-console
240+
console.error(
241+
'Failed to configured accelerated checkouts with config:',
242+
config,
235243
);
236-
237-
return configured;
244+
return false;
245+
}
238246
}
239247

240248
/**

sample/ios/ReactNative/Info.plist

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,6 @@
5050
</dict>
5151
<key>NSLocationWhenInUseUsageDescription</key>
5252
<string>Your location is required to locate pickup points near you.</string>
53-
<key>RCTNewArchEnabled</key>
54-
<true/>
5553
<key>UIAppFonts</key>
5654
<array>
5755
<string>Entypo.ttf</string>

sample/src/hooks/useCheckoutEventHandlers.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,14 @@ import type {
77
CheckoutCompletedEvent,
88
CheckoutException,
99
PixelEvent,
10-
RenderState,
1110
} from '@shopify/checkout-sheet-kit';
1211
import {Linking} from 'react-native';
1312

1413
interface EventHandlers {
1514
onFail?: (error: CheckoutException) => void;
1615
onComplete?: (event: CheckoutCompletedEvent) => void;
1716
onCancel?: () => void;
18-
onRenderStateChange?: (state: RenderState) => void;
17+
onRenderStateChange?: (event: any) => void;
1918
onShouldRecoverFromError?: (error: {message: string}) => boolean;
2019
onWebPixelEvent?: (event: PixelEvent) => void;
2120
onClickLink?: (url: string) => void;
@@ -37,8 +36,8 @@ export function useShopifyEventHandlers(name?: string): EventHandlers {
3736
onCancel: () => {
3837
log('onCancel');
3938
},
40-
onRenderStateChange: state => {
41-
log('onRenderStateChange', state);
39+
onRenderStateChange: event => {
40+
log('onRenderStateChange', event);
4241
},
4342
onWebPixelEvent: event => {
4443
log('onWebPixelEvent', event.name);

0 commit comments

Comments
 (0)