Skip to content

Commit 46cbd78

Browse files
committed
Extract details that need to be persisted (email, phone, etc.) into LinkSignupDetails, and put it on the IntentConfirmParams
1 parent b4fdd1b commit 46cbd78

File tree

10 files changed

+49
-38
lines changed

10 files changed

+49
-38
lines changed

Stripe/StripeiOSTests/LinkSignupViewModelTests.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import StripeCoreTestUtils
1212
import XCTest
1313

1414
@testable@_spi(STP) import Stripe
15-
@testable@_spi(STP) import StripeCore
1615
@testable@_spi(STP) import StripePayments
1716
@testable@_spi(STP) import StripePaymentSheet
1817
import StripePaymentsTestUtils

StripePaymentSheet/StripePaymentSheet/Source/Internal/Link/Elements/InlineSignup/LinkInlineSignupElement.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import UIKit
1111

1212
// TODO: Refactor this to be a ContainerElement and contain its sub-elements.
1313
final class LinkInlineSignupElement: Element {
14+
1415
let collectsUserInput: Bool = true
1516

1617
let signupView: LinkInlineSignupView
@@ -55,13 +56,11 @@ final class LinkInlineSignupElement: Element {
5556
self.signupView = LinkInlineSignupView(viewModel: viewModel)
5657
self.signupView.delegate = self
5758
}
58-
5959
}
6060

6161
extension LinkInlineSignupElement: LinkInlineSignupViewDelegate {
6262

6363
func inlineSignupViewDidUpdate(_ view: LinkInlineSignupView) {
6464
delegate?.didUpdate(element: self)
6565
}
66-
6766
}

StripePaymentSheet/StripePaymentSheet/Source/Internal/Link/Services/LinkAccountService.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ final class LinkAccountService: LinkAccountServiceProtocol {
4848
for: email,
4949
with: apiClient
5050
) { [apiClient] result in
51+
sleep(10)
5152
switch result {
5253
case .success(let lookupResponse):
5354
STPAnalyticsClient.sharedClient.logLinkAccountLookupComplete(lookupResult: lookupResponse.responseType)

StripePaymentSheet/StripePaymentSheet/Source/Internal/Link/ViewModels/LinkInlineSignupViewModel.swift

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,16 @@ protocol LinkInlineSignupViewModelDelegate: AnyObject {
1515
func signupViewModelDidUpdate(_ viewModel: LinkInlineSignupViewModel)
1616
}
1717

18+
struct LinkSignupDetails: Equatable {
19+
let account: PaymentSheetLinkAccount
20+
let phoneNumber: PhoneNumber
21+
let legalName: String?
22+
let consentAction: PaymentSheetLinkAccount.ConsentAction
23+
}
24+
1825
final class LinkInlineSignupViewModel {
1926
enum Action: Equatable {
20-
case signupAndPay(account: PaymentSheetLinkAccount, phoneNumber: PhoneNumber, legalName: String?)
27+
case signupAndPay(LinkSignupDetails)
2128
case continueWithoutLink
2229
}
2330

@@ -227,9 +234,12 @@ final class LinkInlineSignupViewModel {
227234
}
228235

229236
return .signupAndPay(
230-
account: linkAccount,
231-
phoneNumber: phoneNumber,
232-
legalName: requiresNameCollection ? legalName : nil
237+
.init(
238+
account: linkAccount,
239+
phoneNumber: phoneNumber,
240+
legalName: requiresNameCollection ? legalName : nil,
241+
consentAction: consentAction
242+
)
233243
)
234244
case .verified, .requiresVerification:
235245
// This should never happen: The session should only be verified as part of the signup request,

StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/IntentConfirmParams.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ final class IntentConfirmParams {
3434
/// If `true`, a mandate (e.g. "By continuing you authorize Foo Corp to use your payment details for recurring payments...") was displayed to the customer.
3535
var didDisplayMandate: Bool = false
3636

37+
/// Populated when Link signup is filled out in the form.
38+
var linkSignupDetails: LinkSignupDetails?
3739
var financialConnectionsLinkedBank: FinancialConnectionsLinkedBank?
3840
var instantDebitsLinkedBank: InstantDebitsLinkedBank?
3941

StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Link/PaymentSheet-LinkConfirmOption.swift

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,11 @@ extension PaymentSheet {
1818

1919
/// Signup for Link then pay.
2020
case signUp(
21-
account: PaymentSheetLinkAccount,
22-
phoneNumber: PhoneNumber,
23-
consentAction: PaymentSheetLinkAccount.ConsentAction,
24-
legalName: String?,
21+
details: LinkSignupDetails,
22+
// account: PaymentSheetLinkAccount,
23+
// phoneNumber: PhoneNumber,
24+
// consentAction: PaymentSheetLinkAccount.ConsentAction,
25+
// legalName: String?,
2526
intentConfirmParams: IntentConfirmParams
2627
)
2728

@@ -37,12 +38,13 @@ extension PaymentSheet {
3738

3839
extension PaymentSheet.LinkConfirmOption {
3940

41+
// TODO: Can we get rid of this? Can we remove details from the signup case assoc val?
4042
var account: PaymentSheetLinkAccount? {
4143
switch self {
4244
case .wallet:
4345
return nil
44-
case .signUp(let account, _, _, _, _):
45-
return account
46+
case .signUp(let details, _):
47+
return details.account
4648
case .withPaymentMethod:
4749
return nil
4850
}
@@ -52,7 +54,7 @@ extension PaymentSheet.LinkConfirmOption {
5254
switch self {
5355
case .wallet:
5456
return STPPaymentMethodType.link.displayName
55-
case .signUp(_, _, _, _, let intentConfirmParams):
57+
case .signUp(_, let intentConfirmParams):
5658
return intentConfirmParams.paymentMethodParams.paymentSheetLabel
5759
case .withPaymentMethod(let paymentMethod):
5860
return paymentMethod.paymentSheetLabel
@@ -63,7 +65,7 @@ extension PaymentSheet.LinkConfirmOption {
6365
switch self {
6466
case .wallet:
6567
return nil
66-
case .signUp(_, _, _, _, let intentConfirmParams):
68+
case .signUp(_, let intentConfirmParams):
6769
return intentConfirmParams.paymentMethodParams.billingDetails
6870
case .withPaymentMethod(let paymentMethod):
6971
return paymentMethod.billingDetails

StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/PaymentSheet+API.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -438,17 +438,17 @@ extension PaymentSheet {
438438
let linkController = PayWithLinkController(intent: intent, elementsSession: elementsSession, configuration: configuration)
439439
linkController.present(from: authenticationContext.authenticationPresentingViewController(),
440440
completion: completion)
441-
case .signUp(let linkAccount, let phoneNumber, let consentAction, let legalName, let intentConfirmParams):
442-
linkAccount.signUp(with: phoneNumber, legalName: legalName, consentAction: consentAction) { result in
441+
case let .signUp(details: details, intentConfirmParams: intentConfirmParams):
442+
details.account.signUp(with: details.phoneNumber, legalName: details.legalName, consentAction: details.consentAction) { result in
443443
UserDefaults.standard.markLinkAsUsed()
444444
switch result {
445445
case .success:
446446
STPAnalyticsClient.sharedClient.logLinkSignupComplete()
447-
createPaymentDetailsAndConfirm(linkAccount, intentConfirmParams.paymentMethodParams, intentConfirmParams.saveForFutureUseCheckboxState == .selected)
447+
createPaymentDetailsAndConfirm(details.account, intentConfirmParams.paymentMethodParams, intentConfirmParams.saveForFutureUseCheckboxState == .selected)
448448
case .failure(let error as NSError):
449449
STPAnalyticsClient.sharedClient.logLinkSignupFailure(error: error)
450450
// Attempt to confirm directly with params as a fallback.
451-
confirmWithPaymentMethodParams(intentConfirmParams.paymentMethodParams, linkAccount, intentConfirmParams.saveForFutureUseCheckboxState == .selected)
451+
confirmWithPaymentMethodParams(intentConfirmParams.paymentMethodParams, details.account, intentConfirmParams.saveForFutureUseCheckboxState == .selected)
452452
}
453453
}
454454
case .withPaymentMethod(let paymentMethod):

StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/ViewControllers/PaymentMethodFormViewController.swift

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,18 +28,12 @@ class PaymentMethodFormViewController: UIViewController {
2828
params.setDefaultBillingDetailsIfNecessary(for: configuration)
2929

3030
if let params = form.updateParams(params: params) {
31+
// Hack: determine this is a Link signup by looking for the LinkInlineSignupElement
3132
if let linkInlineSignupElement = form.getAllUnwrappedSubElements().compactMap({ $0 as? LinkInlineSignupElement }).first {
3233
switch linkInlineSignupElement.action {
33-
case .signupAndPay(let account, let phoneNumber, let legalName):
34-
return .link(
35-
option: .signUp(
36-
account: account,
37-
phoneNumber: phoneNumber,
38-
consentAction: linkInlineSignupElement.viewModel.consentAction,
39-
legalName: legalName,
40-
intentConfirmParams: params
41-
)
42-
)
34+
case .signupAndPay(let signupDetails):
35+
params.linkSignupDetails = signupDetails // Hack: instead of this, the LinkInlineSignupElement should update its params with these details
36+
return .link(option: .signUp(details: signupDetails, intentConfirmParams: params))
4337
case .continueWithoutLink:
4438
return .new(confirmParams: params)
4539
case .none:

StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/CardSectionElementTest.swift

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@
55
// Created by Yuki Tokuhiro on 10/2/24.
66
//
77

8-
import XCTest
98
@testable@_spi(STP) import StripeCore
109
@testable@_spi(STP) import StripePayments
1110
@testable@_spi(STP) import StripePaymentSheet
1211
@testable@_spi(STP) import StripePaymentsTestUtils
1312
@testable@_spi(STP) import StripePaymentsUI
1413
@testable@_spi(STP) import StripeUICore
14+
import XCTest
1515

1616
@MainActor
1717
final class CardSectionElementTest: XCTestCase {
@@ -46,19 +46,18 @@ final class CardSectionElementTest: XCTestCase {
4646
let checkbox = form.getCheckboxElement(startingWith: "Save payment details")!
4747
let linkInlineSignupElement: LinkInlineSignupElement = form.getElement()!
4848
let linkInlineView = linkInlineSignupElement.signupView
49-
49+
5050
XCTAssertNotNil(checkbox) // Checkbox should appear since this is a PI w/ customer
5151
form.getTextFieldElement("Card number")?.setText("4242424242424242")
5252
form.getTextFieldElement("MM / YY").setText("1232")
5353
form.getTextFieldElement("CVC").setText("123")
5454
form.getTextFieldElement("ZIP").setText("65432")
55-
55+
5656
XCTAssertEqual(form.getAllUnwrappedSubElements().count, 14)
57-
// XCTAssertNotNil(form.mandateString)
5857
// Simulate selecting checkbox
5958
checkbox.isSelected = true
6059
checkbox.didToggleCheckbox()
61-
60+
6261
// Set the email & phone number
6362
linkInlineView.emailElement.emailAddressElement.setText("\(UUID().uuidString)@foo.com")
6463
linkInlineView.phoneNumberElement.countryDropdownElement.setRawData("GB")
@@ -79,10 +78,10 @@ final class CardSectionElementTest: XCTestCase {
7978
// Ensure checkbox remains selected
8079
XCTAssertTrue(regeneratedForm.getCheckboxElement(startingWith: "Save payment details")!.isSelected)
8180
XCTAssertEqual(regeneratedIntentConfirmParams, intentConfirmParams)
82-
let linkInlineSignupElement2: LinkInlineSignupElement = regeneratedForm.getElement()!
83-
let linkInlineView2 = linkInlineSignupElement2.signupView
84-
print(linkInlineView2)
85-
81+
let regeneratedLinkInlineSignupElement: LinkInlineSignupElement = regeneratedForm.getElement()!
82+
let regeneratedLinkInlineView = regeneratedLinkInlineSignupElement.signupView
83+
XCTAssertEqual(regeneratedLinkInlineView.phoneNumberElement.phoneNumber, PhoneNumber(number: "1234567890", countryCode: "GB"))
84+
// print(linkInlineView2)
8685
}
8786
}
8887

StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/PaymentSheetLPMConfirmFlowTests.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -980,6 +980,11 @@ extension IntentConfirmParams: Equatable {
980980
return false
981981
}
982982

983+
if lhs.linkSignupDetails != rhs.linkSignupDetails {
984+
print("Link signup details not equal: \(lhs.linkSignupDetails.debugDescription) vs \(rhs.linkSignupDetails.debugDescription)")
985+
return false
986+
}
987+
983988
// Sanity check to make sure when we add new properties, we check them here
984989
let mirror = Mirror(reflecting: lhs)
985990
let propertyCount = mirror.children.count

0 commit comments

Comments
 (0)