Skip to content

Commit f8c712a

Browse files
committed
Inject Shipping Address Element dependencies
1 parent 4ad82d6 commit f8c712a

2 files changed

Lines changed: 37 additions & 11 deletions

File tree

StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Checkout/Checkout.swift

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public final class Checkout: ObservableObject {
6060
private var currencySelectorElement: CurrencySelectorElement?
6161

6262
/// The ShippingAddressElement for this Checkout instance.
63-
private var shippingAddressElement: ShippingAddressElement!
63+
private let shippingAddressElement: ShippingAddressElement
6464

6565
// TODO(gbirch) TODO(porter) remove this nonisolatedSession
6666
// once MPE is properly MainActor isolated
@@ -131,12 +131,30 @@ public final class Checkout: ObservableObject {
131131
)
132132
let loadedSession = apiResponse.makePublicSession()
133133
self.session = loadedSession
134-
self.nonisolatedSession = session // temporary hack
134+
self.nonisolatedSession = loadedSession // temporary hack
135+
136+
let defaultShippingAddress: Session.ShippingAddress?
137+
if let shippingDetails = configuration.defaults.shippingDetails,
138+
let address = shippingDetails.address {
139+
defaultShippingAddress = Session.ShippingAddress(
140+
name: shippingDetails.name,
141+
address: address
142+
)
143+
} else {
144+
defaultShippingAddress = nil
145+
}
146+
147+
self.shippingAddressElement = ShippingAddressElement(
148+
configuration: configuration.shippingAddressElement,
149+
initialShippingAddress: defaultShippingAddress ?? loadedSession.shippingAddress,
150+
allowedCountries: loadedSession.allowedShippingCountries,
151+
apiClient: configuration.apiClient,
152+
useAutocompleteEndpoints: loadedSession.elementsSession.shouldUseAutocompleteProxyEndpoints
153+
)
135154

136155
try await applyDefaults()
137156

138-
// Load elements
139-
self.shippingAddressElement = ShippingAddressElement(checkout: self)
157+
// Load remaining elements
140158
self.paymentElement = try await PaymentElement(checkout: self)
141159
let sessionSource = CheckoutSessionSource(initialSession: session, sessionPublisher: $session)
142160
self.expressCheckoutElement = ExpressCheckoutElement(

StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Checkout/Shipping Address Element/ShippingAddressElement.swift

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
//
55
// Created by George Birch on 8/4/26.
66

7+
@_spi(STP) import StripeCore
8+
79
/// A shipping address form backed by a Checkout Session.
810
@MainActor
911
@_spi(STP)
@@ -12,15 +14,21 @@ public final class ShippingAddressElement {
1214

1315
private(set) var addressViewController: AddressViewController!
1416

15-
init(checkout: Checkout) {
16-
let configuration = checkout.configuration.shippingAddressElement.makeAddressViewControllerConfiguration(
17-
shippingAddress: checkout.session.shippingAddress,
18-
allowedCountries: checkout.session.allowedShippingCountries,
19-
apiClient: checkout.apiClient,
20-
useAutocompleteEndpoints: checkout.session.elementsSession.shouldUseAutocompleteProxyEndpoints
17+
init(
18+
configuration: Configuration,
19+
initialShippingAddress: Checkout.Session.ShippingAddress?,
20+
allowedCountries: [String]?,
21+
apiClient: STPAPIClient,
22+
useAutocompleteEndpoints: Bool
23+
) {
24+
let addressViewControllerConfiguration = configuration.makeAddressViewControllerConfiguration(
25+
shippingAddress: initialShippingAddress,
26+
allowedCountries: allowedCountries,
27+
apiClient: apiClient,
28+
useAutocompleteEndpoints: useAutocompleteEndpoints
2129
)
2230
addressViewController = AddressViewController(
23-
configuration: configuration,
31+
configuration: addressViewControllerConfiguration,
2432
delegate: self
2533
)
2634
}

0 commit comments

Comments
 (0)