@sanctum-key/react-native-sdk 1.0.8 → 1.0.9

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 (96) hide show
  1. package/README.md +4 -4
  2. package/android/build.gradle +2 -2
  3. package/android/src/main/AndroidManifest.xml +1 -1
  4. package/android/src/main/java/kyc/transfergratis/com/TransfergratisSdkModule.kt +6 -6
  5. package/android/src/main/java/kyc/transfergratis/com/TransfergratisSdkView.kt +2 -2
  6. package/build/package.json +5 -5
  7. package/build/src/App.d.ts +2 -2
  8. package/build/src/App.d.ts.map +1 -1
  9. package/build/src/App.js +2 -2
  10. package/build/src/App.js.map +1 -1
  11. package/build/src/{SanctumKeySdk.types.d.ts → TransfergratisSdk.types.d.ts} +3 -3
  12. package/build/src/TransfergratisSdk.types.d.ts.map +1 -0
  13. package/build/src/TransfergratisSdk.types.js +2 -0
  14. package/build/src/TransfergratisSdk.types.js.map +1 -0
  15. package/build/src/{SanctumKeySdkModule.d.ts → TransfergratisSdkModule.d.ts} +4 -4
  16. package/build/src/TransfergratisSdkModule.d.ts.map +1 -0
  17. package/build/src/{SanctumKeySdkModule.js → TransfergratisSdkModule.js} +2 -2
  18. package/build/src/TransfergratisSdkModule.js.map +1 -0
  19. package/build/src/{SanctumKeySdkModule.web.d.ts → TransfergratisSdkModule.web.d.ts} +4 -4
  20. package/build/src/TransfergratisSdkModule.web.d.ts.map +1 -0
  21. package/build/src/{SanctumKeySdkModule.web.js → TransfergratisSdkModule.web.js} +3 -3
  22. package/build/src/TransfergratisSdkModule.web.js.map +1 -0
  23. package/build/src/TransfergratisSdkView.d.ts +4 -0
  24. package/build/src/TransfergratisSdkView.d.ts.map +1 -0
  25. package/build/src/TransfergratisSdkView.js +7 -0
  26. package/build/src/TransfergratisSdkView.js.map +1 -0
  27. package/build/src/TransfergratisSdkView.web.d.ts +4 -0
  28. package/build/src/TransfergratisSdkView.web.d.ts.map +1 -0
  29. package/build/src/{SanctumKeySdkView.web.js → TransfergratisSdkView.web.js} +2 -2
  30. package/build/src/TransfergratisSdkView.web.js.map +1 -0
  31. package/build/src/api/axios.js +2 -2
  32. package/build/src/api/axios.js.map +1 -1
  33. package/build/src/components/EnhancedCameraView.d.ts.map +1 -1
  34. package/build/src/components/EnhancedCameraView.js +12 -61
  35. package/build/src/components/EnhancedCameraView.js.map +1 -1
  36. package/build/src/components/KYCElements/EmailVerificationTemplate.d.ts.map +1 -1
  37. package/build/src/components/KYCElements/EmailVerificationTemplate.js +11 -32
  38. package/build/src/components/KYCElements/EmailVerificationTemplate.js.map +1 -1
  39. package/build/src/components/KYCElements/IDCardCapture.js +2 -1
  40. package/build/src/components/KYCElements/IDCardCapture.js.map +1 -1
  41. package/build/src/components/KYCElements/PhoneVerificationTemplate.d.ts.map +1 -1
  42. package/build/src/components/KYCElements/PhoneVerificationTemplate.js +22 -163
  43. package/build/src/components/KYCElements/PhoneVerificationTemplate.js.map +1 -1
  44. package/build/src/components/NativeCameraView.js +1 -1
  45. package/build/src/components/NativeCameraView.js.map +1 -1
  46. package/build/src/config/KYCConfig.js +1 -1
  47. package/build/src/config/KYCConfig.js.map +1 -1
  48. package/build/src/config/allowedDomains.js +6 -6
  49. package/build/src/config/allowedDomains.js.map +1 -1
  50. package/build/src/index.d.ts +3 -3
  51. package/build/src/index.d.ts.map +1 -1
  52. package/build/src/index.js +3 -3
  53. package/build/src/index.js.map +1 -1
  54. package/build/src/modules/api/KYCService.d.ts +3 -3
  55. package/build/src/modules/api/KYCService.d.ts.map +1 -1
  56. package/build/src/modules/api/KYCService.js +25 -32
  57. package/build/src/modules/api/KYCService.js.map +1 -1
  58. package/build/src/modules/camera/NativeCameraModule.js +17 -17
  59. package/build/src/modules/camera/NativeCameraModule.js.map +1 -1
  60. package/expo-module.config.json +2 -2
  61. package/ios/TransfergratisSdk.podspec +2 -2
  62. package/ios/TransfergratisSdkModule.swift +12 -12
  63. package/package.json +5 -5
  64. package/src/App.tsx +2 -2
  65. package/src/{SanctumKeySdk.types.ts → TransfergratisSdk.types.ts} +2 -2
  66. package/src/{SanctumKeySdkModule.ts → TransfergratisSdkModule.ts} +3 -3
  67. package/src/{SanctumKeySdkModule.web.ts → TransfergratisSdkModule.web.ts} +3 -3
  68. package/src/TransfergratisSdkView.tsx +11 -0
  69. package/src/{SanctumKeySdkView.web.tsx → TransfergratisSdkView.web.tsx} +2 -2
  70. package/src/api/axios.ts +2 -2
  71. package/src/components/EnhancedCameraView.tsx +34 -99
  72. package/src/components/KYCElements/EmailVerificationTemplate.tsx +10 -36
  73. package/src/components/KYCElements/IDCardCapture.tsx +1 -1
  74. package/src/components/KYCElements/PhoneVerificationTemplate.tsx +30 -204
  75. package/src/components/NativeCameraView.tsx +1 -1
  76. package/src/config/KYCConfig.ts +1 -1
  77. package/src/config/allowedDomains.ts +6 -6
  78. package/src/i18n/README.md +1 -1
  79. package/src/index.ts +3 -3
  80. package/src/modules/api/KYCService.ts +26 -37
  81. package/src/modules/camera/NativeCameraModule.ts +17 -17
  82. package/build/src/SanctumKeySdk.types.d.ts.map +0 -1
  83. package/build/src/SanctumKeySdk.types.js +0 -2
  84. package/build/src/SanctumKeySdk.types.js.map +0 -1
  85. package/build/src/SanctumKeySdkModule.d.ts.map +0 -1
  86. package/build/src/SanctumKeySdkModule.js.map +0 -1
  87. package/build/src/SanctumKeySdkModule.web.d.ts.map +0 -1
  88. package/build/src/SanctumKeySdkModule.web.js.map +0 -1
  89. package/build/src/SanctumKeySdkView.d.ts +0 -4
  90. package/build/src/SanctumKeySdkView.d.ts.map +0 -1
  91. package/build/src/SanctumKeySdkView.js +0 -7
  92. package/build/src/SanctumKeySdkView.js.map +0 -1
  93. package/build/src/SanctumKeySdkView.web.d.ts +0 -4
  94. package/build/src/SanctumKeySdkView.web.d.ts.map +0 -1
  95. package/build/src/SanctumKeySdkView.web.js.map +0 -1
  96. package/src/SanctumKeySdkView.tsx +0 -11
@@ -1,22 +1,10 @@
1
1
  import React, { useState, useRef, useEffect } from 'react';
2
- import { View, Text, StyleSheet, TextInput, TouchableOpacity, Alert, Pressable, Modal, FlatList } from 'react-native';
2
+ import { View, Text, StyleSheet, TextInput, TouchableOpacity, Alert, Pressable } from 'react-native';
3
3
  import { useTemplateKYCFlowContext } from '../../hooks/useTemplateKYCFlow';
4
4
  import { useI18n } from '../../hooks/useI18n';
5
5
  import { Button } from '../ui/Button';
6
6
  import kycService, { errorMessage } from '../../modules/api/KYCService';
7
7
  const CODE_LENGTH = 6;
8
- // Easily expand this list with any countries your app supports
9
- const COUNTRY_CODES = [
10
- { code: '+254', label: '🇰🇪 Kenya (+254)' },
11
- { code: '+255', label: '🇹🇿 Tanzania (+255)' },
12
- { code: '+256', label: '🇺🇬 Uganda (+256)' },
13
- { code: '+250', label: '🇷🇼 Rwanda (+250)' },
14
- { code: '+234', label: '🇳🇬 Nigeria (+234)' },
15
- { code: '+27', label: '🇿🇦 South Africa (+27)' },
16
- { code: '+44', label: '🇬🇧 UK (+44)' },
17
- { code: '+1', label: '🇺🇸 US/Canada (+1)' },
18
- { code: '+91', label: '🇮🇳 India (+91)' },
19
- ];
20
8
  export const PhoneVerificationTemplate = ({ component, value, onValueChange, error: propError, }) => {
21
9
  const { actions, getLocalizedText, state, apiKey } = useTemplateKYCFlowContext();
22
10
  const { t } = useI18n();
@@ -24,14 +12,10 @@ export const PhoneVerificationTemplate = ({ component, value, onValueChange, err
24
12
  const sessionId = state.session?.session_id || '';
25
13
  // State
26
14
  const [step, setStep] = useState('phone');
27
- const [countryCode, setCountryCode] = useState('+254');
28
15
  const [phone, setPhone] = useState('');
29
- const [showCountryPicker, setShowCountryPicker] = useState(false);
30
16
  const [otp, setOtp] = useState('');
31
17
  const [localError, setLocalError] = useState(null);
32
18
  const [isSimulating, setIsSimulating] = useState(false);
33
- // 🚨 NEW: Track actual focus state for visual feedback
34
- const [isInputFocused, setIsInputFocused] = useState(false);
35
19
  const inputRef = useRef(null);
36
20
  const title = getLocalizedText(component.labels);
37
21
  const instructions = getLocalizedText(component.instructions);
@@ -44,19 +28,6 @@ export const PhoneVerificationTemplate = ({ component, value, onValueChange, err
44
28
  handleVerifyCode();
45
29
  }
46
30
  }, [otp]);
47
- // --- AUTO FOCUS LOGIC ---
48
- useEffect(() => {
49
- let focusTimer;
50
- if (step === 'otp' && !isSimulating) {
51
- focusTimer = setTimeout(() => {
52
- inputRef.current?.focus();
53
- }, 100);
54
- }
55
- return () => {
56
- if (focusTimer)
57
- clearTimeout(focusTimer);
58
- };
59
- }, [step, isSimulating]); // 🚨 Must watch both states
60
31
  const handleSendCode = async () => {
61
32
  const trimmedPhone = phone.trim();
62
33
  if (!trimmedPhone || trimmedPhone.length < 5) {
@@ -65,10 +36,11 @@ export const PhoneVerificationTemplate = ({ component, value, onValueChange, err
65
36
  }
66
37
  setLocalError(null);
67
38
  setIsSimulating(true);
68
- const fullPhoneNumber = `${countryCode}${trimmedPhone}`;
69
39
  try {
70
- await kycService.sendWhatsAppVerificationCode(sessionId, fullPhoneNumber, auth);
40
+ await kycService.sendWhatsAppVerificationCode(sessionId, trimmedPhone, auth);
71
41
  setStep('otp');
42
+ // Auto-focus the OTP input shortly after switching steps
43
+ setTimeout(() => inputRef.current?.focus(), 100);
72
44
  }
73
45
  catch (err) {
74
46
  const msg = errorMessage(err) ?? err?.message ?? (t('errors.sendCodeFailed') || 'Failed to send verification code');
@@ -85,18 +57,16 @@ export const PhoneVerificationTemplate = ({ component, value, onValueChange, err
85
57
  }
86
58
  setLocalError(null);
87
59
  setIsSimulating(true);
88
- const fullPhoneNumber = `${countryCode}${phone.trim()}`;
89
60
  try {
90
- await kycService.verifyWhatsAppCode(sessionId, otp.trim(), fullPhoneNumber, auth);
91
- const data = { phone: fullPhoneNumber, otp, verified: true };
61
+ await kycService.verifyWhatsAppCode(sessionId, otp.trim(), auth);
62
+ const data = { phone, otp, verified: true };
92
63
  onValueChange(data);
93
64
  actions.nextComponent(data);
94
65
  }
95
66
  catch (err) {
96
67
  const msg = errorMessage(err) ?? err?.message ?? (t('errors.wrongCode') || 'Invalid verification code');
97
68
  setLocalError(typeof msg === 'string' ? msg : JSON.stringify(msg));
98
- setOtp('');
99
- // Refocus so they can type immediately after an error
69
+ setOtp(''); // Clear the boxes on error so they can type again
100
70
  inputRef.current?.focus();
101
71
  }
102
72
  finally {
@@ -104,12 +74,12 @@ export const PhoneVerificationTemplate = ({ component, value, onValueChange, err
104
74
  }
105
75
  };
106
76
  const onChangePhone = (text) => {
107
- const cleaned = text.replace(/[^0-9]/g, '');
108
- setPhone(cleaned);
77
+ setPhone(text);
109
78
  if (localError)
110
79
  setLocalError(null);
111
80
  };
112
81
  const onChangeOtp = (text) => {
82
+ // Only allow numbers
113
83
  const cleaned = text.replace(/[^0-9]/g, '');
114
84
  setOtp(cleaned);
115
85
  if (localError)
@@ -125,15 +95,12 @@ export const PhoneVerificationTemplate = ({ component, value, onValueChange, err
125
95
  return (<Pressable style={styles.otpBoxesContainer} onPress={() => inputRef.current?.focus()}>
126
96
  {boxes.map((_, index) => {
127
97
  const digit = otp[index] || '';
98
+ const isCurrent = index === otp.length;
128
99
  const isFilled = index < otp.length;
129
- // 🚨 NEW: Only highlight if the input is ACTUALLY focused.
130
- // Highlights the next empty box, or the last box if full.
131
- const isActiveIndex = index === otp.length || (index === CODE_LENGTH - 1 && otp.length === CODE_LENGTH);
132
- const isCurrent = isInputFocused && isActiveIndex;
133
100
  return (<View key={index} style={[
134
101
  styles.otpBox,
135
- isFilled && styles.otpBoxFilled,
136
- isCurrent && styles.otpBoxActive // Active overrides filled
102
+ isCurrent && styles.otpBoxActive,
103
+ isFilled && styles.otpBoxFilled
137
104
  ]}>
138
105
  <Text style={styles.otpBoxText}>{digit}</Text>
139
106
  </View>);
@@ -143,27 +110,20 @@ export const PhoneVerificationTemplate = ({ component, value, onValueChange, err
143
110
  return (<View style={styles.container}>
144
111
  <Text style={styles.title}>{title}</Text>
145
112
  <Text style={styles.instructions}>
146
- {step === 'phone' ? instructions : (t('kyc.enterCodeSent') || `Please enter the code sent to ${countryCode} ${phone}`)}
113
+ {step === 'phone' ? instructions : (t('kyc.enterCodeSent') || `Please enter the code sent to ${phone}`)}
147
114
  </Text>
148
115
 
149
116
  <View style={styles.contentContainer}>
150
117
  {step === 'phone' ? (<View style={styles.inputContainer}>
151
118
  <Text style={styles.label}>{t('common.phone') || 'Phone Number'}</Text>
152
-
153
- <View style={styles.phoneInputRow}>
154
- <TouchableOpacity style={styles.countryPickerBtn} onPress={() => setShowCountryPicker(true)} disabled={isSimulating}>
155
- <Text style={styles.countryPickerText}>{countryCode}</Text>
156
- <Text style={styles.dropdownIcon}>▼</Text>
157
- </TouchableOpacity>
158
-
159
- <TextInput style={styles.phoneInput} placeholder="712 345 678" value={phone} onChangeText={onChangePhone} keyboardType="phone-pad" autoComplete="tel" editable={!isSimulating}/>
160
- </View>
119
+ <TextInput style={styles.input} placeholder="+1234567890" value={phone} onChangeText={onChangePhone} keyboardType="phone-pad" autoComplete="tel" editable={!isSimulating}/>
161
120
  </View>) : (<View style={styles.inputContainer}>
162
121
  <Text style={styles.label}>{t('common.verificationCode') || 'Verification Code'}</Text>
163
122
 
164
123
  <View style={styles.otpWrapper}>
165
- {renderOtpBoxes()}
166
- <TextInput ref={inputRef} style={styles.hiddenInput} value={otp} onChangeText={onChangeOtp} keyboardType="number-pad" maxLength={CODE_LENGTH} editable={!isSimulating} textContentType="oneTimeCode" caretHidden={true} onFocus={() => setIsInputFocused(true)} onBlur={() => setIsInputFocused(false)}/>
124
+ {renderOtpBoxes()}
125
+ {/* Hidden TextInput overlaid to handle native keyboard & pasting seamlessly */}
126
+ <TextInput ref={inputRef} style={styles.hiddenInput} value={otp} onChangeText={onChangeOtp} keyboardType="number-pad" maxLength={CODE_LENGTH} editable={!isSimulating} textContentType="oneTimeCode" caretHidden={true}/>
167
127
  </View>
168
128
 
169
129
  <TouchableOpacity onPress={handleBackToPhone} style={styles.changeLink} disabled={isSimulating}>
@@ -181,12 +141,9 @@ export const PhoneVerificationTemplate = ({ component, value, onValueChange, err
181
141
  return;
182
142
  setLocalError(null);
183
143
  setIsSimulating(true);
184
- const fullPhoneNumber = `${countryCode}${phone.trim()}`;
185
144
  try {
186
- await kycService.sendWhatsAppVerificationCode(sessionId, fullPhoneNumber, auth);
187
- Alert.alert(t('common.codeResent') || 'Code Resent', t('common.codeResentMessage', { email: fullPhoneNumber }) || 'Code resent to ' + fullPhoneNumber);
188
- // Refocus after resending
189
- inputRef.current?.focus();
145
+ await kycService.sendWhatsAppVerificationCode(sessionId, phone.trim(), auth);
146
+ Alert.alert(t('common.codeResent') || 'Code Resent', t('common.codeResentMessage', { email: phone }) || 'Code resent to ' + phone);
190
147
  }
191
148
  catch (err) {
192
149
  const msg = errorMessage(err) ?? err?.message ?? (t('errors.sendCodeFailed') || 'Failed to send code');
@@ -199,31 +156,9 @@ export const PhoneVerificationTemplate = ({ component, value, onValueChange, err
199
156
  <Text style={styles.resendText}>{t('common.resendCode') || 'Resend Code'}</Text>
200
157
  </TouchableOpacity>)}
201
158
  </View>
202
-
203
- {/* COUNTRY PICKER MODAL */}
204
- <Modal visible={showCountryPicker} animationType="slide" transparent={true} onRequestClose={() => setShowCountryPicker(false)}>
205
- <TouchableOpacity style={styles.modalOverlay} activeOpacity={1} onPress={() => setShowCountryPicker(false)}>
206
- <View style={styles.modalContent}>
207
- <View style={styles.modalHeader}>
208
- <Text style={styles.modalTitle}>Select Country</Text>
209
- <TouchableOpacity onPress={() => setShowCountryPicker(false)}>
210
- <Text style={styles.modalClose}>✕</Text>
211
- </TouchableOpacity>
212
- </View>
213
- <FlatList data={COUNTRY_CODES} keyExtractor={(item) => item.code} renderItem={({ item }) => (<TouchableOpacity style={styles.countryItem} onPress={() => {
214
- setCountryCode(item.code);
215
- setShowCountryPicker(false);
216
- }}>
217
- <Text style={styles.countryItemLabel}>{item.label}</Text>
218
- {countryCode === item.code && <Text style={styles.checkMark}>✓</Text>}
219
- </TouchableOpacity>)}/>
220
- </View>
221
- </TouchableOpacity>
222
- </Modal>
223
159
  </View>);
224
160
  };
225
161
  const styles = StyleSheet.create({
226
- // ... Keeping all previous styles identical for safety ...
227
162
  container: {
228
163
  padding: 24,
229
164
  backgroundColor: 'white',
@@ -261,35 +196,7 @@ const styles = StyleSheet.create({
261
196
  marginBottom: 8,
262
197
  marginLeft: 4,
263
198
  },
264
- phoneInputRow: {
265
- flexDirection: 'row',
266
- alignItems: 'center',
267
- gap: 10,
268
- },
269
- countryPickerBtn: {
270
- flexDirection: 'row',
271
- alignItems: 'center',
272
- justifyContent: 'space-between',
273
- borderWidth: 1,
274
- borderColor: '#e0e0e0',
275
- paddingHorizontal: 12,
276
- paddingVertical: 16,
277
- borderRadius: 12,
278
- backgroundColor: '#f8f9fa',
279
- minWidth: 90,
280
- },
281
- countryPickerText: {
282
- fontSize: 16,
283
- color: '#333',
284
- fontWeight: '600',
285
- },
286
- dropdownIcon: {
287
- fontSize: 12,
288
- color: '#666',
289
- marginLeft: 8,
290
- },
291
- phoneInput: {
292
- flex: 1,
199
+ input: {
293
200
  borderWidth: 1,
294
201
  borderColor: '#e0e0e0',
295
202
  padding: 16,
@@ -298,54 +205,6 @@ const styles = StyleSheet.create({
298
205
  backgroundColor: '#f8f9fa',
299
206
  color: '#333',
300
207
  },
301
- modalOverlay: {
302
- flex: 1,
303
- backgroundColor: 'rgba(0,0,0,0.5)',
304
- justifyContent: 'flex-end',
305
- },
306
- modalContent: {
307
- backgroundColor: 'white',
308
- borderTopLeftRadius: 24,
309
- borderTopRightRadius: 24,
310
- maxHeight: '60%',
311
- paddingBottom: 40,
312
- },
313
- modalHeader: {
314
- flexDirection: 'row',
315
- justifyContent: 'space-between',
316
- alignItems: 'center',
317
- padding: 20,
318
- borderBottomWidth: 1,
319
- borderBottomColor: '#f0f0f0',
320
- },
321
- modalTitle: {
322
- fontSize: 18,
323
- fontWeight: '700',
324
- color: '#1a1a1a',
325
- },
326
- modalClose: {
327
- fontSize: 20,
328
- color: '#666',
329
- padding: 5,
330
- },
331
- countryItem: {
332
- flexDirection: 'row',
333
- justifyContent: 'space-between',
334
- alignItems: 'center',
335
- paddingVertical: 16,
336
- paddingHorizontal: 24,
337
- borderBottomWidth: 1,
338
- borderBottomColor: '#f8f9fa',
339
- },
340
- countryItemLabel: {
341
- fontSize: 16,
342
- color: '#333',
343
- },
344
- checkMark: {
345
- color: '#2DBD60',
346
- fontSize: 18,
347
- fontWeight: 'bold',
348
- },
349
208
  otpWrapper: {
350
209
  position: 'relative',
351
210
  width: '100%',
@@ -360,7 +219,7 @@ const styles = StyleSheet.create({
360
219
  },
361
220
  otpBox: {
362
221
  width: '14%',
363
- aspectRatio: 1,
222
+ aspectRatio: 1, // keeps it perfectly square
364
223
  borderWidth: 1,
365
224
  borderColor: '#e0e0e0',
366
225
  borderRadius: 12,
@@ -388,7 +247,7 @@ const styles = StyleSheet.create({
388
247
  left: 0,
389
248
  width: '100%',
390
249
  height: '100%',
391
- opacity: 0,
250
+ opacity: 0, // completely invisible but handles native keyboard interactions perfectly
392
251
  },
393
252
  errorText: {
394
253
  color: '#dc2626',
@@ -1 +1 @@
1
- {"version":3,"file":"PhoneVerificationTemplate.js","sourceRoot":"","sources":["../../../../src/components/KYCElements/PhoneVerificationTemplate.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useRef, useEffect } from 'react';\nimport { View, Text, StyleSheet, TextInput, TouchableOpacity, Alert, Pressable, Modal, FlatList } from 'react-native';\nimport { TemplateComponent, LocalizedText } from '../../types/KYC.types';\nimport { useTemplateKYCFlowContext } from '../../hooks/useTemplateKYCFlow';\nimport { useI18n } from '../../hooks/useI18n';\nimport { Button } from '../ui/Button';\nimport kycService, { errorMessage } from '../../modules/api/KYCService';\n\ninterface PhoneVerificationTemplateProps {\n component: TemplateComponent;\n value?: any;\n onValueChange: (data: any) => void;\n error?: string;\n language?: string;\n}\n\ntype VerificationStep = 'phone' | 'otp';\nconst CODE_LENGTH = 6;\n\n// Easily expand this list with any countries your app supports\nconst COUNTRY_CODES = [\n { code: '+254', label: '🇰🇪 Kenya (+254)' },\n { code: '+255', label: '🇹🇿 Tanzania (+255)' },\n { code: '+256', label: '🇺🇬 Uganda (+256)' },\n { code: '+250', label: '🇷🇼 Rwanda (+250)' },\n { code: '+234', label: '🇳🇬 Nigeria (+234)' },\n { code: '+27', label: '🇿🇦 South Africa (+27)' },\n { code: '+44', label: '🇬🇧 UK (+44)' },\n { code: '+1', label: '🇺🇸 US/Canada (+1)' },\n { code: '+91', label: '🇮🇳 India (+91)' },\n];\n\nexport const PhoneVerificationTemplate: React.FC<PhoneVerificationTemplateProps> = ({\n component,\n value,\n onValueChange,\n error: propError,\n}) => {\n const { actions, getLocalizedText, state, apiKey } = useTemplateKYCFlowContext();\n const { t } = useI18n();\n\n const auth = apiKey ? { apiKey } : (state.session?.token ? { token: state.session.token } : undefined);\n const sessionId = state.session?.session_id || '';\n\n // State\n const [step, setStep] = useState<VerificationStep>('phone');\n const [countryCode, setCountryCode] = useState('+254');\n const [phone, setPhone] = useState('');\n const [showCountryPicker, setShowCountryPicker] = useState(false);\n \n const [otp, setOtp] = useState('');\n const [localError, setLocalError] = useState<string | null>(null);\n const [isSimulating, setIsSimulating] = useState(false);\n \n // 🚨 NEW: Track actual focus state for visual feedback\n const [isInputFocused, setIsInputFocused] = useState(false); \n\n const inputRef = useRef<TextInput>(null);\n\n const title = getLocalizedText(component.labels as LocalizedText);\n const instructions = getLocalizedText(component.instructions as LocalizedText);\n\n const verifyButtonText = getLocalizedText((component.ui as any).buttonText) || t('common.verify') || 'Verify';\n const sendButtonText = t('common.sendCode') || 'Send Verification Code';\n const buttonText = step === 'phone' ? sendButtonText : verifyButtonText;\n\n // --- AUTO SUBMIT LOGIC ---\n useEffect(() => {\n if (otp.length === CODE_LENGTH && step === 'otp' && !isSimulating) {\n handleVerifyCode();\n }\n }, [otp]);\n\n // --- AUTO FOCUS LOGIC ---\n useEffect(() => {\n let focusTimer: ReturnType<typeof setTimeout>;\n \n if (step === 'otp' && !isSimulating) {\n focusTimer = setTimeout(() => {\n inputRef.current?.focus();\n }, 100); \n }\n \n return () => {\n if (focusTimer) clearTimeout(focusTimer);\n };\n }, [step, isSimulating]); // 🚨 Must watch both states\n\n const handleSendCode = async () => {\n const trimmedPhone = phone.trim();\n if (!trimmedPhone || trimmedPhone.length < 5) {\n setLocalError(t('errors.invalidPhone') || 'Please enter a valid phone number');\n return;\n }\n\n setLocalError(null);\n setIsSimulating(true);\n\n const fullPhoneNumber = `${countryCode}${trimmedPhone}`;\n\n try {\n await kycService.sendWhatsAppVerificationCode(sessionId, fullPhoneNumber, auth);\n setStep('otp');\n } catch (err: any) {\n const msg = errorMessage(err) ?? err?.message ?? (t('errors.sendCodeFailed') || 'Failed to send verification code');\n setLocalError(typeof msg === 'string' ? msg : JSON.stringify(msg));\n } finally {\n setIsSimulating(false);\n }\n };\n\n const handleVerifyCode = async () => {\n if (!otp || otp.length < CODE_LENGTH) {\n setLocalError(t('errors.invalidCode') || 'Please enter the 6-digit code');\n return;\n }\n\n setLocalError(null);\n setIsSimulating(true);\n \n const fullPhoneNumber = `${countryCode}${phone.trim()}`;\n\n try {\n await kycService.verifyWhatsAppCode(sessionId, otp.trim(), fullPhoneNumber, auth);\n \n const data = { phone: fullPhoneNumber, otp, verified: true };\n onValueChange(data);\n actions.nextComponent(data);\n } catch (err: any) {\n const msg = errorMessage(err) ?? err?.message ?? (t('errors.wrongCode') || 'Invalid verification code');\n setLocalError(typeof msg === 'string' ? msg : JSON.stringify(msg));\n setOtp('');\n // Refocus so they can type immediately after an error\n inputRef.current?.focus(); \n } finally {\n setIsSimulating(false);\n }\n };\n\n const onChangePhone = (text: string) => {\n const cleaned = text.replace(/[^0-9]/g, '');\n setPhone(cleaned);\n if (localError) setLocalError(null);\n };\n\n const onChangeOtp = (text: string) => {\n const cleaned = text.replace(/[^0-9]/g, '');\n setOtp(cleaned);\n if (localError) setLocalError(null);\n };\n\n const handleBackToPhone = () => {\n setStep('phone');\n setOtp('');\n setLocalError(null);\n };\n\n const renderOtpBoxes = () => {\n const boxes = new Array(CODE_LENGTH).fill(0);\n return (\n <Pressable style={styles.otpBoxesContainer} onPress={() => inputRef.current?.focus()}>\n {boxes.map((_, index) => {\n const digit = otp[index] || '';\n const isFilled = index < otp.length;\n \n // 🚨 NEW: Only highlight if the input is ACTUALLY focused. \n // Highlights the next empty box, or the last box if full.\n const isActiveIndex = index === otp.length || (index === CODE_LENGTH - 1 && otp.length === CODE_LENGTH);\n const isCurrent = isInputFocused && isActiveIndex;\n\n return (\n <View \n key={index} \n style={[\n styles.otpBox, \n isFilled && styles.otpBoxFilled,\n isCurrent && styles.otpBoxActive // Active overrides filled\n ]}\n >\n <Text style={styles.otpBoxText}>{digit}</Text>\n </View>\n );\n })}\n </Pressable>\n );\n };\n\n return (\n <View style={styles.container}>\n <Text style={styles.title}>{title}</Text>\n <Text style={styles.instructions}>\n {step === 'phone' ? instructions : (t('kyc.enterCodeSent') || `Please enter the code sent to ${countryCode} ${phone}`)}\n </Text>\n\n <View style={styles.contentContainer}>\n {step === 'phone' ? (\n <View style={styles.inputContainer}>\n <Text style={styles.label}>{t('common.phone') || 'Phone Number'}</Text>\n \n <View style={styles.phoneInputRow}>\n <TouchableOpacity \n style={styles.countryPickerBtn} \n onPress={() => setShowCountryPicker(true)}\n disabled={isSimulating}\n >\n <Text style={styles.countryPickerText}>{countryCode}</Text>\n <Text style={styles.dropdownIcon}>▼</Text>\n </TouchableOpacity>\n\n <TextInput\n style={styles.phoneInput}\n placeholder=\"712 345 678\"\n value={phone}\n onChangeText={onChangePhone}\n keyboardType=\"phone-pad\"\n autoComplete=\"tel\"\n editable={!isSimulating}\n />\n </View>\n </View>\n ) : (\n <View style={styles.inputContainer}>\n <Text style={styles.label}>{t('common.verificationCode') || 'Verification Code'}</Text>\n \n <View style={styles.otpWrapper}>\n {renderOtpBoxes()} \n <TextInput\n ref={inputRef}\n style={styles.hiddenInput}\n value={otp}\n onChangeText={onChangeOtp}\n keyboardType=\"number-pad\"\n maxLength={CODE_LENGTH}\n editable={!isSimulating}\n textContentType=\"oneTimeCode\"\n caretHidden={true}\n onFocus={() => setIsInputFocused(true)}\n onBlur={() => setIsInputFocused(false)}\n />\n </View>\n\n <TouchableOpacity onPress={handleBackToPhone} style={styles.changeLink} disabled={isSimulating}>\n <Text style={styles.changeText}>{t('common.back') || 'Change number'}</Text>\n </TouchableOpacity>\n </View>\n )}\n\n {(localError || propError) && (\n <Text style={styles.errorText}>{localError || propError}</Text>\n )}\n\n <Button\n title={isSimulating ? (t('common.processing') || 'Processing...') : buttonText}\n onPress={step === 'phone' ? handleSendCode : handleVerifyCode}\n style={styles.button}\n disabled={\n isSimulating ||\n (step === 'phone' ? !phone : otp.length < CODE_LENGTH)\n }\n />\n\n {step === 'otp' && (\n <TouchableOpacity\n onPress={async () => {\n if (isSimulating) return;\n setLocalError(null);\n setIsSimulating(true);\n const fullPhoneNumber = `${countryCode}${phone.trim()}`;\n try {\n await kycService.sendWhatsAppVerificationCode(sessionId, fullPhoneNumber, auth);\n Alert.alert(\n t('common.codeResent') || 'Code Resent',\n t('common.codeResentMessage', { email: fullPhoneNumber }) || 'Code resent to ' + fullPhoneNumber\n );\n // Refocus after resending\n inputRef.current?.focus();\n } catch (err: any) {\n const msg = errorMessage(err) ?? err?.message ?? (t('errors.sendCodeFailed') || 'Failed to send code');\n setLocalError(typeof msg === 'string' ? msg : JSON.stringify(msg));\n } finally {\n setIsSimulating(false);\n }\n }}\n style={styles.resendButton}\n disabled={isSimulating}\n >\n <Text style={styles.resendText}>{t('common.resendCode') || 'Resend Code'}</Text>\n </TouchableOpacity>\n )}\n </View>\n\n {/* COUNTRY PICKER MODAL */}\n <Modal\n visible={showCountryPicker}\n animationType=\"slide\"\n transparent={true}\n onRequestClose={() => setShowCountryPicker(false)}\n >\n <TouchableOpacity \n style={styles.modalOverlay} \n activeOpacity={1} \n onPress={() => setShowCountryPicker(false)}\n >\n <View style={styles.modalContent}>\n <View style={styles.modalHeader}>\n <Text style={styles.modalTitle}>Select Country</Text>\n <TouchableOpacity onPress={() => setShowCountryPicker(false)}>\n <Text style={styles.modalClose}>✕</Text>\n </TouchableOpacity>\n </View>\n <FlatList\n data={COUNTRY_CODES}\n keyExtractor={(item) => item.code}\n renderItem={({ item }) => (\n <TouchableOpacity \n style={styles.countryItem}\n onPress={() => {\n setCountryCode(item.code);\n setShowCountryPicker(false);\n }}\n >\n <Text style={styles.countryItemLabel}>{item.label}</Text>\n {countryCode === item.code && <Text style={styles.checkMark}>✓</Text>}\n </TouchableOpacity>\n )}\n />\n </View>\n </TouchableOpacity>\n </Modal>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n // ... Keeping all previous styles identical for safety ...\n container: {\n padding: 24,\n backgroundColor: 'white',\n borderRadius: 16,\n margin: 16,\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 4 },\n shadowOpacity: 0.1,\n shadowRadius: 12,\n elevation: 5,\n width: '95%',\n },\n title: {\n fontSize: 24,\n fontWeight: '700',\n marginBottom: 8,\n color: '#1a1a1a',\n textAlign: 'center',\n },\n instructions: {\n fontSize: 16,\n color: '#666',\n marginBottom: 32,\n lineHeight: 24,\n textAlign: 'center',\n },\n contentContainer: {},\n inputContainer: {\n marginBottom: 24,\n },\n label: {\n fontSize: 14,\n fontWeight: '600',\n color: '#333',\n marginBottom: 8,\n marginLeft: 4,\n },\n phoneInputRow: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 10,\n },\n countryPickerBtn: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n borderWidth: 1,\n borderColor: '#e0e0e0',\n paddingHorizontal: 12,\n paddingVertical: 16,\n borderRadius: 12,\n backgroundColor: '#f8f9fa',\n minWidth: 90,\n },\n countryPickerText: {\n fontSize: 16,\n color: '#333',\n fontWeight: '600',\n },\n dropdownIcon: {\n fontSize: 12,\n color: '#666',\n marginLeft: 8,\n },\n phoneInput: {\n flex: 1, \n borderWidth: 1,\n borderColor: '#e0e0e0',\n padding: 16,\n borderRadius: 12,\n fontSize: 16,\n backgroundColor: '#f8f9fa',\n color: '#333',\n },\n modalOverlay: {\n flex: 1,\n backgroundColor: 'rgba(0,0,0,0.5)',\n justifyContent: 'flex-end',\n },\n modalContent: {\n backgroundColor: 'white',\n borderTopLeftRadius: 24,\n borderTopRightRadius: 24,\n maxHeight: '60%',\n paddingBottom: 40,\n },\n modalHeader: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: 20,\n borderBottomWidth: 1,\n borderBottomColor: '#f0f0f0',\n },\n modalTitle: {\n fontSize: 18,\n fontWeight: '700',\n color: '#1a1a1a',\n },\n modalClose: {\n fontSize: 20,\n color: '#666',\n padding: 5,\n },\n countryItem: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n paddingVertical: 16,\n paddingHorizontal: 24,\n borderBottomWidth: 1,\n borderBottomColor: '#f8f9fa',\n },\n countryItemLabel: {\n fontSize: 16,\n color: '#333',\n },\n checkMark: {\n color: '#2DBD60',\n fontSize: 18,\n fontWeight: 'bold',\n },\n otpWrapper: {\n position: 'relative',\n width: '100%',\n height: 60,\n },\n otpBoxesContainer: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n width: '100%',\n height: '100%',\n },\n otpBox: {\n width: '14%',\n aspectRatio: 1,\n borderWidth: 1,\n borderColor: '#e0e0e0',\n borderRadius: 12,\n backgroundColor: '#f8f9fa',\n justifyContent: 'center',\n alignItems: 'center',\n },\n otpBoxFilled: {\n borderColor: '#9ca3af',\n backgroundColor: '#ffffff',\n },\n otpBoxActive: {\n borderColor: '#2DBD60',\n borderWidth: 2,\n backgroundColor: '#ffffff',\n },\n otpBoxText: {\n fontSize: 24,\n fontWeight: '700',\n color: '#1a1a1a',\n },\n hiddenInput: {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n opacity: 0,\n },\n errorText: {\n color: '#dc2626',\n marginBottom: 16,\n fontSize: 14,\n textAlign: 'center',\n backgroundColor: '#fee2e2',\n padding: 8,\n borderRadius: 8,\n overflow: 'hidden',\n },\n button: {\n height: 50,\n borderRadius: 12,\n width: \"100%\",\n },\n changeLink: {\n alignSelf: 'flex-end',\n marginTop: 12,\n },\n changeText: {\n color: '#2DBD60',\n fontSize: 14,\n fontWeight: '500',\n },\n resendButton: {\n marginTop: 16,\n alignItems: 'center',\n },\n resendText: {\n color: '#666',\n fontSize: 14,\n textDecorationLine: 'underline',\n },\n});"]}
1
+ {"version":3,"file":"PhoneVerificationTemplate.js","sourceRoot":"","sources":["../../../../src/components/KYCElements/PhoneVerificationTemplate.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useRef, useEffect } from 'react';\nimport { View, Text, StyleSheet, TextInput, TouchableOpacity, Alert, Pressable } from 'react-native';\nimport { TemplateComponent, LocalizedText } from '../../types/KYC.types';\nimport { useTemplateKYCFlowContext } from '../../hooks/useTemplateKYCFlow';\nimport { useI18n } from '../../hooks/useI18n';\nimport { Button } from '../ui/Button';\nimport kycService, { errorMessage } from '../../modules/api/KYCService';\n\ninterface PhoneVerificationTemplateProps {\n component: TemplateComponent;\n value?: any;\n onValueChange: (data: any) => void;\n error?: string;\n language?: string;\n}\n\ntype VerificationStep = 'phone' | 'otp';\nconst CODE_LENGTH = 6;\n\nexport const PhoneVerificationTemplate: React.FC<PhoneVerificationTemplateProps> = ({\n component,\n value,\n onValueChange,\n error: propError,\n}) => {\n const { actions, getLocalizedText, state, apiKey } = useTemplateKYCFlowContext();\n const { t } = useI18n();\n\n const auth = apiKey ? { apiKey } : (state.session?.token ? { token: state.session.token } : undefined);\n const sessionId = state.session?.session_id || '';\n\n // State\n const [step, setStep] = useState<VerificationStep>('phone');\n const [phone, setPhone] = useState('');\n const [otp, setOtp] = useState('');\n const [localError, setLocalError] = useState<string | null>(null);\n const [isSimulating, setIsSimulating] = useState(false);\n\n const inputRef = useRef<TextInput>(null);\n\n const title = getLocalizedText(component.labels as LocalizedText);\n const instructions = getLocalizedText(component.instructions as LocalizedText);\n\n const verifyButtonText = getLocalizedText((component.ui as any).buttonText) || t('common.verify') || 'Verify';\n const sendButtonText = t('common.sendCode') || 'Send Verification Code';\n const buttonText = step === 'phone' ? sendButtonText : verifyButtonText;\n\n // --- AUTO SUBMIT LOGIC ---\n useEffect(() => {\n if (otp.length === CODE_LENGTH && step === 'otp' && !isSimulating) {\n handleVerifyCode();\n }\n }, [otp]);\n\n const handleSendCode = async () => {\n const trimmedPhone = phone.trim();\n if (!trimmedPhone || trimmedPhone.length < 5) {\n setLocalError(t('errors.invalidPhone') || 'Please enter a valid phone number');\n return;\n }\n\n setLocalError(null);\n setIsSimulating(true);\n\n try {\n await kycService.sendWhatsAppVerificationCode(sessionId, trimmedPhone, auth);\n setStep('otp');\n // Auto-focus the OTP input shortly after switching steps\n setTimeout(() => inputRef.current?.focus(), 100);\n } catch (err: any) {\n const msg = errorMessage(err) ?? err?.message ?? (t('errors.sendCodeFailed') || 'Failed to send verification code');\n setLocalError(typeof msg === 'string' ? msg : JSON.stringify(msg));\n } finally {\n setIsSimulating(false);\n }\n };\n\n const handleVerifyCode = async () => {\n if (!otp || otp.length < CODE_LENGTH) {\n setLocalError(t('errors.invalidCode') || 'Please enter the 6-digit code');\n return;\n }\n\n setLocalError(null);\n setIsSimulating(true);\n\n try {\n await kycService.verifyWhatsAppCode(sessionId, otp.trim(), auth);\n const data = { phone, otp, verified: true };\n onValueChange(data);\n actions.nextComponent(data);\n } catch (err: any) {\n const msg = errorMessage(err) ?? err?.message ?? (t('errors.wrongCode') || 'Invalid verification code');\n setLocalError(typeof msg === 'string' ? msg : JSON.stringify(msg));\n setOtp(''); // Clear the boxes on error so they can type again\n inputRef.current?.focus();\n } finally {\n setIsSimulating(false);\n }\n };\n\n const onChangePhone = (text: string) => {\n setPhone(text);\n if (localError) setLocalError(null);\n };\n\n const onChangeOtp = (text: string) => {\n // Only allow numbers\n const cleaned = text.replace(/[^0-9]/g, '');\n setOtp(cleaned);\n if (localError) setLocalError(null);\n };\n\n const handleBackToPhone = () => {\n setStep('phone');\n setOtp('');\n setLocalError(null);\n };\n\n const renderOtpBoxes = () => {\n const boxes = new Array(CODE_LENGTH).fill(0);\n return (\n <Pressable style={styles.otpBoxesContainer} onPress={() => inputRef.current?.focus()}>\n {boxes.map((_, index) => {\n const digit = otp[index] || '';\n const isCurrent = index === otp.length;\n const isFilled = index < otp.length;\n\n return (\n <View \n key={index} \n style={[\n styles.otpBox, \n isCurrent && styles.otpBoxActive,\n isFilled && styles.otpBoxFilled\n ]}\n >\n <Text style={styles.otpBoxText}>{digit}</Text>\n </View>\n );\n })}\n </Pressable>\n );\n };\n\n return (\n <View style={styles.container}>\n <Text style={styles.title}>{title}</Text>\n <Text style={styles.instructions}>\n {step === 'phone' ? instructions : (t('kyc.enterCodeSent') || `Please enter the code sent to ${phone}`)}\n </Text>\n\n <View style={styles.contentContainer}>\n {step === 'phone' ? (\n <View style={styles.inputContainer}>\n <Text style={styles.label}>{t('common.phone') || 'Phone Number'}</Text>\n <TextInput\n style={styles.input}\n placeholder=\"+1234567890\"\n value={phone}\n onChangeText={onChangePhone}\n keyboardType=\"phone-pad\"\n autoComplete=\"tel\"\n editable={!isSimulating}\n />\n </View>\n ) : (\n <View style={styles.inputContainer}>\n <Text style={styles.label}>{t('common.verificationCode') || 'Verification Code'}</Text>\n \n <View style={styles.otpWrapper}>\n {renderOtpBoxes()}\n {/* Hidden TextInput overlaid to handle native keyboard & pasting seamlessly */}\n <TextInput\n ref={inputRef}\n style={styles.hiddenInput}\n value={otp}\n onChangeText={onChangeOtp}\n keyboardType=\"number-pad\"\n maxLength={CODE_LENGTH}\n editable={!isSimulating}\n textContentType=\"oneTimeCode\"\n caretHidden={true}\n />\n </View>\n\n <TouchableOpacity onPress={handleBackToPhone} style={styles.changeLink} disabled={isSimulating}>\n <Text style={styles.changeText}>{t('common.back') || 'Change number'}</Text>\n </TouchableOpacity>\n </View>\n )}\n\n {(localError || propError) && (\n <Text style={styles.errorText}>{localError || propError}</Text>\n )}\n\n <Button\n title={isSimulating ? (t('common.processing') || 'Processing...') : buttonText}\n onPress={step === 'phone' ? handleSendCode : handleVerifyCode}\n style={styles.button}\n disabled={\n isSimulating ||\n (step === 'phone' ? !phone : otp.length < CODE_LENGTH)\n }\n />\n\n {step === 'otp' && (\n <TouchableOpacity\n onPress={async () => {\n if (isSimulating) return;\n setLocalError(null);\n setIsSimulating(true);\n try {\n await kycService.sendWhatsAppVerificationCode(sessionId, phone.trim(), auth);\n Alert.alert(\n t('common.codeResent') || 'Code Resent',\n t('common.codeResentMessage', { email: phone }) || 'Code resent to ' + phone\n );\n } catch (err: any) {\n const msg = errorMessage(err) ?? err?.message ?? (t('errors.sendCodeFailed') || 'Failed to send code');\n setLocalError(typeof msg === 'string' ? msg : JSON.stringify(msg));\n } finally {\n setIsSimulating(false);\n }\n }}\n style={styles.resendButton}\n disabled={isSimulating}\n >\n <Text style={styles.resendText}>{t('common.resendCode') || 'Resend Code'}</Text>\n </TouchableOpacity>\n )}\n </View>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n padding: 24,\n backgroundColor: 'white',\n borderRadius: 16,\n margin: 16,\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 4 },\n shadowOpacity: 0.1,\n shadowRadius: 12,\n elevation: 5,\n width: '95%',\n },\n title: {\n fontSize: 24,\n fontWeight: '700',\n marginBottom: 8,\n color: '#1a1a1a',\n textAlign: 'center',\n },\n instructions: {\n fontSize: 16,\n color: '#666',\n marginBottom: 32,\n lineHeight: 24,\n textAlign: 'center',\n },\n contentContainer: {},\n inputContainer: {\n marginBottom: 24,\n },\n label: {\n fontSize: 14,\n fontWeight: '600',\n color: '#333',\n marginBottom: 8,\n marginLeft: 4,\n },\n input: {\n borderWidth: 1,\n borderColor: '#e0e0e0',\n padding: 16,\n borderRadius: 12,\n fontSize: 16,\n backgroundColor: '#f8f9fa',\n color: '#333',\n },\n otpWrapper: {\n position: 'relative',\n width: '100%',\n height: 60,\n },\n otpBoxesContainer: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n width: '100%',\n height: '100%',\n },\n otpBox: {\n width: '14%',\n aspectRatio: 1, // keeps it perfectly square\n borderWidth: 1,\n borderColor: '#e0e0e0',\n borderRadius: 12,\n backgroundColor: '#f8f9fa',\n justifyContent: 'center',\n alignItems: 'center',\n },\n otpBoxFilled: {\n borderColor: '#9ca3af',\n backgroundColor: '#ffffff',\n },\n otpBoxActive: {\n borderColor: '#2DBD60',\n borderWidth: 2,\n backgroundColor: '#ffffff',\n },\n otpBoxText: {\n fontSize: 24,\n fontWeight: '700',\n color: '#1a1a1a',\n },\n hiddenInput: {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n opacity: 0, // completely invisible but handles native keyboard interactions perfectly\n },\n errorText: {\n color: '#dc2626',\n marginBottom: 16,\n fontSize: 14,\n textAlign: 'center',\n backgroundColor: '#fee2e2',\n padding: 8,\n borderRadius: 8,\n overflow: 'hidden',\n },\n button: {\n height: 50,\n borderRadius: 12,\n width: \"100%\",\n },\n changeLink: {\n alignSelf: 'flex-end',\n marginTop: 12,\n },\n changeText: {\n color: '#2DBD60',\n fontSize: 14,\n fontWeight: '500',\n },\n resendButton: {\n marginTop: 16,\n alignItems: 'center',\n },\n resendText: {\n color: '#666',\n fontSize: 14,\n textDecorationLine: 'underline',\n },\n});"]}
@@ -1,6 +1,6 @@
1
1
  import React, { useEffect } from 'react';
2
2
  import { requireNativeViewManager } from 'expo-modules-core';
3
- const NativeCameraViewComponent = requireNativeViewManager('SanctumKeySdk_SanctumKeySdkView');
3
+ const NativeCameraViewComponent = requireNativeViewManager('TransfergratisSdk_TransfergratisSdkView');
4
4
  export const NativeCameraView = (props) => {
5
5
  useEffect(() => {
6
6
  console.log('🟨 [NativeCameraView] Props reçues:', {
@@ -1 +1 @@
1
- {"version":3,"file":"NativeCameraView.js","sourceRoot":"","sources":["../../../src/components/NativeCameraView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEzC,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAU7D,MAAM,yBAAyB,GAAG,wBAAwB,CAAC,iCAAiC,CAAC,CAAC;AAE9F,MAAM,CAAC,MAAM,gBAAgB,GAAoC,CAAC,KAAK,EAAE,EAAE;IAEzE,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,GAAG,CAAC,qCAAqC,EAAE;YACjD,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS;YAC/B,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO;SAC5B,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAE3E,MAAM,aAAa,GAAG,CAAC,KAAU,EAAE,EAAE;QACnC,OAAO,CAAC,GAAG,CAAC,iDAAiD,EAAE,KAAK,CAAC,CAAC;QACtE,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,CAAC,KAAU,EAAE,EAAE;QACjC,OAAO,CAAC,GAAG,CAAC,+CAA+C,EAAE,KAAK,CAAC,CAAC;QACpE,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,CAAC,yBAAyB,CACxB,IAAI,KAAK,CAAC,CACV,SAAS,CAAC,CAAC,aAAa,CAAC,CACzB,OAAO,CAAC,CAAC,WAAW,CAAC,EACrB,CACH,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import React, { useEffect } from 'react';\nimport { ViewStyle } from 'react-native';\nimport { requireNativeViewManager } from 'expo-modules-core';\n\nexport interface NativeCameraViewProps {\n instructions: string;\n showCamera: boolean;\n style?: ViewStyle;\n onCapture?: (event: any) => void;\n onError?: (event: any) => void;\n}\n\nconst NativeCameraViewComponent = requireNativeViewManager('SanctumKeySdk_SanctumKeySdkView');\n\nexport const NativeCameraView: React.FC<NativeCameraViewProps> = (props) => {\n \n useEffect(() => {\n console.log('🟨 [NativeCameraView] Props reçues:', {\n instructions: props.instructions,\n showCamera: props.showCamera,\n hasOnCapture: !!props.onCapture,\n hasOnError: !!props.onError\n });\n }, [props.instructions, props.showCamera, props.onCapture, props.onError]);\n\n const handleCapture = (event: any) => {\n console.log('🟨 [NativeCameraView] Événement onCapture reçu:', event);\n if (props.onCapture) {\n props.onCapture(event);\n }\n };\n\n const handleError = (event: any) => {\n console.log('🟨 [NativeCameraView] Événement onError reçu:', event);\n if (props.onError) {\n props.onError(event);\n }\n };\n\n return (\n <NativeCameraViewComponent \n {...props} \n onCapture={handleCapture}\n onError={handleError}\n />\n );\n}; "]}
1
+ {"version":3,"file":"NativeCameraView.js","sourceRoot":"","sources":["../../../src/components/NativeCameraView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEzC,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAU7D,MAAM,yBAAyB,GAAG,wBAAwB,CAAC,yCAAyC,CAAC,CAAC;AAEtG,MAAM,CAAC,MAAM,gBAAgB,GAAoC,CAAC,KAAK,EAAE,EAAE;IAEzE,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,GAAG,CAAC,qCAAqC,EAAE;YACjD,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS;YAC/B,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO;SAC5B,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAE3E,MAAM,aAAa,GAAG,CAAC,KAAU,EAAE,EAAE;QACnC,OAAO,CAAC,GAAG,CAAC,iDAAiD,EAAE,KAAK,CAAC,CAAC;QACtE,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,CAAC,KAAU,EAAE,EAAE;QACjC,OAAO,CAAC,GAAG,CAAC,+CAA+C,EAAE,KAAK,CAAC,CAAC;QACpE,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,CAAC,yBAAyB,CACxB,IAAI,KAAK,CAAC,CACV,SAAS,CAAC,CAAC,aAAa,CAAC,CACzB,OAAO,CAAC,CAAC,WAAW,CAAC,EACrB,CACH,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import React, { useEffect } from 'react';\nimport { ViewStyle } from 'react-native';\nimport { requireNativeViewManager } from 'expo-modules-core';\n\nexport interface NativeCameraViewProps {\n instructions: string;\n showCamera: boolean;\n style?: ViewStyle;\n onCapture?: (event: any) => void;\n onError?: (event: any) => void;\n}\n\nconst NativeCameraViewComponent = requireNativeViewManager('TransfergratisSdk_TransfergratisSdkView');\n\nexport const NativeCameraView: React.FC<NativeCameraViewProps> = (props) => {\n \n useEffect(() => {\n console.log('🟨 [NativeCameraView] Props reçues:', {\n instructions: props.instructions,\n showCamera: props.showCamera,\n hasOnCapture: !!props.onCapture,\n hasOnError: !!props.onError\n });\n }, [props.instructions, props.showCamera, props.onCapture, props.onError]);\n\n const handleCapture = (event: any) => {\n console.log('🟨 [NativeCameraView] Événement onCapture reçu:', event);\n if (props.onCapture) {\n props.onCapture(event);\n }\n };\n\n const handleError = (event: any) => {\n console.log('🟨 [NativeCameraView] Événement onError reçu:', event);\n if (props.onError) {\n props.onError(event);\n }\n };\n\n return (\n <NativeCameraViewComponent \n {...props} \n onCapture={handleCapture}\n onError={handleError}\n />\n );\n}; "]}
@@ -3,7 +3,7 @@ class KYCConfig {
3
3
  backendEnvironment = 'PRODUCTION';
4
4
  backendUrls = {
5
5
  PRODUCTION: 'https://service.sanctumkey.com/api/v1',
6
- TEST: 'https://kyc-backend.SanctumKey.net/api/v1',
6
+ TEST: 'https://kyc-backend.transfergratis.net/api/v1',
7
7
  };
8
8
  constructor() { }
9
9
  static getInstance() {
@@ -1 +1 @@
1
- {"version":3,"file":"KYCConfig.js","sourceRoot":"","sources":["../../../src/config/KYCConfig.ts"],"names":[],"mappings":"AAEA,MAAM,SAAS;IACH,MAAM,CAAC,QAAQ,CAAY;IAC3B,kBAAkB,GAAuB,YAAY,CAAC;IAEtD,WAAW,GAAuC;QACtD,UAAU,EAAE,uCAAuC;QACnD,IAAI,EAAE,2CAA2C;KACpD,CAAC;IAEF,gBAAwB,CAAC;IAElB,MAAM,CAAC,WAAW;QACrB,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;YACtB,SAAS,CAAC,QAAQ,GAAG,IAAI,SAAS,EAAE,CAAC;QACzC,CAAC;QACD,OAAO,SAAS,CAAC,QAAQ,CAAC;IAC9B,CAAC;IAEM,qBAAqB,CAAC,GAAuB;QAChD,IAAI,CAAC,kBAAkB,GAAG,GAAG,CAAC;IAClC,CAAC;IAEM,aAAa;QAChB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACrD,CAAC;IAEM,qBAAqB;QACxB,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACnC,CAAC;CACJ;AAED,eAAe,SAAS,CAAC,WAAW,EAAE,CAAC","sourcesContent":["import { BackendEnvironment } from '../types/env.types';\n\nclass KYCConfig {\n private static instance: KYCConfig;\n private backendEnvironment: BackendEnvironment = 'PRODUCTION';\n\n private backendUrls: Record<BackendEnvironment, string> = {\n PRODUCTION: 'https://service.sanctumkey.com/api/v1',\n TEST: 'https://kyc-backend.SanctumKey.net/api/v1', \n };\n\n private constructor() { }\n\n public static getInstance(): KYCConfig {\n if (!KYCConfig.instance) {\n KYCConfig.instance = new KYCConfig();\n }\n return KYCConfig.instance;\n }\n\n public setBackendEnvironment(env: BackendEnvironment) {\n this.backendEnvironment = env;\n }\n\n public getBackendUrl(): string {\n return this.backendUrls[this.backendEnvironment];\n }\n\n public getBackendEnvironment(): BackendEnvironment {\n return this.backendEnvironment;\n }\n}\n\nexport default KYCConfig.getInstance();\n"]}
1
+ {"version":3,"file":"KYCConfig.js","sourceRoot":"","sources":["../../../src/config/KYCConfig.ts"],"names":[],"mappings":"AAEA,MAAM,SAAS;IACH,MAAM,CAAC,QAAQ,CAAY;IAC3B,kBAAkB,GAAuB,YAAY,CAAC;IAEtD,WAAW,GAAuC;QACtD,UAAU,EAAE,uCAAuC;QACnD,IAAI,EAAE,+CAA+C;KACxD,CAAC;IAEF,gBAAwB,CAAC;IAElB,MAAM,CAAC,WAAW;QACrB,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;YACtB,SAAS,CAAC,QAAQ,GAAG,IAAI,SAAS,EAAE,CAAC;QACzC,CAAC;QACD,OAAO,SAAS,CAAC,QAAQ,CAAC;IAC9B,CAAC;IAEM,qBAAqB,CAAC,GAAuB;QAChD,IAAI,CAAC,kBAAkB,GAAG,GAAG,CAAC;IAClC,CAAC;IAEM,aAAa;QAChB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACrD,CAAC;IAEM,qBAAqB;QACxB,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACnC,CAAC;CACJ;AAED,eAAe,SAAS,CAAC,WAAW,EAAE,CAAC","sourcesContent":["import { BackendEnvironment } from '../types/env.types';\n\nclass KYCConfig {\n private static instance: KYCConfig;\n private backendEnvironment: BackendEnvironment = 'PRODUCTION';\n\n private backendUrls: Record<BackendEnvironment, string> = {\n PRODUCTION: 'https://service.sanctumkey.com/api/v1',\n TEST: 'https://kyc-backend.transfergratis.net/api/v1', \n };\n\n private constructor() { }\n\n public static getInstance(): KYCConfig {\n if (!KYCConfig.instance) {\n KYCConfig.instance = new KYCConfig();\n }\n return KYCConfig.instance;\n }\n\n public setBackendEnvironment(env: BackendEnvironment) {\n this.backendEnvironment = env;\n }\n\n public getBackendUrl(): string {\n return this.backendUrls[this.backendEnvironment];\n }\n\n public getBackendEnvironment(): BackendEnvironment {\n return this.backendEnvironment;\n }\n}\n\nexport default KYCConfig.getInstance();\n"]}
@@ -5,11 +5,11 @@
5
5
  // Default configuration - can be overridden via environment variables
6
6
  const DEFAULT_CONFIG = {
7
7
  domains: [
8
- 'SanctumKey.com',
9
- 'www.SanctumKey.com',
10
- 'admin.SanctumKey.com',
11
- 'dashboard.SanctumKey.com',
12
- 'preweb.SanctumKey.net',
8
+ 'transfergratis.com',
9
+ 'www.transfergratis.com',
10
+ 'admin.transfergratis.com',
11
+ 'dashboard.transfergratis.com',
12
+ 'preweb.transfergratis.net',
13
13
  // Add other trusted domains here
14
14
  ],
15
15
  enforceHttps: true,
@@ -46,7 +46,7 @@ export const isDomainAllowed = (domain) => {
46
46
  if (domain === allowedDomain) {
47
47
  return true;
48
48
  }
49
- // Subdomain match (e.g., app.SanctumKey.com matches SanctumKey.com)
49
+ // Subdomain match (e.g., app.transfergratis.com matches transfergratis.com)
50
50
  if (domain.endsWith('.' + allowedDomain)) {
51
51
  return true;
52
52
  }
@@ -1 +1 @@
1
- {"version":3,"file":"allowedDomains.js","sourceRoot":"","sources":["../../../src/config/allowedDomains.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Allowed domains configuration for callback URL validation\n * These domains are permitted to receive KYC completion callbacks\n */\n\nexport interface AllowedDomainConfig {\n domains: string[];\n enforceHttps: boolean;\n allowLocalhost: boolean;\n}\n\n// Default configuration - can be overridden via environment variables\nconst DEFAULT_CONFIG: AllowedDomainConfig = {\n domains: [\n 'SanctumKey.com',\n 'www.SanctumKey.com',\n 'admin.SanctumKey.com',\n 'dashboard.SanctumKey.com',\n 'preweb.SanctumKey.net',\n // Add other trusted domains here\n ],\n enforceHttps: true,\n allowLocalhost: true, // Allow localhost for development\n};\n\n/**\n * Get allowed domains from environment or use defaults\n */\nexport const getAllowedDomainsConfig = (): AllowedDomainConfig => {\n // Check for environment variable override\n if (typeof window !== 'undefined' && (window as any).KYC_ALLOWED_DOMAINS) {\n const envDomains = (window as any).KYC_ALLOWED_DOMAINS;\n if (Array.isArray(envDomains)) {\n return {\n ...DEFAULT_CONFIG,\n domains: envDomains,\n };\n }\n }\n\n return DEFAULT_CONFIG;\n};\n\n/**\n * Check if a domain is in the allowed list\n */\nexport const isDomainAllowed = (domain: string): boolean => {\n const config = getAllowedDomainsConfig();\n\n // Allow localhost in development\n if (config.allowLocalhost && (domain === 'localhost' || domain.startsWith('127.0.0.1'))) {\n return true;\n }\n\n // Check if domain matches any in the allowed list\n return config.domains.some(allowedDomain => {\n // Exact match\n if (domain === allowedDomain) {\n return true;\n }\n\n // Subdomain match (e.g., app.SanctumKey.com matches SanctumKey.com)\n if (domain.endsWith('.' + allowedDomain)) {\n return true;\n }\n\n return false;\n });\n};\n\n/**\n * Validate if a URL is allowed for callback\n */\nexport const isCallbackUrlAllowed = (url: string): { allowed: boolean; reason?: string } => {\n try {\n // Check if valid URL\n new URL(url);\n // Allow all URLs for redirection as requested\n return { allowed: true };\n } catch (error) {\n return {\n allowed: false,\n reason: 'Invalid URL format',\n };\n }\n};\n\n/**\n * Generate a signature for the callback URL parameters\n * This can be used to verify the integrity of the callback\n */\nexport const generateCallbackSignature = async (\n params: Record<string, string>,\n secret?: string\n): Promise<string> => {\n // Only generate signature if secret is provided\n if (!secret) {\n return '';\n }\n\n // Sort params for consistent signature\n const sortedParams = Object.keys(params)\n .sort()\n .map(key => `${key}=${params[key]}`)\n .join('&');\n\n const data = `${sortedParams}:${secret}`;\n\n // Use Web Crypto API for signature generation\n if (typeof window !== 'undefined' && window.crypto && window.crypto.subtle) {\n try {\n const encoder = new TextEncoder();\n const dataBuffer = encoder.encode(data);\n const hashBuffer = await window.crypto.subtle.digest('SHA-256', dataBuffer);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\n return hashHex;\n } catch (error) {\n console.error('Error generating signature:', error);\n return '';\n }\n }\n\n // Fallback: simple hash for environments without Web Crypto API\n let hash = 0;\n for (let i = 0; i < data.length; i++) {\n const char = data.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return Math.abs(hash).toString(16);\n};\n\n"]}
1
+ {"version":3,"file":"allowedDomains.js","sourceRoot":"","sources":["../../../src/config/allowedDomains.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Allowed domains configuration for callback URL validation\n * These domains are permitted to receive KYC completion callbacks\n */\n\nexport interface AllowedDomainConfig {\n domains: string[];\n enforceHttps: boolean;\n allowLocalhost: boolean;\n}\n\n// Default configuration - can be overridden via environment variables\nconst DEFAULT_CONFIG: AllowedDomainConfig = {\n domains: [\n 'transfergratis.com',\n 'www.transfergratis.com',\n 'admin.transfergratis.com',\n 'dashboard.transfergratis.com',\n 'preweb.transfergratis.net',\n // Add other trusted domains here\n ],\n enforceHttps: true,\n allowLocalhost: true, // Allow localhost for development\n};\n\n/**\n * Get allowed domains from environment or use defaults\n */\nexport const getAllowedDomainsConfig = (): AllowedDomainConfig => {\n // Check for environment variable override\n if (typeof window !== 'undefined' && (window as any).KYC_ALLOWED_DOMAINS) {\n const envDomains = (window as any).KYC_ALLOWED_DOMAINS;\n if (Array.isArray(envDomains)) {\n return {\n ...DEFAULT_CONFIG,\n domains: envDomains,\n };\n }\n }\n\n return DEFAULT_CONFIG;\n};\n\n/**\n * Check if a domain is in the allowed list\n */\nexport const isDomainAllowed = (domain: string): boolean => {\n const config = getAllowedDomainsConfig();\n\n // Allow localhost in development\n if (config.allowLocalhost && (domain === 'localhost' || domain.startsWith('127.0.0.1'))) {\n return true;\n }\n\n // Check if domain matches any in the allowed list\n return config.domains.some(allowedDomain => {\n // Exact match\n if (domain === allowedDomain) {\n return true;\n }\n\n // Subdomain match (e.g., app.transfergratis.com matches transfergratis.com)\n if (domain.endsWith('.' + allowedDomain)) {\n return true;\n }\n\n return false;\n });\n};\n\n/**\n * Validate if a URL is allowed for callback\n */\nexport const isCallbackUrlAllowed = (url: string): { allowed: boolean; reason?: string } => {\n try {\n // Check if valid URL\n new URL(url);\n // Allow all URLs for redirection as requested\n return { allowed: true };\n } catch (error) {\n return {\n allowed: false,\n reason: 'Invalid URL format',\n };\n }\n};\n\n/**\n * Generate a signature for the callback URL parameters\n * This can be used to verify the integrity of the callback\n */\nexport const generateCallbackSignature = async (\n params: Record<string, string>,\n secret?: string\n): Promise<string> => {\n // Only generate signature if secret is provided\n if (!secret) {\n return '';\n }\n\n // Sort params for consistent signature\n const sortedParams = Object.keys(params)\n .sort()\n .map(key => `${key}=${params[key]}`)\n .join('&');\n\n const data = `${sortedParams}:${secret}`;\n\n // Use Web Crypto API for signature generation\n if (typeof window !== 'undefined' && window.crypto && window.crypto.subtle) {\n try {\n const encoder = new TextEncoder();\n const dataBuffer = encoder.encode(data);\n const hashBuffer = await window.crypto.subtle.digest('SHA-256', dataBuffer);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\n return hashHex;\n } catch (error) {\n console.error('Error generating signature:', error);\n return '';\n }\n }\n\n // Fallback: simple hash for environments without Web Crypto API\n let hash = 0;\n for (let i = 0; i < data.length; i++) {\n const char = data.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return Math.abs(hash).toString(16);\n};\n\n"]}
@@ -1,8 +1,8 @@
1
- export * from './SanctumKeySdk.types';
1
+ export * from './TransfergratisSdk.types';
2
2
  export * from './types/KYC.types';
3
3
  export * from './types/env.types';
4
- export { TemplateKYCExample as LaunchSanctumKeyKYC } from './components/TemplateKYCExample';
5
- export { TemplateKYCExample as LauchSanctumKeyKYC } from './components/TemplateKYCExample';
4
+ export { TemplateKYCExample as LaunchTransferGratisKYC } from './components/TemplateKYCExample';
5
+ export { TemplateKYCExample as LauchTransferGratisKYC } from './components/TemplateKYCExample';
6
6
  export { TemplateKYCFlow } from './components/TemplateKYCFlowRefactored';
7
7
  export { default as templateService } from './modules/api/TemplateService';
8
8
  export { transformBackendTemplateToSDK, validateTransformedTemplate } from './utils/template-transformer';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AAItC,cAAc,mBAAmB,CAAC;AAGlC,cAAc,mBAAmB,CAAC;AAGlC,OAAO,EAAE,kBAAkB,IAAI,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAE5F,OAAO,EAAE,kBAAkB,IAAI,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAG3F,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAGzE,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,6BAA6B,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAC1G,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAG9D,OAAO,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAI1C,cAAc,mBAAmB,CAAC;AAGlC,cAAc,mBAAmB,CAAC;AAGlC,OAAO,EAAE,kBAAkB,IAAI,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAEhG,OAAO,EAAE,kBAAkB,IAAI,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAG/F,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAGzE,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,6BAA6B,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAC1G,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAG9D,OAAO,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC"}
@@ -1,11 +1,11 @@
1
- export * from './SanctumKeySdk.types';
1
+ export * from './TransfergratisSdk.types';
2
2
  // Export KYC types
3
3
  export * from './types/KYC.types';
4
4
  // Export Environment types
5
5
  export * from './types/env.types';
6
- export { TemplateKYCExample as LaunchSanctumKeyKYC } from './components/TemplateKYCExample';
6
+ export { TemplateKYCExample as LaunchTransferGratisKYC } from './components/TemplateKYCExample';
7
7
  // Backward compatibility for existing integrations using the typo.
8
- export { TemplateKYCExample as LauchSanctumKeyKYC } from './components/TemplateKYCExample';
8
+ export { TemplateKYCExample as LauchTransferGratisKYC } from './components/TemplateKYCExample';
9
9
  // Export Template Flow Components
10
10
  export { TemplateKYCFlow } from './components/TemplateKYCFlowRefactored';
11
11
  // Export Template Service and Utilities
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AAGtC,mBAAmB;AACnB,cAAc,mBAAmB,CAAC;AAElC,2BAA2B;AAC3B,cAAc,mBAAmB,CAAC;AAGlC,OAAO,EAAE,kBAAkB,IAAI,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC5F,mEAAmE;AACnE,OAAO,EAAE,kBAAkB,IAAI,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAE3F,kCAAkC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAEzE,wCAAwC;AACxC,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,6BAA6B,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAC1G,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,6BAA6B;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,4BAA4B;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC","sourcesContent":["export * from './SanctumKeySdk.types';\n\n\n// Export KYC types\nexport * from './types/KYC.types';\n\n// Export Environment types\nexport * from './types/env.types';\n\n\nexport { TemplateKYCExample as LaunchSanctumKeyKYC } from './components/TemplateKYCExample';\n// Backward compatibility for existing integrations using the typo.\nexport { TemplateKYCExample as LauchSanctumKeyKYC } from './components/TemplateKYCExample';\n\n// Export Template Flow Components\nexport { TemplateKYCFlow } from './components/TemplateKYCFlowRefactored';\n\n// Export Template Service and Utilities\nexport { default as templateService } from './modules/api/TemplateService';\nexport { transformBackendTemplateToSDK, validateTransformedTemplate } from './utils/template-transformer';\nexport { useTemplateLoader } from './hooks/useTemplateLoader';\n\n// Export Template Components\nexport { WelcomeTemplate } from './components/KYCElements/WelcomeTemplate';\nexport { EnhancedCameraView } from './components/EnhancedCameraView';\nexport { UnifiedCameraModule } from './modules/camera';\n\n// Export Web KYC Components\nexport { WebKYCEntry } from './web';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAG1C,mBAAmB;AACnB,cAAc,mBAAmB,CAAC;AAElC,2BAA2B;AAC3B,cAAc,mBAAmB,CAAC;AAGlC,OAAO,EAAE,kBAAkB,IAAI,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAChG,mEAAmE;AACnE,OAAO,EAAE,kBAAkB,IAAI,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAE/F,kCAAkC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAEzE,wCAAwC;AACxC,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,6BAA6B,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAC1G,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,6BAA6B;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,4BAA4B;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC","sourcesContent":["export * from './TransfergratisSdk.types';\n\n\n// Export KYC types\nexport * from './types/KYC.types';\n\n// Export Environment types\nexport * from './types/env.types';\n\n\nexport { TemplateKYCExample as LaunchTransferGratisKYC } from './components/TemplateKYCExample';\n// Backward compatibility for existing integrations using the typo.\nexport { TemplateKYCExample as LauchTransferGratisKYC } from './components/TemplateKYCExample';\n\n// Export Template Flow Components\nexport { TemplateKYCFlow } from './components/TemplateKYCFlowRefactored';\n\n// Export Template Service and Utilities\nexport { default as templateService } from './modules/api/TemplateService';\nexport { transformBackendTemplateToSDK, validateTransformedTemplate } from './utils/template-transformer';\nexport { useTemplateLoader } from './hooks/useTemplateLoader';\n\n// Export Template Components\nexport { WelcomeTemplate } from './components/KYCElements/WelcomeTemplate';\nexport { EnhancedCameraView } from './components/EnhancedCameraView';\nexport { UnifiedCameraModule } from './modules/camera';\n\n// Export Web KYC Components\nexport { WebKYCEntry } from './web';\n"]}