Skip to content

Add the BTPayPalSavedPaymentMethodView checkout component 4/6 - #1888

Merged
agedd merged 3 commits into
braintree:view-edit-fi-beta-featurefrom
saurabh-P9525:feature/saved-pm-4-view
Oct 22, 2026
Merged

agedd merged 3 commits into
braintree:view-edit-fi-beta-featurefrom
saurabh-P9525:feature/saved-pm-4-view

Conversation

@saurabh-P9525

@saurabh-P9525 saurabh-P9525 commented Sep 30, 2026 •

Copy link
Copy Markdown

Part 4 of the View/Edit FI saved payment method component. Adds the public PayPalSavedPaymentMethodView that composes the rows and drives the edit flow.

Part 4 of a 6-part split, rebased on view-edit-fi-beta-feature now that #1884 (1/6), #1886 (2/6) and #1887 (3/6) have merged. It builds on its own and all unit tests pass.

Summary of changes

  • PayPalSavedPaymentMethodView (public, SwiftUI) takes the checkout request, PayPalSavedPaymentMethodRequest, the client token, the universal link and an optional style, and reports the edit's (nonce, error) through completion.
    • Shows the loading skeleton, the funding-instrument row and the Pay Later row based on the view model's state, and refetches the message when the amount changes.
    • When there is no FI or email to show (a failed fetch, an empty response, or a failed refresh after an edit), it shows only the PayPal brand mark. It hides entirely only if the merchant also hides both the logo and the label.
    • Shows a full-screen loader while the edit paysheet is prepared. It reports the loader's appear/dismiss to the view model, so the merchant's completion is only delivered once the loader is gone.
    • Resets on returning to the foreground, for an abandoned PayPal app switch.
    • Presents "Learn more" in SFSafariViewController (PayPalCreditMessagingLanderView) when PayPal allows embedding, otherwise opens it externally. Safari's "Done" closes it.
  • PayPalSavedPaymentMethodSkeletonRow: the shimmer placeholders shown while loading.
  • Loading spinner asset.

Screenshots

Rendered from PayPalSavedPaymentMethodView in a test, one per state and a few merchant styles.

Component states

Loading

Card + Pay Later

Card, no Pay Later message

PayPal product (label instead of digits)

Email only, editable

Email only, not editable

Brand only (no FI or email)

Merchant style (background, border, corners)

Dark merchant theme

Large accessibility text

Notes for reviewers

  • Render tests cover every state and style permutation (including negative and zero values), and compare output where it matters: the Pay Later line, the brand mark, the edit pencil, and the logo/label-hidden case. They seed the Pay Later message through the view model's preview initializer.

AI Usage

Which AI Agent Was Used?

  • Copilot
  • Claude
  • Other (Type Name Here)

How was AI used?
Used Claude to write the composed view and its render tests, and to split this part out.

Estimated AI Code Contribution

  • less than 30%
  • 30 - 60%
  • 60 - 100%

Checklist

  • Added a changelog entry
  • Tested and confirmed payment flows affected by this change are functioning as expected

Authors

List GitHub usernames for everyone who contributed to this pull request.


Inner Source Process

Internal to PayPal contributors should fill out this section. All others can delete.

PR should follow these steps before codeowners review will begin:

  1. Comment /inner source on this PR — this will automatically add the inner source and tech lead review required labels. Open the PR in a draft state.
  2. PR should be reviewed by and approved by your team's technical lead, we do not allow LGTM reviews, there should be comments and feedback provided on all PR reviews
  3. Once the above steps are completed, comment /ready on this PR — this will automatically remove the tech lead review required label. Move the PR to ready to review.
  4. PR comments must be addressed within 24 hours, if you are unable to address within this timeframe, move the PR back to a draft state so our team knows not to review

Inner Source Checklist

  • Added all labels to the PR
  • Provide steps to test the flows changed, if applicable in the summary
  • Demo video of the functionality, if applicable
  • All upstream dependencies are merged in and this PR can be released at any time; PRs should not be opened until this is true
  • Unit tests and builds have been run locally and pass/compile as expected

@saurabh-P9525 saurabh-P9525 changed the title 4/6 Add the BTPayPalSavedPaymentMethodView checkout component Add the BTPayPalSavedPaymentMethodView checkout component 4/6 Sep 30, 2026
@saurabh-P9525
saurabh-P9525 force-pushed the feature/saved-pm-4-view branch from 864d8c8 to a64b89c Compare October 5, 2026 20:32
Comment thread Sources/BraintreePayPalSavedPaymentMethod/PayPalSavedPaymentMethodView.swift Outdated
Comment thread Sources/BraintreePayPalSavedPaymentMethod/PayPalSavedPaymentMethodView.swift Outdated
@rvmondeti-svg

Copy link
Copy Markdown

Approving. Earlier feedback is addressed and the view composition looks good. Please confirm the SFSafariViewController choice for the Learn more lander (vs ASWebAuthenticationSession) with the team. Add the changelog entry and rebase once 2/6 and 3/6 merge, then /ready.

@saurabh-P9525

Copy link
Copy Markdown
Author

Approving. Earlier feedback is addressed and the view composition looks good. Please confirm the SFSafariViewController choice for the Learn more lander (vs ASWebAuthenticationSession) with the team. Add the changelog entry and rebase once 2/6 and 3/6 merge, then /ready.

Thanks ravi!, I'm keeping SFSafariViewController. The lander is an informational page with no callback, so ASWebAuthenticationSession (built for sign-in flows) doesn't fit. A WKWebView like paypal-messages-ios uses would mean owning link handling, load failures from the API. SFSafariViewController gives us that isolation and shows the buyer which site they're on .

@saurabh-P9525

Copy link
Copy Markdown
Author

/inner source

@github-actions github-actions Bot added inner source This PR is internal to PP but external to the mobile SDK team tech lead review required labels Oct 14, 2026
@saurabh-P9525

Copy link
Copy Markdown
Author

/ready

@saurabh-P9525
saurabh-P9525 marked this pull request as ready for review October 14, 2026 15:52
@saurabh-P9525
saurabh-P9525 requested a review from a team as a code owner October 14, 2026 15:52
@buzzamus

Copy link
Copy Markdown
Contributor

I think you have some build issues going on currently with this PR:

    - ERROR | [iOS] [Braintree/PayPalSavedPaymentMethod] xcodebuild: Returned an unsuccessful exit code. You can use `--verbose` for more information.
    - NOTE  | [iOS] [Braintree/PayPalSavedPaymentMethod] xcodebuild:  note: Target dependency graph (8 targets)
    - NOTE  | [iOS] [Braintree/PayPalSavedPaymentMethod] xcodebuild:  note: Emplaced /Users/runner/Library/Developer/Xcode/DerivedData/App-eguouhyymatkoxgcwyfptvdbfake/Build/Products/Release-iphonesimulator/Braintree/BraintreePayPalSavedPaymentMethod.bundle/Assets.car (in target 'Braintree-BraintreePayPalSavedPaymentMethod' from project 'Pods')
    - ERROR | [Braintree/PayPalSavedPaymentMethod] xcodebuild:  /Users/runner/work/braintree_ios/braintree_ios/Sources/BraintreePayPalSavedPaymentMethod/PayPalSavedPaymentMethodSkeletonRow.swift:62:13: error: cannot find 'PayPalBrandCluster' in scope
    - ERROR | [Braintree/PayPalSavedPaymentMethod] xcodebuild:  /Users/runner/work/braintree_ios/braintree_ios/Sources/BraintreePayPalSavedPaymentMethod/PayPalSavedPaymentMethodView.swift:24:41: error: cannot find type 'PayPalSavedPaymentMethodViewModel' in scope
    - ERROR | [Braintree/PayPalSavedPaymentMethod] xcodebuild:  /Users/runner/work/braintree_ios/braintree_ios/Sources/BraintreePayPalSavedPaymentMethod/PayPalSavedPaymentMethodView.swift:71:20: error: cannot find type 'PayPalSavedPaymentMethodViewModel' in scope
    - ERROR | [Braintree/PayPalSavedPaymentMethod] xcodebuild:  /Users/runner/work/braintree_ios/braintree_ios/Sources/BraintreePayPalSavedPaymentMethod/PayPalSavedPaymentMethodView.swift:269:18: error: cannot find type 'PayPalSavedPaymentMethodViewModel' in scope
    - ERROR | [Braintree/PayPalSavedPaymentMethod] xcodebuild:  /Users/runner/work/braintree_ios/braintree_ios/Sources/BraintreePayPalSavedPaymentMethod/PayPalSavedPaymentMethodView.swift:60:27: error: cannot find 'PayPalSavedPaymentMethodViewModel' in scope
    - ERROR | [Braintree/PayPalSavedPaymentMethod] xcodebuild:  /Users/runner/work/braintree_ios/braintree_ios/Sources/BraintreePayPalSavedPaymentMethod/PayPalSavedPaymentMethodView.swift:125:44: error: cannot infer contextual base in reference to member 'loading'
    - ERROR | [Braintree/PayPalSavedPaymentMethod] xcodebuild:  /Users/runner/work/braintree_ios/braintree_ios/Sources/BraintreePayPalSavedPaymentMethod/PayPalSavedPaymentMethodView.swift:171:13: error: cannot find 'EditFIRow' in scope
    - ERROR | [Braintree/PayPalSavedPaymentMethod] xcodebuild:  /Users/runner/work/braintree_ios/braintree_ios/Sources/BraintreePayPalSavedPaymentMethod/PayPalSavedPaymentMethodView.swift:173:13: error: cannot find 'EditFIRow' in scope
    - ERROR | [Braintree/PayPalSavedPaymentMethod] xcodebuild:  /Users/runner/work/braintree_ios/braintree_ios/Sources/BraintreePayPalSavedPaymentMethod/PayPalSavedPaymentMethodView.swift:175:13: error: cannot find 'EditFIRow' in scope
    - ERROR | [Braintree/PayPalSavedPaymentMethod] xcodebuild:  /Users/runner/work/braintree_ios/braintree_ios/Sources/BraintreePayPalSavedPaymentMethod/PayPalSavedPaymentMethodView.swift:189:21: error: cannot find 'CreditMessagingRow' in scope
    - ERROR | [Braintree/PayPalSavedPaymentMethod] xcodebuild:  /Users/runner/work/braintree_ios/braintree_ios/Sources/BraintreePayPalSavedPaymentMethod/PayPalSavedPaymentMethodView.swift:275:28: error: cannot find 'PayPalSavedPaymentMethodViewModel' in scope
    - ERROR | [Braintree/PayPalSavedPaymentMethod] xcodebuild:  /Users/runner/work/braintree_ios/braintree_ios/Sources/BraintreePayPalSavedPaymentMethod/PayPalSavedPaymentMethodView.swift:275:28: error: extra argument 'viewModel' in call
    - ERROR | [Braintree/PayPalSavedPaymentMethod] xcodebuild:  /Users/runner/work/braintree_ios/braintree_ios/Sources/BraintreePayPalSavedPaymentMethod/PayPalSavedPaymentMethodView.swift:274:41: error: missing arguments for parameters 'authorization', 'universalLink', 'payPalCheckoutRequest', 'request', 'completion' in call
    - NOTE  | [Braintree/PayPalSavedPaymentMethod] xcodebuild:  /Users/runner/work/braintree_ios/braintree_ios/Sources/BraintreePayPalSavedPaymentMethod/PayPalSavedPaymentMethodView.swift:47:12: note: 'init(authorization:universalLink:payPalCheckoutRequest:request:fallbackURLScheme:style:completion:)' declared here
    - ERROR | [Braintree/PayPalSavedPaymentMethod] xcodebuild:  /Users/runner/work/braintree_ios/braintree_ios/Sources/BraintreePayPalSavedPaymentMethod/PayPalSavedPaymentMethodView.swift:321:48: error: cannot infer contextual base in reference to member 'loading'
    - NOTE  | [iOS] [Braintree/PayPalSavedPaymentMethod] xcodebuild:  note: Disabling previews because SWIFT_VERSION is set and SWIFT_OPTIMIZATION_LEVEL=-O, expected -Onone (in target 'Braintree-BraintreePayPalSavedPaymentMethod_PrivacyInfo' from project 'Pods')
    - NOTE  | [iOS] [Braintree/PayPalSavedPaymentMethod] xcodebuild:  note: Disabling previews because SWIFT_VERSION is set and SWIFT_OPTIMIZATION_LEVEL=-O, expected -Onone (in target 'Braintree-BraintreePayPalSavedPaymentMethod' from project 'Pods')

Comment on lines +7 to +16
struct PayPalCreditMessagingLanderView: UIViewControllerRepresentable {

let url: URL

func makeUIViewController(context: Context) -> SFSafariViewController {
SFSafariViewController(url: url)
}

func updateUIViewController(_ controller: SFSafariViewController, context: Context) {}
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it seems like there's no SFSafariViewControllerDelegate here, so tapping safari's built-in "Done" button never fires safariViewControllerDidFinish(_:) — and without that callback dismissing it, nothing flips viewModel.isLanderPresented back to false. this could potentially result in a case where buyer who taps "Done" could be stuck looking at a lander with no way back short of swiping the sheet down manually.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added an SFSafariViewControllerDelegate coordinator, so tapping "Done" now calls back and clears the presented lander in the view model.

Comment on lines +101 to +105
.sheet(isPresented: $viewModel.isLanderPresented) {
if let url = viewModel.learnMoreURL {
PayPalCreditMessagingLanderView(url: url)
}
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

worth adding a check here -> if isLanderPresented ever becomes true while viewModel.learnMoreURL is nil, this presents an empty sheet with nothing in it — there's no else branch or fallback.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed. The view model now stores the presented lander with its URL, captured at tap time, and the view uses .sheet(item:), so the sheet can't open without a URL.

Comment on lines +117 to +120
/// Read-only binding: the loader is dismissed by the view model, not by user interaction.
private var editLoaderBinding: Binding<Bool> {
Binding(get: { viewModel.isEditing }, set: { _ in })
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hmm i think the binding's setter is a no-op and it'd be safer to explicitly add .interactiveDismissDisabled(true) on the cover

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added .interactiveDismissDisabled(true) to the cover. A full-screen cover can't be swiped away anyway, but this makes it explicit that only the view model dismisses it.

width: EditFIStyleDefaultConstants.editLoaderSpinnerSide,
height: EditFIStyleDefaultConstants.editLoaderSpinnerSide
)
.foregroundColor(.black)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: can we use a constant here in place of black like we do for the other params

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done. Moved it to EditFIStyleDefaultConstants.editLoaderSpinnerColor.

@saurabh-P9525
saurabh-P9525 force-pushed the feature/saved-pm-4-view branch from 92f0bd9 to 95e4999 Compare October 15, 2026 07:16
@saurabh-P9525

Copy link
Copy Markdown
Author

I think you have some build issues going on currently with this PR:

    - ERROR | [iOS] [Braintree/PayPalSavedPaymentMethod] xcodebuild: Returned an unsuccessful exit code. You can use `--verbose` for more information.
    - NOTE  | [iOS] [Braintree/PayPalSavedPaymentMethod] xcodebuild:  note: Target dependency graph (8 targets)
    - NOTE  | [iOS] [Braintree/PayPalSavedPaymentMethod] xcodebuild:  note: Emplaced /Users/runner/Library/Developer/Xcode/DerivedData/App-eguouhyymatkoxgcwyfptvdbfake/Build/Products/Release-iphonesimulator/Braintree/BraintreePayPalSavedPaymentMethod.bundle/Assets.car (in target 'Braintree-BraintreePayPalSavedPaymentMethod' from project 'Pods')
    - ERROR | [Braintree/PayPalSavedPaymentMethod] xcodebuild:  /Users/runner/work/braintree_ios/braintree_ios/Sources/BraintreePayPalSavedPaymentMethod/PayPalSavedPaymentMethodSkeletonRow.swift:62:13: error: cannot find 'PayPalBrandCluster' in scope
    - ERROR | [Braintree/PayPalSavedPaymentMethod] xcodebuild:  /Users/runner/work/braintree_ios/braintree_ios/Sources/BraintreePayPalSavedPaymentMethod/PayPalSavedPaymentMethodView.swift:24:41: error: cannot find type 'PayPalSavedPaymentMethodViewModel' in scope
    - ERROR | [Braintree/PayPalSavedPaymentMethod] xcodebuild:  /Users/runner/work/braintree_ios/braintree_ios/Sources/BraintreePayPalSavedPaymentMethod/PayPalSavedPaymentMethodView.swift:71:20: error: cannot find type 'PayPalSavedPaymentMethodViewModel' in scope
    - ERROR | [Braintree/PayPalSavedPaymentMethod] xcodebuild:  /Users/runner/work/braintree_ios/braintree_ios/Sources/BraintreePayPalSavedPaymentMethod/PayPalSavedPaymentMethodView.swift:269:18: error: cannot find type 'PayPalSavedPaymentMethodViewModel' in scope
    - ERROR | [Braintree/PayPalSavedPaymentMethod] xcodebuild:  /Users/runner/work/braintree_ios/braintree_ios/Sources/BraintreePayPalSavedPaymentMethod/PayPalSavedPaymentMethodView.swift:60:27: error: cannot find 'PayPalSavedPaymentMethodViewModel' in scope
    - ERROR | [Braintree/PayPalSavedPaymentMethod] xcodebuild:  /Users/runner/work/braintree_ios/braintree_ios/Sources/BraintreePayPalSavedPaymentMethod/PayPalSavedPaymentMethodView.swift:125:44: error: cannot infer contextual base in reference to member 'loading'
    - ERROR | [Braintree/PayPalSavedPaymentMethod] xcodebuild:  /Users/runner/work/braintree_ios/braintree_ios/Sources/BraintreePayPalSavedPaymentMethod/PayPalSavedPaymentMethodView.swift:171:13: error: cannot find 'EditFIRow' in scope
    - ERROR | [Braintree/PayPalSavedPaymentMethod] xcodebuild:  /Users/runner/work/braintree_ios/braintree_ios/Sources/BraintreePayPalSavedPaymentMethod/PayPalSavedPaymentMethodView.swift:173:13: error: cannot find 'EditFIRow' in scope
    - ERROR | [Braintree/PayPalSavedPaymentMethod] xcodebuild:  /Users/runner/work/braintree_ios/braintree_ios/Sources/BraintreePayPalSavedPaymentMethod/PayPalSavedPaymentMethodView.swift:175:13: error: cannot find 'EditFIRow' in scope
    - ERROR | [Braintree/PayPalSavedPaymentMethod] xcodebuild:  /Users/runner/work/braintree_ios/braintree_ios/Sources/BraintreePayPalSavedPaymentMethod/PayPalSavedPaymentMethodView.swift:189:21: error: cannot find 'CreditMessagingRow' in scope
    - ERROR | [Braintree/PayPalSavedPaymentMethod] xcodebuild:  /Users/runner/work/braintree_ios/braintree_ios/Sources/BraintreePayPalSavedPaymentMethod/PayPalSavedPaymentMethodView.swift:275:28: error: cannot find 'PayPalSavedPaymentMethodViewModel' in scope
    - ERROR | [Braintree/PayPalSavedPaymentMethod] xcodebuild:  /Users/runner/work/braintree_ios/braintree_ios/Sources/BraintreePayPalSavedPaymentMethod/PayPalSavedPaymentMethodView.swift:275:28: error: extra argument 'viewModel' in call
    - ERROR | [Braintree/PayPalSavedPaymentMethod] xcodebuild:  /Users/runner/work/braintree_ios/braintree_ios/Sources/BraintreePayPalSavedPaymentMethod/PayPalSavedPaymentMethodView.swift:274:41: error: missing arguments for parameters 'authorization', 'universalLink', 'payPalCheckoutRequest', 'request', 'completion' in call
    - NOTE  | [Braintree/PayPalSavedPaymentMethod] xcodebuild:  /Users/runner/work/braintree_ios/braintree_ios/Sources/BraintreePayPalSavedPaymentMethod/PayPalSavedPaymentMethodView.swift:47:12: note: 'init(authorization:universalLink:payPalCheckoutRequest:request:fallbackURLScheme:style:completion:)' declared here
    - ERROR | [Braintree/PayPalSavedPaymentMethod] xcodebuild:  /Users/runner/work/braintree_ios/braintree_ios/Sources/BraintreePayPalSavedPaymentMethod/PayPalSavedPaymentMethodView.swift:321:48: error: cannot infer contextual base in reference to member 'loading'
    - NOTE  | [iOS] [Braintree/PayPalSavedPaymentMethod] xcodebuild:  note: Disabling previews because SWIFT_VERSION is set and SWIFT_OPTIMIZATION_LEVEL=-O, expected -Onone (in target 'Braintree-BraintreePayPalSavedPaymentMethod_PrivacyInfo' from project 'Pods')
    - NOTE  | [iOS] [Braintree/PayPalSavedPaymentMethod] xcodebuild:  note: Disabling previews because SWIFT_VERSION is set and SWIFT_OPTIMIZATION_LEVEL=-O, expected -Onone (in target 'Braintree-BraintreePayPalSavedPaymentMethod' from project 'Pods')

Those errors are because this part depends on parts 2 and 3: at the time it was missing the view model (#1886) and the row components (#1887). #1886 has merged and this branch is rebased on it, and I've confirmed parts 3 and 4 together build and pass all module tests locally. CI here will go green once #1887 merges and I rebase onto it.

@jaxdesmarais

Copy link
Copy Markdown
Contributor

Moving back to draft as the build is failing

@jaxdesmarais
jaxdesmarais marked this pull request as draft October 15, 2026 13:26
@vkspune

vkspune commented Oct 15, 2026

Copy link
Copy Markdown

Approved

Saurabh Pandey added 2 commits October 20, 2026 02:48
The public view, skeleton row and shimmer, edit loader, Learn more lander and LoadingSpinner asset, with render tests. Rebased onto view-edit-fi-beta-feature after braintree#1887 merged.
…nd gap when hidden, group the view's members, and add a changelog entry
@saurabh-P9525
saurabh-P9525 force-pushed the feature/saved-pm-4-view branch from 761ccbf to a6632ef Compare October 19, 2026 21:24
@saurabh-P9525
saurabh-P9525 marked this pull request as ready for review October 19, 2026 21:27
// MARK: - Body

public var body: some View {
Group {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it looks like the modifier sits on a Group that can resolve to EmptyView. can we verify the loader still dismisses if hasNothingToShow flips mid-edit

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, I verified this on device simulators (iOS 18.2 and 26.4) by collapsing the component both when the loader is requested and while it's dismissing: the cover still appears and onDismiss fires, so the result is delivered.

content: {
EditFlowLoadingView()
.clearPresentationBackground()
.interactiveDismissDisabled(true)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i think we can remove this, which has no effect on a fullScreenCover

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, removed

@buzzamus buzzamus left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

After the most recent changes I believe everything looks good! I just kicked off the integration tests again since I believe this is flakey behavior on a backend service

@agedd agedd left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks for making these changes, looking good 🚀

@agedd
agedd merged commit b87b788 into braintree:view-edit-fi-beta-feature Oct 22, 2026
49 of 54 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

inner source This PR is internal to PP but external to the mobile SDK team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants