idmission-web-sdk 0.0.32 → 0.0.33

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.
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import { SignatureData } from './data';
3
3
  import { SignatureCaptureVerbiage } from './SignatureCapture';
4
4
  export type VideoSignatureCaptureProps = {
5
- onComplete?: (signatureData: SignatureData, imageData: string) => void;
5
+ onComplete?: (signatureData: SignatureData, imageData: string, videoData: Blob) => void;
6
6
  onFaceNotDetected?: () => void;
7
7
  verbiage?: SignatureCaptureVerbiage;
8
8
  debugMode?: boolean;
@@ -0,0 +1,10 @@
1
+ import { ReactElement } from 'react';
2
+ export type SignatureKYCSuccessProps = {
3
+ videoUrl: string;
4
+ headingText?: string;
5
+ retryBtnText?: string;
6
+ doneBtnText?: string;
7
+ onDoneClick?: () => void;
8
+ onRetryClick?: () => void;
9
+ };
10
+ export declare const SignatureKYCSuccess: ({ videoUrl, headingText, retryBtnText, doneBtnText, onDoneClick, onRetryClick, }: SignatureKYCSuccessProps) => ReactElement;
@@ -1,6 +1,7 @@
1
1
  import { ReactElement } from 'react';
2
2
  export type SignatureKYCWizardProps = {
3
3
  onComplete?: () => void;
4
+ onRetryClicked?: () => void;
4
5
  debugMode?: boolean;
5
6
  };
6
- export declare const SignatureKYCWizard: ({ onComplete, debugMode, }: SignatureKYCWizardProps) => ReactElement;
7
+ export declare const SignatureKYCWizard: ({ onComplete, onRetryClicked, debugMode, }: SignatureKYCWizardProps) => ReactElement;
@@ -157,12 +157,14 @@ export type SubmissionState = {
157
157
  passportImage: string | null;
158
158
  selfieImage: string | null;
159
159
  signatureData: SignatureData | null;
160
+ signatureVideo: string | null;
160
161
  additionalDocuments: UploadedDocument[] | null;
161
162
  setIdFrontImage: (image: string) => void;
162
163
  setIdBackImage: (image: string) => void;
163
164
  setPassportImage: (image: string) => void;
164
165
  setSelfieImage: (image: string) => void;
165
166
  setSignatureData: (signatureData: SignatureData) => void;
167
+ setSignatureVideo: (videoB64: string) => void;
166
168
  setAdditionalDocuments: (uploadedDocuments: UploadedDocument[]) => void;
167
169
  logIdFrontCaptureAttempt: (attempt: CaptureAttemptMetadata) => void;
168
170
  logIdBackCaptureAttempt: (attempt: CaptureAttemptMetadata) => void;
@@ -86,6 +86,7 @@ var SubmissionContext = /*#__PURE__*/React.createContext({
86
86
  passportImage: null,
87
87
  selfieImage: null,
88
88
  signatureData: null,
89
+ signatureVideo: null,
89
90
  additionalDocuments: null,
90
91
  setIdFrontImage: function setIdFrontImage() {
91
92
  return null;
@@ -102,6 +103,9 @@ var SubmissionContext = /*#__PURE__*/React.createContext({
102
103
  setSignatureData: function setSignatureData() {
103
104
  return null;
104
105
  },
106
+ setSignatureVideo: function setSignatureVideo() {
107
+ return null;
108
+ },
105
109
  setAdditionalDocuments: function setAdditionalDocuments() {
106
110
  return null;
107
111
  },
@@ -191,7 +195,7 @@ function contentDispositionFromDataUrl(url) {
191
195
  return (_b = (_a = url.match(/^(data:.*;base64),/)) === null || _a === void 0 ? void 0 : _a[1]) !== null && _b !== void 0 ? _b : '';
192
196
  }
193
197
 
194
- var PageContainerDiv = styled__default['default'].div(templateObject_1$7 || (templateObject_1$7 = tslib.__makeTemplateObject(["\n position: fixed;\n top: 0;\n left: 0;\n width: var(--app-width);\n height: calc(\n var(--app-height) - ", "px\n );\n overflow-x: hidden;\n overflow-y: auto;\n font-family: Inter, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto,\n Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif;\n\n &.flex {\n display: flex;\n }\n\n &.padded {\n box-sizing: border-box;\n padding: 16px 24px;\n }\n"], ["\n position: fixed;\n top: 0;\n left: 0;\n width: var(--app-width);\n height: calc(\n var(--app-height) - ", "px\n );\n overflow-x: hidden;\n overflow-y: auto;\n font-family: Inter, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto,\n Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif;\n\n &.flex {\n display: flex;\n }\n\n &.padded {\n box-sizing: border-box;\n padding: 16px 24px;\n }\n"])), function (_a) {
198
+ var PageContainerDiv = styled__default['default'].div(templateObject_1$7 || (templateObject_1$7 = tslib.__makeTemplateObject(["\n position: fixed;\n top: 0;\n left: 0;\n width: var(--app-width);\n height: calc(\n var(--app-height) - ", "px\n );\n overflow-x: hidden;\n overflow-y: auto;\n font-family:\n Inter,\n -apple-system,\n BlinkMacSystemFont,\n Segoe UI,\n Roboto,\n Oxygen,\n Ubuntu,\n Cantarell,\n Fira Sans,\n Droid Sans,\n Helvetica Neue,\n sans-serif;\n\n &.flex {\n display: flex;\n }\n\n &.padded {\n box-sizing: border-box;\n padding: 16px 24px;\n }\n"], ["\n position: fixed;\n top: 0;\n left: 0;\n width: var(--app-width);\n height: calc(\n var(--app-height) - ", "px\n );\n overflow-x: hidden;\n overflow-y: auto;\n font-family:\n Inter,\n -apple-system,\n BlinkMacSystemFont,\n Segoe UI,\n Roboto,\n Oxygen,\n Ubuntu,\n Cantarell,\n Fira Sans,\n Droid Sans,\n Helvetica Neue,\n sans-serif;\n\n &.flex {\n display: flex;\n }\n\n &.padded {\n box-sizing: border-box;\n padding: 16px 24px;\n }\n"])), function (_a) {
195
199
  var $heightOffset = _a.$heightOffset;
196
200
  return $heightOffset !== null && $heightOffset !== void 0 ? $heightOffset : 0;
197
201
  });
@@ -202,7 +206,11 @@ var PageContainer = /*#__PURE__*/React.forwardRef(function (_a, ref) {
202
206
  heightOffset = _b === void 0 ? 0 : _b,
203
207
  style = _a.style,
204
208
  onClick = _a.onClick;
209
+ var _c = React.useState(false),
210
+ dimensionsCalculated = _c[0],
211
+ setDimensionsCalculated = _c[1];
205
212
  React.useEffect(function () {
213
+ setDimensionsCalculated(false);
206
214
  var calcAppDimensions = function calcAppDimensions() {
207
215
  var doc = document.documentElement;
208
216
  doc.style.setProperty('--app-width', "".concat(window.innerWidth, "px"));
@@ -210,6 +218,7 @@ var PageContainer = /*#__PURE__*/React.forwardRef(function (_a, ref) {
210
218
  };
211
219
  window.addEventListener('resize', calcAppDimensions);
212
220
  calcAppDimensions();
221
+ setDimensionsCalculated(true);
213
222
  return function () {
214
223
  window.removeEventListener('resize', calcAppDimensions);
215
224
  };
@@ -220,7 +229,7 @@ var PageContainer = /*#__PURE__*/React.forwardRef(function (_a, ref) {
220
229
  onClick: onClick,
221
230
  className: className,
222
231
  "$heightOffset": heightOffset
223
- }, children);
232
+ }, dimensionsCalculated && children);
224
233
  });
225
234
  PageContainer.displayName = 'PageContainer';
226
235
  var templateObject_1$7;
@@ -346,26 +355,29 @@ var SubmissionProvider = function SubmissionProvider(_a) {
346
355
  signatureData = _t[0],
347
356
  setSignatureData = _t[1];
348
357
  var _u = React.useState(null),
349
- additionalDocuments = _u[0],
350
- setAdditionalDocuments = _u[1];
358
+ signatureVideo = _u[0],
359
+ setSignatureVideo = _u[1];
351
360
  var _v = React.useState(null),
352
- geolocationResult = _v[0],
353
- setGeolocationResult = _v[1];
354
- var _w = React.useState(0),
355
- geolocationAttempts = _w[0],
356
- setGeolocationAttempts = _w[1];
357
- var _x = React.useState(false),
358
- geolocationBlocked = _x[0],
359
- setGeolocationBlocked = _x[1];
360
- var _y = React.useState([]),
361
- idFrontCaptureAttempts = _y[0],
362
- setIdFrontCaptureAttempts = _y[1];
361
+ additionalDocuments = _v[0],
362
+ setAdditionalDocuments = _v[1];
363
+ var _w = React.useState(null),
364
+ geolocationResult = _w[0],
365
+ setGeolocationResult = _w[1];
366
+ var _x = React.useState(0),
367
+ geolocationAttempts = _x[0],
368
+ setGeolocationAttempts = _x[1];
369
+ var _y = React.useState(false),
370
+ geolocationBlocked = _y[0],
371
+ setGeolocationBlocked = _y[1];
363
372
  var _z = React.useState([]),
364
- idBackCaptureAttempts = _z[0],
365
- setIdBackCaptureAttempts = _z[1];
373
+ idFrontCaptureAttempts = _z[0],
374
+ setIdFrontCaptureAttempts = _z[1];
366
375
  var _0 = React.useState([]),
367
- selfieCaptureAttempts = _0[0],
368
- setSelfieCaptureAttempts = _0[1];
376
+ idBackCaptureAttempts = _0[0],
377
+ setIdBackCaptureAttempts = _0[1];
378
+ var _1 = React.useState([]),
379
+ selfieCaptureAttempts = _1[0],
380
+ setSelfieCaptureAttempts = _1[1];
369
381
  var logIdFrontCaptureAttempt = React.useCallback(function (attempt) {
370
382
  setIdFrontCaptureAttempts(function (attempts) {
371
383
  return tslib.__spreadArray(tslib.__spreadArray([], attempts, true), [attempt], false);
@@ -610,12 +622,14 @@ var SubmissionProvider = function SubmissionProvider(_a) {
610
622
  passportImage: passportImage,
611
623
  selfieImage: selfieImage,
612
624
  signatureData: signatureData,
625
+ signatureVideo: signatureVideo,
613
626
  additionalDocuments: additionalDocuments,
614
627
  setIdFrontImage: setIdFrontImage,
615
628
  setIdBackImage: setIdBackImage,
616
629
  setPassportImage: setPassportImage,
617
630
  setSelfieImage: setSelfieImage,
618
631
  setSignatureData: setSignatureData,
632
+ setSignatureVideo: setSignatureVideo,
619
633
  setAdditionalDocuments: setAdditionalDocuments,
620
634
  logIdFrontCaptureAttempt: logIdFrontCaptureAttempt,
621
635
  logIdBackCaptureAttempt: logIdBackCaptureAttempt,
@@ -11380,59 +11394,54 @@ var VideoSignatureCapture = function VideoSignatureCapture(_a) {
11380
11394
  var _h = React.useState(null),
11381
11395
  signatureVideoUrl = _h[0],
11382
11396
  setSignatureVideoUrl = _h[1];
11383
- var _j = React.useContext(HighPerformanceSelfieGuidanceModelsContext),
11384
- start = _j.start,
11385
- stop = _j.stop,
11386
- onPredictionMade = _j.onPredictionMade;
11387
- var _k = useVideoRecorder(cameraRef.current),
11388
- isRecording = _k.isRecording,
11389
- startRecording = _k.startRecording,
11390
- stopRecording = _k.stopRecording,
11391
- videoUrl = _k.videoUrl;
11397
+ var onPredictionMade = React.useContext(HighPerformanceSelfieGuidanceModelsContext).onPredictionMade;
11398
+ var _j = useVideoRecorder(cameraRef.current),
11399
+ isRecording = _j.isRecording,
11400
+ startRecording = _j.startRecording,
11401
+ stopRecording = _j.stopRecording,
11402
+ videoUrl = _j.videoUrl;
11403
+ var _k = React.useState(null),
11404
+ signatureData = _k[0],
11405
+ setSignatureData = _k[1];
11392
11406
  var _l = React.useState(null),
11393
- signatureData = _l[0],
11394
- setSignatureData = _l[1];
11407
+ signatureDataUrl = _l[0],
11408
+ setSignatureDataUrl = _l[1];
11395
11409
  var _m = React.useState(null),
11396
- signatureDataUrl = _m[0],
11397
- setSignatureDataUrl = _m[1];
11398
- verbiage.acceptBtnText = verbiage.acceptBtnText || t('Accept');
11399
- verbiage.clearBtnText = verbiage.clearBtnText || t('Clear');
11410
+ signatureVideoData = _m[0],
11411
+ setSignatureVideoData = _m[1];
11412
+ verbiage.acceptBtnText || (verbiage.acceptBtnText = t('Accept'));
11413
+ verbiage.clearBtnText || (verbiage.clearBtnText = t('Clear'));
11400
11414
  var outputCanvas = React.useRef(null);
11401
11415
  React.useEffect(function () {
11402
- if (isRecording && onFaceNotDetected) {
11403
- start();
11404
- }
11405
- return function () {
11406
- stop();
11407
- };
11408
- }, [isRecording, onFaceNotDetected, start, stop]);
11409
- React.useEffect(function () {
11410
- if (!isRecording && !videoUrl && !!outputCanvas.current) {
11411
- startRecording();
11412
- var stream = outputCanvas.current.captureStream(25);
11413
- signatureRecorder.current = new MediaRecorder(stream, {});
11414
- signatureRecorder.current.start();
11415
- signatureRecorder.current.ondataavailable = function (event) {
11416
- var _a;
11417
- recordedChunks.current.push(event.data);
11418
- if (((_a = signatureRecorder.current) === null || _a === void 0 ? void 0 : _a.state) === 'recording') {
11419
- signatureRecorder.current.stop();
11420
- }
11421
- };
11422
- signatureRecorder.current.onstop = function () {
11423
- var blob = new Blob(recordedChunks.current, {
11424
- type: 'video/mp4'
11425
- });
11426
- var url = URL.createObjectURL(blob);
11427
- setSignatureVideoUrl(url);
11428
- };
11429
- }
11416
+ setTimeout(function () {
11417
+ if (!isRecording && !videoUrl && !!outputCanvas.current) {
11418
+ startRecording();
11419
+ var stream = outputCanvas.current.captureStream(25);
11420
+ signatureRecorder.current = new MediaRecorder(stream, {});
11421
+ signatureRecorder.current.start();
11422
+ signatureRecorder.current.ondataavailable = function (event) {
11423
+ var _a;
11424
+ recordedChunks.current.push(event.data);
11425
+ if (((_a = signatureRecorder.current) === null || _a === void 0 ? void 0 : _a.state) === 'recording') {
11426
+ signatureRecorder.current.stop();
11427
+ }
11428
+ };
11429
+ signatureRecorder.current.onstop = function () {
11430
+ var blob = new Blob(recordedChunks.current, {
11431
+ type: 'video/mp4'
11432
+ });
11433
+ setSignatureVideoData(blob);
11434
+ var url = URL.createObjectURL(blob);
11435
+ setSignatureVideoUrl(url);
11436
+ };
11437
+ }
11438
+ }, 100);
11430
11439
  }, [isRecording, startRecording, videoUrl]);
11431
11440
  React.useEffect(function () {
11432
- if (signatureVideoUrl && signatureData && signatureDataUrl) {
11433
- onComplete === null || onComplete === void 0 ? void 0 : onComplete(signatureData, signatureDataUrl);
11441
+ if (signatureVideoData && signatureData && signatureDataUrl) {
11442
+ onComplete === null || onComplete === void 0 ? void 0 : onComplete(signatureData, signatureDataUrl, signatureVideoData);
11434
11443
  }
11435
- }, [onComplete, signatureData, signatureDataUrl, signatureVideoUrl]);
11444
+ }, [onComplete, signatureData, signatureDataUrl, signatureVideoData]);
11436
11445
  var animationFrame = React.useRef(0);
11437
11446
  React.useEffect(function () {
11438
11447
  var _a;
@@ -11566,16 +11575,57 @@ var SignatureKYCLoadingOverlay = function SignatureKYCLoadingOverlay(_a) {
11566
11575
  });
11567
11576
  };
11568
11577
 
11578
+ var SignatureKYCSuccess = function SignatureKYCSuccess(_a) {
11579
+ var videoUrl = _a.videoUrl,
11580
+ headingText = _a.headingText,
11581
+ retryBtnText = _a.retryBtnText,
11582
+ doneBtnText = _a.doneBtnText,
11583
+ onDoneClick = _a.onDoneClick,
11584
+ onRetryClick = _a.onRetryClick;
11585
+ var t = reactI18next.useTranslation().t;
11586
+ headingText || (headingText = t('Signature KYC Successful'));
11587
+ retryBtnText || (retryBtnText = t('Retry'));
11588
+ doneBtnText || (doneBtnText = t('Done'));
11589
+ return /*#__PURE__*/React__default['default'].createElement(OverlayContainer, null, /*#__PURE__*/React__default['default'].createElement(OverlayInner, null, /*#__PURE__*/React__default['default'].createElement("h1", null, headingText), /*#__PURE__*/React__default['default'].createElement(OverlayImageWrapper, null, /*#__PURE__*/React__default['default'].createElement("video", {
11590
+ src: videoUrl,
11591
+ controls: true,
11592
+ style: {
11593
+ marginLeft: 'auto',
11594
+ marginRight: 'auto'
11595
+ }
11596
+ })), /*#__PURE__*/React__default['default'].createElement("div", null, /*#__PURE__*/React__default['default'].createElement("button", {
11597
+ className: "ladda-button",
11598
+ "data-style": "expand-right",
11599
+ "data-color": "red",
11600
+ onClick: onRetryClick
11601
+ }, /*#__PURE__*/React__default['default'].createElement("span", {
11602
+ className: "ladda-label"
11603
+ }, retryBtnText)), /*#__PURE__*/React__default['default'].createElement("button", {
11604
+ className: "ladda-button",
11605
+ "data-style": "expand-right",
11606
+ "data-color": "mint",
11607
+ onClick: onDoneClick,
11608
+ style: {
11609
+ marginLeft: 15
11610
+ }
11611
+ }, /*#__PURE__*/React__default['default'].createElement("span", {
11612
+ className: "ladda-label"
11613
+ }, doneBtnText)))));
11614
+ };
11615
+
11569
11616
  var SignatureKYCWizard = function SignatureKYCWizard(_a) {
11570
11617
  var onComplete = _a.onComplete,
11618
+ onRetryClicked = _a.onRetryClicked,
11571
11619
  _b = _a.debugMode,
11572
11620
  debugMode = _b === void 0 ? false : _b;
11573
11621
  var _c = React.useContext(SubmissionContext),
11622
+ submit = _c.submit,
11574
11623
  selfieImage = _c.selfieImage,
11624
+ signatureVideo = _c.signatureVideo,
11575
11625
  setSelfieImage = _c.setSelfieImage,
11576
11626
  setSignatureData = _c.setSignatureData,
11627
+ setSignatureVideo = _c.setSignatureVideo,
11577
11628
  logSelfieCaptureAttempt = _c.logSelfieCaptureAttempt;
11578
- var releaseCameraAccess = React.useContext(CameraStateContext).releaseCameraAccess;
11579
11629
  var _d = React.useState('LOADING'),
11580
11630
  captureState = _d[0],
11581
11631
  setCaptureState = _d[1];
@@ -11584,10 +11634,7 @@ var SignatureKYCWizard = function SignatureKYCWizard(_a) {
11584
11634
  var captureEndedAt = React.useRef();
11585
11635
  React.useEffect(function () {
11586
11636
  operationStartedAt.current = new Date();
11587
- return function () {
11588
- releaseCameraAccess();
11589
- };
11590
- }, [releaseCameraAccess]);
11637
+ }, []);
11591
11638
  React.useEffect(function () {
11592
11639
  if (captureState === 'CHECKING_LIVENESS') {
11593
11640
  captureStartedAt.current = new Date();
@@ -11625,8 +11672,10 @@ var SignatureKYCWizard = function SignatureKYCWizard(_a) {
11625
11672
  });
11626
11673
  });
11627
11674
  }, [logCaptureMetadata, selfieImage, setSelfieImage]);
11628
- var onSignatureCaptureCompleted = React.useCallback(function (signatureData) {
11675
+ var onSignatureCaptureCompleted = React.useCallback(function (signatureData, _, videoData) {
11629
11676
  setSignatureData(signatureData);
11677
+ setSignatureVideo(URL.createObjectURL(videoData));
11678
+ setCaptureState('SUCCESS');
11630
11679
  onComplete === null || onComplete === void 0 ? void 0 : onComplete();
11631
11680
  }, [onComplete, setSignatureData]);
11632
11681
  var onSignatureCaptureFacesNotDetected = React.useCallback(function () {
@@ -11647,6 +11696,12 @@ var SignatureKYCWizard = function SignatureKYCWizard(_a) {
11647
11696
  onFaceNotDetected: onSignatureCaptureFacesNotDetected,
11648
11697
  debugMode: debugMode
11649
11698
  });
11699
+ case 'SUCCESS':
11700
+ return /*#__PURE__*/React__default['default'].createElement(SignatureKYCSuccess, {
11701
+ videoUrl: signatureVideo !== null && signatureVideo !== void 0 ? signatureVideo : '',
11702
+ onDoneClick: submit,
11703
+ onRetryClick: onRetryClicked
11704
+ });
11650
11705
  default:
11651
11706
  return null;
11652
11707
  }
@@ -13298,6 +13353,9 @@ var SignatureKYC = function SignatureKYC(_a) {
13298
13353
  geolocationEnabled = _a.geolocationEnabled,
13299
13354
  geolocationRequired = _a.geolocationRequired,
13300
13355
  debugMode = _a.debugMode;
13356
+ var _b = React.useState(0),
13357
+ attempt = _b[0],
13358
+ setAttempt = _b[1];
13301
13359
  return /*#__PURE__*/React__default['default'].createElement(SubmissionProvider, {
13302
13360
  action: SubmissionAction.NONE,
13303
13361
  environment: submissionEnvironment,
@@ -13308,11 +13366,17 @@ var SignatureKYC = function SignatureKYC(_a) {
13308
13366
  geolocationEnabled: geolocationEnabled,
13309
13367
  geolocationRequired: geolocationRequired
13310
13368
  }, /*#__PURE__*/React__default['default'].createElement(CameraProvider, {
13369
+ key: attempt,
13311
13370
  preferContinuityCamera: false,
13312
13371
  preferFrontFacingCamera: true,
13313
13372
  requestMicrophoneAccess: true
13314
13373
  }, /*#__PURE__*/React__default['default'].createElement(SignatureKYCWizard, {
13315
- debugMode: debugMode
13374
+ debugMode: debugMode,
13375
+ onRetryClicked: function onRetryClicked() {
13376
+ setAttempt(function (n) {
13377
+ return n + 1;
13378
+ });
13379
+ }
13316
13380
  })));
13317
13381
  };
13318
13382