idmission-web-sdk 2.1.23 → 2.1.25

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.
@@ -27,6 +27,7 @@ export type IdCaptureState = {
27
27
  documentTooClose: boolean;
28
28
  flipRequired: boolean;
29
29
  backDetectedFirst: boolean;
30
+ overrideFlipRequired: boolean;
30
31
  idCardFrontDetectionScore: number;
31
32
  idCardFrontDetectionThresholdMet: boolean;
32
33
  idCardBackDetectionScore: number;
@@ -115,6 +116,8 @@ export type IdCaptureAction = {
115
116
  };
116
117
  } | {
117
118
  type: 'flipRequestCompleted';
119
+ } | {
120
+ type: 'overrideFlipRequired';
118
121
  } | {
119
122
  type: 'resetWizard';
120
123
  } | {
@@ -123,7 +126,8 @@ export type IdCaptureAction = {
123
126
  export type IdCaptureDispatch = Dispatch<IdCaptureAction>;
124
127
  export declare const IdCaptureStateContext: React.Context<IdCaptureState>;
125
128
  export declare const IdCaptureDispatchContext: React.Context<IdCaptureDispatch>;
126
- export declare const IdCaptureStateProvider: ({ children, }: {
129
+ export declare const IdCaptureStateProvider: ({ children, flipRequiredTimeout, }: {
127
130
  children: ReactNode;
131
+ flipRequiredTimeout?: number;
128
132
  }) => React.JSX.Element;
129
133
  export declare const useIdCaptureState: () => [IdCaptureState, IdCaptureDispatch];
@@ -1,4 +1,5 @@
1
1
  import ReactSignatureCanvas from 'react-signature-canvas';
2
+ import SignatureCanvas from 'react-signature-canvas';
2
3
  export type SignatureData = {
3
4
  clickX_simple: number[][];
4
5
  clickY_simple: number[][];
@@ -6,4 +7,5 @@ export type SignatureData = {
6
7
  pressure: string;
7
8
  fileContent: string;
8
9
  };
9
- export declare function signatureDataToIdmissionFormat(signatureCanvas: ReactSignatureCanvas): SignatureData;
10
+ export declare function signatureDataToIdmissionFormat(signatureCanvas: ReactSignatureCanvas, imageUrl?: string | null): SignatureData;
11
+ export declare function exportSignatureImage(signaturePad: SignatureCanvas, exportWidth?: number): Promise<string | null>;
@@ -22,10 +22,11 @@ export type VideoSignatureSuccessVerbiage = {
22
22
  };
23
23
  export type VideoSignatureSuccessProps = {
24
24
  videoUrl: string;
25
+ imageUrl: string;
25
26
  onDoneClick?: () => void;
26
27
  onRetryClick?: () => void;
27
28
  classNames?: VideoSignatureSuccessClassNames;
28
29
  colors?: VideoSignatureSuccessColors;
29
30
  verbiage?: VideoSignatureSuccessVerbiage;
30
31
  };
31
- export declare const VideoSignatureSuccess: ({ videoUrl, onDoneClick, onRetryClick, classNames, colors, verbiage: rawVerbiage, }: VideoSignatureSuccessProps) => ReactElement;
32
+ export declare const VideoSignatureSuccess: ({ videoUrl, imageUrl, onDoneClick, onRetryClick, classNames, colors, verbiage: rawVerbiage, }: VideoSignatureSuccessProps) => ReactElement;
@@ -234,7 +234,7 @@ typeof SuppressedError === "function" ? SuppressedError : function (error, suppr
234
234
  return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
235
235
  };
236
236
 
237
- var webSdkVersion = '2.1.23';
237
+ var webSdkVersion = '2.1.25';
238
238
 
239
239
  function getPlatform() {
240
240
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
@@ -6140,6 +6140,7 @@ var initialState$4 = {
6140
6140
  documentTooClose: false,
6141
6141
  flipRequired: false,
6142
6142
  backDetectedFirst: false,
6143
+ overrideFlipRequired: false,
6143
6144
  idCardFrontDetectionScore: 0,
6144
6145
  idCardFrontDetectionThresholdMet: false,
6145
6146
  idCardBackDetectionScore: 0,
@@ -6258,8 +6259,8 @@ var _reducer = function reducer(state, action) {
6258
6259
  goodFramesThreshold = Math.ceil(3 * frameCaptureRate);
6259
6260
  }
6260
6261
  }
6261
- var flipRequired = !state.allowIdCardBackToFrontCapture && state.requestedDocumentType === 'idCardBack' && detectedDocumentType === 'idCardFront';
6262
- var backDetectedFirst = state.allowIdCardBackToFrontCapture ? 'idCardBack' in state.capturedDocuments && detectedDocumentType === 'idCardBack' : state.requestedDocumentType.includes('idCardFront') && detectedDocumentType === 'idCardBack';
6262
+ var flipRequired = !state.overrideFlipRequired && !state.allowIdCardBackToFrontCapture && state.requestedDocumentType === 'idCardBack' && detectedDocumentType === 'idCardFront';
6263
+ var backDetectedFirst = !state.overrideFlipRequired && (state.allowIdCardBackToFrontCapture ? 'idCardBack' in state.capturedDocuments && detectedDocumentType === 'idCardBack' : state.requestedDocumentType.includes('idCardFront') && detectedDocumentType === 'idCardBack');
6263
6264
  var isGoodFrame = detectionThresholdMet && documentInBounds && !documentTooClose && !flipRequired && !backDetectedFirst && focusThresholdMet;
6264
6265
  var goodFramesCount = state.goodFramesCount;
6265
6266
  if (isGoodFrame) {
@@ -6402,22 +6403,30 @@ var _reducer = function reducer(state, action) {
6402
6403
  }
6403
6404
  case 'flipRequestCompleted':
6404
6405
  return _assign(_assign({}, state), {
6405
- captureState: 'capturing'
6406
+ captureState: 'capturing',
6407
+ overrideFlipRequired: false
6408
+ });
6409
+ case 'overrideFlipRequired':
6410
+ return _assign(_assign({}, state), {
6411
+ overrideFlipRequired: true
6406
6412
  });
6407
6413
  case 'resetWizard':
6408
6414
  return _assign(_assign({}, initialState$4), {
6409
6415
  captureRequirement: state.captureRequirement,
6410
- allowIdCardBackToFrontCapture: state.allowIdCardBackToFrontCapture
6416
+ allowIdCardBackToFrontCapture: state.allowIdCardBackToFrontCapture,
6417
+ overrideFlipRequired: false
6411
6418
  });
6412
6419
  default:
6413
6420
  return state;
6414
6421
  }
6415
6422
  };
6416
6423
  var IdCaptureStateProvider = function IdCaptureStateProvider(_a) {
6417
- var children = _a.children;
6418
- var _b = React.useReducer(_reducer, initialState$4),
6419
- state = _b[0],
6420
- dispatch = _b[1];
6424
+ var children = _a.children,
6425
+ _b = _a.flipRequiredTimeout,
6426
+ flipRequiredTimeout = _b === void 0 ? 10000 : _b;
6427
+ var _c = React.useReducer(_reducer, initialState$4),
6428
+ state = _c[0],
6429
+ dispatch = _c[1];
6421
6430
  var onResize = useDebounce.useDebouncedCallback(function () {
6422
6431
  dispatch({
6423
6432
  type: 'redrawRequested'
@@ -6430,6 +6439,22 @@ var IdCaptureStateProvider = function IdCaptureStateProvider(_a) {
6430
6439
  window.removeEventListener('resize', onResize);
6431
6440
  };
6432
6441
  }, [onResize]);
6442
+ var setRequiredDocumentType = React.useContext(IdCaptureModelsContext).setRequiredDocumentType;
6443
+ React.useEffect(function () {
6444
+ if (state.overrideFlipRequired) return;
6445
+ if (state.flipRequired || state.backDetectedFirst) {
6446
+ var t_1 = setTimeout(function () {
6447
+ dispatch({
6448
+ type: 'overrideFlipRequired'
6449
+ });
6450
+ setRequiredDocumentType('none');
6451
+ }, flipRequiredTimeout);
6452
+ return function () {
6453
+ clearTimeout(t_1);
6454
+ };
6455
+ }
6456
+ return function () {};
6457
+ }, [flipRequiredTimeout, setRequiredDocumentType, state.backDetectedFirst, state.flipRequired, state.overrideFlipRequired]);
6433
6458
  return /*#__PURE__*/React__namespace.default.createElement(IdCaptureStateContext.Provider, {
6434
6459
  value: state
6435
6460
  }, /*#__PURE__*/React__namespace.default.createElement(IdCaptureDispatchContext.Provider, {
@@ -11772,15 +11797,14 @@ var AdditionalDocumentCaptureWizard = function AdditionalDocumentCaptureWizard(_
11772
11797
  });
11773
11798
  };
11774
11799
 
11775
- function signatureDataToIdmissionFormat(signatureCanvas) {
11776
- var _a;
11777
- var dataURL = (_a = signatureCanvas.toDataURL()) !== null && _a !== void 0 ? _a : null;
11800
+ function signatureDataToIdmissionFormat(signatureCanvas, imageUrl) {
11801
+ imageUrl || (imageUrl = signatureCanvas.toDataURL());
11778
11802
  var signatureData = {
11779
11803
  clickX_simple: [],
11780
11804
  clickY_simple: [],
11781
11805
  time_simple: [],
11782
11806
  pressure: '',
11783
- fileContent: dataURL ? dataUrlToBase64Sync(dataURL) : ''
11807
+ fileContent: imageUrl ? dataUrlToBase64Sync(imageUrl) : ''
11784
11808
  };
11785
11809
  signatureCanvas.toData().forEach(function (stroke) {
11786
11810
  var xs = [];
@@ -11797,6 +11821,68 @@ function signatureDataToIdmissionFormat(signatureCanvas) {
11797
11821
  });
11798
11822
  return signatureData;
11799
11823
  }
11824
+ function exportSignatureImage(signaturePad_1) {
11825
+ return __awaiter(this, arguments, void 0, function (signaturePad, exportWidth) {
11826
+ var signatureCanvas, scaledHeight, svgB64Url, svgContent, scaledSvgContent, scaledSvgUrl;
11827
+ if (exportWidth === void 0) {
11828
+ exportWidth = 600;
11829
+ }
11830
+ return __generator(this, function (_a) {
11831
+ switch (_a.label) {
11832
+ case 0:
11833
+ signatureCanvas = signaturePad.getCanvas();
11834
+ scaledHeight = signatureCanvas.height * exportWidth / signatureCanvas.width;
11835
+ svgB64Url = signaturePad.getSignaturePad()._toSVG();
11836
+ svgContent = atob(svgB64Url.replace('data:image/svg+xml;base64,', ''));
11837
+ scaledSvgContent = svgContent.replace(/width="[0-9.]+"/, "width=\"".concat(exportWidth, "\"")).replace(/height="[0-9.]+"/, "height=\"".concat(scaledHeight, "\"")).replace(/viewBox="0 0 [0-9.]+ [0-9.]+"/, "viewBox=\"0 0 ".concat(signatureCanvas.width, " ").concat(signatureCanvas.height, "\""));
11838
+ scaledSvgUrl = 'data:image/svg+xml;base64,' + btoa(scaledSvgContent);
11839
+ return [4 /*yield*/, convertSVGtoImg(scaledSvgUrl)];
11840
+ case 1:
11841
+ return [2 /*return*/, _a.sent()];
11842
+ }
11843
+ });
11844
+ });
11845
+ }
11846
+ function loadImage(url) {
11847
+ return __awaiter(this, void 0, void 0, function () {
11848
+ var img;
11849
+ return __generator(this, function (_a) {
11850
+ img = document.createElement('img');
11851
+ img.src = url;
11852
+ return [2 /*return*/, new Promise(function (resolve, reject) {
11853
+ img.onload = function () {
11854
+ return resolve(img);
11855
+ };
11856
+ img.onerror = reject;
11857
+ })];
11858
+ });
11859
+ });
11860
+ }
11861
+ function convertSVGtoImg(svgData_1) {
11862
+ return __awaiter(this, arguments, void 0, function (svgData, format) {
11863
+ var img, canvas, ctx;
11864
+ if (format === void 0) {
11865
+ format = 'jpeg';
11866
+ }
11867
+ return __generator(this, function (_a) {
11868
+ switch (_a.label) {
11869
+ case 0:
11870
+ return [4 /*yield*/, loadImage(svgData)];
11871
+ case 1:
11872
+ img = _a.sent();
11873
+ canvas = document.createElement('canvas');
11874
+ canvas.width = img.naturalWidth;
11875
+ canvas.height = img.naturalHeight;
11876
+ ctx = canvas.getContext('2d');
11877
+ if (!ctx) return [2 /*return*/, null];
11878
+ ctx.fillStyle = 'white';
11879
+ ctx.fillRect(0, 0, canvas.width, canvas.height);
11880
+ ctx.drawImage(img, 0, 0, img.naturalWidth, img.naturalHeight);
11881
+ return [2 /*return*/, canvas.toDataURL("image/".concat(format), 1.0)];
11882
+ }
11883
+ });
11884
+ });
11885
+ }
11800
11886
 
11801
11887
  var SignaturePaperBacking = styled__default.default.div(templateObject_1$c || (templateObject_1$c = __makeTemplateObject(["\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n ", "\n ", "\n ", "\n"], ["\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n ", "\n ", "\n ", "\n"])), function (props) {
11802
11888
  var _a, _b;
@@ -11840,9 +11926,21 @@ var SignatureCapture = function SignatureCapture(_a) {
11840
11926
  clearBtnText: 'Clear'
11841
11927
  });
11842
11928
  function onAcceptClicked() {
11843
- if (!signaturePad.current) return;
11844
- var signatureData = signatureDataToIdmissionFormat(signaturePad.current);
11845
- onAccept === null || onAccept === void 0 ? void 0 : onAccept(signatureData, signaturePad.current.toDataURL());
11929
+ return __awaiter(this, void 0, void 0, function () {
11930
+ var imageUrl, signatureData;
11931
+ return __generator(this, function (_a) {
11932
+ switch (_a.label) {
11933
+ case 0:
11934
+ if (!signaturePad.current) return [2 /*return*/];
11935
+ return [4 /*yield*/, exportSignatureImage(signaturePad.current)];
11936
+ case 1:
11937
+ imageUrl = _a.sent();
11938
+ signatureData = signatureDataToIdmissionFormat(signaturePad.current, imageUrl);
11939
+ onAccept === null || onAccept === void 0 ? void 0 : onAccept(signatureData, imageUrl !== null && imageUrl !== void 0 ? imageUrl : '');
11940
+ return [2 /*return*/];
11941
+ }
11942
+ });
11943
+ });
11846
11944
  }
11847
11945
  return /*#__PURE__*/React__namespace.default.createElement(PageContainer, {
11848
11946
  className: classNames.container
@@ -12175,20 +12273,23 @@ var VideoSignatureCapture = function VideoSignatureCapture(_a) {
12175
12273
  }
12176
12274
  }, [numFramesWithoutFaces, onFaceNotDetected]);
12177
12275
  function onAcceptClicked() {
12178
- if (!signaturePad.current) return;
12179
- var signatureData = signatureDataToIdmissionFormat(signaturePad.current);
12180
- setSignatureData(signatureData);
12181
- var signatureCanvas = signaturePad.current.getCanvas();
12182
- var scaledHeight = signatureCanvas.height * 600 / signatureCanvas.width;
12183
- var svgB64Url = signaturePad.current.getSignaturePad()._toSVG();
12184
- var svgContent = atob(svgB64Url.replace('data:image/svg+xml;base64,', ''));
12185
- var scaledSvgContent = svgContent.replace(/width="[0-9.]+"/, "width=\"600\"").replace(/height="[0-9.]+"/, "height=\"".concat(scaledHeight, "\"")).replace(/viewBox="0 0 [0-9.]+ [0-9.]+"/, "viewBox=\"0 0 ".concat(signatureCanvas.width, " ").concat(signatureCanvas.height, "\""));
12186
- var scaledSvgUrl = 'data:image/svg+xml;base64,' + btoa(scaledSvgContent);
12187
- convertSVGtoImg(scaledSvgUrl).then(function (dataUrl) {
12276
+ return __awaiter(this, void 0, void 0, function () {
12277
+ var imageUrl;
12188
12278
  var _a;
12189
- dataUrl && setSignatureDataUrl(dataUrl);
12190
- stopRecordingVideo();
12191
- (_a = signatureRecorder.current) === null || _a === void 0 ? void 0 : _a.stop();
12279
+ return __generator(this, function (_b) {
12280
+ switch (_b.label) {
12281
+ case 0:
12282
+ if (!signaturePad.current) return [2 /*return*/];
12283
+ return [4 /*yield*/, exportSignatureImage(signaturePad.current)];
12284
+ case 1:
12285
+ imageUrl = _b.sent();
12286
+ setSignatureDataUrl(imageUrl);
12287
+ setSignatureData(signatureDataToIdmissionFormat(signaturePad.current, imageUrl));
12288
+ stopRecordingVideo();
12289
+ (_a = signatureRecorder.current) === null || _a === void 0 ? void 0 : _a.stop();
12290
+ return [2 /*return*/];
12291
+ }
12292
+ });
12192
12293
  });
12193
12294
  }
12194
12295
  return /*#__PURE__*/React__namespace.default.createElement(PageContainer, {
@@ -12235,54 +12336,11 @@ var VideoSignatureCapture = function VideoSignatureCapture(_a) {
12235
12336
  }));
12236
12337
  };
12237
12338
  var AcceptBtn = styled__default.default(LoaderButton)(templateObject_1$a || (templateObject_1$a = __makeTemplateObject(["\n margin-left: auto;\n"], ["\n margin-left: auto;\n"])));
12238
- var loadImage = function loadImage(url) {
12239
- return __awaiter(void 0, void 0, void 0, function () {
12240
- var img;
12241
- return __generator(this, function (_a) {
12242
- img = document.createElement('img');
12243
- img.src = url;
12244
- return [2 /*return*/, new Promise(function (resolve, reject) {
12245
- img.onload = function () {
12246
- return resolve(img);
12247
- };
12248
- img.onerror = reject;
12249
- })];
12250
- });
12251
- });
12252
- };
12253
- var convertSVGtoImg = function convertSVGtoImg(svgData_1) {
12254
- var args_1 = [];
12255
- for (var _i = 1; _i < arguments.length; _i++) {
12256
- args_1[_i - 1] = arguments[_i];
12257
- }
12258
- return __awaiter(void 0, __spreadArray([svgData_1], args_1, true), void 0, function (svgData, format) {
12259
- var img, canvas, ctx;
12260
- if (format === void 0) {
12261
- format = 'jpeg';
12262
- }
12263
- return __generator(this, function (_a) {
12264
- switch (_a.label) {
12265
- case 0:
12266
- return [4 /*yield*/, loadImage(svgData)];
12267
- case 1:
12268
- img = _a.sent();
12269
- canvas = document.createElement('canvas');
12270
- canvas.width = img.naturalWidth;
12271
- canvas.height = img.naturalHeight;
12272
- ctx = canvas.getContext('2d');
12273
- if (!ctx) return [2 /*return*/];
12274
- ctx.fillStyle = 'white';
12275
- ctx.fillRect(0, 0, canvas.width, canvas.height);
12276
- ctx.drawImage(img, 0, 0, img.naturalWidth, img.naturalHeight);
12277
- return [2 /*return*/, canvas.toDataURL("image/".concat(format), 1.0)];
12278
- }
12279
- });
12280
- });
12281
- };
12282
12339
  var templateObject_1$a;
12283
12340
 
12284
12341
  var VideoSignatureSuccess = function VideoSignatureSuccess(_a) {
12285
12342
  var videoUrl = _a.videoUrl,
12343
+ imageUrl = _a.imageUrl,
12286
12344
  onDoneClick = _a.onDoneClick,
12287
12345
  onRetryClick = _a.onRetryClick,
12288
12346
  _b = _a.classNames,
@@ -12311,6 +12369,12 @@ var VideoSignatureSuccess = function VideoSignatureSuccess(_a) {
12311
12369
  controls: true,
12312
12370
  preload: "metadata",
12313
12371
  autoPlay: true
12372
+ }), /*#__PURE__*/React__namespace.default.createElement("img", {
12373
+ src: imageUrl,
12374
+ alt: "",
12375
+ style: {
12376
+ display: 'none'
12377
+ }
12314
12378
  })), /*#__PURE__*/React__namespace.default.createElement(ButtonsRow, {
12315
12379
  className: classNames.buttonsRow
12316
12380
  }, /*#__PURE__*/React__namespace.default.createElement(LoaderButton, {
@@ -12419,13 +12483,13 @@ var VideoSignatureWizard = function VideoSignatureWizard(_a) {
12419
12483
  });
12420
12484
  }, [logCaptureMetadata, selfieImage, setSelfieImage]);
12421
12485
  var _p = React.useState(null),
12422
- signatureDataUrl = _p[0],
12423
- setSignatureDataUrl = _p[1];
12486
+ signatureImageUrl = _p[0],
12487
+ setSignatureImageUrl = _p[1];
12424
12488
  var onSignatureCaptureCompleted = React.useCallback(function (videoData, signatureData, signatureImageData) {
12425
12489
  setSignatureData(signatureData);
12426
12490
  setSignatureVideoUrl(URL.createObjectURL(videoData));
12491
+ setSignatureImageUrl(signatureImageData);
12427
12492
  setCaptureState('SUCCESS');
12428
- setSignatureDataUrl(signatureImageData);
12429
12493
  onVideoCaptured === null || onVideoCaptured === void 0 ? void 0 : onVideoCaptured(videoData, signatureData, signatureImageData);
12430
12494
  }, [onVideoCaptured, setSignatureData, setSignatureVideoUrl]);
12431
12495
  var onSignatureCaptureFacesNotDetected = React.useCallback(function () {
@@ -12483,17 +12547,15 @@ var VideoSignatureWizard = function VideoSignatureWizard(_a) {
12483
12547
  });
12484
12548
  case 'SUCCESS':
12485
12549
  if (!showSuccessScreen) return;
12486
- return /*#__PURE__*/React__namespace.default.createElement(React__namespace.default.Fragment, null, /*#__PURE__*/React__namespace.default.createElement(VideoSignatureSuccess, {
12550
+ return /*#__PURE__*/React__namespace.default.createElement(VideoSignatureSuccess, {
12487
12551
  videoUrl: signatureVideoUrl !== null && signatureVideoUrl !== void 0 ? signatureVideoUrl : '',
12552
+ imageUrl: signatureImageUrl !== null && signatureImageUrl !== void 0 ? signatureImageUrl : '',
12488
12553
  onDoneClick: onComplete,
12489
12554
  onRetryClick: onRetry,
12490
12555
  classNames: classNames.success,
12491
12556
  colors: colors.success,
12492
12557
  verbiage: verbiage.success
12493
- }), signatureDataUrl && /*#__PURE__*/React__namespace.default.createElement("img", {
12494
- src: signatureDataUrl,
12495
- alt: ""
12496
- }));
12558
+ });
12497
12559
  default:
12498
12560
  return null;
12499
12561
  }