idmission-web-sdk 1.0.58 → 1.0.60

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.
Files changed (28) hide show
  1. package/README.md +2 -0
  2. package/dist/components/common/SelfieProgressPreview.d.ts +2 -1
  3. package/dist/components/customer_identification/CustomerIdentificationCapture.d.ts +4 -1
  4. package/dist/components/customer_verification/CustomerVerificationCapture.d.ts +4 -1
  5. package/dist/components/face_liveness/FaceLivenessCapture.d.ts +1 -0
  6. package/dist/components/submission/Errors.d.ts +5 -0
  7. package/dist/components/submission/SubmissionProvider.d.ts +1 -0
  8. package/dist/components/submission/TokenExpiredErrorOverlay.d.ts +2 -0
  9. package/dist/components/submission/TokenInvalidFormatErrorOverlay.d.ts +2 -0
  10. package/dist/components/submission/TokenInvalidSignatureErrorOverlay.d.ts +2 -0
  11. package/dist/components/submission/TokenMissingErrorOverlay.d.ts +2 -0
  12. package/dist/components/submission/TokenPublicKeyErrorOverlay.d.ts +5 -0
  13. package/dist/contexts/SubmissionContext.d.ts +1 -0
  14. package/dist/lib/locales/es/translation.d.ts +1 -0
  15. package/dist/lib/locales/index.d.ts +1 -0
  16. package/dist/sdk2.cjs.development.js +278 -28
  17. package/dist/sdk2.cjs.development.js.map +1 -1
  18. package/dist/sdk2.cjs.production.js +1 -1
  19. package/dist/sdk2.cjs.production.js.map +1 -1
  20. package/dist/sdk2.esm.js +278 -28
  21. package/dist/sdk2.esm.js.map +1 -1
  22. package/dist/version.d.ts +1 -1
  23. package/package.json +3 -1
  24. package/dist/index.js +0 -7
  25. package/dist/sdk2.umd.development.js +0 -19785
  26. package/dist/sdk2.umd.development.js.map +0 -1
  27. package/dist/sdk2.umd.production.js +0 -2
  28. package/dist/sdk2.umd.production.js.map +0 -1
package/README.md CHANGED
@@ -293,6 +293,7 @@ Render a fullscreen capture component that analyzes frames from the user's front
293
293
  <tr><td><code>guidanceRemoveEyeCoveringsText</code></td><td>Default: "Please remove your eye coverings (sunglasses, eye patch, etc.)..."</td></tr>
294
294
  <tr><td><code>guidanceRemoveHeadCoveringsText</code></td><td>Default: "Please remove your head coverings (hat, scarf, etc.)..."</td></tr>
295
295
  <tr><td><code>guidanceRemoveMaskText</code></td><td>Default: "Please remove your mask..."</td></tr>
296
+ <tr><td><code>progressPreviewText</code></td><td>Default: "Processing..."</td></tr>
296
297
  <tr><td><code>success.headingText</code></td><td>Default: "Face liveness has been verified!"</td></tr>
297
298
  <tr><td><code>success.retryBtnText</code></td><td>Default: "Retry"</td></tr>
298
299
  <tr><td><code>success.doneBtnText</code></td><td>Default: "Done"</td></tr>
@@ -629,6 +630,7 @@ Render a fullscreen capture component that analyzes frames from the user's front
629
630
  <tr><td><code>guidanceMoveBackText</code></td><td>Default: "Move back..."</td></tr>
630
631
  <tr><td><code>guidanceMoveForwardText</code></td><td>Default: "Move forward..."</td></tr>
631
632
  <tr><td><code>guidanceMoveToCenterText</code></td><td>Default: "Move to the center..."</td></tr>
633
+ <tr><td><code>progressPreviewText</code></td><td>Default: "Processing..."</td></tr>
632
634
  <tr><td><code>success.headingText</code></td><td>Default: "Customer has been identified!"</td></tr>
633
635
  <tr><td><code>success.retryBtnText</code></td><td>Default: "Retry"</td></tr>
634
636
  <tr><td><code>success.doneBtnText</code></td><td>Default: "Done"</td></tr>
@@ -3,6 +3,7 @@ export declare const IdCaptureImagePreview: ({ text, imageUrl, }: {
3
3
  text?: string | undefined;
4
4
  imageUrl: string;
5
5
  }) => React.JSX.Element;
6
- export declare const SelfieProgressPreview: ({ imageUrl }: {
6
+ export declare const SelfieProgressPreview: ({ text, imageUrl, }: {
7
+ text: string;
7
8
  imageUrl: string;
8
9
  }) => React.JSX.Element;
@@ -1,8 +1,11 @@
1
1
  import { ReactElement } from 'react';
2
2
  import { SelfieCaptureColors, SelfieCaptureVerbiage } from '../selfie_capture/SelfieCapture';
3
3
  import { SubmissionRequest, SubmissionResponse } from '../../contexts/SubmissionContext';
4
+ import { CustomerSuppliedVerbiage } from '../../lib/locales';
4
5
  export type CustomerIdentificationCaptureColors = SelfieCaptureColors;
5
- export type CustomerIdentificationCaptureVerbiage = SelfieCaptureVerbiage;
6
+ export type CustomerIdentificationCaptureVerbiage = SelfieCaptureVerbiage & {
7
+ progressPreviewText?: CustomerSuppliedVerbiage;
8
+ };
6
9
  export type CustomerIdentificationCaptureProps = {
7
10
  onCustomerMatched?: (resp: SubmissionResponse, req: SubmissionRequest) => void;
8
11
  onCustomerNotMatched?: (resp: SubmissionResponse, req: SubmissionRequest) => void;
@@ -1,8 +1,11 @@
1
1
  import { ReactElement } from 'react';
2
2
  import { SubmissionRequest, SubmissionResponse } from '../../contexts/SubmissionContext';
3
3
  import { SelfieCaptureColors, SelfieCaptureVerbiage } from '../selfie_capture/SelfieCapture';
4
+ import { CustomerSuppliedVerbiage } from '../../lib/locales';
4
5
  export type CustomerVerificationCaptureColors = SelfieCaptureColors;
5
- export type CustomerVerificationCaptureVerbiage = SelfieCaptureVerbiage;
6
+ export type CustomerVerificationCaptureVerbiage = SelfieCaptureVerbiage & {
7
+ progressPreviewText?: CustomerSuppliedVerbiage;
8
+ };
6
9
  export type CustomerVerificationCaptureProps = {
7
10
  onCustomerMatched?: (resp: SubmissionResponse, req: SubmissionRequest) => void;
8
11
  onCustomerNotMatched?: (resp: SubmissionResponse, req: SubmissionRequest) => void;
@@ -6,6 +6,7 @@ export type FaceLivenessCaptureVerbiage = SelfieCaptureVerbiage & {
6
6
  guidanceRemoveEyeCoveringsText?: CustomerSuppliedVerbiage;
7
7
  guidanceRemoveHeadCoveringsText?: CustomerSuppliedVerbiage;
8
8
  guidanceRemoveMaskText?: CustomerSuppliedVerbiage;
9
+ progressPreviewText?: CustomerSuppliedVerbiage;
9
10
  };
10
11
  export type FaceLivenessCaptureProps = {
11
12
  onCapture?: () => void;
@@ -5,3 +5,8 @@ export declare class SubmissionError extends Error {
5
5
  }
6
6
  export declare class NetworkError extends Error {
7
7
  }
8
+ export declare class TokenPublicKeyError extends Error {
9
+ err: Error;
10
+ host: string;
11
+ constructor(err: Error, host: string);
12
+ }
@@ -1,5 +1,6 @@
1
1
  import { ReactElement } from 'react';
2
2
  import { CardData, LivenessCheckRequest, PersonalData, SubmissionAction, SubmissionEnvironment, SubmissionRequest, SubmissionResponse } from '../../contexts/SubmissionContext';
3
+ export type TokenState = 'NOT_PARSED' | 'PARSING' | 'GOOD' | 'EXPIRED' | 'INVALID_FORMAT' | 'INVALID_SIGNATURE' | 'MISSING' | 'PUBLIC_KEY_LOAD_FAILED';
3
4
  export type SubmissionProviderProps = {
4
5
  action: SubmissionAction;
5
6
  children: ReactElement;
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare const TokenExpiredErrorOverlay: () => React.JSX.Element;
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare const TokenInvalidFormatErrorOverlay: () => React.JSX.Element;
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare const TokenInvalidSignatureErrorOverlay: () => React.JSX.Element;
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare const TokenMissingErrorOverlay: () => React.JSX.Element;
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ import { TokenPublicKeyError } from './Errors';
3
+ export declare const TokenPublicKeyErrorOverlay: ({ error, }: {
4
+ error: TokenPublicKeyError | null;
5
+ }) => React.JSX.Element;
@@ -181,6 +181,7 @@ export type SubmissionState = {
181
181
  retryLocationAccess: () => void;
182
182
  };
183
183
  export declare const SubmissionContext: import("react").Context<SubmissionState>;
184
+ export declare function parseJwt(token: string): Record<string, unknown>;
184
185
  export declare function determineSubmissionHost(environment: SubmissionEnvironment, token?: string): string;
185
186
  export declare function determineSubmissionEndpoint(action: SubmissionAction, hasId: boolean, hasSelfie: boolean, hasToken: boolean): string;
186
187
  export declare function liveCheckEndpoint(hasToken: boolean): string;
@@ -6,6 +6,7 @@ declare const _default: {
6
6
  'Camera access blocked': string;
7
7
  'Location access blocked': string;
8
8
  Continue: string;
9
+ 'Processing...': string;
9
10
  'Your camera permission is disabled': string;
10
11
  'This application requires access to your camera to continue. Please accept the permission once prompted by the browser. If the browser does not prompt for camera permissions, you must go to settings and provide camera access to the current browser.': string;
11
12
  'Your location permission is disabled': string;
@@ -14,6 +14,7 @@ export declare const resources: {
14
14
  'Camera access blocked': string;
15
15
  'Location access blocked': string;
16
16
  Continue: string;
17
+ 'Processing...': string;
17
18
  'Your camera permission is disabled': string;
18
19
  'This application requires access to your camera to continue. Please accept the permission once prompted by the browser. If the browser does not prompt for camera permissions, you must go to settings and provide camera access to the current browser.': string;
19
20
  'Your location permission is disabled': string;
@@ -7,6 +7,7 @@ var React = require('react');
7
7
  var ReactDOM = require('react-dom/client');
8
8
  var styled = require('styled-components');
9
9
  var reactI18next = require('react-i18next');
10
+ var jsrsasign = require('jsrsasign');
10
11
  var tf = require('@tensorflow/tfjs');
11
12
  var useResizeObserver = require('use-resize-observer');
12
13
  var LanguageDetector = require('i18next-browser-languagedetector');
@@ -46,7 +47,7 @@ var LanguageDetector__default = /*#__PURE__*/_interopDefaultLegacy(LanguageDetec
46
47
  var i18n__default = /*#__PURE__*/_interopDefaultLegacy(i18n);
47
48
  var SignatureCanvas__default = /*#__PURE__*/_interopDefaultLegacy(SignatureCanvas);
48
49
 
49
- var webSdkVersion = '1.0.58';
50
+ var webSdkVersion = '1.0.60';
50
51
 
51
52
  function getPlatform() {
52
53
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
@@ -418,6 +419,16 @@ var NetworkError = /** @class */function (_super) {
418
419
  }
419
420
  return NetworkError;
420
421
  }(Error);
422
+ var TokenPublicKeyError = /** @class */function (_super) {
423
+ tslib.__extends(TokenPublicKeyError, _super);
424
+ function TokenPublicKeyError(err, host) {
425
+ var _this = _super.call(this, err.message) || this;
426
+ _this.err = err;
427
+ _this.host = host;
428
+ return _this;
429
+ }
430
+ return TokenPublicKeyError;
431
+ }(Error);
421
432
 
422
433
  var SubmissionErrorOverlay = function SubmissionErrorOverlay(_a) {
423
434
  var error = _a.error,
@@ -482,6 +493,161 @@ var NetworkErrorContent = function NetworkErrorContent(_a) {
482
493
  }, retryText))));
483
494
  };
484
495
 
496
+ var TokenMissingErrorOverlay = function TokenMissingErrorOverlay() {
497
+ return /*#__PURE__*/React__default['default'].createElement(OverlayContainer, null, /*#__PURE__*/React__default['default'].createElement(OverlayInner, {
498
+ style: {
499
+ justifyContent: 'center'
500
+ }
501
+ }, /*#__PURE__*/React__default['default'].createElement("h3", {
502
+ style: {
503
+ marginBottom: 8
504
+ }
505
+ }, "IDmission WebSDK failed to load"), /*#__PURE__*/React__default['default'].createElement("p", {
506
+ style: {
507
+ marginBottom: 0
508
+ }
509
+ }, "Required property ", /*#__PURE__*/React__default['default'].createElement("code", null, "submissionToken"), " is missing."), /*#__PURE__*/React__default['default'].createElement("p", {
510
+ style: {
511
+ lineHeight: '1.5rem'
512
+ }
513
+ }, "Please refer to the", ' ', /*#__PURE__*/React__default['default'].createElement("a", {
514
+ href: "https://www.npmjs.com/package/idmission-web-sdk#getting-started",
515
+ target: "_blank",
516
+ rel: "noreferrer"
517
+ }, "Getting Started"), ' ', "section of the documentation for information on how to use your credentials to generate a valid", ' ', /*#__PURE__*/React__default['default'].createElement("a", {
518
+ href: "https://jwt.io",
519
+ target: "_blank",
520
+ rel: "noreferrer"
521
+ }, "JSON Web Token"), ' ', "for your IDmission account. Every usage of the IDmission WebSDK must be authorized with a valid JWT from IDmission's servers.")));
522
+ };
523
+
524
+ var TokenInvalidFormatErrorOverlay = function TokenInvalidFormatErrorOverlay() {
525
+ return /*#__PURE__*/React__default['default'].createElement(OverlayContainer, null, /*#__PURE__*/React__default['default'].createElement(OverlayInner, {
526
+ style: {
527
+ justifyContent: 'center'
528
+ }
529
+ }, /*#__PURE__*/React__default['default'].createElement("h3", {
530
+ style: {
531
+ marginBottom: 8
532
+ }
533
+ }, "IDmission WebSDK failed to load"), /*#__PURE__*/React__default['default'].createElement("p", {
534
+ style: {
535
+ marginBottom: 0
536
+ }
537
+ }, "Required property ", /*#__PURE__*/React__default['default'].createElement("code", null, "submissionToken"), " is invalid."), /*#__PURE__*/React__default['default'].createElement("p", null, "JSON Web Tokens consist of three parts separated by dots (", /*#__PURE__*/React__default['default'].createElement("code", null, "."), "), which are:"), /*#__PURE__*/React__default['default'].createElement("div", {
538
+ style: {
539
+ display: 'flex'
540
+ }
541
+ }, /*#__PURE__*/React__default['default'].createElement("ul", {
542
+ style: {
543
+ display: 'inline',
544
+ margin: '0 auto'
545
+ }
546
+ }, /*#__PURE__*/React__default['default'].createElement("li", null, "Header"), /*#__PURE__*/React__default['default'].createElement("li", null, "Payload"), /*#__PURE__*/React__default['default'].createElement("li", null, "Signature"))), /*#__PURE__*/React__default['default'].createElement("p", null, "Therefore, a JWT typically looks like the following:", ' ', /*#__PURE__*/React__default['default'].createElement("code", null, "xxxxx.yyyyy.zzzzz")), /*#__PURE__*/React__default['default'].createElement("p", {
547
+ style: {
548
+ lineHeight: '1.5rem'
549
+ }
550
+ }, "Please refer to the", ' ', /*#__PURE__*/React__default['default'].createElement("a", {
551
+ href: "https://www.npmjs.com/package/idmission-web-sdk#getting-started",
552
+ target: "_blank",
553
+ rel: "noreferrer"
554
+ }, "Getting Started"), ' ', "section of the documentation for information on how to use your credentials to generate a valid", ' ', /*#__PURE__*/React__default['default'].createElement("a", {
555
+ href: "https://jwt.io",
556
+ target: "_blank",
557
+ rel: "noreferrer"
558
+ }, "JSON Web Token"), ' ', "for your IDmission account. Every usage of the IDmission WebSDK must be authorized with a valid JWT from IDmission's servers.")));
559
+ };
560
+
561
+ var TokenInvalidSignatureErrorOverlay = function TokenInvalidSignatureErrorOverlay() {
562
+ return /*#__PURE__*/React__default['default'].createElement(OverlayContainer, null, /*#__PURE__*/React__default['default'].createElement(OverlayInner, {
563
+ style: {
564
+ justifyContent: 'center'
565
+ }
566
+ }, /*#__PURE__*/React__default['default'].createElement("h3", {
567
+ style: {
568
+ marginBottom: 8
569
+ }
570
+ }, "IDmission WebSDK failed to load"), /*#__PURE__*/React__default['default'].createElement("p", {
571
+ style: {
572
+ marginBottom: 0
573
+ }
574
+ }, "Required property ", /*#__PURE__*/React__default['default'].createElement("code", null, "submissionToken"), " could not be validated."), /*#__PURE__*/React__default['default'].createElement("p", {
575
+ style: {
576
+ marginBottom: 0,
577
+ lineHeight: '1.5rem'
578
+ }
579
+ }, "The signature of your token could not be validated. Check your token generation routine, it's possible that some malicious behavior is at play. This can also happen if you attempt to manually modify your token before passing it to the IDmission WebSDK."), /*#__PURE__*/React__default['default'].createElement("p", {
580
+ style: {
581
+ marginBottom: 0,
582
+ lineHeight: '1.5rem'
583
+ }
584
+ }, "If you believe you have reached this page in error, please contact us at ", /*#__PURE__*/React__default['default'].createElement("a", {
585
+ href: "mailto:support@idmission.com"
586
+ }, "support@idmission.com"), ".")));
587
+ };
588
+
589
+ var TokenExpiredErrorOverlay = function TokenExpiredErrorOverlay() {
590
+ return /*#__PURE__*/React__default['default'].createElement(OverlayContainer, null, /*#__PURE__*/React__default['default'].createElement(OverlayInner, {
591
+ style: {
592
+ justifyContent: 'center'
593
+ }
594
+ }, /*#__PURE__*/React__default['default'].createElement("h3", {
595
+ style: {
596
+ marginBottom: 8
597
+ }
598
+ }, "IDmission WebSDK failed to load"), /*#__PURE__*/React__default['default'].createElement("p", {
599
+ style: {
600
+ marginBottom: 0
601
+ }
602
+ }, "Required property ", /*#__PURE__*/React__default['default'].createElement("code", null, "submissionToken"), " is expired."), /*#__PURE__*/React__default['default'].createElement("p", {
603
+ style: {
604
+ marginBottom: 0,
605
+ lineHeight: '1.5rem'
606
+ }
607
+ }, "Ensure you are generating a fresh token for each request to the IDmission WebSDK."), /*#__PURE__*/React__default['default'].createElement("p", {
608
+ style: {
609
+ lineHeight: '1.5rem'
610
+ }
611
+ }, "Please refer to the", ' ', /*#__PURE__*/React__default['default'].createElement("a", {
612
+ href: "https://www.npmjs.com/package/idmission-web-sdk#getting-started",
613
+ target: "_blank",
614
+ rel: "noreferrer"
615
+ }, "Getting Started"), ' ', "section of the documentation for information on how to use your credentials to generate a valid", ' ', /*#__PURE__*/React__default['default'].createElement("a", {
616
+ href: "https://jwt.io",
617
+ target: "_blank",
618
+ rel: "noreferrer"
619
+ }, "JSON Web Token"), ' ', "for your IDmission account. Every usage of the IDmission WebSDK must be authorized with a valid JWT from IDmission's servers.")));
620
+ };
621
+
622
+ var TokenPublicKeyErrorOverlay = function TokenPublicKeyErrorOverlay(_a) {
623
+ var error = _a.error;
624
+ return /*#__PURE__*/React__default['default'].createElement(OverlayContainer, null, /*#__PURE__*/React__default['default'].createElement(OverlayInner, {
625
+ style: {
626
+ justifyContent: 'center'
627
+ }
628
+ }, /*#__PURE__*/React__default['default'].createElement("h3", {
629
+ style: {
630
+ marginBottom: 8
631
+ }
632
+ }, "IDmission WebSDK failed to load"), /*#__PURE__*/React__default['default'].createElement("p", {
633
+ style: {
634
+ marginBottom: 0
635
+ }
636
+ }, (error === null || error === void 0 ? void 0 : error.host) ? ( /*#__PURE__*/React__default['default'].createElement(React__default['default'].Fragment, null, "Failed to reach ", /*#__PURE__*/React__default['default'].createElement("code", null, error.host), ".")) : ( /*#__PURE__*/React__default['default'].createElement(React__default['default'].Fragment, null, "Failed to obtain public key for ", /*#__PURE__*/React__default['default'].createElement("code", null, "submissionToken"), "."))), (error === null || error === void 0 ? void 0 : error.message) && ( /*#__PURE__*/React__default['default'].createElement("p", {
637
+ style: {
638
+ marginBottom: 0,
639
+ lineHeight: '1.5rem'
640
+ }
641
+ }, /*#__PURE__*/React__default['default'].createElement("code", null, error.message))), /*#__PURE__*/React__default['default'].createElement("p", {
642
+ style: {
643
+ marginBottom: 0,
644
+ lineHeight: '1.5rem'
645
+ }
646
+ }, "Please ensure that IDmission's servers can be reached. If you believe you have reached this page in error, please contact us at", ' ', /*#__PURE__*/React__default['default'].createElement("a", {
647
+ href: "mailto:support@idmission.com"
648
+ }, "support@idmission.com"), ".")));
649
+ };
650
+
485
651
  var SubmissionProvider = function SubmissionProvider(_a) {
486
652
  var action = _a.action,
487
653
  children = _a.children,
@@ -933,6 +1099,64 @@ var SubmissionProvider = function SubmissionProvider(_a) {
933
1099
  setSubmissionStatus(SubmissionStatus.READY);
934
1100
  retrySubmission();
935
1101
  }, [retrySubmission]);
1102
+ var _13 = React.useState('NOT_PARSED'),
1103
+ tokenState = _13[0],
1104
+ setTokenState = _13[1];
1105
+ var _14 = React.useState(null),
1106
+ tokenError = _14[0],
1107
+ setTokenError = _14[1];
1108
+ React.useEffect(function () {
1109
+ (function () {
1110
+ return tslib.__awaiter(void 0, void 0, void 0, function () {
1111
+ var parsed, iss, publicKey, resp, e_3, valid, exp;
1112
+ return tslib.__generator(this, function (_a) {
1113
+ switch (_a.label) {
1114
+ case 0:
1115
+ setTokenState('PARSING');
1116
+ if (!token) return [2 /*return*/, setTokenState('MISSING')];
1117
+ try {
1118
+ parsed = parseJwt(token);
1119
+ } catch (e) {
1120
+ console.error('error parsing token', e);
1121
+ return [2 /*return*/, setTokenState('INVALID_FORMAT')];
1122
+ }
1123
+ iss = parsed.iss;
1124
+ _a.label = 1;
1125
+ case 1:
1126
+ _a.trys.push([1, 3,, 4]);
1127
+ return [4 /*yield*/, fetch(iss).then(function (r) {
1128
+ return r.json();
1129
+ })];
1130
+ case 2:
1131
+ resp = _a.sent();
1132
+ publicKey = jsrsasign.KEYUTIL.getKey("-----BEGIN PUBLIC KEY-----\n".concat(resp.public_key, "\n-----END PUBLIC KEY-----"));
1133
+ return [3 /*break*/, 4];
1134
+ case 3:
1135
+ e_3 = _a.sent();
1136
+ console.error('error fetching public key', e_3);
1137
+ setTokenError(new TokenPublicKeyError(e_3, iss));
1138
+ return [2 /*return*/, setTokenState('PUBLIC_KEY_LOAD_FAILED')];
1139
+ case 4:
1140
+ valid = false;
1141
+ try {
1142
+ valid = jsrsasign.KJUR.jws.JWS.verifyJWT(token, publicKey, {
1143
+ alg: ['RS256']
1144
+ });
1145
+ } catch (e) {
1146
+ console.error('error validating token', e);
1147
+ }
1148
+ if (!valid) return [2 /*return*/, setTokenState('INVALID_SIGNATURE')];
1149
+ exp = parsed.exp;
1150
+ if (Date.now() >= exp * 1000) {
1151
+ return [2 /*return*/, setTokenState('EXPIRED')];
1152
+ }
1153
+ setTokenState('GOOD');
1154
+ return [2 /*return*/];
1155
+ }
1156
+ });
1157
+ });
1158
+ })();
1159
+ }, [token]);
936
1160
  var value = {
937
1161
  submit: submit,
938
1162
  submissionStatus: submissionStatus,
@@ -963,6 +1187,23 @@ var SubmissionProvider = function SubmissionProvider(_a) {
963
1187
  checkLiveness: checkLiveness,
964
1188
  retryLocationAccess: retryLocationAccess
965
1189
  };
1190
+ if (tokenState === 'MISSING') {
1191
+ return /*#__PURE__*/React__default['default'].createElement(TokenMissingErrorOverlay, null);
1192
+ }
1193
+ if (tokenState === 'INVALID_FORMAT') {
1194
+ return /*#__PURE__*/React__default['default'].createElement(TokenInvalidFormatErrorOverlay, null);
1195
+ }
1196
+ if (tokenState === 'INVALID_SIGNATURE') {
1197
+ return /*#__PURE__*/React__default['default'].createElement(TokenInvalidSignatureErrorOverlay, null);
1198
+ }
1199
+ if (tokenState === 'EXPIRED') {
1200
+ return /*#__PURE__*/React__default['default'].createElement(TokenExpiredErrorOverlay, null);
1201
+ }
1202
+ if (tokenState === 'PUBLIC_KEY_LOAD_FAILED') {
1203
+ return /*#__PURE__*/React__default['default'].createElement(TokenPublicKeyErrorOverlay, {
1204
+ error: tokenError
1205
+ });
1206
+ }
966
1207
  return /*#__PURE__*/React__default['default'].createElement(SubmissionContext.Provider, {
967
1208
  value: value
968
1209
  }, geolocationRequired && geolocationBlocked ? ( /*#__PURE__*/React__default['default'].createElement(GeolocationAccessDeniedOverlay, null)) : children, submissionError && ( /*#__PURE__*/React__default['default'].createElement(SubmissionErrorOverlay, {
@@ -9167,7 +9408,8 @@ var IdCaptureImagePreview = function IdCaptureImagePreview(_a) {
9167
9408
  })));
9168
9409
  };
9169
9410
  var SelfieProgressPreview = function SelfieProgressPreview(_a) {
9170
- var imageUrl = _a.imageUrl;
9411
+ var text = _a.text,
9412
+ imageUrl = _a.imageUrl;
9171
9413
  return /*#__PURE__*/React__default['default'].createElement(ImagePreviewWrapper, null, /*#__PURE__*/React__default['default'].createElement(ImagePreviewText, null, /*#__PURE__*/React__default['default'].createElement(Spinner, {
9172
9414
  "$size": 24,
9173
9415
  "$color": "white",
@@ -9178,13 +9420,13 @@ var SelfieProgressPreview = function SelfieProgressPreview(_a) {
9178
9420
  left: -3,
9179
9421
  margin: '0 3px 0 -12px'
9180
9422
  }
9181
- }), "Processing..."), /*#__PURE__*/React__default['default'].createElement(ImagePreviewImageWrapper, null, /*#__PURE__*/React__default['default'].createElement("img", {
9423
+ }), text), /*#__PURE__*/React__default['default'].createElement(ImagePreviewImageWrapper, null, /*#__PURE__*/React__default['default'].createElement("img", {
9182
9424
  src: imageUrl,
9183
9425
  alt: ""
9184
9426
  })));
9185
9427
  };
9186
9428
  var ImagePreviewWrapper = styled__default['default'].div(templateObject_1$5 || (templateObject_1$5 = tslib.__makeTemplateObject(["\n position: absolute;\n display: flex;\n flex-direction: column;\n height: 33%;\n bottom: 12px;\n right: 12px;\n"], ["\n position: absolute;\n display: flex;\n flex-direction: column;\n height: 33%;\n bottom: 12px;\n right: 12px;\n"])));
9187
- var ImagePreviewText = styled__default['default'].div(templateObject_2$2 || (templateObject_2$2 = tslib.__makeTemplateObject(["\n display: block;\n position: absolute;\n top: -32px;\n font:\n 14px -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n Roboto,\n Helvetica,\n Arial,\n sans-serif,\n 'Apple Color Emoji',\n 'Segoe UI Emoji',\n 'Segoe UI Symbol';\n color: white;\n text-align: center;\n margin: 0 auto;\n width: 100%;\n"], ["\n display: block;\n position: absolute;\n top: -32px;\n font:\n 14px -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n Roboto,\n Helvetica,\n Arial,\n sans-serif,\n 'Apple Color Emoji',\n 'Segoe UI Emoji',\n 'Segoe UI Symbol';\n color: white;\n text-align: center;\n margin: 0 auto;\n width: 100%;\n"])));
9429
+ var ImagePreviewText = styled__default['default'].div(templateObject_2$2 || (templateObject_2$2 = tslib.__makeTemplateObject(["\n display: block;\n position: absolute;\n top: -32px;\n font: 14px -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica,\n Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';\n color: white;\n text-align: center;\n margin: 0 auto;\n width: 100%;\n"], ["\n display: block;\n position: absolute;\n top: -32px;\n font: 14px -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica,\n Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';\n color: white;\n text-align: center;\n margin: 0 auto;\n width: 100%;\n"])));
9188
9430
  var ImagePreviewImageWrapper = styled__default['default'].div(templateObject_3$1 || (templateObject_3$1 = tslib.__makeTemplateObject(["\n position: relative;\n height: calc(100% - 8px);\n padding: 4px;\n border-radius: 4px;\n background: white;\n\n & > img {\n border-radius: 4px;\n width: auto;\n max-height: 100%;\n }\n"], ["\n position: relative;\n height: calc(100% - 8px);\n padding: 4px;\n border-radius: 4px;\n background: white;\n\n & > img {\n border-radius: 4px;\n width: auto;\n max-height: 100%;\n }\n"])));
9189
9431
  var templateObject_1$5, templateObject_2$2, templateObject_3$1;
9190
9432
 
@@ -9198,6 +9440,7 @@ var esTranslation = {
9198
9440
  'Camera access blocked': 'Acceso bloqueado a la cámara',
9199
9441
  'Location access blocked': 'Acceso bloqueado a la localización',
9200
9442
  Continue: 'Continuar',
9443
+ 'Processing...': 'Procesando...',
9201
9444
  'Your camera permission is disabled': 'El permiso de la cámara está desactivado',
9202
9445
  'This application requires access to your camera to continue. Please accept the permission once prompted by the browser. If the browser does not prompt for camera permissions, you must go to settings and provide camera access to the current browser.': 'Esta aplicación requiere el acceso a la cámara para continuar. Hay que aceptar el permiso una vez que se muestre la ventana en el explorador. Si no aparece la ventana para otorgar permisos, entonces hay que dirigirse a Configuración y otorgar el permiso a la cámara en el explorador actual.',
9203
9446
  'Your location permission is disabled': 'El permiso de la localización está desactivado',
@@ -11453,27 +11696,28 @@ var reducer$2 = function reducer(state, action) {
11453
11696
  }
11454
11697
  };
11455
11698
  var FaceLivenessCapture = function FaceLivenessCapture(_a) {
11699
+ var _b;
11456
11700
  var onCapture = _a.onCapture,
11457
11701
  onSuccess = _a.onSuccess,
11458
11702
  onTimeout = _a.onTimeout,
11459
11703
  onExit = _a.onExit,
11460
- _b = _a.timeoutDurationMs,
11461
- timeoutDurationMs = _b === void 0 ? 15000 : _b,
11462
- _c = _a.colors,
11463
- colors = _c === void 0 ? {} : _c,
11464
- _d = _a.verbiage,
11465
- rawVerbiage = _d === void 0 ? {} : _d,
11704
+ _c = _a.timeoutDurationMs,
11705
+ timeoutDurationMs = _c === void 0 ? 15000 : _c,
11706
+ _d = _a.colors,
11707
+ colors = _d === void 0 ? {} : _d,
11708
+ _e = _a.verbiage,
11709
+ rawVerbiage = _e === void 0 ? {} : _e,
11466
11710
  debugMode = _a.debugMode;
11467
- var _e = React.useContext(SubmissionContext),
11468
- checkLiveness = _e.checkLiveness,
11469
- submissionError = _e.submissionError;
11711
+ var _f = React.useContext(SubmissionContext),
11712
+ checkLiveness = _f.checkLiveness,
11713
+ submissionError = _f.submissionError;
11470
11714
  var modelsError = React.useContext(HighPerformanceSelfieGuidanceModelsContext).error;
11471
- var _f = React.useReducer(reducer$2, initialState$2),
11472
- state = _f[0],
11473
- dispatch = _f[1];
11474
- var _g = React.useState(null),
11475
- imageUrl = _g[0],
11476
- setImageUrl = _g[1];
11715
+ var _g = React.useReducer(reducer$2, initialState$2),
11716
+ state = _g[0],
11717
+ dispatch = _g[1];
11718
+ var _h = React.useState(null),
11719
+ imageUrl = _h[0],
11720
+ setImageUrl = _h[1];
11477
11721
  var rawCanvas = React.useRef(null);
11478
11722
  var cropCanvas = React.useRef(null);
11479
11723
  var onSelfieCaptured = React.useCallback(function (frame, face) {
@@ -11590,7 +11834,8 @@ var FaceLivenessCapture = function FaceLivenessCapture(_a) {
11590
11834
  var verbiage = useTranslations(rawVerbiage, {
11591
11835
  guidanceRemoveEyeCoveringsText: 'Please remove your eye coverings (sunglasses, eye patch, etc.)...',
11592
11836
  guidanceRemoveHeadCoveringsText: 'Please remove your head coverings (hat, scarf, etc.)...',
11593
- guidanceRemoveMaskText: 'Please remove your mask...'
11837
+ guidanceRemoveMaskText: 'Please remove your mask...',
11838
+ progressPreviewText: 'Processing...'
11594
11839
  });
11595
11840
  var guidanceMessage = state.eyeCoveringDetected ? verbiage.guidanceRemoveEyeCoveringsText : state.headCoveringDetected ? verbiage.guidanceRemoveHeadCoveringsText : state.maskDetected ? verbiage.guidanceRemoveMaskText : undefined;
11596
11841
  if (modelsError) {
@@ -11611,9 +11856,10 @@ var FaceLivenessCapture = function FaceLivenessCapture(_a) {
11611
11856
  colors: colors,
11612
11857
  verbiage: verbiage,
11613
11858
  debugMode: debugMode
11614
- }), imageUrl && /*#__PURE__*/React__default['default'].createElement(SelfieProgressPreview, {
11615
- imageUrl: imageUrl
11616
- }));
11859
+ }), imageUrl && ( /*#__PURE__*/React__default['default'].createElement(SelfieProgressPreview, {
11860
+ imageUrl: imageUrl,
11861
+ text: (_b = verbiage.progressPreviewText) !== null && _b !== void 0 ? _b : ''
11862
+ })));
11617
11863
  };
11618
11864
 
11619
11865
  var SelfieCaptureLoadingOverlay = function SelfieCaptureLoadingOverlay(_a) {
@@ -13508,6 +13754,7 @@ var CustomerVerificationCapture = function CustomerVerificationCapture(_a) {
13508
13754
  }
13509
13755
  }, [onCustomerMatched, onCustomerNotMatched, state.requestState, submissionRequest, submissionResponse]);
13510
13756
  useTimeout(captureGuidanceTimeoutDurationMs, onCaptureGuidanceTimeout, ['VERIFIED', 'REJECTED'].includes(state.requestState), state.requestState === 'VERIFYING');
13757
+ var progressPreviewText = useVerbiage(verbiage.progressPreviewText, 'Processing...');
13511
13758
  return /*#__PURE__*/React__default['default'].createElement(React__default['default'].Fragment, null, /*#__PURE__*/React__default['default'].createElement(InvisibleCanvas, {
13512
13759
  ref: rawCanvas
13513
13760
  }), /*#__PURE__*/React__default['default'].createElement(InvisibleCanvas, {
@@ -13519,9 +13766,10 @@ var CustomerVerificationCapture = function CustomerVerificationCapture(_a) {
13519
13766
  colors: colors,
13520
13767
  verbiage: verbiage,
13521
13768
  debugMode: debugMode
13522
- }), imageUrl && /*#__PURE__*/React__default['default'].createElement(SelfieProgressPreview, {
13523
- imageUrl: imageUrl
13524
- }));
13769
+ }), imageUrl && ( /*#__PURE__*/React__default['default'].createElement(SelfieProgressPreview, {
13770
+ imageUrl: imageUrl,
13771
+ text: progressPreviewText
13772
+ })));
13525
13773
  };
13526
13774
 
13527
13775
  var CustomerVerificationSuccess = function CustomerVerificationSuccess(_a) {
@@ -13979,6 +14227,7 @@ var CustomerIdentificationCapture = function CustomerIdentificationCapture(_a) {
13979
14227
  }
13980
14228
  }, [onCustomerMatched, onCustomerNotMatched, state.requestState, submissionRequest, submissionResponse]);
13981
14229
  useTimeout(captureGuidanceTimeoutDurationMs, onCaptureGuidanceTimeout, ['FOUND', 'NOT_FOUND'].includes(state.requestState), state.requestState === 'IDENTIFYING');
14230
+ var progressPreviewText = useVerbiage(verbiage.progressPreviewText, 'Processing...');
13982
14231
  return /*#__PURE__*/React__default['default'].createElement(React__default['default'].Fragment, null, /*#__PURE__*/React__default['default'].createElement(InvisibleCanvas, {
13983
14232
  ref: rawCanvas
13984
14233
  }), /*#__PURE__*/React__default['default'].createElement(InvisibleCanvas, {
@@ -13990,9 +14239,10 @@ var CustomerIdentificationCapture = function CustomerIdentificationCapture(_a) {
13990
14239
  colors: colors,
13991
14240
  verbiage: verbiage,
13992
14241
  debugMode: debugMode
13993
- }), imageUrl && /*#__PURE__*/React__default['default'].createElement(SelfieProgressPreview, {
14242
+ }), imageUrl && ( /*#__PURE__*/React__default['default'].createElement(SelfieProgressPreview, {
14243
+ text: progressPreviewText,
13994
14244
  imageUrl: imageUrl
13995
- }));
14245
+ })));
13996
14246
  };
13997
14247
 
13998
14248
  var CustomerIdentificationSuccess = function CustomerIdentificationSuccess(_a) {