diff --git a/access-checkout-react-native-sdk/.prettierrc.json b/access-checkout-react-native-sdk/.prettierrc.json index 018ca32..6707610 100644 --- a/access-checkout-react-native-sdk/.prettierrc.json +++ b/access-checkout-react-native-sdk/.prettierrc.json @@ -3,7 +3,5 @@ "singleQuote": true, "tabWidth": 2, "trailingComma": "es5", - "useTabs": false, - "arrowParens": "avoid", - "bracketSameLine": true + "useTabs": false } diff --git a/access-checkout-react-native-sdk/android/access-checkout-react-native-sdk-android-bridge/build.gradle b/access-checkout-react-native-sdk/android/access-checkout-react-native-sdk-android-bridge/build.gradle index d080b0f..ff7212b 100644 --- a/access-checkout-react-native-sdk/android/access-checkout-react-native-sdk-android-bridge/build.gradle +++ b/access-checkout-react-native-sdk/android/access-checkout-react-native-sdk-android-bridge/build.gradle @@ -51,6 +51,8 @@ dependencies { testImplementation 'junit:junit:4.13.2' testImplementation 'org.assertj:assertj-core:3.21.0' testImplementation 'org.robolectric:robolectric:4.4' + testImplementation 'org.mockito:mockito-core:5.8.0' + instrumentedTestsImplementation 'androidx.test:core:1.4.0' instrumentedTestsImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2' diff --git a/access-checkout-react-native-sdk/android/access-checkout-react-native-sdk-android-bridge/src/main/java/com/worldpay/access/checkout/reactnative/AccessCheckoutReactNativeModule.kt b/access-checkout-react-native-sdk/android/access-checkout-react-native-sdk-android-bridge/src/main/java/com/worldpay/access/checkout/reactnative/AccessCheckoutReactNativeModule.kt index 584d1f0..63d21ed 100644 --- a/access-checkout-react-native-sdk/android/access-checkout-react-native-sdk-android-bridge/src/main/java/com/worldpay/access/checkout/reactnative/AccessCheckoutReactNativeModule.kt +++ b/access-checkout-react-native-sdk/android/access-checkout-react-native-sdk-android-bridge/src/main/java/com/worldpay/access/checkout/reactnative/AccessCheckoutReactNativeModule.kt @@ -3,7 +3,6 @@ package com.worldpay.access.checkout.reactnative import android.os.Handler import android.os.Looper import android.util.Log -import android.widget.EditText import androidx.lifecycle.LifecycleOwner import com.facebook.react.bridge.* import com.facebook.react.uimanager.util.ReactFindViewUtil @@ -22,6 +21,7 @@ import com.worldpay.access.checkout.reactnative.validation.CvcOnlyValidationConf import com.worldpay.access.checkout.reactnative.validation.CvcOnlyValidationListener import com.worldpay.access.checkout.session.AccessCheckoutClientDisposer import com.worldpay.access.checkout.session.api.client.WpSdkHeader +import com.worldpay.access.checkout.ui.AccessCheckoutEditText /** * Module class that implements all the functionality that is required by Javascript for the end user @@ -77,15 +77,22 @@ class AccessCheckoutReactNativeModule constructor( sessionResponseListener.promise = promise + val rootView = reactContext.currentActivity?.window?.decorView?.rootView + + val panView = ReactFindViewUtil.findView(rootView, config.panValue!!) as AccessCheckoutEditText + val expiryDateView = + ReactFindViewUtil.findView(rootView, config.expiryDateValue!!) as AccessCheckoutEditText + val cvcView = ReactFindViewUtil.findView(rootView, config.cvcValue!!) as AccessCheckoutEditText + val cardDetails: CardDetails = if (isCvcSessionOnly(config.sessionTypes)) { CardDetails.Builder() - .cvc(config.cvcValue!!) + .cvc(cvcView) .build() } else { CardDetails.Builder() - .pan(config.panValue!!) - .expiryDate(config.expiryDateValue!!) - .cvc(config.cvcValue!!) + .pan(panView) + .expiryDate(expiryDateView) + .cvc(cvcView) .build() } @@ -111,10 +118,10 @@ class AccessCheckoutReactNativeModule constructor( val config = CardValidationConfigConverter().fromReadableMap(readableMap) val rootView = reactContext.currentActivity?.window?.decorView?.rootView - val panView = ReactFindViewUtil.findView(rootView, config.panId) as EditText + val panView = ReactFindViewUtil.findView(rootView, config.panId) as AccessCheckoutEditText val expiryDateView = - ReactFindViewUtil.findView(rootView, config.expiryDateId) as EditText - val cvcView = ReactFindViewUtil.findView(rootView, config.cvcId) as EditText + ReactFindViewUtil.findView(rootView, config.expiryDateId) as AccessCheckoutEditText + val cvcView = ReactFindViewUtil.findView(rootView, config.cvcId) as AccessCheckoutEditText val cardValidationConfigBuilder = CardValidationConfig.Builder() .baseUrl(config.baseUrl) @@ -156,7 +163,7 @@ class AccessCheckoutReactNativeModule constructor( val config = CvcOnlyValidationConfigConverter().fromReadableMap(readableMap) val rootView = reactContext.currentActivity?.window?.decorView?.rootView - val cvcView = ReactFindViewUtil.findView(rootView, config.cvcId) as EditText + val cvcView = ReactFindViewUtil.findView(rootView, config.cvcId) as AccessCheckoutEditText val cvcOnlyValidationConfigBuilder = CvcValidationConfig.Builder() .cvc(cvcView) @@ -208,4 +215,3 @@ class AccessCheckoutReactNativeModule constructor( return sessionType.count() == 1 && sessionType.first() == SessionType.CVC } } - diff --git a/access-checkout-react-native-sdk/android/access-checkout-react-native-sdk-android-bridge/src/main/java/com/worldpay/access/checkout/reactnative/AccessCheckoutReactPackage.kt b/access-checkout-react-native-sdk/android/access-checkout-react-native-sdk-android-bridge/src/main/java/com/worldpay/access/checkout/reactnative/AccessCheckoutReactPackage.kt index 5aa8e49..88a8d2d 100644 --- a/access-checkout-react-native-sdk/android/access-checkout-react-native-sdk-android-bridge/src/main/java/com/worldpay/access/checkout/reactnative/AccessCheckoutReactPackage.kt +++ b/access-checkout-react-native-sdk/android/access-checkout-react-native-sdk-android-bridge/src/main/java/com/worldpay/access/checkout/reactnative/AccessCheckoutReactPackage.kt @@ -3,7 +3,7 @@ package com.worldpay.access.checkout.reactnative import com.facebook.react.ReactPackage import com.facebook.react.bridge.NativeModule import com.facebook.react.bridge.ReactApplicationContext -import com.facebook.react.uimanager.ViewManager +import com.worldpay.access.checkout.reactnative.ui.AccessCheckoutTextInputManager /** * This class is responsible for registering native modules with React Native. (called upon initialisation) @@ -13,8 +13,7 @@ class AccessCheckoutReactPackage : ReactPackage { override fun createNativeModules(reactContext: ReactApplicationContext): List { return listOf(AccessCheckoutReactNativeModule(reactContext)) } - - override fun createViewManagers(reactContext: ReactApplicationContext): List> { - return emptyList() - } + override fun createViewManagers( + reactContext: ReactApplicationContext + ) = listOf(AccessCheckoutTextInputManager(reactContext)) } diff --git a/access-checkout-react-native-sdk/android/access-checkout-react-native-sdk-android-bridge/src/main/java/com/worldpay/access/checkout/reactnative/ui/AccessCheckoutTextInputManager.kt b/access-checkout-react-native-sdk/android/access-checkout-react-native-sdk-android-bridge/src/main/java/com/worldpay/access/checkout/reactnative/ui/AccessCheckoutTextInputManager.kt new file mode 100644 index 0000000..212bc5b --- /dev/null +++ b/access-checkout-react-native-sdk/android/access-checkout-react-native-sdk-android-bridge/src/main/java/com/worldpay/access/checkout/reactnative/ui/AccessCheckoutTextInputManager.kt @@ -0,0 +1,38 @@ +package com.worldpay.access.checkout.reactnative.ui + +import com.facebook.react.bridge.ReactApplicationContext +import com.facebook.react.uimanager.SimpleViewManager +import com.facebook.react.uimanager.ThemedReactContext +import com.facebook.react.uimanager.ViewProps +import com.facebook.react.uimanager.annotations.ReactProp +import com.worldpay.access.checkout.ui.AccessCheckoutEditText + +class AccessCheckoutTextInputManager(private val callerContext: ReactApplicationContext) : + SimpleViewManager() { + + override fun getName() = REACT_CLASS + + companion object { + const val REACT_CLASS = "AccessCheckoutTextInput" + } + + override fun createViewInstance(context: ThemedReactContext) = AccessCheckoutEditText(context) + + /** + * Properties + */ + @ReactProp(name = ViewProps.COLOR) + fun setRTCTextColor(accessCheckoutEditText: AccessCheckoutEditText, color: Int) { + accessCheckoutEditText.setTextColor(color) + } + + @ReactProp(name = "placeholder") + fun setRTCPlaceholder(accessCheckoutEditText: AccessCheckoutEditText, placeholder: String) { + accessCheckoutEditText.setHint(placeholder) + } + + @ReactProp(name = "editable") + fun setRTCEditable(accessCheckoutEditText: AccessCheckoutEditText, editable: Boolean) { + accessCheckoutEditText.isEnabled = editable + } +} diff --git a/access-checkout-react-native-sdk/android/access-checkout-react-native-sdk-android-bridge/src/test/java/com/worldpay/access/checkout/reactnative/AccessCheckoutReactPackageTest.kt b/access-checkout-react-native-sdk/android/access-checkout-react-native-sdk-android-bridge/src/test/java/com/worldpay/access/checkout/reactnative/AccessCheckoutReactPackageTest.kt index 48b7cef..9021452 100644 --- a/access-checkout-react-native-sdk/android/access-checkout-react-native-sdk-android-bridge/src/test/java/com/worldpay/access/checkout/reactnative/AccessCheckoutReactPackageTest.kt +++ b/access-checkout-react-native-sdk/android/access-checkout-react-native-sdk-android-bridge/src/test/java/com/worldpay/access/checkout/reactnative/AccessCheckoutReactPackageTest.kt @@ -3,6 +3,7 @@ package com.worldpay.access.checkout.reactnative import android.content.Context import androidx.test.core.app.ApplicationProvider import com.facebook.react.bridge.ReactApplicationContext +import com.worldpay.access.checkout.reactnative.ui.AccessCheckoutTextInputManager import org.assertj.core.api.Assertions.assertThat import org.junit.Test import org.junit.runner.RunWith @@ -24,7 +25,8 @@ internal class AccessCheckoutReactPackageTest { fun `createViewManagers() should not create view managers`() { val viewManagers = acoReactPackage.createViewManagers(reactApplicationContext()) - assertThat(viewManagers).isEmpty() + assertThat(viewManagers).hasSize(1) + assertThat(viewManagers[0]).isInstanceOf(AccessCheckoutTextInputManager::class.java) } private fun reactApplicationContext(): ReactApplicationContext { diff --git a/access-checkout-react-native-sdk/android/access-checkout-react-native-sdk-android-bridge/src/test/java/com/worldpay/access/checkout/reactnative/ui/AccessCheckoutTextInputManagerTest.kt b/access-checkout-react-native-sdk/android/access-checkout-react-native-sdk-android-bridge/src/test/java/com/worldpay/access/checkout/reactnative/ui/AccessCheckoutTextInputManagerTest.kt new file mode 100644 index 0000000..defe968 --- /dev/null +++ b/access-checkout-react-native-sdk/android/access-checkout-react-native-sdk-android-bridge/src/test/java/com/worldpay/access/checkout/reactnative/ui/AccessCheckoutTextInputManagerTest.kt @@ -0,0 +1,53 @@ +package com.worldpay.access.checkout.reactnative.ui + +import android.content.Context +import android.graphics.Color +import androidx.test.core.app.ApplicationProvider +import com.facebook.react.bridge.ReactApplicationContext +import com.worldpay.access.checkout.ui.AccessCheckoutEditText +import org.assertj.core.api.AssertionsForClassTypes.assertThat +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mockito.mock +import org.mockito.Mockito.verify +import org.robolectric.RobolectricTestRunner + +@RunWith(RobolectricTestRunner::class) +internal class AccessCheckoutTextInputManagerTest { + private val manager = AccessCheckoutTextInputManager(reactApplicationContext()) + private val accessCheckoutEditTextMock = mock(AccessCheckoutEditText::class.java) + + @Test + fun `getName() should return the name of the react class`() { + val expectedName = "AccessCheckoutTextInput" + + assertThat(manager.name).isEqualTo(expectedName) + } + + @Test + fun `setRTCTextColour() should call setTextColour on AccessEditText`() { + manager.setRTCTextColor(accessCheckoutEditTextMock, Color.RED) + + verify(accessCheckoutEditTextMock).setTextColor(Color.RED) + } + + @Test + fun `setRTCPlaceholder() should call setHint on AccessEditText`() { + manager.setRTCPlaceholder(accessCheckoutEditTextMock, "placeholder") + + verify(accessCheckoutEditTextMock).setHint("placeholder") + } + + @Test + fun `setRTCEditable() should call isEnabled on AccessEditText`() { + manager.setRTCEditable(accessCheckoutEditTextMock, true) + + verify(accessCheckoutEditTextMock).isEnabled = true + } + + + private fun reactApplicationContext(): ReactApplicationContext { + val applicationContext: Context = ApplicationProvider.getApplicationContext() + return ReactApplicationContext(applicationContext) + } +} diff --git a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNative.xcodeproj/project.pbxproj b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNative.xcodeproj/project.pbxproj index aa89c4e..d75c58d 100644 --- a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNative.xcodeproj/project.pbxproj +++ b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNative.xcodeproj/project.pbxproj @@ -7,7 +7,11 @@ objects = { /* Begin PBXBuildFile section */ - 1085FCBC7FCD8F0B65952C91 /* Pods_AccessCheckoutReactNative.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D1A9B14B70FA26DBC56CEA54 /* Pods_AccessCheckoutReactNative.framework */; }; + 46D3A9632B3447AE0056016D /* SessionGenerationTestUIViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46D3A9622B3447AE0056016D /* SessionGenerationTestUIViewController.swift */; }; + 46D3A9652B34494B0056016D /* SessionGenerationTest.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 46D3A9642B34494B0056016D /* SessionGenerationTest.storyboard */; }; + 46D3A9682B3461030056016D /* AccessCheckoutReactNativeTestImplementation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46D3A9672B3461030056016D /* AccessCheckoutReactNativeTestImplementation.swift */; }; + 46D51A0B2B2B6D3D001A223C /* AccessCheckoutTextInputManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 46D51A0A2B2B6D3D001A223C /* AccessCheckoutTextInputManager.m */; }; + 46D51A0D2B2B6D72001A223C /* AccessCheckoutTextInputManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46D51A0C2B2B6D72001A223C /* AccessCheckoutTextInputManager.swift */; }; 515BA38C282E6D6600BA262D /* AccessCheckoutReactNativeCvcOnlyValidationAcceptanceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 515BA38B282E6D6600BA262D /* AccessCheckoutReactNativeCvcOnlyValidationAcceptanceTests.swift */; }; 515BA394282E6EA500BA262D /* CvcOnlyValidationTestUIViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 515BA393282E6EA500BA262D /* CvcOnlyValidationTestUIViewController.swift */; }; 515BA39C282E6F9600BA262D /* CvcValidationTest.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 515BA39B282E6F9600BA262D /* CvcValidationTest.storyboard */; }; @@ -43,7 +47,8 @@ 51D03E9C27A8611D009781EB /* CardValidationTest.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 51D03E9B27A8611D009781EB /* CardValidationTest.storyboard */; }; 51D03EBC27A8658B009781EB /* CardValidationTestUIViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51D03EBB27A8658B009781EB /* CardValidationTestUIViewController.swift */; }; 64ADC9392816E1510045BA58 /* AccessCheckoutReactNativeSessionAcceptanceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64ADC9382816E1510045BA58 /* AccessCheckoutReactNativeSessionAcceptanceTests.swift */; }; - 9E76FAE1228E11E57FBA1E1F /* Pods_AccessCheckoutReactNativeUnitTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FCAD412BF5EDD019601562D6 /* Pods_AccessCheckoutReactNativeUnitTests.framework */; }; + A9ED72A5E9195DD948506388 /* Pods_AccessCheckoutReactNativeUnitTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0FA73C387ECF40CBA927EFB1 /* Pods_AccessCheckoutReactNativeUnitTests.framework */; }; + F9072E98B9F57D1BF6246204 /* Pods_AccessCheckoutReactNative.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2E69F34F7070C19C89742890 /* Pods_AccessCheckoutReactNative.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -64,8 +69,15 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 0A05132B3D087D149DBF457C /* Pods-AccessCheckoutReactNativeUnitTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AccessCheckoutReactNativeUnitTests.release.xcconfig"; path = "Target Support Files/Pods-AccessCheckoutReactNativeUnitTests/Pods-AccessCheckoutReactNativeUnitTests.release.xcconfig"; sourceTree = ""; }; - 4CF9E9AFFAEFDCD0DF2D332F /* Pods-AccessCheckoutReactNative.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AccessCheckoutReactNative.release.xcconfig"; path = "Target Support Files/Pods-AccessCheckoutReactNative/Pods-AccessCheckoutReactNative.release.xcconfig"; sourceTree = ""; }; + 00ABDCBCE0FE39A5A7B91754 /* Pods-AccessCheckoutReactNativeUnitTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AccessCheckoutReactNativeUnitTests.release.xcconfig"; path = "Target Support Files/Pods-AccessCheckoutReactNativeUnitTests/Pods-AccessCheckoutReactNativeUnitTests.release.xcconfig"; sourceTree = ""; }; + 0FA73C387ECF40CBA927EFB1 /* Pods_AccessCheckoutReactNativeUnitTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AccessCheckoutReactNativeUnitTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 297BA316EEA9A3E0CC6C6C63 /* Pods-AccessCheckoutReactNative.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AccessCheckoutReactNative.release.xcconfig"; path = "Target Support Files/Pods-AccessCheckoutReactNative/Pods-AccessCheckoutReactNative.release.xcconfig"; sourceTree = ""; }; + 2E69F34F7070C19C89742890 /* Pods_AccessCheckoutReactNative.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AccessCheckoutReactNative.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 46D3A9622B3447AE0056016D /* SessionGenerationTestUIViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionGenerationTestUIViewController.swift; sourceTree = ""; }; + 46D3A9642B34494B0056016D /* SessionGenerationTest.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = SessionGenerationTest.storyboard; sourceTree = ""; }; + 46D3A9672B3461030056016D /* AccessCheckoutReactNativeTestImplementation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessCheckoutReactNativeTestImplementation.swift; sourceTree = ""; }; + 46D51A0A2B2B6D3D001A223C /* AccessCheckoutTextInputManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AccessCheckoutTextInputManager.m; sourceTree = ""; }; + 46D51A0C2B2B6D72001A223C /* AccessCheckoutTextInputManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessCheckoutTextInputManager.swift; sourceTree = ""; }; 515BA38B282E6D6600BA262D /* AccessCheckoutReactNativeCvcOnlyValidationAcceptanceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessCheckoutReactNativeCvcOnlyValidationAcceptanceTests.swift; sourceTree = ""; }; 515BA393282E6EA500BA262D /* CvcOnlyValidationTestUIViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CvcOnlyValidationTestUIViewController.swift; sourceTree = ""; }; 515BA39B282E6F9600BA262D /* CvcValidationTest.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = CvcValidationTest.storyboard; sourceTree = ""; }; @@ -106,10 +118,8 @@ 51D03E9B27A8611D009781EB /* CardValidationTest.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = CardValidationTest.storyboard; sourceTree = ""; }; 51D03EBB27A8658B009781EB /* CardValidationTestUIViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardValidationTestUIViewController.swift; sourceTree = ""; }; 64ADC9382816E1510045BA58 /* AccessCheckoutReactNativeSessionAcceptanceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccessCheckoutReactNativeSessionAcceptanceTests.swift; sourceTree = ""; }; - D1A9B14B70FA26DBC56CEA54 /* Pods_AccessCheckoutReactNative.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AccessCheckoutReactNative.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - F774BB62CD3FD4BE07B8E378 /* Pods-AccessCheckoutReactNativeUnitTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AccessCheckoutReactNativeUnitTests.debug.xcconfig"; path = "Target Support Files/Pods-AccessCheckoutReactNativeUnitTests/Pods-AccessCheckoutReactNativeUnitTests.debug.xcconfig"; sourceTree = ""; }; - FB29C6D2B7D46CE62D034A19 /* Pods-AccessCheckoutReactNative.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AccessCheckoutReactNative.debug.xcconfig"; path = "Target Support Files/Pods-AccessCheckoutReactNative/Pods-AccessCheckoutReactNative.debug.xcconfig"; sourceTree = ""; }; - FCAD412BF5EDD019601562D6 /* Pods_AccessCheckoutReactNativeUnitTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AccessCheckoutReactNativeUnitTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + A801B54B720EBD674E60E506 /* Pods-AccessCheckoutReactNativeUnitTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AccessCheckoutReactNativeUnitTests.debug.xcconfig"; path = "Target Support Files/Pods-AccessCheckoutReactNativeUnitTests/Pods-AccessCheckoutReactNativeUnitTests.debug.xcconfig"; sourceTree = ""; }; + DA445251C9260C65BDB821A4 /* Pods-AccessCheckoutReactNative.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AccessCheckoutReactNative.debug.xcconfig"; path = "Target Support Files/Pods-AccessCheckoutReactNative/Pods-AccessCheckoutReactNative.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -117,7 +127,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 1085FCBC7FCD8F0B65952C91 /* Pods_AccessCheckoutReactNative.framework in Frameworks */, + F9072E98B9F57D1BF6246204 /* Pods_AccessCheckoutReactNative.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -126,7 +136,7 @@ buildActionMask = 2147483647; files = ( 516A9F612757D3B800E9B00E /* AccessCheckoutReactNative.framework in Frameworks */, - 9E76FAE1228E11E57FBA1E1F /* Pods_AccessCheckoutReactNativeUnitTests.framework in Frameworks */, + A9ED72A5E9195DD948506388 /* Pods_AccessCheckoutReactNativeUnitTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -143,14 +153,22 @@ 0B03ABF5587A3A533DCAD4DF /* Pods */ = { isa = PBXGroup; children = ( - FB29C6D2B7D46CE62D034A19 /* Pods-AccessCheckoutReactNative.debug.xcconfig */, - 4CF9E9AFFAEFDCD0DF2D332F /* Pods-AccessCheckoutReactNative.release.xcconfig */, - F774BB62CD3FD4BE07B8E378 /* Pods-AccessCheckoutReactNativeUnitTests.debug.xcconfig */, - 0A05132B3D087D149DBF457C /* Pods-AccessCheckoutReactNativeUnitTests.release.xcconfig */, + DA445251C9260C65BDB821A4 /* Pods-AccessCheckoutReactNative.debug.xcconfig */, + 297BA316EEA9A3E0CC6C6C63 /* Pods-AccessCheckoutReactNative.release.xcconfig */, + A801B54B720EBD674E60E506 /* Pods-AccessCheckoutReactNativeUnitTests.debug.xcconfig */, + 00ABDCBCE0FE39A5A7B91754 /* Pods-AccessCheckoutReactNativeUnitTests.release.xcconfig */, ); path = Pods; sourceTree = ""; }; + 46D3A9662B3460EC0056016D /* utils */ = { + isa = PBXGroup; + children = ( + 46D3A9672B3461030056016D /* AccessCheckoutReactNativeTestImplementation.swift */, + ); + path = utils; + sourceTree = ""; + }; 516A9F4D2757D3B800E9B00E = { isa = PBXGroup; children = ( @@ -160,7 +178,7 @@ 51D03E6727A85FBA009781EB /* AccessCheckoutReactNativeUnitTestsApp */, 516A9F582757D3B800E9B00E /* Products */, 0B03ABF5587A3A533DCAD4DF /* Pods */, - 8E71B2DAB4690E3A1CBDE758 /* Frameworks */, + D328A7054FE44725EB747E9F /* Frameworks */, ); sourceTree = ""; }; @@ -177,6 +195,8 @@ 516A9F592757D3B800E9B00E /* AccessCheckoutReactNative */ = { isa = PBXGroup; children = ( + 46D51A0A2B2B6D3D001A223C /* AccessCheckoutTextInputManager.m */, + 46D51A0C2B2B6D72001A223C /* AccessCheckoutTextInputManager.swift */, 51D03D3927A829D8009781EB /* session */, 517D9E5027A4141F002B1611 /* validation */, 516A9FA12757D6EB00E9B00E /* AccessCheckoutReactNative.m */, @@ -191,6 +211,7 @@ 516A9F642757D3B800E9B00E /* AccessCheckoutReactNativeUnitTests */ = { isa = PBXGroup; children = ( + 46D3A9662B3460EC0056016D /* utils */, 517D9E9927A45398002B1611 /* stubServices */, 517D9E4D27A41409002B1611 /* session */, 517D9E4E27A4140F002B1611 /* validation */, @@ -201,6 +222,7 @@ 515FFD69282E994300A15AEB /* AccessCheckoutReactNativeUnitTests.swift */, 51C8D02B27BA5B5800F30FD5 /* AccessCheckoutRnIllegalArgumentErrorUnitTests.swift */, 51D03EBB27A8658B009781EB /* CardValidationTestUIViewController.swift */, + 46D3A9622B3447AE0056016D /* SessionGenerationTestUIViewController.swift */, 515BA393282E6EA500BA262D /* CvcOnlyValidationTestUIViewController.swift */, ); path = AccessCheckoutReactNativeUnitTests; @@ -262,6 +284,7 @@ children = ( 51D03E8027A8601B009781EB /* AppDelegate.swift */, 51D03E9B27A8611D009781EB /* CardValidationTest.storyboard */, + 46D3A9642B34494B0056016D /* SessionGenerationTest.storyboard */, 515BA39B282E6F9600BA262D /* CvcValidationTest.storyboard */, 51D03E6E27A85FBA009781EB /* Main.storyboard */, 51D03E7127A85FC4009781EB /* Assets.xcassets */, @@ -271,11 +294,11 @@ path = AccessCheckoutReactNativeUnitTestsApp; sourceTree = ""; }; - 8E71B2DAB4690E3A1CBDE758 /* Frameworks */ = { + D328A7054FE44725EB747E9F /* Frameworks */ = { isa = PBXGroup; children = ( - D1A9B14B70FA26DBC56CEA54 /* Pods_AccessCheckoutReactNative.framework */, - FCAD412BF5EDD019601562D6 /* Pods_AccessCheckoutReactNativeUnitTests.framework */, + 2E69F34F7070C19C89742890 /* Pods_AccessCheckoutReactNative.framework */, + 0FA73C387ECF40CBA927EFB1 /* Pods_AccessCheckoutReactNativeUnitTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -298,12 +321,12 @@ isa = PBXNativeTarget; buildConfigurationList = 516A9F6B2757D3B800E9B00E /* Build configuration list for PBXNativeTarget "AccessCheckoutReactNative" */; buildPhases = ( - 042F371D493E6DABFDEF3267 /* [CP] Check Pods Manifest.lock */, + 035376D4EE81B163044EF1D3 /* [CP] Check Pods Manifest.lock */, 516A9F522757D3B800E9B00E /* Headers */, 516A9F532757D3B800E9B00E /* Sources */, 516A9F542757D3B800E9B00E /* Frameworks */, 516A9F552757D3B800E9B00E /* Resources */, - 9A3663AC6EF2305F39A7BD0B /* [CP] Copy Pods Resources */, + 74ED40430D411C1CB57F1461 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -318,12 +341,12 @@ isa = PBXNativeTarget; buildConfigurationList = 516A9F6E2757D3B800E9B00E /* Build configuration list for PBXNativeTarget "AccessCheckoutReactNativeUnitTests" */; buildPhases = ( - 3198F8708951ABA605A2ACD1 /* [CP] Check Pods Manifest.lock */, + 4A337EC7BA38160744E362E2 /* [CP] Check Pods Manifest.lock */, 516A9F5C2757D3B800E9B00E /* Sources */, 516A9F5D2757D3B800E9B00E /* Frameworks */, 516A9F5E2757D3B800E9B00E /* Resources */, - 345418B0DDDD9A8C510C0BDD /* [CP] Embed Pods Frameworks */, - 6E7AA427B4BE28C50D3FD882 /* [CP] Copy Pods Resources */, + 5B38B89F26ADB90120C112C7 /* [CP] Embed Pods Frameworks */, + A49419855F7224F2AE1BCB61 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -420,6 +443,7 @@ 51D03E9C27A8611D009781EB /* CardValidationTest.storyboard in Resources */, 51D03E7227A85FC4009781EB /* Assets.xcassets in Resources */, 515BA39C282E6F9600BA262D /* CvcValidationTest.storyboard in Resources */, + 46D3A9652B34494B0056016D /* SessionGenerationTest.storyboard in Resources */, 51D03E7027A85FBA009781EB /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -427,7 +451,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 042F371D493E6DABFDEF3267 /* [CP] Check Pods Manifest.lock */ = { + 035376D4EE81B163044EF1D3 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -449,7 +473,7 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 3198F8708951ABA605A2ACD1 /* [CP] Check Pods Manifest.lock */ = { + 4A337EC7BA38160744E362E2 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -471,7 +495,7 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 345418B0DDDD9A8C510C0BDD /* [CP] Embed Pods Frameworks */ = { + 5B38B89F26ADB90120C112C7 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -488,38 +512,38 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-AccessCheckoutReactNativeUnitTests/Pods-AccessCheckoutReactNativeUnitTests-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 6E7AA427B4BE28C50D3FD882 /* [CP] Copy Pods Resources */ = { + 74ED40430D411C1CB57F1461 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-AccessCheckoutReactNativeUnitTests/Pods-AccessCheckoutReactNativeUnitTests-resources-${CONFIGURATION}-input-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/Pods-AccessCheckoutReactNative/Pods-AccessCheckoutReactNative-resources-${CONFIGURATION}-input-files.xcfilelist", ); name = "[CP] Copy Pods Resources"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-AccessCheckoutReactNativeUnitTests/Pods-AccessCheckoutReactNativeUnitTests-resources-${CONFIGURATION}-output-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/Pods-AccessCheckoutReactNative/Pods-AccessCheckoutReactNative-resources-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-AccessCheckoutReactNativeUnitTests/Pods-AccessCheckoutReactNativeUnitTests-resources.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-AccessCheckoutReactNative/Pods-AccessCheckoutReactNative-resources.sh\"\n"; showEnvVarsInLog = 0; }; - 9A3663AC6EF2305F39A7BD0B /* [CP] Copy Pods Resources */ = { + A49419855F7224F2AE1BCB61 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-AccessCheckoutReactNative/Pods-AccessCheckoutReactNative-resources-${CONFIGURATION}-input-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/Pods-AccessCheckoutReactNativeUnitTests/Pods-AccessCheckoutReactNativeUnitTests-resources-${CONFIGURATION}-input-files.xcfilelist", ); name = "[CP] Copy Pods Resources"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-AccessCheckoutReactNative/Pods-AccessCheckoutReactNative-resources-${CONFIGURATION}-output-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/Pods-AccessCheckoutReactNativeUnitTests/Pods-AccessCheckoutReactNativeUnitTests-resources-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-AccessCheckoutReactNative/Pods-AccessCheckoutReactNative-resources.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-AccessCheckoutReactNativeUnitTests/Pods-AccessCheckoutReactNativeUnitTests-resources.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -533,8 +557,10 @@ 516A9FAA2757D6EB00E9B00E /* AccessCheckoutReactNative.m in Sources */, 516A9FAB2757D6EB00E9B00E /* GenerateSessionConfig.swift in Sources */, 5167BB3927A7FFB100F8569D /* ReactNativeViewLocator.swift in Sources */, + 46D51A0D2B2B6D72001A223C /* AccessCheckoutTextInputManager.swift in Sources */, 516A9FA92757D6EB00E9B00E /* CardValidationConfigRN.swift in Sources */, 516A9FB02757D6EB00E9B00E /* CardValidationDelegateRN.swift in Sources */, + 46D51A0B2B2B6D3D001A223C /* AccessCheckoutTextInputManager.m in Sources */, 516A9FB12757D6EB00E9B00E /* AccessCheckoutReactNative.swift in Sources */, 515BA3E4282E93A900BA262D /* CvcOnlyValidationDelegateRN.swift in Sources */, 515BA3A9282E829D00BA262D /* CvcOnlyValidationConfigRN.swift in Sources */, @@ -550,12 +576,14 @@ 515BA3CA282E903300BA262D /* CvcOnlyValidationDelegateRNUnitTests.swift in Sources */, 51C8CFBA27B6B7EE00F30FD5 /* GenerateSessionConfigUnitTests.swift in Sources */, 5167BB2727A459BF00F8569D /* StubServices.swift in Sources */, + 46D3A9682B3461030056016D /* AccessCheckoutReactNativeTestImplementation.swift in Sources */, 51C8D02C27BA5B5800F30FD5 /* AccessCheckoutRnIllegalArgumentErrorUnitTests.swift in Sources */, 515FFD6A282E994300A15AEB /* AccessCheckoutReactNativeUnitTests.swift in Sources */, 51D03EBC27A8658B009781EB /* CardValidationTestUIViewController.swift in Sources */, 515BA394282E6EA500BA262D /* CvcOnlyValidationTestUIViewController.swift in Sources */, 64ADC9392816E1510045BA58 /* AccessCheckoutReactNativeSessionAcceptanceTests.swift in Sources */, 51C8CFDF27B6E86000F30FD5 /* CardValidationDelegateRNUnitTests.swift in Sources */, + 46D3A9632B3447AE0056016D /* SessionGenerationTestUIViewController.swift in Sources */, 51C8CFCD27B6E71300F30FD5 /* RCTEventEmitterMock.swift in Sources */, 515BA38C282E6D6600BA262D /* AccessCheckoutReactNativeCvcOnlyValidationAcceptanceTests.swift in Sources */, 51C8D03727BA807C00F30FD5 /* ReactNativeViewLocatorUnitTests.swift in Sources */, @@ -751,7 +779,7 @@ }; 516A9F6C2757D3B800E9B00E /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = FB29C6D2B7D46CE62D034A19 /* Pods-AccessCheckoutReactNative.debug.xcconfig */; + baseConfigurationReference = DA445251C9260C65BDB821A4 /* Pods-AccessCheckoutReactNative.debug.xcconfig */; buildSettings = { CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; @@ -779,7 +807,7 @@ }; 516A9F6D2757D3B800E9B00E /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 4CF9E9AFFAEFDCD0DF2D332F /* Pods-AccessCheckoutReactNative.release.xcconfig */; + baseConfigurationReference = 297BA316EEA9A3E0CC6C6C63 /* Pods-AccessCheckoutReactNative.release.xcconfig */; buildSettings = { CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; @@ -806,7 +834,7 @@ }; 516A9F6F2757D3B800E9B00E /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F774BB62CD3FD4BE07B8E378 /* Pods-AccessCheckoutReactNativeUnitTests.debug.xcconfig */; + baseConfigurationReference = A801B54B720EBD674E60E506 /* Pods-AccessCheckoutReactNativeUnitTests.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; CODE_SIGN_STYLE = Automatic; @@ -827,7 +855,7 @@ }; 516A9F702757D3B800E9B00E /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0A05132B3D087D149DBF457C /* Pods-AccessCheckoutReactNativeUnitTests.release.xcconfig */; + baseConfigurationReference = 00ABDCBCE0FE39A5A7B91754 /* Pods-AccessCheckoutReactNativeUnitTests.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; CODE_SIGN_STYLE = Automatic; diff --git a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNative/AccessCheckoutReactNative.swift b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNative/AccessCheckoutReactNative.swift index cc19bab..9375126 100644 --- a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNative/AccessCheckoutReactNative.swift +++ b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNative/AccessCheckoutReactNative.swift @@ -39,14 +39,20 @@ class AccessCheckoutReactNative: RCTEventEmitter { let cardDetails: CardDetails if isCvcSessionOnly(sessionTypes: cfg.sessionTypes) { + let cvcInput = reactNativeViewLocator.locateUITextField(id: cfg.cvcId) + cardDetails = try CardDetailsBuilder() - .cvc(cfg.cvcValue!) + .cvc(cvcInput!) .build() } else { + let panInput = reactNativeViewLocator.locateUITextField(id: cfg.panId!) + let expiryInput = reactNativeViewLocator.locateUITextField(id: cfg.expiryDateId!) + let cvcInput = reactNativeViewLocator.locateUITextField(id: cfg.cvcId) + cardDetails = try CardDetailsBuilder() - .pan(cfg.panValue!) - .expiryDate(cfg.expiryDateValue!) - .cvc(cfg.cvcValue!) + .pan(panInput!) + .expiryDate(expiryInput!) + .cvc(cvcInput!) .build() } diff --git a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNative/AccessCheckoutReactNativeModule-Bridging-Header.h b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNative/AccessCheckoutReactNativeModule-Bridging-Header.h index f9419a3..dfcbc3b 100644 --- a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNative/AccessCheckoutReactNativeModule-Bridging-Header.h +++ b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNative/AccessCheckoutReactNativeModule-Bridging-Header.h @@ -1,6 +1,7 @@ #import #import #import +#import @interface AccessCheckoutReactNativeModule: NSObject @end diff --git a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNative/AccessCheckoutTextInputManager.m b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNative/AccessCheckoutTextInputManager.m new file mode 100644 index 0000000..7d1daaf --- /dev/null +++ b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNative/AccessCheckoutTextInputManager.m @@ -0,0 +1,7 @@ +#import +#import + +@interface RCT_EXTERN_MODULE(AccessCheckoutTextInputManager, RCTViewManager) +//Externalises properties +RCT_EXPORT_VIEW_PROPERTY(placeholder, NSString) +@end diff --git a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNative/AccessCheckoutTextInputManager.swift b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNative/AccessCheckoutTextInputManager.swift new file mode 100644 index 0000000..82032e8 --- /dev/null +++ b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNative/AccessCheckoutTextInputManager.swift @@ -0,0 +1,14 @@ +import AccessCheckoutSDK +import Foundation +import React + +@objc(AccessCheckoutTextInputManager) +class AccessCheckoutTextInputManager: RCTViewManager { + override func view() -> UIView! { + return AccessCheckoutUITextField() + } + + override static func requiresMainQueueSetup() -> Bool { + return false + } +} diff --git a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNative/session/GenerateSessionConfig.swift b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNative/session/GenerateSessionConfig.swift index 36bd690..37d6625 100644 --- a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNative/session/GenerateSessionConfig.swift +++ b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNative/session/GenerateSessionConfig.swift @@ -3,48 +3,36 @@ import AccessCheckoutSDK struct GenerateSessionConfig { let baseUrl: String let merchantId: String - var panValue: String? - var expiryDateValue: String? - let cvcValue: String? + var panId: String? + var expiryDateId: String? + let cvcId: String let sessionTypes: Set var reactNativeSdkVersion: String? init(dictionary: NSDictionary) throws { + // Required Arguments self.baseUrl = dictionary["baseUrl"] as? String ?? "" self.merchantId = dictionary["merchantId"] as? String ?? "" - self.cvcValue = dictionary["cvcValue"] as? String ?? "" + self.cvcId = dictionary["cvcId"] as? String ?? "" - if self.baseUrl == "" { + guard !self.baseUrl.isEmpty else { throw AccessCheckoutRnIllegalArgumentError.missingBaseUrl() } - - if self.merchantId == "" { + guard !self.merchantId.isEmpty else { throw AccessCheckoutRnIllegalArgumentError.missingMerchantId() } - if dictionary["panValue"] != nil { - if let string = dictionary["panValue"] as? String, string != "" { - self.panValue = string - } else { - throw AccessCheckoutRnIllegalArgumentError.missingPan() - } - } - - if dictionary["expiryDateValue"] != nil { - if let string = dictionary["expiryDateValue"] as? String, string != "" { - self.expiryDateValue = string - } else { - throw AccessCheckoutRnIllegalArgumentError.missingExpiryDate() - } + // Cvc is always required independently on the type of session generated + guard !self.cvcId.isEmpty else { + throw AccessCheckoutRnIllegalArgumentError.missingCvc() } let sessionTypes = dictionary["sessionTypes"] as? [AnyObject] ?? [] - if sessionTypes.count == 0 { + guard sessionTypes.count != 0 else { throw AccessCheckoutRnIllegalArgumentError.missingSessionTypes() } - - if sessionTypes.count > 2 { + guard sessionTypes.count <= 2 else { throw AccessCheckoutRnIllegalArgumentError.tooManySessionTypes( numberFound: sessionTypes.count) } @@ -64,20 +52,23 @@ struct GenerateSessionConfig { throw AccessCheckoutRnIllegalArgumentError.sessionTypeIsNotString() } } + self.sessionTypes = set // Pan and Expiry date are required when requesting a card session if self.sessionTypes.contains(SessionType.card) { - if self.panValue == nil || self.panValue == "" { + if let string = dictionary["panId"] as? String, !string.isEmpty { + self.panId = string + } else { throw AccessCheckoutRnIllegalArgumentError.missingPan() - } else if self.expiryDateValue == nil || self.expiryDateValue == "" { + } + + if let string = dictionary["expiryDateId"] as? String, !string.isEmpty { + self.expiryDateId = string + } else { throw AccessCheckoutRnIllegalArgumentError.missingExpiryDate() } } - // Cvc is always required independently on the type of session generated - if self.cvcValue == nil || self.cvcValue == "" { - throw AccessCheckoutRnIllegalArgumentError.missingCvc() - } if dictionary["reactNativeSdkVersion"] == nil { throw AccessCheckoutRnIllegalArgumentError.missingReactNativeSdkVersion() diff --git a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNative/validation/ReactNativeViewLocator.swift b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNative/validation/ReactNativeViewLocator.swift index 780589c..86a14e4 100644 --- a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNative/validation/ReactNativeViewLocator.swift +++ b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNative/validation/ReactNativeViewLocator.swift @@ -3,26 +3,26 @@ import Foundation import React class ReactNativeViewLocator { - func locateUITextField(id: String) -> UITextField? { + func locateUITextField(id: String) -> AccessCheckoutUITextField? { guard let controller: UIViewController = RCTPresentedViewController() else { return nil } - return self.searchForView(subViews: controller.view!.subviews, nativeId: id) + let view = self.searchForView(subViews: controller.view!.subviews, nativeId: id) + return view as? AccessCheckoutUITextField } - private func searchForView(subViews: [UIView], nativeId: String) -> UITextField? { + private func searchForView(subViews: [UIView], nativeId: String) -> UIView? { for subView in subViews { - if subView.nativeID == nil { - if let view = searchForView(subViews: subView.subviews, nativeId: nativeId) { + if subView.nativeID == nativeId { + return subView + } else { + let view = self.searchForView(subViews: subView.subviews, nativeId: nativeId) + if view != nil { return view } - } else if subView.nativeID! == nativeId { - let inputView = (subView as? RCTSinglelineTextInputView)?.backedTextInputView - return inputView as? UITextField } } - return nil } @@ -31,20 +31,6 @@ class ReactNativeViewLocator { return nil } - return self.searchForViewInSubViews(subViews: controller.view!.subviews, nativeId: id) - } - - private func searchForViewInSubViews(subViews: [UIView], nativeId: String) -> UIView? { - for subView in subViews { - if subView.nativeID == nil { - if let view = searchForViewInSubViews(subViews: subView.subviews, nativeId: nativeId) { - return view - } - } else if subView.nativeID! == nativeId { - return subView - } - } - - return nil + return self.searchForView(subViews: controller.view!.subviews, nativeId: id) } } diff --git a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/AccessCheckoutReactNativeCardValidationAcceptanceTests.swift b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/AccessCheckoutReactNativeCardValidationAcceptanceTests.swift index 094b315..9d8c0d9 100644 --- a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/AccessCheckoutReactNativeCardValidationAcceptanceTests.swift +++ b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/AccessCheckoutReactNativeCardValidationAcceptanceTests.swift @@ -1,10 +1,10 @@ +@testable import AccessCheckoutReactNative +@testable import AccessCheckoutReactNativeUnitTestsApp +@testable import AccessCheckoutSDK import Mockingjay import React import XCTest -@testable import AccessCheckoutReactNative -@testable import AccessCheckoutReactNativeUnitTestsApp - class AccessCheckoutReactNativeCardValidationAcceptanceTests: XCTestCase { private let stubServices = StubServices(baseUrl: "http://localhost") private let config: NSDictionary = [ @@ -17,9 +17,9 @@ class AccessCheckoutReactNativeCardValidationAcceptanceTests: XCTestCase { private let storyboard = UIStoryboard(name: "CardValidationTest", bundle: nil) private var reactNativeViewLocatorMock: ReactNativeViewLocatorMock? private var controller: CardValidationTestUIViewController? = nil - private var panUITextField: UITextField? = nil - private var expiryDateUITextField: UITextField? = nil - private var cvcUITextField: UITextField? = nil + private var panACUITextField: AccessCheckoutUITextField? = nil + private var expiryDateACUITextField: AccessCheckoutUITextField? = nil + private var cvcACUITextField: AccessCheckoutUITextField? = nil override func setUp() { controller = @@ -27,13 +27,13 @@ class AccessCheckoutReactNativeCardValidationAcceptanceTests: XCTestCase { withIdentifier: "CardValidationTestUIViewController") as! CardValidationTestUIViewController) controller!.loadViewIfNeeded() - panUITextField = controller!.panTextField - expiryDateUITextField = controller!.expiryDateTextField - cvcUITextField = controller!.cvcTextField + panACUITextField = controller!.panTextField + expiryDateACUITextField = controller!.expiryDateTextField + cvcACUITextField = controller!.cvcTextField reactNativeViewLocatorMock = ReactNativeViewLocatorMock( - panUITextField: panUITextField!, - expiryDateUITextField: expiryDateUITextField!, - cvcUITextField: cvcUITextField!) + panView: panACUITextField!, + expiryDateView: expiryDateACUITextField!, + cvcView: cvcACUITextField!) } func testShouldReturnAnErrorWhenConfigurationProvidedIsInvalid() { @@ -41,10 +41,10 @@ class AccessCheckoutReactNativeCardValidationAcceptanceTests: XCTestCase { let invalidConfig: NSDictionary = [:] let accessCheckoutReactNative = AccessCheckoutReactNative(reactNativeViewLocatorMock!) - accessCheckoutReactNative.initialiseCardValidation(config: invalidConfig) { (success) in + accessCheckoutReactNative.initialiseCardValidation(config: invalidConfig) { _ in XCTFail("validation initialisation should have faild but it didn't") expectationToFulfill.fulfill() - } reject: { (errorCode, errorDescription, error) in + } reject: { _, _, error in let expectedError = AccessCheckoutRnIllegalArgumentError.missingBaseUrl() XCTAssertEqual(error as! AccessCheckoutRnIllegalArgumentError, expectedError) expectationToFulfill.fulfill() @@ -57,14 +57,14 @@ class AccessCheckoutReactNativeCardValidationAcceptanceTests: XCTestCase { let expectationToFulfill = expectation(description: "Error should be returned") let accessCheckoutReactNative = AccessCheckoutReactNative(reactNativeViewLocatorMock!) - reactNativeViewLocatorMock!.panUITextField = nil + reactNativeViewLocatorMock!.panView = nil let expectedError = AccessCheckoutRnIllegalArgumentError.panTextFieldNotFound( panNativeId: "pan") - accessCheckoutReactNative.initialiseCardValidation(config: config) { (success) in + accessCheckoutReactNative.initialiseCardValidation(config: config) { _ in XCTFail("validation initialisation should have faild but it didn't") expectationToFulfill.fulfill() - } reject: { (_, _, error) in + } reject: { _, _, error in XCTAssertEqual(error as! AccessCheckoutRnIllegalArgumentError, expectedError) expectationToFulfill.fulfill() } @@ -76,14 +76,14 @@ class AccessCheckoutReactNativeCardValidationAcceptanceTests: XCTestCase { let expectationToFulfill = expectation(description: "Error should be returned") let accessCheckoutReactNative = AccessCheckoutReactNative(reactNativeViewLocatorMock!) - reactNativeViewLocatorMock!.expiryDateUITextField = nil + reactNativeViewLocatorMock!.expiryDateView = nil let expectedError = AccessCheckoutRnIllegalArgumentError.expiryDateTextFieldNotFound( expiryDateNativeId: "expiryDate") - accessCheckoutReactNative.initialiseCardValidation(config: config) { (success) in + accessCheckoutReactNative.initialiseCardValidation(config: config) { _ in XCTFail("validation initialisation should have faild but it didn't") expectationToFulfill.fulfill() - } reject: { (_, _, error) in + } reject: { _, _, error in XCTAssertEqual(error as! AccessCheckoutRnIllegalArgumentError, expectedError) expectationToFulfill.fulfill() } @@ -95,14 +95,14 @@ class AccessCheckoutReactNativeCardValidationAcceptanceTests: XCTestCase { let expectationToFulfill = expectation(description: "Error should be returned") let accessCheckoutReactNative = AccessCheckoutReactNative(reactNativeViewLocatorMock!) - reactNativeViewLocatorMock!.cvcUITextField = nil + reactNativeViewLocatorMock!.cvcView = nil let expectedError = AccessCheckoutRnIllegalArgumentError.cvcTextFieldNotFound( cvcNativeId: "cvc") - accessCheckoutReactNative.initialiseCardValidation(config: config) { (success) in + accessCheckoutReactNative.initialiseCardValidation(config: config) { _ in XCTFail("validation initialisation should have faild but it didn't") expectationToFulfill.fulfill() - } reject: { (_, _, error) in + } reject: { _, _, error in XCTAssertEqual(error as! AccessCheckoutRnIllegalArgumentError, expectedError) expectationToFulfill.fulfill() } @@ -114,10 +114,10 @@ class AccessCheckoutReactNativeCardValidationAcceptanceTests: XCTestCase { let expectationToFulfill = expectation(description: "run test successfully") let accessCheckoutReactNative = AccessCheckoutReactNative(reactNativeViewLocatorMock!) - accessCheckoutReactNative.initialiseCardValidation(config: config) { (success) in + accessCheckoutReactNative.initialiseCardValidation(config: config) { success in XCTAssertTrue(success as! Bool) expectationToFulfill.fulfill() - } reject: { (_, _, error) in + } reject: { _, _, error in XCTFail( "got an error back from initialisation \(String(describing: error))" ) @@ -132,10 +132,11 @@ class AccessCheckoutReactNativeCardValidationAcceptanceTests: XCTestCase { let accessCheckoutReactNative = AccessCheckoutReactNativeTestImplementation( reactNativeViewLocatorMock!) - accessCheckoutReactNative.initialiseCardValidation(config: config) { (success) in + accessCheckoutReactNative.initialiseCardValidation(config: config) { success in XCTAssertEqual(true, (success as! Bool)) - self.panUITextField!.insertText("4444333322221111") + let field = self.panACUITextField?.uiTextField + field!.insertText("4444333322221111") XCTAssertEqual(accessCheckoutReactNative.eventsSent.count, 1) @@ -145,7 +146,7 @@ class AccessCheckoutReactNativeCardValidationAcceptanceTests: XCTestCase { XCTAssertTrue(event.body.isValid!) expectationToFulfill.fulfill() - } reject: { (_, _, error) in + } reject: { _, _, error in XCTFail( "got an error back from validation: \(String(describing: error))" ) @@ -160,12 +161,14 @@ class AccessCheckoutReactNativeCardValidationAcceptanceTests: XCTestCase { let accessCheckoutReactNative = AccessCheckoutReactNativeTestImplementation( reactNativeViewLocatorMock!) - accessCheckoutReactNative.initialiseCardValidation(config: config) { (success) in + accessCheckoutReactNative.initialiseCardValidation(config: config) { success in XCTAssertTrue(success as! Bool) - self.panUITextField!.insertText("4444333322221111") - self.panUITextField!.deleteBackward() - XCTAssertEqual(self.panUITextField!.text, "444433332222111") + let field = self.panACUITextField?.uiTextField + field!.insertText("4444333322221111") + field!.deleteBackward() + + XCTAssertEqual(field!.text, "444433332222111") XCTAssertEqual(accessCheckoutReactNative.eventsSent.count, 2) @@ -175,7 +178,7 @@ class AccessCheckoutReactNativeCardValidationAcceptanceTests: XCTestCase { XCTAssertFalse(event.body.isValid!) expectationToFulfill.fulfill() - } reject: { (_, _, error) in + } reject: { _, _, error in XCTFail( "got an error back from validation: \(String(describing: error))" ) @@ -190,11 +193,11 @@ class AccessCheckoutReactNativeCardValidationAcceptanceTests: XCTestCase { let accessCheckoutReactNative = AccessCheckoutReactNativeTestImplementation( reactNativeViewLocatorMock!) - accessCheckoutReactNative.initialiseCardValidation(config: config) { (success) in + accessCheckoutReactNative.initialiseCardValidation(config: config) { success in XCTAssertEqual(true, (success as! Bool)) - self.cvcUITextField!.insertText("123") - + let field = self.cvcACUITextField?.uiTextField + field!.insertText("123") XCTAssertEqual(accessCheckoutReactNative.eventsSent.count, 1) let event = accessCheckoutReactNative.eventsSent[0] @@ -203,7 +206,7 @@ class AccessCheckoutReactNativeCardValidationAcceptanceTests: XCTestCase { XCTAssertTrue(event.body.isValid!) expectationToFulfill.fulfill() - } reject: { (_, _, error) in + } reject: { _, _, error in XCTFail( "got an error back from validation \(String(describing: error))" ) @@ -218,12 +221,13 @@ class AccessCheckoutReactNativeCardValidationAcceptanceTests: XCTestCase { let accessCheckoutReactNative = AccessCheckoutReactNativeTestImplementation( reactNativeViewLocatorMock!) - accessCheckoutReactNative.initialiseCardValidation(config: config) { (success) in + accessCheckoutReactNative.initialiseCardValidation(config: config) { success in XCTAssertTrue(success as! Bool) - self.cvcUITextField!.insertText("123") - self.cvcUITextField!.deleteBackward() - XCTAssertEqual(self.cvcUITextField!.text, "12") + let field = self.cvcACUITextField?.uiTextField + field!.insertText("123") + field!.deleteBackward() + XCTAssertEqual(field!.text, "12") XCTAssertEqual(accessCheckoutReactNative.eventsSent.count, 2) @@ -233,7 +237,7 @@ class AccessCheckoutReactNativeCardValidationAcceptanceTests: XCTestCase { XCTAssertFalse(event.body.isValid!) expectationToFulfill.fulfill() - } reject: { (_, _, error) in + } reject: { _, _, error in XCTFail( "got an error back from validation: \(String(describing: error))" ) @@ -248,11 +252,11 @@ class AccessCheckoutReactNativeCardValidationAcceptanceTests: XCTestCase { let accessCheckoutReactNative = AccessCheckoutReactNativeTestImplementation( reactNativeViewLocatorMock!) - accessCheckoutReactNative.initialiseCardValidation(config: config) { (success) in + accessCheckoutReactNative.initialiseCardValidation(config: config) { success in XCTAssertEqual(true, (success as! Bool)) - self.expiryDateUITextField!.insertText("10/34") - + let field = self.expiryDateACUITextField?.uiTextField + field!.insertText("10/34") XCTAssertEqual(accessCheckoutReactNative.eventsSent.count, 1) let event = accessCheckoutReactNative.eventsSent[0] @@ -261,7 +265,7 @@ class AccessCheckoutReactNativeCardValidationAcceptanceTests: XCTestCase { XCTAssertTrue(event.body.isValid!) expectationToFulfill.fulfill() - } reject: { (_, _, error) in + } reject: { _, _, error in XCTFail( "got an error back from validation: \(String(describing: error))" ) @@ -276,12 +280,13 @@ class AccessCheckoutReactNativeCardValidationAcceptanceTests: XCTestCase { let accessCheckoutReactNative = AccessCheckoutReactNativeTestImplementation( reactNativeViewLocatorMock!) - accessCheckoutReactNative.initialiseCardValidation(config: config) { (success) in + accessCheckoutReactNative.initialiseCardValidation(config: config) { success in XCTAssertTrue(success as! Bool) - self.expiryDateUITextField!.insertText("10/34") - self.expiryDateUITextField!.deleteBackward() - XCTAssertEqual(self.expiryDateUITextField!.text, "10/3") + let field = self.expiryDateACUITextField?.uiTextField + field!.insertText("10/34") + field!.deleteBackward() + XCTAssertEqual(field!.text, "10/3") XCTAssertEqual(accessCheckoutReactNative.eventsSent.count, 2) @@ -291,7 +296,7 @@ class AccessCheckoutReactNativeCardValidationAcceptanceTests: XCTestCase { XCTAssertFalse(event.body.isValid!) expectationToFulfill.fulfill() - } reject: { (_, _, error) in + } reject: { _, _, error in XCTFail( "got an error back from validation: \(String(describing: error))" ) @@ -307,13 +312,14 @@ class AccessCheckoutReactNativeCardValidationAcceptanceTests: XCTestCase { let accessCheckoutReactNative = AccessCheckoutReactNativeTestImplementation( reactNativeViewLocatorMock!) - accessCheckoutReactNative.initialiseCardValidation(config: config) { (success) in + accessCheckoutReactNative.initialiseCardValidation(config: config) { success in XCTAssertTrue(success as! Bool) // Waiting for configuration to have successfully loaded self.wait(0.5) - self.panUITextField!.insertText("4") + let field = self.panACUITextField?.uiTextField + field!.insertText("4") XCTAssertEqual(accessCheckoutReactNative.eventsSent.count, 1) @@ -328,7 +334,7 @@ class AccessCheckoutReactNativeCardValidationAcceptanceTests: XCTestCase { XCTAssertEqual(event.body.brand?.images?[1].url, "http://localhost/visa.svg") expectationToFulfill.fulfill() - } reject: { (_, _, error) in + } reject: { _, _, error in XCTFail( "got an error back from validation: \(String(describing: error))" ) @@ -344,14 +350,15 @@ class AccessCheckoutReactNativeCardValidationAcceptanceTests: XCTestCase { let accessCheckoutReactNative = AccessCheckoutReactNativeTestImplementation( reactNativeViewLocatorMock!) - accessCheckoutReactNative.initialiseCardValidation(config: config) { (success) in + accessCheckoutReactNative.initialiseCardValidation(config: config) { success in XCTAssertTrue(success as! Bool) // Waiting for configuration to have successfully loaded self.wait(0.5) - self.panUITextField!.insertText("4") - self.panUITextField!.deleteBackward() + let field = self.panACUITextField?.uiTextField + field!.insertText("4") + field!.deleteBackward() XCTAssertEqual(accessCheckoutReactNative.eventsSent.count, 2) @@ -361,7 +368,7 @@ class AccessCheckoutReactNativeCardValidationAcceptanceTests: XCTestCase { XCTAssertNil(event.body.brand) expectationToFulfill.fulfill() - } reject: { (_, _, error) in + } reject: { _, _, error in XCTFail( "got an error back from validation: \(String(describing: error))" ) @@ -376,12 +383,15 @@ class AccessCheckoutReactNativeCardValidationAcceptanceTests: XCTestCase { let accessCheckoutReactNative = AccessCheckoutReactNativeTestImplementation( reactNativeViewLocatorMock!) - accessCheckoutReactNative.initialiseCardValidation(config: config) { (success) in + accessCheckoutReactNative.initialiseCardValidation(config: config) { success in XCTAssertTrue(success as! Bool) - self.panUITextField!.insertText("4444333322221111") - self.expiryDateUITextField!.insertText("12/34") - self.cvcUITextField!.insertText("123") + let panField = self.panACUITextField?.uiTextField + panField!.insertText("4444333322221111") + let expiryField = self.expiryDateACUITextField?.uiTextField + expiryField!.insertText("12/34") + let cvcField = self.cvcACUITextField?.uiTextField + cvcField!.insertText("123") XCTAssertEqual(accessCheckoutReactNative.eventsSent.count, 4) @@ -391,7 +401,7 @@ class AccessCheckoutReactNativeCardValidationAcceptanceTests: XCTestCase { XCTAssertTrue(event.body.isValid!) expectationToFulfill.fulfill() - } reject: { (_, _, error) in + } reject: { _, _, error in XCTFail( "got an error back from validation: \(String(describing: error))" ) @@ -415,13 +425,14 @@ class AccessCheckoutReactNativeCardValidationAcceptanceTests: XCTestCase { "acceptedCardBrands": ["mastercard"], ] - accessCheckoutReactNative.initialiseCardValidation(config: config) { (success) in + accessCheckoutReactNative.initialiseCardValidation(config: config) { success in XCTAssertTrue(success as! Bool) // Waiting for configuration to have successfully loaded self.wait(0.5) - self.panUITextField!.insertText("4444333322221111") + let panField = self.panACUITextField?.uiTextField + panField!.insertText("4444333322221111") XCTAssertEqual(accessCheckoutReactNative.eventsSent.count, 1) @@ -430,7 +441,7 @@ class AccessCheckoutReactNativeCardValidationAcceptanceTests: XCTestCase { XCTAssertEqual(event.body.type, "brand") expectationToFulfill.fulfill() - } reject: { (_, _, error) in + } reject: { _, _, error in XCTFail( "got an error back from validation: \(String(describing: error))" ) @@ -452,16 +463,17 @@ class AccessCheckoutReactNativeCardValidationAcceptanceTests: XCTestCase { let accessCheckoutReactNative = AccessCheckoutReactNativeTestImplementation( reactNativeViewLocatorMock!) - accessCheckoutReactNative.initialiseCardValidation(config: config) { (success) in + accessCheckoutReactNative.initialiseCardValidation(config: config) { success in XCTAssertTrue(success as! Bool) + let panField = self.panACUITextField?.uiTextField - self.panUITextField!.insertText("44443333") - self.triggerTextFieldDelegate(self.panUITextField!) + panField!.insertText("44443333") + self.triggerTextFieldDelegate(panField!) - XCTAssertEqual(self.panUITextField!.text!, "4444 3333") + XCTAssertEqual(panField!.text, "4444 3333") expectationToFulfill.fulfill() - } reject: { (_, _, error) in + } reject: { _, _, error in XCTFail( "got an error back from validation: \(String(describing: error))" ) @@ -482,18 +494,4 @@ class AccessCheckoutReactNativeCardValidationAcceptanceTests: XCTestCase { let exp = XCTestCase().expectation(description: "Waiting for \(timeoutInSeconds)") _ = XCTWaiter.wait(for: [exp], timeout: timeoutInSeconds) } - - private class AccessCheckoutReactNativeTestImplementation: AccessCheckoutReactNative { - private(set) var eventsSent: [RCTEventMock] = [] - - override func sendEvent(withName name: String!, body: Any!) { - let eventMock = RCTEventMock(name, bodyDictionary: body as! NSDictionary) - eventsSent.append(eventMock) - } - - // This is required to get the "testShouldFormatPanWhenPanFormattingEnabled" test pass otherwise it fails with an error we have not been able to resolve - override func supportedEvents() -> [String]! { - return ["some-event-type"] - } - } } diff --git a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/AccessCheckoutReactNativeCvcOnlyValidationAcceptanceTests.swift b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/AccessCheckoutReactNativeCvcOnlyValidationAcceptanceTests.swift index b465e2b..c452e79 100644 --- a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/AccessCheckoutReactNativeCvcOnlyValidationAcceptanceTests.swift +++ b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/AccessCheckoutReactNativeCvcOnlyValidationAcceptanceTests.swift @@ -1,9 +1,10 @@ -import Mockingjay -import React -import XCTest @testable import AccessCheckoutReactNative @testable import AccessCheckoutReactNativeUnitTestsApp +@testable import AccessCheckoutSDK +import Mockingjay +import React +import XCTest class AccessCheckoutReactNativeCvcOnlyValidationAcceptanceTests: XCTestCase { private let stubServices = StubServices(baseUrl: "http://localhost") @@ -12,16 +13,16 @@ class AccessCheckoutReactNativeCvcOnlyValidationAcceptanceTests: XCTestCase { private let storyboard = UIStoryboard(name: "CvcValidationTest", bundle: nil) private var reactNativeViewLocatorMock: ReactNativeViewLocatorMock? private var controller: CvcOnlyValidationTestUIViewController? = nil - private var cvcUITextField: UITextField? = nil - + private var cvcACUITextField: AccessCheckoutUITextField? = nil + override func setUp() { controller = (storyboard.instantiateViewController( withIdentifier: "CvcOnlyValidationTestUIViewController") as! CvcOnlyValidationTestUIViewController) controller!.loadViewIfNeeded() - cvcUITextField = controller!.cvcTextField - reactNativeViewLocatorMock = ReactNativeViewLocatorMock(cvcUITextField: cvcUITextField!) + cvcACUITextField = controller!.cvcTextField + reactNativeViewLocatorMock = ReactNativeViewLocatorMock(cvcView: cvcACUITextField!) } func testShouldReturnAnErrorWhenConfigurationProvidedIsInvalid() { @@ -29,11 +30,11 @@ class AccessCheckoutReactNativeCvcOnlyValidationAcceptanceTests: XCTestCase { let invalidConfig: NSDictionary = [:] let accessCheckoutReactNative = AccessCheckoutReactNative(reactNativeViewLocatorMock!) let expectedError = AccessCheckoutRnIllegalArgumentError.missingCvcId() - - accessCheckoutReactNative.initialiseCvcOnlyValidation(config: invalidConfig) { (success) in + + accessCheckoutReactNative.initialiseCvcOnlyValidation(config: invalidConfig) { _ in XCTFail("validation initialisation should have faild but it didn't") expectationToFulfill.fulfill() - } reject: { (_, _, error) in + } reject: { _, _, error in XCTAssertEqual(error as! AccessCheckoutRnIllegalArgumentError, expectedError) expectationToFulfill.fulfill() } @@ -44,15 +45,15 @@ class AccessCheckoutReactNativeCvcOnlyValidationAcceptanceTests: XCTestCase { func testShouldReturnAnErrorWhenCvcTextFieldNotFound() { let expectationToFulfill = expectation(description: "Error should be returned") let accessCheckoutReactNative = AccessCheckoutReactNative(reactNativeViewLocatorMock!) - - reactNativeViewLocatorMock!.cvcUITextField = nil + + reactNativeViewLocatorMock!.cvcView = nil let expectedError = AccessCheckoutRnIllegalArgumentError.cvcTextFieldNotFound( cvcNativeId: "cvc") - accessCheckoutReactNative.initialiseCvcOnlyValidation(config: config) { (success) in + accessCheckoutReactNative.initialiseCvcOnlyValidation(config: config) { _ in XCTFail("validation initialisation should have faild but it didn't") expectationToFulfill.fulfill() - } reject: { (_, _, error) in + } reject: { _, _, error in XCTAssertEqual(error as! AccessCheckoutRnIllegalArgumentError, expectedError) expectationToFulfill.fulfill() } @@ -63,11 +64,11 @@ class AccessCheckoutReactNativeCvcOnlyValidationAcceptanceTests: XCTestCase { func testShouldResolvePromiseWithTrueWhenSuccessfullyInitialised() { let expectationToFulfill = expectation(description: "run test successfully") let accessCheckoutReactNative = AccessCheckoutReactNative(reactNativeViewLocatorMock!) - - accessCheckoutReactNative.initialiseCvcOnlyValidation(config: config) { (success) in + + accessCheckoutReactNative.initialiseCvcOnlyValidation(config: config) { success in XCTAssertTrue(success as! Bool) expectationToFulfill.fulfill() - } reject: { (_, _, error) in + } reject: { _, _, error in XCTFail( "got an error back from initialisation \(String(describing: error))" ) @@ -82,10 +83,11 @@ class AccessCheckoutReactNativeCvcOnlyValidationAcceptanceTests: XCTestCase { let accessCheckoutReactNative = AccessCheckoutReactNativeTestImplementation( reactNativeViewLocatorMock!) - accessCheckoutReactNative.initialiseCvcOnlyValidation(config: config) { (success) in + accessCheckoutReactNative.initialiseCvcOnlyValidation(config: config) { success in XCTAssertEqual(true, (success as! Bool)) - self.cvcUITextField!.insertText("123") + let field = self.cvcACUITextField?.uiTextField + field!.insertText("123") XCTAssertEqual(accessCheckoutReactNative.eventsSent.count, 2) @@ -95,7 +97,7 @@ class AccessCheckoutReactNativeCvcOnlyValidationAcceptanceTests: XCTestCase { XCTAssertTrue(event.body.isValid!) expectationToFulfill.fulfill() - } reject: { (_, _, error) in + } reject: { _, _, error in XCTFail( "got an error back from validation: \(String(describing: error))" ) @@ -110,12 +112,13 @@ class AccessCheckoutReactNativeCvcOnlyValidationAcceptanceTests: XCTestCase { let accessCheckoutReactNative = AccessCheckoutReactNativeTestImplementation( reactNativeViewLocatorMock!) - accessCheckoutReactNative.initialiseCvcOnlyValidation(config: config) { (success) in + accessCheckoutReactNative.initialiseCvcOnlyValidation(config: config) { success in XCTAssertTrue(success as! Bool) - self.cvcUITextField!.insertText("123") - self.cvcUITextField!.deleteBackward() - XCTAssertEqual(self.cvcUITextField!.text, "12") + let field = self.cvcACUITextField?.uiTextField + field!.insertText("123") + field!.deleteBackward() + XCTAssertEqual(field!.text, "12") XCTAssertEqual(accessCheckoutReactNative.eventsSent.count, 3) @@ -125,7 +128,7 @@ class AccessCheckoutReactNativeCvcOnlyValidationAcceptanceTests: XCTestCase { XCTAssertFalse(event.body.isValid!) expectationToFulfill.fulfill() - } reject: { (a, b, c) in + } reject: { a, b, c in XCTFail( "got an error back from validation \(String(describing: a)) \(String(describing: b)) \(String(describing: c))" ) @@ -140,10 +143,11 @@ class AccessCheckoutReactNativeCvcOnlyValidationAcceptanceTests: XCTestCase { let accessCheckoutReactNative = AccessCheckoutReactNativeTestImplementation( reactNativeViewLocatorMock!) - accessCheckoutReactNative.initialiseCvcOnlyValidation(config: config) { (success) in + accessCheckoutReactNative.initialiseCvcOnlyValidation(config: config) { success in XCTAssertTrue(success as! Bool) - self.cvcUITextField!.insertText("123") + let field = self.cvcACUITextField?.uiTextField + field!.insertText("123") XCTAssertEqual(accessCheckoutReactNative.eventsSent.count, 2) @@ -153,7 +157,7 @@ class AccessCheckoutReactNativeCvcOnlyValidationAcceptanceTests: XCTestCase { XCTAssertTrue(event.body.isValid!) expectationToFulfill.fulfill() - } reject: { (a, b, c) in + } reject: { a, b, c in XCTFail( "got an error back from validation \(String(describing: a)) \(String(describing: b)) \(String(describing: c))" ) @@ -174,18 +178,4 @@ class AccessCheckoutReactNativeCvcOnlyValidationAcceptanceTests: XCTestCase { let exp = XCTestCase().expectation(description: "Waiting for \(timeoutInSeconds)") _ = XCTWaiter.wait(for: [exp], timeout: timeoutInSeconds) } - - private class AccessCheckoutReactNativeTestImplementation: AccessCheckoutReactNative { - private(set) var eventsSent: [RCTEventMock] = [] - - override func sendEvent(withName name: String!, body: Any!) { - let eventMock = RCTEventMock(name, bodyDictionary: body as! NSDictionary) - eventsSent.append(eventMock) - } - - // This is required to get the "testShouldRaiseEventWhenAllFieldsBecomeValid" test pass otherwise it fails with an error we have not been able to resolve - override func supportedEvents() -> [String]! { - return ["some-event-type"] - } - } } diff --git a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/AccessCheckoutReactNativeSessionAcceptanceTests.swift b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/AccessCheckoutReactNativeSessionAcceptanceTests.swift index de0a6ca..9495533 100644 --- a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/AccessCheckoutReactNativeSessionAcceptanceTests.swift +++ b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/AccessCheckoutReactNativeSessionAcceptanceTests.swift @@ -5,8 +5,35 @@ import XCTest @testable import AccessCheckoutSDK class AccessCheckoutReactNativeSessionAcceptanceTests: XCTestCase { - let accessCheckoutReactNative = AccessCheckoutReactNative() - let stubServices = StubServices(baseUrl: "http://localhost") + private let stubServices = StubServices(baseUrl: "http://localhost") + + private let storyboard = UIStoryboard(name: "SessionGenerationTest", bundle: nil) + private var reactNativeViewLocatorMock: ReactNativeViewLocatorMock? + private var controller: SessionGenerationTestUIViewController? = nil + private var accessCheckoutReactNative: AccessCheckoutReactNative? = nil + + private var panACUITextField: AccessCheckoutUITextField? = nil + private var expiryDateACUITextField: AccessCheckoutUITextField? = nil + private var cvcACUITextField: AccessCheckoutUITextField? = nil + + override func setUp() { + controller = + (storyboard.instantiateViewController( + withIdentifier: "SessionGenerationTestUIViewController") + as! SessionGenerationTestUIViewController) + controller!.loadViewIfNeeded() + + panACUITextField = controller!.panTextField + expiryDateACUITextField = controller!.expiryDateTextField + cvcACUITextField = controller!.cvcTextField + + reactNativeViewLocatorMock = ReactNativeViewLocatorMock( + panView: panACUITextField!, + expiryDateView: expiryDateACUITextField!, + cvcView: cvcACUITextField!) + + accessCheckoutReactNative = AccessCheckoutReactNative(reactNativeViewLocatorMock!) + } func testShouldSupportGeneratingACardSession() { let stubServices = StubServices(baseUrl: "http://localhost") @@ -18,14 +45,18 @@ class AccessCheckoutReactNativeSessionAcceptanceTests: XCTestCase { let dictionary: NSDictionary = [ "baseUrl": stubServices.baseUrl, "merchantId": "identity", - "panValue": "4444333322221111", - "expiryDateValue": "12/30", - "cvcValue": "123", + "panId": "pan", + "expiryDateId": "expiryDate", + "cvcId": "cvc", "sessionTypes": ["card"], "reactNativeSdkVersion": "1.2.3" ] - accessCheckoutReactNative.generateSessions(config: dictionary) { sessions in + panACUITextField!.text = "4444333322221111" + expiryDateACUITextField!.text = "12/34" + cvcACUITextField!.text = "123" + + accessCheckoutReactNative!.generateSessions(config: dictionary) { sessions in let session = (sessions as! [String: String?])["card"] XCTAssertEqual("my-session", session) expectationToFulfill.fulfill() @@ -47,12 +78,12 @@ class AccessCheckoutReactNativeSessionAcceptanceTests: XCTestCase { let dictionary: NSDictionary = [ "baseUrl": stubServices.baseUrl, "merchantId": "identity", - "cvcValue": "123", + "cvcId": "cvc", "sessionTypes": ["cvc"], "reactNativeSdkVersion": "1.2.3" ] - accessCheckoutReactNative.generateSessions(config: dictionary) { sessions in + accessCheckoutReactNative!.generateSessions(config: dictionary) { sessions in let cvcSession = (sessions as! [String: String?])["cvc"] XCTAssertEqual("my-cvc-session", cvcSession) expectationToFulfill.fulfill() @@ -75,21 +106,25 @@ class AccessCheckoutReactNativeSessionAcceptanceTests: XCTestCase { let dictionary: NSDictionary = [ "baseUrl": stubServices.baseUrl, "merchantId": "identity", - "panValue": "4444333322221111", - "expiryDateValue": "12/30", - "cvcValue": "123", + "cvcId": "cvc", + "panId": "pan", + "expiryDateId": "expiryDate", "sessionTypes": ["card", "cvc"], "reactNativeSdkVersion": "1.2.3" ] - accessCheckoutReactNative.generateSessions(config: dictionary) { sessions in + panACUITextField!.text = "4444333322221111" + expiryDateACUITextField!.text = "12/34" + cvcACUITextField!.text = "123" + + accessCheckoutReactNative!.generateSessions(config: dictionary) { sessions in let session = (sessions as! [String: String?])["card"] let cvcSession = (sessions as! [String: String?])["cvc"] XCTAssertEqual("my-session", session) XCTAssertEqual("my-cvc-session", cvcSession) expectationToFulfill.fulfill() - } reject: { _, _, _ in - XCTFail("got an unexpected error back from stubs") + } reject: { _, message, _ in + XCTFail("got an unexpected error back from stubs: " + message!) expectationToFulfill.fulfill() } @@ -106,12 +141,12 @@ class AccessCheckoutReactNativeSessionAcceptanceTests: XCTestCase { let dictionary: NSDictionary = [ "baseUrl": stubServices.baseUrl, "merchantId": "identity", - "cvcValue": "123", + "cvcId": "cvc", "sessionTypes": ["cvc"], - "reactNativeSdkVersion": "1.2.3", + "reactNativeSdkVersion": "1.2.3" ] - accessCheckoutReactNative.generateSessions(config: dictionary) { _ in + accessCheckoutReactNative!.generateSessions(config: dictionary) { _ in XCTAssertEqual("access-checkout-react-native/1.2.3", WpSdkHeader.value) expectationToFulfill.fulfill() @@ -136,15 +171,19 @@ class AccessCheckoutReactNativeSessionAcceptanceTests: XCTestCase { let dictionary: NSDictionary = [ "baseUrl": stubServices.baseUrl, "merchantId": "identity", - "panValue": "4444333322221111", - "expiryDateValue": "12/30", - "cvcValue": "123", + "panId": "pan", + "expiryDateId": "expiryDate", + "cvcId": "cvc", "sessionTypes": ["card"], "reactNativeSdkVersion": "1.2.3" ] - accessCheckoutReactNative.generateSessions(config: dictionary) { _ in - XCTFail("generating sessions should have faild but it didn't") + panACUITextField!.text = "4444333322221111" + expiryDateACUITextField!.text = "12/34" + cvcACUITextField!.text = "123" + + accessCheckoutReactNative!.generateSessions(config: dictionary) { _ in + XCTFail("generating sessions should have failed but it didn't") expectationToFulfill.fulfill() } reject: { _, _, error in let expectedError = AccessCheckoutError.unexpectedApiError( @@ -160,8 +199,8 @@ class AccessCheckoutReactNativeSessionAcceptanceTests: XCTestCase { let expectationToFulfill = expectation(description: "Error should be returned") let invalidConfig: NSDictionary = [:] - accessCheckoutReactNative.generateSessions(config: invalidConfig) { _ in - XCTFail("generating sessions should have faild but it didn't") + accessCheckoutReactNative!.generateSessions(config: invalidConfig) { _ in + XCTFail("generating sessions should have failed but it didn't") expectationToFulfill.fulfill() } reject: { _, _, error in let expectedError = AccessCheckoutRnIllegalArgumentError.missingBaseUrl() @@ -177,11 +216,11 @@ class AccessCheckoutReactNativeSessionAcceptanceTests: XCTestCase { let invalidConfig: NSDictionary = [ "baseUrl": stubServices.baseUrl, "merchantId": "identity", - "sessionTypes": ["cvc"], + "sessionTypes": ["cvc"] ] - accessCheckoutReactNative.generateSessions(config: invalidConfig) { _ in - XCTFail("generating sessions should have faild but it didn't") + accessCheckoutReactNative!.generateSessions(config: invalidConfig) { _ in + XCTFail("generating sessions should have failed but it didn't") expectationToFulfill.fulfill() } reject: { _, _, error in let expectedError = AccessCheckoutRnIllegalArgumentError.missingCvc() diff --git a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/AccessCheckoutRnIllegalArgumentErrorUnitTests.swift b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/AccessCheckoutRnIllegalArgumentErrorUnitTests.swift index 85b376d..fd1e489 100644 --- a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/AccessCheckoutRnIllegalArgumentErrorUnitTests.swift +++ b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/AccessCheckoutRnIllegalArgumentErrorUnitTests.swift @@ -3,7 +3,6 @@ import XCTest @testable import AccessCheckoutReactNative class AccessCheckoutRnIllegalArgumentErrorUnitTests: XCTestCase { - func testLocalizedDescriptionShouldReturnMessage() { let error = AccessCheckoutRnIllegalArgumentError.missingBaseUrl() diff --git a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/CardValidationTestUIViewController.swift b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/CardValidationTestUIViewController.swift index 4446157..1281b0b 100644 --- a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/CardValidationTestUIViewController.swift +++ b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/CardValidationTestUIViewController.swift @@ -1,7 +1,8 @@ +import AccessCheckoutSDK import UIKit class CardValidationTestUIViewController: UIViewController { - @IBOutlet weak var panTextField: UITextField! - @IBOutlet weak var expiryDateTextField: UITextField! - @IBOutlet weak var cvcTextField: UITextField! + @IBOutlet var panTextField: AccessCheckoutUITextField! + @IBOutlet var expiryDateTextField: AccessCheckoutUITextField! + @IBOutlet var cvcTextField: AccessCheckoutUITextField! } diff --git a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/CvcOnlyValidationTestUIViewController.swift b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/CvcOnlyValidationTestUIViewController.swift index 2a36c02..8618a92 100644 --- a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/CvcOnlyValidationTestUIViewController.swift +++ b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/CvcOnlyValidationTestUIViewController.swift @@ -1,5 +1,6 @@ +import AccessCheckoutSDK import UIKit class CvcOnlyValidationTestUIViewController: UIViewController { - @IBOutlet weak var cvcTextField: UITextField! + @IBOutlet var cvcTextField: AccessCheckoutUITextField! } diff --git a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/SessionGenerationTestUIViewController.swift b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/SessionGenerationTestUIViewController.swift new file mode 100644 index 0000000..5fbc1fa --- /dev/null +++ b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/SessionGenerationTestUIViewController.swift @@ -0,0 +1,8 @@ +import AccessCheckoutSDK +import UIKit + +class SessionGenerationTestUIViewController: UIViewController { + @IBOutlet var panTextField: AccessCheckoutUITextField! + @IBOutlet var expiryDateTextField: AccessCheckoutUITextField! + @IBOutlet var cvcTextField: AccessCheckoutUITextField! +} diff --git a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/session/GenerateSessionConfigUnitTests.swift b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/session/GenerateSessionConfigUnitTests.swift index 7c4a6df..37ca748 100644 --- a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/session/GenerateSessionConfigUnitTests.swift +++ b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/session/GenerateSessionConfigUnitTests.swift @@ -74,11 +74,11 @@ class GenerateSessionUnitTests: XCTestCase { } } - // MARK: Testing errors related to Pan Value + // MARK: Testing errors related to Pan Id - func testThatErrorIsRaisedWhenSessionTypesContainsCardAndPanValueIsAbsent() { + func testThatErrorIsRaisedWhenSessionTypesContainsCardAndpanIdIsAbsent() { let dictionary = validCardConfiguration() - dictionary.removeObject(forKey: "panValue") + dictionary.removeObject(forKey: "panId") let expectedError = AccessCheckoutRnIllegalArgumentError.missingPan() @@ -87,9 +87,9 @@ class GenerateSessionUnitTests: XCTestCase { } } - func testThatErrorIsRaisedWhenSessionTypesContainsCardAndPanValueIsAnEmptyString() { + func testThatErrorIsRaisedWhenSessionTypesContainsCardAndpanIdIsAnEmptyString() { let dictionary = validCardConfiguration() - dictionary.setValue("", forKey: "panValue") + dictionary.setValue("", forKey: "panId") let expectedError = AccessCheckoutRnIllegalArgumentError.missingPan() @@ -98,9 +98,9 @@ class GenerateSessionUnitTests: XCTestCase { } } - func testThatErrorIsRaisedWhenSessionTypesContainsCardAndPanValueIsNotAString() { + func testThatErrorIsRaisedWhenSessionTypesContainsCardAndpanIdIsNotAString() { let dictionary = validCardConfiguration() - dictionary.setValue(1, forKey: "panValue") + dictionary.setValue(1, forKey: "panId") let expectedError = AccessCheckoutRnIllegalArgumentError.missingPan() @@ -109,11 +109,11 @@ class GenerateSessionUnitTests: XCTestCase { } } - // MARK: Testing errors related to Expiry Value + // MARK: Testing errors related to Expiry Date Id - func testThatErrorIsRaisedWhenSessionTypesContainsCardAndExpiryDateValueIsAbsent() { + func testThatErrorIsRaisedWhenSessionTypesContainsCardAndexpiryDateIdIsAbsent() { let dictionary = validCardConfiguration() - dictionary.removeObject(forKey: "expiryDateValue") + dictionary.removeObject(forKey: "expiryDateId") let expectedError = AccessCheckoutRnIllegalArgumentError.missingExpiryDate() @@ -122,9 +122,9 @@ class GenerateSessionUnitTests: XCTestCase { } } - func testThatErrorIsRaisedWhenSessionTypesContainsCardAndExpiryDateValueIsAnEmptyString() { + func testThatErrorIsRaisedWhenSessionTypesContainsCardAndexpiryDateIdIsAnEmptyString() { let dictionary = validCardConfiguration() - dictionary.setValue("", forKey: "expiryDateValue") + dictionary.setValue("", forKey: "expiryDateId") let expectedError = AccessCheckoutRnIllegalArgumentError.missingExpiryDate() @@ -133,9 +133,9 @@ class GenerateSessionUnitTests: XCTestCase { } } - func testThatErrorIsRaisedWhenSessionTypesContainsCardAndExpiryDateValueIsNotAString() { + func testThatErrorIsRaisedWhenSessionTypesContainsCardAndexpiryDateIdIsNotAString() { let dictionary = validCardConfiguration() - dictionary.setValue(1, forKey: "expiryDateValue") + dictionary.setValue(1, forKey: "expiryDateId") let expectedError = AccessCheckoutRnIllegalArgumentError.missingExpiryDate() @@ -144,11 +144,11 @@ class GenerateSessionUnitTests: XCTestCase { } } - // MARK: Testing errors related to Cvc Value + // MARK: Testing errors related to Cvc Id - func testThatErrorIsRaisedWhenSessionTypesContainsCardAndCvcValueIsAbsent() { + func testThatErrorIsRaisedWhenSessionTypesContainsCardAndcvcIdIsAbsent() { let dictionary = validCardConfiguration() - dictionary.removeObject(forKey: "cvcValue") + dictionary.removeObject(forKey: "cvcId") let expectedError = AccessCheckoutRnIllegalArgumentError.missingCvc() @@ -157,9 +157,9 @@ class GenerateSessionUnitTests: XCTestCase { } } - func testThatErrorIsRaisedWhenSessionTypesContainsCardAndCvcValueIsAnEmptyString() { + func testThatErrorIsRaisedWhenSessionTypesContainsCardAndcvcIdIsAnEmptyString() { let dictionary = validCardConfiguration() - dictionary.setValue("", forKey: "cvcValue") + dictionary.setValue("", forKey: "cvcId") let expectedError = AccessCheckoutRnIllegalArgumentError.missingCvc() @@ -168,9 +168,9 @@ class GenerateSessionUnitTests: XCTestCase { } } - func testThatErrorIsRaisedWhenSessionTypesContainsCardAndCvcValueIsNotAString() { + func testThatErrorIsRaisedWhenSessionTypesContainsCardAndcvcIdIsNotAString() { let dictionary = validCardConfiguration() - dictionary.setValue(1, forKey: "cvcValue") + dictionary.setValue(1, forKey: "cvcId") let expectedError = AccessCheckoutRnIllegalArgumentError.missingCvc() @@ -179,9 +179,9 @@ class GenerateSessionUnitTests: XCTestCase { } } - func testThatErrorIsRaisedWhenSessionTypesIsOnlyCvcAndCvcValueIsAbsent() { + func testThatErrorIsRaisedWhenSessionTypesIsOnlyCvcAndcvcIdIsAbsent() { let dictionary = validCvcOnlyConfiguration() - dictionary.removeObject(forKey: "cvcValue") + dictionary.removeObject(forKey: "cvcId") let expectedError = AccessCheckoutRnIllegalArgumentError.missingCvc() @@ -190,9 +190,9 @@ class GenerateSessionUnitTests: XCTestCase { } } - func testThatErrorIsRaisedWhenSessionTypesIsOnlyCvcAndCvcValueIsAnEmptyString() { + func testThatErrorIsRaisedWhenSessionTypesIsOnlyCvcAndcvcIdIsAnEmptyString() { let dictionary = validCvcOnlyConfiguration() - dictionary.setValue("", forKey: "cvcValue") + dictionary.setValue("", forKey: "cvcId") let expectedError = AccessCheckoutRnIllegalArgumentError.missingCvc() @@ -201,9 +201,9 @@ class GenerateSessionUnitTests: XCTestCase { } } - func testThatErrorIsRaisedWhenSessionTypesOnlyCvcAndCvcValueIsNotAString() { + func testThatErrorIsRaisedWhenSessionTypesOnlyCvcAndcvcIdIsNotAString() { let dictionary = validCvcOnlyConfiguration() - dictionary.setValue(1, forKey: "cvcValue") + dictionary.setValue(1, forKey: "cvcId") let expectedError = AccessCheckoutRnIllegalArgumentError.missingCvc() @@ -314,9 +314,9 @@ class GenerateSessionUnitTests: XCTestCase { XCTAssertEqual(config.baseUrl, "some-url") XCTAssertEqual(config.merchantId, "some-merchant-id") - XCTAssertEqual(config.panValue, "some-pan") - XCTAssertEqual(config.expiryDateValue, "some-expiry-date") - XCTAssertEqual(config.cvcValue, "some-cvc") + XCTAssertEqual(config.panId, "some-pan-id") + XCTAssertEqual(config.expiryDateId, "some-expiry-date-id") + XCTAssertEqual(config.cvcId, "some-cvc-id") XCTAssertEqual(config.sessionTypes, [SessionType.card]) XCTAssertEqual(config.reactNativeSdkVersion, "some-version") } @@ -328,7 +328,7 @@ class GenerateSessionUnitTests: XCTestCase { XCTAssertEqual(config.baseUrl, "some-url") XCTAssertEqual(config.merchantId, "some-merchant-id") - XCTAssertEqual(config.cvcValue, "some-cvc") + XCTAssertEqual(config.cvcId, "some-cvc-id") XCTAssertEqual(config.sessionTypes, [SessionType.cvc]) XCTAssertEqual(config.reactNativeSdkVersion, "some-version") } @@ -341,9 +341,9 @@ class GenerateSessionUnitTests: XCTestCase { XCTAssertEqual(config.baseUrl, "some-url") XCTAssertEqual(config.merchantId, "some-merchant-id") - XCTAssertEqual(config.panValue, "some-pan") - XCTAssertEqual(config.expiryDateValue, "some-expiry-date") - XCTAssertEqual(config.cvcValue, "some-cvc") + XCTAssertEqual(config.panId, "some-pan-id") + XCTAssertEqual(config.expiryDateId, "some-expiry-date-id") + XCTAssertEqual(config.cvcId, "some-cvc-id") XCTAssertEqual(config.sessionTypes, [SessionType.card, SessionType.cvc]) XCTAssertEqual(config.reactNativeSdkVersion, "some-version") } @@ -356,9 +356,9 @@ class GenerateSessionUnitTests: XCTestCase { XCTAssertEqual(config.baseUrl, "some-url") XCTAssertEqual(config.merchantId, "some-merchant-id") - XCTAssertEqual(config.panValue, "some-pan") - XCTAssertEqual(config.expiryDateValue, "some-expiry-date") - XCTAssertEqual(config.cvcValue, "some-cvc") + XCTAssertEqual(config.panId, "some-pan-id") + XCTAssertEqual(config.expiryDateId, "some-expiry-date-id") + XCTAssertEqual(config.cvcId, "some-cvc-id") XCTAssertEqual(config.sessionTypes, [SessionType.card, SessionType.cvc]) XCTAssertEqual(config.reactNativeSdkVersion, "some-version") } @@ -367,9 +367,9 @@ class GenerateSessionUnitTests: XCTestCase { let dictionary: NSMutableDictionary = [ "baseUrl": "some-url", "merchantId": "some-merchant-id", - "panValue": "some-pan", - "expiryDateValue": "some-expiry-date", - "cvcValue": "some-cvc", + "panId": "some-pan-id", + "expiryDateId": "some-expiry-date-id", + "cvcId": "some-cvc-id", "sessionTypes": ["card"], "reactNativeSdkVersion": "some-version" ] @@ -380,7 +380,7 @@ class GenerateSessionUnitTests: XCTestCase { let dictionary: NSMutableDictionary = [ "baseUrl": "some-url", "merchantId": "some-merchant-id", - "cvcValue": "some-cvc", + "cvcId": "some-cvc-id", "sessionTypes": ["cvc"], "reactNativeSdkVersion": "some-version" ] diff --git a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/utils/AccessCheckoutReactNativeTestImplementation.swift b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/utils/AccessCheckoutReactNativeTestImplementation.swift new file mode 100644 index 0000000..eaa64e5 --- /dev/null +++ b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/utils/AccessCheckoutReactNativeTestImplementation.swift @@ -0,0 +1,20 @@ +import AccessCheckoutSDK +import React +import XCTest + +@testable import AccessCheckoutReactNative +@testable import AccessCheckoutReactNativeUnitTestsApp + +public class AccessCheckoutReactNativeTestImplementation: AccessCheckoutReactNative { + private(set) var eventsSent: [RCTEventMock] = [] + + override public func sendEvent(withName name: String!, body: Any!) { + let eventMock = RCTEventMock(name, bodyDictionary: body as! NSDictionary) + eventsSent.append(eventMock) + } + + // This is required to get the "testShouldRaiseEventWhenAllFieldsBecomeValid" test pass otherwise it fails with an error we have not been able to resolve + override public func supportedEvents() -> [String]! { + return ["some-event-type"] + } +} diff --git a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/validation/CvcOnlyValidationDelegateRNUnitTests.swift b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/validation/CvcOnlyValidationDelegateRNUnitTests.swift index ec18f18..1c78ac3 100644 --- a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/validation/CvcOnlyValidationDelegateRNUnitTests.swift +++ b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/validation/CvcOnlyValidationDelegateRNUnitTests.swift @@ -4,7 +4,7 @@ import XCTest class CvcOnlyValidationDelegateRNUnitTests: XCTestCase { private let eventEmitter = RCTEventEmitterMock() - + func testShouldEmitEventWhenCvcIsValid() { let delegate = CvcOnlyValidationDelegateRN( eventEmitter: eventEmitter, eventName: "event-name") diff --git a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/validation/RCTEventMock.swift b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/validation/RCTEventMock.swift index 464735b..89fb011 100644 --- a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/validation/RCTEventMock.swift +++ b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/validation/RCTEventMock.swift @@ -29,10 +29,10 @@ struct RCTEventMock { var images: [Image]? init(_ dictionary: NSDictionary) { - name = dictionary["name"] as? String + self.name = dictionary["name"] as? String if let imagesDictionary = dictionary["images"] as? [NSDictionary] { - images = [] + self.images = [] for imageDictionary in imagesDictionary { images!.append(Image(imageDictionary)) } diff --git a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/validation/ReactNativeViewLocatorMock.swift b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/validation/ReactNativeViewLocatorMock.swift index 9e7eee2..7fc80b9 100644 --- a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/validation/ReactNativeViewLocatorMock.swift +++ b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/validation/ReactNativeViewLocatorMock.swift @@ -1,3 +1,4 @@ +import AccessCheckoutSDK import Foundation import React import UIKit @@ -5,33 +6,33 @@ import UIKit @testable import AccessCheckoutReactNative class ReactNativeViewLocatorMock: ReactNativeViewLocator { - var panUITextField: UITextField? - var expiryDateUITextField: UITextField? - var cvcUITextField: UITextField? + var panView: AccessCheckoutUITextField? + var expiryDateView: AccessCheckoutUITextField? + var cvcView: AccessCheckoutUITextField? init( - panUITextField: UITextField, expiryDateUITextField: UITextField, cvcUITextField: UITextField + panView: AccessCheckoutUITextField, + expiryDateView: AccessCheckoutUITextField, + cvcView: AccessCheckoutUITextField ) { - self.panUITextField = panUITextField - self.expiryDateUITextField = expiryDateUITextField - self.cvcUITextField = cvcUITextField + self.panView = panView + self.expiryDateView = expiryDateView + self.cvcView = cvcView } - init(cvcUITextField: UITextField) { - self.cvcUITextField = cvcUITextField - } - - override init() { - + init(cvcView: AccessCheckoutUITextField) { + self.cvcView = cvcView } - override internal func locateUITextField(id: String) -> UITextField? { + override init() {} + + override internal func locateUITextField(id: String) -> AccessCheckoutUITextField? { if id.contains("pan") { - return panUITextField + return self.panView } else if id.contains("expiryDate") { - return expiryDateUITextField + return self.expiryDateView } else if id.contains("cvc") { - return cvcUITextField + return self.cvcView } return nil diff --git a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/validation/ReactNativeViewLocatorUnitTests.swift b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/validation/ReactNativeViewLocatorUnitTests.swift index aea9b00..1056257 100644 --- a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/validation/ReactNativeViewLocatorUnitTests.swift +++ b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTests/validation/ReactNativeViewLocatorUnitTests.swift @@ -1,52 +1,48 @@ +@testable import AccessCheckoutReactNative +import AccessCheckoutSDK import React import XCTest -@testable import AccessCheckoutReactNative - class ReactNativeViewLocatorUnitTests: XCTestCase { private let viewLocator = ReactNativeViewLocator() private let controller = UIViewController() - + func testReturnsUITextFieldWhichIsAnImmediateChild() { - let uiTextFieldToBeFound = RCTUITextField() + let uiTextFieldToBeFound = createAccessCheckoutUITextField(nativeID: "some-id") let view = UIView() view.addSubview(UIView()) - view.addSubview(UITextFieldStub(uiTextFieldToBeFound, nativeID: "some-id")) + view.addSubview(uiTextFieldToBeFound) controller.view = view RCTUtilsUIOverride.setPresentedViewController(controller) - - let locatedView = viewLocator.locateUIView(view: RCTPresentedViewController(), id: "some-id") - - let result = locateUITextFieldFromView(uiView: locatedView) + + let result = viewLocator.locateUIView(view: RCTPresentedViewController(), id: "some-id") XCTAssertEqual(result, uiTextFieldToBeFound) } - + func testReturnsUITextFieldWhichIsAChildOfAChild() { - let uiTextFieldToBeFound = RCTUITextField() + let uiTextFieldToBeFound = createAccessCheckoutUITextField(nativeID: "some-id") let view = UIView() view.addSubview(UIView()) view.addSubview(UIView()) view.subviews[1].addSubview(UIView()) - view.subviews[1].addSubview(UITextFieldStub(uiTextFieldToBeFound, nativeID: "some-id")) + view.subviews[1].addSubview(uiTextFieldToBeFound) controller.view = view RCTUtilsUIOverride.setPresentedViewController(controller) - let locatedView = viewLocator.locateUIView(view: RCTPresentedViewController(), id: "some-id") - - let result = locateUITextFieldFromView(uiView: locatedView) + let result = viewLocator.locateUIView(view: RCTPresentedViewController(), id: "some-id") XCTAssertEqual(result, uiTextFieldToBeFound) } - + func testReturnsNilIfControllerIsNil() { let viewLocator = ReactNativeViewLocator() - + let result = viewLocator.locateUITextField(id: "some-id") XCTAssertNil(result) } - + func testReturnsNilIfControllerHasNoUIComponents() { let viewLocator = ReactNativeViewLocator() let controller = UIViewController() @@ -57,7 +53,7 @@ class ReactNativeViewLocatorUnitTests: XCTestCase { XCTAssertNil(result) } - + func testReturnsNilIfTextFieldWithNativeIDNotFound() { let view = UIView() view.addSubview(UIView()) @@ -71,35 +67,10 @@ class ReactNativeViewLocatorUnitTests: XCTestCase { XCTAssertNil(result) } - - private func locateUITextFieldFromView(uiView: UIView?) -> UITextField? { - return (uiView as? RCTSinglelineTextInputView)?.backedTextInputView as? UITextField - } - - private class UITextFieldStub: RCTSinglelineTextInputView { - private let uiTextField: UIView & RCTBackedTextInputViewProtocol - - override var backedTextInputView: UIView & RCTBackedTextInputViewProtocol { - get { - return uiTextField - } - } - - init(_ uiTextField: RCTUITextField, nativeID:String) { - self.uiTextField = uiTextField - - let rctBridge = RCTBridge( - delegate: RCTBridgeDelegateStub(), - launchOptions: [NSHashTable(): ""] - ) - super.init(bridge: rctBridge!) - super.nativeID = nativeID - } - - private class RCTBridgeDelegateStub: NSObject, RCTBridgeDelegate { - func sourceURL(for bridge: RCTBridge!) -> URL! { - return URL(string: "") - } - } + + private func createAccessCheckoutUITextField(nativeID: String) -> UIView { + let textField = AccessCheckoutUITextField() + textField.nativeID = nativeID + return textField } } diff --git a/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTestsApp/SessionGenerationTest.storyboard b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTestsApp/SessionGenerationTest.storyboard new file mode 100644 index 0000000..6e733de --- /dev/null +++ b/access-checkout-react-native-sdk/ios/AccessCheckoutReactNativeUnitTestsApp/SessionGenerationTest.storyboard @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/access-checkout-react-native-sdk/ios/Podfile.lock b/access-checkout-react-native-sdk/ios/Podfile.lock index 1025aa6..2b06cc8 100644 --- a/access-checkout-react-native-sdk/ios/Podfile.lock +++ b/access-checkout-react-native-sdk/ios/Podfile.lock @@ -489,4 +489,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: c76ad913e2cb96a2ba8e3f47954f69a45f05a82c -COCOAPODS: 1.13.0 +COCOAPODS: 1.14.3 diff --git a/access-checkout-react-native-sdk/ios/bitrise.yml b/access-checkout-react-native-sdk/ios/bitrise.yml index a1e5208..389c565 100644 --- a/access-checkout-react-native-sdk/ios/bitrise.yml +++ b/access-checkout-react-native-sdk/ios/bitrise.yml @@ -17,7 +17,7 @@ workflows: - recreate-user-schemes@1: inputs: - project_path: "$BITRISE_SOURCE_DIR/access-checkout-react-native-sdk/ios/AccessCheckoutReactNative.xcodeproj" - - xcode-test@4: + - xcode-test@5: inputs: - scheme: AccessCheckoutReactNative - destination: "platform=iOS Simulator,name=iPhone 12 Pro,OS=latest" diff --git a/access-checkout-react-native-sdk/lib/commonjs/AccessCheckout.js b/access-checkout-react-native-sdk/lib/commonjs/AccessCheckout.js index 695d5cf..975e467 100644 --- a/access-checkout-react-native-sdk/lib/commonjs/AccessCheckout.js +++ b/access-checkout-react-native-sdk/lib/commonjs/AccessCheckout.js @@ -27,14 +27,14 @@ class AccessCheckout { this.baseUrl = baseUrl; this.merchantId = merchantId; } - generateSessions(cardDetails, sessionTypes) { + generateSessions(sessionGenerationConfig, sessionTypes) { return new Promise((resolve, reject) => { _AccessCheckoutReactNative.AccessCheckoutReactNative.generateSessions({ baseUrl: this.baseUrl, merchantId: this.merchantId, - panValue: cardDetails.pan, - expiryDateValue: cardDetails.expiryDate, - cvcValue: cardDetails.cvc, + panId: sessionGenerationConfig.panId, + expiryDateId: sessionGenerationConfig.expiryDateId, + cvcId: sessionGenerationConfig.cvcId, sessionTypes, reactNativeSdkVersion: this.ReactNativeSdkVersion }) diff --git a/access-checkout-react-native-sdk/lib/commonjs/AccessCheckout.js.map b/access-checkout-react-native-sdk/lib/commonjs/AccessCheckout.js.map index 97bce05..37f1435 100644 --- a/access-checkout-react-native-sdk/lib/commonjs/AccessCheckout.js.map +++ b/access-checkout-react-native-sdk/lib/commonjs/AccessCheckout.js.map @@ -1 +1 @@ -{"version":3,"names":["_AccessCheckoutReactNative","require","_defineProperty","obj","key","value","_toPropertyKey","Object","defineProperty","enumerable","configurable","writable","arg","_toPrimitive","String","input","hint","prim","Symbol","toPrimitive","undefined","res","call","TypeError","Number","AccessCheckout","constructor","baseUrl","merchantId","generateSessions","cardDetails","sessionTypes","Promise","resolve","reject","AccessCheckoutReactNative","panValue","pan","expiryDateValue","expiryDate","cvcValue","cvc","reactNativeSdkVersion","ReactNativeSdkVersion","then","bridgeSessions","sessions","card","catch","error","initialiseCardValidation","validationConfig","panId","expiryDateId","cvcId","enablePanFormatting","acceptedCardBrands","initialiseCvcOnlyValidation","exports","default"],"sources":["AccessCheckout.tsx"],"sourcesContent":["import { AccessCheckoutReactNative } from './AccessCheckoutReactNative';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport CardDetails from './session/CardDetails';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport Sessions from './session/Sessions';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport CardValidationConfig from './validation/CardValidationConfig';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport CvcOnlyValidationConfig from './validation/CvcOnlyValidationConfig';\n\nexport default class AccessCheckout {\n private readonly ReactNativeSdkVersion = '2.0.0';\n static readonly CardValidationEventType = 'AccessCheckoutCardValidationEvent';\n static readonly CvcOnlyValidationEventType =\n 'AccessCheckoutCvcOnlyValidationEvent';\n\n baseUrl: string;\n merchantId?: string;\n\n constructor({\n baseUrl,\n merchantId,\n }: {\n baseUrl: string;\n merchantId?: string;\n }) {\n this.baseUrl = baseUrl;\n this.merchantId = merchantId;\n }\n\n generateSessions(\n cardDetails: CardDetails,\n sessionTypes: string[]\n ): Promise {\n return new Promise((resolve, reject) => {\n AccessCheckoutReactNative.generateSessions({\n baseUrl: this.baseUrl,\n merchantId: this.merchantId,\n panValue: cardDetails.pan,\n expiryDateValue: cardDetails.expiryDate,\n cvcValue: cardDetails.cvc,\n sessionTypes,\n reactNativeSdkVersion: this.ReactNativeSdkVersion,\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, prettier/prettier\n .then((bridgeSessions: any) => {\n const sessions: Sessions = {};\n if (bridgeSessions.card) {\n sessions.card = bridgeSessions.card;\n }\n if (bridgeSessions.cvc) {\n sessions.cvc = bridgeSessions.cvc;\n }\n\n resolve(sessions);\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .catch((error: any) => {\n reject(error);\n });\n });\n }\n\n initialiseCardValidation(\n validationConfig: CardValidationConfig\n ): Promise {\n return new Promise((resolve, reject) => {\n AccessCheckoutReactNative.initialiseCardValidation({\n baseUrl: this.baseUrl,\n panId: validationConfig.panId,\n expiryDateId: validationConfig.expiryDateId,\n cvcId: validationConfig.cvcId,\n enablePanFormatting: validationConfig.enablePanFormatting,\n acceptedCardBrands: validationConfig.acceptedCardBrands,\n })\n .then(() => {\n resolve(true);\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .catch((error: any) => {\n reject(error);\n });\n });\n }\n\n initialiseCvcOnlyValidation(\n validationConfig: CvcOnlyValidationConfig\n ): Promise {\n return new Promise((resolve, reject) => {\n AccessCheckoutReactNative.initialiseCvcOnlyValidation({\n cvcId: validationConfig.cvcId,\n })\n .then(() => {\n resolve(true);\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .catch((error: any) => {\n reject(error);\n });\n });\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,0BAAA,GAAAC,OAAA;AAAwE,SAAAC,gBAAAC,GAAA,EAAAC,GAAA,EAAAC,KAAA,IAAAD,GAAA,GAAAE,cAAA,CAAAF,GAAA,OAAAA,GAAA,IAAAD,GAAA,IAAAI,MAAA,CAAAC,cAAA,CAAAL,GAAA,EAAAC,GAAA,IAAAC,KAAA,EAAAA,KAAA,EAAAI,UAAA,QAAAC,YAAA,QAAAC,QAAA,oBAAAR,GAAA,CAAAC,GAAA,IAAAC,KAAA,WAAAF,GAAA;AAAA,SAAAG,eAAAM,GAAA,QAAAR,GAAA,GAAAS,YAAA,CAAAD,GAAA,2BAAAR,GAAA,gBAAAA,GAAA,GAAAU,MAAA,CAAAV,GAAA;AAAA,SAAAS,aAAAE,KAAA,EAAAC,IAAA,eAAAD,KAAA,iBAAAA,KAAA,kBAAAA,KAAA,MAAAE,IAAA,GAAAF,KAAA,CAAAG,MAAA,CAAAC,WAAA,OAAAF,IAAA,KAAAG,SAAA,QAAAC,GAAA,GAAAJ,IAAA,CAAAK,IAAA,CAAAP,KAAA,EAAAC,IAAA,2BAAAK,GAAA,sBAAAA,GAAA,YAAAE,SAAA,4DAAAP,IAAA,gBAAAF,MAAA,GAAAU,MAAA,EAAAT,KAAA;AACxE;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAGe,MAAMU,cAAc,CAAC;EASlCC,WAAWA,CAAC;IACVC,OAAO;IACPC;EAIF,CAAC,EAAE;IAAA1B,eAAA,gCAdsC,OAAO;IAAAA,eAAA;IAAAA,eAAA;IAe9C,IAAI,CAACyB,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACC,UAAU,GAAGA,UAAU;EAC9B;EAEAC,gBAAgBA,CACdC,WAAwB,EACxBC,YAAsB,EACH;IACnB,OAAO,IAAIC,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;MACtCC,oDAAyB,CAACN,gBAAgB,CAAC;QACzCF,OAAO,EAAE,IAAI,CAACA,OAAO;QACrBC,UAAU,EAAE,IAAI,CAACA,UAAU;QAC3BQ,QAAQ,EAAEN,WAAW,CAACO,GAAG;QACzBC,eAAe,EAAER,WAAW,CAACS,UAAU;QACvCC,QAAQ,EAAEV,WAAW,CAACW,GAAG;QACzBV,YAAY;QACZW,qBAAqB,EAAE,IAAI,CAACC;MAC9B,CAAC;MACC;MAAA,CACCC,IAAI,CAAEC,cAAmB,IAAK;QAC7B,MAAMC,QAAkB,GAAG,CAAC,CAAC;QAC7B,IAAID,cAAc,CAACE,IAAI,EAAE;UACvBD,QAAQ,CAACC,IAAI,GAAGF,cAAc,CAACE,IAAI;QACrC;QACA,IAAIF,cAAc,CAACJ,GAAG,EAAE;UACtBK,QAAQ,CAACL,GAAG,GAAGI,cAAc,CAACJ,GAAG;QACnC;QAEAR,OAAO,CAACa,QAAQ,CAAC;MACnB,CAAC;MACD;MAAA,CACCE,KAAK,CAAEC,KAAU,IAAK;QACrBf,MAAM,CAACe,KAAK,CAAC;MACf,CAAC,CAAC;IACN,CAAC,CAAC;EACJ;EAEAC,wBAAwBA,CACtBC,gBAAsC,EACpB;IAClB,OAAO,IAAInB,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;MACtCC,oDAAyB,CAACe,wBAAwB,CAAC;QACjDvB,OAAO,EAAE,IAAI,CAACA,OAAO;QACrByB,KAAK,EAAED,gBAAgB,CAACC,KAAK;QAC7BC,YAAY,EAAEF,gBAAgB,CAACE,YAAY;QAC3CC,KAAK,EAAEH,gBAAgB,CAACG,KAAK;QAC7BC,mBAAmB,EAAEJ,gBAAgB,CAACI,mBAAmB;QACzDC,kBAAkB,EAAEL,gBAAgB,CAACK;MACvC,CAAC,CAAC,CACCZ,IAAI,CAAC,MAAM;QACVX,OAAO,CAAC,IAAI,CAAC;MACf,CAAC;MACD;MAAA,CACCe,KAAK,CAAEC,KAAU,IAAK;QACrBf,MAAM,CAACe,KAAK,CAAC;MACf,CAAC,CAAC;IACN,CAAC,CAAC;EACJ;EAEAQ,2BAA2BA,CACzBN,gBAAyC,EACvB;IAClB,OAAO,IAAInB,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;MACtCC,oDAAyB,CAACsB,2BAA2B,CAAC;QACpDH,KAAK,EAAEH,gBAAgB,CAACG;MAC1B,CAAC,CAAC,CACCV,IAAI,CAAC,MAAM;QACVX,OAAO,CAAC,IAAI,CAAC;MACf,CAAC;MACD;MAAA,CACCe,KAAK,CAAEC,KAAU,IAAK;QACrBf,MAAM,CAACe,KAAK,CAAC;MACf,CAAC,CAAC;IACN,CAAC,CAAC;EACJ;AACF;AAACS,OAAA,CAAAC,OAAA,GAAAlC,cAAA;AAAAvB,eAAA,CA3FoBuB,cAAc,6BAES,mCAAmC;AAAAvB,eAAA,CAF1DuB,cAAc,gCAI/B,sCAAsC"} \ No newline at end of file +{"version":3,"names":["_AccessCheckoutReactNative","require","_defineProperty","obj","key","value","_toPropertyKey","Object","defineProperty","enumerable","configurable","writable","arg","_toPrimitive","String","input","hint","prim","Symbol","toPrimitive","undefined","res","call","TypeError","Number","AccessCheckout","constructor","baseUrl","merchantId","generateSessions","sessionGenerationConfig","sessionTypes","Promise","resolve","reject","AccessCheckoutReactNative","panId","expiryDateId","cvcId","reactNativeSdkVersion","ReactNativeSdkVersion","then","bridgeSessions","sessions","card","cvc","catch","error","initialiseCardValidation","validationConfig","enablePanFormatting","acceptedCardBrands","initialiseCvcOnlyValidation","exports","default"],"sources":["AccessCheckout.tsx"],"sourcesContent":["import { AccessCheckoutReactNative } from './AccessCheckoutReactNative';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport SessionGenerationConfig from './session/SessionGenerationConfig';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport Sessions from './session/Sessions';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport CardValidationConfig from './validation/CardValidationConfig';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport CvcOnlyValidationConfig from './validation/CvcOnlyValidationConfig';\n\nexport default class AccessCheckout {\n private readonly ReactNativeSdkVersion = '2.0.0';\n static readonly CardValidationEventType = 'AccessCheckoutCardValidationEvent';\n static readonly CvcOnlyValidationEventType =\n 'AccessCheckoutCvcOnlyValidationEvent';\n\n baseUrl: string;\n merchantId?: string;\n\n constructor({\n baseUrl,\n merchantId,\n }: {\n baseUrl: string;\n merchantId?: string;\n }) {\n this.baseUrl = baseUrl;\n this.merchantId = merchantId;\n }\n\n generateSessions(\n sessionGenerationConfig: SessionGenerationConfig,\n sessionTypes: string[]\n ): Promise {\n return new Promise((resolve, reject) => {\n AccessCheckoutReactNative.generateSessions({\n baseUrl: this.baseUrl,\n merchantId: this.merchantId,\n panId: sessionGenerationConfig.panId,\n expiryDateId: sessionGenerationConfig.expiryDateId,\n cvcId: sessionGenerationConfig.cvcId,\n sessionTypes,\n reactNativeSdkVersion: this.ReactNativeSdkVersion,\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, prettier/prettier\n .then((bridgeSessions: any) => {\n const sessions: Sessions = {};\n if (bridgeSessions.card) {\n sessions.card = bridgeSessions.card;\n }\n if (bridgeSessions.cvc) {\n sessions.cvc = bridgeSessions.cvc;\n }\n\n resolve(sessions);\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .catch((error: any) => {\n reject(error);\n });\n });\n }\n\n initialiseCardValidation(\n validationConfig: CardValidationConfig\n ): Promise {\n return new Promise((resolve, reject) => {\n AccessCheckoutReactNative.initialiseCardValidation({\n baseUrl: this.baseUrl,\n panId: validationConfig.panId,\n expiryDateId: validationConfig.expiryDateId,\n cvcId: validationConfig.cvcId,\n enablePanFormatting: validationConfig.enablePanFormatting,\n acceptedCardBrands: validationConfig.acceptedCardBrands,\n })\n .then(() => {\n resolve(true);\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .catch((error: any) => {\n reject(error);\n });\n });\n }\n\n initialiseCvcOnlyValidation(\n validationConfig: CvcOnlyValidationConfig\n ): Promise {\n return new Promise((resolve, reject) => {\n AccessCheckoutReactNative.initialiseCvcOnlyValidation({\n cvcId: validationConfig.cvcId,\n })\n .then(() => {\n resolve(true);\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .catch((error: any) => {\n reject(error);\n });\n });\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,0BAAA,GAAAC,OAAA;AAAwE,SAAAC,gBAAAC,GAAA,EAAAC,GAAA,EAAAC,KAAA,IAAAD,GAAA,GAAAE,cAAA,CAAAF,GAAA,OAAAA,GAAA,IAAAD,GAAA,IAAAI,MAAA,CAAAC,cAAA,CAAAL,GAAA,EAAAC,GAAA,IAAAC,KAAA,EAAAA,KAAA,EAAAI,UAAA,QAAAC,YAAA,QAAAC,QAAA,oBAAAR,GAAA,CAAAC,GAAA,IAAAC,KAAA,WAAAF,GAAA;AAAA,SAAAG,eAAAM,GAAA,QAAAR,GAAA,GAAAS,YAAA,CAAAD,GAAA,2BAAAR,GAAA,gBAAAA,GAAA,GAAAU,MAAA,CAAAV,GAAA;AAAA,SAAAS,aAAAE,KAAA,EAAAC,IAAA,eAAAD,KAAA,iBAAAA,KAAA,kBAAAA,KAAA,MAAAE,IAAA,GAAAF,KAAA,CAAAG,MAAA,CAAAC,WAAA,OAAAF,IAAA,KAAAG,SAAA,QAAAC,GAAA,GAAAJ,IAAA,CAAAK,IAAA,CAAAP,KAAA,EAAAC,IAAA,2BAAAK,GAAA,sBAAAA,GAAA,YAAAE,SAAA,4DAAAP,IAAA,gBAAAF,MAAA,GAAAU,MAAA,EAAAT,KAAA;AACxE;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAGe,MAAMU,cAAc,CAAC;EASlCC,WAAWA,CAAC;IACVC,OAAO;IACPC;EAIF,CAAC,EAAE;IAAA1B,eAAA,gCAdsC,OAAO;IAAAA,eAAA;IAAAA,eAAA;IAe9C,IAAI,CAACyB,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACC,UAAU,GAAGA,UAAU;EAC9B;EAEAC,gBAAgBA,CACdC,uBAAgD,EAChDC,YAAsB,EACH;IACnB,OAAO,IAAIC,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;MACtCC,oDAAyB,CAACN,gBAAgB,CAAC;QACzCF,OAAO,EAAE,IAAI,CAACA,OAAO;QACrBC,UAAU,EAAE,IAAI,CAACA,UAAU;QAC3BQ,KAAK,EAAEN,uBAAuB,CAACM,KAAK;QACpCC,YAAY,EAAEP,uBAAuB,CAACO,YAAY;QAClDC,KAAK,EAAER,uBAAuB,CAACQ,KAAK;QACpCP,YAAY;QACZQ,qBAAqB,EAAE,IAAI,CAACC;MAC9B,CAAC;MACC;MAAA,CACCC,IAAI,CAAEC,cAAmB,IAAK;QAC7B,MAAMC,QAAkB,GAAG,CAAC,CAAC;QAC7B,IAAID,cAAc,CAACE,IAAI,EAAE;UACvBD,QAAQ,CAACC,IAAI,GAAGF,cAAc,CAACE,IAAI;QACrC;QACA,IAAIF,cAAc,CAACG,GAAG,EAAE;UACtBF,QAAQ,CAACE,GAAG,GAAGH,cAAc,CAACG,GAAG;QACnC;QAEAZ,OAAO,CAACU,QAAQ,CAAC;MACnB,CAAC;MACD;MAAA,CACCG,KAAK,CAAEC,KAAU,IAAK;QACrBb,MAAM,CAACa,KAAK,CAAC;MACf,CAAC,CAAC;IACN,CAAC,CAAC;EACJ;EAEAC,wBAAwBA,CACtBC,gBAAsC,EACpB;IAClB,OAAO,IAAIjB,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;MACtCC,oDAAyB,CAACa,wBAAwB,CAAC;QACjDrB,OAAO,EAAE,IAAI,CAACA,OAAO;QACrBS,KAAK,EAAEa,gBAAgB,CAACb,KAAK;QAC7BC,YAAY,EAAEY,gBAAgB,CAACZ,YAAY;QAC3CC,KAAK,EAAEW,gBAAgB,CAACX,KAAK;QAC7BY,mBAAmB,EAAED,gBAAgB,CAACC,mBAAmB;QACzDC,kBAAkB,EAAEF,gBAAgB,CAACE;MACvC,CAAC,CAAC,CACCV,IAAI,CAAC,MAAM;QACVR,OAAO,CAAC,IAAI,CAAC;MACf,CAAC;MACD;MAAA,CACCa,KAAK,CAAEC,KAAU,IAAK;QACrBb,MAAM,CAACa,KAAK,CAAC;MACf,CAAC,CAAC;IACN,CAAC,CAAC;EACJ;EAEAK,2BAA2BA,CACzBH,gBAAyC,EACvB;IAClB,OAAO,IAAIjB,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;MACtCC,oDAAyB,CAACiB,2BAA2B,CAAC;QACpDd,KAAK,EAAEW,gBAAgB,CAACX;MAC1B,CAAC,CAAC,CACCG,IAAI,CAAC,MAAM;QACVR,OAAO,CAAC,IAAI,CAAC;MACf,CAAC;MACD;MAAA,CACCa,KAAK,CAAEC,KAAU,IAAK;QACrBb,MAAM,CAACa,KAAK,CAAC;MACf,CAAC,CAAC;IACN,CAAC,CAAC;EACJ;AACF;AAACM,OAAA,CAAAC,OAAA,GAAA7B,cAAA;AAAAvB,eAAA,CA3FoBuB,cAAc,6BAES,mCAAmC;AAAAvB,eAAA,CAF1DuB,cAAc,gCAI/B,sCAAsC"} \ No newline at end of file diff --git a/access-checkout-react-native-sdk/lib/commonjs/index.js b/access-checkout-react-native-sdk/lib/commonjs/index.js index 713c219..ca55287 100644 --- a/access-checkout-react-native-sdk/lib/commonjs/index.js +++ b/access-checkout-react-native-sdk/lib/commonjs/index.js @@ -33,12 +33,6 @@ Object.defineProperty(exports, "CVC", { return _SessionType.CVC; } }); -Object.defineProperty(exports, "CardDetails", { - enumerable: true, - get: function () { - return _CardDetails.default; - } -}); Object.defineProperty(exports, "CardValidationConfig", { enumerable: true, get: function () { @@ -63,6 +57,12 @@ Object.defineProperty(exports, "CvcOnlyValidationEventListener", { return _CvcOnlyValidationEventListener.CvcOnlyValidationEventListener; } }); +Object.defineProperty(exports, "SessionGenerationConfig", { + enumerable: true, + get: function () { + return _SessionGenerationConfig.default; + } +}); Object.defineProperty(exports, "SessionType", { enumerable: true, get: function () { @@ -102,7 +102,7 @@ Object.defineProperty(exports, "useCvcOnlyValidation", { }); var _AccessCheckoutReactNative = _interopRequireDefault(require("./AccessCheckoutReactNative")); var _AccessCheckout = _interopRequireDefault(require("./AccessCheckout")); -var _CardDetails = _interopRequireDefault(require("./session/CardDetails")); +var _SessionGenerationConfig = _interopRequireDefault(require("./session/SessionGenerationConfig")); var _SessionType = _interopRequireWildcard(require("./session/SessionType")); var _Sessions = _interopRequireDefault(require("./session/Sessions")); var _CardValidationConfig = _interopRequireDefault(require("./validation/CardValidationConfig")); diff --git a/access-checkout-react-native-sdk/lib/commonjs/index.js.map b/access-checkout-react-native-sdk/lib/commonjs/index.js.map index a528917..256ef7d 100644 --- a/access-checkout-react-native-sdk/lib/commonjs/index.js.map +++ b/access-checkout-react-native-sdk/lib/commonjs/index.js.map @@ -1 +1 @@ -{"version":3,"names":["_AccessCheckoutReactNative","_interopRequireDefault","require","_AccessCheckout","_CardDetails","_SessionType","_interopRequireWildcard","_Sessions","_CardValidationConfig","_CvcOnlyValidationConfig","_Brand","_BrandImage","_CardValidationEventListener","_CvcOnlyValidationEventListener","_CardValidationHooks","_CvcOnlyValidationHooks","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","obj","_default","exports","AccessCheckoutReactNative"],"sources":["index.tsx"],"sourcesContent":["import AccessCheckoutReactNative from './AccessCheckoutReactNative';\n\nexport default AccessCheckoutReactNative;\n\nexport { default as AccessCheckout } from './AccessCheckout';\n\nexport { default as CardDetails } from './session/CardDetails';\n\nexport { default as SessionType, CARD, CVC } from './session/SessionType';\n\nexport { default as Sessions } from './session/Sessions';\n\nexport { default as CardValidationConfig } from './validation/CardValidationConfig';\n\nexport { default as CvcOnlyValidationConfig } from './validation/CvcOnlyValidationConfig';\n\nexport { default as Brand } from './validation/Brand';\n\nexport { default as BrandImage } from './validation/BrandImage';\n\nexport {\n CardValidationEventListener,\n cardValidationNativeEventListenerOf,\n} from './validation/CardValidationEventListener';\n\nexport {\n CvcOnlyValidationEventListener,\n cvcOnlyValidationNativeEventListenerOf,\n} from './validation/CvcOnlyValidationEventListener';\n\nexport { useCardValidation } from './validation/CardValidationHooks';\nexport { useCvcOnlyValidation } from './validation/CvcOnlyValidationHooks';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,0BAAA,GAAAC,sBAAA,CAAAC,OAAA;AAIA,IAAAC,eAAA,GAAAF,sBAAA,CAAAC,OAAA;AAEA,IAAAE,YAAA,GAAAH,sBAAA,CAAAC,OAAA;AAEA,IAAAG,YAAA,GAAAC,uBAAA,CAAAJ,OAAA;AAEA,IAAAK,SAAA,GAAAN,sBAAA,CAAAC,OAAA;AAEA,IAAAM,qBAAA,GAAAP,sBAAA,CAAAC,OAAA;AAEA,IAAAO,wBAAA,GAAAR,sBAAA,CAAAC,OAAA;AAEA,IAAAQ,MAAA,GAAAT,sBAAA,CAAAC,OAAA;AAEA,IAAAS,WAAA,GAAAV,sBAAA,CAAAC,OAAA;AAEA,IAAAU,4BAAA,GAAAV,OAAA;AAKA,IAAAW,+BAAA,GAAAX,OAAA;AAKA,IAAAY,oBAAA,GAAAZ,OAAA;AACA,IAAAa,uBAAA,GAAAb,OAAA;AAA2E,SAAAc,yBAAAC,CAAA,6BAAAC,OAAA,mBAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,CAAA,WAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA,KAAAF,CAAA;AAAA,SAAAX,wBAAAW,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA,eAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,WAAAK,OAAA,EAAAL,CAAA,QAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,UAAAG,CAAA,CAAAI,GAAA,CAAAP,CAAA,OAAAQ,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,CAAA,IAAAd,CAAA,oBAAAc,CAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAjB,CAAA,EAAAc,CAAA,SAAAI,CAAA,GAAAR,CAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAb,CAAA,EAAAc,CAAA,UAAAI,CAAA,KAAAA,CAAA,CAAAX,GAAA,IAAAW,CAAA,CAAAC,GAAA,IAAAR,MAAA,CAAAC,cAAA,CAAAJ,CAAA,EAAAM,CAAA,EAAAI,CAAA,IAAAV,CAAA,CAAAM,CAAA,IAAAd,CAAA,CAAAc,CAAA,YAAAN,CAAA,CAAAH,OAAA,GAAAL,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAgB,GAAA,CAAAnB,CAAA,EAAAQ,CAAA,GAAAA,CAAA;AAAA,SAAAxB,uBAAAoC,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAhB,UAAA,GAAAgB,GAAA,KAAAf,OAAA,EAAAe,GAAA;AAAA,IAAAC,QAAA,GAAAC,OAAA,CAAAjB,OAAA,GA7B5DkB,kCAAyB"} \ No newline at end of file +{"version":3,"names":["_AccessCheckoutReactNative","_interopRequireDefault","require","_AccessCheckout","_SessionGenerationConfig","_SessionType","_interopRequireWildcard","_Sessions","_CardValidationConfig","_CvcOnlyValidationConfig","_Brand","_BrandImage","_CardValidationEventListener","_CvcOnlyValidationEventListener","_CardValidationHooks","_CvcOnlyValidationHooks","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","obj","_default","exports","AccessCheckoutReactNative"],"sources":["index.tsx"],"sourcesContent":["import AccessCheckoutReactNative from './AccessCheckoutReactNative';\n\nexport default AccessCheckoutReactNative;\n\nexport { default as AccessCheckout } from './AccessCheckout';\n\nexport { default as SessionGenerationConfig } from './session/SessionGenerationConfig';\n\nexport { default as SessionType, CARD, CVC } from './session/SessionType';\n\nexport { default as Sessions } from './session/Sessions';\n\nexport { default as CardValidationConfig } from './validation/CardValidationConfig';\n\nexport { default as CvcOnlyValidationConfig } from './validation/CvcOnlyValidationConfig';\n\nexport { default as Brand } from './validation/Brand';\n\nexport { default as BrandImage } from './validation/BrandImage';\n\nexport {\n CardValidationEventListener,\n cardValidationNativeEventListenerOf,\n} from './validation/CardValidationEventListener';\n\nexport {\n CvcOnlyValidationEventListener,\n cvcOnlyValidationNativeEventListenerOf,\n} from './validation/CvcOnlyValidationEventListener';\n\nexport { useCardValidation } from './validation/CardValidationHooks';\nexport { useCvcOnlyValidation } from './validation/CvcOnlyValidationHooks';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,0BAAA,GAAAC,sBAAA,CAAAC,OAAA;AAIA,IAAAC,eAAA,GAAAF,sBAAA,CAAAC,OAAA;AAEA,IAAAE,wBAAA,GAAAH,sBAAA,CAAAC,OAAA;AAEA,IAAAG,YAAA,GAAAC,uBAAA,CAAAJ,OAAA;AAEA,IAAAK,SAAA,GAAAN,sBAAA,CAAAC,OAAA;AAEA,IAAAM,qBAAA,GAAAP,sBAAA,CAAAC,OAAA;AAEA,IAAAO,wBAAA,GAAAR,sBAAA,CAAAC,OAAA;AAEA,IAAAQ,MAAA,GAAAT,sBAAA,CAAAC,OAAA;AAEA,IAAAS,WAAA,GAAAV,sBAAA,CAAAC,OAAA;AAEA,IAAAU,4BAAA,GAAAV,OAAA;AAKA,IAAAW,+BAAA,GAAAX,OAAA;AAKA,IAAAY,oBAAA,GAAAZ,OAAA;AACA,IAAAa,uBAAA,GAAAb,OAAA;AAA2E,SAAAc,yBAAAC,CAAA,6BAAAC,OAAA,mBAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,CAAA,WAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA,KAAAF,CAAA;AAAA,SAAAX,wBAAAW,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA,eAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,WAAAK,OAAA,EAAAL,CAAA,QAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,UAAAG,CAAA,CAAAI,GAAA,CAAAP,CAAA,OAAAQ,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,CAAA,IAAAd,CAAA,oBAAAc,CAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAjB,CAAA,EAAAc,CAAA,SAAAI,CAAA,GAAAR,CAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAb,CAAA,EAAAc,CAAA,UAAAI,CAAA,KAAAA,CAAA,CAAAX,GAAA,IAAAW,CAAA,CAAAC,GAAA,IAAAR,MAAA,CAAAC,cAAA,CAAAJ,CAAA,EAAAM,CAAA,EAAAI,CAAA,IAAAV,CAAA,CAAAM,CAAA,IAAAd,CAAA,CAAAc,CAAA,YAAAN,CAAA,CAAAH,OAAA,GAAAL,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAgB,GAAA,CAAAnB,CAAA,EAAAQ,CAAA,GAAAA,CAAA;AAAA,SAAAxB,uBAAAoC,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAhB,UAAA,GAAAgB,GAAA,KAAAf,OAAA,EAAAe,GAAA;AAAA,IAAAC,QAAA,GAAAC,OAAA,CAAAjB,OAAA,GA7B5DkB,kCAAyB"} \ No newline at end of file diff --git a/access-checkout-react-native-sdk/lib/commonjs/session/CardDetails.js b/access-checkout-react-native-sdk/lib/commonjs/session/CardDetails.js deleted file mode 100644 index a59ae2a..0000000 --- a/access-checkout-react-native-sdk/lib/commonjs/session/CardDetails.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict"; -//# sourceMappingURL=CardDetails.js.map \ No newline at end of file diff --git a/access-checkout-react-native-sdk/lib/commonjs/session/CardDetails.js.map b/access-checkout-react-native-sdk/lib/commonjs/session/CardDetails.js.map deleted file mode 100644 index 391944c..0000000 --- a/access-checkout-react-native-sdk/lib/commonjs/session/CardDetails.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"names":[],"sources":["CardDetails.tsx"],"sourcesContent":["export default interface CardDetails {\n pan?: string;\n expiryDate?: string;\n cvc: string;\n}\n"],"mappings":""} \ No newline at end of file diff --git a/access-checkout-react-native-sdk/lib/commonjs/session/SessionGenerationConfig.js b/access-checkout-react-native-sdk/lib/commonjs/session/SessionGenerationConfig.js new file mode 100644 index 0000000..08c141c --- /dev/null +++ b/access-checkout-react-native-sdk/lib/commonjs/session/SessionGenerationConfig.js @@ -0,0 +1,2 @@ +"use strict"; +//# sourceMappingURL=SessionGenerationConfig.js.map \ No newline at end of file diff --git a/access-checkout-react-native-sdk/lib/commonjs/session/SessionGenerationConfig.js.map b/access-checkout-react-native-sdk/lib/commonjs/session/SessionGenerationConfig.js.map new file mode 100644 index 0000000..2309d75 --- /dev/null +++ b/access-checkout-react-native-sdk/lib/commonjs/session/SessionGenerationConfig.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"sources":["SessionGenerationConfig.ts"],"sourcesContent":["export default interface SessionGenerationConfig {\n panId?: string;\n expiryDateId?: string;\n cvcId: string;\n}\n"],"mappings":""} \ No newline at end of file diff --git a/access-checkout-react-native-sdk/lib/commonjs/ui/AccessCheckoutTextInput.js b/access-checkout-react-native-sdk/lib/commonjs/ui/AccessCheckoutTextInput.js new file mode 100644 index 0000000..1e77c39 --- /dev/null +++ b/access-checkout-react-native-sdk/lib/commonjs/ui/AccessCheckoutTextInput.js @@ -0,0 +1,25 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var _react = _interopRequireDefault(require("react")); +var _reactNative = require("react-native"); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +/** + * Composes `AccessCheckoutTextInput`. + * + * - nativeID: string + * - testID: string + * - style: StyleProp + * - editable: boolean + * - placeholder: string + */ + +const RTCAccessCheckoutTextInput = (0, _reactNative.requireNativeComponent)('AccessCheckoutTextInput'); +const AccessCheckoutTextInput = props => { + return /*#__PURE__*/_react.default.createElement(RTCAccessCheckoutTextInput, props); +}; +var _default = exports.default = AccessCheckoutTextInput; +//# sourceMappingURL=AccessCheckoutTextInput.js.map \ No newline at end of file diff --git a/access-checkout-react-native-sdk/lib/commonjs/ui/AccessCheckoutTextInput.js.map b/access-checkout-react-native-sdk/lib/commonjs/ui/AccessCheckoutTextInput.js.map new file mode 100644 index 0000000..7899b6c --- /dev/null +++ b/access-checkout-react-native-sdk/lib/commonjs/ui/AccessCheckoutTextInput.js.map @@ -0,0 +1 @@ +{"version":3,"names":["_react","_interopRequireDefault","require","_reactNative","obj","__esModule","default","RTCAccessCheckoutTextInput","requireNativeComponent","AccessCheckoutTextInput","props","createElement","_default","exports"],"sources":["AccessCheckoutTextInput.tsx"],"sourcesContent":["import React from 'react';\nimport {\n requireNativeComponent,\n StyleProp,\n TextStyle,\n type ViewProps,\n} from 'react-native';\n\n/**\n * Composes `AccessCheckoutTextInput`.\n *\n * - nativeID: string\n * - testID: string\n * - style: StyleProp\n * - editable: boolean\n * - placeholder: string\n */\ninterface AccessCheckoutTextInputProps extends ViewProps {\n testID: string | undefined;\n style?: StyleProp;\n editable?: boolean | undefined;\n placeholder?: string | undefined;\n isValid?: boolean;\n keyboardType?: string;\n}\n\nconst RTCAccessCheckoutTextInput =\n requireNativeComponent(\n 'AccessCheckoutTextInput'\n );\nconst AccessCheckoutTextInput = (props: AccessCheckoutTextInputProps) => {\n return ;\n};\n\nexport default AccessCheckoutTextInput;\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAKsB,SAAAD,uBAAAG,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAEtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAUA,MAAMG,0BAA0B,GAC9B,IAAAC,mCAAsB,EACpB,yBACF,CAAC;AACH,MAAMC,uBAAuB,GAAIC,KAAmC,IAAK;EACvE,oBAAOV,MAAA,CAAAM,OAAA,CAAAK,aAAA,CAACJ,0BAA0B,EAAKG,KAAQ,CAAC;AAClD,CAAC;AAAC,IAAAE,QAAA,GAAAC,OAAA,CAAAP,OAAA,GAEaG,uBAAuB"} \ No newline at end of file diff --git a/access-checkout-react-native-sdk/lib/module/AccessCheckout.js b/access-checkout-react-native-sdk/lib/module/AccessCheckout.js index d77813f..32a3624 100644 --- a/access-checkout-react-native-sdk/lib/module/AccessCheckout.js +++ b/access-checkout-react-native-sdk/lib/module/AccessCheckout.js @@ -21,14 +21,14 @@ export default class AccessCheckout { this.baseUrl = baseUrl; this.merchantId = merchantId; } - generateSessions(cardDetails, sessionTypes) { + generateSessions(sessionGenerationConfig, sessionTypes) { return new Promise((resolve, reject) => { AccessCheckoutReactNative.generateSessions({ baseUrl: this.baseUrl, merchantId: this.merchantId, - panValue: cardDetails.pan, - expiryDateValue: cardDetails.expiryDate, - cvcValue: cardDetails.cvc, + panId: sessionGenerationConfig.panId, + expiryDateId: sessionGenerationConfig.expiryDateId, + cvcId: sessionGenerationConfig.cvcId, sessionTypes, reactNativeSdkVersion: this.ReactNativeSdkVersion }) diff --git a/access-checkout-react-native-sdk/lib/module/AccessCheckout.js.map b/access-checkout-react-native-sdk/lib/module/AccessCheckout.js.map index da654db..a9c8fa3 100644 --- a/access-checkout-react-native-sdk/lib/module/AccessCheckout.js.map +++ b/access-checkout-react-native-sdk/lib/module/AccessCheckout.js.map @@ -1 +1 @@ -{"version":3,"names":["AccessCheckoutReactNative","AccessCheckout","constructor","baseUrl","merchantId","_defineProperty","generateSessions","cardDetails","sessionTypes","Promise","resolve","reject","panValue","pan","expiryDateValue","expiryDate","cvcValue","cvc","reactNativeSdkVersion","ReactNativeSdkVersion","then","bridgeSessions","sessions","card","catch","error","initialiseCardValidation","validationConfig","panId","expiryDateId","cvcId","enablePanFormatting","acceptedCardBrands","initialiseCvcOnlyValidation"],"sources":["AccessCheckout.tsx"],"sourcesContent":["import { AccessCheckoutReactNative } from './AccessCheckoutReactNative';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport CardDetails from './session/CardDetails';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport Sessions from './session/Sessions';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport CardValidationConfig from './validation/CardValidationConfig';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport CvcOnlyValidationConfig from './validation/CvcOnlyValidationConfig';\n\nexport default class AccessCheckout {\n private readonly ReactNativeSdkVersion = '2.0.0';\n static readonly CardValidationEventType = 'AccessCheckoutCardValidationEvent';\n static readonly CvcOnlyValidationEventType =\n 'AccessCheckoutCvcOnlyValidationEvent';\n\n baseUrl: string;\n merchantId?: string;\n\n constructor({\n baseUrl,\n merchantId,\n }: {\n baseUrl: string;\n merchantId?: string;\n }) {\n this.baseUrl = baseUrl;\n this.merchantId = merchantId;\n }\n\n generateSessions(\n cardDetails: CardDetails,\n sessionTypes: string[]\n ): Promise {\n return new Promise((resolve, reject) => {\n AccessCheckoutReactNative.generateSessions({\n baseUrl: this.baseUrl,\n merchantId: this.merchantId,\n panValue: cardDetails.pan,\n expiryDateValue: cardDetails.expiryDate,\n cvcValue: cardDetails.cvc,\n sessionTypes,\n reactNativeSdkVersion: this.ReactNativeSdkVersion,\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, prettier/prettier\n .then((bridgeSessions: any) => {\n const sessions: Sessions = {};\n if (bridgeSessions.card) {\n sessions.card = bridgeSessions.card;\n }\n if (bridgeSessions.cvc) {\n sessions.cvc = bridgeSessions.cvc;\n }\n\n resolve(sessions);\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .catch((error: any) => {\n reject(error);\n });\n });\n }\n\n initialiseCardValidation(\n validationConfig: CardValidationConfig\n ): Promise {\n return new Promise((resolve, reject) => {\n AccessCheckoutReactNative.initialiseCardValidation({\n baseUrl: this.baseUrl,\n panId: validationConfig.panId,\n expiryDateId: validationConfig.expiryDateId,\n cvcId: validationConfig.cvcId,\n enablePanFormatting: validationConfig.enablePanFormatting,\n acceptedCardBrands: validationConfig.acceptedCardBrands,\n })\n .then(() => {\n resolve(true);\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .catch((error: any) => {\n reject(error);\n });\n });\n }\n\n initialiseCvcOnlyValidation(\n validationConfig: CvcOnlyValidationConfig\n ): Promise {\n return new Promise((resolve, reject) => {\n AccessCheckoutReactNative.initialiseCvcOnlyValidation({\n cvcId: validationConfig.cvcId,\n })\n .then(() => {\n resolve(true);\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .catch((error: any) => {\n reject(error);\n });\n });\n }\n}\n"],"mappings":";;;AAAA,SAASA,yBAAyB,QAAQ,6BAA6B;AACvE;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAGA,eAAe,MAAMC,cAAc,CAAC;EASlCC,WAAWA,CAAC;IACVC,OAAO;IACPC;EAIF,CAAC,EAAE;IAAAC,eAAA,gCAdsC,OAAO;IAAAA,eAAA;IAAAA,eAAA;IAe9C,IAAI,CAACF,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACC,UAAU,GAAGA,UAAU;EAC9B;EAEAE,gBAAgBA,CACdC,WAAwB,EACxBC,YAAsB,EACH;IACnB,OAAO,IAAIC,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;MACtCX,yBAAyB,CAACM,gBAAgB,CAAC;QACzCH,OAAO,EAAE,IAAI,CAACA,OAAO;QACrBC,UAAU,EAAE,IAAI,CAACA,UAAU;QAC3BQ,QAAQ,EAAEL,WAAW,CAACM,GAAG;QACzBC,eAAe,EAAEP,WAAW,CAACQ,UAAU;QACvCC,QAAQ,EAAET,WAAW,CAACU,GAAG;QACzBT,YAAY;QACZU,qBAAqB,EAAE,IAAI,CAACC;MAC9B,CAAC;MACC;MAAA,CACCC,IAAI,CAAEC,cAAmB,IAAK;QAC7B,MAAMC,QAAkB,GAAG,CAAC,CAAC;QAC7B,IAAID,cAAc,CAACE,IAAI,EAAE;UACvBD,QAAQ,CAACC,IAAI,GAAGF,cAAc,CAACE,IAAI;QACrC;QACA,IAAIF,cAAc,CAACJ,GAAG,EAAE;UACtBK,QAAQ,CAACL,GAAG,GAAGI,cAAc,CAACJ,GAAG;QACnC;QAEAP,OAAO,CAACY,QAAQ,CAAC;MACnB,CAAC;MACD;MAAA,CACCE,KAAK,CAAEC,KAAU,IAAK;QACrBd,MAAM,CAACc,KAAK,CAAC;MACf,CAAC,CAAC;IACN,CAAC,CAAC;EACJ;EAEAC,wBAAwBA,CACtBC,gBAAsC,EACpB;IAClB,OAAO,IAAIlB,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;MACtCX,yBAAyB,CAAC0B,wBAAwB,CAAC;QACjDvB,OAAO,EAAE,IAAI,CAACA,OAAO;QACrByB,KAAK,EAAED,gBAAgB,CAACC,KAAK;QAC7BC,YAAY,EAAEF,gBAAgB,CAACE,YAAY;QAC3CC,KAAK,EAAEH,gBAAgB,CAACG,KAAK;QAC7BC,mBAAmB,EAAEJ,gBAAgB,CAACI,mBAAmB;QACzDC,kBAAkB,EAAEL,gBAAgB,CAACK;MACvC,CAAC,CAAC,CACCZ,IAAI,CAAC,MAAM;QACVV,OAAO,CAAC,IAAI,CAAC;MACf,CAAC;MACD;MAAA,CACCc,KAAK,CAAEC,KAAU,IAAK;QACrBd,MAAM,CAACc,KAAK,CAAC;MACf,CAAC,CAAC;IACN,CAAC,CAAC;EACJ;EAEAQ,2BAA2BA,CACzBN,gBAAyC,EACvB;IAClB,OAAO,IAAIlB,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;MACtCX,yBAAyB,CAACiC,2BAA2B,CAAC;QACpDH,KAAK,EAAEH,gBAAgB,CAACG;MAC1B,CAAC,CAAC,CACCV,IAAI,CAAC,MAAM;QACVV,OAAO,CAAC,IAAI,CAAC;MACf,CAAC;MACD;MAAA,CACCc,KAAK,CAAEC,KAAU,IAAK;QACrBd,MAAM,CAACc,KAAK,CAAC;MACf,CAAC,CAAC;IACN,CAAC,CAAC;EACJ;AACF;AAACpB,eAAA,CA3FoBJ,cAAc,6BAES,mCAAmC;AAAAI,eAAA,CAF1DJ,cAAc,gCAI/B,sCAAsC"} \ No newline at end of file +{"version":3,"names":["AccessCheckoutReactNative","AccessCheckout","constructor","baseUrl","merchantId","_defineProperty","generateSessions","sessionGenerationConfig","sessionTypes","Promise","resolve","reject","panId","expiryDateId","cvcId","reactNativeSdkVersion","ReactNativeSdkVersion","then","bridgeSessions","sessions","card","cvc","catch","error","initialiseCardValidation","validationConfig","enablePanFormatting","acceptedCardBrands","initialiseCvcOnlyValidation"],"sources":["AccessCheckout.tsx"],"sourcesContent":["import { AccessCheckoutReactNative } from './AccessCheckoutReactNative';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport SessionGenerationConfig from './session/SessionGenerationConfig';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport Sessions from './session/Sessions';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport CardValidationConfig from './validation/CardValidationConfig';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport CvcOnlyValidationConfig from './validation/CvcOnlyValidationConfig';\n\nexport default class AccessCheckout {\n private readonly ReactNativeSdkVersion = '2.0.0';\n static readonly CardValidationEventType = 'AccessCheckoutCardValidationEvent';\n static readonly CvcOnlyValidationEventType =\n 'AccessCheckoutCvcOnlyValidationEvent';\n\n baseUrl: string;\n merchantId?: string;\n\n constructor({\n baseUrl,\n merchantId,\n }: {\n baseUrl: string;\n merchantId?: string;\n }) {\n this.baseUrl = baseUrl;\n this.merchantId = merchantId;\n }\n\n generateSessions(\n sessionGenerationConfig: SessionGenerationConfig,\n sessionTypes: string[]\n ): Promise {\n return new Promise((resolve, reject) => {\n AccessCheckoutReactNative.generateSessions({\n baseUrl: this.baseUrl,\n merchantId: this.merchantId,\n panId: sessionGenerationConfig.panId,\n expiryDateId: sessionGenerationConfig.expiryDateId,\n cvcId: sessionGenerationConfig.cvcId,\n sessionTypes,\n reactNativeSdkVersion: this.ReactNativeSdkVersion,\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, prettier/prettier\n .then((bridgeSessions: any) => {\n const sessions: Sessions = {};\n if (bridgeSessions.card) {\n sessions.card = bridgeSessions.card;\n }\n if (bridgeSessions.cvc) {\n sessions.cvc = bridgeSessions.cvc;\n }\n\n resolve(sessions);\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .catch((error: any) => {\n reject(error);\n });\n });\n }\n\n initialiseCardValidation(\n validationConfig: CardValidationConfig\n ): Promise {\n return new Promise((resolve, reject) => {\n AccessCheckoutReactNative.initialiseCardValidation({\n baseUrl: this.baseUrl,\n panId: validationConfig.panId,\n expiryDateId: validationConfig.expiryDateId,\n cvcId: validationConfig.cvcId,\n enablePanFormatting: validationConfig.enablePanFormatting,\n acceptedCardBrands: validationConfig.acceptedCardBrands,\n })\n .then(() => {\n resolve(true);\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .catch((error: any) => {\n reject(error);\n });\n });\n }\n\n initialiseCvcOnlyValidation(\n validationConfig: CvcOnlyValidationConfig\n ): Promise {\n return new Promise((resolve, reject) => {\n AccessCheckoutReactNative.initialiseCvcOnlyValidation({\n cvcId: validationConfig.cvcId,\n })\n .then(() => {\n resolve(true);\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .catch((error: any) => {\n reject(error);\n });\n });\n }\n}\n"],"mappings":";;;AAAA,SAASA,yBAAyB,QAAQ,6BAA6B;AACvE;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAGA,eAAe,MAAMC,cAAc,CAAC;EASlCC,WAAWA,CAAC;IACVC,OAAO;IACPC;EAIF,CAAC,EAAE;IAAAC,eAAA,gCAdsC,OAAO;IAAAA,eAAA;IAAAA,eAAA;IAe9C,IAAI,CAACF,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACC,UAAU,GAAGA,UAAU;EAC9B;EAEAE,gBAAgBA,CACdC,uBAAgD,EAChDC,YAAsB,EACH;IACnB,OAAO,IAAIC,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;MACtCX,yBAAyB,CAACM,gBAAgB,CAAC;QACzCH,OAAO,EAAE,IAAI,CAACA,OAAO;QACrBC,UAAU,EAAE,IAAI,CAACA,UAAU;QAC3BQ,KAAK,EAAEL,uBAAuB,CAACK,KAAK;QACpCC,YAAY,EAAEN,uBAAuB,CAACM,YAAY;QAClDC,KAAK,EAAEP,uBAAuB,CAACO,KAAK;QACpCN,YAAY;QACZO,qBAAqB,EAAE,IAAI,CAACC;MAC9B,CAAC;MACC;MAAA,CACCC,IAAI,CAAEC,cAAmB,IAAK;QAC7B,MAAMC,QAAkB,GAAG,CAAC,CAAC;QAC7B,IAAID,cAAc,CAACE,IAAI,EAAE;UACvBD,QAAQ,CAACC,IAAI,GAAGF,cAAc,CAACE,IAAI;QACrC;QACA,IAAIF,cAAc,CAACG,GAAG,EAAE;UACtBF,QAAQ,CAACE,GAAG,GAAGH,cAAc,CAACG,GAAG;QACnC;QAEAX,OAAO,CAACS,QAAQ,CAAC;MACnB,CAAC;MACD;MAAA,CACCG,KAAK,CAAEC,KAAU,IAAK;QACrBZ,MAAM,CAACY,KAAK,CAAC;MACf,CAAC,CAAC;IACN,CAAC,CAAC;EACJ;EAEAC,wBAAwBA,CACtBC,gBAAsC,EACpB;IAClB,OAAO,IAAIhB,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;MACtCX,yBAAyB,CAACwB,wBAAwB,CAAC;QACjDrB,OAAO,EAAE,IAAI,CAACA,OAAO;QACrBS,KAAK,EAAEa,gBAAgB,CAACb,KAAK;QAC7BC,YAAY,EAAEY,gBAAgB,CAACZ,YAAY;QAC3CC,KAAK,EAAEW,gBAAgB,CAACX,KAAK;QAC7BY,mBAAmB,EAAED,gBAAgB,CAACC,mBAAmB;QACzDC,kBAAkB,EAAEF,gBAAgB,CAACE;MACvC,CAAC,CAAC,CACCV,IAAI,CAAC,MAAM;QACVP,OAAO,CAAC,IAAI,CAAC;MACf,CAAC;MACD;MAAA,CACCY,KAAK,CAAEC,KAAU,IAAK;QACrBZ,MAAM,CAACY,KAAK,CAAC;MACf,CAAC,CAAC;IACN,CAAC,CAAC;EACJ;EAEAK,2BAA2BA,CACzBH,gBAAyC,EACvB;IAClB,OAAO,IAAIhB,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;MACtCX,yBAAyB,CAAC4B,2BAA2B,CAAC;QACpDd,KAAK,EAAEW,gBAAgB,CAACX;MAC1B,CAAC,CAAC,CACCG,IAAI,CAAC,MAAM;QACVP,OAAO,CAAC,IAAI,CAAC;MACf,CAAC;MACD;MAAA,CACCY,KAAK,CAAEC,KAAU,IAAK;QACrBZ,MAAM,CAACY,KAAK,CAAC;MACf,CAAC,CAAC;IACN,CAAC,CAAC;EACJ;AACF;AAAClB,eAAA,CA3FoBJ,cAAc,6BAES,mCAAmC;AAAAI,eAAA,CAF1DJ,cAAc,gCAI/B,sCAAsC"} \ No newline at end of file diff --git a/access-checkout-react-native-sdk/lib/module/index.js b/access-checkout-react-native-sdk/lib/module/index.js index a3c8056..a4f0794 100644 --- a/access-checkout-react-native-sdk/lib/module/index.js +++ b/access-checkout-react-native-sdk/lib/module/index.js @@ -1,7 +1,7 @@ import AccessCheckoutReactNative from './AccessCheckoutReactNative'; export default AccessCheckoutReactNative; export { default as AccessCheckout } from './AccessCheckout'; -export { default as CardDetails } from './session/CardDetails'; +export { default as SessionGenerationConfig } from './session/SessionGenerationConfig'; export { default as SessionType, CARD, CVC } from './session/SessionType'; export { default as Sessions } from './session/Sessions'; export { default as CardValidationConfig } from './validation/CardValidationConfig'; diff --git a/access-checkout-react-native-sdk/lib/module/index.js.map b/access-checkout-react-native-sdk/lib/module/index.js.map index 382b820..7613935 100644 --- a/access-checkout-react-native-sdk/lib/module/index.js.map +++ b/access-checkout-react-native-sdk/lib/module/index.js.map @@ -1 +1 @@ -{"version":3,"names":["AccessCheckoutReactNative","default","AccessCheckout","CardDetails","SessionType","CARD","CVC","Sessions","CardValidationConfig","CvcOnlyValidationConfig","Brand","BrandImage","CardValidationEventListener","cardValidationNativeEventListenerOf","CvcOnlyValidationEventListener","cvcOnlyValidationNativeEventListenerOf","useCardValidation","useCvcOnlyValidation"],"sources":["index.tsx"],"sourcesContent":["import AccessCheckoutReactNative from './AccessCheckoutReactNative';\n\nexport default AccessCheckoutReactNative;\n\nexport { default as AccessCheckout } from './AccessCheckout';\n\nexport { default as CardDetails } from './session/CardDetails';\n\nexport { default as SessionType, CARD, CVC } from './session/SessionType';\n\nexport { default as Sessions } from './session/Sessions';\n\nexport { default as CardValidationConfig } from './validation/CardValidationConfig';\n\nexport { default as CvcOnlyValidationConfig } from './validation/CvcOnlyValidationConfig';\n\nexport { default as Brand } from './validation/Brand';\n\nexport { default as BrandImage } from './validation/BrandImage';\n\nexport {\n CardValidationEventListener,\n cardValidationNativeEventListenerOf,\n} from './validation/CardValidationEventListener';\n\nexport {\n CvcOnlyValidationEventListener,\n cvcOnlyValidationNativeEventListenerOf,\n} from './validation/CvcOnlyValidationEventListener';\n\nexport { useCardValidation } from './validation/CardValidationHooks';\nexport { useCvcOnlyValidation } from './validation/CvcOnlyValidationHooks';\n"],"mappings":"AAAA,OAAOA,yBAAyB,MAAM,6BAA6B;AAEnE,eAAeA,yBAAyB;AAExC,SAASC,OAAO,IAAIC,cAAc,QAAQ,kBAAkB;AAE5D,SAASD,OAAO,IAAIE,WAAW,QAAQ,uBAAuB;AAE9D,SAASF,OAAO,IAAIG,WAAW,EAAEC,IAAI,EAAEC,GAAG,QAAQ,uBAAuB;AAEzE,SAASL,OAAO,IAAIM,QAAQ,QAAQ,oBAAoB;AAExD,SAASN,OAAO,IAAIO,oBAAoB,QAAQ,mCAAmC;AAEnF,SAASP,OAAO,IAAIQ,uBAAuB,QAAQ,sCAAsC;AAEzF,SAASR,OAAO,IAAIS,KAAK,QAAQ,oBAAoB;AAErD,SAAST,OAAO,IAAIU,UAAU,QAAQ,yBAAyB;AAE/D,SACEC,2BAA2B,EAC3BC,mCAAmC,QAC9B,0CAA0C;AAEjD,SACEC,8BAA8B,EAC9BC,sCAAsC,QACjC,6CAA6C;AAEpD,SAASC,iBAAiB,QAAQ,kCAAkC;AACpE,SAASC,oBAAoB,QAAQ,qCAAqC"} \ No newline at end of file +{"version":3,"names":["AccessCheckoutReactNative","default","AccessCheckout","SessionGenerationConfig","SessionType","CARD","CVC","Sessions","CardValidationConfig","CvcOnlyValidationConfig","Brand","BrandImage","CardValidationEventListener","cardValidationNativeEventListenerOf","CvcOnlyValidationEventListener","cvcOnlyValidationNativeEventListenerOf","useCardValidation","useCvcOnlyValidation"],"sources":["index.tsx"],"sourcesContent":["import AccessCheckoutReactNative from './AccessCheckoutReactNative';\n\nexport default AccessCheckoutReactNative;\n\nexport { default as AccessCheckout } from './AccessCheckout';\n\nexport { default as SessionGenerationConfig } from './session/SessionGenerationConfig';\n\nexport { default as SessionType, CARD, CVC } from './session/SessionType';\n\nexport { default as Sessions } from './session/Sessions';\n\nexport { default as CardValidationConfig } from './validation/CardValidationConfig';\n\nexport { default as CvcOnlyValidationConfig } from './validation/CvcOnlyValidationConfig';\n\nexport { default as Brand } from './validation/Brand';\n\nexport { default as BrandImage } from './validation/BrandImage';\n\nexport {\n CardValidationEventListener,\n cardValidationNativeEventListenerOf,\n} from './validation/CardValidationEventListener';\n\nexport {\n CvcOnlyValidationEventListener,\n cvcOnlyValidationNativeEventListenerOf,\n} from './validation/CvcOnlyValidationEventListener';\n\nexport { useCardValidation } from './validation/CardValidationHooks';\nexport { useCvcOnlyValidation } from './validation/CvcOnlyValidationHooks';\n"],"mappings":"AAAA,OAAOA,yBAAyB,MAAM,6BAA6B;AAEnE,eAAeA,yBAAyB;AAExC,SAASC,OAAO,IAAIC,cAAc,QAAQ,kBAAkB;AAE5D,SAASD,OAAO,IAAIE,uBAAuB,QAAQ,mCAAmC;AAEtF,SAASF,OAAO,IAAIG,WAAW,EAAEC,IAAI,EAAEC,GAAG,QAAQ,uBAAuB;AAEzE,SAASL,OAAO,IAAIM,QAAQ,QAAQ,oBAAoB;AAExD,SAASN,OAAO,IAAIO,oBAAoB,QAAQ,mCAAmC;AAEnF,SAASP,OAAO,IAAIQ,uBAAuB,QAAQ,sCAAsC;AAEzF,SAASR,OAAO,IAAIS,KAAK,QAAQ,oBAAoB;AAErD,SAAST,OAAO,IAAIU,UAAU,QAAQ,yBAAyB;AAE/D,SACEC,2BAA2B,EAC3BC,mCAAmC,QAC9B,0CAA0C;AAEjD,SACEC,8BAA8B,EAC9BC,sCAAsC,QACjC,6CAA6C;AAEpD,SAASC,iBAAiB,QAAQ,kCAAkC;AACpE,SAASC,oBAAoB,QAAQ,qCAAqC"} \ No newline at end of file diff --git a/access-checkout-react-native-sdk/lib/module/session/CardDetails.js b/access-checkout-react-native-sdk/lib/module/session/CardDetails.js deleted file mode 100644 index 5ae9048..0000000 --- a/access-checkout-react-native-sdk/lib/module/session/CardDetails.js +++ /dev/null @@ -1,2 +0,0 @@ - -//# sourceMappingURL=CardDetails.js.map \ No newline at end of file diff --git a/access-checkout-react-native-sdk/lib/module/session/CardDetails.js.map b/access-checkout-react-native-sdk/lib/module/session/CardDetails.js.map deleted file mode 100644 index 391944c..0000000 --- a/access-checkout-react-native-sdk/lib/module/session/CardDetails.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"names":[],"sources":["CardDetails.tsx"],"sourcesContent":["export default interface CardDetails {\n pan?: string;\n expiryDate?: string;\n cvc: string;\n}\n"],"mappings":""} \ No newline at end of file diff --git a/access-checkout-react-native-sdk/lib/module/session/SessionGenerationConfig.js b/access-checkout-react-native-sdk/lib/module/session/SessionGenerationConfig.js new file mode 100644 index 0000000..3c54131 --- /dev/null +++ b/access-checkout-react-native-sdk/lib/module/session/SessionGenerationConfig.js @@ -0,0 +1,2 @@ + +//# sourceMappingURL=SessionGenerationConfig.js.map \ No newline at end of file diff --git a/access-checkout-react-native-sdk/lib/module/session/SessionGenerationConfig.js.map b/access-checkout-react-native-sdk/lib/module/session/SessionGenerationConfig.js.map new file mode 100644 index 0000000..2309d75 --- /dev/null +++ b/access-checkout-react-native-sdk/lib/module/session/SessionGenerationConfig.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"sources":["SessionGenerationConfig.ts"],"sourcesContent":["export default interface SessionGenerationConfig {\n panId?: string;\n expiryDateId?: string;\n cvcId: string;\n}\n"],"mappings":""} \ No newline at end of file diff --git a/access-checkout-react-native-sdk/lib/module/ui/AccessCheckoutTextInput.js b/access-checkout-react-native-sdk/lib/module/ui/AccessCheckoutTextInput.js new file mode 100644 index 0000000..719d8f0 --- /dev/null +++ b/access-checkout-react-native-sdk/lib/module/ui/AccessCheckoutTextInput.js @@ -0,0 +1,19 @@ +import React from 'react'; +import { requireNativeComponent } from 'react-native'; + +/** + * Composes `AccessCheckoutTextInput`. + * + * - nativeID: string + * - testID: string + * - style: StyleProp + * - editable: boolean + * - placeholder: string + */ + +const RTCAccessCheckoutTextInput = requireNativeComponent('AccessCheckoutTextInput'); +const AccessCheckoutTextInput = props => { + return /*#__PURE__*/React.createElement(RTCAccessCheckoutTextInput, props); +}; +export default AccessCheckoutTextInput; +//# sourceMappingURL=AccessCheckoutTextInput.js.map \ No newline at end of file diff --git a/access-checkout-react-native-sdk/lib/module/ui/AccessCheckoutTextInput.js.map b/access-checkout-react-native-sdk/lib/module/ui/AccessCheckoutTextInput.js.map new file mode 100644 index 0000000..0e162c1 --- /dev/null +++ b/access-checkout-react-native-sdk/lib/module/ui/AccessCheckoutTextInput.js.map @@ -0,0 +1 @@ +{"version":3,"names":["React","requireNativeComponent","RTCAccessCheckoutTextInput","AccessCheckoutTextInput","props","createElement"],"sources":["AccessCheckoutTextInput.tsx"],"sourcesContent":["import React from 'react';\nimport {\n requireNativeComponent,\n StyleProp,\n TextStyle,\n type ViewProps,\n} from 'react-native';\n\n/**\n * Composes `AccessCheckoutTextInput`.\n *\n * - nativeID: string\n * - testID: string\n * - style: StyleProp\n * - editable: boolean\n * - placeholder: string\n */\ninterface AccessCheckoutTextInputProps extends ViewProps {\n testID: string | undefined;\n style?: StyleProp;\n editable?: boolean | undefined;\n placeholder?: string | undefined;\n isValid?: boolean;\n keyboardType?: string;\n}\n\nconst RTCAccessCheckoutTextInput =\n requireNativeComponent(\n 'AccessCheckoutTextInput'\n );\nconst AccessCheckoutTextInput = (props: AccessCheckoutTextInputProps) => {\n return ;\n};\n\nexport default AccessCheckoutTextInput;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SACEC,sBAAsB,QAIjB,cAAc;;AAErB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAUA,MAAMC,0BAA0B,GAC9BD,sBAAsB,CACpB,yBACF,CAAC;AACH,MAAME,uBAAuB,GAAIC,KAAmC,IAAK;EACvE,oBAAOJ,KAAA,CAAAK,aAAA,CAACH,0BAA0B,EAAKE,KAAQ,CAAC;AAClD,CAAC;AAED,eAAeD,uBAAuB"} \ No newline at end of file diff --git a/access-checkout-react-native-sdk/lib/typescript/AccessCheckout.d.ts b/access-checkout-react-native-sdk/lib/typescript/AccessCheckout.d.ts index aad9025..6a8581d 100644 --- a/access-checkout-react-native-sdk/lib/typescript/AccessCheckout.d.ts +++ b/access-checkout-react-native-sdk/lib/typescript/AccessCheckout.d.ts @@ -1,4 +1,4 @@ -import CardDetails from './session/CardDetails'; +import SessionGenerationConfig from './session/SessionGenerationConfig'; import Sessions from './session/Sessions'; import CardValidationConfig from './validation/CardValidationConfig'; import CvcOnlyValidationConfig from './validation/CvcOnlyValidationConfig'; @@ -12,7 +12,7 @@ export default class AccessCheckout { baseUrl: string; merchantId?: string; }); - generateSessions(cardDetails: CardDetails, sessionTypes: string[]): Promise; + generateSessions(sessionGenerationConfig: SessionGenerationConfig, sessionTypes: string[]): Promise; initialiseCardValidation(validationConfig: CardValidationConfig): Promise; initialiseCvcOnlyValidation(validationConfig: CvcOnlyValidationConfig): Promise; } diff --git a/access-checkout-react-native-sdk/lib/typescript/index.d.ts b/access-checkout-react-native-sdk/lib/typescript/index.d.ts index 2f40af9..18713d1 100644 --- a/access-checkout-react-native-sdk/lib/typescript/index.d.ts +++ b/access-checkout-react-native-sdk/lib/typescript/index.d.ts @@ -1,7 +1,7 @@ import AccessCheckoutReactNative from './AccessCheckoutReactNative'; export default AccessCheckoutReactNative; export { default as AccessCheckout } from './AccessCheckout'; -export { default as CardDetails } from './session/CardDetails'; +export { default as SessionGenerationConfig } from './session/SessionGenerationConfig'; export { default as SessionType, CARD, CVC } from './session/SessionType'; export { default as Sessions } from './session/Sessions'; export { default as CardValidationConfig } from './validation/CardValidationConfig'; diff --git a/access-checkout-react-native-sdk/lib/typescript/session/CardDetails.d.ts b/access-checkout-react-native-sdk/lib/typescript/session/CardDetails.d.ts deleted file mode 100644 index 2096b9c..0000000 --- a/access-checkout-react-native-sdk/lib/typescript/session/CardDetails.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -export default interface CardDetails { - pan?: string; - expiryDate?: string; - cvc: string; -} diff --git a/access-checkout-react-native-sdk/lib/typescript/session/SessionGenerationConfig.d.ts b/access-checkout-react-native-sdk/lib/typescript/session/SessionGenerationConfig.d.ts new file mode 100644 index 0000000..4609624 --- /dev/null +++ b/access-checkout-react-native-sdk/lib/typescript/session/SessionGenerationConfig.d.ts @@ -0,0 +1,5 @@ +export default interface SessionGenerationConfig { + panId?: string; + expiryDateId?: string; + cvcId: string; +} diff --git a/access-checkout-react-native-sdk/lib/typescript/ui/AccessCheckoutTextInput.d.ts b/access-checkout-react-native-sdk/lib/typescript/ui/AccessCheckoutTextInput.d.ts new file mode 100644 index 0000000..5b94786 --- /dev/null +++ b/access-checkout-react-native-sdk/lib/typescript/ui/AccessCheckoutTextInput.d.ts @@ -0,0 +1,21 @@ +import React from 'react'; +import { StyleProp, TextStyle, type ViewProps } from 'react-native'; +/** + * Composes `AccessCheckoutTextInput`. + * + * - nativeID: string + * - testID: string + * - style: StyleProp + * - editable: boolean + * - placeholder: string + */ +interface AccessCheckoutTextInputProps extends ViewProps { + testID: string | undefined; + style?: StyleProp; + editable?: boolean | undefined; + placeholder?: string | undefined; + isValid?: boolean; + keyboardType?: string; +} +declare const AccessCheckoutTextInput: (props: AccessCheckoutTextInputProps) => React.JSX.Element; +export default AccessCheckoutTextInput; diff --git a/access-checkout-react-native-sdk/src/AccessCheckout.tsx b/access-checkout-react-native-sdk/src/AccessCheckout.tsx index 60e0c71..424d83f 100644 --- a/access-checkout-react-native-sdk/src/AccessCheckout.tsx +++ b/access-checkout-react-native-sdk/src/AccessCheckout.tsx @@ -1,7 +1,7 @@ import { AccessCheckoutReactNative } from './AccessCheckoutReactNative'; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore -import CardDetails from './session/CardDetails'; +import SessionGenerationConfig from './session/SessionGenerationConfig'; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import Sessions from './session/Sessions'; @@ -33,16 +33,16 @@ export default class AccessCheckout { } generateSessions( - cardDetails: CardDetails, + sessionGenerationConfig: SessionGenerationConfig, sessionTypes: string[] ): Promise { return new Promise((resolve, reject) => { AccessCheckoutReactNative.generateSessions({ baseUrl: this.baseUrl, merchantId: this.merchantId, - panValue: cardDetails.pan, - expiryDateValue: cardDetails.expiryDate, - cvcValue: cardDetails.cvc, + panId: sessionGenerationConfig.panId, + expiryDateId: sessionGenerationConfig.expiryDateId, + cvcId: sessionGenerationConfig.cvcId, sessionTypes, reactNativeSdkVersion: this.ReactNativeSdkVersion, }) diff --git a/access-checkout-react-native-sdk/src/index.tsx b/access-checkout-react-native-sdk/src/index.tsx index 5c1a4b6..183518f 100644 --- a/access-checkout-react-native-sdk/src/index.tsx +++ b/access-checkout-react-native-sdk/src/index.tsx @@ -4,7 +4,7 @@ export default AccessCheckoutReactNative; export { default as AccessCheckout } from './AccessCheckout'; -export { default as CardDetails } from './session/CardDetails'; +export { default as SessionGenerationConfig } from './session/SessionGenerationConfig'; export { default as SessionType, CARD, CVC } from './session/SessionType'; diff --git a/access-checkout-react-native-sdk/src/session/CardDetails.tsx b/access-checkout-react-native-sdk/src/session/CardDetails.tsx deleted file mode 100644 index bb19095..0000000 --- a/access-checkout-react-native-sdk/src/session/CardDetails.tsx +++ /dev/null @@ -1,5 +0,0 @@ -export default interface CardDetails { - pan?: string; - expiryDate?: string; - cvc: string; -} diff --git a/access-checkout-react-native-sdk/src/session/SessionGenerationConfig.ts b/access-checkout-react-native-sdk/src/session/SessionGenerationConfig.ts new file mode 100644 index 0000000..cd62dc3 --- /dev/null +++ b/access-checkout-react-native-sdk/src/session/SessionGenerationConfig.ts @@ -0,0 +1,5 @@ +export default interface SessionGenerationConfig { + panId?: string; + expiryDateId?: string; + cvcId: string; +} diff --git a/access-checkout-react-native-sdk/src/ui/AccessCheckoutTextInput.tsx b/access-checkout-react-native-sdk/src/ui/AccessCheckoutTextInput.tsx new file mode 100644 index 0000000..c048029 --- /dev/null +++ b/access-checkout-react-native-sdk/src/ui/AccessCheckoutTextInput.tsx @@ -0,0 +1,35 @@ +import React from 'react'; +import { + requireNativeComponent, + StyleProp, + TextStyle, + type ViewProps, +} from 'react-native'; + +/** + * Composes `AccessCheckoutTextInput`. + * + * - nativeID: string + * - testID: string + * - style: StyleProp + * - editable: boolean + * - placeholder: string + */ +interface AccessCheckoutTextInputProps extends ViewProps { + testID: string | undefined; + style?: StyleProp; + editable?: boolean | undefined; + placeholder?: string | undefined; + isValid?: boolean; + keyboardType?: string; +} + +const RTCAccessCheckoutTextInput = + requireNativeComponent( + 'AccessCheckoutTextInput' + ); +const AccessCheckoutTextInput = (props: AccessCheckoutTextInputProps) => { + return ; +}; + +export default AccessCheckoutTextInput; diff --git a/access-checkout-react-native-sdk/test/AccessCheckout.spec.ts b/access-checkout-react-native-sdk/test/AccessCheckout.spec.ts index fa2b21b..7f35596 100644 --- a/access-checkout-react-native-sdk/test/AccessCheckout.spec.ts +++ b/access-checkout-react-native-sdk/test/AccessCheckout.spec.ts @@ -19,9 +19,6 @@ import { const baseUrl = 'https://access.worldpay.com'; const merchantId = '123'; -const pan = '4444'; -const expiryDate = '12/34'; -const cvc = '123'; const panId = 'panId'; const expiryDateId = 'expiryDateId'; @@ -60,13 +57,18 @@ describe('AccessCheckout', () => { const checkout = new AccessCheckout({ baseUrl, merchantId }); describe('independently of the type of session', () => { - const cardDetails = { pan, expiryDate, cvc }; + const sessionGenerationConfig = new CardValidationConfig({ + panId, + expiryDateId, + cvcId, + }); + const sessionTypes = [SessionType.CARD, SessionType.CVC]; it('passes the SDK version to the React Native bridge', async () => { givenGenerateSessionsBridgeReturns({}); - await checkout.generateSessions(cardDetails, sessionTypes); + await checkout.generateSessions(sessionGenerationConfig, sessionTypes); const bridgeMock = NativeModules.AccessCheckoutReactNative.generateSessions.mock; @@ -80,7 +82,10 @@ describe('AccessCheckout', () => { givenGenerateSessionsBridgeFailsWith(new Error('Failed !')); try { - await checkout.generateSessions(cardDetails, sessionTypes); + await checkout.generateSessions( + sessionGenerationConfig, + sessionTypes + ); } catch (error) { expect(error).toEqual(new Error('Failed !')); } @@ -88,7 +93,11 @@ describe('AccessCheckout', () => { }); describe('for card only', () => { - const cardDetails = { pan, expiryDate, cvc }; + const sessionGenerationConfig = new CardValidationConfig({ + panId, + expiryDateId, + cvcId, + }); const sessionTypes = [SessionType.CARD]; it('returns a resolved promise with a sessions object containing only a card session when bridge successfully generates a session', async () => { @@ -97,7 +106,7 @@ describe('AccessCheckout', () => { }); const result: Sessions = await checkout.generateSessions( - cardDetails, + sessionGenerationConfig, sessionTypes ); @@ -109,13 +118,17 @@ describe('AccessCheckout', () => { }); describe('for card and cvc', () => { - const cardDetails = { pan, expiryDate, cvc }; + const sessionGenerationConfig = new CardValidationConfig({ + panId, + expiryDateId, + cvcId, + }); const sessionTypes = [SessionType.CARD, SessionType.CVC]; it('delegates the generation of sessions to the React Native bridge', async () => { givenGenerateSessionsBridgeReturns({}); - await checkout.generateSessions(cardDetails, sessionTypes); + await checkout.generateSessions(sessionGenerationConfig, sessionTypes); const bridgeMock = NativeModules.AccessCheckoutReactNative.generateSessions.mock; @@ -125,9 +138,9 @@ describe('AccessCheckout', () => { expect(args).toEqual({ baseUrl, merchantId, - panValue: pan, - expiryDateValue: expiryDate, - cvcValue: cvc, + panId: panId, + expiryDateId: expiryDateId, + cvcId: cvcId, sessionTypes: ['CARD', 'CVC'], reactNativeSdkVersion: packageDotJson.version, }); @@ -140,7 +153,7 @@ describe('AccessCheckout', () => { }); const result: Sessions = await checkout.generateSessions( - cardDetails, + sessionGenerationConfig, sessionTypes ); @@ -152,13 +165,15 @@ describe('AccessCheckout', () => { }); describe('for cvc only', () => { - const cardDetails = { cvc }; + const sessionGenerationConfig = new CvcOnlyValidationConfig({ + cvcId, + }); const sessionType = [CVC]; it('delegates the generation of a cvc session to the React Native bridge', async () => { givenGenerateSessionsBridgeReturns({}); - await checkout.generateSessions(cardDetails, sessionType); + await checkout.generateSessions(sessionGenerationConfig, sessionType); const bridgeMock = NativeModules.AccessCheckoutReactNative.generateSessions.mock; @@ -169,7 +184,7 @@ describe('AccessCheckout', () => { expect(args).toEqual({ baseUrl, merchantId, - cvcValue: cvc, + cvcId: cvcId, sessionTypes: ['CVC'], reactNativeSdkVersion: packageDotJson.version, }); @@ -181,7 +196,7 @@ describe('AccessCheckout', () => { }); const result: Sessions = await checkout.generateSessions( - cardDetails, + sessionGenerationConfig, sessionType ); diff --git a/access-checkout-react-native-sdk/test/session/CardDetails.spec.ts b/access-checkout-react-native-sdk/test/session/CardDetails.spec.ts deleted file mode 100644 index 20236cf..0000000 --- a/access-checkout-react-native-sdk/test/session/CardDetails.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import type CardDetails from '../../src/session/CardDetails'; - -describe('CardDetails', () => { - it('can be instantiated by a merchant with a pan, an expiry date and a cvv', () => { - const cardDetails: CardDetails = { - pan: '4444', - expiryDate: '12/21', - cvc: '123', - }; - - expect(cardDetails.pan).toEqual('4444'); - expect(cardDetails.expiryDate).toEqual('12/21'); - expect(cardDetails.cvc).toEqual('123'); - }); - - it('can be instantiated by a merchant with just a cvv', () => { - const cardDetails: CardDetails = { - cvc: '123', - }; - - expect(cardDetails.cvc).toEqual('123'); - }); -}); diff --git a/access-checkout-react-native-sdk/test/session/SessionGenerationConfig.spec.ts b/access-checkout-react-native-sdk/test/session/SessionGenerationConfig.spec.ts new file mode 100644 index 0000000..83d13c8 --- /dev/null +++ b/access-checkout-react-native-sdk/test/session/SessionGenerationConfig.spec.ts @@ -0,0 +1,23 @@ +import type SessionGenerationConfig from '../../src/session/SessionGenerationConfig'; + +describe('SessionGenerationConfig', () => { + it('can be instantiated by a merchant with a pan, an expiry date and a cvv', () => { + const cardDetails: SessionGenerationConfig = { + panId: 'some-pan-id', + expiryDateId: 'some-expiry-id', + cvcId: 'some-cvc-id', + }; + + expect(cardDetails.panId).toEqual('some-pan-id'); + expect(cardDetails.expiryDateId).toEqual('some-expiry-id'); + expect(cardDetails.cvcId).toEqual('some-cvc-id'); + }); + + it('can be instantiated by a merchant with just a cvv', () => { + const cardDetails: SessionGenerationConfig = { + cvcId: 'some-cvc-id', + }; + + expect(cardDetails.cvcId).toEqual('some-cvc-id'); + }); +}); diff --git a/checkout-sdks/android/com/worldpay/access/access-checkout-android/3.0.0/access-checkout-android-3.0.0-javadoc.jar b/checkout-sdks/android/com/worldpay/access/access-checkout-android/3.0.0/access-checkout-android-3.0.0-javadoc.jar index 377d4b7..16dc0f0 100644 Binary files a/checkout-sdks/android/com/worldpay/access/access-checkout-android/3.0.0/access-checkout-android-3.0.0-javadoc.jar and b/checkout-sdks/android/com/worldpay/access/access-checkout-android/3.0.0/access-checkout-android-3.0.0-javadoc.jar differ diff --git a/checkout-sdks/android/com/worldpay/access/access-checkout-android/3.0.0/access-checkout-android-3.0.0-sources.jar b/checkout-sdks/android/com/worldpay/access/access-checkout-android/3.0.0/access-checkout-android-3.0.0-sources.jar index 58e064a..f10314e 100644 Binary files a/checkout-sdks/android/com/worldpay/access/access-checkout-android/3.0.0/access-checkout-android-3.0.0-sources.jar and b/checkout-sdks/android/com/worldpay/access/access-checkout-android/3.0.0/access-checkout-android-3.0.0-sources.jar differ diff --git a/checkout-sdks/android/com/worldpay/access/access-checkout-android/3.0.0/access-checkout-android-3.0.0.aar b/checkout-sdks/android/com/worldpay/access/access-checkout-android/3.0.0/access-checkout-android-3.0.0.aar index 71bfe99..6b1903b 100644 Binary files a/checkout-sdks/android/com/worldpay/access/access-checkout-android/3.0.0/access-checkout-android-3.0.0.aar and b/checkout-sdks/android/com/worldpay/access/access-checkout-android/3.0.0/access-checkout-android-3.0.0.aar differ diff --git a/checkout-sdks/android/com/worldpay/access/access-checkout-android/3.0.0/access-checkout-android-3.0.0.module b/checkout-sdks/android/com/worldpay/access/access-checkout-android/3.0.0/access-checkout-android-3.0.0.module index 67e539a..3fd93b5 100644 --- a/checkout-sdks/android/com/worldpay/access/access-checkout-android/3.0.0/access-checkout-android-3.0.0.module +++ b/checkout-sdks/android/com/worldpay/access/access-checkout-android/3.0.0/access-checkout-android-3.0.0.module @@ -26,11 +26,11 @@ { "name": "access-checkout-android-3.0.0.aar", "url": "access-checkout-android-3.0.0.aar", - "size": 266262, - "sha512": "d9d63f4eb08f0440f609e1d021b20a9278ea80ebfd391857c651ad60a6cf6fb0e381f3a7d8febdf8a7be2cf144c90f14122b7aeb6469256f2b41937502b6497e", - "sha256": "b30607617345c7d8c3c13bf85ca1331bbb7966951db5c30963a2043bd202cf6a", - "sha1": "20ff1d2c640d7c4d2bea198f68cbd2c0c84b57ec", - "md5": "5ddbe7c23bd8c600be34711e6c886c28" + "size": 266253, + "sha512": "189b4a31dd9ee65610ac30fef715bcdd8c393f65fccefbe923c6bb7ede65eb44fac56b01e328df6b507dfa12c1bed98dc0b6c7a50028f43f47c56e3d9ece3f9f", + "sha256": "b47e701cdbe2d67765ce438d393e1b8489f96858f8af52df04beae8808bcc7cc", + "sha1": "989d983f4471181d2de378aca39dc3680f9db367", + "md5": "ce89c7cf47e5514d4dc850eb4fc91d80" } ] }, @@ -90,11 +90,11 @@ { "name": "access-checkout-android-3.0.0.aar", "url": "access-checkout-android-3.0.0.aar", - "size": 266262, - "sha512": "d9d63f4eb08f0440f609e1d021b20a9278ea80ebfd391857c651ad60a6cf6fb0e381f3a7d8febdf8a7be2cf144c90f14122b7aeb6469256f2b41937502b6497e", - "sha256": "b30607617345c7d8c3c13bf85ca1331bbb7966951db5c30963a2043bd202cf6a", - "sha1": "20ff1d2c640d7c4d2bea198f68cbd2c0c84b57ec", - "md5": "5ddbe7c23bd8c600be34711e6c886c28" + "size": 266253, + "sha512": "189b4a31dd9ee65610ac30fef715bcdd8c393f65fccefbe923c6bb7ede65eb44fac56b01e328df6b507dfa12c1bed98dc0b6c7a50028f43f47c56e3d9ece3f9f", + "sha256": "b47e701cdbe2d67765ce438d393e1b8489f96858f8af52df04beae8808bcc7cc", + "sha1": "989d983f4471181d2de378aca39dc3680f9db367", + "md5": "ce89c7cf47e5514d4dc850eb4fc91d80" } ] } diff --git a/checkout-sdks/android/com/worldpay/access/access-checkout-android/maven-metadata-local.xml b/checkout-sdks/android/com/worldpay/access/access-checkout-android/maven-metadata-local.xml index 9ef16ee..2546d9d 100644 --- a/checkout-sdks/android/com/worldpay/access/access-checkout-android/maven-metadata-local.xml +++ b/checkout-sdks/android/com/worldpay/access/access-checkout-android/maven-metadata-local.xml @@ -8,6 +8,6 @@ 3.0.0 - 20231218163540 + 20231213151836 diff --git a/demo-app/.prettierrc.json b/demo-app/.prettierrc.json index 018ca32..6707610 100644 --- a/demo-app/.prettierrc.json +++ b/demo-app/.prettierrc.json @@ -3,7 +3,5 @@ "singleQuote": true, "tabWidth": 2, "trailingComma": "es5", - "useTabs": false, - "arrowParens": "avoid", - "bracketSameLine": true + "useTabs": false } diff --git a/demo-app/e2e/page-objects/TextInputPO.js b/demo-app/e2e/page-objects/AccessCheckoutTextInputPO.js similarity index 54% rename from demo-app/e2e/page-objects/TextInputPO.js rename to demo-app/e2e/page-objects/AccessCheckoutTextInputPO.js index b605855..1d2c6c6 100644 --- a/demo-app/e2e/page-objects/TextInputPO.js +++ b/demo-app/e2e/page-objects/AccessCheckoutTextInputPO.js @@ -1,9 +1,18 @@ /* eslint-disable @typescript-eslint/no-var-requires */ const { UIComponentPO } = require('./UIComponentPO'); -const { expect } = require('detox'); +const { expect, element, by, device } = require('detox'); /* eslint-enable @typescript-eslint/no-var-requires */ -class TextInputPO extends UIComponentPO { +class AccessCheckoutTextInputPO extends UIComponentPO { + component() { + const selector = + device.getPlatform() === 'ios' + ? by.type('UITextField') + : by.type('android.widget.EditText'); + + return element(selector.withAncestor(by.id(this.id))); + } + async type(text, expectedText = '') { await this.component().typeText(text); @@ -18,4 +27,4 @@ class TextInputPO extends UIComponentPO { } } -module.exports = { TextInputPO }; +module.exports = { AccessCheckoutTextInputPO }; diff --git a/demo-app/e2e/page-objects/CardFlowPO.js b/demo-app/e2e/page-objects/CardFlowPO.js index b06369f..7ce0580 100644 --- a/demo-app/e2e/page-objects/CardFlowPO.js +++ b/demo-app/e2e/page-objects/CardFlowPO.js @@ -1,15 +1,15 @@ /* eslint-disable @typescript-eslint/no-var-requires */ const { SessionLabelPO } = require('./SessionLabelPO'); -const { TextInputPO } = require('./TextInputPO'); const { TogglePO } = require('./TogglePO'); const { UIComponentPO } = require('./UIComponentPO'); +const { AccessCheckoutTextInputPO } = require('./AccessCheckoutTextInputPO'); /* eslint-enable @typescript-eslint/no-var-requires */ class CardFlowPO { constructor() { - this.pan = new TextInputPO('panInput'); - this.expiryDate = new TextInputPO('expiryDateInput'); - this.cvc = new TextInputPO('cvcInput'); + this.pan = new AccessCheckoutTextInputPO('panInput'); + this.expiryDate = new AccessCheckoutTextInputPO('expiryDateInput'); + this.cvc = new AccessCheckoutTextInputPO('cvcInput'); this.submitButton = new UIComponentPO('submitButton'); this.cardAndCvcSessionsToggle = new TogglePO('cardAndCvcSessionsToggle'); this.cardSession = new SessionLabelPO('cardSession'); diff --git a/demo-app/e2e/page-objects/CvcOnlyFlowPO.js b/demo-app/e2e/page-objects/CvcOnlyFlowPO.js index 8e741c3..04a44dc 100644 --- a/demo-app/e2e/page-objects/CvcOnlyFlowPO.js +++ b/demo-app/e2e/page-objects/CvcOnlyFlowPO.js @@ -1,13 +1,13 @@ /* eslint-disable @typescript-eslint/no-var-requires */ const { SessionLabelPO } = require('./SessionLabelPO'); -const { TextInputPO } = require('./TextInputPO'); +const { AccessCheckoutTextInputPO } = require('./AccessCheckoutTextInputPO'); const { UIComponentPO } = require('./UIComponentPO'); /* eslint-enable @typescript-eslint/no-var-requires */ class CvcOnlyFlowPO { constructor() { this.cvcOnlyNavItem = new UIComponentPO('nav-cvc'); - this.cvc = new TextInputPO('cvcInput'); + this.cvc = new AccessCheckoutTextInputPO('cvcInput'); this.submitButton = new UIComponentPO('submitButton'); this.cvcSession = new SessionLabelPO('cvcSession'); } diff --git a/demo-app/ios/Podfile b/demo-app/ios/Podfile index f0d9862..2230685 100644 --- a/demo-app/ios/Podfile +++ b/demo-app/ios/Podfile @@ -30,6 +30,8 @@ target 'AccessCheckoutReactNativeDemo' do # Remove once version 3.0.0 of the AccessCheckoutSDK has been released to Cocoapods pod 'AccessCheckoutSDK', :git => 'git@github.com:Worldpay/access-checkout-ios.git', :tag => 'v3.0.0' + + end post_install do |installer| diff --git a/demo-app/ios/Podfile.lock b/demo-app/ios/Podfile.lock index 3e4335e..5acc59b 100644 --- a/demo-app/ios/Podfile.lock +++ b/demo-app/ios/Podfile.lock @@ -476,6 +476,6 @@ SPEC CHECKSUMS: ReactCommon: dce64235f8548b6e4758647310145f5356c8d0cb Yoga: 56413d530d1808044600320ced5baa883acedc44 -PODFILE CHECKSUM: e0184a468d9cb21c3391042cbabb4ec293b8bd1b +PODFILE CHECKSUM: 408b947d698c5c185eaffb553e600969f934485a -COCOAPODS: 1.13.0 +COCOAPODS: 1.14.3 diff --git a/demo-app/package-lock.json b/demo-app/package-lock.json index dc23ee7..0d102ff 100644 --- a/demo-app/package-lock.json +++ b/demo-app/package-lock.json @@ -28,6 +28,7 @@ "detox": "^20.13.5", "eslint": "^8.19.0", "eslint-config-prettier": "^8.3.0", + "eslint-plugin-jest": "^27.6.0", "eslint-plugin-prettier": "^4.0.0", "jest": "^29.2.1", "jest-html-reporter": "^3.10.2", @@ -2095,9 +2096,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", - "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -2124,9 +2125,9 @@ "dev": true }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2188,9 +2189,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz", - "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", + "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -5648,9 +5649,9 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "node_modules/@types/node": { @@ -6032,11 +6033,10 @@ } }, "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true, - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -8227,15 +8227,15 @@ } }, "node_modules/eslint": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz", - "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", + "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.3", - "@eslint/js": "8.54.0", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.55.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -8329,6 +8329,31 @@ "eslint": "^8.1.0" } }, + "node_modules/eslint-plugin-jest": { + "version": "27.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.6.0.tgz", + "integrity": "sha512-MTlusnnDMChbElsszJvrwD1dN3x6nZl//s4JD23BxB6MgR66TZlL064su24xEIS3VACfAoHV1vgyMgPw8nkdng==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "^5.10.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0", + "eslint": "^7.0.0 || ^8.0.0", + "jest": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, "node_modules/eslint-plugin-prettier": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", @@ -8727,18 +8752,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/espree/node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -15279,15 +15292,18 @@ } }, "node_modules/prettier": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.0.tgz", - "integrity": "sha512-FM/zAKgWTxj40rH03VxzIPdXmj39SwSjwG0heUcNFwI+EMZJnY93yAiKXM3dObIKAM5TA88werc8T/EwhB45eg==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, "bin": { "prettier": "bin-prettier.js" }, "engines": { "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/prettier-linter-helpers": { @@ -16760,9 +16776,9 @@ } }, "node_modules/terser": { - "version": "5.24.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", - "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", + "version": "5.26.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz", + "integrity": "sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -16777,18 +16793,6 @@ "node": ">=10" } }, - "node_modules/terser/node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -18933,9 +18937,9 @@ "dev": true }, "@eslint/eslintrc": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", - "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -18956,9 +18960,9 @@ "dev": true }, "globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -18998,9 +19002,9 @@ } }, "@eslint/js": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz", - "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", + "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", "dev": true }, "@hapi/hoek": { @@ -21667,9 +21671,9 @@ } }, "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "@types/node": { @@ -21935,11 +21939,10 @@ } }, "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "peer": true + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "dev": true }, "acorn-jsx": { "version": "5.3.2", @@ -23579,15 +23582,15 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz", - "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", + "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.3", - "@eslint/js": "8.54.0", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.55.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -23809,6 +23812,15 @@ "string-natural-compare": "^3.0.1" } }, + "eslint-plugin-jest": { + "version": "27.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.6.0.tgz", + "integrity": "sha512-MTlusnnDMChbElsszJvrwD1dN3x6nZl//s4JD23BxB6MgR66TZlL064su24xEIS3VACfAoHV1vgyMgPw8nkdng==", + "dev": true, + "requires": { + "@typescript-eslint/utils": "^5.10.0" + } + }, "eslint-plugin-prettier": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", @@ -23919,14 +23931,6 @@ "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" - }, - "dependencies": { - "acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", - "dev": true - } } }, "esprima": { @@ -28732,9 +28736,9 @@ "dev": true }, "prettier": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.0.tgz", - "integrity": "sha512-FM/zAKgWTxj40rH03VxzIPdXmj39SwSjwG0heUcNFwI+EMZJnY93yAiKXM3dObIKAM5TA88werc8T/EwhB45eg==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true }, "prettier-linter-helpers": { @@ -29881,9 +29885,9 @@ } }, "terser": { - "version": "5.24.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", - "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", + "version": "5.26.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz", + "integrity": "sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==", "dev": true, "requires": { "@jridgewell/source-map": "^0.3.3", @@ -29892,12 +29896,6 @@ "source-map-support": "~0.5.20" }, "dependencies": { - "acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", - "dev": true - }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", diff --git a/demo-app/package.json b/demo-app/package.json index 159913e..a235608 100644 --- a/demo-app/package.json +++ b/demo-app/package.json @@ -9,7 +9,8 @@ ], "scripts": { "android": "npm run build:typescript && react-native run-android", - "ios": "npm run build:typescript && react-native run-ios --simulator=\"iphone8-14\"", + "ios": "npm run clean:ios && npm run build:typescript && react-native run-ios", + "clean:ios": "rm -rf ./ios/build", "start": "react-native start", "build:typescript": "tsc", "lint": "eslint \"**/*.{js,ts,tsx}\"", @@ -36,6 +37,7 @@ "@types/react-native": "^0.66.6", "@typescript-eslint/eslint-plugin": "^5.5.0", "@typescript-eslint/parser": "^5.5.0", + "eslint-plugin-jest": "^27.6.0", "babel-jest": "^29.2.1", "babel-plugin-module-resolver": "^5.0.0", "detox": "^20.13.5", diff --git a/demo-app/src/App.tsx b/demo-app/src/App.tsx index acbcd7c..00845cc 100644 --- a/demo-app/src/App.tsx +++ b/demo-app/src/App.tsx @@ -5,7 +5,6 @@ import HView from './common/HView'; import VView from './common/VView'; import CvcOnly from './cvc-flow/CvcFlow'; import NavItem from './navigation/NavItem'; - export default function App() { const screens = { card: 'card', @@ -14,11 +13,11 @@ export default function App() { const [screen, setScreen] = useState(screens.card); + const currentScreen = screen === screens.card ? : ; + return ( - - {screen === screens.card ? : } - + {currentScreen} setScreen(screens.cvc)} - > + /> ); diff --git a/demo-app/src/card-flow/CardFlow.tsx b/demo-app/src/card-flow/CardFlow.tsx index 480333b..9d3d0e0 100644 --- a/demo-app/src/card-flow/CardFlow.tsx +++ b/demo-app/src/card-flow/CardFlow.tsx @@ -4,13 +4,14 @@ import { AccessCheckout, Brand, CARD, - CardDetails, CardValidationConfig, CardValidationEventListener, CVC, Sessions, useCardValidation, } from '../../../access-checkout-react-native-sdk/src/index'; +import type SessionGenerationConfig + from '../../../access-checkout-react-native-sdk/src/session/SessionGenerationConfig'; import CardBrandImage from '../common/CardBrandImage'; import CvcField from '../common/CvcField'; import ErrorView from '../common/ErrorView'; @@ -31,10 +32,6 @@ export default function CardFlow() { const unknownBrandLogo = 'https://npe.access.worldpay.com/access-checkout/assets/unknown.png'; - const [panValue, setPan] = useState(''); - const [expiryValue, setExpiry] = useState(''); - const [cvcValue, setCvc] = useState(''); - const [brand, setBrand] = useState(''); const [brandLogo, setBrandLogo] = useState(unknownBrandLogo); const [panIsValid, setPanIsValid] = useState(false); @@ -131,14 +128,14 @@ export default function CardFlow() { setIsEditable(false); setSubmitBtnEnabled(false); - const cardDetails: CardDetails = { - pan: panValue, - expiryDate: expiryValue, - cvc: cvcValue, + const sessionGenerationConfig: SessionGenerationConfig = { + panId: 'panInput', + expiryDateId: 'expiryDateInput', + cvcId: 'cvcInput', }; accessCheckout - .generateSessions(cardDetails, sessionTypes) + .generateSessions(sessionGenerationConfig, sessionTypes) .then((sessions: Sessions) => { console.info(`Successfully generated session(s)`); @@ -195,7 +192,6 @@ export default function CardFlow() { @@ -204,13 +200,11 @@ export default function CardFlow() { diff --git a/demo-app/src/card-flow/style.js b/demo-app/src/card-flow/style.js index f1701cc..08fd3e7 100644 --- a/demo-app/src/card-flow/style.js +++ b/demo-app/src/card-flow/style.js @@ -9,4 +9,29 @@ export default StyleSheet.create({ }, }), }, + cvc: { + flex: 1, + margin: 12, + borderWidth: 1, + borderRadius: 5, + padding: 10, + height: 40, + }, + pan: { + flex: 8, + margin: 12, + marginRight: 5, + borderWidth: 1, + borderRadius: 5, + padding: 10, + height: 40, + }, + expiry: { + flex: 1, + margin: 12, + borderWidth: 1, + borderRadius: 5, + padding: 10, + height: 40, + }, }); diff --git a/demo-app/src/common/CvcField.tsx b/demo-app/src/common/CvcField.tsx index 7cad67f..d5f86ae 100644 --- a/demo-app/src/common/CvcField.tsx +++ b/demo-app/src/common/CvcField.tsx @@ -1,5 +1,5 @@ -import React, { useState } from 'react'; -import { StyleSheet, TextInput } from 'react-native'; +import React from 'react'; +import { StyleSheet } from 'react-native'; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore @@ -7,6 +7,7 @@ import commonStyles from './common-styles.js'; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import UIComponentProps from './UIComponentProps'; +import AccessCheckoutTextInput from '../../../access-checkout-react-native-sdk/src/ui/AccessCheckoutTextInput'; const styles = StyleSheet.create({ cvc: { @@ -22,14 +23,11 @@ const styles = StyleSheet.create({ interface CvcFieldProps extends UIComponentProps { isEditable: boolean; isValid: boolean; - onChange(text: string): void; } const CvcField = (props: CvcFieldProps) => { - const [cvcValue, setCvc] = useState(''); - return ( - { : commonStyles.invalid, ]} keyboardType="numeric" - onChangeText={(text) => { - setCvc(text); - props.onChange(text); - }} editable={props.isEditable} - value={cvcValue} placeholder="CVC" /> ); diff --git a/demo-app/src/common/ExpiryDateField.tsx b/demo-app/src/common/ExpiryDateField.tsx index 54737e1..71b3915 100644 --- a/demo-app/src/common/ExpiryDateField.tsx +++ b/demo-app/src/common/ExpiryDateField.tsx @@ -1,11 +1,12 @@ -import React, { useState } from 'react'; -import { StyleSheet, TextInput } from 'react-native'; +import React from 'react'; +import { StyleSheet } from 'react-native'; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import commonStyles from './common-styles.js'; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import UIComponentProps from './UIComponentProps'; +import AccessCheckoutTextInput from '../../../access-checkout-react-native-sdk/src/ui/AccessCheckoutTextInput'; const styles = StyleSheet.create({ expiry: { @@ -21,17 +22,16 @@ const styles = StyleSheet.create({ interface ExpiryDateFieldProps extends UIComponentProps { isEditable: boolean; isValid: boolean; - - onChange(text: string): void; } const ExpiryDateField = (props: ExpiryDateFieldProps) => { - const [expiryValue, setExpiry] = useState(''); - return ( - { ? commonStyles.valid : commonStyles.invalid, ]} - keyboardType="numeric" - onChangeText={(text) => { - setExpiry(text); - props.onChange(text); - }} - editable={props.isEditable} - value={expiryValue} - placeholder="MM/YY" /> ); }; diff --git a/demo-app/src/common/PanField.tsx b/demo-app/src/common/PanField.tsx index 540b449..a41c660 100644 --- a/demo-app/src/common/PanField.tsx +++ b/demo-app/src/common/PanField.tsx @@ -1,5 +1,6 @@ -import React, { useState } from 'react'; -import { StyleSheet, TextInput } from 'react-native'; +import React from 'react'; +import { StyleSheet } from 'react-native'; +import AccessCheckoutTextInput from '../../../access-checkout-react-native-sdk/src/ui/AccessCheckoutTextInput'; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import commonStyles from './common-styles.js'; @@ -22,14 +23,11 @@ const styles = StyleSheet.create({ interface PanFieldProps extends UIComponentProps { isEditable: boolean; isValid: boolean; - onChange(text: string): void; } const PanField = (props: PanFieldProps) => { - const [panValue, setPan] = useState(''); - return ( - { : commonStyles.invalid, ]} keyboardType="numeric" - onChangeText={(text) => { - setPan(text); - props.onChange(text); - }} editable={props.isEditable} - value={panValue} placeholder="Card Number" /> ); diff --git a/demo-app/src/cvc-flow/CvcFlow.tsx b/demo-app/src/cvc-flow/CvcFlow.tsx index 1e48bca..647d0b9 100644 --- a/demo-app/src/cvc-flow/CvcFlow.tsx +++ b/demo-app/src/cvc-flow/CvcFlow.tsx @@ -1,28 +1,28 @@ import React, { useState } from 'react'; +import { Text } from 'react-native'; import { AccessCheckout, - CardDetails, CVC, CvcOnlyValidationConfig, CvcOnlyValidationEventListener, Sessions, useCvcOnlyValidation, } from '../../../access-checkout-react-native-sdk/src'; +import type SessionGenerationConfig + from '../../../access-checkout-react-native-sdk/src/session/SessionGenerationConfig'; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +import styles from '../card-flow/style.js'; import CvcField from '../common/CvcField'; +import ErrorView from '../common/ErrorView'; import HView from '../common/HView'; +import SessionLabel from '../common/SessionLabel'; import Spinner from '../common/Spinner'; import SubmitButton from '../common/SubmitButton'; import VView from '../common/VView'; -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore -import styles from '../card-flow/style.js'; -import { Text } from 'react-native'; -import SessionLabel from '../common/SessionLabel'; import CvcOnlyFlowE2eStates from '../cvc-flow/CvcOnlyFlow.e2e.states'; -import ErrorView from '../common/ErrorView'; export default function CvcFlow() { - const [cvcValue, setCvc] = useState(''); const [cvcIsValid, setCvcIsValid] = useState(false); const [submitBtnEnabled, setSubmitBtnEnabled] = useState(false); @@ -32,7 +32,7 @@ export default function CvcFlow() { const [cvcSession, setCvcSession] = useState(''); const [error, setError] = useState(); - + const accessCheckout = new AccessCheckout({ baseUrl: 'https://npe.access.worldpay.com', merchantId: 'identity', @@ -58,7 +58,7 @@ export default function CvcFlow() { const { initialiseCvcOnlyValidation } = useCvcOnlyValidation( accessCheckout, cvcOnlyValidationConfig, - cvcOnlyValidationEventListener + cvcOnlyValidationEventListener, ); const onLayout = () => { @@ -77,12 +77,12 @@ export default function CvcFlow() { setShowSpinner(true); setIsEditable(false); - const cardDetails: CardDetails = { - cvc: cvcValue, + const sessionGenerationConfig: SessionGenerationConfig = { + cvcId: 'cvcInput', }; accessCheckout - .generateSessions(cardDetails, sessionTypes) + .generateSessions(sessionGenerationConfig, sessionTypes) .then((sessions: Sessions) => { console.info('Successfully generated session(s)'); @@ -116,7 +116,7 @@ export default function CvcFlow() { if (error) { errorComponent = ; } - + // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore return ( @@ -128,7 +128,6 @@ export default function CvcFlow() { testID="cvcInput" isEditable={isEditable} isValid={cvcIsValid} - onChange={setCvc} />