idmission-web-sdk 1.0.12 → 1.0.13

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.
@@ -0,0 +1,24 @@
1
+ import { ReactElement } from 'react';
2
+ import { CustomerSuppliedVerbiage } from '../../lib/locales';
3
+ import { LoaderButtonColors } from '../common/LoaderButton';
4
+ export type IdCaptureFallbackColors = {
5
+ captureBtn?: LoaderButtonColors;
6
+ captureMoreBtn?: LoaderButtonColors;
7
+ doneBtn?: LoaderButtonColors;
8
+ };
9
+ export type IdCaptureFallbackVerbiage = {
10
+ headingText?: CustomerSuppliedVerbiage;
11
+ descriptionText?: CustomerSuppliedVerbiage;
12
+ firstInstructionText?: CustomerSuppliedVerbiage;
13
+ secondInstructionText?: CustomerSuppliedVerbiage;
14
+ captureBtnText?: CustomerSuppliedVerbiage;
15
+ captureMoreBtnText?: CustomerSuppliedVerbiage;
16
+ doneBtnText?: CustomerSuppliedVerbiage;
17
+ };
18
+ export type IdCaptureFallbackProps = {
19
+ onCapture?: (imageData: string) => void;
20
+ onFinished?: (images: string[]) => void;
21
+ colors?: IdCaptureFallbackColors;
22
+ verbiage?: IdCaptureFallbackVerbiage;
23
+ };
24
+ export declare const IdCaptureFallback: ({ onCapture, onFinished, colors, verbiage: rawVerbiage, }: IdCaptureFallbackProps) => ReactElement;
@@ -21,6 +21,7 @@ export type IdCapturePrediction = {
21
21
  focusPredictionTime: number;
22
22
  frameWidth: number;
23
23
  frameHeight: number;
24
+ allZero: boolean;
24
25
  };
25
26
  export type IdCaptureThresholds = {
26
27
  document?: number;
@@ -37,6 +38,7 @@ export declare const PREDICTION_POSITIONS: {
37
38
  export type IdCaptureModelsState = {
38
39
  ready: boolean;
39
40
  working: MutableRefObject<boolean>;
41
+ error: Error | null;
40
42
  thresholds: IdCaptureThresholds;
41
43
  setThresholds: (value: IdCaptureThresholds) => void;
42
44
  makePrediction: (frame: Frame) => void;
@@ -50,7 +50,7 @@ var useResizeObserver__default = /*#__PURE__*/_interopDefaultLegacy(useResizeObs
50
50
  var SignatureCanvas__default = /*#__PURE__*/_interopDefaultLegacy(SignatureCanvas);
51
51
  var ReactDOM__default = /*#__PURE__*/_interopDefaultLegacy(ReactDOM);
52
52
 
53
- var webSdkVersion = '1.0.12';
53
+ var webSdkVersion = '1.0.13';
54
54
 
55
55
  function getPlatform() {
56
56
  return window.platform;
@@ -8369,23 +8369,6 @@ function cropToBoundingBox(frame, bbox) {
8369
8369
  return canvas;
8370
8370
  }
8371
8371
 
8372
- var ModelLoadingErrorOverlay = function ModelLoadingErrorOverlay(_a) {
8373
- var error = _a.error;
8374
- return /*#__PURE__*/React__default['default'].createElement(OverlayContainer, null, /*#__PURE__*/React__default['default'].createElement(OverlayInner, {
8375
- style: {
8376
- justifyContent: 'center'
8377
- }
8378
- }, /*#__PURE__*/React__default['default'].createElement("h3", {
8379
- style: {
8380
- marginBottom: 8
8381
- }
8382
- }, "We're sorry, an unexpected error has occurred."), /*#__PURE__*/React__default['default'].createElement("p", {
8383
- style: {
8384
- marginBottom: 0
8385
- }
8386
- }, /*#__PURE__*/React__default['default'].createElement("code", null, error.message))));
8387
- };
8388
-
8389
8372
  var PREDICTION_POSITIONS = {
8390
8373
  boxes: 0,
8391
8374
  scores: 7,
@@ -8396,6 +8379,7 @@ var IdCaptureModelsContext = /*#__PURE__*/React.createContext({
8396
8379
  working: {
8397
8380
  current: false
8398
8381
  },
8382
+ error: null,
8399
8383
  thresholds: {},
8400
8384
  setThresholds: function setThresholds() {
8401
8385
  return null;
@@ -8502,13 +8486,11 @@ var IdCaptureModelsProvider = function IdCaptureModelsProvider(_a) {
8502
8486
  });
8503
8487
  });
8504
8488
  }
8505
- try {
8506
- loadModels().then(function () {
8507
- setReady(true);
8508
- });
8509
- } catch (e) {
8489
+ loadModels().then(function () {
8490
+ setReady(true);
8491
+ })["catch"](function (e) {
8510
8492
  setLoadingError(e);
8511
- }
8493
+ });
8512
8494
  var webGLCanvas = getWebGLContext(2).canvas;
8513
8495
  webGLCanvas.addEventListener('webglcontextlost', reloadModels);
8514
8496
  return function () {
@@ -8532,6 +8514,9 @@ var IdCaptureModelsProvider = function IdCaptureModelsProvider(_a) {
8532
8514
  if (thresholds.pdf417) setPdf417DetectionThreshold(thresholds.pdf417);
8533
8515
  if (thresholds.focus) setFocusThreshold(thresholds.focus);
8534
8516
  }, []);
8517
+ var _m = React.useState(0),
8518
+ timesAllZero = _m[0],
8519
+ setTimesAllZero = _m[1];
8535
8520
  var bestPredictionCanvas = React.useRef(null);
8536
8521
  var bestFocusScore = React.useRef(0);
8537
8522
  var makePrediction = React.useCallback(function (frame) {
@@ -8553,6 +8538,9 @@ var IdCaptureModelsProvider = function IdCaptureModelsProvider(_a) {
8553
8538
  bestFocusScore.current = prediction.focusScore;
8554
8539
  drawToCanvas(bestPredictionCanvas.current, frame);
8555
8540
  }
8541
+ if (prediction.allZero) setTimesAllZero(function (n) {
8542
+ return n + 1;
8543
+ });
8556
8544
  (_a = onPredictionHandler.current) === null || _a === void 0 ? void 0 : _a.call(onPredictionHandler, prediction);
8557
8545
  working.current = false;
8558
8546
  return [2];
@@ -8561,6 +8549,11 @@ var IdCaptureModelsProvider = function IdCaptureModelsProvider(_a) {
8561
8549
  });
8562
8550
  })();
8563
8551
  }, [logPredictions, thresholds]);
8552
+ React.useEffect(function () {
8553
+ if (timesAllZero >= 2) {
8554
+ setLoadingError(new Error('model is returning all zeroes'));
8555
+ }
8556
+ }, [timesAllZero]);
8564
8557
  var onPredictionMade = React.useCallback(function (handler) {
8565
8558
  onPredictionHandler.current = handler;
8566
8559
  }, []);
@@ -8597,14 +8590,13 @@ var IdCaptureModelsProvider = function IdCaptureModelsProvider(_a) {
8597
8590
  detectionTime: detectionTime,
8598
8591
  focusPredictionTime: focusPredictionTime,
8599
8592
  getBestFrame: getBestFrame,
8600
- resetBestFrame: resetBestFrame
8593
+ resetBestFrame: resetBestFrame,
8594
+ error: loadingError
8601
8595
  };
8602
- }, [detectionTime, focusPredictionTime, getBestFrame, makePrediction, onPredictionMade, ready, resetBestFrame, setThresholds, thresholds]);
8596
+ }, [detectionTime, focusPredictionTime, getBestFrame, loadingError, makePrediction, onPredictionMade, ready, resetBestFrame, setThresholds, thresholds]);
8603
8597
  return /*#__PURE__*/React__default['default'].createElement(IdCaptureModelsContext.Provider, {
8604
8598
  value: value
8605
- }, loadingError ? /*#__PURE__*/React__default['default'].createElement(ModelLoadingErrorOverlay, {
8606
- error: loadingError
8607
- }) : children, /*#__PURE__*/React__default['default'].createElement(InvisibleCanvas, {
8599
+ }, children, /*#__PURE__*/React__default['default'].createElement(InvisibleCanvas, {
8608
8600
  ref: lastPredictionCanvas
8609
8601
  }), /*#__PURE__*/React__default['default'].createElement(InvisibleCanvas, {
8610
8602
  ref: bestPredictionCanvas
@@ -8616,7 +8608,7 @@ function makePredictions(frame, lastPredictionCanvas, thresholds, logPredictions
8616
8608
  logPredictions = false;
8617
8609
  }
8618
8610
  return tslib.__awaiter(this, void 0, void 0, function () {
8619
- var _l, frameWidth, frameHeight, _o, boxes, scores, labels, time, detectedObjects, bestDocument, bestPassportPage, bestDocumentScore, passportDetectionScore, passportDetectionThresholdMet, bestDocumentOrPassport, detectionScore, detectionThresholdMet, detectedDocumentType, bestMrz, mrzDetectionScore, mrzDetectionThresholdMet, bestPdf417, pdf417DetectionScore, pdf417DetectionThresholdMet, focusPrediction, focusPredictionTime, focusScore, focusThresholdMet;
8611
+ var _l, frameWidth, frameHeight, _o, boxes, scores, labels, time, allZero, detectedObjects, bestDocument, bestPassportPage, bestDocumentScore, passportDetectionScore, passportDetectionThresholdMet, bestDocumentOrPassport, detectionScore, detectionThresholdMet, detectedDocumentType, bestMrz, mrzDetectionScore, mrzDetectionThresholdMet, bestPdf417, pdf417DetectionScore, pdf417DetectionThresholdMet, focusPrediction, focusPredictionTime, focusScore, focusThresholdMet;
8620
8612
  var _p;
8621
8613
  return tslib.__generator(this, function (_q) {
8622
8614
  switch (_q.label) {
@@ -8626,6 +8618,11 @@ function makePredictions(frame, lastPredictionCanvas, thresholds, logPredictions
8626
8618
  return [4, makeDocumentDetectionPredictions(frame, logPredictions)];
8627
8619
  case 1:
8628
8620
  _o = _q.sent(), boxes = _o.boxes, scores = _o.scores, labels = _o.labels, time = _o.time;
8621
+ allZero = boxes.length > 0 && !boxes.some(function (box) {
8622
+ return box.some(function (n) {
8623
+ return n > 0;
8624
+ });
8625
+ });
8629
8626
  detectedObjects = applyNonMaxSuppression(boxes.map(function (box, i) {
8630
8627
  return bboxToDetectedObjectUnscaled(box, scores[i], labels[i]);
8631
8628
  }));
@@ -8685,7 +8682,8 @@ function makePredictions(frame, lastPredictionCanvas, thresholds, logPredictions
8685
8682
  focusThresholdMet: focusThresholdMet,
8686
8683
  focusPredictionTime: focusPredictionTime,
8687
8684
  frameWidth: frameWidth,
8688
- frameHeight: frameHeight
8685
+ frameHeight: frameHeight,
8686
+ allZero: allZero
8689
8687
  }];
8690
8688
  }
8691
8689
  });
@@ -10123,6 +10121,101 @@ function useShowSuccessScreen(skipSuccessScreen, successScreenReady, onDoneCallb
10123
10121
  return !skipSuccessScreen || skipSuccessScreenResolvedFalse;
10124
10122
  }
10125
10123
 
10124
+ var IdCaptureFallback = function IdCaptureFallback(_a) {
10125
+ var onCapture = _a.onCapture,
10126
+ onFinished = _a.onFinished,
10127
+ _b = _a.colors,
10128
+ colors = _b === void 0 ? {} : _b,
10129
+ _c = _a.verbiage,
10130
+ rawVerbiage = _c === void 0 ? {} : _c;
10131
+ var fileInput = React.useRef(null);
10132
+ var _d = React.useState([]),
10133
+ images = _d[0],
10134
+ setImages = _d[1];
10135
+ colors.captureMoreBtn || (colors.captureMoreBtn = {
10136
+ backgroundColor: '#666'
10137
+ });
10138
+ var verbiage = useTranslations(rawVerbiage, {
10139
+ headingText: "We're having some trouble.",
10140
+ descriptionText: 'On-device capture guidance failed, please capture photos of your ID card or passport manually.',
10141
+ firstInstructionText: 'Please capture the front of your ID card, or the ID page of your passport.',
10142
+ secondInstructionText: 'Please capture the back of your ID card, or click Done if submitting a passport.',
10143
+ captureBtnText: 'Capture',
10144
+ captureMoreBtnText: 'Capture back of ID Card',
10145
+ doneBtnText: 'Done'
10146
+ });
10147
+ return /*#__PURE__*/React__default['default'].createElement(OverlayContainer, null, /*#__PURE__*/React__default['default'].createElement(OverlayInner, {
10148
+ style: {
10149
+ justifyContent: 'center'
10150
+ }
10151
+ }, /*#__PURE__*/React__default['default'].createElement("h3", {
10152
+ style: {
10153
+ marginBottom: 8
10154
+ }
10155
+ }, verbiage.headingText), /*#__PURE__*/React__default['default'].createElement("p", {
10156
+ style: {
10157
+ marginBottom: 8
10158
+ }
10159
+ }, verbiage.descriptionText), images.length > 0 && /*#__PURE__*/React__default['default'].createElement(OverlayImageMultiContainer, null, images.map(function (image, i) {
10160
+ return /*#__PURE__*/React__default['default'].createElement("div", {
10161
+ key: i,
10162
+ style: {
10163
+ display: 'flex',
10164
+ justifyContent: 'center',
10165
+ flexGrow: 1,
10166
+ flexBasis: 0
10167
+ }
10168
+ }, /*#__PURE__*/React__default['default'].createElement("img", {
10169
+ src: image,
10170
+ alt: ""
10171
+ }));
10172
+ })), images.length < 2 && /*#__PURE__*/React__default['default'].createElement("p", {
10173
+ style: {
10174
+ fontWeight: 'bold'
10175
+ }
10176
+ }, images.length === 0 ? verbiage.firstInstructionText : verbiage.secondInstructionText), /*#__PURE__*/React__default['default'].createElement("input", {
10177
+ ref: fileInput,
10178
+ type: "file",
10179
+ accept: "image/*",
10180
+ hidden: true,
10181
+ onChange: function onChange(e) {
10182
+ var _a;
10183
+ var file = (_a = e.target.files) === null || _a === void 0 ? void 0 : _a[0];
10184
+ if (!file) return;
10185
+ var reader = new FileReader();
10186
+ reader.addEventListener('load', function (e) {
10187
+ var _a;
10188
+ var imageData = (_a = e.target) === null || _a === void 0 ? void 0 : _a.result;
10189
+ setImages(function (images) {
10190
+ return tslib.__spreadArray(tslib.__spreadArray([], images, true), [imageData], false);
10191
+ });
10192
+ onCapture === null || onCapture === void 0 ? void 0 : onCapture(imageData);
10193
+ });
10194
+ reader.readAsDataURL(file);
10195
+ }
10196
+ }), /*#__PURE__*/React__default['default'].createElement("div", {
10197
+ style: {
10198
+ marginTop: 32
10199
+ }
10200
+ }, images.length < 2 && /*#__PURE__*/React__default['default'].createElement(LoaderButton, {
10201
+ colors: images.length > 0 ? colors.captureMoreBtn : colors.captureBtn,
10202
+ finished: true,
10203
+ onClick: function onClick() {
10204
+ var _a;
10205
+ (_a = fileInput.current) === null || _a === void 0 ? void 0 : _a.click();
10206
+ }
10207
+ }, images.length > 0 ? verbiage.captureMoreBtnText : verbiage.captureBtnText), images.length > 0 && /*#__PURE__*/React__default['default'].createElement(LoaderButton, {
10208
+ colors: colors.doneBtn,
10209
+ finished: true,
10210
+ onClick: function onClick() {
10211
+ onFinished === null || onFinished === void 0 ? void 0 : onFinished(images);
10212
+ },
10213
+ style: {
10214
+ marginLeft: 12
10215
+ }
10216
+ }, verbiage.doneBtnText))));
10217
+ };
10218
+
10126
10219
  var CaptureState;
10127
10220
  (function (CaptureState) {
10128
10221
  CaptureState["CAPTURING"] = "CAPTURING";
@@ -10174,6 +10267,22 @@ var reducer$4 = function reducer(state, action) {
10174
10267
  }
10175
10268
  return newState;
10176
10269
  }
10270
+ case 'imageCapturedManually':
10271
+ {
10272
+ var newState = tslib.__assign({}, state);
10273
+ var capturedDocument = tslib.__assign(tslib.__assign({}, action.payload), {
10274
+ width: 0,
10275
+ height: 0
10276
+ });
10277
+ if (Object.keys(state.capturedDocuments).length === 0) {
10278
+ newState.capturedDocuments[DocumentType.PASSPORT] = capturedDocument;
10279
+ } else {
10280
+ newState.capturedDocuments = {};
10281
+ newState.capturedDocuments[DocumentType.ID_CARD_FRONT] = state.capturedDocuments[DocumentType.PASSPORT];
10282
+ newState.capturedDocuments[DocumentType.ID_CARD_BACK] = capturedDocument;
10283
+ }
10284
+ return newState;
10285
+ }
10177
10286
  case 'reset':
10178
10287
  return tslib.__assign({}, initialState$4);
10179
10288
  }
@@ -10224,6 +10333,7 @@ var IdCaptureWizard = function IdCaptureWizard(_a) {
10224
10333
  setPassportImage = _3.setPassportImage,
10225
10334
  logIdFrontCaptureAttempt = _3.logIdFrontCaptureAttempt,
10226
10335
  logIdBackCaptureAttempt = _3.logIdBackCaptureAttempt;
10336
+ var modelsError = React.useContext(IdCaptureModelsContext).error;
10227
10337
  var operationStartedAt = React.useRef();
10228
10338
  React.useEffect(function () {
10229
10339
  operationStartedAt.current = new Date();
@@ -10261,53 +10371,23 @@ var IdCaptureWizard = function IdCaptureWizard(_a) {
10261
10371
  });
10262
10372
  }, [logCaptureMetadata]);
10263
10373
  var onSubmitClick = React.useCallback(function () {
10264
- return tslib.__awaiter(void 0, void 0, void 0, function () {
10265
- var idFrontDocument, idBackDocument, passportDocument, idFrontImage, _a, idBackImage, _b, passportImage, _c;
10266
- return tslib.__generator(this, function (_d) {
10267
- switch (_d.label) {
10268
- case 0:
10269
- idFrontDocument = state.capturedDocuments['ID_CARD_FRONT'];
10270
- idBackDocument = state.capturedDocuments['ID_CARD_BACK'];
10271
- passportDocument = state.capturedDocuments['PASSPORT'];
10272
- _a = idFrontDocument;
10273
- if (!_a) return [3, 2];
10274
- return [4, dataUrlToBase64(idFrontDocument.imageData)];
10275
- case 1:
10276
- _a = _d.sent();
10277
- _d.label = 2;
10278
- case 2:
10279
- idFrontImage = _a;
10280
- _b = idBackDocument;
10281
- if (!_b) return [3, 4];
10282
- return [4, dataUrlToBase64(idBackDocument.imageData)];
10283
- case 3:
10284
- _b = _d.sent();
10285
- _d.label = 4;
10286
- case 4:
10287
- idBackImage = _b;
10288
- _c = passportDocument;
10289
- if (!_c) return [3, 6];
10290
- return [4, dataUrlToBase64(passportDocument.imageData)];
10291
- case 5:
10292
- _c = _d.sent();
10293
- _d.label = 6;
10294
- case 6:
10295
- passportImage = _c;
10296
- setIdFrontImage(idFrontImage);
10297
- setIdBackImage(idBackImage);
10298
- setPassportImage(passportImage);
10299
- releaseCameraAccess();
10300
- setTimeout(function () {
10301
- onSuccess === null || onSuccess === void 0 ? void 0 : onSuccess({
10302
- idFrontImage: idFrontImage,
10303
- idBackImage: idBackImage,
10304
- passportImage: passportImage
10305
- });
10306
- }, 0);
10307
- return [2];
10308
- }
10374
+ var idFrontDocument = state.capturedDocuments['ID_CARD_FRONT'];
10375
+ var idBackDocument = state.capturedDocuments['ID_CARD_BACK'];
10376
+ var passportDocument = state.capturedDocuments['PASSPORT'];
10377
+ var idFrontImage = idFrontDocument && dataUrlToBase64Sync(idFrontDocument.imageData);
10378
+ var idBackImage = idBackDocument && dataUrlToBase64Sync(idBackDocument.imageData);
10379
+ var passportImage = passportDocument && dataUrlToBase64Sync(passportDocument.imageData);
10380
+ setIdFrontImage(idFrontImage);
10381
+ setIdBackImage(idBackImage);
10382
+ setPassportImage(passportImage);
10383
+ releaseCameraAccess();
10384
+ setTimeout(function () {
10385
+ onSuccess === null || onSuccess === void 0 ? void 0 : onSuccess({
10386
+ idFrontImage: idFrontImage,
10387
+ idBackImage: idBackImage,
10388
+ passportImage: passportImage
10309
10389
  });
10310
- });
10390
+ }, 0);
10311
10391
  }, [onSuccess, releaseCameraAccess, setIdBackImage, setIdFrontImage, setPassportImage, state.capturedDocuments]);
10312
10392
  var showSuccessScreen = useShowSuccessScreen(skipSuccessScreen, state.captureState === CaptureState.COMPLETE, onSubmitClick);
10313
10393
  var onRetryClick = React.useCallback(function () {
@@ -10361,6 +10441,19 @@ var IdCaptureWizard = function IdCaptureWizard(_a) {
10361
10441
  className: "padded"
10362
10442
  }, /*#__PURE__*/React__default['default'].createElement("h1", null, "Submission completed!"), /*#__PURE__*/React__default['default'].createElement("pre", null, JSON.stringify(submissionResponse, null, 2)));
10363
10443
  }
10444
+ if (modelsError) {
10445
+ return /*#__PURE__*/React__default['default'].createElement(IdCaptureFallback, {
10446
+ onFinished: onSubmitClick,
10447
+ onCapture: function onCapture(imageData) {
10448
+ dispatch({
10449
+ type: 'imageCapturedManually',
10450
+ payload: {
10451
+ imageData: imageData
10452
+ }
10453
+ });
10454
+ }
10455
+ });
10456
+ }
10364
10457
  return /*#__PURE__*/React__default['default'].createElement(PageContainer, {
10365
10458
  className: "flex"
10366
10459
  }, state.captureState !== CaptureState.COMPLETE && /*#__PURE__*/React__default['default'].createElement(CameraVideoTag, null), overlayDismissed && function () {
@@ -10477,6 +10570,23 @@ var FaceCaptureGuideOverlay = function FaceCaptureGuideOverlay(_a) {
10477
10570
  }));
10478
10571
  };
10479
10572
 
10573
+ var ModelLoadingErrorOverlay = function ModelLoadingErrorOverlay(_a) {
10574
+ var error = _a.error;
10575
+ return /*#__PURE__*/React__default['default'].createElement(OverlayContainer, null, /*#__PURE__*/React__default['default'].createElement(OverlayInner, {
10576
+ style: {
10577
+ justifyContent: 'center'
10578
+ }
10579
+ }, /*#__PURE__*/React__default['default'].createElement("h3", {
10580
+ style: {
10581
+ marginBottom: 8
10582
+ }
10583
+ }, "We're sorry, an unexpected error has occurred."), /*#__PURE__*/React__default['default'].createElement("p", {
10584
+ style: {
10585
+ marginBottom: 0
10586
+ }
10587
+ }, /*#__PURE__*/React__default['default'].createElement("code", null, error.message))));
10588
+ };
10589
+
10480
10590
  var NUM_KEYPOINTS = 6;
10481
10591
  var GREEN = '#32EEDB';
10482
10592
  var RED = '#FF2C35';