diff --git a/Example/StripeConnectExample/StripeConnectExample/Info.plist b/Example/StripeConnectExample/StripeConnectExample/Info.plist index 8d9a02536bb..73482145801 100644 --- a/Example/StripeConnectExample/StripeConnectExample/Info.plist +++ b/Example/StripeConnectExample/StripeConnectExample/Info.plist @@ -2,6 +2,58 @@ + CFBundleLocalizations + + bg-BG + zh-Hans + zh-Hant-HK + zh-Hant-TW + hr-HR + cs-CZ + da-DK + nl-NL + en-AU + en-IN + en-IE + en-NZ + en-SG + en-GB + en-US + et-EE + fil-PH + fi-FI + fr-CA + fr-FR + de-DE + el-GR + hu-HU + id-ID + it-IT + ja-JP + ko-KR + lv-LV + lt-LT + ms-MY + mt-MT + nb-NO + pl-PL + pt-BR + pt-PT + ro-RO + sk-SK + sl-SI + es-AR + es-BR + es-419 + es-MX + es-ES + sv-SE + th-TH + tr-TR + vi-VN + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) UIAppFonts Handjet-Regular.ttf diff --git a/StripeConnect/Resources/Localizations/bg-BG.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/bg-BG.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/cs-CZ.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/cs-CZ.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/da-DK.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/da-DK.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/de-DE.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/de-DE.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/el-GR.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/el-GR.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/en-AU.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/en-AU.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/en-GB.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/en-GB.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/en-IE.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/en-IE.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/en-IN.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/en-IN.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/en-NZ.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/en-NZ.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/en-SG.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/en-SG.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/en-US.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/en-US.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/en.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/en.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/es-419.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/es-419.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/es-AR.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/es-AR.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/es-BR.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/es-BR.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/es-ES.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/es-ES.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/es-MX.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/es-MX.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/et-EE.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/et-EE.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/fi-FI.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/fi-FI.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/fil-PH.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/fil-PH.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/fr-CA.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/fr-CA.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/fr-FR.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/fr-FR.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/hr-HR.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/hr-HR.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/hu-HU.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/hu-HU.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/id-ID.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/id-ID.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/it-IT.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/it-IT.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/ja-JP.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/ja-JP.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/ko-KR.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/ko-KR.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/lt-LT.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/lt-LT.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/lv-LV.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/lv-LV.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/ms-MY.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/ms-MY.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/mt-MT.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/mt-MT.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/nb-NO.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/nb-NO.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/nl-NL.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/nl-NL.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/pl-PL.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/pl-PL.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/pt-BR.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/pt-BR.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/pt-PT.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/pt-PT.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/ro-RO.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/ro-RO.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/sk-SK.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/sk-SK.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/sl-SI.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/sl-SI.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/sv-SE.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/sv-SE.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/th-TH.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/th-TH.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/tr-TR.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/tr-TR.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/vi-VN.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/vi-VN.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/zh-Hans.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/zh-Hans.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/zh-Hant-HK.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/zh-Hant-HK.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/Resources/Localizations/zh-Hant-TW.lproj/Localizable.strings b/StripeConnect/Resources/Localizations/zh-Hant-TW.lproj/Localizable.strings deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/StripeConnect/StripeConnect.xcodeproj/project.pbxproj b/StripeConnect/StripeConnect.xcodeproj/project.pbxproj index 7726bcaa304..825b6bcbfeb 100644 --- a/StripeConnect/StripeConnect.xcodeproj/project.pbxproj +++ b/StripeConnect/StripeConnect.xcodeproj/project.pbxproj @@ -68,56 +68,6 @@ 4186664E2C66ACB3003DB62E /* OnLoadErrorMessageHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4186664D2C66ACB3003DB62E /* OnLoadErrorMessageHandler.swift */; }; 41A2A5642C5ABD6C0077FC74 /* StripeConnectTests.xctestplan in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5632C5ABD6C0077FC74 /* StripeConnectTests.xctestplan */; }; 41A2A5682C5AC5120077FC74 /* StripeCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 41A2A5672C5AC5120077FC74 /* StripeCore.framework */; }; - 41A2A5CD2C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A56C2C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5CE2C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A56E2C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5CF2C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5702C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5D02C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5722C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5D12C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5742C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5D22C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5762C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5D32C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5782C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5D42C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A57A2C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5D52C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A57C2C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5D62C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A57E2C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5D72C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5802C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5D82C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5822C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5D92C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5842C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5DA2C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5862C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5DB2C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5882C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5DC2C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A58A2C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5DD2C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A58C2C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5DE2C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A58E2C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5DF2C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5902C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5E02C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5922C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5E12C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5942C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5E22C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5962C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5E32C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5982C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5E42C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A59A2C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5E52C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A59C2C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5E62C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A59E2C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5E72C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5A02C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5E82C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5A22C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5E92C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5A42C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5EA2C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5A62C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5EB2C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5A82C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5EC2C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5AA2C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5ED2C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5AC2C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5EE2C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5AE2C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5EF2C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5B02C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5F02C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5B22C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5F12C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5B42C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5F22C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5B62C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5F32C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5B82C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5F42C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5BA2C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5F52C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5BC2C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5F62C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5BE2C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5F72C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5C02C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5F82C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5C22C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5F92C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5C42C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5FA2C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5C62C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5FB2C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5C82C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5FC2C5ACBDD0077FC74 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41A2A5CA2C5ACBDD0077FC74 /* Localizable.strings */; }; - 41A2A5FE2C5ACCAA0077FC74 /* StripeConnectBundleLocator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41A2A5FD2C5ACCAA0077FC74 /* StripeConnectBundleLocator.swift */; }; - 41A2A6012C5ACD9F0077FC74 /* STPLocalizedString.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41A2A6002C5ACD9F0077FC74 /* STPLocalizedString.swift */; }; 41BCCFEB2C8B348500797E01 /* AppearanceWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41BCCFEA2C8B348500797E01 /* AppearanceWrapper.swift */; }; 41BCCFED2C8B34F600797E01 /* StringCodingKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41BCCFEC2C8B34F600797E01 /* StringCodingKey.swift */; }; 41BCCFF02C8B3C8900797E01 /* AppearanceWrapper+Default.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41BCCFEF2C8B3C8900797E01 /* AppearanceWrapper+Default.swift */; }; @@ -137,6 +87,10 @@ 41D17A6C2C5A7429007C6EE6 /* StripeiOS-Release.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 41D17A612C5A7429007C6EE6 /* StripeiOS-Release.xcconfig */; }; 41D17A6D2C5A7429007C6EE6 /* StripeiOS-Shared.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 41D17A622C5A7429007C6EE6 /* StripeiOS-Shared.xcconfig */; }; 41D17A6E2C5A7429007C6EE6 /* Version.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 41D17A632C5A7429007C6EE6 /* Version.xcconfig */; }; + E6F485F82C9E35A5000D914F /* PaymentDetailsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6F485F72C9E35A5000D914F /* PaymentDetailsViewController.swift */; }; + E6F485FC2C9E360A000D914F /* ConnectJSURLParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6F485FB2C9E360A000D914F /* ConnectJSURLParams.swift */; }; + E6F485FE2C9E36B2000D914F /* PaymentDetailsViewControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6F485FD2C9E36B2000D914F /* PaymentDetailsViewControllerTests.swift */; }; + E6F486092C9E8A40000D914F /* ConnectJSURLParamsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6F486082C9E8A40000D914F /* ConnectJSURLParamsTests.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -211,56 +165,6 @@ 4186664D2C66ACB3003DB62E /* OnLoadErrorMessageHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnLoadErrorMessageHandler.swift; sourceTree = ""; }; 41A2A5632C5ABD6C0077FC74 /* StripeConnectTests.xctestplan */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = StripeConnectTests.xctestplan; sourceTree = ""; }; 41A2A5672C5AC5120077FC74 /* StripeCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = StripeCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 41A2A56B2C5ACBDD0077FC74 /* lt-LT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "lt-LT"; path = "lt-LT.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A56D2C5ACBDD0077FC74 /* zh-Hant-TW */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant-TW"; path = "zh-Hant-TW.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A56F2C5ACBDD0077FC74 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A5712C5ACBDD0077FC74 /* el-GR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "el-GR"; path = "el-GR.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A5732C5ACBDD0077FC74 /* ms-MY */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ms-MY"; path = "ms-MY.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A5752C5ACBDD0077FC74 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; - 41A2A5772C5ACBDD0077FC74 /* it-IT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "it-IT"; path = "it-IT.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A5792C5ACBDD0077FC74 /* zh-Hant-HK */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant-HK"; path = "zh-Hant-HK.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A57B2C5ACBDD0077FC74 /* nb-NO */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "nb-NO"; path = "nb-NO.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A57D2C5ACBDD0077FC74 /* en-GB */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-GB"; path = "en-GB.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A57F2C5ACBDD0077FC74 /* es-419 */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-419"; path = "es-419.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A5812C5ACBDD0077FC74 /* fr-CA */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "fr-CA"; path = "fr-CA.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A5832C5ACBDD0077FC74 /* tr-TR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "tr-TR"; path = "tr-TR.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A5852C5ACBDD0077FC74 /* es-ES */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-ES"; path = "es-ES.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A5872C5ACBDD0077FC74 /* en-SG */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-SG"; path = "en-SG.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A5892C5ACBDD0077FC74 /* fr-FR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "fr-FR"; path = "fr-FR.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A58B2C5ACBDD0077FC74 /* ja-JP */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ja-JP"; path = "ja-JP.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A58D2C5ACBDD0077FC74 /* bg-BG */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "bg-BG"; path = "bg-BG.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A58F2C5ACBDD0077FC74 /* ko-KR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ko-KR"; path = "ko-KR.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A5912C5ACBDD0077FC74 /* id-ID */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "id-ID"; path = "id-ID.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A5932C5ACBDD0077FC74 /* es-AR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-AR"; path = "es-AR.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A5952C5ACBDD0077FC74 /* en-IE */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-IE"; path = "en-IE.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A5972C5ACBDD0077FC74 /* vi-VN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "vi-VN"; path = "vi-VN.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A5992C5ACBDD0077FC74 /* ro-RO */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ro-RO"; path = "ro-RO.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A59B2C5ACBDD0077FC74 /* fi-FI */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "fi-FI"; path = "fi-FI.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A59D2C5ACBDD0077FC74 /* en-NZ */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-NZ"; path = "en-NZ.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A59F2C5ACBDD0077FC74 /* hr-HR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "hr-HR"; path = "hr-HR.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A5A12C5ACBDD0077FC74 /* da-DK */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "da-DK"; path = "da-DK.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A5A32C5ACBDD0077FC74 /* en-AU */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-AU"; path = "en-AU.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A5A52C5ACBDD0077FC74 /* et-EE */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "et-EE"; path = "et-EE.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A5A72C5ACBDD0077FC74 /* hu-HU */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "hu-HU"; path = "hu-HU.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A5A92C5ACBDD0077FC74 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A5AB2C5ACBDD0077FC74 /* lv-LV */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "lv-LV"; path = "lv-LV.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A5AD2C5ACBDD0077FC74 /* nl-NL */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "nl-NL"; path = "nl-NL.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A5AF2C5ACBDD0077FC74 /* es-MX */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-MX"; path = "es-MX.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A5B12C5ACBDD0077FC74 /* cs-CZ */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "cs-CZ"; path = "cs-CZ.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A5B32C5ACBDD0077FC74 /* fil-PH */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "fil-PH"; path = "fil-PH.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A5B52C5ACBDD0077FC74 /* en-US */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-US"; path = "en-US.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A5B72C5ACBDD0077FC74 /* sk-SK */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "sk-SK"; path = "sk-SK.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A5B92C5ACBDD0077FC74 /* de-DE */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "de-DE"; path = "de-DE.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A5BB2C5ACBDD0077FC74 /* sl-SI */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "sl-SI"; path = "sl-SI.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A5BD2C5ACBDD0077FC74 /* es-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-BR"; path = "es-BR.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A5BF2C5ACBDD0077FC74 /* pl-PL */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pl-PL"; path = "pl-PL.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A5C12C5ACBDD0077FC74 /* sv-SE */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "sv-SE"; path = "sv-SE.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A5C32C5ACBDD0077FC74 /* mt-MT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "mt-MT"; path = "mt-MT.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A5C52C5ACBDD0077FC74 /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A5C72C5ACBDD0077FC74 /* th-TH */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "th-TH"; path = "th-TH.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A5C92C5ACBDD0077FC74 /* en-IN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-IN"; path = "en-IN.lproj/Localizable.strings"; sourceTree = ""; }; - 41A2A5FD2C5ACCAA0077FC74 /* StripeConnectBundleLocator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StripeConnectBundleLocator.swift; sourceTree = ""; }; - 41A2A6002C5ACD9F0077FC74 /* STPLocalizedString.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = STPLocalizedString.swift; sourceTree = ""; }; 41BCCFEA2C8B348500797E01 /* AppearanceWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppearanceWrapper.swift; sourceTree = ""; }; 41BCCFEC2C8B34F600797E01 /* StringCodingKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringCodingKey.swift; sourceTree = ""; }; 41BCCFEF2C8B3C8900797E01 /* AppearanceWrapper+Default.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AppearanceWrapper+Default.swift"; sourceTree = ""; }; @@ -281,6 +185,10 @@ 41D17A612C5A7429007C6EE6 /* StripeiOS-Release.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "StripeiOS-Release.xcconfig"; sourceTree = ""; }; 41D17A622C5A7429007C6EE6 /* StripeiOS-Shared.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "StripeiOS-Shared.xcconfig"; sourceTree = ""; }; 41D17A632C5A7429007C6EE6 /* Version.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Version.xcconfig; sourceTree = ""; }; + E6F485F72C9E35A5000D914F /* PaymentDetailsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PaymentDetailsViewController.swift; sourceTree = ""; }; + E6F485FB2C9E360A000D914F /* ConnectJSURLParams.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConnectJSURLParams.swift; sourceTree = ""; }; + E6F485FD2C9E36B2000D914F /* PaymentDetailsViewControllerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PaymentDetailsViewControllerTests.swift; sourceTree = ""; }; + E6F486082C9E8A40000D914F /* ConnectJSURLParamsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectJSURLParamsTests.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -308,9 +216,9 @@ 410D0FD52C6D07B1009B0E26 /* MessageSenders */ = { isa = PBXGroup; children = ( - 410D0FD82C6D1F25009B0E26 /* UpdateConnectInstanceSenderTests.swift */, 410D0FDA2C6D21B0009B0E26 /* CallSetterWithSerializableValueSenderTests.swift */, 410D0FDC2C6D23AD009B0E26 /* ReturnedFromAuthenticatedWebViewSenderTests.swift */, + 410D0FD82C6D1F25009B0E26 /* UpdateConnectInstanceSenderTests.swift */, ); path = MessageSenders; sourceTree = ""; @@ -335,10 +243,10 @@ 413987C02C63F34B001D375E /* MessageSenders */ = { isa = PBXGroup; children = ( - 413987BE2C63F34B001D375E /* MessageSender.swift */, - 413987BF2C63F34B001D375E /* UpdateConnectInstanceSender.swift */, 413987D32C640848001D375E /* CallSetterWithSerializableValueSender.swift */, + 413987BE2C63F34B001D375E /* MessageSender.swift */, 413987D52C64088E001D375E /* ReturnedFromAuthenticatedWebViewSender.swift */, + 413987BF2C63F34B001D375E /* UpdateConnectInstanceSender.swift */, ); path = MessageSenders; sourceTree = ""; @@ -398,9 +306,10 @@ 416E9E792C762C6E00A0B917 /* Components */ = { isa = PBXGroup; children = ( - 416E9E852C76B35E00A0B917 /* PayoutsViewController.swift */, - 416E9E832C76AE0900A0B917 /* ComponentType.swift */, 4171B1582C9A5EEC00547F7D /* AccountOnboardingViewController.swift */, + 416E9E832C76AE0900A0B917 /* ComponentType.swift */, + E6F485F72C9E35A5000D914F /* PaymentDetailsViewController.swift */, + 416E9E852C76B35E00A0B917 /* PayoutsViewController.swift */, ); path = Components; sourceTree = ""; @@ -409,6 +318,7 @@ isa = PBXGroup; children = ( 4161C2722C9D0A8A005BD67C /* AccountOnboardingViewControllerTests.swift */, + E6F485FD2C9E36B2000D914F /* PaymentDetailsViewControllerTests.swift */, 416E9E872C76B36F00A0B917 /* PayoutsViewControllerTests.swift */, ); path = Components; @@ -495,78 +405,13 @@ name = Frameworks; sourceTree = ""; }; - 41A2A5CB2C5ACBDD0077FC74 /* Localizations */ = { - isa = PBXGroup; - children = ( - 41A2A56C2C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A56E2C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5702C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5722C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5742C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5762C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5782C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A57A2C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A57C2C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A57E2C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5802C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5822C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5842C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5862C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5882C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A58A2C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A58C2C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A58E2C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5902C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5922C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5942C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5962C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5982C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A59A2C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A59C2C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A59E2C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5A02C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5A22C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5A42C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5A62C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5A82C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5AA2C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5AC2C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5AE2C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5B02C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5B22C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5B42C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5B62C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5B82C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5BA2C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5BC2C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5BE2C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5C02C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5C22C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5C42C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5C62C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5C82C5ACBDD0077FC74 /* Localizable.strings */, - 41A2A5CA2C5ACBDD0077FC74 /* Localizable.strings */, - ); - path = Localizations; - sourceTree = ""; - }; - 41A2A5CC2C5ACBDD0077FC74 /* Resources */ = { - isa = PBXGroup; - children = ( - 41A2A5CB2C5ACBDD0077FC74 /* Localizations */, - ); - name = Resources; - path = ../Resources; - sourceTree = ""; - }; 41A2A5FF2C5ACD3E0077FC74 /* Helpers */ = { isa = PBXGroup; children = ( - 41A2A5FD2C5ACCAA0077FC74 /* StripeConnectBundleLocator.swift */, - 41A2A6002C5ACD9F0077FC74 /* STPLocalizedString.swift */, - 416E9ECE2C77EAA400A0B917 /* EmbeddedComponentError.swift */, - 413D18472C7FBAA70051AA42 /* CSSHelpers.swift */, 41810D6A2C88E71D00F10EB7 /* Appearance+Encoding.swift */, + E6F485FB2C9E360A000D914F /* ConnectJSURLParams.swift */, + 413D18472C7FBAA70051AA42 /* CSSHelpers.swift */, + 416E9ECE2C77EAA400A0B917 /* EmbeddedComponentError.swift */, 41BCCFEC2C8B34F600797E01 /* StringCodingKey.swift */, ); path = Helpers; @@ -576,6 +421,7 @@ isa = PBXGroup; children = ( 41BCCFEF2C8B3C8900797E01 /* AppearanceWrapper+Default.swift */, + E6F486082C9E8A40000D914F /* ConnectJSURLParamsTests.swift */, 41BCCFF22C8B449800797E01 /* TestHelpers.swift */, ); path = Helpers; @@ -613,7 +459,6 @@ 41D17A422C5A73A6007C6EE6 /* StripeConnect */ = { isa = PBXGroup; children = ( - 41A2A5CC2C5ACBDD0077FC74 /* Resources */, 41A2A5602C5A97130077FC74 /* Source */, 41D17A432C5A73A6007C6EE6 /* StripeConnect.h */, ); @@ -727,53 +572,6 @@ knownRegions = ( en, Base, - "lt-LT", - "zh-Hant-TW", - "zh-Hans", - "el-GR", - "ms-MY", - "it-IT", - "zh-Hant-HK", - "nb-NO", - "en-GB", - "es-419", - "fr-CA", - "tr-TR", - "es-ES", - "en-SG", - "fr-FR", - "ja-JP", - "bg-BG", - "ko-KR", - "id-ID", - "es-AR", - "en-IE", - "vi-VN", - "ro-RO", - "fi-FI", - "en-NZ", - "hr-HR", - "da-DK", - "en-AU", - "et-EE", - "hu-HU", - "pt-BR", - "lv-LV", - "nl-NL", - "es-MX", - "cs-CZ", - "fil-PH", - "en-US", - "sk-SK", - "de-DE", - "sl-SI", - "es-BR", - "pl-PL", - "sv-SE", - "mt-MT", - "pt-PT", - "th-TH", - "en-IN", ); mainGroup = 41D17A362C5A73A6007C6EE6; packageReferences = ( @@ -794,63 +592,15 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 41A2A5D22C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5F02C5ACBDD0077FC74 /* Localizable.strings in Resources */, 41D17A662C5A7429007C6EE6 /* Project-Release.xcconfig in Resources */, - 41A2A5D82C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5CD2C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5DC2C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5E92C5ACBDD0077FC74 /* Localizable.strings in Resources */, 41D17A6C2C5A7429007C6EE6 /* StripeiOS-Release.xcconfig in Resources */, - 41A2A5CF2C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5F52C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5EC2C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5F22C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5D52C5ACBDD0077FC74 /* Localizable.strings in Resources */, 41D17A6D2C5A7429007C6EE6 /* StripeiOS-Shared.xcconfig in Resources */, 41D17A6A2C5A7429007C6EE6 /* StripeiOS Tests-Shared.xcconfig in Resources */, - 41A2A5FC2C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5F12C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5FA2C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5E42C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5F62C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5ED2C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5DB2C5ACBDD0077FC74 /* Localizable.strings in Resources */, 41D17A6B2C5A7429007C6EE6 /* StripeiOS-Debug.xcconfig in Resources */, - 41A2A5E52C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5DA2C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5E22C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5E12C5ACBDD0077FC74 /* Localizable.strings in Resources */, 41A2A5642C5ABD6C0077FC74 /* StripeConnectTests.xctestplan in Resources */, - 41A2A5D62C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5E32C5ACBDD0077FC74 /* Localizable.strings in Resources */, 41D17A672C5A7429007C6EE6 /* Project-Shared.xcconfig in Resources */, - 41A2A5E02C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5EF2C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5F72C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5E82C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5D92C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5DD2C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5F82C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5E62C5ACBDD0077FC74 /* Localizable.strings in Resources */, 41D17A682C5A7429007C6EE6 /* StripeiOS Tests-Debug.xcconfig in Resources */, - 41A2A5F42C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5D72C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5F32C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5D02C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5CE2C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5EB2C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5DE2C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5F92C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5EA2C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5D32C5ACBDD0077FC74 /* Localizable.strings in Resources */, 41D17A6E2C5A7429007C6EE6 /* Version.xcconfig in Resources */, - 41A2A5DF2C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5FB2C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5D12C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5EE2C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5D42C5ACBDD0077FC74 /* Localizable.strings in Resources */, - 41A2A5E72C5ACBDD0077FC74 /* Localizable.strings in Resources */, 41D17A652C5A7429007C6EE6 /* Project-Debug.xcconfig in Resources */, 41D17A692C5A7429007C6EE6 /* StripeiOS Tests-Release.xcconfig in Resources */, ); @@ -884,7 +634,6 @@ 410D0FCE2C6D000B009B0E26 /* OpenAuthenticatedWebViewMessageHandler.swift in Sources */, 413D18482C7FBAA70051AA42 /* CSSHelpers.swift in Sources */, 413987CD2C63F34B001D375E /* MessageSender.swift in Sources */, - 41A2A6012C5ACD9F0077FC74 /* STPLocalizedString.swift in Sources */, 41BCCFF52C8B5A0A00797E01 /* CustomFontSourceWrapper.swift in Sources */, 4161C27E2C9DB566005BD67C /* AccountCollectionOptions.swift in Sources */, 413987CE2C63F34B001D375E /* UpdateConnectInstanceSender.swift in Sources */, @@ -897,6 +646,7 @@ 416E9E742C751A1A00A0B917 /* ConnectComponentWebView.swift in Sources */, 413D18462C7FB75B0051AA42 /* EmbeddedComponentManager+Appearance.swift in Sources */, 41810D6B2C88E71D00F10EB7 /* Appearance+Encoding.swift in Sources */, + E6F485FC2C9E360A000D914F /* ConnectJSURLParams.swift in Sources */, 410D0FE12C6D31A3009B0E26 /* PopupWebViewController.swift in Sources */, 413987CB2C63F34B001D375E /* ScriptMessageHandlerWithReply.swift in Sources */, 41810D7A2C8A0AAD00F10EB7 /* CustomFontSource.swift in Sources */, @@ -909,9 +659,9 @@ 41BCCFED2C8B34F600797E01 /* StringCodingKey.swift in Sources */, 4186664E2C66ACB3003DB62E /* OnLoadErrorMessageHandler.swift in Sources */, 410D0FE52C6D32F0009B0E26 /* ApplicationURLOpener.swift in Sources */, + E6F485F82C9E35A5000D914F /* PaymentDetailsViewController.swift in Sources */, 416E9E762C751B0500A0B917 /* EmbeddedComponentManager.swift in Sources */, 416E9ECF2C77EAA400A0B917 /* EmbeddedComponentError.swift in Sources */, - 41A2A5FE2C5ACCAA0077FC74 /* StripeConnectBundleLocator.swift in Sources */, 410D0FDF2C6D3176009B0E26 /* ConnectWebView.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -922,6 +672,7 @@ files = ( 410D0FDD2C6D23AD009B0E26 /* ReturnedFromAuthenticatedWebViewSenderTests.swift in Sources */, 410D0FD92C6D1F25009B0E26 /* UpdateConnectInstanceSenderTests.swift in Sources */, + E6F486092C9E8A40000D914F /* ConnectJSURLParamsTests.swift in Sources */, 416E9E892C76B36F00A0B917 /* PayoutsViewControllerTests.swift in Sources */, 41814EEB2C6BCAB30014EB5E /* DebugMessageHandlerTests.swift in Sources */, 41814EEF2C6BEF2C0014EB5E /* FetchInitParamsMessageHandlerTests.swift in Sources */, @@ -929,6 +680,7 @@ 410D0FD22C6D047A009B0E26 /* AccountSessionClaimedMessageHandlerTests.swift in Sources */, 41814EF12C6BF94B0014EB5E /* OnExitMessageHandlerTests.swift in Sources */, 4161C2732C9D0A8A005BD67C /* AccountOnboardingViewControllerTests.swift in Sources */, + E6F485FE2C9E36B2000D914F /* PaymentDetailsViewControllerTests.swift in Sources */, 416E9E782C753B7900A0B917 /* ConnectComponentWebViewTests.swift in Sources */, 410D0FD42C6D051B009B0E26 /* OpenAuthenticatedWebViewMessageHandlerTests.swift in Sources */, 410D0FCA2C6CFE27009B0E26 /* OnLoadErrorMessageHandlerTests.swift in Sources */, @@ -956,393 +708,6 @@ }; /* End PBXTargetDependency section */ -/* Begin PBXVariantGroup section */ - 41A2A56C2C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A56B2C5ACBDD0077FC74 /* lt-LT */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A56E2C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A56D2C5ACBDD0077FC74 /* zh-Hant-TW */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5702C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A56F2C5ACBDD0077FC74 /* zh-Hans */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5722C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A5712C5ACBDD0077FC74 /* el-GR */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5742C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A5732C5ACBDD0077FC74 /* ms-MY */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5762C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A5752C5ACBDD0077FC74 /* en */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5782C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A5772C5ACBDD0077FC74 /* it-IT */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A57A2C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A5792C5ACBDD0077FC74 /* zh-Hant-HK */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A57C2C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A57B2C5ACBDD0077FC74 /* nb-NO */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A57E2C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A57D2C5ACBDD0077FC74 /* en-GB */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5802C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A57F2C5ACBDD0077FC74 /* es-419 */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5822C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A5812C5ACBDD0077FC74 /* fr-CA */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5842C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A5832C5ACBDD0077FC74 /* tr-TR */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5862C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A5852C5ACBDD0077FC74 /* es-ES */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5882C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A5872C5ACBDD0077FC74 /* en-SG */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A58A2C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A5892C5ACBDD0077FC74 /* fr-FR */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A58C2C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A58B2C5ACBDD0077FC74 /* ja-JP */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A58E2C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A58D2C5ACBDD0077FC74 /* bg-BG */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5902C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A58F2C5ACBDD0077FC74 /* ko-KR */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5922C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A5912C5ACBDD0077FC74 /* id-ID */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5942C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A5932C5ACBDD0077FC74 /* es-AR */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5962C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A5952C5ACBDD0077FC74 /* en-IE */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5982C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A5972C5ACBDD0077FC74 /* vi-VN */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A59A2C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A5992C5ACBDD0077FC74 /* ro-RO */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A59C2C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A59B2C5ACBDD0077FC74 /* fi-FI */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A59E2C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A59D2C5ACBDD0077FC74 /* en-NZ */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5A02C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A59F2C5ACBDD0077FC74 /* hr-HR */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5A22C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A5A12C5ACBDD0077FC74 /* da-DK */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5A42C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A5A32C5ACBDD0077FC74 /* en-AU */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5A62C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A5A52C5ACBDD0077FC74 /* et-EE */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5A82C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A5A72C5ACBDD0077FC74 /* hu-HU */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5AA2C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A5A92C5ACBDD0077FC74 /* pt-BR */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5AC2C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A5AB2C5ACBDD0077FC74 /* lv-LV */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5AE2C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A5AD2C5ACBDD0077FC74 /* nl-NL */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5B02C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A5AF2C5ACBDD0077FC74 /* es-MX */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5B22C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A5B12C5ACBDD0077FC74 /* cs-CZ */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5B42C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A5B32C5ACBDD0077FC74 /* fil-PH */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5B62C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A5B52C5ACBDD0077FC74 /* en-US */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5B82C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A5B72C5ACBDD0077FC74 /* sk-SK */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5BA2C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A5B92C5ACBDD0077FC74 /* de-DE */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5BC2C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A5BB2C5ACBDD0077FC74 /* sl-SI */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5BE2C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A5BD2C5ACBDD0077FC74 /* es-BR */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5C02C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A5BF2C5ACBDD0077FC74 /* pl-PL */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5C22C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A5C12C5ACBDD0077FC74 /* sv-SE */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5C42C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A5C32C5ACBDD0077FC74 /* mt-MT */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5C62C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A5C52C5ACBDD0077FC74 /* pt-PT */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5C82C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A5C72C5ACBDD0077FC74 /* th-TH */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 41A2A5CA2C5ACBDD0077FC74 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 41A2A5C92C5ACBDD0077FC74 /* en-IN */, - ); - name = Localizable.strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - /* Begin XCBuildConfiguration section */ 41D17A522C5A73A7007C6EE6 /* Debug */ = { isa = XCBuildConfiguration; diff --git a/StripeConnect/StripeConnect/Source/Components/ComponentType.swift b/StripeConnect/StripeConnect/Source/Components/ComponentType.swift index 912db940e05..b5206490568 100644 --- a/StripeConnect/StripeConnect/Source/Components/ComponentType.swift +++ b/StripeConnect/StripeConnect/Source/Components/ComponentType.swift @@ -7,9 +7,12 @@ import Foundation -enum ComponentType: String { +/// The name of the embedded component tag in JS ([docs](https://docs.stripe.com/connect/supported-embedded-components)) +enum ComponentType: String, Encodable { /// Displays the balance summary, the payout schedule, and a list of payouts for the connected account case payouts /// The onboarding flow for the account. case onboarding = "account-onboarding" + /// Show details of a given payment and allow users to manage disputes and perform refunds. + case paymentDetails = "payment-details" } diff --git a/StripeConnect/StripeConnect/Source/Components/PaymentDetailsViewController.swift b/StripeConnect/StripeConnect/Source/Components/PaymentDetailsViewController.swift new file mode 100644 index 00000000000..95fabf7defd --- /dev/null +++ b/StripeConnect/StripeConnect/Source/Components/PaymentDetailsViewController.swift @@ -0,0 +1,73 @@ +// +// PaymentDetailsViewController.swift +// StripeConnect +// +// Created by Mel Ludowise on 8/30/24. +// + +import UIKit + +/** + Show details of a given payment and allow users to manage disputes and perform refunds. + */ +@_spi(DashboardOnly) +@available(iOS 15, *) +public class PaymentDetailsViewController: UIViewController { + let webView: ConnectComponentWebView + + public weak var delegate: PaymentDetailsViewControllerDelegate? + + init(componentManager: EmbeddedComponentManager) { + webView = ConnectComponentWebView( + componentManager: componentManager, + componentType: .paymentDetails + ) + super.init(nibName: nil, bundle: nil) + webView.addMessageHandler(OnLoadErrorMessageHandler { [weak self] value in + guard let self else { return } + self.delegate?.paymentDetailsLoadDidFail(self, withError: value.error.connectEmbedError) + }) + // TODO: Add support for `setOnClose` + webView.presentPopup = { [weak self] vc in + self?.present(vc, animated: true) + } + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + public override func loadView() { + view = webView + } + + public func setPayment(id: String) { + webView.sendMessage(CallSetterWithSerializableValueSender(payload: .init( + setter: "setPayment", + value: id + ))) + } +} + +/// Delegate of an `PaymentDetailsViewController` +@available(iOS 15, *) +@_spi(DashboardOnly) +public protocol PaymentDetailsViewControllerDelegate: AnyObject { + + /** + Triggered when an error occurs loading the payment details component + - Parameters: + - paymentDetails: The payment details component that errored when loading + - error: The error that occurred when loading the component + */ + func paymentDetailsLoadDidFail(_ paymentDetails: PaymentDetailsViewController, + withError error: Error) + +} + +@available(iOS 15, *) +public extension PaymentDetailsViewControllerDelegate { + // Default implementation to make optional + func paymentDetailsLoadDidFail(_ paymentDetails: PaymentDetailsViewController, + withError error: Error) { } +} diff --git a/StripeConnect/StripeConnect/Source/Components/PayoutsViewController.swift b/StripeConnect/StripeConnect/Source/Components/PayoutsViewController.swift index 5c9b0467a7b..223f4231ccb 100644 --- a/StripeConnect/StripeConnect/Source/Components/PayoutsViewController.swift +++ b/StripeConnect/StripeConnect/Source/Components/PayoutsViewController.swift @@ -11,9 +11,10 @@ import UIKit The balance summary, the payout schedule, and a list of payouts for the connected account. It can also allow the user to perform instant or manual payouts. */ @_spi(PrivateBetaConnect) +@available(iOS 15, *) public class PayoutsViewController: UIViewController { let webView: ConnectComponentWebView - + public weak var delegate: PayoutsViewControllerDelegate? init(componentManager: EmbeddedComponentManager, @@ -44,6 +45,7 @@ public class PayoutsViewController: UIViewController { /// Delegate of an `PayoutsViewController` @_spi(PrivateBetaConnect) +@available(iOS 15, *) public protocol PayoutsViewControllerDelegate: AnyObject { /** @@ -57,9 +59,9 @@ public protocol PayoutsViewControllerDelegate: AnyObject { } +@available(iOS 15, *) public extension PayoutsViewControllerDelegate { // Default implementation to make optional func payoutsLoadDidFail(_ payouts: PayoutsViewController, withError error: Error) { } } - diff --git a/StripeConnect/StripeConnect/Source/CustomFontSource.swift b/StripeConnect/StripeConnect/Source/CustomFontSource.swift index 4f92944eb92..dbdcc34ed11 100644 --- a/StripeConnect/StripeConnect/Source/CustomFontSource.swift +++ b/StripeConnect/StripeConnect/Source/CustomFontSource.swift @@ -8,8 +8,9 @@ import UIKit @_spi(PrivateBetaConnect) +@available(iOS 15, *) extension EmbeddedComponentManager { - + /// Use a `CustomFontSource` pass custom fonts embedded in your app's binary when initializing a /// `EmbeddedComponentManager`. /// - Seealso: https://docs.stripe.com/connect/get-started-connect-embedded-components#customize-the-look-of-connect-embedded-components @@ -19,7 +20,7 @@ extension EmbeddedComponentManager { let style: String? let weight: String? let src: FontSource - + /** Initializes a CustomFontSource from a base font and its original file URL - Parameters: @@ -37,15 +38,15 @@ extension EmbeddedComponentManager { } let fontData = try Data(contentsOf: fileUrl) - self.src = .init(fileType: fileUrl.pathExtension, encoding:fontData.base64EncodedString()) + self.src = .init(fileType: fileUrl.pathExtension, encoding: fontData.base64EncodedString()) family = font.familyName style = font.isItalic ? "italic" : nil self.weight = font.weight.cssValue } - + enum FontLoadError: Error, CustomDebugStringConvertible { case notFileURL - + var debugDescription: String { switch self { case .notFileURL: @@ -54,11 +55,11 @@ extension EmbeddedComponentManager { } } } - + struct FontSource: Encodable, Equatable { let fileType: String let encoding: String - + // TODO: CAUI-2844 Move to encoding FontSource directly instead of using a string. var stringValue: String { "url(data:font/\(fileType);charset=utf-8;base64,\(encoding))" diff --git a/StripeConnect/StripeConnect/Source/EmbeddedComponentManager+Appearance.swift b/StripeConnect/StripeConnect/Source/EmbeddedComponentManager+Appearance.swift index 4ef341fdbd0..36a924e08ce 100644 --- a/StripeConnect/StripeConnect/Source/EmbeddedComponentManager+Appearance.swift +++ b/StripeConnect/StripeConnect/Source/EmbeddedComponentManager+Appearance.swift @@ -9,6 +9,7 @@ import UIKit @_spi(PrivateBetaConnect) +@available(iOS 15, *) extension EmbeddedComponentManager { /// Describes the appearance of embedded components. /// - seealso: https://docs.stripe.com/connect/embedded-appearance-options @@ -22,7 +23,7 @@ extension EmbeddedComponentManager { case lowercase /// Displays the text with the first character capitalized. case capitalize - + // Since the public API does not call for TextTransform to be a string // we manually create a raw value here. var rawValue: String { @@ -37,7 +38,7 @@ extension EmbeddedComponentManager { return "capitalize" } } - + init?(rawValue: String) { switch rawValue { case "none": @@ -53,13 +54,14 @@ extension EmbeddedComponentManager { } } } - + /// Describes the typography attributes used in embedded components public struct Typography { /// Describes the font attributes used for a /// typography style in embedded components. public struct Style { - /// The font size for this typography style. + /// The unscaled font size for this typography style. + /// The displayed fonts are automatically scaled when the component's size category is updated. public var fontSize: CGFloat? /// The font weight for this typography style. public var weight: UIFont.Weight? @@ -68,9 +70,9 @@ extension EmbeddedComponentManager { /// Creates a `EmbeddedComponentManager.Appearance.Typography.Stylye` with default values public init() {} - + } - + /// Determines the font family value used throughout embedded components. /// Only the family is used from the specified font. The size and weight can be /// configured from `fontSizeBase` or `fontSize` and `fontWeight` @@ -80,9 +82,10 @@ extension EmbeddedComponentManager { /// `CustomFontSource` when initializing the `EmbeddedComponentManager` before /// referencing them in the appearance's `typography.font` property. public var font: UIFont? - /// The baseline font size set on the embedded component root. - /// This scales the value of other font size variables. - public var fontSizeBase: CGFloat? + /// The unscaled baseline font size set on the embedded component root. + /// This scales the value of other font size variables and is automatically scaled + /// when the component's size category is updated. + public var fontSizeBase: CGFloat? = 16 /// Describes the font size and weight for the medium body typography. /// The `textTransform` property is ignored. public var bodyMd: Style = .init() @@ -103,11 +106,11 @@ extension EmbeddedComponentManager { public var labelMd: Style = .init() /// Describes the font size and weight for the small label typography. public var labelSm: Style = .init() - + /// Creates a `EmbeddedComponentManager.Appearance.Typography` with default values public init() { } } - + /// Describes the colors used in embedded components. /// - Note: If UIColors using dynamicProviders are specified, the appearance will automatically /// update when the component's UITraitCollection is updated (e.g. dark mode) @@ -147,11 +150,11 @@ extension EmbeddedComponentManager { /// The color used for to fill in form items like checkboxes, /// radio buttons and switches. The alpha component is ignored. public var formAccent: UIColor? - + /// Creates a `EmbeddedComponentManager.Appearance.Colors` with default values public init() {} } - + /// Describes the appearance of a button type used in embedded components public struct Button { /// The color used as a background for this button type. @@ -163,11 +166,11 @@ extension EmbeddedComponentManager { /// The text color used for this button type. /// The alpha component is ignored. public var colorText: UIColor? - + /// Creates a `EmbeddedComponentManager.Appearance.Button` with default values public init() { } } - + /// Describes the appearance of a badge type usied in embedded components. public struct Badge { /// The background color for this badge type. @@ -177,11 +180,11 @@ extension EmbeddedComponentManager { public var colorBorder: UIColor? /// The text color for this badge type. The alpha component is ignored. public var colorText: UIColor? - + /// Creates a `EmbeddedComponentManager.Appearance.Badge` with default values public init() {} } - + /// Describes the corner radius used in embedded components. public struct CornerRadius { /// The general border radius used in embedded components. @@ -195,14 +198,14 @@ extension EmbeddedComponentManager { public var badge: CGFloat? /// The corner radius used for overlays. public var overlay: CGFloat? - + /// Creates a `EmbeddedComponentManager.Appearance.CornerRadius` with default values public init() {} } - + /// The default appearance public static let `default`: Appearance = .init() - + /// Describes the appearance of typography used in embedded components. public var typography: Typography = .init() /// Describes the colors used in embedded components. @@ -229,9 +232,8 @@ extension EmbeddedComponentManager { public var badgeDanger: Badge = .init() /// Describes the corner radius used in embedded components. public var cornerRadius: CornerRadius = .init() - + /// Creates a `EmbeddedComponentManager.Appearance` with default values public init() {} } } - diff --git a/StripeConnect/StripeConnect/Source/EmbeddedComponentManager.swift b/StripeConnect/StripeConnect/Source/EmbeddedComponentManager.swift index d79156ea663..f1eb818afae 100644 --- a/StripeConnect/StripeConnect/Source/EmbeddedComponentManager.swift +++ b/StripeConnect/StripeConnect/Source/EmbeddedComponentManager.swift @@ -9,13 +9,17 @@ import JavaScriptCore import StripeCore import UIKit +/// Manages Connect embedded components +/// - Seealso: https://docs.stripe.com/connect/get-started-connect-embedded-components +/// - Note: Connect embedded components are only available in private beta. @_spi(PrivateBetaConnect) +@available(iOS 15, *) public class EmbeddedComponentManager { let apiClient: STPAPIClient - + // Weakly held web views who get notified when appearance updates. private(set) var childWebViews: NSHashTable = .weakObjects() - + let fetchClientSecret: () async -> String? let fonts: [EmbeddedComponentManager.CustomFontSource] private(set) var appearance: EmbeddedComponentManager.Appearance @@ -23,7 +27,7 @@ public class EmbeddedComponentManager { // This should only be used for tests and determines if webview // content should load. var shouldLoadContent: Bool = true - + /** Initializes a StripeConnect instance. @@ -46,7 +50,7 @@ public class EmbeddedComponentManager { self.fonts = fonts self.appearance = appearance } - + /// Updates the appearance of components created from this EmbeddedComponentManager /// - Seealso: https://docs.stripe.com/connect/get-started-connect-embedded-components#customize-the-look-of-connect-embedded-components public func update(appearance: Appearance) { @@ -89,6 +93,11 @@ public class EmbeddedComponentManager { loadContent: shouldLoadContent) } + @_spi(DashboardOnly) + public func createPaymentDetailsViewController() -> PaymentDetailsViewController { + .init(componentManager: self) + } + /// Used to keep reference of all web views associated with this component manager. /// - Parameters: /// - webView: The web view associated with this component manager diff --git a/StripeConnect/StripeConnect/Source/Helpers/Appearance+Encoding.swift b/StripeConnect/StripeConnect/Source/Helpers/Appearance+Encoding.swift index abb8d21ef8b..b1d158d96a5 100644 --- a/StripeConnect/StripeConnect/Source/Helpers/Appearance+Encoding.swift +++ b/StripeConnect/StripeConnect/Source/Helpers/Appearance+Encoding.swift @@ -8,14 +8,16 @@ @_spi(STP) import StripeCore import UIKit +@available(iOS 15, *) typealias Appearance = EmbeddedComponentManager.Appearance +@available(iOS 15, *) extension Appearance { func asDictionary(traitCollection: UITraitCollection) -> [String: String] { var dict: [String: String] = [:] - + dict.mergeAssertingOnOverwrites(colors.asDictionary(traitCollection: traitCollection)) - dict.mergeAssertingOnOverwrites(typography.asDictionary()) + dict.mergeAssertingOnOverwrites(typography.asDictionary(traitCollection: traitCollection)) dict.mergeAssertingOnOverwrites(buttonPrimary.asDictionary(keyPrefix: "buttonPrimary")) dict.mergeAssertingOnOverwrites(buttonSecondary.asDictionary(keyPrefix: "buttonSecondary")) dict.mergeAssertingOnOverwrites(badgeNeutral.asDictionary(keyPrefix: "badgeNeutral")) @@ -23,13 +25,14 @@ extension Appearance { dict.mergeAssertingOnOverwrites(badgeWarning.asDictionary(keyPrefix: "badgeWarning")) dict.mergeAssertingOnOverwrites(badgeDanger.asDictionary(keyPrefix: "badgeDanger")) dict.mergeAssertingOnOverwrites(cornerRadius.asDictionary()) - + dict["spacingUnit"] = spacingUnit?.pxString - + return dict } } +@available(iOS 15, *) extension Appearance.CornerRadius { private var mappings: [String: KeyPath] { [ @@ -40,41 +43,44 @@ extension Appearance.CornerRadius { "overlayBorderRadius": \.overlay, ] } - + func asDictionary() -> [String: String] { mappings.compactMapValues { self[keyPath: $0]?.pxString } } } +@available(iOS 15, *) extension Appearance.Badge { private func mappings(keyPrefix: String) -> [String: KeyPath] { [ "\(keyPrefix)ColorBackground": \.colorBackground, "\(keyPrefix)ColorText": \.colorText, - "\(keyPrefix)ColorBorder": \.colorBorder + "\(keyPrefix)ColorBorder": \.colorBorder, ] } - + func asDictionary(keyPrefix: String) -> [String: String] { mappings(keyPrefix: keyPrefix).compactMapValues { self[keyPath: $0]?.cssValue(includeAlpha: false) } } } +@available(iOS 15, *) extension Appearance.Button { - + private func mappings(keyPrefix: String) -> [String: KeyPath] { [ "\(keyPrefix)ColorBackground": \.colorBackground, "\(keyPrefix)ColorText": \.colorText, - "\(keyPrefix)ColorBorder": \.colorBorder + "\(keyPrefix)ColorBorder": \.colorBorder, ] } - + func asDictionary(keyPrefix: String) -> [String: String] { mappings(keyPrefix: keyPrefix).compactMapValues { self[keyPath: $0]?.cssValue(includeAlpha: false) } } } +@available(iOS 15, *) extension Appearance.Colors { var mappings: [String: KeyPath] { [ @@ -89,45 +95,63 @@ extension Appearance.Colors { "formBackgroundColor": \.formBackground, "colorSecondaryText": \.secondaryText, "colorBorder": \.border, - "formHighlightColorBorder": \.formHighlightBorder + "formHighlightColorBorder": \.formHighlightBorder, ] } - + func asDictionary(traitCollection: UITraitCollection) -> [String: String] { mappings.compactMapValues { self[keyPath: $0]?.resolvedColor(with: traitCollection).cssRgbValue } } } +@available(iOS 15, *) extension Appearance.Typography { - func asDictionary() -> [String: String] { + var mappings: [String: KeyPath] { + [ + "bodySm": \.bodySm, + "bodyMd": \.bodyMd, + "headingXs": \.headingXs, + "headingSm": \.headingSm, + "headingMd": \.headingMd, + "headingLg": \.headingLg, + "headingXl": \.headingXl, + "labelMd": \.labelMd, + "labelSm": \.labelSm, + ] + } + + func asDictionary(traitCollection: UITraitCollection) -> [String: String] { var dict: [String: String] = [:] - + // Default font to "-apple-system" to use the system default, // otherwise the webView will use Times dict["fontFamily"] = font?.familyName ?? "-apple-system" - - dict["fontSizeBase"] = fontSizeBase?.pxString - - dict.mergeAssertingOnOverwrites(bodySm.asDictionary(keyPrefix: "bodySm")) - dict.mergeAssertingOnOverwrites(bodyMd.asDictionary(keyPrefix: "bodyMd")) - - dict.mergeAssertingOnOverwrites(headingXs.asDictionary(keyPrefix: "headingXs")) - dict.mergeAssertingOnOverwrites(headingSm.asDictionary(keyPrefix: "headingSm")) - dict.mergeAssertingOnOverwrites(headingMd.asDictionary(keyPrefix: "headingMd")) - dict.mergeAssertingOnOverwrites(headingLg.asDictionary(keyPrefix: "headingLg")) - dict.mergeAssertingOnOverwrites(headingXl.asDictionary(keyPrefix: "headingXl")) - - dict.mergeAssertingOnOverwrites(labelMd.asDictionary(keyPrefix: "labelMd")) - dict.mergeAssertingOnOverwrites(labelSm.asDictionary(keyPrefix: "labelSm")) - + + if let fontSizeBase { + dict["fontSizeBase"] = UIFontMetrics.default.scaledValue(for: fontSizeBase, compatibleWith: traitCollection).pxString + } + + mappings.forEach { (key, keyPath) in + dict.mergeAssertingOnOverwrites(self[keyPath: keyPath].asDictionary( + keyPrefix: key, + using: traitCollection)) + } + return dict } } +@available(iOS 15, *) extension Appearance.Typography.Style { - func asDictionary(keyPrefix: String) -> [String: String] { + func asDictionary( + keyPrefix: String, + using traitCollection: UITraitCollection + ) -> [String: String] { var dict: [String: String] = [:] - dict["\(keyPrefix)FontSize"] = fontSize?.pxString + + if let fontSize { + dict["\(keyPrefix)FontSize"] = UIFontMetrics.default.scaledValue(for: fontSize, compatibleWith: traitCollection).pxString + } dict["\(keyPrefix)FontWeight"] = weight?.cssValue dict["\(keyPrefix)TextTransform"] = textTransform?.rawValue return dict diff --git a/StripeConnect/StripeConnect/Source/Helpers/ConnectJSURLParams.swift b/StripeConnect/StripeConnect/Source/Helpers/ConnectJSURLParams.swift new file mode 100644 index 00000000000..20e5777e31e --- /dev/null +++ b/StripeConnect/StripeConnect/Source/Helpers/ConnectJSURLParams.swift @@ -0,0 +1,66 @@ +// +// ConnectJSURLParams.swift +// StripeConnect +// +// Created by Mel Ludowise on 8/30/24. +// + +import Foundation +@_spi(STP) @_spi(DashboardOnly) import StripeCore + +/// Structured parameters for URL params accepted by the iOS ConnectJS wrapper +struct ConnectJSURLParams: Encodable { + /// The component type + let component: ComponentType + + /// The platform publishable key. Required for non-dashboard accounts + private(set) var publicKey: String? + + // MARK: Override params + + // Override params are only applicable when using embedded components from the Stripe Dashboard app. + // The web components expect an authenticated user key when setting these params. + + /// Token override used to make authenticated requests (e.g. the `uk_` key for direct accounts) + private(set) var apiKeyOverride: String? + + /// Whether requests should be made in livemode + private(set) var livemodeOverride: Bool? + + /// The connected or direct account ID + private(set) var merchantIdOverride: String? + + /// The platform ID or direct account ID + /// - Note: For Dashboard direct accounts, this value must match `merchantIdOverride` + private(set) var platformIdOverride: String? +} + +extension ConnectJSURLParams { + init(component: ComponentType, apiClient: STPAPIClient) { + self.component = component + + // Validate that publishable key has been set + STPAPIClient.validateKey(apiClient.publishableKey) + + if apiClient.publishableKeyIsUserKey { + // Dashboard app overrides + self.apiKeyOverride = apiClient.publishableKey + self.merchantIdOverride = apiClient.stripeAccount + self.platformIdOverride = apiClient.stripeAccount + self.livemodeOverride = apiClient.userKeyLiveMode + } else { + self.publicKey = apiClient.publishableKey + } + } + + var url: URL { + guard let data = try? JSONEncoder().encode(self), + let dict = try? JSONSerialization.jsonObject(with: data) as? [String: Any] else { + // TODO: MXMOBILE-2491 Log error + return StripeConnectConstants.connectJSBaseURL + } + + // Append as hash params + return URL(string: "#\(URLEncoder.queryString(from: dict))", relativeTo: StripeConnectConstants.connectJSBaseURL)! + } +} diff --git a/StripeConnect/StripeConnect/Source/Helpers/STPLocalizedString.swift b/StripeConnect/StripeConnect/Source/Helpers/STPLocalizedString.swift deleted file mode 100644 index ed025d8cd1b..00000000000 --- a/StripeConnect/StripeConnect/Source/Helpers/STPLocalizedString.swift +++ /dev/null @@ -1,16 +0,0 @@ -// -// STPLocalizedString.swift -// StripeConnect -// -// Created by Chris Mays on 7/31/24. -// - -import Foundation -@_spi(STP) import StripeCore - -@inline(__always) func STPLocalizedString(_ key: String, _ comment: String?) -> String { - return STPLocalizationUtils.localizedStripeString( - forKey: key, - bundleLocator: StripeConnectBundleLocator.self - ) -} diff --git a/StripeConnect/StripeConnect/Source/Helpers/StripeConnectBundleLocator.swift b/StripeConnect/StripeConnect/Source/Helpers/StripeConnectBundleLocator.swift deleted file mode 100644 index bdcdb16bf93..00000000000 --- a/StripeConnect/StripeConnect/Source/Helpers/StripeConnectBundleLocator.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// StripeConnectBundleLocator.swift -// StripeConnect -// -// Created by Chris Mays on 7/31/24. -// - -import Foundation -@_spi(STP) import StripeCore - -final class StripeConnectBundleLocator: BundleLocatorProtocol { - static let internalClass: AnyClass = StripeConnectBundleLocator.self - static let bundleName = "StripeConnectBundle" - static let resourcesBundle = StripeConnectBundleLocator.computeResourcesBundle() -} diff --git a/StripeConnect/StripeConnect/Source/Internal/StripeConnectConstants.swift b/StripeConnect/StripeConnect/Source/Internal/StripeConnectConstants.swift index 1b3a55dad44..74e2cb21d1b 100644 --- a/StripeConnect/StripeConnect/Source/Internal/StripeConnectConstants.swift +++ b/StripeConnect/StripeConnect/Source/Internal/StripeConnectConstants.swift @@ -19,12 +19,6 @@ enum StripeConnectConstants { "connect-js.stripe.com", "connect.stripe.com" ] - - /** - URL for the hosted HTML page that wraps the JS `StripeConnectInstance` for iOS. - */ - static func connectJSURL(component: String, publishableKey: String) -> URL { - let url = URL(string:"https://connect-js.stripe.com/v1.0/ios_webview.html")! - return URL(string:"#component=\(component)&publicKey=\(publishableKey)", relativeTo: url)! - } + + static let connectJSBaseURL = URL(string: "https://connect-js.stripe.com/v1.0/ios_webview.html")! } diff --git a/StripeConnect/StripeConnect/Source/Internal/Webview/AppearanceWrapper.swift b/StripeConnect/StripeConnect/Source/Internal/Webview/AppearanceWrapper.swift index e808542c15f..1a0d20789cf 100644 --- a/StripeConnect/StripeConnect/Source/Internal/Webview/AppearanceWrapper.swift +++ b/StripeConnect/StripeConnect/Source/Internal/Webview/AppearanceWrapper.swift @@ -7,10 +7,11 @@ import UIKit +@available(iOS 15, *) struct AppearanceWrapper: Encodable { let appearance: Appearance let traitCollection: UITraitCollection - + public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: StringCodingKey.self) try container.encode(appearance.asDictionary(traitCollection: traitCollection), forKey: StringCodingKey("variables")) diff --git a/StripeConnect/StripeConnect/Source/Internal/Webview/ConnectComponentWebView.swift b/StripeConnect/StripeConnect/Source/Internal/Webview/ConnectComponentWebView.swift index 1a0c8698cc8..f6aacad4359 100644 --- a/StripeConnect/StripeConnect/Source/Internal/Webview/ConnectComponentWebView.swift +++ b/StripeConnect/StripeConnect/Source/Internal/Webview/ConnectComponentWebView.swift @@ -10,10 +10,11 @@ import UIKit import WebKit +@available(iOS 15, *) class ConnectComponentWebView: ConnectWebView { /// The embedded component manager that will be used for requests. var componentManager: EmbeddedComponentManager - + /// The component type that should be loaded. private var componentType: ComponentType @@ -22,7 +23,7 @@ class ConnectComponentWebView: ConnectWebView { /// Represents the current locale that should get sent to the webview private let webLocale: Locale - + /// The current notification center instance private let notificationCenter: NotificationCenter @@ -35,7 +36,7 @@ class ConnectComponentWebView: ConnectWebView { activityIndicator.translatesAutoresizingMaskIntoConstraints = false return activityIndicator }() - + init(componentManager: EmbeddedComponentManager, componentType: ComponentType, // Should only be overridden for tests @@ -64,26 +65,23 @@ class ConnectComponentWebView: ConnectWebView { activityIndicator.centerYAnchor.constraint(equalTo: self.centerYAnchor) ]) componentManager.registerChild(self) - guard let publishableKey = componentManager.apiClient.publishableKey else { - assertionFailure("A publishable key is required. For more info, see https://stripe.com/docs/keys") - return - } addMessageHandlers() addNotificationObservers() if loadContent { activityIndicator.startAnimating() - load(.init(url: StripeConnectConstants.connectJSURL(component: componentType.rawValue, publishableKey: publishableKey))) + let url = ConnectJSURLParams(component: componentType, apiClient: componentManager.apiClient).url + load(.init(url: url)) } } func updateAppearance(appearance: Appearance) { sendMessage(UpdateConnectInstanceSender.init(payload: .init(locale: webLocale.webIdentifier, appearance: .init(appearance: appearance, traitCollection: traitCollection)))) } - + required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } - + override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { DispatchQueue.main.async { self.updateAppearance(appearance: self.componentManager.appearance) @@ -93,10 +91,11 @@ class ConnectComponentWebView: ConnectWebView { // MARK: - Internal +@available(iOS 15, *) extension ConnectComponentWebView { /// Convenience method to add `ScriptMessageHandler` func addMessageHandler(_ messageHandler: ScriptMessageHandler, - contentWorld: WKContentWorld = .page) { + contentWorld: WKContentWorld = .page) { contentController.add(messageHandler, contentWorld: contentWorld, name: messageHandler.name) } @@ -106,10 +105,10 @@ extension ConnectComponentWebView { /// Convenience method to add `ScriptMessageHandlerWithReply` func addMessageHandler(_ messageHandler: ScriptMessageHandlerWithReply, - contentWorld: WKContentWorld = .page) { + contentWorld: WKContentWorld = .page) { contentController.addScriptMessageHandler(messageHandler, contentWorld: contentWorld, name: messageHandler.name) } - + /// Convenience method to send messages to the webview. func sendMessage(_ sender: any MessageSender) { if let message = sender.javascriptMessage { @@ -120,6 +119,7 @@ extension ConnectComponentWebView { // MARK: - Private +@available(iOS 15, *) private extension ConnectComponentWebView { /// Registers JS -> Swift message handlers func addMessageHandlers() { @@ -134,17 +134,17 @@ private extension ConnectComponentWebView { return .init(locale: "", appearance: .init(appearance: .default, traitCollection: .init())) } return .init(locale: webLocale.webIdentifier, - appearance: .init(appearance: componentManager.appearance, traitCollection: self.traitCollection), - fonts: componentManager.fonts.map({ .init(customFontSource: $0)})) + appearance: .init(appearance: componentManager.appearance, traitCollection: self.traitCollection), + fonts: componentManager.fonts.map({ .init(customFontSource: $0) })) })) addMessageHandler(DebugMessageHandler()) addMessageHandler(FetchClientSecretMessageHandler { [weak self] _ in await self?.componentManager.fetchClientSecret() }) - addMessageHandler(PageDidLoadMessageHandler{_ in }) - addMessageHandler(AccountSessionClaimedMessageHandler{ message in + addMessageHandler(PageDidLoadMessageHandler { _ in }) + addMessageHandler(AccountSessionClaimedMessageHandler{ _ in + // TODO: MXMOBILE-2491 Use this for analytics }) - } /// Adds NotificationCenter observers diff --git a/StripeConnect/StripeConnect/Source/Internal/Webview/ConnectWebView.swift b/StripeConnect/StripeConnect/Source/Internal/Webview/ConnectWebView.swift index 1bcbe62f33d..eaafa32bdec 100644 --- a/StripeConnect/StripeConnect/Source/Internal/Webview/ConnectWebView.swift +++ b/StripeConnect/StripeConnect/Source/Internal/Webview/ConnectWebView.swift @@ -5,8 +5,8 @@ // Created by Mel Ludowise on 5/3/24. // -@_spi(STP) import StripeCore import SafariServices +@_spi(STP) import StripeCore import WebKit /** @@ -16,17 +16,17 @@ import WebKit - Opening email links - Downloads TODO MXMOBILE-2485 */ +@available(iOS 15, *) class ConnectWebView: WKWebView { - private var optionalPresentPopup: ((UIViewController) -> Void)? /// Closure to present a popup web view controller. /// This is required for any components that can open a popup, otherwise an assertionFailure will occur. var presentPopup: (UIViewController) -> Void { get { - assert(optionalPresentPopup != nil, "Cannot present popup") - //TODO: MXMOBILE-2491 Log as analytics when pop up is not set. + assert(optionalPresentPopup != nil, "Cannot present popup") + // TODO: MXMOBILE-2491 Log as analytics when pop up is not set. return optionalPresentPopup ?? { _ in } } set { @@ -39,10 +39,10 @@ class ConnectWebView: WKWebView { /// The instance that will handle opening external urls let urlOpener: ApplicationURLOpener - + /// The current version for the SDK let sdkVersion: String? - + init(frame: CGRect, configuration: WKWebViewConfiguration, // Only override for tests @@ -52,14 +52,14 @@ class ConnectWebView: WKWebView { self.sdkVersion = sdkVersion configuration.applicationNameForUserAgent = "- stripe-ios/\(sdkVersion ?? "")" super.init(frame: frame, configuration: configuration) - + // Allow the web view to be inspected for debug builds on 16.4+ #if DEBUG if #available(iOS 16.4, *) { isInspectable = true } #endif - + uiDelegate = self navigationDelegate = self } @@ -71,11 +71,12 @@ class ConnectWebView: WKWebView { // MARK: - Private +@available(iOS 15, *) private extension ConnectWebView { // Opens the given navigation in a PopupWebViewController func openInPopup(configuration: WKWebViewConfiguration, navigationAction: WKNavigationAction) -> WKWebView? { - let popupVC = PopupWebViewController(configuration: configuration, + let popupVC = PopupWebViewController(configuration: configuration, navigationAction: navigationAction, urlOpener: urlOpener, sdkVersion: sdkVersion) @@ -104,6 +105,7 @@ private extension ConnectWebView { // MARK: - WKUIDelegate +@available(iOS 15, *) extension ConnectWebView: WKUIDelegate { func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, @@ -150,6 +152,7 @@ extension ConnectWebView: WKUIDelegate { // MARK: - WKNavigationDelegate +@available(iOS 15, *) extension ConnectWebView: WKNavigationDelegate { func webView( _ webView: WKWebView, diff --git a/StripeConnect/StripeConnect/Source/Internal/Webview/CustomFontSourceWrapper.swift b/StripeConnect/StripeConnect/Source/Internal/Webview/CustomFontSourceWrapper.swift index 1e32f17b268..7cd1ec3642e 100644 --- a/StripeConnect/StripeConnect/Source/Internal/Webview/CustomFontSourceWrapper.swift +++ b/StripeConnect/StripeConnect/Source/Internal/Webview/CustomFontSourceWrapper.swift @@ -7,15 +7,16 @@ import Foundation +@available(iOS 15, *) struct CustomFontSourceWrapper: Encodable { let customFontSource: EmbeddedComponentManager.CustomFontSource enum CodingKeys: String, CodingKey { case family, style, weight, src } - + public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) - + try container.encode(customFontSource.family, forKey: .family) try container.encodeIfPresent(customFontSource.style, forKey: .style) try container.encodeIfPresent(customFontSource.weight, forKey: .weight) diff --git a/StripeConnect/StripeConnect/Source/Internal/Webview/MessageHandlers/FetchInitParamsMessageHandler.swift b/StripeConnect/StripeConnect/Source/Internal/Webview/MessageHandlers/FetchInitParamsMessageHandler.swift index 8748b7445bc..b5619179480 100644 --- a/StripeConnect/StripeConnect/Source/Internal/Webview/MessageHandlers/FetchInitParamsMessageHandler.swift +++ b/StripeConnect/StripeConnect/Source/Internal/Webview/MessageHandlers/FetchInitParamsMessageHandler.swift @@ -8,6 +8,7 @@ import Foundation // This message is emitted when the SDK is requesting initialization info. +@available(iOS 15, *) class FetchInitParamsMessageHandler: ScriptMessageHandlerWithReply { struct Reply: Encodable { let locale: String diff --git a/StripeConnect/StripeConnect/Source/Internal/Webview/MessageSenders/UpdateConnectInstanceSender.swift b/StripeConnect/StripeConnect/Source/Internal/Webview/MessageSenders/UpdateConnectInstanceSender.swift index 7f87e097c2b..8224296e444 100644 --- a/StripeConnect/StripeConnect/Source/Internal/Webview/MessageSenders/UpdateConnectInstanceSender.swift +++ b/StripeConnect/StripeConnect/Source/Internal/Webview/MessageSenders/UpdateConnectInstanceSender.swift @@ -8,6 +8,7 @@ import Foundation /// Updates appearance and locale options. +@available(iOS 15, *) struct UpdateConnectInstanceSender: MessageSender { struct Payload: Encodable { let locale: String diff --git a/StripeConnect/StripeConnect/Source/Internal/Webview/PopupWebViewController.swift b/StripeConnect/StripeConnect/Source/Internal/Webview/PopupWebViewController.swift index 8393900bc3d..be9c9da54fc 100644 --- a/StripeConnect/StripeConnect/Source/Internal/Webview/PopupWebViewController.swift +++ b/StripeConnect/StripeConnect/Source/Internal/Webview/PopupWebViewController.swift @@ -10,6 +10,7 @@ import UIKit import WebKit /// Presented when a new target is opened from `StripeConnectWebView` +@available(iOS 15, *) class PopupWebViewController: UIViewController { let webView: ConnectWebView diff --git a/StripeConnect/StripeConnectTests/AppearanceTests.swift b/StripeConnect/StripeConnectTests/AppearanceTests.swift index e394ec0a921..af5ecbb2f7a 100644 --- a/StripeConnect/StripeConnectTests/AppearanceTests.swift +++ b/StripeConnect/StripeConnectTests/AppearanceTests.swift @@ -158,7 +158,8 @@ class AppearanceTests: XCTestCase { func testDefaultAppearance() { let appearance: Appearance = .default XCTAssertEqual(appearance.asDictionary(traitCollection: .init()), [ - "fontFamily": "-apple-system" + "fontFamily": "-apple-system", + "fontSizeBase": "16px", ]) } @@ -181,4 +182,19 @@ class AppearanceTests: XCTestCase { XCTAssertEqual(appearance.asDictionary(traitCollection: lightModeTraits)["colorText"], "rgb(0, 0, 0)") XCTAssertEqual(appearance.asDictionary(traitCollection: darkModeTraits)["colorText"], "rgb(255, 255, 255)") } + + func testFontSizesChangeBasedOnTraitCollection() { + var appearance = Appearance.default + + appearance.typography.fontSizeBase = 16 + appearance.typography.headingLg.fontSize = 32 + + let xsFontDict = appearance.asDictionary(traitCollection: UITraitCollection(preferredContentSizeCategory: .extraSmall)) + let axxxlDict = appearance.asDictionary(traitCollection: UITraitCollection(preferredContentSizeCategory: .accessibilityExtraExtraExtraLarge)) + + XCTAssertEqual(xsFontDict["fontSizeBase"], "13px") + XCTAssertEqual(xsFontDict["headingLgFontSize"], "27px") + XCTAssertEqual(axxxlDict["fontSizeBase"], "45px") + XCTAssertEqual(axxxlDict["headingLgFontSize"], "90px") + } } diff --git a/StripeConnect/StripeConnectTests/Components/PaymentDetailsViewControllerTests.swift b/StripeConnect/StripeConnectTests/Components/PaymentDetailsViewControllerTests.swift new file mode 100644 index 00000000000..013aada8b0e --- /dev/null +++ b/StripeConnect/StripeConnectTests/Components/PaymentDetailsViewControllerTests.swift @@ -0,0 +1,63 @@ +// +// PaymentDetailsViewControllerTests.swift +// StripeConnectTests +// +// Created by Mel Ludowise on 9/20/24. +// + +import SafariServices +@_spi(PrivateBetaConnect) @_spi(DashboardOnly) @testable import StripeConnect +@_spi(STP) import StripeCore +import WebKit +import XCTest + +class PaymentDetailsViewControllerTests: XCTestCase { + func testLoadDidFail() { + STPAPIClient.shared.publishableKey = "pk_test" + let componentManager = EmbeddedComponentManager(fetchClientSecret: { + return nil + }) + let vc = componentManager.createPaymentDetailsViewController() + + let expectation = XCTestExpectation(description: "loadDidFail called") + + let paymentDetailsDelegate = PaymentDetailsViewControllerDelegatePassThrough { _, error in + XCTAssertEqual((error as? EmbeddedComponentError)?.type, .rateLimitError) + XCTAssertEqual((error as? EmbeddedComponentError)?.description, "Error message") + expectation.fulfill() + } + vc.delegate = paymentDetailsDelegate + + vc.webView.evaluateOnLoadError(type: "rate_limit_error", message: "Error message") + + wait(for: [expectation], timeout: TestHelpers.defaultTimeout) + } + + func testSetPayment() throws { + STPAPIClient.shared.publishableKey = "pk_test" + let componentManager = EmbeddedComponentManager(fetchClientSecret: { + return nil + }) + let vc = componentManager.createPaymentDetailsViewController() + let expectation = try vc.webView.expectationForMessageReceived(sender: CallSetterWithSerializableValueSender(payload: .init( + setter: "setPayment", + value: "pi_123" + ))) + + vc.setPayment(id: "pi_123") + wait(for: [expectation], timeout: TestHelpers.defaultTimeout) + } +} + +private class PaymentDetailsViewControllerDelegatePassThrough: PaymentDetailsViewControllerDelegate { + + var loadDidFail: ((_ paymentDetails: PaymentDetailsViewController, _ error: any Error) -> Void)? + + init(loadDidFail: ((PaymentDetailsViewController, any Error) -> Void)? = nil) { + self.loadDidFail = loadDidFail + } + + func paymentDetailsLoadDidFail(_ paymentDetails: PaymentDetailsViewController, withError error: any Error) { + loadDidFail?(paymentDetails, error) + } +} diff --git a/StripeConnect/StripeConnectTests/Helpers/ConnectJSURLParamsTests.swift b/StripeConnect/StripeConnectTests/Helpers/ConnectJSURLParamsTests.swift new file mode 100644 index 00000000000..1d50cb45d38 --- /dev/null +++ b/StripeConnect/StripeConnectTests/Helpers/ConnectJSURLParamsTests.swift @@ -0,0 +1,42 @@ +// +// ConnectJSURLParamsTests.swift +// StripeConnectTests +// +// Created by Mel Ludowise on 9/20/24. +// + +@testable import StripeConnect +@_spi(STP) @_spi(DashboardOnly) import StripeCore +import XCTest + +class ConnectJSURLParamsTests: XCTestCase { + let apiClient = STPAPIClient() + + override func setUp() { + super.setUp() + apiClient.userKeyLiveMode = false + apiClient.stripeAccount = "acct_123" + } + + func testInitFromApiClient_publicKey() { + apiClient.publishableKey = "pk_1234" + + let urlParams = ConnectJSURLParams(component: .onboarding, apiClient: apiClient) + XCTAssertEqual(urlParams.publicKey, "pk_1234") + XCTAssertNil(urlParams.apiKeyOverride) + XCTAssertNil(urlParams.merchantIdOverride) + XCTAssertNil(urlParams.platformIdOverride) + XCTAssertNil(urlParams.livemodeOverride) + } + + func testInitFromApiClient_userKeyIncludesOverrideParams() { + apiClient.publishableKey = "uk_1234" + + let urlParams = ConnectJSURLParams(component: .onboarding, apiClient: apiClient) + XCTAssertNil(urlParams.publicKey) + XCTAssertEqual(urlParams.apiKeyOverride, "uk_1234") + XCTAssertEqual(urlParams.merchantIdOverride, "acct_123") + XCTAssertEqual(urlParams.platformIdOverride, "acct_123") + XCTAssertEqual(urlParams.livemodeOverride, false) + } +} diff --git a/StripeConnect/StripeConnectTests/Internal/Webview/ConnectComponentWebViewTests.swift b/StripeConnect/StripeConnectTests/Internal/Webview/ConnectComponentWebViewTests.swift index 5a446d66d17..fb52285d38b 100644 --- a/StripeConnect/StripeConnectTests/Internal/Webview/ConnectComponentWebViewTests.swift +++ b/StripeConnect/StripeConnectTests/Internal/Webview/ConnectComponentWebViewTests.swift @@ -78,7 +78,7 @@ class ConnectComponentWebViewTests: XCTestCase { try await webView.evaluateMessageWithReply(name: "fetchInitParams", json: "{}", expectedResponse: """ - {"appearance":{"variables":{"actionPrimaryColorText":"rgb(255, 255, 255)","fontFamily":"-apple-system"}},"fonts":[],"locale":"fr-FR"} + {"appearance":{"variables":{"actionPrimaryColorText":"rgb(255, 255, 255)","fontFamily":"-apple-system","fontSizeBase":"16px"}},"fonts":[],"locale":"fr-FR"} """) } @@ -144,7 +144,7 @@ class ConnectComponentWebViewTests: XCTestCase { try await webView.evaluateMessageWithReply(name: "fetchInitParams", json: "{}", expectedResponse:""" - {"appearance":{"variables":{"fontFamily":"-apple-system"}},"fonts":[{"family":".AppleSystemUIFont","src":"url(data:font\\/txt;charset=utf-8;base64,dGVzdAo=)","weight":"400"}],"locale":"fr-FR"} + {"appearance":{"variables":{"fontFamily":"-apple-system","fontSizeBase":"16px"}},"fonts":[{"family":".AppleSystemUIFont","src":"url(data:font\\/txt;charset=utf-8;base64,dGVzdAo=)","weight":"400"}],"locale":"fr-FR"} """) } } diff --git a/StripeConnect/StripeConnectTests/Internal/Webview/MessageSenders/UpdateConnectInstanceSenderTests.swift b/StripeConnect/StripeConnectTests/Internal/Webview/MessageSenders/UpdateConnectInstanceSenderTests.swift index de9e6096d15..ebd2979b450 100644 --- a/StripeConnect/StripeConnectTests/Internal/Webview/MessageSenders/UpdateConnectInstanceSenderTests.swift +++ b/StripeConnect/StripeConnectTests/Internal/Webview/MessageSenders/UpdateConnectInstanceSenderTests.swift @@ -18,7 +18,7 @@ class UpdateConnectInstanceSenderTests: ScriptWebTestBase { XCTAssertEqual( UpdateConnectInstanceSender(payload: .init(locale: "en", appearance: .default)).javascriptMessage, """ - window.updateConnectInstance({"appearance":{"variables":{"fontFamily":"-apple-system"}},"locale":"en"}); + window.updateConnectInstance({"appearance":{"variables":{"fontFamily":"-apple-system","fontSizeBase":"16px"}},"locale":"en"}); """ ) } diff --git a/StripeCore/StripeCore/Source/API Bindings/STPAPIClient.swift b/StripeCore/StripeCore/Source/API Bindings/STPAPIClient.swift index 2e09d81f76b..49de3b5026d 100644 --- a/StripeCore/StripeCore/Source/API Bindings/STPAPIClient.swift +++ b/StripeCore/StripeCore/Source/API Bindings/STPAPIClient.swift @@ -142,7 +142,7 @@ import UIKit // MARK: Helpers static var didShowTestmodeKeyWarning = false - class func validateKey(_ publishableKey: String?) { + @_spi(STP) public class func validateKey(_ publishableKey: String?) { guard NSClassFromString("XCTest") == nil else { return // no asserts in unit tests } @@ -506,7 +506,7 @@ extension STPAPIClient { } do { - /// HACK: We must first check if EmptyResponses contain an error since it'll always parse successfully. + // HACK: We must first check if EmptyResponses contain an error since it'll always parse successfully. if T.self == EmptyResponse.self, let decodedStripeError = decodeStripeErrorResponse(data: data, response: response) {