Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions platforms/android/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,11 @@ Clear unused preloaded checkout work with `invalidate`:
ShopifyCheckoutKit.invalidate()
```

Updating configuration through `ShopifyCheckoutKit.configure {}` triggers
`ShopifyCheckoutKit.invalidate()`. Discarding cached preloads avoids presenting a
stale checkout. If a preload may already have run when configuration changes,
call `preload` again.

Preloading is enabled by default. Disable it when appropriate, for example for data-saver modes or app-specific runtime conditions:

```kotlin
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ public object ShopifyCheckoutKit {
/**
* Allows configuring ShopifyCheckoutKit.
*
* Calling this function invalidates any cached preload.
*
* Kotlin example:
* {@code ShopifyCheckoutKit.configure { it.appearance = CheckoutAppearance.App(ColorScheme.Dark()) }}
*
Expand Down
10 changes: 9 additions & 1 deletion platforms/react-native/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -767,7 +767,15 @@ Instead, a better approach is to call `preload()` when you have a strong enough

### Cache invalidation

Should you wish to manually clear the preload cache, call `invalidate()` on your `ShopifyCheckout` instance or the value returned by `useShopifyCheckout()`.
To manually clear the preload cache, call `invalidate()` on your `ShopifyCheckout`
instance or the value returned by `useShopifyCheckout()`.

Updating configuration through `shopifyCheckout.setConfig(...)` or the
`configuration` prop on `ShopifyCheckoutProvider` triggers
`shopifyCheckout.invalidate()`. Discarding cached preloads avoids presenting a
stale checkout. If a preload may already have run when configuration changes,
call `preload` again. Keep a provider's configuration object stable across renders to
avoid unintentionally invalidating preloads.

## Checkout lifecycle

Expand Down
6 changes: 6 additions & 0 deletions platforms/swift/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,12 @@ Clear unused preloaded checkout work with `invalidate`:
ShopifyCheckoutKit.invalidate()
```

Updating configuration through `ShopifyCheckoutKit.configure {}` or a direct
mutation such as `ShopifyCheckoutKit.configuration.title = "Checkout"` triggers
`ShopifyCheckoutKit.invalidate()`. Discarding cached preloads avoids presenting a
stale checkout. If a preload may already have run when configuration changes,
call `preload` again.

Preloading is enabled by default. Disable it when appropriate, for example for data-saver modes or app-specific runtime conditions:

```swift
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,35 +9,29 @@ public let version = "4.0.0-alpha.5"
private let lockedCheckoutKitConfiguration = LockedValue(Configuration())

/// The configuration options for the `ShopifyCheckoutKit` library.
///
/// Assigning configuration invalidates any cached preload.
public var configuration: Configuration {
get { lockedCheckoutKitConfiguration.get() }
set {
let previousConfiguration = lockedCheckoutKitConfiguration.get()
lockedCheckoutKitConfiguration.set(newValue)
applyConfigurationChange(
configuration: newValue,
previousConfiguration: previousConfiguration
)
applyConfigurationChange(newValue)
}
}

/// A convienence function for configuring the `ShopifyCheckoutKit` library.
/// A convenience function for configuring the `ShopifyCheckoutKit` library.
///
/// Calling this function invalidates any cached preload.
public func configure(_ block: (inout Configuration) -> Void) {
let previousConfiguration = lockedCheckoutKitConfiguration.get()
lockedCheckoutKitConfiguration.update(block)
applyConfigurationChange(
configuration: lockedCheckoutKitConfiguration.get(),
previousConfiguration: previousConfiguration
)
applyConfigurationChange(lockedCheckoutKitConfiguration.get())
}

private func applyConfigurationChange(configuration: Configuration, previousConfiguration: Configuration) {
private func applyConfigurationChange(_ configuration: Configuration) {
OSLogger.shared.logLevel = configuration.logLevel

if configuration.preloading.enabled != previousConfiguration.preloading.enabled {
Task { @MainActor in
invalidate()
}
Task { @MainActor in
invalidate()
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,21 +69,22 @@ class ConfigurationTests: XCTestCase {
XCTAssertFalse(CheckoutWebView.preloadCache.hasEntry())
}

func testChangingConfigurationWithoutChangingPreloadingDoesNotInvalidatePreload() async throws {
func testChangingConfigurationWithoutChangingPreloadingInvalidatesPreload() async throws {
let checkoutURL = try XCTUnwrap(URL(string: "https://shopify1.shopify.com/checkouts/cn/123"))

await Task.yield()
ShopifyCheckoutKit.preload(checkout: checkoutURL)
XCTAssertTrue(CheckoutWebView.preloadCache.hasEntry())

ShopifyCheckoutKit.configure {
$0.title = "Thank you!"
}

for _ in 0 ..< 10 {
for _ in 0 ..< 10 where CheckoutWebView.preloadCache.hasEntry() {
await Task.yield()
}

XCTAssertTrue(CheckoutWebView.preloadCache.hasEntry())
XCTAssertFalse(CheckoutWebView.preloadCache.hasEntry())
}

func testAppearanceCanBeSetDirectly() {
Expand Down
Loading