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.
@@ -0,0 +1,21 @@
1
+ import { ReactElement } from 'react';
2
+ import { CustomerSuppliedVerbiage } from '../../lib/locales';
3
+ import { LoaderButtonColors } from '../common/LoaderButton';
4
+ export type SelfieCaptureFallbackColors = {
5
+ captureBtn?: LoaderButtonColors;
6
+ doneBtn?: LoaderButtonColors;
7
+ };
8
+ export type SelfieCaptureFallbackVerbiage = {
9
+ headingText?: CustomerSuppliedVerbiage;
10
+ descriptionText?: CustomerSuppliedVerbiage;
11
+ captureBtnText?: CustomerSuppliedVerbiage;
12
+ doneBtnText?: CustomerSuppliedVerbiage;
13
+ doneBtnLoadingText?: CustomerSuppliedVerbiage;
14
+ };
15
+ export type SelfieCaptureFallbackProps = {
16
+ onFinished?: (imageData: string) => void;
17
+ onCapture?: (imageData: string) => void;
18
+ colors?: SelfieCaptureFallbackColors;
19
+ verbiage?: SelfieCaptureFallbackVerbiage;
20
+ };
21
+ export declare const SelfieCaptureFallback: ({ onFinished, onCapture, colors, verbiage: rawVerbiage, }: SelfieCaptureFallbackProps) => ReactElement;
@@ -3,6 +3,7 @@ import { IdCaptureAssets, IdCaptureColors, IdCaptureVerbiage } from './IdCapture
3
3
  import { IdCaptureLoadingOverlayAssets, IdCaptureLoadingOverlayColors, IdCaptureLoadingOverlayVerbiage } from './IdCaptureLoadingOverlay';
4
4
  import { FlipIdPromptAssets, FlipIdPromptVerbiage } from './FlipIdPrompt';
5
5
  import { IdCaptureSuccessColors, IdCaptureSuccessVerbiage } from './IdCaptureSuccess';
6
+ import { IdCaptureFallbackColors, IdCaptureFallbackVerbiage } from '../fallback_flows/IdCapture';
6
7
  export type IdCaptureWizardAssets = {
7
8
  documentDetectionModelUrl?: string;
8
9
  focusModelUrl?: string;
@@ -15,6 +16,7 @@ export type IdCaptureWizardAssets = {
15
16
  export type IdCaptureWizardColors = IdCaptureColors & {
16
17
  loadingOverlay?: IdCaptureLoadingOverlayColors;
17
18
  success?: IdCaptureSuccessColors;
19
+ fallback?: IdCaptureFallbackColors;
18
20
  };
19
21
  export type IdCaptureWizardVerbiage = {
20
22
  loadingOverlay?: IdCaptureLoadingOverlayVerbiage;
@@ -23,6 +25,7 @@ export type IdCaptureWizardVerbiage = {
23
25
  passport?: IdCaptureVerbiage;
24
26
  flipIdPrompt?: FlipIdPromptVerbiage;
25
27
  success?: IdCaptureSuccessVerbiage;
28
+ fallback?: IdCaptureFallbackVerbiage;
26
29
  };
27
30
  export type IdCaptureSubmission = {
28
31
  idFrontImage: string | null;
@@ -25,6 +25,7 @@ type HighPerformanceSelfieGuidanceModelsState = {
25
25
  onPredictionMade: (handler: PredictionHandler) => void;
26
26
  canvasRef: MutableRefObject<HTMLCanvasElement | null>;
27
27
  ready: boolean;
28
+ error: Error | null;
28
29
  };
29
30
  export declare const HighPerformanceSelfieGuidanceModelsContext: React.Context<HighPerformanceSelfieGuidanceModelsState>;
30
31
  export declare const HighPerformanceSelfieGuidanceModelsProvider: ({ autoStart, children, throttleMs, }: {
@@ -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.13';
53
+ var webSdkVersion = '1.0.14';
54
54
 
55
55
  function getPlatform() {
56
56
  return window.platform;
@@ -10451,7 +10451,9 @@ var IdCaptureWizard = function IdCaptureWizard(_a) {
10451
10451
  imageData: imageData
10452
10452
  }
10453
10453
  });
10454
- }
10454
+ },
10455
+ colors: colors.fallback,
10456
+ verbiage: verbiage.fallback
10455
10457
  });
10456
10458
  }
10457
10459
  return /*#__PURE__*/React__default['default'].createElement(PageContainer, {
@@ -10570,23 +10572,6 @@ var FaceCaptureGuideOverlay = function FaceCaptureGuideOverlay(_a) {
10570
10572
  }));
10571
10573
  };
10572
10574
 
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
-
10590
10575
  var NUM_KEYPOINTS = 6;
10591
10576
  var GREEN = '#32EEDB';
10592
10577
  var RED = '#FF2C35';
@@ -10663,7 +10648,8 @@ var HighPerformanceSelfieGuidanceModelsContext = /*#__PURE__*/React.createContex
10663
10648
  canvasRef: {
10664
10649
  current: null
10665
10650
  },
10666
- ready: false
10651
+ ready: false,
10652
+ error: null
10667
10653
  });
10668
10654
  var HighPerformanceSelfieGuidanceModelsProvider = function HighPerformanceSelfieGuidanceModelsProvider(_a) {
10669
10655
  var _b = _a.autoStart,
@@ -10686,8 +10672,8 @@ var HighPerformanceSelfieGuidanceModelsProvider = function HighPerformanceSelfie
10686
10672
  var rafId = React.useRef(0);
10687
10673
  var loopId = React.useRef(0);
10688
10674
  var _f = React.useState(null),
10689
- loadingError = _f[0],
10690
- setLoadingError = _f[1];
10675
+ error = _f[0],
10676
+ setError = _f[1];
10691
10677
  React.useEffect(function () {
10692
10678
  (function () {
10693
10679
  return tslib.__awaiter(void 0, void 0, void 0, function () {
@@ -10706,7 +10692,7 @@ var HighPerformanceSelfieGuidanceModelsProvider = function HighPerformanceSelfie
10706
10692
  return [3, 4];
10707
10693
  case 3:
10708
10694
  e_1 = _b.sent();
10709
- setLoadingError(e_1);
10695
+ setError(e_1);
10710
10696
  return [3, 4];
10711
10697
  case 4:
10712
10698
  setReady(true);
@@ -10839,14 +10825,13 @@ var HighPerformanceSelfieGuidanceModelsProvider = function HighPerformanceSelfie
10839
10825
  stop: stop,
10840
10826
  ready: ready,
10841
10827
  canvasRef: canvasRef,
10842
- onPredictionMade: onPredictionMade
10828
+ onPredictionMade: onPredictionMade,
10829
+ error: error
10843
10830
  };
10844
- }, [onPredictionMade, ready, start, stop]);
10831
+ }, [error, onPredictionMade, ready, start, stop]);
10845
10832
  return /*#__PURE__*/React__namespace.createElement(HighPerformanceSelfieGuidanceModelsContext.Provider, {
10846
10833
  value: value
10847
- }, loadingError ? /*#__PURE__*/React__namespace.createElement(ModelLoadingErrorOverlay, {
10848
- error: loadingError
10849
- }) : children);
10834
+ }, children);
10850
10835
  };
10851
10836
 
10852
10837
  var GuidanceMessageContainer = styled__default['default'].div(templateObject_1$2 || (templateObject_1$2 = tslib.__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) {
@@ -10898,6 +10883,89 @@ var useTimeout = function useTimeout(durationMs, onTimeout, timeoutAverted, shou
10898
10883
  };
10899
10884
  };
10900
10885
 
10886
+ var SelfieCaptureFallback = function SelfieCaptureFallback(_a) {
10887
+ var onFinished = _a.onFinished,
10888
+ onCapture = _a.onCapture,
10889
+ _b = _a.colors,
10890
+ colors = _b === void 0 ? {} : _b,
10891
+ _c = _a.verbiage,
10892
+ rawVerbiage = _c === void 0 ? {} : _c;
10893
+ var _d = React.useState(null),
10894
+ image = _d[0],
10895
+ setImage = _d[1];
10896
+ var fileInput = React.useRef(null);
10897
+ var _e = React.useState(false),
10898
+ loading = _e[0],
10899
+ setLoading = _e[1];
10900
+ var verbiage = useTranslations(rawVerbiage, {
10901
+ headingText: "We're having some trouble.",
10902
+ descriptionText: 'On-device capture guidance failed, please capture a selfie manually.',
10903
+ captureBtnText: 'Capture',
10904
+ doneBtnText: 'Done',
10905
+ doneBtnLoadingText: 'Verifying...'
10906
+ });
10907
+ return /*#__PURE__*/React__default['default'].createElement(OverlayContainer, null, /*#__PURE__*/React__default['default'].createElement(OverlayInner, {
10908
+ style: {
10909
+ justifyContent: 'center'
10910
+ }
10911
+ }, /*#__PURE__*/React__default['default'].createElement("h3", {
10912
+ style: {
10913
+ marginBottom: 8
10914
+ }
10915
+ }, verbiage.headingText), /*#__PURE__*/React__default['default'].createElement("p", {
10916
+ style: {
10917
+ marginBottom: 8
10918
+ }
10919
+ }, verbiage.descriptionText), image && /*#__PURE__*/React__default['default'].createElement(OverlayImageWrapper, {
10920
+ style: {
10921
+ marginTop: 32
10922
+ }
10923
+ }, /*#__PURE__*/React__default['default'].createElement("img", {
10924
+ src: image,
10925
+ alt: ""
10926
+ })), /*#__PURE__*/React__default['default'].createElement("input", {
10927
+ ref: fileInput,
10928
+ type: "file",
10929
+ accept: "image/*",
10930
+ hidden: true,
10931
+ onChange: function onChange(e) {
10932
+ var _a;
10933
+ var file = (_a = e.target.files) === null || _a === void 0 ? void 0 : _a[0];
10934
+ if (!file) return;
10935
+ var reader = new FileReader();
10936
+ reader.addEventListener('load', function (e) {
10937
+ var _a;
10938
+ var imageData = (_a = e.target) === null || _a === void 0 ? void 0 : _a.result;
10939
+ setImage(imageData);
10940
+ onCapture === null || onCapture === void 0 ? void 0 : onCapture(imageData);
10941
+ });
10942
+ reader.readAsDataURL(file);
10943
+ }
10944
+ }), /*#__PURE__*/React__default['default'].createElement("div", {
10945
+ style: {
10946
+ marginTop: 32
10947
+ }
10948
+ }, !image && /*#__PURE__*/React__default['default'].createElement(LoaderButton, {
10949
+ colors: colors.captureBtn,
10950
+ finished: true,
10951
+ onClick: function onClick() {
10952
+ var _a;
10953
+ (_a = fileInput.current) === null || _a === void 0 ? void 0 : _a.click();
10954
+ }
10955
+ }, verbiage.captureBtnText), image && /*#__PURE__*/React__default['default'].createElement(LoaderButton, {
10956
+ key: loading ? 'loading-btn' : 'ready-btn',
10957
+ colors: colors.doneBtn,
10958
+ finished: !loading,
10959
+ onClick: function onClick() {
10960
+ setLoading(true);
10961
+ onFinished === null || onFinished === void 0 ? void 0 : onFinished(image);
10962
+ },
10963
+ style: {
10964
+ marginLeft: 12
10965
+ }
10966
+ }, loading ? verbiage.doneBtnLoadingText : verbiage.doneBtnText))));
10967
+ };
10968
+
10901
10969
  var initialState$3 = {
10902
10970
  videoWidth: 0,
10903
10971
  videoHeight: 0,
@@ -11022,7 +11090,9 @@ var SelfieCapture = function SelfieCapture(_a) {
11022
11090
  cameraRef = _l.cameraRef,
11023
11091
  cameraReady = _l.cameraReady,
11024
11092
  videoRef = _l.videoRef;
11025
- var onPredictionMade = React.useContext(HighPerformanceSelfieGuidanceModelsContext).onPredictionMade;
11093
+ var _m = React.useContext(HighPerformanceSelfieGuidanceModelsContext),
11094
+ onPredictionMade = _m.onPredictionMade,
11095
+ guidanceError = _m.error;
11026
11096
  React.useEffect(function () {
11027
11097
  if (cameraReady && videoRef.current && videoRef.current.videoWidth !== 0) {
11028
11098
  dispatch({
@@ -11044,9 +11114,9 @@ var SelfieCapture = function SelfieCapture(_a) {
11044
11114
  });
11045
11115
  });
11046
11116
  }, [onPredictionMade]);
11047
- var _m = React.useState(false),
11048
- captureReady = _m[0],
11049
- setCaptureReady = _m[1];
11117
+ var _o = React.useState(false),
11118
+ captureReady = _o[0],
11119
+ setCaptureReady = _o[1];
11050
11120
  React.useEffect(function () {
11051
11121
  var timer;
11052
11122
  if (state.faceReady) {
@@ -11079,9 +11149,9 @@ var SelfieCapture = function SelfieCapture(_a) {
11079
11149
  });
11080
11150
  })();
11081
11151
  }, [captureReady, onSelfieCaptured, state.faces, videoRef]);
11082
- var _o = useTimeout(timeoutDurationMs, onTimeout),
11083
- timedOut = _o.timedOut,
11084
- timeoutStartedAt = _o.timeoutStartedAt;
11152
+ var _p = useTimeout(timeoutDurationMs, onTimeout),
11153
+ timedOut = _p.timedOut,
11154
+ timeoutStartedAt = _p.timeoutStartedAt;
11085
11155
  var debugScalingDetails = useDebugScalingDetails({
11086
11156
  enabled: debugMode,
11087
11157
  pageWidth: width,
@@ -11105,6 +11175,9 @@ var SelfieCapture = function SelfieCapture(_a) {
11105
11175
  guidanceMessage || (guidanceMessage = state.faceReady ? verbiage.guidanceHoldStillText : state.faceLookingAway ? verbiage.guidanceLookStraightText : state.faceTooClose ? verbiage.guidanceMoveBackText : state.faceTooFar ? verbiage.guidanceMoveForwardText : state.faceNotCentered ? verbiage.guidanceMoveToCenterText : '');
11106
11176
  var satisfied = state.faceReady;
11107
11177
  if (typeof guidanceSatisfied === 'boolean') satisfied = guidanceSatisfied;
11178
+ if (guidanceError) {
11179
+ return /*#__PURE__*/React__default['default'].createElement(SelfieCaptureFallback, null);
11180
+ }
11108
11181
  return /*#__PURE__*/React__default['default'].createElement(PageContainer, {
11109
11182
  ref: ref,
11110
11183
  className: "flex"
@@ -11145,6 +11218,7 @@ var initialState$2 = {
11145
11218
  timesLivenessCheckFailed: 0
11146
11219
  };
11147
11220
  var reducer$2 = function reducer(state, action) {
11221
+ var _a, _b;
11148
11222
  switch (action.type) {
11149
11223
  case 'livenessReady':
11150
11224
  {
@@ -11165,12 +11239,12 @@ var reducer$2 = function reducer(state, action) {
11165
11239
  });
11166
11240
  case 'livenessChecked':
11167
11241
  {
11168
- var _a = action.payload.response,
11169
- _b = _a.status,
11170
- statusCode = _b.statusCode,
11171
- statusMessage = _b.statusMessage,
11172
- errorData = _b.errorData,
11173
- resultData = _a.resultData;
11242
+ var _c = action.payload.response,
11243
+ _d = _c.status,
11244
+ statusCode = _d.statusCode,
11245
+ statusMessage = _d.statusMessage,
11246
+ errorData = _d.errorData,
11247
+ resultData = _c.resultData;
11174
11248
  if (statusCode !== '000') {
11175
11249
  return tslib.__assign(tslib.__assign({}, state), {
11176
11250
  requestState: 'ERROR',
@@ -11191,8 +11265,8 @@ var reducer$2 = function reducer(state, action) {
11191
11265
  timesLivenessCheckFailed += 1;
11192
11266
  }
11193
11267
  return tslib.__assign(tslib.__assign({}, state), {
11194
- frame: action.payload.frame,
11195
- face: action.payload.face,
11268
+ frame: (_a = action.payload.frame) !== null && _a !== void 0 ? _a : null,
11269
+ face: (_b = action.payload.face) !== null && _b !== void 0 ? _b : null,
11196
11270
  imageUrl: action.payload.imageUrl,
11197
11271
  requestState: requestState,
11198
11272
  faceLive: faceLive,
@@ -11227,6 +11301,7 @@ var FaceLivenessCapture = function FaceLivenessCapture(_a) {
11227
11301
  var _e = React.useContext(SubmissionContext),
11228
11302
  checkLiveness = _e.checkLiveness,
11229
11303
  submissionError = _e.submissionError;
11304
+ var modelsError = React.useContext(HighPerformanceSelfieGuidanceModelsContext).error;
11230
11305
  var _f = React.useReducer(reducer$2, initialState$2),
11231
11306
  state = _f[0],
11232
11307
  dispatch = _f[1];
@@ -11295,21 +11370,68 @@ var FaceLivenessCapture = function FaceLivenessCapture(_a) {
11295
11370
  });
11296
11371
  })();
11297
11372
  }, [checkLiveness, face, frame, isReady, submissionError]);
11373
+ var onFallbackImageCaptured = React.useCallback(function (imageUrl) {
11374
+ return tslib.__awaiter(void 0, void 0, void 0, function () {
11375
+ var response, _a, e_2;
11376
+ return tslib.__generator(this, function (_b) {
11377
+ switch (_b.label) {
11378
+ case 0:
11379
+ dispatch({
11380
+ type: 'livenessChecking'
11381
+ });
11382
+ _b.label = 1;
11383
+ case 1:
11384
+ _b.trys.push([1, 4,, 5]);
11385
+ _a = checkLiveness;
11386
+ return [4, dataUrlToBase64(imageUrl)];
11387
+ case 2:
11388
+ return [4, _a.apply(void 0, [_b.sent()])];
11389
+ case 3:
11390
+ response = _b.sent();
11391
+ dispatch({
11392
+ type: 'livenessChecked',
11393
+ payload: {
11394
+ imageUrl: imageUrl,
11395
+ response: response
11396
+ }
11397
+ });
11398
+ return [3, 5];
11399
+ case 4:
11400
+ e_2 = _b.sent();
11401
+ dispatch({
11402
+ type: 'livenessCheckFailed',
11403
+ payload: {
11404
+ error: e_2
11405
+ }
11406
+ });
11407
+ return [3, 5];
11408
+ case 5:
11409
+ return [2];
11410
+ }
11411
+ });
11412
+ });
11413
+ }, [checkLiveness]);
11298
11414
  React.useEffect(function () {
11299
11415
  if (isPassed && state.imageUrl) onSuccess === null || onSuccess === void 0 ? void 0 : onSuccess(state.imageUrl);
11300
11416
  }, [onSuccess, state.imageUrl, isPassed]);
11301
11417
  React.useEffect(function () {
11302
- if (state.timesLivenessCheckFailed >= 2) {
11418
+ var allowedFailures = modelsError ? 1 : 2;
11419
+ if (state.timesLivenessCheckFailed >= allowedFailures) {
11303
11420
  onTimeout === null || onTimeout === void 0 ? void 0 : onTimeout();
11304
11421
  }
11305
- }, [onTimeout, state.timesLivenessCheckFailed]);
11306
- useTimeout(timeoutDurationMs, onTimeout, state.requestState === 'PASSED', state.requestState === 'IN_PROGRESS');
11422
+ }, [modelsError, onTimeout, state.timesLivenessCheckFailed]);
11423
+ useTimeout(timeoutDurationMs, onTimeout, state.requestState === 'PASSED' || !!modelsError, state.requestState === 'IN_PROGRESS');
11307
11424
  var verbiage = useTranslations(rawVerbiage, {
11308
11425
  guidanceRemoveEyeCoveringsText: 'Please remove your eye coverings (sunglasses, eye patch, etc.)...',
11309
11426
  guidanceRemoveHeadCoveringsText: 'Please remove your head coverings (hat, scarf, etc.)...',
11310
11427
  guidanceRemoveMaskText: 'Please remove your mask...'
11311
11428
  });
11312
11429
  var guidanceMessage = state.eyeCoveringDetected ? verbiage.guidanceRemoveEyeCoveringsText : state.headCoveringDetected ? verbiage.guidanceRemoveHeadCoveringsText : state.maskDetected ? verbiage.guidanceRemoveMaskText : undefined;
11430
+ if (modelsError) {
11431
+ return /*#__PURE__*/React__default['default'].createElement(SelfieCaptureFallback, {
11432
+ onFinished: onFallbackImageCaptured
11433
+ });
11434
+ }
11313
11435
  return /*#__PURE__*/React__default['default'].createElement(React__default['default'].Fragment, null, /*#__PURE__*/React__default['default'].createElement(InvisibleCanvas, {
11314
11436
  ref: rawCanvas
11315
11437
  }), /*#__PURE__*/React__default['default'].createElement(InvisibleCanvas, {