fidel-react-native 1.6.3 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/README.md +54 -55
  3. package/android/build.gradle +11 -8
  4. package/android/src/main/java/com/fidelreactlibrary/FidelModule.java +52 -44
  5. package/android/src/main/java/com/fidelreactlibrary/FidelPackage.java +64 -49
  6. package/android/src/main/java/com/fidelreactlibrary/adapters/CardVerificationConfigurationProperties.java +22 -0
  7. package/android/src/main/java/com/fidelreactlibrary/adapters/FidelCardSchemesAdapter.java +46 -29
  8. package/android/src/main/java/com/fidelreactlibrary/adapters/FidelCardVerificationChoiceAdapter.java +57 -0
  9. package/android/src/main/java/com/fidelreactlibrary/adapters/FidelCountryAdapter.java +47 -19
  10. package/android/src/main/java/com/fidelreactlibrary/adapters/FidelProgramTypeAdapter.java +46 -0
  11. package/android/src/main/java/com/fidelreactlibrary/adapters/FidelSetupAdapter.java +108 -6
  12. package/android/src/main/java/com/fidelreactlibrary/adapters/FidelSetupProperties.java +67 -0
  13. package/android/src/main/java/com/fidelreactlibrary/adapters/FidelVerificationConfigurationAdapter.java +35 -0
  14. package/android/src/main/java/com/fidelreactlibrary/adapters/ImageFromReadableMapAdapter.java +5 -1
  15. package/android/src/main/java/com/fidelreactlibrary/adapters/ResultsAdapter.java +288 -0
  16. package/android/src/main/java/com/fidelreactlibrary/adapters/abstraction/CardSchemesAdapter.java +6 -2
  17. package/android/src/main/java/com/fidelreactlibrary/adapters/abstraction/CardVerificationChoiceAdapter.java +11 -0
  18. package/android/src/main/java/com/fidelreactlibrary/adapters/abstraction/CountryAdapter.java +14 -3
  19. package/android/src/main/java/com/fidelreactlibrary/adapters/abstraction/DataAdapter.java +5 -0
  20. package/android/src/main/java/com/fidelreactlibrary/adapters/abstraction/ProgramTypeAdapter.java +11 -0
  21. package/android/src/main/java/com/fidelreactlibrary/adapters/abstraction/VerificationConfigurationAdapter.java +9 -0
  22. package/android/src/main/java/com/fidelreactlibrary/events/BridgeLibraryEvent.java +17 -0
  23. package/android/src/main/java/com/fidelreactlibrary/events/BridgeLibraryEventEmitter.java +24 -0
  24. package/android/src/main/java/com/fidelreactlibrary/events/CardVerificationChoiceObserver.java +29 -0
  25. package/android/src/main/java/com/fidelreactlibrary/events/CardVerificationStartedObserver.java +31 -0
  26. package/android/src/main/java/com/fidelreactlibrary/events/ResultsObserver.java +72 -0
  27. package/android/src/test/java/com/fidelreactlibrary/FidelModuleTests.java +50 -31
  28. package/android/src/test/java/com/fidelreactlibrary/FidelPackageTests.java +0 -1
  29. package/android/src/test/java/com/fidelreactlibrary/{FidelCardSchemesAdapterTests.java → adapters/FidelCardSchemesAdapterTests.java} +51 -47
  30. package/android/src/test/java/com/fidelreactlibrary/adapters/FidelCardVerificationChoiceAdapterTest.java +70 -0
  31. package/android/src/test/java/com/fidelreactlibrary/adapters/FidelCountryAdapterTests.java +157 -0
  32. package/android/src/test/java/com/fidelreactlibrary/adapters/FidelProgramTypeAdapterTests.java +54 -0
  33. package/android/src/test/java/com/fidelreactlibrary/adapters/FidelSetupAdapterTests.java +900 -0
  34. package/android/src/test/java/com/fidelreactlibrary/adapters/FidelVerificationConfigurationAdapterTest.java +51 -0
  35. package/android/src/test/java/com/fidelreactlibrary/adapters/ResultsAdapterTests.java +74 -0
  36. package/android/src/test/java/com/fidelreactlibrary/{ErrorEventEmitterTests.java → events/BridgeLibraryEventEmitterTests.java} +18 -7
  37. package/android/src/test/java/com/fidelreactlibrary/events/BridgeLibraryEventTests.java +17 -0
  38. package/android/src/test/java/com/fidelreactlibrary/events/CardVerificationStartedObserverTests.java +49 -0
  39. package/android/src/test/java/com/fidelreactlibrary/events/ResultsObserverTests.java +38 -0
  40. package/android/src/test/java/com/fidelreactlibrary/fakes/CardSchemeAdapterStub.java +17 -6
  41. package/android/src/test/java/com/fidelreactlibrary/fakes/ConstantsProviderStub.java +2 -2
  42. package/android/src/test/java/com/fidelreactlibrary/fakes/CountryAdapterStub.java +25 -10
  43. package/android/src/test/java/com/fidelreactlibrary/fakes/{DataConverterStub.java → DataAdapterStub.java} +3 -3
  44. package/android/src/test/java/com/fidelreactlibrary/fakes/ProgramTypeAdapterStub.java +31 -0
  45. package/android/src/test/java/com/fidelreactlibrary/fakes/ReactContextMock.java +1 -1
  46. package/android/src/test/java/com/fidelreactlibrary/fakes/ReadableArrayStub.java +82 -0
  47. package/android/src/test/java/com/fidelreactlibrary/fakes/ReadableMapStub.java +175 -40
  48. package/android/src/test/java/com/fidelreactlibrary/fakes/VerificationConfigurationAdapterStub.java +13 -0
  49. package/fidel-react-native.podspec +1 -1
  50. package/index.js +71 -19
  51. package/ios/Adapters/CardSchemesAdapter.swift +13 -0
  52. package/ios/Adapters/ConsentDetailsAdapter.swift +19 -0
  53. package/ios/Adapters/EnrollmentResultAdapter.swift +28 -0
  54. package/ios/Adapters/ErrorResultAdapter.swift +71 -0
  55. package/ios/{FLRNImageAdapter.h → Adapters/FLRNImageFromRNAdapter.h} +2 -3
  56. package/ios/Adapters/FidelSetupAdapter.swift +89 -0
  57. package/ios/Adapters/FidelVerificationConfigurationAdapter.swift +19 -0
  58. package/ios/Adapters/VerificationResultAdapter.swift +17 -0
  59. package/ios/CardVerificationConfigurationProperties.swift +14 -0
  60. package/ios/Constants/CardSchemeConstants.swift +38 -0
  61. package/ios/Constants/CardVerificationChoiceConstants.swift +24 -0
  62. package/ios/Constants/CountryConstants.swift +47 -0
  63. package/ios/Constants/EnrollmentErrorTypeConstants.swift +25 -0
  64. package/ios/Constants/ErrorTypeConstants.swift +37 -0
  65. package/ios/Constants/ExportedConstantsProvider.swift +42 -0
  66. package/ios/Constants/ProgramTypeConstants.swift +30 -0
  67. package/ios/Constants/ResultTypeConstants.swift +35 -0
  68. package/ios/Constants/VerificationErrorTypeConstants.swift +29 -0
  69. package/ios/Events/BridgeLibraryEvent.swift +14 -0
  70. package/ios/Events/CardVerificationChoiceSelectedObserver.swift +23 -0
  71. package/ios/Events/CardVerificationStartedObserver.swift +21 -0
  72. package/ios/Events/EventObserver.swift +13 -0
  73. package/ios/Events/JSResultProperties.swift +15 -0
  74. package/ios/Events/JSResultTypes.swift +14 -0
  75. package/ios/Events/ResultsObserver.swift +37 -0
  76. package/ios/FidelSetupProperties.swift +33 -0
  77. package/ios/NativeFidelBridge.m +11 -0
  78. package/ios/NativeFidelBridge.swift +93 -0
  79. package/package.json +1 -4
  80. package/android/src/main/java/com/fidelreactlibrary/adapters/FidelOptionsAdapter.java +0 -121
  81. package/android/src/main/java/com/fidelreactlibrary/adapters/WritableMapDataConverter.java +0 -94
  82. package/android/src/main/java/com/fidelreactlibrary/adapters/abstraction/DataConverter.java +0 -5
  83. package/android/src/main/java/com/fidelreactlibrary/events/CallbackActivityEventListener.java +0 -64
  84. package/android/src/main/java/com/fidelreactlibrary/events/CallbackInput.java +0 -7
  85. package/android/src/main/java/com/fidelreactlibrary/events/ErrorEventEmitter.java +0 -22
  86. package/android/src/test/java/com/fidelreactlibrary/CallbackActivityEventListenerTests.java +0 -133
  87. package/android/src/test/java/com/fidelreactlibrary/FidelCountryAdapterTests.java +0 -74
  88. package/android/src/test/java/com/fidelreactlibrary/FidelOptionsAdapterTests.java +0 -414
  89. package/android/src/test/java/com/fidelreactlibrary/FidelSetupAdapterTests.java +0 -65
  90. package/android/src/test/java/com/fidelreactlibrary/WritableMapDataConverterTests.java +0 -186
  91. package/android/src/test/java/com/fidelreactlibrary/fakes/CallbackInputSpy.java +0 -12
  92. package/android/src/test/java/com/fidelreactlibrary/fakes/CallbackSpy.java +0 -18
  93. package/android/src/test/java/com/fidelreactlibrary/fakes/IntentMock.java +0 -20
  94. package/ios/FLRNCardSchemesAdapter.h +0 -16
  95. package/ios/FLRNCardSchemesFromJSAdapter.h +0 -14
  96. package/ios/FLRNCardSchemesFromJSAdapter.m +0 -39
  97. package/ios/FLRNConstantsProvider.h +0 -15
  98. package/ios/FLRNImageFromRNAdapter.h +0 -14
  99. package/ios/FLRNObjectToDictionaryAdapter.h +0 -15
  100. package/ios/FLRNOptionsAdapter.h +0 -24
  101. package/ios/FLRNOptionsAdapter.m +0 -133
  102. package/ios/FLRNRuntimeObjectToDictionaryAdapter.h +0 -14
  103. package/ios/FLRNRuntimeObjectToDictionaryAdapter.m +0 -36
  104. package/ios/FLRNSDKOptions.h +0 -24
  105. package/ios/FLRNSDKSetupOptions.h +0 -14
  106. package/ios/FLRNSetupAdapter.h +0 -17
  107. package/ios/FLRNSetupAdapter.m +0 -50
  108. package/ios/Fidel.h +0 -20
  109. package/ios/Fidel.m +0 -79
  110. package/ios/RCTConvert+CardScheme.h +0 -33
  111. package/ios/RCTConvert+Options.h +0 -52
  112. package/ios/RCTConvert+Options.m +0 -21
  113. /package/ios/{FLRNImageFromRNAdapter.m → Adapters/FLRNImageFromRNAdapter.m} +0 -0
@@ -0,0 +1,35 @@
1
+ package com.fidelreactlibrary.adapters;
2
+
3
+ import androidx.annotation.Nullable;
4
+
5
+ import com.fidelapi.entities.CardVerificationConfiguration;
6
+ import com.fidelreactlibrary.adapters.abstraction.VerificationConfigurationAdapter;
7
+ import com.facebook.react.bridge.ReadableMap;
8
+
9
+ public class FidelVerificationConfigurationAdapter implements VerificationConfigurationAdapter {
10
+
11
+ @Override
12
+ public CardVerificationConfiguration adapt(ReadableMap data) {
13
+ String id = "";
14
+ String consentId = "";
15
+ String last4Digits = null;
16
+ if (data != null) {
17
+ id = getStringParam(data, CardVerificationConfigurationProperties.ID, "");
18
+ consentId = getStringParam(data, CardVerificationConfigurationProperties.CONSENT_ID, "");
19
+ last4Digits = getStringParam(data, CardVerificationConfigurationProperties.LAST_4_DIGITS, null);
20
+ }
21
+ return new CardVerificationConfiguration(id, consentId, last4Digits);
22
+ }
23
+
24
+ private static String getStringParam(ReadableMap data, CardVerificationConfigurationProperties key,
25
+ @Nullable String defaultValue) {
26
+ String value = defaultValue;
27
+ if (data.hasKey(key.jsName())) {
28
+ value = data.getString(key.jsName());
29
+ if (value == null) {
30
+ value = defaultValue;
31
+ }
32
+ }
33
+ return value;
34
+ }
35
+ }
@@ -27,7 +27,7 @@ import java.io.IOException;
27
27
  public final class ImageFromReadableMapAdapter implements DataProcessor<ReadableMap> {
28
28
 
29
29
  public DataOutput<Bitmap> bitmapOutput;
30
- private Context context;
30
+ private final Context context;
31
31
 
32
32
  public ImageFromReadableMapAdapter(Context context) {
33
33
  this.context = context;
@@ -35,6 +35,10 @@ public final class ImageFromReadableMapAdapter implements DataProcessor<Readable
35
35
 
36
36
  @Override
37
37
  public void process(ReadableMap data) {
38
+ if (data == null || !data.hasKey("uri")) {
39
+ bitmapOutput.output(null);
40
+ return;
41
+ }
38
42
  String imageURIString = data.getString("uri");
39
43
  Uri imageURI = Uri.parse(imageURIString);
40
44
  if (imageURI.getScheme() != null && (imageURI.getScheme().equals("http") ||
@@ -0,0 +1,288 @@
1
+ package com.fidelreactlibrary.adapters;
2
+
3
+ import androidx.annotation.NonNull;
4
+ import androidx.annotation.Nullable;
5
+
6
+ import com.facebook.react.bridge.WritableMap;
7
+ import com.fidelapi.entities.CardScheme;
8
+ import com.fidelapi.entities.Country;
9
+ import com.fidelapi.entities.EnrollmentErrorType;
10
+ import com.fidelapi.entities.FidelErrorType;
11
+ import com.fidelapi.entities.VerificationErrorType;
12
+ import com.fidelreactlibrary.adapters.abstraction.CardSchemesAdapter;
13
+ import com.fidelreactlibrary.adapters.abstraction.ConstantsProvider;
14
+ import com.fidelreactlibrary.adapters.abstraction.CountryAdapter;
15
+ import com.fidelreactlibrary.adapters.abstraction.DataAdapter;
16
+ import com.fidelreactlibrary.adapters.abstraction.ObjectFactory;
17
+
18
+ import org.json.JSONException;
19
+ import org.json.JSONObject;
20
+
21
+ import java.lang.reflect.Field;
22
+ import java.lang.reflect.Method;
23
+ import java.util.HashMap;
24
+ import java.util.Iterator;
25
+ import java.util.Map;
26
+
27
+ public final class ResultsAdapter implements DataAdapter<Object, WritableMap>, ConstantsProvider {
28
+
29
+ private final ObjectFactory<WritableMap> writableMapFactory;
30
+ private final CountryAdapter countryAdapter;
31
+ private final CardSchemesAdapter cardSchemesAdapter;
32
+
33
+ public ResultsAdapter(ObjectFactory<WritableMap> writableMapFactory,
34
+ CountryAdapter countryAdapter,
35
+ CardSchemesAdapter cardSchemesAdapter) {
36
+ this.writableMapFactory = writableMapFactory;
37
+ this.countryAdapter = countryAdapter;
38
+ this.cardSchemesAdapter = cardSchemesAdapter;
39
+ }
40
+
41
+ @Override
42
+ public WritableMap getAdaptedObjectFor(Object data) {
43
+ if (data == null) {
44
+ return null;
45
+ }
46
+ WritableMap map = writableMapFactory.create();
47
+ for (Field field: data.getClass().getDeclaredFields()) {
48
+ if (field.getType() == String.class) {
49
+ String fieldValue = null;
50
+ try {
51
+ fieldValue = (String)field.get(data);
52
+ } catch (Throwable e) {
53
+ String getterMethodName = String.format("get%s", field.getName());
54
+ for (Method method: data.getClass().getDeclaredMethods()) {
55
+ if (method.getName().toLowerCase().equals(getterMethodName) && method.getReturnType() == String.class) {
56
+ try {
57
+ fieldValue = (String)method.invoke(data);
58
+ } catch (Throwable ignored) {}
59
+ break;
60
+ }
61
+ }
62
+ }
63
+ if (fieldValue != null) {
64
+ map.putString(field.getName(), fieldValue);
65
+ } else {
66
+ map.putNull(field.getName());
67
+ }
68
+ } else if (field.getType() == boolean.class || field.getType() == Boolean.class) {
69
+ try {
70
+ map.putBoolean(field.getName(), field.getBoolean(data));
71
+ } catch (Throwable e) {
72
+ map.putBoolean(field.getName(), false);
73
+ }
74
+ } else if (field.getType() == int.class) {
75
+ try {
76
+ map.putInt(field.getName(), field.getInt(data));
77
+ } catch (Throwable e) {
78
+ map.putInt(field.getName(), -1);
79
+ }
80
+ } else if (field.getType() == long.class) {
81
+ try {
82
+ map.putDouble(field.getName(), field.getLong(data));
83
+ } catch (Throwable e) {
84
+ map.putDouble(field.getName(), (long)-1);
85
+ }
86
+ } else if (field.getType() == JSONObject.class) {
87
+ try {
88
+ JSONObject jsonObject = (JSONObject)field.get(data);
89
+ WritableMap mapToPut = this.getMapFor(jsonObject);
90
+ map.putMap(field.getName(), mapToPut);
91
+ } catch (Throwable e) {
92
+ map.putNull(field.getName());
93
+ }
94
+ } else if (field.getType() == Country.class) {
95
+ try {
96
+ String countryValue = countryAdapter.jsCountryValue((Country)field.get(data));
97
+ map.putString(field.getName(), countryValue);
98
+ } catch (Throwable e) {
99
+ map.putNull(field.getName());
100
+ }
101
+ } else if (field.getType() == CardScheme.class) {
102
+ try {
103
+ String cardSchemeValue = cardSchemesAdapter.jsValue((CardScheme)field.get(data));
104
+ map.putString(field.getName(), cardSchemeValue);
105
+ } catch (Throwable e) {
106
+ map.putNull(field.getName());
107
+ }
108
+ } else if (field.getType() == FidelErrorType.class) {
109
+ try {
110
+ FidelErrorType errorType = (FidelErrorType) field.get(data);
111
+ String jsErrorType = getJSErrorType(errorType);
112
+ map.putString(field.getName(), jsErrorType);
113
+ String jsErrorSubtype = getJSErrorSubtype(errorType);
114
+ if (jsErrorSubtype != null) {
115
+ map.putString("subtype", jsErrorSubtype);
116
+ }
117
+ } catch (Throwable e) {
118
+ map.putString(field.getName(), "unknown");
119
+ }
120
+ }
121
+ }
122
+ return map;
123
+ }
124
+
125
+ @NonNull
126
+ private String getJSErrorType(FidelErrorType errorType) {
127
+ if (errorType == FidelErrorType.UserCanceled.INSTANCE) {
128
+ return "userCanceled";
129
+ } else if (errorType == FidelErrorType.DeviceNotSecure.INSTANCE) {
130
+ return "deviceNotSecure";
131
+ } else if (errorType == FidelErrorType.SdkConfigurationError.INSTANCE) {
132
+ return "sdkConfigurationError";
133
+ } else if (errorType instanceof FidelErrorType.EnrollmentError) {
134
+ return "enrollmentError";
135
+ } else if (errorType instanceof FidelErrorType.VerificationError) {
136
+ return "verificationError";
137
+ }
138
+ return "unknown";
139
+ }
140
+
141
+ @Nullable
142
+ private String getJSErrorSubtype(FidelErrorType errorType) {
143
+ if (errorType instanceof FidelErrorType.EnrollmentError) {
144
+ FidelErrorType.EnrollmentError enrollmentError = (FidelErrorType.EnrollmentError)errorType;
145
+ return enrollmentErrorTypeJSValue(enrollmentError.type);
146
+ } else if (errorType instanceof FidelErrorType.VerificationError) {
147
+ FidelErrorType.VerificationError verificationError = (FidelErrorType.VerificationError)errorType;
148
+ return verificationErrorTypeJSValue(verificationError.type);
149
+ }
150
+ return null;
151
+ }
152
+
153
+ private String enrollmentErrorTypeJSValue(EnrollmentErrorType enrollmentErrorType) {
154
+ switch (enrollmentErrorType) {
155
+ case CARD_ALREADY_EXISTS:
156
+ return "cardAlreadyExists";
157
+ case INVALID_PROGRAM_ID:
158
+ return "invalidProgramId";
159
+ case INVALID_SDK_KEY:
160
+ return "invalidSdkKey";
161
+ case INEXISTENT_PROGRAM:
162
+ return "inexistentProgram";
163
+ case CARD_CONSENT_ISSUER_PROCESSING_CHARGE_ERROR:
164
+ return "cardConsentIssuerProcessingChargeError";
165
+ case CARD_CONSENT_DUPLICATE_TRANSACTION_ERROR:
166
+ return "cardConsentDuplicateTransactionError";
167
+ case CARD_CONSENT_INSUFFICIENT_FUNDS_ERROR:
168
+ return "cardConsentInsufficientFundsError";
169
+ case CARD_CONSENT_PROCESSING_CHARGE_ERROR:
170
+ return "cardConsentProcessingChargeError";
171
+ case CARD_CONSENT_INCORRECT_CARD_DETAILS_ERROR:
172
+ return "cardConsentIncorrectCardDetailsError";
173
+ case CARD_CONSENT_CARD_LIMIT_EXCEEDED:
174
+ return "cardConsentCardLimitExceeded";
175
+ case CARD_CONSENT_ERROR_GENERIC:
176
+ return "cardConsentErrorGeneric";
177
+ case UNAUTHORIZED:
178
+ return "unauthorized";
179
+ case UNEXPECTED:
180
+ return "unexpected";
181
+ }
182
+ return "unexpected";
183
+ }
184
+
185
+ private String verificationErrorTypeJSValue(VerificationErrorType enrollmentErrorType) {
186
+ switch (enrollmentErrorType) {
187
+ case UNEXPECTED:
188
+ return "unexpected";
189
+ case UNAUTHORIZED:
190
+ return "unauthorized";
191
+ case INCORRECT_AMOUNT:
192
+ return "incorrectAmount";
193
+ case MAXIMUM_ATTEMPTS_REACHED:
194
+ return "maximumAttemptsReached";
195
+ case CARD_ALREADY_VERIFIED:
196
+ return "cardAlreadyVerified";
197
+ case CARD_NOT_FOUND:
198
+ return "cardNotFound";
199
+ case VERIFICATION_NOT_FOUND:
200
+ return "verificationNotFound";
201
+ case GENERIC_ERROR:
202
+ return "genericError";
203
+ }
204
+ return "unexpected";
205
+ }
206
+
207
+ @NonNull
208
+ @Override
209
+ public Map<String, Object> getConstants() {
210
+ Map<String, Object> errorConstants = new HashMap<>();
211
+ Map<String, String> errorTypeConstants = new HashMap<>();
212
+ putErrorTypeConstant(errorTypeConstants, FidelErrorType.UserCanceled.INSTANCE);
213
+ putErrorTypeConstant(errorTypeConstants, FidelErrorType.DeviceNotSecure.INSTANCE);
214
+ putErrorTypeConstant(errorTypeConstants, FidelErrorType.SdkConfigurationError.INSTANCE);
215
+ putErrorTypeConstant(errorTypeConstants, new FidelErrorType.EnrollmentError(EnrollmentErrorType.CARD_ALREADY_EXISTS));
216
+ putErrorTypeConstant(errorTypeConstants, new FidelErrorType.VerificationError(VerificationErrorType.CARD_ALREADY_VERIFIED));
217
+ errorConstants.put("ErrorType", errorTypeConstants);
218
+
219
+ Map<String, String> enrollmentErrorTypeConstants = new HashMap<>();
220
+ putEnrollmentErrorTypeConstant(enrollmentErrorTypeConstants, EnrollmentErrorType.CARD_ALREADY_EXISTS);
221
+ putEnrollmentErrorTypeConstant(enrollmentErrorTypeConstants, EnrollmentErrorType.INEXISTENT_PROGRAM);
222
+ putEnrollmentErrorTypeConstant(enrollmentErrorTypeConstants, EnrollmentErrorType.INVALID_PROGRAM_ID);
223
+ putEnrollmentErrorTypeConstant(enrollmentErrorTypeConstants, EnrollmentErrorType.INVALID_SDK_KEY);
224
+ putEnrollmentErrorTypeConstant(enrollmentErrorTypeConstants, EnrollmentErrorType.CARD_CONSENT_ISSUER_PROCESSING_CHARGE_ERROR);
225
+ putEnrollmentErrorTypeConstant(enrollmentErrorTypeConstants, EnrollmentErrorType.CARD_CONSENT_DUPLICATE_TRANSACTION_ERROR);
226
+ putEnrollmentErrorTypeConstant(enrollmentErrorTypeConstants, EnrollmentErrorType.CARD_CONSENT_INSUFFICIENT_FUNDS_ERROR);
227
+ putEnrollmentErrorTypeConstant(enrollmentErrorTypeConstants, EnrollmentErrorType.CARD_CONSENT_PROCESSING_CHARGE_ERROR);
228
+ putEnrollmentErrorTypeConstant(enrollmentErrorTypeConstants, EnrollmentErrorType.CARD_CONSENT_INCORRECT_CARD_DETAILS_ERROR);
229
+ putEnrollmentErrorTypeConstant(enrollmentErrorTypeConstants, EnrollmentErrorType.CARD_CONSENT_CARD_LIMIT_EXCEEDED);
230
+ putEnrollmentErrorTypeConstant(enrollmentErrorTypeConstants, EnrollmentErrorType.CARD_CONSENT_ERROR_GENERIC);
231
+ putEnrollmentErrorTypeConstant(enrollmentErrorTypeConstants, EnrollmentErrorType.UNAUTHORIZED);
232
+ putEnrollmentErrorTypeConstant(enrollmentErrorTypeConstants, EnrollmentErrorType.UNEXPECTED);
233
+ errorConstants.put("EnrollmentErrorType", enrollmentErrorTypeConstants);
234
+
235
+ Map<String, String> verificationErrorTypeConstants = new HashMap<>();
236
+ putVerificationErrorTypeConstant(verificationErrorTypeConstants, VerificationErrorType.GENERIC_ERROR);
237
+ putVerificationErrorTypeConstant(verificationErrorTypeConstants, VerificationErrorType.UNEXPECTED);
238
+ putVerificationErrorTypeConstant(verificationErrorTypeConstants, VerificationErrorType.CARD_ALREADY_VERIFIED);
239
+ putVerificationErrorTypeConstant(verificationErrorTypeConstants, VerificationErrorType.VERIFICATION_NOT_FOUND);
240
+ putVerificationErrorTypeConstant(verificationErrorTypeConstants, VerificationErrorType.MAXIMUM_ATTEMPTS_REACHED);
241
+ putVerificationErrorTypeConstant(verificationErrorTypeConstants, VerificationErrorType.INCORRECT_AMOUNT);
242
+ putVerificationErrorTypeConstant(verificationErrorTypeConstants, VerificationErrorType.UNAUTHORIZED);
243
+ putVerificationErrorTypeConstant(verificationErrorTypeConstants, VerificationErrorType.CARD_NOT_FOUND);
244
+ errorConstants.put("VerificationErrorType", verificationErrorTypeConstants);
245
+ return errorConstants;
246
+ }
247
+
248
+ private void putErrorTypeConstant(Map<String, String> map, FidelErrorType errorType) {
249
+ String errorTypeJSValue = getJSErrorType(errorType);
250
+ map.put(errorTypeJSValue, errorTypeJSValue);
251
+ }
252
+
253
+ private void putEnrollmentErrorTypeConstant(Map<String, String> map, EnrollmentErrorType errorType) {
254
+ String errorTypeJSValue = enrollmentErrorTypeJSValue(errorType);
255
+ map.put(errorTypeJSValue, errorTypeJSValue);
256
+ }
257
+
258
+ private void putVerificationErrorTypeConstant(Map<String, String> map, VerificationErrorType errorType) {
259
+ String errorTypeJSValue = verificationErrorTypeJSValue(errorType);
260
+ map.put(errorTypeJSValue, errorTypeJSValue);
261
+ }
262
+
263
+ private WritableMap getMapFor(JSONObject json) {
264
+ Iterator<String> jsonKeyIterator = json.keys();
265
+ WritableMap map = writableMapFactory.create();
266
+ while (jsonKeyIterator.hasNext()) {
267
+ String key = jsonKeyIterator.next();
268
+ try {
269
+ Object value = json.get(key);
270
+ Class<?> valueClass = value.getClass();
271
+ if (valueClass == String.class) {
272
+ map.putString(key, (String)value);
273
+ } else if (valueClass == Boolean.class) {
274
+ map.putBoolean(key, (boolean)value);
275
+ } else if (valueClass == Integer.class) {
276
+ map.putInt(key, (int)value);
277
+ } else if (valueClass == JSONObject.class) {
278
+ WritableMap mapToPut = this.getMapFor((JSONObject)value);
279
+ map.putMap(key, mapToPut);
280
+ }
281
+ }
282
+ catch (JSONException e) {
283
+ e.printStackTrace();
284
+ }
285
+ }
286
+ return map;
287
+ }
288
+ }
@@ -1,10 +1,14 @@
1
1
  package com.fidelreactlibrary.adapters.abstraction;
2
2
 
3
+ import androidx.annotation.NonNull;
4
+ import androidx.annotation.Nullable;
5
+
3
6
  import com.facebook.react.bridge.ReadableArray;
4
- import com.fidel.sdk.Fidel;
7
+ import com.fidelapi.entities.CardScheme;
5
8
 
6
9
  import java.util.Set;
7
10
 
8
11
  public interface CardSchemesAdapter extends ConstantsProvider {
9
- Set<Fidel.CardScheme> cardSchemesWithReadableArray(ReadableArray cardSchemes);
12
+ @NonNull Set<CardScheme> cardSchemesWithReadableArray(@Nullable ReadableArray cardSchemes);
13
+ @NonNull String jsValue(@NonNull CardScheme cardScheme);
10
14
  }
@@ -0,0 +1,11 @@
1
+ package com.fidelreactlibrary.adapters.abstraction;
2
+
3
+ import androidx.annotation.NonNull;
4
+
5
+ import com.facebook.react.bridge.ReadableMap;
6
+ import com.fidelapi.entities.CardVerificationChoice;
7
+
8
+ public interface CardVerificationChoiceAdapter {
9
+
10
+ ReadableMap adapt(@NonNull CardVerificationChoice cardVerificationChoice);
11
+ }
@@ -1,9 +1,20 @@
1
1
  package com.fidelreactlibrary.adapters.abstraction;
2
2
 
3
+ import androidx.annotation.NonNull;
4
+ import androidx.annotation.Nullable;
5
+
3
6
  import com.facebook.react.bridge.ReadableArray;
4
- import com.fidel.sdk.Fidel;
7
+ import com.fidelapi.entities.Country;
8
+
9
+ import java.util.Set;
5
10
 
6
11
  public interface CountryAdapter extends ConstantsProvider {
7
- Fidel.Country countryWithInteger(int integer);
8
- Fidel.Country[] parseAllowedCountries(ReadableArray inputArray);
12
+ @NonNull
13
+ Set<Country> parseAllowedCountries(@Nullable ReadableArray inputArray);
14
+
15
+ @Nullable
16
+ Country countryWithJSValue(String jsValue);
17
+
18
+ @NonNull
19
+ String jsCountryValue(@NonNull Country country);
9
20
  }
@@ -0,0 +1,5 @@
1
+ package com.fidelreactlibrary.adapters.abstraction;
2
+
3
+ public interface DataAdapter<DataType, AdaptedDataType> {
4
+ AdaptedDataType getAdaptedObjectFor(DataType data);
5
+ }
@@ -0,0 +1,11 @@
1
+ package com.fidelreactlibrary.adapters.abstraction;
2
+
3
+ import androidx.annotation.NonNull;
4
+ import androidx.annotation.Nullable;
5
+
6
+ import com.fidelapi.entities.ProgramType;
7
+
8
+ public interface ProgramTypeAdapter extends ConstantsProvider {
9
+ @NonNull
10
+ ProgramType parseProgramType(@Nullable String programType);
11
+ }
@@ -0,0 +1,9 @@
1
+ package com.fidelreactlibrary.adapters.abstraction;
2
+
3
+ import com.fidelapi.entities.CardVerificationConfiguration;
4
+ import com.facebook.react.bridge.ReadableMap;
5
+
6
+ public interface VerificationConfigurationAdapter {
7
+
8
+ CardVerificationConfiguration adapt(ReadableMap data);
9
+ }
@@ -0,0 +1,17 @@
1
+ package com.fidelreactlibrary.events;
2
+
3
+ public enum BridgeLibraryEvent {
4
+ RESULT_AVAILABLE("ResultAvailable"),
5
+ CARD_VERIFICATION_STARTED("CardVerificationStarted"),
6
+ CARD_VERIFICATION_CHOICE("CardVerificationChoiceSelected");
7
+
8
+ private final String eventName;
9
+
10
+ BridgeLibraryEvent(String eventName) {
11
+ this.eventName = eventName;
12
+ }
13
+
14
+ public String getEventName() {
15
+ return this.eventName;
16
+ }
17
+ }
@@ -0,0 +1,24 @@
1
+ package com.fidelreactlibrary.events;
2
+
3
+ import com.facebook.react.bridge.ReactApplicationContext;
4
+ import com.facebook.react.bridge.ReadableMap;
5
+ import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter;
6
+ import com.fidelreactlibrary.adapters.abstraction.DataProcessor;
7
+
8
+ public final class BridgeLibraryEventEmitter implements DataProcessor<ReadableMap> {
9
+
10
+ private final ReactApplicationContext reactContext;
11
+ private final BridgeLibraryEvent eventToEmit;
12
+
13
+ public BridgeLibraryEventEmitter(ReactApplicationContext reactContext, BridgeLibraryEvent eventToEmit) {
14
+ this.reactContext = reactContext;
15
+ this.eventToEmit = eventToEmit;
16
+ }
17
+
18
+ @Override
19
+ public void process(ReadableMap data) {
20
+ reactContext
21
+ .getJSModule(RCTDeviceEventEmitter.class)
22
+ .emit(eventToEmit.getEventName(), data);
23
+ }
24
+ }
@@ -0,0 +1,29 @@
1
+ package com.fidelreactlibrary.events;
2
+
3
+ import androidx.annotation.NonNull;
4
+
5
+ import com.facebook.react.bridge.ReadableMap;
6
+ import com.facebook.react.bridge.WritableMap;
7
+ import com.fidelapi.entities.CardVerificationChoice;
8
+ import com.fidelapi.entities.abstraction.OnCardVerificationChoiceSelectedObserver;
9
+ import com.fidelapi.utils.FidelExperimental;
10
+ import com.fidelreactlibrary.adapters.abstraction.CardVerificationChoiceAdapter;
11
+ import com.fidelreactlibrary.adapters.abstraction.DataProcessor;
12
+ import com.fidelreactlibrary.adapters.abstraction.ObjectFactory;
13
+
14
+ @FidelExperimental
15
+ public class CardVerificationChoiceObserver implements OnCardVerificationChoiceSelectedObserver {
16
+ private final DataProcessor<ReadableMap> adaptedVerificationChoiceDetailsProcessor;
17
+ private final CardVerificationChoiceAdapter cardVerificationChoiceAdapter;
18
+
19
+ public CardVerificationChoiceObserver(DataProcessor<ReadableMap> adaptedVerificationChoiceDetailsProcessor,
20
+ CardVerificationChoiceAdapter cardVerificationChoiceAdapter) {
21
+ this.adaptedVerificationChoiceDetailsProcessor = adaptedVerificationChoiceDetailsProcessor;
22
+ this.cardVerificationChoiceAdapter = cardVerificationChoiceAdapter;
23
+ }
24
+
25
+ @Override
26
+ public void onCardVerificationChoiceSelected(@NonNull CardVerificationChoice cardVerificationChoice) {
27
+ adaptedVerificationChoiceDetailsProcessor.process(cardVerificationChoiceAdapter.adapt(cardVerificationChoice));
28
+ }
29
+ }
@@ -0,0 +1,31 @@
1
+ package com.fidelreactlibrary.events;
2
+
3
+ import androidx.annotation.NonNull;
4
+
5
+ import com.facebook.react.bridge.ReadableMap;
6
+ import com.facebook.react.bridge.WritableMap;
7
+ import com.fidelapi.entities.ConsentDetails;
8
+ import com.fidelapi.entities.abstraction.OnCardVerificationStartedObserver;
9
+ import com.fidelreactlibrary.adapters.abstraction.DataProcessor;
10
+ import com.fidelreactlibrary.adapters.abstraction.ObjectFactory;
11
+
12
+ public class CardVerificationStartedObserver implements OnCardVerificationStartedObserver {
13
+
14
+ private final DataProcessor<ReadableMap> adaptedConsentDetailsProcessor;
15
+ private final ObjectFactory<WritableMap> writableMapFactory;
16
+
17
+ public CardVerificationStartedObserver(DataProcessor<ReadableMap> adaptedConsentDetailsProcessor,
18
+ ObjectFactory<WritableMap> writableMapFactory) {
19
+ this.adaptedConsentDetailsProcessor = adaptedConsentDetailsProcessor;
20
+ this.writableMapFactory = writableMapFactory;
21
+ }
22
+
23
+ @Override
24
+ public void onCardVerificationStarted(@NonNull ConsentDetails consentDetails) {
25
+ WritableMap map = writableMapFactory.create();
26
+ map.putString("cardId", consentDetails.getCardId());
27
+ map.putString("consentId", consentDetails.getConsentId());
28
+ map.putString("programId", consentDetails.getProgramId());
29
+ adaptedConsentDetailsProcessor.process(map);
30
+ }
31
+ }
@@ -0,0 +1,72 @@
1
+ package com.fidelreactlibrary.events;
2
+
3
+ import androidx.annotation.NonNull;
4
+
5
+ import com.facebook.react.bridge.ReadableMap;
6
+ import com.facebook.react.bridge.WritableMap;
7
+ import com.fidelapi.entities.EnrollmentResult;
8
+ import com.fidelapi.entities.FidelError;
9
+ import com.fidelapi.entities.FidelResult;
10
+ import com.fidelapi.entities.VerificationResult;
11
+ import com.fidelapi.entities.abstraction.OnResultObserver;
12
+ import com.fidelreactlibrary.adapters.abstraction.ConstantsProvider;
13
+ import com.fidelreactlibrary.adapters.abstraction.DataAdapter;
14
+ import com.fidelreactlibrary.adapters.abstraction.DataProcessor;
15
+ import com.fidelreactlibrary.adapters.abstraction.ObjectFactory;
16
+
17
+ import java.util.HashMap;
18
+ import java.util.Map;
19
+
20
+ public final class ResultsObserver implements OnResultObserver, ConstantsProvider {
21
+
22
+ private final DataAdapter<Object, WritableMap> resultAdapter;
23
+ private final DataProcessor<ReadableMap> resultHandler;
24
+ private final ObjectFactory<WritableMap> writableMapFactory;
25
+
26
+ private final String ENROLLMENT_RESULT_TYPE = "EnrollmentResult";
27
+ private final String ERROR_RESULT_TYPE = "Error";
28
+ private final String VERIFICATION_RESULT_TYPE = "VerificationResult";
29
+
30
+ public ResultsObserver(DataAdapter<Object, WritableMap> resultAdapter,
31
+ DataProcessor<ReadableMap> resultHandler,
32
+ ObjectFactory<WritableMap> writableMapFactory) {
33
+ this.resultAdapter = resultAdapter;
34
+ this.resultHandler = resultHandler;
35
+ this.writableMapFactory = writableMapFactory;
36
+ }
37
+
38
+ @Override
39
+ public void onResultAvailable(FidelResult fidelResult) {
40
+ WritableMap resultMap = writableMapFactory.create();
41
+ String RESULT_TYPE_KEY = "type";
42
+ if (fidelResult instanceof FidelResult.Enrollment) {
43
+ EnrollmentResult enrollmentResult = ((FidelResult.Enrollment) fidelResult).getEnrollmentResult();
44
+ WritableMap adaptedObject = resultAdapter.getAdaptedObjectFor(enrollmentResult);
45
+ resultMap.putString(RESULT_TYPE_KEY, ENROLLMENT_RESULT_TYPE);
46
+ resultMap.putMap("enrollmentResult", adaptedObject);
47
+ } else if (fidelResult instanceof FidelResult.Verification) {
48
+ VerificationResult verificationResult = ((FidelResult.Verification) fidelResult).getVerificationResult();
49
+ WritableMap adaptedObject = resultAdapter.getAdaptedObjectFor(verificationResult);
50
+ resultMap.putString(RESULT_TYPE_KEY, VERIFICATION_RESULT_TYPE);
51
+ resultMap.putMap("verificationResult", adaptedObject);
52
+ } else {
53
+ resultMap.putString(RESULT_TYPE_KEY, ERROR_RESULT_TYPE);
54
+ FidelError error = ((FidelResult.Error) fidelResult).getError();
55
+ WritableMap adaptedError = resultAdapter.getAdaptedObjectFor(error);
56
+ resultMap.putMap("error", adaptedError);
57
+ }
58
+ resultHandler.process(resultMap);
59
+ }
60
+
61
+ @NonNull
62
+ @Override
63
+ public Map<String, Object> getConstants() {
64
+ final Map<String, Object> constants = new HashMap<>();
65
+ final Map<String, String> resultTypesMap = new HashMap<>();
66
+ resultTypesMap.put(ENROLLMENT_RESULT_TYPE, ENROLLMENT_RESULT_TYPE);
67
+ resultTypesMap.put(ERROR_RESULT_TYPE, ERROR_RESULT_TYPE);
68
+ resultTypesMap.put(VERIFICATION_RESULT_TYPE, VERIFICATION_RESULT_TYPE);
69
+ constants.put("ResultType", resultTypesMap);
70
+ return constants;
71
+ }
72
+ }