Skip to content

Commit

Permalink
support checkout errors on bridge web events
Browse files Browse the repository at this point in the history
  • Loading branch information
cianbuckley committed Oct 4, 2023
1 parent 09f5a16 commit 74bd05c
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 7 deletions.
9 changes: 6 additions & 3 deletions Sources/ShopifyCheckout/CheckoutBridge.swift
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,13 @@ enum CheckoutBridge {
return "ShopifyCheckoutSDK/\(ShopifyCheckout.version) (\(schemaVersion);\(theme))"
}

static func decode(_ message: WKScriptMessage) throws -> Event {
static func decode(_ message: WKScriptMessage) throws -> WebEvent {
guard let body = message.body as? String, let data = body.data(using: .utf8) else {
throw Error.invalidBridgeEvent()
}

do {
return try JSONDecoder().decode(Event.self, from: data)
return try JSONDecoder().decode(WebEvent.self, from: data)
} catch {
throw Error.invalidBridgeEvent(error)
}
Expand All @@ -53,9 +53,10 @@ extension CheckoutBridge {
}

extension CheckoutBridge {
enum Event: Decodable {
enum WebEvent: Decodable {
case checkoutComplete
case checkoutCanceled
case checkoutNotAvailable(String)
case unsupported(String)

enum CodingKeys: String, CodingKey {
Expand All @@ -73,6 +74,8 @@ extension CheckoutBridge {
self = .checkoutComplete
case "close":
self = .checkoutCanceled
case "checkout_not_available":
self = .checkoutNotAvailable(name)
default:
self = .unsupported(name)
}
Expand Down
7 changes: 6 additions & 1 deletion Sources/ShopifyCheckout/CheckoutView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -97,9 +97,14 @@ class CheckoutView: WKWebView {
extension CheckoutView: WKScriptMessageHandler {
func userContentController(_ controller: WKUserContentController, didReceive message: WKScriptMessage) {
do {
if case .checkoutComplete = try CheckoutBridge.decode(message) {
switch try CheckoutBridge.decode(message) {
case .checkoutComplete:
CheckoutView.cache = nil
viewDelegate?.checkoutViewDidCompleteCheckout()
case .checkoutNotAvailable(let message):
CheckoutView.cache = nil
viewDelegate?.checkoutViewDidFailWithError(error: .checkoutNotAvailable(message: message))
default: break
}
} catch {
viewDelegate?.checkoutViewDidFailWithError(error: .sdkError(underlying: error))
Expand Down
6 changes: 3 additions & 3 deletions Tests/ShopifyCheckoutTests/CheckoutBridgeTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ class CheckoutBridgeTests: XCTestCase {

let result = try CheckoutBridge.decode(mock)

guard case CheckoutBridge.Event.unsupported = result else {
guard case CheckoutBridge.WebEvent.unsupported = result else {
return XCTFail("expected CheckoutScriptMessage.unsupportedEvent, got \(result)")
}
}
Expand All @@ -79,7 +79,7 @@ class CheckoutBridgeTests: XCTestCase {

let result = try CheckoutBridge.decode(mock)

guard case CheckoutBridge.Event.checkoutCanceled = result else {
guard case CheckoutBridge.WebEvent.checkoutCanceled = result else {
return XCTFail("expected CheckoutScriptMessage.checkoutCanceled, got \(result)")
}
}
Expand All @@ -93,7 +93,7 @@ class CheckoutBridgeTests: XCTestCase {

let result = try CheckoutBridge.decode(mock)

guard case CheckoutBridge.Event.checkoutComplete = result else {
guard case CheckoutBridge.WebEvent.checkoutComplete = result else {
return XCTFail("expected CheckoutScriptMessage.checkoutComplete, got \(result)")
}
}
Expand Down

0 comments on commit 74bd05c

Please sign in to comment.