From 42c0f82ec53034c058487004c02ca28dbec39c33 Mon Sep 17 00:00:00 2001 From: Kieran Osgood Date: Tue, 19 May 2026 16:30:48 +0100 Subject: [PATCH] fix(react-native): adapt Android bridge to CheckoutListener rename PR #132 renamed DefaultCheckoutEventProcessor -> DefaultCheckoutListener and dropped onCheckoutCompleted from the listener. RN bridge wasn't updated alongside, breaking RN CI on main. Renames CustomCheckoutEventProcessor -> CustomCheckoutListener, swaps the parent class, drops the now-invalid onCheckoutCompleted override and its sample-test counterpart. iOS BridgeDelegate wiring deferred to a follow-up. Co-Authored-By: Claude Opus 4.7 (1M context) --- ...essor.java => CustomCheckoutListener.java} | 15 +------ .../checkoutkit/ShopifyCheckoutKitModule.java | 10 ++--- .../ios/ShopifyCheckoutKit.swift | 2 +- .../package.snapshot.json | 2 +- .../ShopifyCheckoutKitModuleTest.java | 39 ++----------------- .../ShopifyCheckoutKitTests.swift | 2 +- 6 files changed, 14 insertions(+), 56 deletions(-) rename platforms/react-native/modules/@shopify/checkout-kit-react-native/android/src/main/java/com/shopify/reactnative/checkoutkit/{CustomCheckoutEventProcessor.java => CustomCheckoutListener.java} (91%) diff --git a/platforms/react-native/modules/@shopify/checkout-kit-react-native/android/src/main/java/com/shopify/reactnative/checkoutkit/CustomCheckoutEventProcessor.java b/platforms/react-native/modules/@shopify/checkout-kit-react-native/android/src/main/java/com/shopify/reactnative/checkoutkit/CustomCheckoutListener.java similarity index 91% rename from platforms/react-native/modules/@shopify/checkout-kit-react-native/android/src/main/java/com/shopify/reactnative/checkoutkit/CustomCheckoutEventProcessor.java rename to platforms/react-native/modules/@shopify/checkout-kit-react-native/android/src/main/java/com/shopify/reactnative/checkoutkit/CustomCheckoutListener.java index 898cbe0b..4b439098 100644 --- a/platforms/react-native/modules/@shopify/checkout-kit-react-native/android/src/main/java/com/shopify/reactnative/checkoutkit/CustomCheckoutEventProcessor.java +++ b/platforms/react-native/modules/@shopify/checkout-kit-react-native/android/src/main/java/com/shopify/reactnative/checkoutkit/CustomCheckoutListener.java @@ -34,13 +34,12 @@ of this software and associated documentation files (the "Software"), to deal import com.facebook.react.modules.core.DeviceEventManagerModule; import com.facebook.react.bridge.WritableNativeMap; import com.facebook.react.bridge.ReactApplicationContext; -import com.shopify.checkoutkit.lifecycleevents.CheckoutCompletedEvent; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.util.HashMap; import java.util.Map; -public class CustomCheckoutEventProcessor extends DefaultCheckoutEventProcessor { +public class CustomCheckoutListener extends DefaultCheckoutListener { private final ReactApplicationContext reactContext; private final ObjectMapper mapper = new ObjectMapper(); @@ -49,7 +48,7 @@ public class CustomCheckoutEventProcessor extends DefaultCheckoutEventProcessor private String geolocationOrigin; private GeolocationPermissions.Callback geolocationCallback; - public CustomCheckoutEventProcessor(Context context, ReactApplicationContext reactContext) { + public CustomCheckoutListener(Context context, ReactApplicationContext reactContext) { this.reactContext = reactContext; } @@ -120,16 +119,6 @@ public void onCheckoutCanceled() { sendEvent("close", null); } - @Override - public void onCheckoutCompleted(@NonNull CheckoutCompletedEvent event) { - try { - String data = mapper.writeValueAsString(event); - sendEventWithStringData("completed", data); - } catch (IOException e) { - Log.e("ShopifyCheckoutKit", "Error processing completed event", e); - } - } - // Private private Map populateErrorDetails(CheckoutException checkoutError) { diff --git a/platforms/react-native/modules/@shopify/checkout-kit-react-native/android/src/main/java/com/shopify/reactnative/checkoutkit/ShopifyCheckoutKitModule.java b/platforms/react-native/modules/@shopify/checkout-kit-react-native/android/src/main/java/com/shopify/reactnative/checkoutkit/ShopifyCheckoutKitModule.java index 3dba43fc..19bd7704 100644 --- a/platforms/react-native/modules/@shopify/checkout-kit-react-native/android/src/main/java/com/shopify/reactnative/checkoutkit/ShopifyCheckoutKitModule.java +++ b/platforms/react-native/modules/@shopify/checkout-kit-react-native/android/src/main/java/com/shopify/reactnative/checkoutkit/ShopifyCheckoutKitModule.java @@ -49,7 +49,7 @@ public class ShopifyCheckoutKitModule extends NativeShopifyCheckoutKitSpec { private CheckoutKitDialog checkoutSheet; - private CustomCheckoutEventProcessor checkoutEventProcessor; + private CustomCheckoutListener checkoutListener; public ShopifyCheckoutKitModule(ReactApplicationContext reactContext) { super(reactContext); @@ -83,10 +83,10 @@ public void removeListeners(double count) { public void present(String checkoutURL) { Activity currentActivity = getCurrentActivity(); if (currentActivity instanceof ComponentActivity) { - checkoutEventProcessor = new CustomCheckoutEventProcessor(currentActivity, this.reactContext); + checkoutListener = new CustomCheckoutListener(currentActivity, this.reactContext); currentActivity.runOnUiThread(() -> { checkoutSheet = ShopifyCheckoutKit.present(checkoutURL, (ComponentActivity) currentActivity, - checkoutEventProcessor); + checkoutListener); }); } } @@ -189,8 +189,8 @@ public boolean isApplePayAvailable() { @ReactMethod public void initiateGeolocationRequest(boolean allow) { - if (checkoutEventProcessor != null) { - checkoutEventProcessor.invokeGeolocationCallback(allow); + if (checkoutListener != null) { + checkoutListener.invokeGeolocationCallback(allow); } } diff --git a/platforms/react-native/modules/@shopify/checkout-kit-react-native/ios/ShopifyCheckoutKit.swift b/platforms/react-native/modules/@shopify/checkout-kit-react-native/ios/ShopifyCheckoutKit.swift index 62060911..7e905160 100644 --- a/platforms/react-native/modules/@shopify/checkout-kit-react-native/ios/ShopifyCheckoutKit.swift +++ b/platforms/react-native/modules/@shopify/checkout-kit-react-native/ios/ShopifyCheckoutKit.swift @@ -66,7 +66,7 @@ class RCTShopifyCheckoutKit: RCTEventEmitter { } // TODO: re-enable when iOS CheckoutDelegate (or equivalent) lands upstream — - // parallels Android's DefaultCheckoutEventProcessor.onCheckoutCanceled / onCheckoutFailed. + // parallels Android's DefaultCheckoutListener.onCheckoutCanceled / onCheckoutFailed. // Until then, the JS "error" and "close" events stay declared in supportedEvents() // but native never emits them. /* diff --git a/platforms/react-native/modules/@shopify/checkout-kit-react-native/package.snapshot.json b/platforms/react-native/modules/@shopify/checkout-kit-react-native/package.snapshot.json index 5c442b47..25fee8c1 100644 --- a/platforms/react-native/modules/@shopify/checkout-kit-react-native/package.snapshot.json +++ b/platforms/react-native/modules/@shopify/checkout-kit-react-native/package.snapshot.json @@ -4,7 +4,7 @@ "android/proguard-rules.pro", "android/src/main/AndroidManifest.xml", "android/src/main/AndroidManifestNew.xml", - "android/src/main/java/com/shopify/reactnative/checkoutkit/CustomCheckoutEventProcessor.java", + "android/src/main/java/com/shopify/reactnative/checkoutkit/CustomCheckoutListener.java", "android/src/main/java/com/shopify/reactnative/checkoutkit/ShopifyCheckoutKitModule.java", "android/src/main/java/com/shopify/reactnative/checkoutkit/ShopifyCheckoutKitPackage.java", "ios/AcceleratedCheckoutButtons.swift", diff --git a/platforms/react-native/sample/android/app/src/test/java/com/shopify/checkoutkitreactnative/ShopifyCheckoutKitModuleTest.java b/platforms/react-native/sample/android/app/src/test/java/com/shopify/checkoutkitreactnative/ShopifyCheckoutKitModuleTest.java index 6f02bfa9..8385983d 100644 --- a/platforms/react-native/sample/android/app/src/test/java/com/shopify/checkoutkitreactnative/ShopifyCheckoutKitModuleTest.java +++ b/platforms/react-native/sample/android/app/src/test/java/com/shopify/checkoutkitreactnative/ShopifyCheckoutKitModuleTest.java @@ -18,12 +18,8 @@ import com.shopify.checkoutkit.Preloading; import com.shopify.checkoutkit.ColorScheme; import com.shopify.checkoutkit.LogLevel; -import com.shopify.checkoutkit.lifecycleevents.CheckoutCompletedEvent; -import com.shopify.checkoutkit.lifecycleevents.OrderDetails; -import com.shopify.checkoutkit.lifecycleevents.CartInfo; -import com.shopify.checkoutkit.lifecycleevents.Price; import com.shopify.reactnative.checkoutkit.ShopifyCheckoutKitModule; -import com.shopify.reactnative.checkoutkit.CustomCheckoutEventProcessor; +import com.shopify.reactnative.checkoutkit.CustomCheckoutListener; import org.junit.After; import org.junit.Before; @@ -41,8 +37,6 @@ import android.content.Context; -import java.util.ArrayList; -import java.util.List; @RunWith(MockitoJUnitRunner.class) public class ShopifyCheckoutKitModuleTest { @@ -468,38 +462,13 @@ public void testGetConfigReturnsDefaultLogLevel() { * Events */ - @Test - public void testCanProcessCheckoutCompletedEvents() { - CustomCheckoutEventProcessor processor = new CustomCheckoutEventProcessor(mockContext, mockReactContext); - - CartInfo cartInfo = new CartInfo(new ArrayList<>(), new Price(), "cart-token"); - OrderDetails orderDetails = new OrderDetails( - null, // billingAddress - cartInfo, - new ArrayList<>(), // deliveries - "test@example.com", // email - "order-123", // id - new ArrayList<>(), // paymentMethods - "+1234567890" // phone - ); - - CheckoutCompletedEvent completedEvent = new CheckoutCompletedEvent(orderDetails); - - processor.onCheckoutCompleted(completedEvent); - - verify(mockEventEmitter).emit(eq("completed"), stringCaptor.capture()); - - assertThat(stringCaptor.getValue()) - .contains("order-123", "test@example.com", "cart-token"); - } - /** * Errors */ @Test public void testCanProcessCheckoutExpiredErrors() { - CustomCheckoutEventProcessor processor = new CustomCheckoutEventProcessor(mockContext, mockReactContext); + CustomCheckoutListener processor = new CustomCheckoutListener(mockContext, mockReactContext); // Use minimal mocking - just enough to test the processing logic CheckoutExpiredException mockException = mock(CheckoutExpiredException.class); @@ -517,7 +486,7 @@ public void testCanProcessCheckoutExpiredErrors() { @Test public void testCanProcessClientErrors() { - CustomCheckoutEventProcessor processor = new CustomCheckoutEventProcessor(mockContext, mockReactContext); + CustomCheckoutListener processor = new CustomCheckoutListener(mockContext, mockReactContext); ClientException mockException = mock(ClientException.class); when(mockException.getErrorDescription()).thenReturn("Customer account required"); @@ -535,7 +504,7 @@ public void testCanProcessClientErrors() { @Test public void testCanProcessHttpErrors() { - CustomCheckoutEventProcessor processor = new CustomCheckoutEventProcessor(mockContext, mockReactContext); + CustomCheckoutListener processor = new CustomCheckoutListener(mockContext, mockReactContext); HttpException mockException = mock(HttpException.class); when(mockException.getErrorDescription()).thenReturn("Not Found"); diff --git a/platforms/react-native/sample/ios/ReactNativeTests/ShopifyCheckoutKitTests.swift b/platforms/react-native/sample/ios/ReactNativeTests/ShopifyCheckoutKitTests.swift index 603cef36..50a3bdf3 100644 --- a/platforms/react-native/sample/ios/ReactNativeTests/ShopifyCheckoutKitTests.swift +++ b/platforms/react-native/sample/ios/ReactNativeTests/ShopifyCheckoutKitTests.swift @@ -320,7 +320,7 @@ class ShopifyCheckoutKitTests: XCTestCase { } // TODO: re-enable when iOS CheckoutDelegate (or equivalent) lands upstream — - // parallels Android's DefaultCheckoutEventProcessor.onCheckoutCanceled / onCheckoutFailed. + // parallels Android's DefaultCheckoutListener.onCheckoutCanceled / onCheckoutFailed. /* /// checkoutDidComplete func testCheckoutDidCompleteSendsEvent() {