@smileid/web-components 10.0.6 → 11.0.1

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 (142) hide show
  1. package/README.md +15 -15
  2. package/dist/README.md +15 -0
  3. package/dist/components/README.md +14 -0
  4. package/dist/components/document/src/README.md +111 -0
  5. package/dist/components/document/src/document-capture/README.md +90 -0
  6. package/dist/components/document/src/document-capture-instructions/README.md +56 -0
  7. package/dist/components/document/src/document-capture-review/README.md +79 -0
  8. package/dist/components/selfie/README.md +225 -0
  9. package/dist/components/smart-camera-web/src/README.md +207 -0
  10. package/dist/domain/camera/src/README.md +38 -0
  11. package/dist/domain/file-upload/README.md +35 -0
  12. package/dist/esm/{DocumentCaptureScreens-BjATTDqu.js → DocumentCaptureScreens-DmH2JZDA.js} +3 -3
  13. package/dist/esm/DocumentCaptureScreens-DmH2JZDA.js.map +1 -0
  14. package/dist/esm/EndUserConsent-D4fd1ovG.js.map +1 -1
  15. package/dist/esm/Navigation-CTjK6tLU.js.map +1 -1
  16. package/dist/esm/PoweredBySmileId-CxbaihMu.js.map +1 -1
  17. package/dist/esm/SelfieCaptureScreens-DbdN2zNk.js +7901 -0
  18. package/dist/esm/SelfieCaptureScreens-DbdN2zNk.js.map +1 -0
  19. package/dist/esm/SignaturePad-C7MtmT8m.js.map +1 -1
  20. package/dist/esm/TotpConsent-CQU5jQi4.js.map +1 -1
  21. package/dist/esm/combobox.js.map +1 -1
  22. package/dist/esm/document.js +1 -1
  23. package/dist/esm/main.js +2 -2
  24. package/dist/esm/{package-CZlW6BZn.js → package-bgeQiff6.js} +2 -2
  25. package/dist/esm/package-bgeQiff6.js.map +1 -0
  26. package/dist/esm/selfie.js +1 -1
  27. package/dist/esm/smart-camera-web.js +3 -3
  28. package/dist/esm/smart-camera-web.js.map +1 -1
  29. package/dist/esm/styles-BOEZtbuc.js.map +1 -1
  30. package/dist/package-lock.json +4948 -0
  31. package/dist/package.json +59 -0
  32. package/dist/smart-camera-web.js +72 -98
  33. package/dist/smart-camera-web.js.gz +0 -0
  34. package/dist/smart-camera-web.js.map +1 -1
  35. package/dist/src/components/combobox/src/index.js +2 -0
  36. package/dist/src/components/combobox/src/index.js.map +7 -0
  37. package/dist/src/components/document/src/index.js +2 -0
  38. package/dist/src/components/document/src/index.js.map +7 -0
  39. package/dist/src/components/end-user-consent/src/index.js +14 -0
  40. package/dist/src/components/end-user-consent/src/index.js.map +7 -0
  41. package/dist/src/components/selfie/src/index.js +2 -0
  42. package/dist/src/components/selfie/src/index.js.map +7 -0
  43. package/dist/src/components/signature-pad/src/index.js +10 -0
  44. package/dist/src/components/signature-pad/src/index.js.map +7 -0
  45. package/dist/src/components/smart-camera-web/src/SmartCameraWeb.js +2 -0
  46. package/dist/src/components/smart-camera-web/src/SmartCameraWeb.js.map +7 -0
  47. package/dist/src/components/totp-consent/src/index.js +14 -0
  48. package/dist/src/components/totp-consent/src/index.js.map +7 -0
  49. package/dist/src/index.js.map +7 -0
  50. package/dist/styles/README.md +3 -0
  51. package/dist/types/combobox.d.ts +19 -19
  52. package/dist/types/document.d.ts +19 -19
  53. package/dist/types/end-user-consent.d.ts +19 -19
  54. package/dist/types/main.d.ts +24 -20
  55. package/dist/types/navigation.d.ts +19 -19
  56. package/dist/types/selfie.d.ts +19 -19
  57. package/dist/types/signature-pad.d.ts +19 -19
  58. package/dist/types/smart-camera-web.d.ts +19 -19
  59. package/dist/types/totp-consent.d.ts +19 -19
  60. package/lib/components/README.md +14 -14
  61. package/lib/components/attribution/PoweredBySmileId.js +42 -42
  62. package/lib/components/camera-permission/CameraPermission.js +139 -139
  63. package/lib/components/camera-permission/CameraPermission.stories.js +27 -27
  64. package/lib/components/combobox/src/Combobox.js +589 -589
  65. package/lib/components/combobox/src/index.js +1 -1
  66. package/lib/components/document/src/DocumentCaptureScreens.js +410 -409
  67. package/lib/components/document/src/DocumentCaptureScreens.stories.js +57 -57
  68. package/lib/components/document/src/README.md +111 -111
  69. package/lib/components/document/src/document-capture/DocumentCapture.js +760 -760
  70. package/lib/components/document/src/document-capture/DocumentCapture.stories.js +78 -78
  71. package/lib/components/document/src/document-capture/README.md +90 -90
  72. package/lib/components/document/src/document-capture/index.js +3 -3
  73. package/lib/components/document/src/document-capture-instructions/DocumentCaptureInstructions.js +545 -545
  74. package/lib/components/document/src/document-capture-instructions/DocumentCaptureInstructions.stories.js +24 -24
  75. package/lib/components/document/src/document-capture-instructions/README.md +56 -56
  76. package/lib/components/document/src/document-capture-instructions/index.js +3 -3
  77. package/lib/components/document/src/document-capture-review/DocumentCaptureReview.js +360 -360
  78. package/lib/components/document/src/document-capture-review/DocumentCaptureReview.stories.js +24 -24
  79. package/lib/components/document/src/document-capture-review/README.md +79 -79
  80. package/lib/components/document/src/document-capture-review/index.js +3 -3
  81. package/lib/components/document/src/index.js +3 -3
  82. package/lib/components/end-user-consent/src/EndUserConsent.js +795 -795
  83. package/lib/components/end-user-consent/src/EndUserConsent.stories.js +29 -29
  84. package/lib/components/end-user-consent/src/index.js +4 -4
  85. package/lib/components/navigation/src/Navigation.js +171 -171
  86. package/lib/components/navigation/src/Navigation.stories.js +24 -24
  87. package/lib/components/navigation/src/index.js +3 -3
  88. package/lib/components/selfie/README.md +225 -225
  89. package/lib/components/selfie/src/SelfieCaptureScreens.js +420 -431
  90. package/lib/components/selfie/src/SelfieCaptureScreens.stories.js +29 -29
  91. package/lib/components/selfie/src/index.js +3 -3
  92. package/lib/components/selfie/src/selfie-capture/SelfieCapture.js +1099 -1084
  93. package/lib/components/selfie/src/selfie-capture/SelfieCapture.stories.js +36 -36
  94. package/lib/components/selfie/src/selfie-capture/index.js +3 -3
  95. package/lib/components/selfie/src/selfie-capture-instructions/SelfieCaptureInstructions.js +689 -689
  96. package/lib/components/selfie/src/selfie-capture-instructions/SelfieCaptureInstructions.stories.js +23 -23
  97. package/lib/components/selfie/src/selfie-capture-instructions/index.js +3 -3
  98. package/lib/components/selfie/src/selfie-capture-review/SelfieCaptureReview.js +209 -209
  99. package/lib/components/selfie/src/selfie-capture-review/SelfieCaptureReview.stories.js +24 -24
  100. package/lib/components/selfie/src/selfie-capture-review/index.js +3 -3
  101. package/lib/components/selfie/src/selfie-capture-wrapper/SelfieCaptureWrapper.tsx +256 -239
  102. package/lib/components/selfie/src/selfie-capture-wrapper/index.ts +1 -1
  103. package/lib/components/selfie/src/smartselfie-capture/OvalProgress.tsx +81 -81
  104. package/lib/components/selfie/src/smartselfie-capture/SmartSelfieCapture.tsx +265 -283
  105. package/lib/components/selfie/src/smartselfie-capture/components/AlertDisplay.tsx +34 -34
  106. package/lib/components/selfie/src/smartselfie-capture/components/CameraPreview.tsx +97 -97
  107. package/lib/components/selfie/src/smartselfie-capture/components/CaptureControls.tsx +78 -76
  108. package/lib/components/selfie/src/smartselfie-capture/components/index.ts +3 -3
  109. package/lib/components/selfie/src/smartselfie-capture/constants.ts +23 -23
  110. package/lib/components/selfie/src/smartselfie-capture/hooks/index.ts +2 -2
  111. package/lib/components/selfie/src/smartselfie-capture/hooks/useCamera.ts +238 -238
  112. package/lib/components/selfie/src/smartselfie-capture/hooks/useFaceCapture.ts +618 -617
  113. package/lib/components/selfie/src/smartselfie-capture/index.ts +1 -1
  114. package/lib/components/selfie/src/smartselfie-capture/utils/alertMessages.ts +13 -13
  115. package/lib/components/selfie/src/smartselfie-capture/utils/canvas.ts +105 -105
  116. package/lib/components/selfie/src/smartselfie-capture/utils/faceDetection.ts +129 -129
  117. package/lib/components/selfie/src/smartselfie-capture/utils/imageCapture.ts +64 -64
  118. package/lib/components/selfie/src/smartselfie-capture/utils/index.ts +4 -4
  119. package/lib/components/selfie/src/smartselfie-capture/utils/mediapipeManager.ts +77 -77
  120. package/lib/components/signature-pad/package-lock.json +3009 -3009
  121. package/lib/components/signature-pad/package.json +30 -30
  122. package/lib/components/signature-pad/src/SignaturePad.js +484 -484
  123. package/lib/components/signature-pad/src/SignaturePad.stories.js +32 -32
  124. package/lib/components/signature-pad/src/index.js +3 -3
  125. package/lib/components/smart-camera-web/src/README.md +206 -206
  126. package/lib/components/smart-camera-web/src/SmartCameraWeb.js +305 -305
  127. package/lib/components/smart-camera-web/src/SmartCameraWeb.stories.js +57 -57
  128. package/lib/components/totp-consent/src/TotpConsent.js +949 -949
  129. package/lib/components/totp-consent/src/index.js +4 -4
  130. package/lib/domain/camera/src/README.md +38 -38
  131. package/lib/domain/camera/src/SmartCamera.js +109 -109
  132. package/lib/domain/constants/src/Constants.js +27 -27
  133. package/lib/domain/file-upload/README.md +35 -35
  134. package/lib/domain/file-upload/src/SmartFileUpload.js +65 -65
  135. package/lib/styles/README.md +3 -3
  136. package/lib/styles/src/styles.js +372 -372
  137. package/lib/styles/src/typography.js +52 -52
  138. package/package.json +111 -112
  139. package/dist/esm/DocumentCaptureScreens-BjATTDqu.js.map +0 -1
  140. package/dist/esm/SelfieCaptureScreens-UUzZzl1A.js +0 -11361
  141. package/dist/esm/SelfieCaptureScreens-UUzZzl1A.js.map +0 -1
  142. package/dist/esm/package-CZlW6BZn.js.map +0 -1
@@ -1,239 +1,256 @@
1
- import { useState, useEffect } from 'preact/hooks';
2
- import { IconLoader2 } from '@tabler/icons-preact';
3
- import register from 'preact-custom-element';
4
- import type { FunctionComponent } from 'preact';
5
-
6
- import { getBoolProp } from '@/utils/props';
7
- import SmartSelfieCapture from '../smartselfie-capture/SmartSelfieCapture';
8
- import '../selfie-capture/SelfieCapture';
9
- import { getMediapipeInstance } from '../smartselfie-capture/utils/mediapipeManager';
10
-
11
- interface Props {
12
- timeout?: number;
13
- interval?: number;
14
- duration?: number;
15
- 'theme-color'?: string;
16
- 'show-navigation'?: string | boolean;
17
- 'allow-agent-mode'?: string | boolean;
18
- 'show-agent-mode-for-tests'?: string | boolean;
19
- 'hide-attribution'?: string | boolean;
20
- 'disable-image-tests'?: string | boolean;
21
- key?: string;
22
- 'start-countdown'?: string | boolean;
23
- hidden?: string | boolean;
24
- }
25
-
26
- const SelfieCaptureWrapper: FunctionComponent<Props> = ({
27
- timeout = 20000,
28
- 'start-countdown': startCountdownProp = false,
29
- hidden: hiddenProp = false,
30
- ...props
31
- }) => {
32
- const hidden = getBoolProp(hiddenProp);
33
- const startCountdown = getBoolProp(startCountdownProp);
34
- const [mediapipeReady, setMediapipeReady] = useState(false);
35
- const [loadingProgress, setLoadingProgress] = useState(0);
36
- const [initialSessionCompleted, setInitialSessionCompleted] = useState(false);
37
- const [mediapipeLoading, setMediapipeLoading] = useState(false);
38
- const [usingSelfieCapture, setUsingSelfieCapture] = useState(false);
39
-
40
- useEffect(() => {
41
- if (mediapipeReady || mediapipeLoading) return;
42
-
43
- const loadMediapipe = async () => {
44
- setMediapipeLoading(true);
45
- try {
46
- await getMediapipeInstance();
47
- setMediapipeReady(true);
48
- } catch (error) {
49
- console.error('Failed to load Mediapipe:', error);
50
- }
51
- setMediapipeLoading(false);
52
- };
53
-
54
- loadMediapipe();
55
- }, [mediapipeReady, mediapipeLoading]);
56
-
57
- useEffect(() => {
58
- if (hidden || !startCountdown || mediapipeReady) return undefined;
59
-
60
- const timer = setInterval(() => {
61
- setLoadingProgress((prev: number) => Math.min(prev + 1, 100));
62
- }, timeout / 100);
63
-
64
- return () => {
65
- clearInterval(timer);
66
- };
67
- }, [hidden, startCountdown, timeout, mediapipeReady]);
68
-
69
- useEffect(() => {
70
- if (hidden || mediapipeReady || loadingProgress < 100) return undefined;
71
-
72
- const setupEventForwarding = () => {
73
- const selfieCapture = document.querySelector('selfie-capture');
74
- if (
75
- selfieCapture &&
76
- !selfieCapture.hasAttribute('data-backup-events-setup')
77
- ) {
78
- selfieCapture.setAttribute('data-backup-events-setup', 'true');
79
-
80
- const forwardEvent = (event: Event) => {
81
- const customEvent = event as CustomEvent;
82
- window.dispatchEvent(
83
- new CustomEvent(customEvent.type, {
84
- detail: customEvent.detail,
85
- bubbles: true,
86
- }),
87
- );
88
- };
89
-
90
- selfieCapture.addEventListener('selfie-capture.publish', forwardEvent);
91
- selfieCapture.addEventListener(
92
- 'selfie-capture.cancelled',
93
- forwardEvent,
94
- );
95
- selfieCapture.addEventListener('selfie-capture.close', forwardEvent);
96
-
97
- return () => {
98
- selfieCapture.removeEventListener(
99
- 'selfie-capture.publish',
100
- forwardEvent,
101
- );
102
- selfieCapture.removeEventListener(
103
- 'selfie-capture.cancelled',
104
- forwardEvent,
105
- );
106
- selfieCapture.removeEventListener(
107
- 'selfie-capture.close',
108
- forwardEvent,
109
- );
110
- };
111
- }
112
- return undefined;
113
- };
114
-
115
- const timeoutId = setTimeout(setupEventForwarding, 200);
116
- return () => {
117
- clearTimeout(timeoutId);
118
- };
119
- }, [hidden, mediapipeReady, loadingProgress]);
120
-
121
- useEffect(() => {
122
- if (hidden || mediapipeLoading) return;
123
-
124
- const smartCameraWeb = document.querySelector('smart-camera-web');
125
- smartCameraWeb?.dispatchEvent(
126
- new CustomEvent('metadata.active-liveness-version', {
127
- detail: {
128
- version: usingSelfieCapture ? '0.0.1' : '1.0.0',
129
- },
130
- }),
131
- );
132
- }, [usingSelfieCapture, hidden, mediapipeLoading]);
133
-
134
- if (hidden) {
135
- return null;
136
- }
137
-
138
- // on retakes, prefer SmartSelfieCapture if Mediapipe is ready
139
- if (initialSessionCompleted && mediapipeReady && !usingSelfieCapture) {
140
- return <SmartSelfieCapture {...props} />;
141
- }
142
-
143
- // use SmartSelfieCapture if mediapipe loads
144
- if (!initialSessionCompleted && mediapipeReady && !usingSelfieCapture) {
145
- return <SmartSelfieCapture {...props} />;
146
- }
147
-
148
- if (loadingProgress >= 100) {
149
- if (!usingSelfieCapture) {
150
- setUsingSelfieCapture(true);
151
- }
152
-
153
- const propsWithoutHidden = { ...props };
154
- delete (propsWithoutHidden as any).hidden;
155
-
156
- return (
157
- // @ts-ignore
158
- <selfie-capture
159
- {...propsWithoutHidden}
160
- ref={(el: HTMLElement) => {
161
- if (el && !el.hasAttribute('data-events-setup')) {
162
- el.setAttribute('data-events-setup', 'true');
163
-
164
- const forwardEvent = (event: Event) => {
165
- const customEvent = event as CustomEvent;
166
-
167
- if (
168
- customEvent.type === 'selfie-capture.publish' ||
169
- customEvent.type === 'selfie-capture.cancelled' ||
170
- customEvent.type === 'selfie-capture.close'
171
- ) {
172
- setInitialSessionCompleted(true);
173
- }
174
-
175
- window.dispatchEvent(
176
- new CustomEvent(customEvent.type, {
177
- detail: customEvent.detail,
178
- bubbles: true,
179
- }),
180
- );
181
- };
182
-
183
- el.addEventListener('selfie-capture.publish', forwardEvent);
184
- el.addEventListener('selfie-capture.cancelled', forwardEvent);
185
- el.addEventListener('selfie-capture.close', forwardEvent);
186
- }
187
- }}
188
- />
189
- );
190
- }
191
-
192
- return (
193
- <div style={{ textAlign: 'center', marginTop: '20%' }}>
194
- <div
195
- style={{
196
- marginBottom: '16px',
197
- display: 'flex',
198
- justifyContent: 'center',
199
- }}
200
- >
201
- <IconLoader2
202
- size={48}
203
- style={{ animation: 'spin 1s linear infinite' }}
204
- />
205
- </div>
206
- <p>Loading... {loadingProgress}%</p>
207
- <style>{`
208
- @keyframes spin {
209
- from { transform: rotate(0deg); }
210
- to { transform: rotate(360deg); }
211
- }
212
- `}</style>
213
- </div>
214
- );
215
- };
216
-
217
- if (!customElements.get('selfie-capture-wrapper')) {
218
- register(
219
- SelfieCaptureWrapper,
220
- 'selfie-capture-wrapper',
221
- [
222
- 'timeout',
223
- 'interval',
224
- 'duration',
225
- 'theme-color',
226
- 'show-navigation',
227
- 'allow-agent-mode',
228
- 'show-agent-mode-for-tests',
229
- 'hide-attribution',
230
- 'disable-image-tests',
231
- 'key',
232
- 'start-countdown',
233
- 'hidden',
234
- ],
235
- { shadow: true },
236
- );
237
- }
238
-
239
- export default SelfieCaptureWrapper;
1
+ import { useState, useEffect } from 'preact/hooks';
2
+ import { IconLoader2 } from '@tabler/icons-preact';
3
+ import register from 'preact-custom-element';
4
+ import type { FunctionComponent } from 'preact';
5
+
6
+ import { getBoolProp } from '@/utils/props';
7
+ import SmartSelfieCapture from '../smartselfie-capture/SmartSelfieCapture';
8
+ import '../selfie-capture/SelfieCapture';
9
+ import { getMediapipeInstance } from '../smartselfie-capture/utils/mediapipeManager';
10
+
11
+ interface Props {
12
+ timeout?: number;
13
+ interval?: number;
14
+ duration?: number;
15
+ 'theme-color'?: string;
16
+ 'show-navigation'?: string | boolean;
17
+ 'allow-agent-mode'?: string | boolean;
18
+ 'show-agent-mode-for-tests'?: string | boolean;
19
+ 'hide-attribution'?: string | boolean;
20
+ 'disable-image-tests'?: string | boolean;
21
+ key?: string;
22
+ 'start-countdown'?: string | boolean;
23
+ hidden?: string | boolean;
24
+ }
25
+
26
+ const SelfieCaptureWrapper: FunctionComponent<Props> = ({
27
+ timeout = 20000,
28
+ 'start-countdown': startCountdownProp = false,
29
+ hidden: hiddenProp = false,
30
+ ...props
31
+ }) => {
32
+ const isParentCypress = (() => {
33
+ try {
34
+ return (
35
+ !!(window.parent as any).Cypress ||
36
+ (window.parent.navigator.userAgent.includes('Electron') &&
37
+ (window.parent as any).__Cypress)
38
+ );
39
+ } catch {
40
+ return false;
41
+ }
42
+ })();
43
+ const isCypress =
44
+ isParentCypress ||
45
+ !!(window as any).Cypress ||
46
+ (window.navigator.userAgent.includes('Electron') &&
47
+ (window as any).__Cypress);
48
+
49
+ const hidden = getBoolProp(hiddenProp);
50
+ const startCountdown = getBoolProp(startCountdownProp);
51
+ const [mediapipeReady, setMediapipeReady] = useState(false);
52
+ const [loadingProgress, setLoadingProgress] = useState(isCypress ? 100 : 0);
53
+ const [initialSessionCompleted, setInitialSessionCompleted] = useState(false);
54
+ const [mediapipeLoading, setMediapipeLoading] = useState(false);
55
+ const [usingSelfieCapture, setUsingSelfieCapture] = useState(false);
56
+
57
+ useEffect(() => {
58
+ if (mediapipeReady || mediapipeLoading || isCypress) return;
59
+
60
+ const loadMediapipe = async () => {
61
+ setMediapipeLoading(true);
62
+ try {
63
+ await getMediapipeInstance();
64
+ setMediapipeReady(true);
65
+ } catch (error) {
66
+ console.error('Failed to load Mediapipe:', error);
67
+ }
68
+ setMediapipeLoading(false);
69
+ };
70
+
71
+ loadMediapipe();
72
+ }, [mediapipeReady, mediapipeLoading]);
73
+
74
+ useEffect(() => {
75
+ if (hidden || !startCountdown || mediapipeReady) return undefined;
76
+
77
+ const timer = setInterval(() => {
78
+ setLoadingProgress((prev: number) => Math.min(prev + 1, 100));
79
+ }, timeout / 100);
80
+
81
+ return () => {
82
+ clearInterval(timer);
83
+ };
84
+ }, [hidden, startCountdown, timeout, mediapipeReady]);
85
+
86
+ useEffect(() => {
87
+ if (hidden || mediapipeReady || loadingProgress < 100) return undefined;
88
+
89
+ const setupEventForwarding = () => {
90
+ const selfieCapture = document.querySelector('selfie-capture');
91
+ if (
92
+ selfieCapture &&
93
+ !selfieCapture.hasAttribute('data-backup-events-setup')
94
+ ) {
95
+ selfieCapture.setAttribute('data-backup-events-setup', 'true');
96
+
97
+ const forwardEvent = (event: Event) => {
98
+ const customEvent = event as CustomEvent;
99
+ window.dispatchEvent(
100
+ new CustomEvent(customEvent.type, {
101
+ detail: customEvent.detail,
102
+ bubbles: true,
103
+ }),
104
+ );
105
+ };
106
+
107
+ selfieCapture.addEventListener('selfie-capture.publish', forwardEvent);
108
+ selfieCapture.addEventListener(
109
+ 'selfie-capture.cancelled',
110
+ forwardEvent,
111
+ );
112
+ selfieCapture.addEventListener('selfie-capture.close', forwardEvent);
113
+
114
+ return () => {
115
+ selfieCapture.removeEventListener(
116
+ 'selfie-capture.publish',
117
+ forwardEvent,
118
+ );
119
+ selfieCapture.removeEventListener(
120
+ 'selfie-capture.cancelled',
121
+ forwardEvent,
122
+ );
123
+ selfieCapture.removeEventListener(
124
+ 'selfie-capture.close',
125
+ forwardEvent,
126
+ );
127
+ };
128
+ }
129
+ return undefined;
130
+ };
131
+
132
+ const timeoutId = setTimeout(setupEventForwarding, 200);
133
+ return () => {
134
+ clearTimeout(timeoutId);
135
+ };
136
+ }, [hidden, mediapipeReady, loadingProgress]);
137
+
138
+ useEffect(() => {
139
+ if (hidden || mediapipeLoading) return;
140
+
141
+ const smartCameraWeb = document.querySelector('smart-camera-web');
142
+ smartCameraWeb?.dispatchEvent(
143
+ new CustomEvent('metadata.active-liveness-version', {
144
+ detail: {
145
+ version: usingSelfieCapture ? '0.0.1' : '1.0.0',
146
+ },
147
+ }),
148
+ );
149
+ }, [usingSelfieCapture, hidden, mediapipeLoading]);
150
+
151
+ if (hidden) {
152
+ return null;
153
+ }
154
+
155
+ // on retakes, prefer SmartSelfieCapture if Mediapipe is ready
156
+ if (initialSessionCompleted && mediapipeReady && !usingSelfieCapture) {
157
+ return <SmartSelfieCapture {...props} />;
158
+ }
159
+
160
+ // use SmartSelfieCapture if mediapipe loads
161
+ if (!initialSessionCompleted && mediapipeReady && !usingSelfieCapture) {
162
+ return <SmartSelfieCapture {...props} />;
163
+ }
164
+
165
+ if (loadingProgress >= 100) {
166
+ if (!usingSelfieCapture) {
167
+ setUsingSelfieCapture(true);
168
+ }
169
+
170
+ const propsWithoutHidden = { ...props };
171
+ delete (propsWithoutHidden as any).hidden;
172
+
173
+ return (
174
+ // @ts-ignore
175
+ <selfie-capture
176
+ {...propsWithoutHidden}
177
+ ref={(el: HTMLElement) => {
178
+ if (el && !el.hasAttribute('data-events-setup')) {
179
+ el.setAttribute('data-events-setup', 'true');
180
+
181
+ const forwardEvent = (event: Event) => {
182
+ const customEvent = event as CustomEvent;
183
+
184
+ if (
185
+ customEvent.type === 'selfie-capture.publish' ||
186
+ customEvent.type === 'selfie-capture.cancelled' ||
187
+ customEvent.type === 'selfie-capture.close'
188
+ ) {
189
+ setInitialSessionCompleted(true);
190
+ }
191
+
192
+ window.dispatchEvent(
193
+ new CustomEvent(customEvent.type, {
194
+ detail: customEvent.detail,
195
+ bubbles: true,
196
+ }),
197
+ );
198
+ };
199
+
200
+ el.addEventListener('selfie-capture.publish', forwardEvent);
201
+ el.addEventListener('selfie-capture.cancelled', forwardEvent);
202
+ el.addEventListener('selfie-capture.close', forwardEvent);
203
+ }
204
+ }}
205
+ />
206
+ );
207
+ }
208
+
209
+ return (
210
+ <div style={{ textAlign: 'center', marginTop: '20%' }}>
211
+ <div
212
+ style={{
213
+ marginBottom: '16px',
214
+ display: 'flex',
215
+ justifyContent: 'center',
216
+ }}
217
+ >
218
+ <IconLoader2
219
+ size={48}
220
+ style={{ animation: 'spin 1s linear infinite' }}
221
+ />
222
+ </div>
223
+ <p>Loading... {loadingProgress}%</p>
224
+ <style>{`
225
+ @keyframes spin {
226
+ from { transform: rotate(0deg); }
227
+ to { transform: rotate(360deg); }
228
+ }
229
+ `}</style>
230
+ </div>
231
+ );
232
+ };
233
+
234
+ if (!customElements.get('selfie-capture-wrapper')) {
235
+ register(
236
+ SelfieCaptureWrapper,
237
+ 'selfie-capture-wrapper',
238
+ [
239
+ 'timeout',
240
+ 'interval',
241
+ 'duration',
242
+ 'theme-color',
243
+ 'show-navigation',
244
+ 'allow-agent-mode',
245
+ 'show-agent-mode-for-tests',
246
+ 'hide-attribution',
247
+ 'disable-image-tests',
248
+ 'key',
249
+ 'start-countdown',
250
+ 'hidden',
251
+ ],
252
+ { shadow: true },
253
+ );
254
+ }
255
+
256
+ export default SelfieCaptureWrapper;
@@ -1 +1 @@
1
- export { default as SelfieCaptureWrapper } from './SelfieCaptureWrapper';
1
+ export { default as SelfieCaptureWrapper } from './SelfieCaptureWrapper';