@sanctum-key/react-native-sdk 1.0.49 → 1.0.51

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 (58) hide show
  1. package/build/package.json +1 -1
  2. package/build/src/components/KYCElements/CountrySelection.d.ts.map +1 -1
  3. package/build/src/components/KYCElements/CountrySelection.js +33 -108
  4. package/build/src/components/KYCElements/CountrySelection.js.map +1 -1
  5. package/build/src/components/KYCElements/CountrySelectionTemplate.d.ts.map +1 -1
  6. package/build/src/components/KYCElements/CountrySelectionTemplate.js +50 -164
  7. package/build/src/components/KYCElements/CountrySelectionTemplate.js.map +1 -1
  8. package/build/src/components/KYCElements/DocumentTypeSelection.d.ts.map +1 -1
  9. package/build/src/components/KYCElements/DocumentTypeSelection.js +32 -109
  10. package/build/src/components/KYCElements/DocumentTypeSelection.js.map +1 -1
  11. package/build/src/components/KYCElements/IDCardCapture.d.ts.map +1 -1
  12. package/build/src/components/KYCElements/IDCardCapture.js +58 -25
  13. package/build/src/components/KYCElements/IDCardCapture.js.map +1 -1
  14. package/build/src/components/KYCElements/InitializationStep.d.ts.map +1 -1
  15. package/build/src/components/KYCElements/InitializationStep.js +13 -1
  16. package/build/src/components/KYCElements/InitializationStep.js.map +1 -1
  17. package/build/src/components/KYCElements/LocationCaptureTemplate.d.ts.map +1 -1
  18. package/build/src/components/KYCElements/LocationCaptureTemplate.js +46 -157
  19. package/build/src/components/KYCElements/LocationCaptureTemplate.js.map +1 -1
  20. package/build/src/components/KYCElements/SelfieCapture.d.ts.map +1 -1
  21. package/build/src/components/KYCElements/SelfieCapture.js +28 -24
  22. package/build/src/components/KYCElements/SelfieCapture.js.map +1 -1
  23. package/build/src/components/KYCElements/VerificationProgressTemplate.d.ts.map +1 -1
  24. package/build/src/components/KYCElements/VerificationProgressTemplate.js +0 -4
  25. package/build/src/components/KYCElements/VerificationProgressTemplate.js.map +1 -1
  26. package/build/src/components/SelfieCapture.d.ts.map +1 -1
  27. package/build/src/components/SelfieCapture.js +33 -90
  28. package/build/src/components/SelfieCapture.js.map +1 -1
  29. package/build/src/components/TemplateKYCExample.d.ts.map +1 -1
  30. package/build/src/components/TemplateKYCExample.js +69 -120
  31. package/build/src/components/TemplateKYCExample.js.map +1 -1
  32. package/build/src/components/TemplateKYCFlowRefactored.d.ts +0 -2
  33. package/build/src/components/TemplateKYCFlowRefactored.d.ts.map +1 -1
  34. package/build/src/components/TemplateKYCFlowRefactored.js +95 -210
  35. package/build/src/components/TemplateKYCFlowRefactored.js.map +1 -1
  36. package/build/src/hooks/useTemplateKYCFlow.d.ts.map +1 -1
  37. package/build/src/hooks/useTemplateKYCFlow.js.map +1 -1
  38. package/build/src/types/KYC.types.d.ts.map +1 -1
  39. package/build/src/types/KYC.types.js.map +1 -1
  40. package/build/src/utils/logger.d.ts +12 -4
  41. package/build/src/utils/logger.d.ts.map +1 -1
  42. package/build/src/utils/logger.js +156 -28
  43. package/build/src/utils/logger.js.map +1 -1
  44. package/package.json +1 -1
  45. package/src/components/KYCElements/CountrySelection.tsx +36 -109
  46. package/src/components/KYCElements/CountrySelectionTemplate.tsx +67 -266
  47. package/src/components/KYCElements/DocumentTypeSelection.tsx +34 -110
  48. package/src/components/KYCElements/IDCardCapture.tsx +93 -39
  49. package/src/components/KYCElements/InitializationStep.tsx +17 -2
  50. package/src/components/KYCElements/LocationCaptureTemplate.tsx +53 -170
  51. package/src/components/KYCElements/SelfieCapture.tsx +50 -58
  52. package/src/components/KYCElements/VerificationProgressTemplate.tsx +1 -4
  53. package/src/components/SelfieCapture.tsx +44 -100
  54. package/src/components/TemplateKYCExample.tsx +94 -145
  55. package/src/components/TemplateKYCFlowRefactored.tsx +105 -239
  56. package/src/hooks/useTemplateKYCFlow.tsx +1 -0
  57. package/src/types/KYC.types.ts +0 -1
  58. package/src/utils/logger.ts +182 -29
@@ -1 +1 @@
1
- {"version":3,"file":"InitializationStep.d.ts","sourceRoot":"","sources":["../../../../src/components/KYCElements/InitializationStep.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAKpD,eAAO,MAAM,kBAAkB,GAAI,aAAa;IAAE,OAAO,EAAE,YAAY,CAAA;CAAE,gCA0BxE,CAAA"}
1
+ {"version":3,"file":"InitializationStep.d.ts","sourceRoot":"","sources":["../../../../src/components/KYCElements/InitializationStep.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAMpD,eAAO,MAAM,kBAAkB,GAAI,aAAa;IAAE,OAAO,EAAE,YAAY,CAAA;CAAE,gCAwCxE,CAAA"}
@@ -2,16 +2,28 @@ import { ActivityIndicator, Button, StyleSheet, Text, View } from "react-native"
2
2
  import { useEffect } from "react";
3
3
  import { useTemplateKYCFlowContext } from "../../hooks/useTemplateKYCFlow";
4
4
  import { useI18n } from "../../hooks/useI18n";
5
+ import { sdkLogger } from "../../utils/logger"; // 🚨 IMPORT SDK LOGGER
5
6
  export const InitializationStep = ({ session }) => {
6
7
  const { t } = useI18n();
7
8
  const { initializeSession } = useTemplateKYCFlowContext();
8
9
  useEffect(() => {
10
+ sdkLogger.info("Started KYC session initialization");
9
11
  initializeSession();
10
12
  }, []);
13
+ useEffect(() => {
14
+ if (session.error) {
15
+ sdkLogger.error("Session initialization failed", {
16
+ error: session.error
17
+ });
18
+ }
19
+ }, [session.error]);
11
20
  if (session.error) {
12
21
  return (<View style={styles.container}>
13
22
  <Text style={styles.errorText}>{t('errors.serverError')}</Text>
14
- <Button title={t('common.retry')} onPress={initializeSession}/>
23
+ <Button title={t('common.retry')} onPress={() => {
24
+ sdkLogger.info("User requested session initialization retry"); // 🚨 LOG
25
+ initializeSession();
26
+ }}/>
15
27
  </View>);
16
28
  }
17
29
  return (<View style={styles.container}>
@@ -1 +1 @@
1
- {"version":3,"file":"InitializationStep.js","sourceRoot":"","sources":["../../../../src/components/KYCElements/InitializationStep.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAEhF,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACjC,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAC1E,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAE7C,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,EAAE,OAAO,EAA6B,EAAE,EAAE;IACzE,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;IACxB,MAAM,EAAE,iBAAiB,EAAE,GAAG,yBAAyB,EAAE,CAAA;IACzD,SAAS,CAAC,GAAG,EAAE;QACX,iBAAiB,EAAE,CAAA;IACvB,CAAC,EAAE,EAAE,CAAC,CAAA;IAIN,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CACH,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAC1B;gBAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,EAAE,IAAI,CAC9D;gBAAA,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,iBAAiB,CAAC,EACjE;YAAA,EAAE,IAAI,CAAC,CACV,CAAA;IACL,CAAC;IAED,OAAO,CACH,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAC1B;YAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,IAAI,CACjE;YAAA,CAAC,OAAO,CAAC,YAAY,IAAI,CACrB,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,EAAG,CACrD,CACL;QAAA,EAAE,IAAI,CAAC,CACV,CAAA;AACL,CAAC,CAAA;AAED,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC7B,SAAS,EAAE;QACP,IAAI,EAAE,CAAC;QACP,cAAc,EAAE,QAAQ;QACxB,UAAU,EAAE,QAAQ;KACvB;IACD,SAAS,EAAE;QACP,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,EAAE;QACZ,SAAS,EAAE,QAAQ;QACnB,MAAM,EAAE,EAAE;KACb;IACD,gBAAgB,EAAE;QACd,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,EAAE;QACZ,SAAS,EAAE,QAAQ;QACnB,MAAM,EAAE,EAAE;KACb;CACJ,CAAC,CAAA","sourcesContent":["import { ActivityIndicator, Button, StyleSheet, Text, View } from \"react-native\"\nimport { SessionState } from \"../../types/KYC.types\"\nimport { useEffect } from \"react\"\nimport { useTemplateKYCFlowContext } from \"../../hooks/useTemplateKYCFlow\"\nimport { useI18n } from \"../../hooks/useI18n\"\n\nexport const InitializationStep = ({ session }: { session: SessionState }) => {\n const { t } = useI18n();\n const { initializeSession } = useTemplateKYCFlowContext()\n useEffect(() => {\n initializeSession()\n }, [])\n\n\n\n if (session.error) {\n return (\n <View style={styles.container}>\n <Text style={styles.errorText}>{t('errors.serverError')}</Text>\n <Button title={t('common.retry')} onPress={initializeSession} />\n </View>\n )\n }\n\n return (\n <View style={styles.container}>\n <Text style={styles.initializingText}>{t('common.loading')}</Text>\n {session.isProcessing && (\n <ActivityIndicator size=\"large\" color=\"#0000ff\" />\n )}\n </View>\n )\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n justifyContent: 'center',\n alignItems: 'center',\n },\n errorText: {\n color: '#dc2626',\n fontSize: 16,\n textAlign: 'center',\n margin: 20,\n },\n initializingText: {\n color: '#0000ff',\n fontSize: 16,\n textAlign: 'center',\n margin: 20,\n },\n})"]}
1
+ {"version":3,"file":"InitializationStep.js","sourceRoot":"","sources":["../../../../src/components/KYCElements/InitializationStep.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAEhF,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACjC,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAC1E,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA,CAAC,uBAAuB;AAEtE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,EAAE,OAAO,EAA6B,EAAE,EAAE;IACzE,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;IACxB,MAAM,EAAE,iBAAiB,EAAE,GAAG,yBAAyB,EAAE,CAAA;IAEzD,SAAS,CAAC,GAAG,EAAE;QACX,SAAS,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QACrD,iBAAiB,EAAE,CAAA;IACvB,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,SAAS,CAAC,KAAK,CAAC,+BAA+B,EAAE;gBAC7C,KAAK,EAAE,OAAO,CAAC,KAAK;aACvB,CAAC,CAAC;QACP,CAAC;IACL,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAEpB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CACH,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAC1B;gBAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,EAAE,IAAI,CAC9D;gBAAA,CAAC,MAAM,CACH,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CACzB,OAAO,CAAC,CAAC,GAAG,EAAE;gBACV,SAAS,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC,CAAC,SAAS;gBACxE,iBAAiB,EAAE,CAAC;YACxB,CAAC,CAAC,EAEV;YAAA,EAAE,IAAI,CAAC,CACV,CAAA;IACL,CAAC;IAED,OAAO,CACH,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAC1B;YAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,IAAI,CACjE;YAAA,CAAC,OAAO,CAAC,YAAY,IAAI,CACrB,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,EAAG,CACrD,CACL;QAAA,EAAE,IAAI,CAAC,CACV,CAAA;AACL,CAAC,CAAA;AAED,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC7B,SAAS,EAAE;QACP,IAAI,EAAE,CAAC;QACP,cAAc,EAAE,QAAQ;QACxB,UAAU,EAAE,QAAQ;KACvB;IACD,SAAS,EAAE;QACP,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,EAAE;QACZ,SAAS,EAAE,QAAQ;QACnB,MAAM,EAAE,EAAE;KACb;IACD,gBAAgB,EAAE;QACd,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,EAAE;QACZ,SAAS,EAAE,QAAQ;QACnB,MAAM,EAAE,EAAE;KACb;CACJ,CAAC,CAAA","sourcesContent":["import { ActivityIndicator, Button, StyleSheet, Text, View } from \"react-native\"\nimport { SessionState } from \"../../types/KYC.types\"\nimport { useEffect } from \"react\"\nimport { useTemplateKYCFlowContext } from \"../../hooks/useTemplateKYCFlow\"\nimport { useI18n } from \"../../hooks/useI18n\"\nimport { sdkLogger } from \"../../utils/logger\" // 🚨 IMPORT SDK LOGGER\n\nexport const InitializationStep = ({ session }: { session: SessionState }) => {\n const { t } = useI18n();\n const { initializeSession } = useTemplateKYCFlowContext()\n\n useEffect(() => {\n sdkLogger.info(\"Started KYC session initialization\");\n initializeSession()\n }, [])\n\n useEffect(() => {\n if (session.error) {\n sdkLogger.error(\"Session initialization failed\", { \n error: session.error \n });\n }\n }, [session.error]);\n\n if (session.error) {\n return (\n <View style={styles.container}>\n <Text style={styles.errorText}>{t('errors.serverError')}</Text>\n <Button \n title={t('common.retry')} \n onPress={() => {\n sdkLogger.info(\"User requested session initialization retry\"); // 🚨 LOG\n initializeSession();\n }} \n />\n </View>\n )\n }\n\n return (\n <View style={styles.container}>\n <Text style={styles.initializingText}>{t('common.loading')}</Text>\n {session.isProcessing && (\n <ActivityIndicator size=\"large\" color=\"#0000ff\" />\n )}\n </View>\n )\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n justifyContent: 'center',\n alignItems: 'center',\n },\n errorText: {\n color: '#dc2626',\n fontSize: 16,\n textAlign: 'center',\n margin: 20,\n },\n initializingText: {\n color: '#0000ff',\n fontSize: 16,\n textAlign: 'center',\n margin: 20,\n },\n})"]}
@@ -1 +1 @@
1
- {"version":3,"file":"LocationCaptureTemplate.d.ts","sourceRoot":"","sources":["../../../../src/components/KYCElements/LocationCaptureTemplate.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAEnD,OAAO,EAAkB,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAS1E,UAAU,4BAA4B;IACpC,SAAS,EAAE,iBAAiB,CAAC;IAC7B,KAAK,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACzE,aAAa,EAAE,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,KAAK,IAAI,CAAC;IACjG,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,uBAAuB,EAAE,KAAK,CAAC,EAAE,CAAC,4BAA4B,CA6N1E,CAAC"}
1
+ {"version":3,"file":"LocationCaptureTemplate.d.ts","sourceRoot":"","sources":["../../../../src/components/KYCElements/LocationCaptureTemplate.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAEnD,OAAO,EAAkB,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAU1E,UAAU,4BAA4B;IACpC,SAAS,EAAE,iBAAiB,CAAC;IAC7B,KAAK,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACzE,aAAa,EAAE,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,KAAK,IAAI,CAAC;IACjG,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,uBAAuB,EAAE,KAAK,CAAC,EAAE,CAAC,4BAA4B,CAsN1E,CAAC"}
@@ -7,19 +7,24 @@ import * as Location from 'expo-location';
7
7
  import { useTemplateKYCFlowContext } from '../../hooks/useTemplateKYCFlow';
8
8
  import { useI18n } from '../../hooks/useI18n';
9
9
  import { showAlert } from '../../utils/platformAlert';
10
+ import { sdkLogger } from '../../utils/logger'; // 🚨 IMPORT SDK LOGGER
10
11
  export const LocationCaptureTemplate = ({ component, value, onValueChange, error, language = 'en', }) => {
11
12
  const { t } = useI18n();
12
13
  const [isRequesting, setIsRequesting] = useState(false);
13
14
  const [currentLocation, setCurrentLocation] = useState(value || null);
14
- const { actions } = useTemplateKYCFlowContext();
15
+ const { actions, state } = useTemplateKYCFlowContext();
15
16
  const config = component.config;
17
+ // 🚨 LOG: Track when the user reaches this step
18
+ useEffect(() => {
19
+ if (state.session?.session_id) {
20
+ sdkLogger.info("User started location capture step");
21
+ }
22
+ }, [state.session?.session_id]);
16
23
  const requestLocationPermission = async () => {
17
24
  try {
18
- // On web, use browser's geolocation API directly
19
25
  if (Platform.OS === 'web') {
20
26
  return await requestWebGeolocationPermission();
21
27
  }
22
- // On native, use expo-location
23
28
  const { status } = await Location.requestForegroundPermissionsAsync();
24
29
  return status === 'granted';
25
30
  }
@@ -30,47 +35,41 @@ export const LocationCaptureTemplate = ({ component, value, onValueChange, error
30
35
  };
31
36
  const requestWebGeolocationPermission = async () => {
32
37
  if (!navigator.geolocation) {
33
- console.error('Geolocation is not supported by this browser');
34
38
  return false;
35
39
  }
36
40
  try {
37
- // Check if permission API is available
38
41
  if ('permissions' in navigator) {
39
42
  const result = await navigator.permissions.query({ name: 'geolocation' });
40
43
  return result.state === 'granted' || result.state === 'prompt';
41
44
  }
42
- // Fallback: assume we can request permission
43
45
  return true;
44
46
  }
45
47
  catch (err) {
46
- console.warn('Could not check geolocation permission:', err);
47
- // Assume we can try to request
48
48
  return true;
49
49
  }
50
50
  };
51
51
  const getCurrentLocation = async () => {
52
52
  try {
53
+ sdkLogger.info("User initiated location request"); // 🚨 LOG
53
54
  setIsRequesting(true);
54
- // Web platform: use browser geolocation API
55
55
  if (Platform.OS === 'web') {
56
56
  await getWebGeolocation();
57
57
  return;
58
58
  }
59
- // Native platform: use expo-location
60
59
  const hasLocationPermission = await requestLocationPermission();
61
60
  if (!hasLocationPermission) {
61
+ sdkLogger.warn("Location permission denied by user"); // 🚨 LOG
62
62
  showAlert(t('kyc.locationCapture.permissionDeniedTitle'), t('kyc.locationCapture.permissionDeniedMessage'));
63
63
  setIsRequesting(false);
64
64
  return;
65
65
  }
66
- // Vérifier si la localisation est activée
67
66
  const isLocationEnabled = await Location.hasServicesEnabledAsync();
68
67
  if (!isLocationEnabled) {
68
+ sdkLogger.warn("Location services are disabled on device"); // 🚨 LOG
69
69
  showAlert(t('kyc.locationCapture.locationDisabledTitle'), t('kyc.locationCapture.locationDisabledMessage'));
70
70
  setIsRequesting(false);
71
71
  return;
72
72
  }
73
- // Récupérer la localisation actuelle
74
73
  const location = await Location.getCurrentPositionAsync({
75
74
  accuracy: config.accuracy === 'high' ? Location.Accuracy.High : Location.Accuracy.Balanced,
76
75
  timeInterval: 5000,
@@ -81,12 +80,13 @@ export const LocationCaptureTemplate = ({ component, value, onValueChange, error
81
80
  longitude: location.coords.longitude,
82
81
  accuracy: location.coords.accuracy || 50,
83
82
  };
84
- // Mettre à jour l'état local et passer la valeur au parent
83
+ // 🚨 LOG: Success (coordinates omitted for privacy)
84
+ sdkLogger.info("Location successfully captured", { accuracy: locationData.accuracy, platform: 'native' });
85
85
  setCurrentLocation(locationData);
86
86
  onValueChange(locationData);
87
87
  }
88
88
  catch (error) {
89
- console.error('Erreur lors de la récupération de la localisation:', error);
89
+ sdkLogger.error("Failed to capture native location", { error: error?.message }); // 🚨 LOG
90
90
  showAlert(t('kyc.locationCapture.errorTitle'), t('kyc.locationCapture.errorMessage'));
91
91
  }
92
92
  finally {
@@ -96,6 +96,7 @@ export const LocationCaptureTemplate = ({ component, value, onValueChange, error
96
96
  const getWebGeolocation = async () => {
97
97
  return new Promise((resolve, reject) => {
98
98
  if (!navigator.geolocation) {
99
+ sdkLogger.error("Web Geolocation not supported by browser"); // 🚨 LOG
99
100
  showAlert(t('kyc.locationCapture.errorTitle'), 'Geolocation is not supported by your browser. Please use a modern browser or enable location services.');
100
101
  reject(new Error('Geolocation not supported'));
101
102
  return;
@@ -111,11 +112,13 @@ export const LocationCaptureTemplate = ({ component, value, onValueChange, error
111
112
  longitude: position.coords.longitude,
112
113
  accuracy: position.coords.accuracy,
113
114
  };
115
+ // 🚨 LOG: Success (coordinates omitted for privacy)
116
+ sdkLogger.info("Location successfully captured", { accuracy: locationData.accuracy, platform: 'web' });
114
117
  setCurrentLocation(locationData);
115
118
  onValueChange(locationData);
116
119
  resolve();
117
120
  }, (error) => {
118
- console.error('Geolocation error:', error);
121
+ sdkLogger.error("Web Geolocation error", { errorCode: error.code, errorMessage: error.message }); // 🚨 LOG
119
122
  let errorMessage = t('kyc.locationCapture.errorMessage');
120
123
  switch (error.code) {
121
124
  case error.PERMISSION_DENIED:
@@ -135,10 +138,8 @@ export const LocationCaptureTemplate = ({ component, value, onValueChange, error
135
138
  }, options);
136
139
  });
137
140
  };
138
- // Passer automatiquement à l'étape suivante quand la localisation est obtenue
139
141
  useEffect(() => {
140
142
  if (currentLocation && !isRequesting) {
141
- // Délai court pour permettre à l'utilisateur de voir la localisation obtenue
142
143
  const timer = setTimeout(() => {
143
144
  actions.nextComponent();
144
145
  }, 1500);
@@ -148,7 +149,7 @@ export const LocationCaptureTemplate = ({ component, value, onValueChange, error
148
149
  }, [currentLocation, isRequesting, actions]);
149
150
  return (<View style={styles.container}>
150
151
  <View style={{ flexDirection: 'column', alignItems: 'center', justifyContent: 'center' }}>
151
- <View style={{ position: 'relative', width: 70, }}>
152
+ <View style={{ position: 'relative', width: 70 }}>
152
153
  <View style={{ flexDirection: 'row', alignItems: 'center', justifyContent: 'center', width: 60, height: 60, backgroundColor: '#2DBE60', borderRadius: 100 }}>
153
154
  <ShieldIcon />
154
155
  </View>
@@ -156,13 +157,15 @@ export const LocationCaptureTemplate = ({ component, value, onValueChange, error
156
157
  <GpsIcon />
157
158
  </View>
158
159
  </View>
160
+
159
161
  <View style={{ flexDirection: 'column', alignItems: 'center', justifyContent: 'center', marginTop: 36 }}>
160
162
  <Text style={{ fontSize: 24, fontWeight: 'bold', color: '#333', marginBottom: 8 }}>{t('kyc.locationCapture.title')}</Text>
161
163
  <Text style={{ fontSize: 16, color: '#666', textAlign: 'center', marginBottom: 24, lineHeight: 22 }}>
162
164
  {t('kyc.locationCapture.description')}
163
165
  </Text>
164
166
  </View>
165
- <View style={{ flexDirection: 'column', marginTop: 36, backgroundColor: "#F9FAFB", padding: 12, borderRadius: 12, width: '100%', }}>
167
+
168
+ <View style={{ flexDirection: 'column', marginTop: 36, backgroundColor: "#F9FAFB", padding: 12, borderRadius: 12, width: '100%' }}>
166
169
  <Text style={{ fontSize: 16, color: 'black', fontWeight: 'bold', textAlign: 'left', lineHeight: 22 }}>
167
170
  {t('kyc.locationCapture.howThisHelps')}
168
171
  </Text>
@@ -172,147 +175,33 @@ export const LocationCaptureTemplate = ({ component, value, onValueChange, error
172
175
  </View>
173
176
 
174
177
  {!currentLocation && (<Button title={isRequesting ? t('kyc.locationCapture.fetching') : t('kyc.locationCapture.enableButton')} fullWidth onPress={getCurrentLocation} disabled={isRequesting} style={{ paddingVertical: 20, marginTop: 36 }}/>)}
175
-
176
- <View style={{
177
- height: 12,
178
- }}/>
178
+ <View style={{ height: 12 }}/>
179
179
  </View>
180
180
  </View>);
181
181
  };
182
182
  const styles = StyleSheet.create({
183
- container: {
184
- padding: 16,
185
- backgroundColor: 'white',
186
- marginHorizontal: 12,
187
- marginTop: 12,
188
- borderRadius: 12,
189
- shadowColor: '#000',
190
- shadowOffset: { width: 0, height: 2 },
191
- shadowOpacity: 0.15,
192
- maxWidth: 760,
193
- },
194
- title: {
195
- fontSize: 24,
196
- fontWeight: 'bold',
197
- color: '#333',
198
- marginBottom: 8,
199
- textAlign: 'center',
200
- },
201
- description: {
202
- fontSize: 16,
203
- color: '#666',
204
- textAlign: 'center',
205
- marginBottom: 24,
206
- lineHeight: 22,
207
- },
208
- locationContainer: {
209
- flex: 1,
210
- justifyContent: 'center',
211
- alignItems: 'center',
212
- padding: 24,
213
- },
214
- iconContainer: {
215
- marginBottom: 24,
216
- },
217
- locationIcon: {
218
- fontSize: 80,
219
- },
220
- locationRequest: {
221
- alignItems: 'center',
222
- width: '100%',
223
- },
224
- locationRequestText: {
225
- fontSize: 16,
226
- color: '#666',
227
- textAlign: 'center',
228
- marginBottom: 24,
229
- },
230
- locationButton: {
231
- paddingHorizontal: 32,
232
- paddingVertical: 16,
233
- borderRadius: 8,
234
- minWidth: 200,
235
- alignItems: 'center',
236
- },
237
- locationButtonDisabled: {
238
- opacity: 0.6,
239
- },
240
- locationButtonText: {
241
- color: 'white',
242
- fontWeight: '600',
243
- fontSize: 16,
244
- },
245
- buttonContainer: {
246
- flexDirection: 'row',
247
- justifyContent: 'space-around',
248
- alignItems: 'center',
249
- marginTop: 24,
250
- width: '100%',
251
- },
252
- primaryButton: {
253
- paddingHorizontal: 32,
254
- paddingVertical: 16,
255
- borderRadius: 8,
256
- minWidth: 120,
257
- alignItems: 'center',
258
- },
259
- primaryButtonText: {
260
- color: 'white',
261
- fontWeight: '600',
262
- fontSize: 16,
263
- },
264
- secondaryButton: {
265
- backgroundColor: '#e5e5e5',
266
- paddingHorizontal: 32,
267
- paddingVertical: 16,
268
- borderRadius: 8,
269
- minWidth: 120,
270
- alignItems: 'center',
271
- },
272
- secondaryButtonText: {
273
- color: '#333',
274
- fontWeight: '600',
275
- fontSize: 16,
276
- },
277
- requiredContainer: {
278
- backgroundColor: '#fff3cd',
279
- padding: 16,
280
- borderRadius: 8,
281
- marginTop: 16,
282
- },
283
- requiredText: {
284
- fontSize: 16,
285
- fontWeight: '600',
286
- color: '#856404',
287
- marginBottom: 8,
288
- },
289
- requiredSubtext: {
290
- fontSize: 14,
291
- color: '#856404',
292
- lineHeight: 20,
293
- },
294
- accuracyContainer: {
295
- backgroundColor: '#f0f9f0',
296
- padding: 16,
297
- borderRadius: 8,
298
- marginTop: 16,
299
- },
300
- accuracyTitle: {
301
- fontSize: 16,
302
- fontWeight: '600',
303
- color: '#2DBD60',
304
- marginBottom: 8,
305
- },
306
- accuracyText: {
307
- fontSize: 14,
308
- color: '#666',
309
- lineHeight: 20,
310
- },
311
- errorText: {
312
- color: '#dc2626',
313
- fontSize: 14,
314
- marginTop: 8,
315
- textAlign: 'center',
316
- },
183
+ container: { padding: 16, backgroundColor: 'white', marginHorizontal: 12, marginTop: 12, borderRadius: 12, shadowColor: '#000', shadowOffset: { width: 0, height: 2 }, shadowOpacity: 0.15, maxWidth: 760 },
184
+ title: { fontSize: 24, fontWeight: 'bold', color: '#333', marginBottom: 8, textAlign: 'center' },
185
+ description: { fontSize: 16, color: '#666', textAlign: 'center', marginBottom: 24, lineHeight: 22 },
186
+ locationContainer: { flex: 1, justifyContent: 'center', alignItems: 'center', padding: 24 },
187
+ iconContainer: { marginBottom: 24 },
188
+ locationIcon: { fontSize: 80 },
189
+ locationRequest: { alignItems: 'center', width: '100%' },
190
+ locationRequestText: { fontSize: 16, color: '#666', textAlign: 'center', marginBottom: 24 },
191
+ locationButton: { paddingHorizontal: 32, paddingVertical: 16, borderRadius: 8, minWidth: 200, alignItems: 'center' },
192
+ locationButtonDisabled: { opacity: 0.6 },
193
+ locationButtonText: { color: 'white', fontWeight: '600', fontSize: 16 },
194
+ buttonContainer: { flexDirection: 'row', justifyContent: 'space-around', alignItems: 'center', marginTop: 24, width: '100%' },
195
+ primaryButton: { paddingHorizontal: 32, paddingVertical: 16, borderRadius: 8, minWidth: 120, alignItems: 'center' },
196
+ primaryButtonText: { color: 'white', fontWeight: '600', fontSize: 16 },
197
+ secondaryButton: { backgroundColor: '#e5e5e5', paddingHorizontal: 32, paddingVertical: 16, borderRadius: 8, minWidth: 120, alignItems: 'center' },
198
+ secondaryButtonText: { color: '#333', fontWeight: '600', fontSize: 16 },
199
+ requiredContainer: { backgroundColor: '#fff3cd', padding: 16, borderRadius: 8, marginTop: 16 },
200
+ requiredText: { fontSize: 16, fontWeight: '600', color: '#856404', marginBottom: 8 },
201
+ requiredSubtext: { fontSize: 14, color: '#856404', lineHeight: 20 },
202
+ accuracyContainer: { backgroundColor: '#f0f9f0', padding: 16, borderRadius: 8, marginTop: 16 },
203
+ accuracyTitle: { fontSize: 16, fontWeight: '600', color: '#2DBD60', marginBottom: 8 },
204
+ accuracyText: { fontSize: 14, color: '#666', lineHeight: 20 },
205
+ errorText: { color: '#dc2626', fontSize: 14, marginTop: 8, textAlign: 'center' },
317
206
  });
318
207
  //# sourceMappingURL=LocationCaptureTemplate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LocationCaptureTemplate.js","sourceRoot":"","sources":["../../../../src/components/KYCElements/LocationCaptureTemplate.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useEffect } from 'react';\nimport { View, Text, StyleSheet, Platform } from 'react-native';\nimport { LocationConfig, TemplateComponent } from '../../types/KYC.types';\nimport ShieldIcon from '../Svgs/Schield';\nimport GpsIcon from '../Svgs/GpsIcon';\nimport { Button } from '../ui/Button';\nimport * as Location from 'expo-location';\nimport { useTemplateKYCFlowContext } from '../../hooks/useTemplateKYCFlow';\nimport { useI18n } from '../../hooks/useI18n';\nimport { showAlert } from '../../utils/platformAlert';\n\ninterface LocationCaptureTemplateProps {\n component: TemplateComponent;\n value?: { latitude: number; longitude: number; accuracy: number } | null;\n onValueChange: (value: { latitude: number; longitude: number; accuracy: number } | null) => void;\n error?: string;\n language?: string;\n}\n\nexport const LocationCaptureTemplate: React.FC<LocationCaptureTemplateProps> = ({\n component,\n value,\n onValueChange,\n error,\n language = 'en',\n}) => {\n const { t } = useI18n();\n const [isRequesting, setIsRequesting] = useState(false);\n const [currentLocation, setCurrentLocation] = useState<{ latitude: number; longitude: number; accuracy: number } | null>(value || null);\n const { actions } = useTemplateKYCFlowContext();\n const config = component.config as LocationConfig;\n\n const requestLocationPermission = async (): Promise<boolean> => {\n try {\n // On web, use browser's geolocation API directly\n if (Platform.OS === 'web') {\n return await requestWebGeolocationPermission();\n }\n \n // On native, use expo-location\n const { status } = await Location.requestForegroundPermissionsAsync();\n return status === 'granted';\n } catch (err) {\n console.warn('Erreur lors de la demande de permission:', err);\n return false;\n }\n };\n\n const requestWebGeolocationPermission = async (): Promise<boolean> => {\n if (!navigator.geolocation) {\n console.error('Geolocation is not supported by this browser');\n return false;\n }\n\n try {\n // Check if permission API is available\n if ('permissions' in navigator) {\n const result = await navigator.permissions.query({ name: 'geolocation' as PermissionName });\n return result.state === 'granted' || result.state === 'prompt';\n }\n \n // Fallback: assume we can request permission\n return true;\n } catch (err) {\n console.warn('Could not check geolocation permission:', err);\n // Assume we can try to request\n return true;\n }\n };\n\n const getCurrentLocation = async () => {\n try {\n setIsRequesting(true);\n\n // Web platform: use browser geolocation API\n if (Platform.OS === 'web') {\n await getWebGeolocation();\n return;\n }\n\n // Native platform: use expo-location\n const hasLocationPermission = await requestLocationPermission();\n if (!hasLocationPermission) {\n showAlert(\n t('kyc.locationCapture.permissionDeniedTitle'),\n t('kyc.locationCapture.permissionDeniedMessage')\n );\n setIsRequesting(false);\n return;\n }\n\n // Vérifier si la localisation est activée\n const isLocationEnabled = await Location.hasServicesEnabledAsync();\n if (!isLocationEnabled) {\n showAlert(\n t('kyc.locationCapture.locationDisabledTitle'),\n t('kyc.locationCapture.locationDisabledMessage')\n );\n setIsRequesting(false);\n return;\n }\n\n // Récupérer la localisation actuelle\n const location = await Location.getCurrentPositionAsync({\n accuracy: config.accuracy === 'high' ? Location.Accuracy.High : Location.Accuracy.Balanced,\n timeInterval: 5000,\n distanceInterval: 10,\n });\n\n const locationData = {\n latitude: location.coords.latitude,\n longitude: location.coords.longitude,\n accuracy: location.coords.accuracy || 50,\n };\n\n // Mettre à jour l'état local et passer la valeur au parent\n setCurrentLocation(locationData);\n onValueChange(locationData);\n\n } catch (error) {\n console.error('Erreur lors de la récupération de la localisation:', error);\n showAlert(t('kyc.locationCapture.errorTitle'), t('kyc.locationCapture.errorMessage'));\n } finally {\n setIsRequesting(false);\n }\n };\n\n const getWebGeolocation = async () => {\n return new Promise<void>((resolve, reject) => {\n if (!navigator.geolocation) {\n showAlert(\n t('kyc.locationCapture.errorTitle'),\n 'Geolocation is not supported by your browser. Please use a modern browser or enable location services.'\n );\n reject(new Error('Geolocation not supported'));\n return;\n }\n\n const options: PositionOptions = {\n enableHighAccuracy: config.accuracy === 'high',\n timeout: 10000,\n maximumAge: 0,\n };\n\n navigator.geolocation.getCurrentPosition(\n (position) => {\n const locationData = {\n latitude: position.coords.latitude,\n longitude: position.coords.longitude,\n accuracy: position.coords.accuracy,\n };\n\n setCurrentLocation(locationData);\n onValueChange(locationData);\n resolve();\n },\n (error) => {\n console.error('Geolocation error:', error);\n \n let errorMessage = t('kyc.locationCapture.errorMessage');\n \n switch (error.code) {\n case error.PERMISSION_DENIED:\n errorMessage = Platform.OS === 'web' \n ? 'Location permission denied. Please enable location access in your browser settings and try again.'\n : t('kyc.locationCapture.permissionDeniedMessage');\n break;\n case error.POSITION_UNAVAILABLE:\n errorMessage = 'Location information is unavailable. Please check your device settings.';\n break;\n case error.TIMEOUT:\n errorMessage = 'Location request timed out. Please try again.';\n break;\n }\n \n showAlert(t('kyc.locationCapture.errorTitle'), errorMessage);\n reject(error);\n },\n options\n );\n });\n };\n\n // Passer automatiquement à l'étape suivante quand la localisation est obtenue\n useEffect(() => {\n if (currentLocation && !isRequesting) {\n // Délai court pour permettre à l'utilisateur de voir la localisation obtenue\n const timer = setTimeout(() => {\n actions.nextComponent();\n }, 1500);\n\n return () => clearTimeout(timer);\n }\n return undefined;\n }, [currentLocation, isRequesting, actions]);\n\n\n\n return (\n <View style={styles.container}>\n <View style={{ flexDirection: 'column', alignItems: 'center', justifyContent: 'center' }}>\n <View style={{ position: 'relative', width: 70, }}>\n <View style={{ flexDirection: 'row', alignItems: 'center', justifyContent: 'center', width: 60, height: 60, backgroundColor: '#2DBE60', borderRadius: 100 }}>\n <ShieldIcon />\n </View>\n <View style={{ position: 'absolute', top: \"60%\", right: 0, flexDirection: 'row', alignItems: 'center', justifyContent: 'center', width: 40, height: 40, backgroundColor: 'white', borderRadius: 100, shadowColor: '#000', shadowOffset: { width: 0, height: 2 }, shadowOpacity: 0.15, shadowRadius: 1.84, elevation: 5 }}>\n <GpsIcon />\n </View>\n </View>\n <View style={{ flexDirection: 'column', alignItems: 'center', justifyContent: 'center', marginTop: 36 }}>\n <Text style={{ fontSize: 24, fontWeight: 'bold', color: '#333', marginBottom: 8 }}>{t('kyc.locationCapture.title')}</Text>\n <Text style={{ fontSize: 16, color: '#666', textAlign: 'center', marginBottom: 24, lineHeight: 22 }}>\n {t('kyc.locationCapture.description')}\n </Text>\n </View>\n <View style={{ flexDirection: 'column', marginTop: 36, backgroundColor: \"#F9FAFB\", padding: 12, borderRadius: 12, width: '100%', }}>\n <Text style={{ fontSize: 16, color: 'black', fontWeight: 'bold', textAlign: 'left', lineHeight: 22 }}>\n {t('kyc.locationCapture.howThisHelps')}\n </Text>\n <Text style={{ fontSize: 16, color: '#666', textAlign: 'left', lineHeight: 22 }}>\n {t('kyc.locationCapture.howThisHelpsList')}\n </Text>\n </View>\n\n {!currentLocation && (\n <Button\n title={isRequesting ? t('kyc.locationCapture.fetching') : t('kyc.locationCapture.enableButton')}\n fullWidth\n onPress={getCurrentLocation}\n disabled={isRequesting}\n style={{ paddingVertical: 20, marginTop: 36 }}\n />\n )}\n\n <View style={{\n height: 12,\n }} />\n </View>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n padding: 16,\n backgroundColor: 'white',\n marginHorizontal: 12,\n marginTop: 12,\n borderRadius: 12,\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.15,\n maxWidth: 760,\n },\n title: {\n fontSize: 24,\n fontWeight: 'bold',\n color: '#333',\n marginBottom: 8,\n textAlign: 'center',\n },\n description: {\n fontSize: 16,\n color: '#666',\n textAlign: 'center',\n marginBottom: 24,\n lineHeight: 22,\n },\n locationContainer: {\n flex: 1,\n justifyContent: 'center',\n alignItems: 'center',\n padding: 24,\n },\n iconContainer: {\n marginBottom: 24,\n },\n locationIcon: {\n fontSize: 80,\n },\n locationRequest: {\n alignItems: 'center',\n width: '100%',\n },\n locationRequestText: {\n fontSize: 16,\n color: '#666',\n textAlign: 'center',\n marginBottom: 24,\n },\n locationButton: {\n paddingHorizontal: 32,\n paddingVertical: 16,\n borderRadius: 8,\n minWidth: 200,\n alignItems: 'center',\n },\n locationButtonDisabled: {\n opacity: 0.6,\n },\n locationButtonText: {\n color: 'white',\n fontWeight: '600',\n fontSize: 16,\n },\n buttonContainer: {\n flexDirection: 'row',\n justifyContent: 'space-around',\n alignItems: 'center',\n marginTop: 24,\n width: '100%',\n },\n primaryButton: {\n paddingHorizontal: 32,\n paddingVertical: 16,\n borderRadius: 8,\n minWidth: 120,\n alignItems: 'center',\n },\n primaryButtonText: {\n color: 'white',\n fontWeight: '600',\n fontSize: 16,\n },\n secondaryButton: {\n backgroundColor: '#e5e5e5',\n paddingHorizontal: 32,\n paddingVertical: 16,\n borderRadius: 8,\n minWidth: 120,\n alignItems: 'center',\n },\n secondaryButtonText: {\n color: '#333',\n fontWeight: '600',\n fontSize: 16,\n },\n requiredContainer: {\n backgroundColor: '#fff3cd',\n padding: 16,\n borderRadius: 8,\n marginTop: 16,\n },\n requiredText: {\n fontSize: 16,\n fontWeight: '600',\n color: '#856404',\n marginBottom: 8,\n },\n requiredSubtext: {\n fontSize: 14,\n color: '#856404',\n lineHeight: 20,\n },\n accuracyContainer: {\n backgroundColor: '#f0f9f0',\n padding: 16,\n borderRadius: 8,\n marginTop: 16,\n },\n accuracyTitle: {\n fontSize: 16,\n fontWeight: '600',\n color: '#2DBD60',\n marginBottom: 8,\n },\n accuracyText: {\n fontSize: 14,\n color: '#666',\n lineHeight: 20,\n },\n errorText: {\n color: '#dc2626',\n fontSize: 14,\n marginTop: 8,\n textAlign: 'center',\n },\n}); "]}
1
+ {"version":3,"file":"LocationCaptureTemplate.js","sourceRoot":"","sources":["../../../../src/components/KYCElements/LocationCaptureTemplate.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAEhE,OAAO,UAAU,MAAM,iBAAiB,CAAC;AACzC,OAAO,OAAO,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC,CAAC,uBAAuB;AAUvE,MAAM,CAAC,MAAM,uBAAuB,GAA2C,CAAC,EAC9E,SAAS,EACT,KAAK,EACL,aAAa,EACb,KAAK,EACL,QAAQ,GAAG,IAAI,GAChB,EAAE,EAAE;IACH,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;IACxB,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxD,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAmE,KAAK,IAAI,IAAI,CAAC,CAAC;IACxI,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,yBAAyB,EAAE,CAAC;IACvD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAwB,CAAC;IAElD,gDAAgD;IAChD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC;YAC9B,SAAS,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;IAEhC,MAAM,yBAAyB,GAAG,KAAK,IAAsB,EAAE;QAC7D,IAAI,CAAC;YACH,IAAI,QAAQ,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;gBAC1B,OAAO,MAAM,+BAA+B,EAAE,CAAC;YACjD,CAAC;YACD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,iCAAiC,EAAE,CAAC;YACtE,OAAO,MAAM,KAAK,SAAS,CAAC;QAC9B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,0CAA0C,EAAE,GAAG,CAAC,CAAC;YAC9D,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,+BAA+B,GAAG,KAAK,IAAsB,EAAE;QACnE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;YAC3B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC;YACH,IAAI,aAAa,IAAI,SAAS,EAAE,CAAC;gBAC/B,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,aAA+B,EAAE,CAAC,CAAC;gBAC5F,OAAO,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC;YACjE,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,KAAK,IAAI,EAAE;QACpC,IAAI,CAAC;YACH,SAAS,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC,SAAS;YAC5D,eAAe,CAAC,IAAI,CAAC,CAAC;YAEtB,IAAI,QAAQ,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;gBAC1B,MAAM,iBAAiB,EAAE,CAAC;gBAC1B,OAAO;YACT,CAAC;YAED,MAAM,qBAAqB,GAAG,MAAM,yBAAyB,EAAE,CAAC;YAChE,IAAI,CAAC,qBAAqB,EAAE,CAAC;gBAC3B,SAAS,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC,CAAC,SAAS;gBAC/D,SAAS,CACP,CAAC,CAAC,2CAA2C,CAAC,EAC9C,CAAC,CAAC,6CAA6C,CAAC,CACjD,CAAC;gBACF,eAAe,CAAC,KAAK,CAAC,CAAC;gBACvB,OAAO;YACT,CAAC;YAED,MAAM,iBAAiB,GAAG,MAAM,QAAQ,CAAC,uBAAuB,EAAE,CAAC;YACnE,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACvB,SAAS,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC,CAAC,SAAS;gBACrE,SAAS,CACP,CAAC,CAAC,2CAA2C,CAAC,EAC9C,CAAC,CAAC,6CAA6C,CAAC,CACjD,CAAC;gBACF,eAAe,CAAC,KAAK,CAAC,CAAC;gBACvB,OAAO;YACT,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,uBAAuB,CAAC;gBACtD,QAAQ,EAAE,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ;gBAC1F,YAAY,EAAE,IAAI;gBAClB,gBAAgB,EAAE,EAAE;aACrB,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG;gBACnB,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ;gBAClC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS;gBACpC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE;aACzC,CAAC;YAEF,oDAAoD;YACpD,SAAS,CAAC,IAAI,CAAC,gCAAgC,EAAE,EAAE,QAAQ,EAAE,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;YAE1G,kBAAkB,CAAC,YAAY,CAAC,CAAC;YACjC,aAAa,CAAC,YAAY,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,SAAS,CAAC,KAAK,CAAC,mCAAmC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS;YAC1F,SAAS,CAAC,CAAC,CAAC,gCAAgC,CAAC,EAAE,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC;QACxF,CAAC;gBAAS,CAAC;YACT,eAAe,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,KAAK,IAAI,EAAE;QACnC,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3C,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;gBAC3B,SAAS,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC,CAAC,SAAS;gBACtE,SAAS,CACP,CAAC,CAAC,gCAAgC,CAAC,EACnC,wGAAwG,CACzG,CAAC;gBACF,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;gBAC/C,OAAO;YACT,CAAC;YAED,MAAM,OAAO,GAAoB;gBAC/B,kBAAkB,EAAE,MAAM,CAAC,QAAQ,KAAK,MAAM;gBAC9C,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,CAAC;aACd,CAAC;YAEF,SAAS,CAAC,WAAW,CAAC,kBAAkB,CACtC,CAAC,QAAQ,EAAE,EAAE;gBACX,MAAM,YAAY,GAAG;oBACnB,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ;oBAClC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS;oBACpC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ;iBACnC,CAAC;gBAEF,oDAAoD;gBACpD,SAAS,CAAC,IAAI,CAAC,gCAAgC,EAAE,EAAE,QAAQ,EAAE,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;gBAEvG,kBAAkB,CAAC,YAAY,CAAC,CAAC;gBACjC,aAAa,CAAC,YAAY,CAAC,CAAC;gBAC5B,OAAO,EAAE,CAAC;YACZ,CAAC,EACD,CAAC,KAAK,EAAE,EAAE;gBACR,SAAS,CAAC,KAAK,CAAC,uBAAuB,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS;gBAE3G,IAAI,YAAY,GAAG,CAAC,CAAC,kCAAkC,CAAC,CAAC;gBACzD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;oBACnB,KAAK,KAAK,CAAC,iBAAiB;wBAC1B,YAAY,GAAG,QAAQ,CAAC,EAAE,KAAK,KAAK;4BAClC,CAAC,CAAC,mGAAmG;4BACrG,CAAC,CAAC,CAAC,CAAC,6CAA6C,CAAC,CAAC;wBACrD,MAAM;oBACR,KAAK,KAAK,CAAC,oBAAoB;wBAC7B,YAAY,GAAG,yEAAyE,CAAC;wBACzF,MAAM;oBACR,KAAK,KAAK,CAAC,OAAO;wBAChB,YAAY,GAAG,+CAA+C,CAAC;wBAC/D,MAAM;gBACV,CAAC;gBACD,SAAS,CAAC,CAAC,CAAC,gCAAgC,CAAC,EAAE,YAAY,CAAC,CAAC;gBAC7D,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC,EACD,OAAO,CACR,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,eAAe,IAAI,CAAC,YAAY,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1B,CAAC,EAAE,IAAI,CAAC,CAAC;YACT,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,EAAE,CAAC,eAAe,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IAE7C,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAC5B;MAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,CACvF;QAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAC/C;UAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,CAC1J;YAAA,CAAC,UAAU,CAAC,AAAD,EACb;UAAA,EAAE,IAAI,CACN;UAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,eAAe,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CACvT;YAAA,CAAC,OAAO,CAAC,AAAD,EACV;UAAA,EAAE,IAAI,CACR;QAAA,EAAE,IAAI,CAEN;;QAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CACtG;UAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,EAAE,IAAI,CACzH;UAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAClG;YAAA,CAAC,CAAC,CAAC,iCAAiC,CAAC,CACvC;UAAA,EAAE,IAAI,CACR;QAAA,EAAE,IAAI,CAEN;;QAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,eAAe,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAChI;UAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CACnG;YAAA,CAAC,CAAC,CAAC,kCAAkC,CAAC,CACxC;UAAA,EAAE,IAAI,CACN;UAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAC9E;YAAA,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAC5C;UAAA,EAAE,IAAI,CACR;QAAA,EAAE,IAAI,CAEN;;QAAA,CAAC,CAAC,eAAe,IAAI,CACnB,CAAC,MAAM,CACL,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAChG,SAAS,CACT,OAAO,CAAC,CAAC,kBAAkB,CAAC,CAC5B,QAAQ,CAAC,CAAC,YAAY,CAAC,CACvB,KAAK,CAAC,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,EAC9C,CACH,CACD;QAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,EAC9B;MAAA,EAAE,IAAI,CACR;IAAA,EAAE,IAAI,CAAC,CACR,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC/B,SAAS,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,eAAe,EAAE,OAAO,EAAE,gBAAgB,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE;IAC3M,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE;IAChG,WAAW,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;IACnG,iBAAiB,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE;IAC3F,aAAa,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE;IACnC,YAAY,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;IAC9B,eAAe,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE;IACxD,mBAAmB,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE;IAC3F,cAAc,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE;IACpH,sBAAsB,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE;IACxC,kBAAkB,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE;IACvE,eAAe,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;IAC7H,aAAa,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE;IACnH,iBAAiB,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE;IACtE,eAAe,EAAE,EAAE,eAAe,EAAE,SAAS,EAAE,iBAAiB,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE;IACjJ,mBAAmB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE;IACvE,iBAAiB,EAAE,EAAE,eAAe,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE;IAC9F,YAAY,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,EAAE;IACpF,eAAe,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,EAAE;IACnE,iBAAiB,EAAE,EAAE,eAAe,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE;IAC9F,aAAa,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,EAAE;IACrF,YAAY,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE;IAC7D,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE;CACjF,CAAC,CAAC","sourcesContent":["import React, { useState, useEffect } from 'react';\nimport { View, Text, StyleSheet, Platform } from 'react-native';\nimport { LocationConfig, TemplateComponent } from '../../types/KYC.types';\nimport ShieldIcon from '../Svgs/Schield';\nimport GpsIcon from '../Svgs/GpsIcon';\nimport { Button } from '../ui/Button';\nimport * as Location from 'expo-location';\nimport { useTemplateKYCFlowContext } from '../../hooks/useTemplateKYCFlow';\nimport { useI18n } from '../../hooks/useI18n';\nimport { showAlert } from '../../utils/platformAlert';\nimport { sdkLogger } from '../../utils/logger'; // 🚨 IMPORT SDK LOGGER\n\ninterface LocationCaptureTemplateProps {\n component: TemplateComponent;\n value?: { latitude: number; longitude: number; accuracy: number } | null;\n onValueChange: (value: { latitude: number; longitude: number; accuracy: number } | null) => void;\n error?: string;\n language?: string;\n}\n\nexport const LocationCaptureTemplate: React.FC<LocationCaptureTemplateProps> = ({\n component,\n value,\n onValueChange,\n error,\n language = 'en',\n}) => {\n const { t } = useI18n();\n const [isRequesting, setIsRequesting] = useState(false);\n const [currentLocation, setCurrentLocation] = useState<{ latitude: number; longitude: number; accuracy: number } | null>(value || null);\n const { actions, state } = useTemplateKYCFlowContext();\n const config = component.config as LocationConfig;\n\n // 🚨 LOG: Track when the user reaches this step\n useEffect(() => {\n if (state.session?.session_id) {\n sdkLogger.info(\"User started location capture step\");\n }\n }, [state.session?.session_id]);\n\n const requestLocationPermission = async (): Promise<boolean> => {\n try {\n if (Platform.OS === 'web') {\n return await requestWebGeolocationPermission();\n }\n const { status } = await Location.requestForegroundPermissionsAsync();\n return status === 'granted';\n } catch (err) {\n console.warn('Erreur lors de la demande de permission:', err);\n return false;\n }\n };\n\n const requestWebGeolocationPermission = async (): Promise<boolean> => {\n if (!navigator.geolocation) {\n return false;\n }\n try {\n if ('permissions' in navigator) {\n const result = await navigator.permissions.query({ name: 'geolocation' as PermissionName });\n return result.state === 'granted' || result.state === 'prompt';\n }\n return true;\n } catch (err) {\n return true;\n }\n };\n\n const getCurrentLocation = async () => {\n try {\n sdkLogger.info(\"User initiated location request\"); // 🚨 LOG\n setIsRequesting(true);\n\n if (Platform.OS === 'web') {\n await getWebGeolocation();\n return;\n }\n\n const hasLocationPermission = await requestLocationPermission();\n if (!hasLocationPermission) {\n sdkLogger.warn(\"Location permission denied by user\"); // 🚨 LOG\n showAlert(\n t('kyc.locationCapture.permissionDeniedTitle'),\n t('kyc.locationCapture.permissionDeniedMessage')\n );\n setIsRequesting(false);\n return;\n }\n\n const isLocationEnabled = await Location.hasServicesEnabledAsync();\n if (!isLocationEnabled) {\n sdkLogger.warn(\"Location services are disabled on device\"); // 🚨 LOG\n showAlert(\n t('kyc.locationCapture.locationDisabledTitle'),\n t('kyc.locationCapture.locationDisabledMessage')\n );\n setIsRequesting(false);\n return;\n }\n\n const location = await Location.getCurrentPositionAsync({\n accuracy: config.accuracy === 'high' ? Location.Accuracy.High : Location.Accuracy.Balanced,\n timeInterval: 5000,\n distanceInterval: 10,\n });\n\n const locationData = {\n latitude: location.coords.latitude,\n longitude: location.coords.longitude,\n accuracy: location.coords.accuracy || 50,\n };\n\n // 🚨 LOG: Success (coordinates omitted for privacy)\n sdkLogger.info(\"Location successfully captured\", { accuracy: locationData.accuracy, platform: 'native' });\n\n setCurrentLocation(locationData);\n onValueChange(locationData);\n } catch (error: any) {\n sdkLogger.error(\"Failed to capture native location\", { error: error?.message }); // 🚨 LOG\n showAlert(t('kyc.locationCapture.errorTitle'), t('kyc.locationCapture.errorMessage'));\n } finally {\n setIsRequesting(false);\n }\n };\n\n const getWebGeolocation = async () => {\n return new Promise<void>((resolve, reject) => {\n if (!navigator.geolocation) {\n sdkLogger.error(\"Web Geolocation not supported by browser\"); // 🚨 LOG\n showAlert(\n t('kyc.locationCapture.errorTitle'),\n 'Geolocation is not supported by your browser. Please use a modern browser or enable location services.'\n );\n reject(new Error('Geolocation not supported'));\n return;\n }\n\n const options: PositionOptions = {\n enableHighAccuracy: config.accuracy === 'high',\n timeout: 10000,\n maximumAge: 0,\n };\n\n navigator.geolocation.getCurrentPosition(\n (position) => {\n const locationData = {\n latitude: position.coords.latitude,\n longitude: position.coords.longitude,\n accuracy: position.coords.accuracy,\n };\n \n // 🚨 LOG: Success (coordinates omitted for privacy)\n sdkLogger.info(\"Location successfully captured\", { accuracy: locationData.accuracy, platform: 'web' });\n\n setCurrentLocation(locationData);\n onValueChange(locationData);\n resolve();\n },\n (error) => {\n sdkLogger.error(\"Web Geolocation error\", { errorCode: error.code, errorMessage: error.message }); // 🚨 LOG\n\n let errorMessage = t('kyc.locationCapture.errorMessage');\n switch (error.code) {\n case error.PERMISSION_DENIED:\n errorMessage = Platform.OS === 'web'\n ? 'Location permission denied. Please enable location access in your browser settings and try again.'\n : t('kyc.locationCapture.permissionDeniedMessage');\n break;\n case error.POSITION_UNAVAILABLE:\n errorMessage = 'Location information is unavailable. Please check your device settings.';\n break;\n case error.TIMEOUT:\n errorMessage = 'Location request timed out. Please try again.';\n break;\n }\n showAlert(t('kyc.locationCapture.errorTitle'), errorMessage);\n reject(error);\n },\n options\n );\n });\n };\n\n useEffect(() => {\n if (currentLocation && !isRequesting) {\n const timer = setTimeout(() => {\n actions.nextComponent();\n }, 1500);\n return () => clearTimeout(timer);\n }\n return undefined;\n }, [currentLocation, isRequesting, actions]);\n\n return (\n <View style={styles.container}>\n <View style={{ flexDirection: 'column', alignItems: 'center', justifyContent: 'center' }}>\n <View style={{ position: 'relative', width: 70 }}>\n <View style={{ flexDirection: 'row', alignItems: 'center', justifyContent: 'center', width: 60, height: 60, backgroundColor: '#2DBE60', borderRadius: 100 }}>\n <ShieldIcon />\n </View>\n <View style={{ position: 'absolute', top: \"60%\", right: 0, flexDirection: 'row', alignItems: 'center', justifyContent: 'center', width: 40, height: 40, backgroundColor: 'white', borderRadius: 100, shadowColor: '#000', shadowOffset: { width: 0, height: 2 }, shadowOpacity: 0.15, shadowRadius: 1.84, elevation: 5 }}>\n <GpsIcon />\n </View>\n </View>\n\n <View style={{ flexDirection: 'column', alignItems: 'center', justifyContent: 'center', marginTop: 36 }}>\n <Text style={{ fontSize: 24, fontWeight: 'bold', color: '#333', marginBottom: 8 }}>{t('kyc.locationCapture.title')}</Text>\n <Text style={{ fontSize: 16, color: '#666', textAlign: 'center', marginBottom: 24, lineHeight: 22 }}>\n {t('kyc.locationCapture.description')}\n </Text>\n </View>\n\n <View style={{ flexDirection: 'column', marginTop: 36, backgroundColor: \"#F9FAFB\", padding: 12, borderRadius: 12, width: '100%' }}>\n <Text style={{ fontSize: 16, color: 'black', fontWeight: 'bold', textAlign: 'left', lineHeight: 22 }}>\n {t('kyc.locationCapture.howThisHelps')}\n </Text>\n <Text style={{ fontSize: 16, color: '#666', textAlign: 'left', lineHeight: 22 }}>\n {t('kyc.locationCapture.howThisHelpsList')}\n </Text>\n </View>\n\n {!currentLocation && (\n <Button\n title={isRequesting ? t('kyc.locationCapture.fetching') : t('kyc.locationCapture.enableButton')}\n fullWidth\n onPress={getCurrentLocation}\n disabled={isRequesting}\n style={{ paddingVertical: 20, marginTop: 36 }}\n />\n )}\n <View style={{ height: 12 }} />\n </View>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: { padding: 16, backgroundColor: 'white', marginHorizontal: 12, marginTop: 12, borderRadius: 12, shadowColor: '#000', shadowOffset: { width: 0, height: 2 }, shadowOpacity: 0.15, maxWidth: 760 },\n title: { fontSize: 24, fontWeight: 'bold', color: '#333', marginBottom: 8, textAlign: 'center' },\n description: { fontSize: 16, color: '#666', textAlign: 'center', marginBottom: 24, lineHeight: 22 },\n locationContainer: { flex: 1, justifyContent: 'center', alignItems: 'center', padding: 24 },\n iconContainer: { marginBottom: 24 },\n locationIcon: { fontSize: 80 },\n locationRequest: { alignItems: 'center', width: '100%' },\n locationRequestText: { fontSize: 16, color: '#666', textAlign: 'center', marginBottom: 24 },\n locationButton: { paddingHorizontal: 32, paddingVertical: 16, borderRadius: 8, minWidth: 200, alignItems: 'center' },\n locationButtonDisabled: { opacity: 0.6 },\n locationButtonText: { color: 'white', fontWeight: '600', fontSize: 16 },\n buttonContainer: { flexDirection: 'row', justifyContent: 'space-around', alignItems: 'center', marginTop: 24, width: '100%' },\n primaryButton: { paddingHorizontal: 32, paddingVertical: 16, borderRadius: 8, minWidth: 120, alignItems: 'center' },\n primaryButtonText: { color: 'white', fontWeight: '600', fontSize: 16 },\n secondaryButton: { backgroundColor: '#e5e5e5', paddingHorizontal: 32, paddingVertical: 16, borderRadius: 8, minWidth: 120, alignItems: 'center' },\n secondaryButtonText: { color: '#333', fontWeight: '600', fontSize: 16 },\n requiredContainer: { backgroundColor: '#fff3cd', padding: 16, borderRadius: 8, marginTop: 16 },\n requiredText: { fontSize: 16, fontWeight: '600', color: '#856404', marginBottom: 8 },\n requiredSubtext: { fontSize: 14, color: '#856404', lineHeight: 20 },\n accuracyContainer: { backgroundColor: '#f0f9f0', padding: 16, borderRadius: 8, marginTop: 16 },\n accuracyTitle: { fontSize: 16, fontWeight: '600', color: '#2DBD60', marginBottom: 8 },\n accuracyText: { fontSize: 14, color: '#666', lineHeight: 20 },\n errorText: { color: '#dc2626', fontSize: 14, marginTop: 8, textAlign: 'center' },\n});"]}
@@ -1 +1 @@
1
- {"version":3,"file":"SelfieCapture.d.ts","sourceRoot":"","sources":["../../../../src/components/KYCElements/SelfieCapture.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAKxC,OAAO,EAAE,UAAU,EAAwB,MAAM,uBAAuB,CAAC;AAEzE,UAAU,kBAAkB;IAC1B,OAAO,EAAE,UAAU,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CA4MtD,CAAC"}
1
+ {"version":3,"file":"SelfieCapture.d.ts","sourceRoot":"","sources":["../../../../src/components/KYCElements/SelfieCapture.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAKnD,OAAO,EAAE,UAAU,EAAwB,MAAM,uBAAuB,CAAC;AAIzE,UAAU,kBAAkB;IAC1B,OAAO,EAAE,UAAU,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CA2MtD,CAAC"}