idmission-web-sdk 1.0.13 → 1.0.14

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.
package/dist/sdk2.esm.js CHANGED
@@ -14,7 +14,7 @@ import { FaceDetector, FilesetResolver } from '@mediapipe/tasks-vision';
14
14
  import SignatureCanvas from 'react-signature-canvas';
15
15
  import ReactDOM, { createPortal } from 'react-dom';
16
16
 
17
- var webSdkVersion = '1.0.13';
17
+ var webSdkVersion = '1.0.14';
18
18
 
19
19
  function getPlatform() {
20
20
  return window.platform;
@@ -10415,7 +10415,9 @@ var IdCaptureWizard = function IdCaptureWizard(_a) {
10415
10415
  imageData: imageData
10416
10416
  }
10417
10417
  });
10418
- }
10418
+ },
10419
+ colors: colors.fallback,
10420
+ verbiage: verbiage.fallback
10419
10421
  });
10420
10422
  }
10421
10423
  return /*#__PURE__*/React__default.createElement(PageContainer, {
@@ -10534,23 +10536,6 @@ var FaceCaptureGuideOverlay = function FaceCaptureGuideOverlay(_a) {
10534
10536
  }));
10535
10537
  };
10536
10538
 
10537
- var ModelLoadingErrorOverlay = function ModelLoadingErrorOverlay(_a) {
10538
- var error = _a.error;
10539
- return /*#__PURE__*/React__default.createElement(OverlayContainer, null, /*#__PURE__*/React__default.createElement(OverlayInner, {
10540
- style: {
10541
- justifyContent: 'center'
10542
- }
10543
- }, /*#__PURE__*/React__default.createElement("h3", {
10544
- style: {
10545
- marginBottom: 8
10546
- }
10547
- }, "We're sorry, an unexpected error has occurred."), /*#__PURE__*/React__default.createElement("p", {
10548
- style: {
10549
- marginBottom: 0
10550
- }
10551
- }, /*#__PURE__*/React__default.createElement("code", null, error.message))));
10552
- };
10553
-
10554
10539
  var NUM_KEYPOINTS = 6;
10555
10540
  var GREEN = '#32EEDB';
10556
10541
  var RED = '#FF2C35';
@@ -10627,7 +10612,8 @@ var HighPerformanceSelfieGuidanceModelsContext = /*#__PURE__*/createContext({
10627
10612
  canvasRef: {
10628
10613
  current: null
10629
10614
  },
10630
- ready: false
10615
+ ready: false,
10616
+ error: null
10631
10617
  });
10632
10618
  var HighPerformanceSelfieGuidanceModelsProvider = function HighPerformanceSelfieGuidanceModelsProvider(_a) {
10633
10619
  var _b = _a.autoStart,
@@ -10650,8 +10636,8 @@ var HighPerformanceSelfieGuidanceModelsProvider = function HighPerformanceSelfie
10650
10636
  var rafId = useRef(0);
10651
10637
  var loopId = useRef(0);
10652
10638
  var _f = useState(null),
10653
- loadingError = _f[0],
10654
- setLoadingError = _f[1];
10639
+ error = _f[0],
10640
+ setError = _f[1];
10655
10641
  useEffect(function () {
10656
10642
  (function () {
10657
10643
  return __awaiter(void 0, void 0, void 0, function () {
@@ -10670,7 +10656,7 @@ var HighPerformanceSelfieGuidanceModelsProvider = function HighPerformanceSelfie
10670
10656
  return [3, 4];
10671
10657
  case 3:
10672
10658
  e_1 = _b.sent();
10673
- setLoadingError(e_1);
10659
+ setError(e_1);
10674
10660
  return [3, 4];
10675
10661
  case 4:
10676
10662
  setReady(true);
@@ -10803,14 +10789,13 @@ var HighPerformanceSelfieGuidanceModelsProvider = function HighPerformanceSelfie
10803
10789
  stop: stop,
10804
10790
  ready: ready,
10805
10791
  canvasRef: canvasRef,
10806
- onPredictionMade: onPredictionMade
10792
+ onPredictionMade: onPredictionMade,
10793
+ error: error
10807
10794
  };
10808
- }, [onPredictionMade, ready, start, stop]);
10795
+ }, [error, onPredictionMade, ready, start, stop]);
10809
10796
  return /*#__PURE__*/React.createElement(HighPerformanceSelfieGuidanceModelsContext.Provider, {
10810
10797
  value: value
10811
- }, loadingError ? /*#__PURE__*/React.createElement(ModelLoadingErrorOverlay, {
10812
- error: loadingError
10813
- }) : children);
10798
+ }, children);
10814
10799
  };
10815
10800
 
10816
10801
  var GuidanceMessageContainer = styled.div(templateObject_1$2 || (templateObject_1$2 = __makeTemplateObject(["\n position: absolute;\n top: calc(", ");\n font-weight: bold;\n width: 100%;\n display: flex;\n"], ["\n position: absolute;\n top: calc(", ");\n font-weight: bold;\n width: 100%;\n display: flex;\n"])), function (_a) {
@@ -10862,6 +10847,89 @@ var useTimeout = function useTimeout(durationMs, onTimeout, timeoutAverted, shou
10862
10847
  };
10863
10848
  };
10864
10849
 
10850
+ var SelfieCaptureFallback = function SelfieCaptureFallback(_a) {
10851
+ var onFinished = _a.onFinished,
10852
+ onCapture = _a.onCapture,
10853
+ _b = _a.colors,
10854
+ colors = _b === void 0 ? {} : _b,
10855
+ _c = _a.verbiage,
10856
+ rawVerbiage = _c === void 0 ? {} : _c;
10857
+ var _d = useState(null),
10858
+ image = _d[0],
10859
+ setImage = _d[1];
10860
+ var fileInput = useRef(null);
10861
+ var _e = useState(false),
10862
+ loading = _e[0],
10863
+ setLoading = _e[1];
10864
+ var verbiage = useTranslations(rawVerbiage, {
10865
+ headingText: "We're having some trouble.",
10866
+ descriptionText: 'On-device capture guidance failed, please capture a selfie manually.',
10867
+ captureBtnText: 'Capture',
10868
+ doneBtnText: 'Done',
10869
+ doneBtnLoadingText: 'Verifying...'
10870
+ });
10871
+ return /*#__PURE__*/React__default.createElement(OverlayContainer, null, /*#__PURE__*/React__default.createElement(OverlayInner, {
10872
+ style: {
10873
+ justifyContent: 'center'
10874
+ }
10875
+ }, /*#__PURE__*/React__default.createElement("h3", {
10876
+ style: {
10877
+ marginBottom: 8
10878
+ }
10879
+ }, verbiage.headingText), /*#__PURE__*/React__default.createElement("p", {
10880
+ style: {
10881
+ marginBottom: 8
10882
+ }
10883
+ }, verbiage.descriptionText), image && /*#__PURE__*/React__default.createElement(OverlayImageWrapper, {
10884
+ style: {
10885
+ marginTop: 32
10886
+ }
10887
+ }, /*#__PURE__*/React__default.createElement("img", {
10888
+ src: image,
10889
+ alt: ""
10890
+ })), /*#__PURE__*/React__default.createElement("input", {
10891
+ ref: fileInput,
10892
+ type: "file",
10893
+ accept: "image/*",
10894
+ hidden: true,
10895
+ onChange: function onChange(e) {
10896
+ var _a;
10897
+ var file = (_a = e.target.files) === null || _a === void 0 ? void 0 : _a[0];
10898
+ if (!file) return;
10899
+ var reader = new FileReader();
10900
+ reader.addEventListener('load', function (e) {
10901
+ var _a;
10902
+ var imageData = (_a = e.target) === null || _a === void 0 ? void 0 : _a.result;
10903
+ setImage(imageData);
10904
+ onCapture === null || onCapture === void 0 ? void 0 : onCapture(imageData);
10905
+ });
10906
+ reader.readAsDataURL(file);
10907
+ }
10908
+ }), /*#__PURE__*/React__default.createElement("div", {
10909
+ style: {
10910
+ marginTop: 32
10911
+ }
10912
+ }, !image && /*#__PURE__*/React__default.createElement(LoaderButton, {
10913
+ colors: colors.captureBtn,
10914
+ finished: true,
10915
+ onClick: function onClick() {
10916
+ var _a;
10917
+ (_a = fileInput.current) === null || _a === void 0 ? void 0 : _a.click();
10918
+ }
10919
+ }, verbiage.captureBtnText), image && /*#__PURE__*/React__default.createElement(LoaderButton, {
10920
+ key: loading ? 'loading-btn' : 'ready-btn',
10921
+ colors: colors.doneBtn,
10922
+ finished: !loading,
10923
+ onClick: function onClick() {
10924
+ setLoading(true);
10925
+ onFinished === null || onFinished === void 0 ? void 0 : onFinished(image);
10926
+ },
10927
+ style: {
10928
+ marginLeft: 12
10929
+ }
10930
+ }, loading ? verbiage.doneBtnLoadingText : verbiage.doneBtnText))));
10931
+ };
10932
+
10865
10933
  var initialState$3 = {
10866
10934
  videoWidth: 0,
10867
10935
  videoHeight: 0,
@@ -10986,7 +11054,9 @@ var SelfieCapture = function SelfieCapture(_a) {
10986
11054
  cameraRef = _l.cameraRef,
10987
11055
  cameraReady = _l.cameraReady,
10988
11056
  videoRef = _l.videoRef;
10989
- var onPredictionMade = useContext(HighPerformanceSelfieGuidanceModelsContext).onPredictionMade;
11057
+ var _m = useContext(HighPerformanceSelfieGuidanceModelsContext),
11058
+ onPredictionMade = _m.onPredictionMade,
11059
+ guidanceError = _m.error;
10990
11060
  useEffect(function () {
10991
11061
  if (cameraReady && videoRef.current && videoRef.current.videoWidth !== 0) {
10992
11062
  dispatch({
@@ -11008,9 +11078,9 @@ var SelfieCapture = function SelfieCapture(_a) {
11008
11078
  });
11009
11079
  });
11010
11080
  }, [onPredictionMade]);
11011
- var _m = useState(false),
11012
- captureReady = _m[0],
11013
- setCaptureReady = _m[1];
11081
+ var _o = useState(false),
11082
+ captureReady = _o[0],
11083
+ setCaptureReady = _o[1];
11014
11084
  useEffect(function () {
11015
11085
  var timer;
11016
11086
  if (state.faceReady) {
@@ -11043,9 +11113,9 @@ var SelfieCapture = function SelfieCapture(_a) {
11043
11113
  });
11044
11114
  })();
11045
11115
  }, [captureReady, onSelfieCaptured, state.faces, videoRef]);
11046
- var _o = useTimeout(timeoutDurationMs, onTimeout),
11047
- timedOut = _o.timedOut,
11048
- timeoutStartedAt = _o.timeoutStartedAt;
11116
+ var _p = useTimeout(timeoutDurationMs, onTimeout),
11117
+ timedOut = _p.timedOut,
11118
+ timeoutStartedAt = _p.timeoutStartedAt;
11049
11119
  var debugScalingDetails = useDebugScalingDetails({
11050
11120
  enabled: debugMode,
11051
11121
  pageWidth: width,
@@ -11069,6 +11139,9 @@ var SelfieCapture = function SelfieCapture(_a) {
11069
11139
  guidanceMessage || (guidanceMessage = state.faceReady ? verbiage.guidanceHoldStillText : state.faceLookingAway ? verbiage.guidanceLookStraightText : state.faceTooClose ? verbiage.guidanceMoveBackText : state.faceTooFar ? verbiage.guidanceMoveForwardText : state.faceNotCentered ? verbiage.guidanceMoveToCenterText : '');
11070
11140
  var satisfied = state.faceReady;
11071
11141
  if (typeof guidanceSatisfied === 'boolean') satisfied = guidanceSatisfied;
11142
+ if (guidanceError) {
11143
+ return /*#__PURE__*/React__default.createElement(SelfieCaptureFallback, null);
11144
+ }
11072
11145
  return /*#__PURE__*/React__default.createElement(PageContainer, {
11073
11146
  ref: ref,
11074
11147
  className: "flex"
@@ -11109,6 +11182,7 @@ var initialState$2 = {
11109
11182
  timesLivenessCheckFailed: 0
11110
11183
  };
11111
11184
  var reducer$2 = function reducer(state, action) {
11185
+ var _a, _b;
11112
11186
  switch (action.type) {
11113
11187
  case 'livenessReady':
11114
11188
  {
@@ -11129,12 +11203,12 @@ var reducer$2 = function reducer(state, action) {
11129
11203
  });
11130
11204
  case 'livenessChecked':
11131
11205
  {
11132
- var _a = action.payload.response,
11133
- _b = _a.status,
11134
- statusCode = _b.statusCode,
11135
- statusMessage = _b.statusMessage,
11136
- errorData = _b.errorData,
11137
- resultData = _a.resultData;
11206
+ var _c = action.payload.response,
11207
+ _d = _c.status,
11208
+ statusCode = _d.statusCode,
11209
+ statusMessage = _d.statusMessage,
11210
+ errorData = _d.errorData,
11211
+ resultData = _c.resultData;
11138
11212
  if (statusCode !== '000') {
11139
11213
  return __assign(__assign({}, state), {
11140
11214
  requestState: 'ERROR',
@@ -11155,8 +11229,8 @@ var reducer$2 = function reducer(state, action) {
11155
11229
  timesLivenessCheckFailed += 1;
11156
11230
  }
11157
11231
  return __assign(__assign({}, state), {
11158
- frame: action.payload.frame,
11159
- face: action.payload.face,
11232
+ frame: (_a = action.payload.frame) !== null && _a !== void 0 ? _a : null,
11233
+ face: (_b = action.payload.face) !== null && _b !== void 0 ? _b : null,
11160
11234
  imageUrl: action.payload.imageUrl,
11161
11235
  requestState: requestState,
11162
11236
  faceLive: faceLive,
@@ -11191,6 +11265,7 @@ var FaceLivenessCapture = function FaceLivenessCapture(_a) {
11191
11265
  var _e = useContext(SubmissionContext),
11192
11266
  checkLiveness = _e.checkLiveness,
11193
11267
  submissionError = _e.submissionError;
11268
+ var modelsError = useContext(HighPerformanceSelfieGuidanceModelsContext).error;
11194
11269
  var _f = useReducer(reducer$2, initialState$2),
11195
11270
  state = _f[0],
11196
11271
  dispatch = _f[1];
@@ -11259,21 +11334,68 @@ var FaceLivenessCapture = function FaceLivenessCapture(_a) {
11259
11334
  });
11260
11335
  })();
11261
11336
  }, [checkLiveness, face, frame, isReady, submissionError]);
11337
+ var onFallbackImageCaptured = useCallback(function (imageUrl) {
11338
+ return __awaiter(void 0, void 0, void 0, function () {
11339
+ var response, _a, e_2;
11340
+ return __generator(this, function (_b) {
11341
+ switch (_b.label) {
11342
+ case 0:
11343
+ dispatch({
11344
+ type: 'livenessChecking'
11345
+ });
11346
+ _b.label = 1;
11347
+ case 1:
11348
+ _b.trys.push([1, 4,, 5]);
11349
+ _a = checkLiveness;
11350
+ return [4, dataUrlToBase64(imageUrl)];
11351
+ case 2:
11352
+ return [4, _a.apply(void 0, [_b.sent()])];
11353
+ case 3:
11354
+ response = _b.sent();
11355
+ dispatch({
11356
+ type: 'livenessChecked',
11357
+ payload: {
11358
+ imageUrl: imageUrl,
11359
+ response: response
11360
+ }
11361
+ });
11362
+ return [3, 5];
11363
+ case 4:
11364
+ e_2 = _b.sent();
11365
+ dispatch({
11366
+ type: 'livenessCheckFailed',
11367
+ payload: {
11368
+ error: e_2
11369
+ }
11370
+ });
11371
+ return [3, 5];
11372
+ case 5:
11373
+ return [2];
11374
+ }
11375
+ });
11376
+ });
11377
+ }, [checkLiveness]);
11262
11378
  useEffect(function () {
11263
11379
  if (isPassed && state.imageUrl) onSuccess === null || onSuccess === void 0 ? void 0 : onSuccess(state.imageUrl);
11264
11380
  }, [onSuccess, state.imageUrl, isPassed]);
11265
11381
  useEffect(function () {
11266
- if (state.timesLivenessCheckFailed >= 2) {
11382
+ var allowedFailures = modelsError ? 1 : 2;
11383
+ if (state.timesLivenessCheckFailed >= allowedFailures) {
11267
11384
  onTimeout === null || onTimeout === void 0 ? void 0 : onTimeout();
11268
11385
  }
11269
- }, [onTimeout, state.timesLivenessCheckFailed]);
11270
- useTimeout(timeoutDurationMs, onTimeout, state.requestState === 'PASSED', state.requestState === 'IN_PROGRESS');
11386
+ }, [modelsError, onTimeout, state.timesLivenessCheckFailed]);
11387
+ useTimeout(timeoutDurationMs, onTimeout, state.requestState === 'PASSED' || !!modelsError, state.requestState === 'IN_PROGRESS');
11271
11388
  var verbiage = useTranslations(rawVerbiage, {
11272
11389
  guidanceRemoveEyeCoveringsText: 'Please remove your eye coverings (sunglasses, eye patch, etc.)...',
11273
11390
  guidanceRemoveHeadCoveringsText: 'Please remove your head coverings (hat, scarf, etc.)...',
11274
11391
  guidanceRemoveMaskText: 'Please remove your mask...'
11275
11392
  });
11276
11393
  var guidanceMessage = state.eyeCoveringDetected ? verbiage.guidanceRemoveEyeCoveringsText : state.headCoveringDetected ? verbiage.guidanceRemoveHeadCoveringsText : state.maskDetected ? verbiage.guidanceRemoveMaskText : undefined;
11394
+ if (modelsError) {
11395
+ return /*#__PURE__*/React__default.createElement(SelfieCaptureFallback, {
11396
+ onFinished: onFallbackImageCaptured
11397
+ });
11398
+ }
11277
11399
  return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(InvisibleCanvas, {
11278
11400
  ref: rawCanvas
11279
11401
  }), /*#__PURE__*/React__default.createElement(InvisibleCanvas, {