From d445766af9a5258b5eabb463cae48b73cca71482 Mon Sep 17 00:00:00 2001 From: Daniel Kift Date: Thu, 16 Jul 2026 13:09:11 +0100 Subject: [PATCH] Updates accelerated checkouts to use onDismiss --- .../Sources/Scenes/Cart/CartView.swift | 4 +- .../Sources/Scenes/ProductView.swift | 4 +- .../Views/Components/ButtonSet.swift | 8 +-- .../Wallets/AcceleratedCheckoutButtons.swift | 16 ++--- .../Wallets/ApplePay/ApplePayButton.swift | 2 +- .../ApplePay/ApplePayViewController.swift | 8 +-- .../Wallets/Wallet.swift | 6 +- .../ApplePay/ApplePayCallbackTests.swift | 70 +++++++++---------- .../ApplePay/ApplePayIntegrationTests.swift | 24 +++---- .../ApplePayViewControllerTests.swift | 10 +-- .../ApplePay/ApplePayViewModifierTests.swift | 50 ++++++------- .../ShopPay/ShopPayCallbackTests.swift | 36 +++++----- .../api/ShopifyAcceleratedCheckouts.json | 30 ++++---- 13 files changed, 134 insertions(+), 134 deletions(-) diff --git a/platforms/swift/Samples/CheckoutKitSwiftDemo/CheckoutKitSwiftDemo/Sources/Scenes/Cart/CartView.swift b/platforms/swift/Samples/CheckoutKitSwiftDemo/CheckoutKitSwiftDemo/Sources/Scenes/Cart/CartView.swift index ec0c67cbc..b65b48c0a 100644 --- a/platforms/swift/Samples/CheckoutKitSwiftDemo/CheckoutKitSwiftDemo/Sources/Scenes/Cart/CartView.swift +++ b/platforms/swift/Samples/CheckoutKitSwiftDemo/CheckoutKitSwiftDemo/Sources/Scenes/Cart/CartView.swift @@ -46,8 +46,8 @@ struct CartView: View { .onFail { error in print("[AcceleratedCheckout] Failed: \(error)") } - .onCancel { - print("[AcceleratedCheckout] Cancelled") + .onDismiss { + print("[AcceleratedCheckout] Dismissed") } .connect(client) .environment( diff --git a/platforms/swift/Samples/CheckoutKitSwiftDemo/CheckoutKitSwiftDemo/Sources/Scenes/ProductView.swift b/platforms/swift/Samples/CheckoutKitSwiftDemo/CheckoutKitSwiftDemo/Sources/Scenes/ProductView.swift index 47320f160..57d828c3e 100644 --- a/platforms/swift/Samples/CheckoutKitSwiftDemo/CheckoutKitSwiftDemo/Sources/Scenes/ProductView.swift +++ b/platforms/swift/Samples/CheckoutKitSwiftDemo/CheckoutKitSwiftDemo/Sources/Scenes/ProductView.swift @@ -120,8 +120,8 @@ struct ProductView: View { .onFail { error in print("[AcceleratedCheckout] Failed: \(error)") } - .onCancel { - print("[AcceleratedCheckout] Cancelled") + .onDismiss { + print("[AcceleratedCheckout] Dismissed") } .environment( \.shopifyAcceleratedCheckoutsConfiguration, diff --git a/platforms/swift/Samples/ShopifyAcceleratedCheckoutsApp/ShopifyAcceleratedCheckoutsApp/Views/Components/ButtonSet.swift b/platforms/swift/Samples/ShopifyAcceleratedCheckoutsApp/ShopifyAcceleratedCheckoutsApp/Views/Components/ButtonSet.swift index cf3f807a3..df2bf6ce5 100644 --- a/platforms/swift/Samples/ShopifyAcceleratedCheckoutsApp/ShopifyAcceleratedCheckoutsApp/Views/Components/ButtonSet.swift +++ b/platforms/swift/Samples/ShopifyAcceleratedCheckoutsApp/ShopifyAcceleratedCheckoutsApp/Views/Components/ButtonSet.swift @@ -23,8 +23,8 @@ struct ButtonSet: View { .onFail { error in print("❌ Checkout failed: \(error)") } - .onCancel { - print("🚫 Checkout cancelled") + .onDismiss { + print("🚫 Checkout dismissed") } .onRenderStateChange { cartRenderState = $0 @@ -50,8 +50,8 @@ struct ButtonSet: View { .onFail { error in print("❌ Variant checkout failed: \(error)") } - .onCancel { - print("🚫 Variant checkout cancelled") + .onDismiss { + print("🚫 Variant checkout dismissed") } .onRenderStateChange { variantRenderState = $0 diff --git a/platforms/swift/Sources/ShopifyAcceleratedCheckouts/Wallets/AcceleratedCheckoutButtons.swift b/platforms/swift/Sources/ShopifyAcceleratedCheckouts/Wallets/AcceleratedCheckoutButtons.swift index f47a9b1ca..a6417a42b 100644 --- a/platforms/swift/Sources/ShopifyAcceleratedCheckouts/Wallets/AcceleratedCheckoutButtons.swift +++ b/platforms/swift/Sources/ShopifyAcceleratedCheckouts/Wallets/AcceleratedCheckoutButtons.swift @@ -182,23 +182,23 @@ extension AcceleratedCheckoutButtons { return newView } - /// Adds an action to perform when the checkout is cancelled by the user. + /// Adds an action to perform when the buyer dismisses the checkout experience. /// - /// Use this modifier to handle checkout cancellation: + /// Use this modifier to handle checkout dismissal: /// /// ```swift /// AcceleratedCheckoutButtons(cartID: cartId) - /// .onCancel { - /// // Reset checkout state + /// .onDismiss { + /// // Reset checkout presentation state /// resetCheckoutState() /// } /// ``` /// - /// - Parameter action: The action to perform when checkout is cancelled - /// - Returns: A view with the checkout cancel handler set - public func onCancel(_ action: @escaping () -> Void) -> AcceleratedCheckoutButtons { + /// - Parameter action: The action to perform when the buyer dismisses checkout + /// - Returns: A view with the checkout dismissal handler set + public func onDismiss(_ action: @escaping () -> Void) -> AcceleratedCheckoutButtons { var newView = self - newView.eventHandlers.checkoutDidCancel = action + newView.eventHandlers.checkoutDidDismiss = action return newView } diff --git a/platforms/swift/Sources/ShopifyAcceleratedCheckouts/Wallets/ApplePay/ApplePayButton.swift b/platforms/swift/Sources/ShopifyAcceleratedCheckouts/Wallets/ApplePay/ApplePayButton.swift index b05339331..796b4059a 100644 --- a/platforms/swift/Sources/ShopifyAcceleratedCheckouts/Wallets/ApplePay/ApplePayButton.swift +++ b/platforms/swift/Sources/ShopifyAcceleratedCheckouts/Wallets/ApplePay/ApplePayButton.swift @@ -120,7 +120,7 @@ struct Internal_ApplePayButton: View { self.buttonStyle = buttonStyle self.cornerRadius = cornerRadius controller.onCheckoutFail = eventHandlers.checkoutDidFail - controller.onCheckoutCancel = eventHandlers.checkoutDidCancel + controller.onCheckoutDismiss = eventHandlers.checkoutDidDismiss } var body: some View { diff --git a/platforms/swift/Sources/ShopifyAcceleratedCheckouts/Wallets/ApplePay/ApplePayViewController.swift b/platforms/swift/Sources/ShopifyAcceleratedCheckouts/Wallets/ApplePay/ApplePayViewController.swift index a231e8780..db6a489ae 100644 --- a/platforms/swift/Sources/ShopifyAcceleratedCheckouts/Wallets/ApplePay/ApplePayViewController.swift +++ b/platforms/swift/Sources/ShopifyAcceleratedCheckouts/Wallets/ApplePay/ApplePayViewController.swift @@ -36,18 +36,18 @@ class ApplePayViewController: WalletController, PayController { @MainActor public var onCheckoutFail: ((CheckoutError) -> Void)? - /// Callback invoked when the checkout process is cancelled by the user. + /// Callback invoked when the buyer dismisses the checkout experience. /// This closure is called on the main thread when the user dismisses the checkout. /// /// Example usage: /// ```swift - /// applePayViewController.onCheckoutCancel = { [weak self] in + /// applePayViewController.onCheckoutDismiss = { [weak self] in /// self?.resetCheckoutState() - /// self?.logAnalyticsEvent(.checkoutCancelled) + /// self?.logAnalyticsEvent(.checkoutDismissed) /// } /// ``` @MainActor - public var onCheckoutCancel: (() -> Void)? + public var onCheckoutDismiss: (() -> Void)? /// Initialization workaround for passing self to ApplePayAuthorizationDelegate private var __authorizationDelegate: ApplePayAuthorizationDelegate! diff --git a/platforms/swift/Sources/ShopifyAcceleratedCheckouts/Wallets/Wallet.swift b/platforms/swift/Sources/ShopifyAcceleratedCheckouts/Wallets/Wallet.swift index 31ab7b86b..a79b188a1 100644 --- a/platforms/swift/Sources/ShopifyAcceleratedCheckouts/Wallets/Wallet.swift +++ b/platforms/swift/Sources/ShopifyAcceleratedCheckouts/Wallets/Wallet.swift @@ -10,16 +10,16 @@ public enum Wallet: String { /// Event handlers for wallet buttons public struct EventHandlers { public var checkoutDidFail: ((CheckoutError) -> Void)? - public var checkoutDidCancel: (() -> Void)? + public var checkoutDidDismiss: (() -> Void)? public var renderStateDidChange: ((RenderState) -> Void)? public init( checkoutDidFail: ((CheckoutError) -> Void)? = nil, - checkoutDidCancel: (() -> Void)? = nil, + checkoutDidDismiss: (() -> Void)? = nil, renderStateDidChange: ((RenderState) -> Void)? = nil ) { self.checkoutDidFail = checkoutDidFail - self.checkoutDidCancel = checkoutDidCancel + self.checkoutDidDismiss = checkoutDidDismiss self.renderStateDidChange = renderStateDidChange } } diff --git a/platforms/swift/Tests/ShopifyAcceleratedCheckoutsTests/Wallets/ApplePay/ApplePayCallbackTests.swift b/platforms/swift/Tests/ShopifyAcceleratedCheckoutsTests/Wallets/ApplePay/ApplePayCallbackTests.swift index dc66d6d70..8b006285a 100644 --- a/platforms/swift/Tests/ShopifyAcceleratedCheckoutsTests/Wallets/ApplePay/ApplePayCallbackTests.swift +++ b/platforms/swift/Tests/ShopifyAcceleratedCheckoutsTests/Wallets/ApplePay/ApplePayCallbackTests.swift @@ -11,7 +11,7 @@ final class ApplePayCallbackTests: XCTestCase { var mockConfiguration: ApplePayConfigurationWrapper! var mockIdentifier: CheckoutIdentifier! var errorExpectation: XCTestExpectation! - var cancelExpectation: XCTestExpectation! + var dismissExpectation: XCTestExpectation! // MARK: - Setup @@ -58,7 +58,7 @@ final class ApplePayCallbackTests: XCTestCase { mockConfiguration = nil mockIdentifier = nil errorExpectation = nil - cancelExpectation = nil + dismissExpectation = nil try await super.tearDown() } @@ -97,34 +97,34 @@ final class ApplePayCallbackTests: XCTestCase { XCTAssertTrue(true, "Should not crash when callback is nil") } - // MARK: - Cancel Callback Tests + // MARK: - Dismiss Callback Tests - func testCancelCallbackInvoked() async { - cancelExpectation = expectation(description: "Cancel callback should be invoked") - let callbackInvokedExpectation = expectation(description: "Cancel callback invoked") + func testDismissCallbackInvoked() async { + dismissExpectation = expectation(description: "Dismiss callback should be invoked") + let callbackInvokedExpectation = expectation(description: "Dismiss callback invoked") await MainActor.run { - viewController.onCheckoutCancel = { [weak self] in + viewController.onCheckoutDismiss = { [weak self] in callbackInvokedExpectation.fulfill() - self?.cancelExpectation.fulfill() + self?.dismissExpectation.fulfill() } } await MainActor.run { - viewController.onCheckoutCancel?() + viewController.onCheckoutDismiss?() } - await fulfillment(of: [cancelExpectation, callbackInvokedExpectation], timeout: 1.0) + await fulfillment(of: [dismissExpectation, callbackInvokedExpectation], timeout: 1.0) } - func testCancelCallbackNotInvokedWhenNil() async { + func testDismissCallbackNotInvokedWhenNil() async { let isNil = await MainActor.run { - viewController.onCheckoutCancel == nil + viewController.onCheckoutDismiss == nil } - XCTAssertTrue(isNil, "onCancel should be nil") + XCTAssertTrue(isNil, "onDismiss should be nil") await MainActor.run { - viewController.onCheckoutCancel?() // Should not crash + viewController.onCheckoutDismiss?() // Should not crash } try? await Task.sleep(nanoseconds: 100_000_000) // 0.1 seconds @@ -134,34 +134,34 @@ final class ApplePayCallbackTests: XCTestCase { // MARK: - No Callback Tests @MainActor - func testNoCallbackWhenCheckoutCancelled() async { + func testNoFailCallbackWhenCheckoutIsDismissed() async { var errorInvoked = false - var cancelInvoked = false + var dismissInvoked = false viewController.onCheckoutFail = { _ in errorInvoked = true } - viewController.onCheckoutCancel = { - cancelInvoked = true + viewController.onCheckoutDismiss = { + dismissInvoked = true } - viewController.onCheckoutCancel?() + viewController.onCheckoutDismiss?() try? await Task.sleep(nanoseconds: 200_000_000) // 0.2 seconds XCTAssertFalse(errorInvoked, "Error callback should not be invoked") - XCTAssertTrue(cancelInvoked, "Cancel callback should be invoked") + XCTAssertTrue(dismissInvoked, "Dismiss callback should be invoked") } // MARK: - Thread Safety Tests @MainActor func testCallbackThreadSafety() async { - let iterations = 10 // Even distribution between error and cancel + let iterations = 10 // Even distribution between error and dismissal let errorExpectations = (0 ..< iterations / 2).map { _ in expectation(description: "Error") } - let cancelExpectations = (0 ..< iterations / 2).map { _ in expectation(description: "Cancel") } + let dismissExpectations = (0 ..< iterations / 2).map { _ in expectation(description: "Dismiss") } var errorIndex = 0 - var cancelIndex = 0 + var dismissIndex = 0 viewController.onCheckoutFail = { _ in if errorIndex < errorExpectations.count { @@ -169,10 +169,10 @@ final class ApplePayCallbackTests: XCTestCase { errorIndex += 1 } } - viewController.onCheckoutCancel = { - if cancelIndex < cancelExpectations.count { - cancelExpectations[cancelIndex].fulfill() - cancelIndex += 1 + viewController.onCheckoutDismiss = { + if dismissIndex < dismissExpectations.count { + dismissExpectations[dismissIndex].fulfill() + dismissIndex += 1 } } @@ -181,7 +181,7 @@ final class ApplePayCallbackTests: XCTestCase { let mockError = CheckoutError.sdkError(underlying: NSError(domain: "TestError", code: 0, userInfo: nil)) viewController.onCheckoutFail?(mockError) } else { - viewController.onCheckoutCancel?() + viewController.onCheckoutDismiss?() } // Give time for callback to execute @@ -189,30 +189,30 @@ final class ApplePayCallbackTests: XCTestCase { } // Wait for all expectations - await fulfillment(of: errorExpectations + cancelExpectations, timeout: 2.0) + await fulfillment(of: errorExpectations + dismissExpectations, timeout: 2.0) } // MARK: - Edge Case Tests - func testMultipleCancelCallbackAssignments() async { - let firstCallbackExpectation = expectation(description: "First cancel callback") + func testMultipleDismissCallbackAssignments() async { + let firstCallbackExpectation = expectation(description: "First dismiss callback") firstCallbackExpectation.isInverted = true - let secondCallbackExpectation = expectation(description: "Second cancel callback") + let secondCallbackExpectation = expectation(description: "Second dismiss callback") await MainActor.run { // First assignment - viewController.onCheckoutCancel = { + viewController.onCheckoutDismiss = { firstCallbackExpectation.fulfill() } // Second assignment (should replace first) - viewController.onCheckoutCancel = { + viewController.onCheckoutDismiss = { secondCallbackExpectation.fulfill() } } await MainActor.run { - viewController.onCheckoutCancel?() + viewController.onCheckoutDismiss?() } await fulfillment(of: [secondCallbackExpectation], timeout: 1.0) diff --git a/platforms/swift/Tests/ShopifyAcceleratedCheckoutsTests/Wallets/ApplePay/ApplePayIntegrationTests.swift b/platforms/swift/Tests/ShopifyAcceleratedCheckoutsTests/Wallets/ApplePay/ApplePayIntegrationTests.swift index 3c268dd50..dcde65e34 100644 --- a/platforms/swift/Tests/ShopifyAcceleratedCheckoutsTests/Wallets/ApplePay/ApplePayIntegrationTests.swift +++ b/platforms/swift/Tests/ShopifyAcceleratedCheckoutsTests/Wallets/ApplePay/ApplePayIntegrationTests.swift @@ -75,11 +75,11 @@ final class ApplePayIntegrationTests: XCTestCase { } } - func testViewModifierWithButtonIntegrationIncludingCancel() async { + func testViewModifierWithButtonIntegrationIncludingDismiss() async { let failExpectation = expectation(description: "Fail callback") failExpectation.isInverted = true - let cancelExpectation = expectation(description: "Cancel callback") - cancelExpectation.isInverted = true + let dismissExpectation = expectation(description: "Dismiss callback") + dismissExpectation.isInverted = true await MainActor.run { let view = AcceleratedCheckoutButtons(cartID: "gid://Shopify/Cart/test-cart") @@ -87,8 +87,8 @@ final class ApplePayIntegrationTests: XCTestCase { .onFail { _ in failExpectation.fulfill() } - .onCancel { - cancelExpectation.fulfill() + .onDismiss { + dismissExpectation.fulfill() } .environment(\.shopifyAcceleratedCheckoutsConfiguration, mockCommonConfiguration) .environment(\.shopifyApplePayConfiguration, mockApplePayConfiguration) @@ -102,7 +102,7 @@ final class ApplePayIntegrationTests: XCTestCase { XCTAssertNotNil(hostingController.rootView, "Root view should exist") } - await fulfillment(of: [failExpectation, cancelExpectation], timeout: 0.2) + await fulfillment(of: [failExpectation, dismissExpectation], timeout: 0.2) } // MARK: - Edge Case Tests @@ -148,22 +148,22 @@ final class ApplePayIntegrationTests: XCTestCase { // MARK: - Delegate Tests @MainActor - func testCheckoutDelegateCancelCallback() async { - var cancelCallbackInvoked = false + func testCheckoutDelegateDismissCallback() async { + var dismissCallbackInvoked = false let viewController = ApplePayViewController( identifier: .cart(cartID: "gid://Shopify/Cart/test-cart"), configuration: mockConfiguration ) - viewController.onCheckoutCancel = { - cancelCallbackInvoked = true + viewController.onCheckoutDismiss = { + dismissCallbackInvoked = true } - viewController.onCheckoutCancel?() + viewController.onCheckoutDismiss?() try? await Task.sleep(nanoseconds: 100_000_000) - XCTAssertTrue(cancelCallbackInvoked, "Cancel callback should be invoked when onCheckoutCancel is called") + XCTAssertTrue(dismissCallbackInvoked, "Dismiss callback should be invoked when onCheckoutDismiss is called") } } diff --git a/platforms/swift/Tests/ShopifyAcceleratedCheckoutsTests/Wallets/ApplePay/ApplePayViewControllerTests.swift b/platforms/swift/Tests/ShopifyAcceleratedCheckoutsTests/Wallets/ApplePay/ApplePayViewControllerTests.swift index 42f50b11f..6da167fbb 100644 --- a/platforms/swift/Tests/ShopifyAcceleratedCheckoutsTests/Wallets/ApplePay/ApplePayViewControllerTests.swift +++ b/platforms/swift/Tests/ShopifyAcceleratedCheckoutsTests/Wallets/ApplePay/ApplePayViewControllerTests.swift @@ -132,13 +132,13 @@ class ApplePayViewControllerTests: XCTestCase { // MARK: - Delegate @MainActor - func test_checkoutDidCancel_whenInvoked_invokesOnCancelCallback() async { - let cancelCallbackExpectation = XCTestExpectation(description: "Cancel callback should be invoked") - viewController.onCheckoutCancel = { cancelCallbackExpectation.fulfill() } + func test_checkoutDidDismiss_whenInvoked_invokesOnDismissCallback() async { + let dismissCallbackExpectation = XCTestExpectation(description: "Dismiss callback should be invoked") + viewController.onCheckoutDismiss = { dismissCallbackExpectation.fulfill() } - viewController.onCheckoutCancel?() + viewController.onCheckoutDismiss?() - await fulfillment(of: [cancelCallbackExpectation], timeout: 1.0) + await fulfillment(of: [dismissCallbackExpectation], timeout: 1.0) } // MARK: - WalletController Inheritance diff --git a/platforms/swift/Tests/ShopifyAcceleratedCheckoutsTests/Wallets/ApplePay/ApplePayViewModifierTests.swift b/platforms/swift/Tests/ShopifyAcceleratedCheckoutsTests/Wallets/ApplePay/ApplePayViewModifierTests.swift index f7236c360..57aa2c9c8 100644 --- a/platforms/swift/Tests/ShopifyAcceleratedCheckoutsTests/Wallets/ApplePay/ApplePayViewModifierTests.swift +++ b/platforms/swift/Tests/ShopifyAcceleratedCheckoutsTests/Wallets/ApplePay/ApplePayViewModifierTests.swift @@ -44,33 +44,33 @@ final class ApplePayViewModifierTests: XCTestCase { try await super.tearDown() } - // MARK: - onCancel Modifier Tests + // MARK: - onDismiss Modifier Tests - func testOnCancelModifier() { - var cancelCallbackInvoked = false - let cancelAction = { - cancelCallbackInvoked = true + func testOnDismissModifier() { + var dismissCallbackInvoked = false + let dismissAction = { + dismissCallbackInvoked = true } let view = AcceleratedCheckoutButtons(cartID: "gid://Shopify/Cart/test-cart-id") - .onCancel(cancelAction) + .onDismiss(dismissAction) .environment(\.shopifyAcceleratedCheckoutsConfiguration, mockConfiguration) .environment(\.shopifyApplePayConfiguration, mockApplePayConfiguration) .environmentObject(mockShopSettings) - XCTAssertNotNil(view, "View should be created successfully with cancel modifier") + XCTAssertNotNil(view, "View should be created successfully with dismiss modifier") - cancelAction() - XCTAssertTrue(cancelCallbackInvoked, "Cancel callback should be invoked when called") + dismissAction() + XCTAssertTrue(dismissCallbackInvoked, "Dismiss callback should be invoked when called") } - func testOnCancelModifierChaining() { + func testOnDismissModifierChaining() { var firstCallbackInvoked = false var secondCallbackInvoked = false _ = AcceleratedCheckoutButtons(cartID: "gid://Shopify/Cart/test-cart-id") - .onCancel { firstCallbackInvoked = true } - .onCancel { secondCallbackInvoked = true } // Should replace the first + .onDismiss { firstCallbackInvoked = true } + .onDismiss { secondCallbackInvoked = true } // Should replace the first .environment(\.shopifyAcceleratedCheckoutsConfiguration, mockConfiguration) .environment(\.shopifyApplePayConfiguration, mockApplePayConfiguration) .environmentObject(mockShopSettings) @@ -103,18 +103,18 @@ final class ApplePayViewModifierTests: XCTestCase { func testCombinedModifiers() { var errorInvoked = false - var cancelInvoked = false + var dismissInvoked = false let errorAction = { (_: CheckoutError) in errorInvoked = true } - let cancelAction = { - cancelInvoked = true + let dismissAction = { + dismissInvoked = true } let view = AcceleratedCheckoutButtons(cartID: "gid://Shopify/Cart/test-cart-id") .onFail(errorAction) - .onCancel(cancelAction) + .onDismiss(dismissAction) .environment(\.shopifyAcceleratedCheckoutsConfiguration, mockConfiguration) .environment(\.shopifyApplePayConfiguration, mockApplePayConfiguration) .environmentObject(mockShopSettings) @@ -123,10 +123,10 @@ final class ApplePayViewModifierTests: XCTestCase { errorAction(CheckoutError.sdkError(underlying: NSError(domain: "Test", code: 0))) XCTAssertTrue(errorInvoked, "Error callback should be invoked") - XCTAssertFalse(cancelInvoked, "Cancel callback should not be invoked") + XCTAssertFalse(dismissInvoked, "Dismiss callback should not be invoked") - cancelAction() - XCTAssertTrue(cancelInvoked, "Cancel callback should be invoked") + dismissAction() + XCTAssertTrue(dismissInvoked, "Dismiss callback should be invoked") } // MARK: - Environment Propagation Tests @@ -144,14 +144,14 @@ final class ApplePayViewModifierTests: XCTestCase { func testAllCallbackModifiersCombined() { var errorInvoked = false - var cancelInvoked = false + var dismissInvoked = false let errorAction = { (_: CheckoutError) in errorInvoked = true } - let cancelAction = { cancelInvoked = true } + let dismissAction = { dismissInvoked = true } let view = AcceleratedCheckoutButtons(cartID: "gid://Shopify/Cart/test-cart-id") .onFail(errorAction) - .onCancel(cancelAction) + .onDismiss(dismissAction) .environment(\.shopifyAcceleratedCheckoutsConfiguration, mockConfiguration) .environment(\.shopifyApplePayConfiguration, mockApplePayConfiguration) .environmentObject(mockShopSettings) @@ -160,13 +160,13 @@ final class ApplePayViewModifierTests: XCTestCase { errorAction(CheckoutError.sdkError(underlying: NSError(domain: "Test", code: 0))) XCTAssertTrue(errorInvoked, "Error callback should be invoked") - XCTAssertFalse(cancelInvoked, "Cancel callback should not be invoked") + XCTAssertFalse(dismissInvoked, "Dismiss callback should not be invoked") // Reset errorInvoked = false - cancelAction() + dismissAction() XCTAssertFalse(errorInvoked, "Error callback should not be invoked") - XCTAssertTrue(cancelInvoked, "Cancel callback should be invoked") + XCTAssertTrue(dismissInvoked, "Dismiss callback should be invoked") } // MARK: - Integration Tests diff --git a/platforms/swift/Tests/ShopifyAcceleratedCheckoutsTests/Wallets/ShopPay/ShopPayCallbackTests.swift b/platforms/swift/Tests/ShopifyAcceleratedCheckoutsTests/Wallets/ShopPay/ShopPayCallbackTests.swift index 8b6b0708e..d6f3769cd 100644 --- a/platforms/swift/Tests/ShopifyAcceleratedCheckoutsTests/Wallets/ShopPay/ShopPayCallbackTests.swift +++ b/platforms/swift/Tests/ShopifyAcceleratedCheckoutsTests/Wallets/ShopPay/ShopPayCallbackTests.swift @@ -11,7 +11,7 @@ final class ShopPayCallbackTests: XCTestCase { var mockConfiguration: ShopifyAcceleratedCheckouts.Configuration! var mockIdentifier: CheckoutIdentifier! var errorExpectation: XCTestExpectation! - var cancelExpectation: XCTestExpectation! + var dismissExpectation: XCTestExpectation! // MARK: - Setup @@ -36,7 +36,7 @@ final class ShopPayCallbackTests: XCTestCase { mockConfiguration = nil mockIdentifier = nil errorExpectation = nil - cancelExpectation = nil + dismissExpectation = nil try await super.tearDown() } @@ -69,29 +69,29 @@ final class ShopPayCallbackTests: XCTestCase { XCTAssertTrue(true, "Should not crash when callback is nil") } - // MARK: - Cancel Callback Tests + // MARK: - Dismiss Callback Tests @MainActor - func testCancelCallbackInvoked() async { - cancelExpectation = expectation(description: "Cancel callback should be invoked") - let callbackInvokedExpectation = expectation(description: "Cancel callback invoked") + func testDismissCallbackInvoked() async { + dismissExpectation = expectation(description: "Dismiss callback should be invoked") + let callbackInvokedExpectation = expectation(description: "Dismiss callback invoked") viewController.eventHandlers = EventHandlers( - checkoutDidCancel: { [weak self] in + checkoutDidDismiss: { [weak self] in callbackInvokedExpectation.fulfill() - self?.cancelExpectation.fulfill() + self?.dismissExpectation.fulfill() } ) - viewController.eventHandlers.checkoutDidCancel?() + viewController.eventHandlers.checkoutDidDismiss?() - await fulfillment(of: [cancelExpectation, callbackInvokedExpectation], timeout: 1.0) + await fulfillment(of: [dismissExpectation, callbackInvokedExpectation], timeout: 1.0) } - func testCancelCallbackNotInvokedWhenNil() { - XCTAssertNil(viewController.eventHandlers.checkoutDidCancel) + func testDismissCallbackNotInvokedWhenNil() { + XCTAssertNil(viewController.eventHandlers.checkoutDidDismiss) - viewController.eventHandlers.checkoutDidCancel?() // Should not crash + viewController.eventHandlers.checkoutDidDismiss?() // Should not crash XCTAssertTrue(true, "Should not crash when callback is nil") } @@ -112,14 +112,14 @@ final class ShopPayCallbackTests: XCTestCase { } @MainActor - func testCheckoutCancelCallback() { - var cancelInvoked = false + func testCheckoutDismissCallback() { + var dismissInvoked = false viewController.eventHandlers = EventHandlers( - checkoutDidCancel: { cancelInvoked = true } + checkoutDidDismiss: { dismissInvoked = true } ) - viewController.eventHandlers.checkoutDidCancel?() + viewController.eventHandlers.checkoutDidDismiss?() - XCTAssertTrue(cancelInvoked, "Cancel callback should be invoked") + XCTAssertTrue(dismissInvoked, "Dismiss callback should be invoked") } } diff --git a/platforms/swift/api/ShopifyAcceleratedCheckouts.json b/platforms/swift/api/ShopifyAcceleratedCheckouts.json index 314f38f01..052a89e1c 100644 --- a/platforms/swift/api/ShopifyAcceleratedCheckouts.json +++ b/platforms/swift/api/ShopifyAcceleratedCheckouts.json @@ -2113,8 +2113,8 @@ }, { "kind": "Function", - "name": "onCancel", - "printedName": "onCancel(_:)", + "name": "onDismiss", + "printedName": "onDismiss(_:)", "children": [ { "kind": "TypeNominal", @@ -2148,8 +2148,8 @@ } ], "declKind": "Func", - "usr": "s:27ShopifyAcceleratedCheckouts0B15CheckoutButtonsV8onCancelyACyycF", - "mangledName": "$s27ShopifyAcceleratedCheckouts0B15CheckoutButtonsV8onCancelyACyycF", + "usr": "s:27ShopifyAcceleratedCheckouts0B15CheckoutButtonsV9onDismissyACyycF", + "mangledName": "$s27ShopifyAcceleratedCheckouts0B15CheckoutButtonsV9onDismissyACyycF", "moduleName": "ShopifyAcceleratedCheckouts", "declAttributes": [ "Preconcurrency", @@ -2710,8 +2710,8 @@ }, { "kind": "Var", - "name": "checkoutDidCancel", - "printedName": "checkoutDidCancel", + "name": "checkoutDidDismiss", + "printedName": "checkoutDidDismiss", "children": [ { "kind": "TypeNominal", @@ -2747,8 +2747,8 @@ } ], "declKind": "Var", - "usr": "s:27ShopifyAcceleratedCheckouts13EventHandlersV17checkoutDidCancelyycSgvp", - "mangledName": "$s27ShopifyAcceleratedCheckouts13EventHandlersV17checkoutDidCancelyycSgvp", + "usr": "s:27ShopifyAcceleratedCheckouts13EventHandlersV18checkoutDidDismissyycSgvp", + "mangledName": "$s27ShopifyAcceleratedCheckouts13EventHandlersV18checkoutDidDismissyycSgvp", "moduleName": "ShopifyAcceleratedCheckouts", "declAttributes": [ "HasInitialValue", @@ -2795,8 +2795,8 @@ } ], "declKind": "Accessor", - "usr": "s:27ShopifyAcceleratedCheckouts13EventHandlersV17checkoutDidCancelyycSgvg", - "mangledName": "$s27ShopifyAcceleratedCheckouts13EventHandlersV17checkoutDidCancelyycSgvg", + "usr": "s:27ShopifyAcceleratedCheckouts13EventHandlersV18checkoutDidDismissyycSgvg", + "mangledName": "$s27ShopifyAcceleratedCheckouts13EventHandlersV18checkoutDidDismissyycSgvg", "moduleName": "ShopifyAcceleratedCheckouts", "implicit": true, "declAttributes": [ @@ -2848,8 +2848,8 @@ } ], "declKind": "Accessor", - "usr": "s:27ShopifyAcceleratedCheckouts13EventHandlersV17checkoutDidCancelyycSgvs", - "mangledName": "$s27ShopifyAcceleratedCheckouts13EventHandlersV17checkoutDidCancelyycSgvs", + "usr": "s:27ShopifyAcceleratedCheckouts13EventHandlersV18checkoutDidDismissyycSgvs", + "mangledName": "$s27ShopifyAcceleratedCheckouts13EventHandlersV18checkoutDidDismissyycSgvs", "moduleName": "ShopifyAcceleratedCheckouts", "implicit": true, "declAttributes": [ @@ -3016,7 +3016,7 @@ { "kind": "Constructor", "name": "init", - "printedName": "init(checkoutDidFail:checkoutDidCancel:renderStateDidChange:)", + "printedName": "init(checkoutDidFail:checkoutDidDismiss:renderStateDidChange:)", "children": [ { "kind": "TypeNominal", @@ -3127,8 +3127,8 @@ } ], "declKind": "Constructor", - "usr": "s:27ShopifyAcceleratedCheckouts13EventHandlersV15checkoutDidFail0fG6Cancel011renderStateG6ChangeACy0A11CheckoutKit0M5ErrorOcSg_yycSgyAA06RenderK0OcSgtcfc", - "mangledName": "$s27ShopifyAcceleratedCheckouts13EventHandlersV15checkoutDidFail0fG6Cancel011renderStateG6ChangeACy0A11CheckoutKit0M5ErrorOcSg_yycSgyAA06RenderK0OcSgtcfc", + "usr": "s:27ShopifyAcceleratedCheckouts13EventHandlersV15checkoutDidFail0fG7Dismiss011renderStateG6ChangeACy0A11CheckoutKit0M5ErrorOcSg_yycSgyAA06RenderK0OcSgtcfc", + "mangledName": "$s27ShopifyAcceleratedCheckouts13EventHandlersV15checkoutDidFail0fG7Dismiss011renderStateG6ChangeACy0A11CheckoutKit0M5ErrorOcSg_yycSgyAA06RenderK0OcSgtcfc", "moduleName": "ShopifyAcceleratedCheckouts", "init_kind": "Designated" }