@authme/identity-verification 2.4.8 → 2.7.0

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/index.js CHANGED
@@ -5,9 +5,9 @@ import 'core-js/modules/es.array.includes.js';
5
5
  import 'core-js/modules/es.string.includes.js';
6
6
  import { getTranslateInstance, EventListenerService, TrackingEvent, generateStatus, StatusDescription, StatusView, StatusAction, AuthmeError, ErrorCode, Feature, StatusEvent, setRequestLoggingFunc, setAccessToken } from '@authme/core';
7
7
  import { EAuthMeFASServiceStatus, EAuthMeIDCardAntiFraudStage as EAuthMeIDCardAntiFraudStage$1, EAuthMeCardClass as EAuthMeCardClass$1, AuthmeFunctionModule, MlEngine, EngineModule, EAuthMeEngineReturnCode } from '@authme/engine';
8
- import { IdRecognitionCardType, CountryCode, EAuthMeCardClass, mapCardtypeToAuthmeClass, cardTypeTitle, cardTypeConfirmTitle, getRecognitionColumnOrder, EAuthMeIDCardAntiFraudStage, EAuthMeIDCardAntiFraudStatus, EAuthMeCardOCRStatus, EAuthMeMRZServiceStatus, saveExtraDoc, MRZService, init, initScanDocument, twoWayAuthmeCardClassMap, uploadFrameBase64, ResourceImageType, finishScanDocument, CardOCR, IdCardAntiFraudService, recognitionEncrypt, RecognitionFileType, getCardSubTypes, confirmScan } from '@authme/id-recognition';
9
- import { getCssVariable, RGBToLottieColor, colorToRGB, Icon, useState, clearCanvas, getImageData, hidePopup, showPopup, waitTime, TIME_UNIT, AuthmeError as AuthmeError$1, ErrorCode as ErrorCode$1, requestCamera, showElement, asyncOnLineShowErrorMessage, getCanvasSize, startSpinner, stopSpinner, showErrorMessage, hideElement, isIphone14proOrProMax, cropByRatio, checkOnlineStatus, asyncShowErrorMessage, switchCamera, UintArrayToBlob, asyncShowPopup, retryPromiseWithCondition, hideErrorMessage, dataURItoBlob, backgroundRequest, debugTools, showErrorMessageEventName, RUN_FUNCTION_NAME, Storage, STORAGE_KEY, splitResult, combineResult, startLoadingSDK, stopLoadingSDK } from '@authme/util';
10
- import { mergeMap, animationFrames, filter, tap, map, from, catchError, EMPTY, merge, fromEvent, of, concatAll, takeUntil, Subject, defer, switchMap, throttleTime, take, concatMap, throwError, finalize, shareReplay, switchMapTo, firstValueFrom, takeWhile, mapTo, race } from 'rxjs';
8
+ import { IdRecognitionCardType, CountryCode, EAuthMeCardClass, EAuthMeIDCardAntiFraudStatus, EAuthMeIDCardAntiFraudStage, thicknessDefaultConfig, mapCardtypeToAuthmeClass, cardTypeTitle, cardTypeConfirmTitle, getRecognitionColumnOrder, EAuthMeCardOCRStatus, EAuthMeMRZServiceStatus, saveExtraDoc, initScanDocumentResourceBase64, MRZService, init, initScanDocument, uploadFrameBase64, ResourceImageType, finishScanDocument, CardOCR, IdCardAntiFraudService, recognitionEncrypt, RecognitionFileType, twoWayAuthmeCardClassMap, getCardSubTypes, getCardTypes, confirmScan } from '@authme/id-recognition';
9
+ import { getCssVariable, RGBToLottieColor, colorToRGB, Icon, useState, clearCanvas, getImageData, isMobile, hidePopup, showPopup, waitTime, TIME_UNIT, AuthmeError as AuthmeError$1, ErrorCode as ErrorCode$1, requestCamera, showElement, asyncOnLineShowErrorMessage, getCanvasSize, startSpinner, stopSpinner, showErrorMessage, hideElement, dataURItoBlob, checkOnlineStatus, UintArrayToBlob, isIphone14proOrProMax, cropByRatio, asyncShowErrorMessage, switchCamera, asyncShowPopup, retryPromiseWithCondition, hideErrorMessage, backgroundRequest, debugTools, showErrorMessageEventName, RUN_FUNCTION_NAME, Storage, STORAGE_KEY, splitResult, combineResult, startLoadingSDK, stopLoadingSDK } from '@authme/util';
10
+ import { mergeMap, animationFrames, filter, tap, map, from, catchError, EMPTY, of, merge, fromEvent, concatAll, takeUntil, Subject, defer, switchMap, throttleTime, take, concatMap, throwError, finalize, Observable, interval, mapTo, firstValueFrom, shareReplay, switchMapTo, takeWhile as takeWhile$1, race } from 'rxjs';
11
11
  import 'core-js/modules/es.regexp.to-string.js';
12
12
  import { FasRecognitionResult, EAuthMeFASServiceStage, FasService, LivenessAPI, EAuthMeMouthStatus, LivenessResultStatus } from '@authme/liveness';
13
13
  import 'core-js/modules/es.parse-float.js';
@@ -21,6 +21,7 @@ import 'core-js/modules/es.parse-int.js';
21
21
  import 'core-js/modules/es.regexp.exec.js';
22
22
  import 'core-js/modules/es.string.replace.js';
23
23
  import 'core-js/modules/es.object.from-entries.js';
24
+ import { takeWhile, finalize as finalize$1 } from 'rxjs/operators';
24
25
  import 'core-js/modules/es.array-buffer.slice.js';
25
26
  import 'core-js/modules/es.typed-array.uint8-array.js';
26
27
  import 'core-js/modules/es.typed-array.fill.js';
@@ -65,7 +66,7 @@ function __awaiter(thisArg, _arguments, P, generator) {
65
66
  });
66
67
  }
67
68
 
68
- const LIVENESS_GUIDE_IMG = 'data:image/jpeg;base64,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';
69
+ const LIVENESS_GUIDE_IMG = '<svg width="327" height="275" viewBox="0 0 327 275" fill="none" xmlns="http://www.w3.org/2000/svg"><rect width="327" height="275" fill="#F8F8F8"/><path d="M94.4575 88.8376L67.3527 70.2703C65.5273 68.6387 63.2943 67.4476 60.8821 67.0724C57.5409 66.5502 53.5151 67.3987 52.7491 74.186C52.1297 79.7008 54.0204 85.1992 57.5735 89.4413L94.4575 138.03V88.8376Z" fill="#F8CCC7"/><path opacity="0.3" d="M116.709 27H231.892C244.165 27 254.139 36.9853 254.139 49.2711V274.462H94.4609V49.2711C94.4609 36.9853 104.436 27 116.709 27Z" fill="#43A2C2"/><path d="M117.245 45.9929H231.352C237.644 45.9929 242.761 51.0997 242.761 57.4139V274.463H105.836V57.3976C105.836 51.0997 110.937 45.9766 117.245 45.9766V45.9929Z" fill="white"/><path d="M120.359 259.957H227.832C229.592 259.957 231.027 261.393 231.027 263.155V274.478H117.164V263.155C117.164 261.393 118.598 259.957 120.359 259.957Z" fill="#00C1B6"/><path d="M271.819 274.46L271.51 243.639C271.51 243.639 275.405 162.223 255.26 153.723C255.26 153.723 238.651 150.688 238.407 185.604L236.956 226.508C236.956 226.508 209.917 235.073 206.07 274.46" fill="#F8CCC7"/><path d="M79.5461 242.401C79.5461 242.401 65.3336 221.892 67.9251 202.134C68.5445 197.369 70.7611 192.866 74.5424 189.913C76.1071 188.689 78.014 187.629 80.2795 187.074L94.4431 207.175V216.753C96.4152 222.039 99.3164 227.537 100.62 233.036C101.696 237.588 102.56 242.205 102.886 246.888C103.098 249.923 103.945 254.817 102.283 257.558C101.256 259.239 98.8927 259.484 97.0509 259.304C88.2659 258.488 83.8652 248.65 79.5461 242.417V242.401Z" fill="#F8CCC7"/><path d="M94.4587 207.175V216.752C96.4309 222.038 99.332 227.537 100.636 233.035C101.712 237.587 102.575 242.205 102.901 246.887C103.113 249.922 103.961 254.817 102.298 257.558C101.272 259.238 98.9083 259.483 97.0665 259.304C88.2815 258.488 83.8809 248.649 79.5617 242.417C79.5617 242.417 65.3492 221.908 67.9407 202.149C68.5601 197.385 70.7767 192.882 74.558 189.929C76.1227 188.705 78.0296 187.645 80.2951 187.09" stroke="#F2B1AC" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/><path d="M88.2668 42.532C85.7568 40.7372 84.2084 39.7093 81.7962 39.3341C78.455 38.812 74.4292 39.6604 73.6631 46.4478C73.0438 51.9625 74.9344 57.4609 78.4876 61.703L94.4929 82.783V46.8067L88.2668 42.5483V42.532Z" fill="#F8CCC7"/><path d="M87.3713 202.868C87.3713 202.868 71.5941 182.701 66.9001 157.493C66.297 154.247 66.2481 150.902 67.0305 147.704C68.7418 140.705 74.6257 131.519 94.4612 137.213V163.269C94.4612 163.269 105.3 184.969 103.621 200.094C103.621 200.094 101.665 218.808 87.3876 202.868H87.3713Z" fill="#F8CCC7"/><path d="M94.4605 163.269C94.4605 163.269 105.299 184.969 103.62 200.094C103.62 200.094 101.665 218.808 87.3869 202.868C87.3869 202.868 71.6097 182.701 66.9157 157.493C66.3127 154.247 66.2638 150.902 67.0461 147.704C68.7575 140.705 74.6413 131.519 94.4768 137.213" stroke="#F2B1AC" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/><path d="M217.398 119.43H224.081" stroke="white" stroke-miterlimit="10" stroke-linecap="round"/><path d="M222.668 117.195L224.64 119.398L222.391 121.65" stroke="white" stroke-linecap="round" stroke-linejoin="round"/><mask id="mask0_10140_795428" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="120" y="75" width="108" height="135"><path d="M174.096 209.362C203.558 209.362 227.441 179.485 227.441 142.63C227.441 105.775 203.558 75.8984 174.096 75.8984C144.634 75.8984 120.75 105.775 120.75 142.63C120.75 179.485 144.634 209.362 174.096 209.362Z" fill="white"/></mask><g mask="url(#mask0_10140_795428)"><path d="M206.662 179.129C206.662 179.129 274.058 185.362 233.946 232.498H126.864C126.864 232.498 89.5074 199.263 139.381 179.129H206.679H206.662Z" fill="#25608A"/><path d="M156.591 185.804L149.859 249.011L197.875 246.172L189.726 175.312H157.275L156.591 185.804Z" fill="#F8CCC7"/><path d="M128.234 137.375C128.234 137.375 116.075 137.897 117.297 150.264C117.297 150.264 118.943 158.227 133.27 159.401L128.217 137.375H128.234Z" fill="#F8CCC7"/><path d="M126.21 130.867L134.229 165.897C134.229 165.897 138.532 187.972 171.553 189.588C204.59 191.203 209.92 171.085 209.92 171.085L223.562 119.691C223.562 119.691 226.398 79.7823 178.415 75.9807C178.415 75.9807 116.854 71.5591 126.21 130.867Z" fill="#F8CCC7"/><path d="M207.705 208.105L171.326 230.393L147.562 209.737" stroke="#231815" stroke-linecap="round" stroke-linejoin="round"/><path d="M216.927 135.402C216.927 135.402 229.086 135.924 227.863 148.292C227.863 148.292 226.217 156.254 211.891 157.429L216.943 135.402H216.927Z" fill="#F8CCC7"/><path d="M192.27 146.123C194.727 146.123 196.719 144.129 196.719 141.669C196.719 139.209 194.727 137.215 192.27 137.215C189.812 137.215 187.82 139.209 187.82 141.669C187.82 144.129 189.812 146.123 192.27 146.123Z" fill="#231815"/><path d="M159.848 146.123C162.305 146.123 164.298 144.129 164.298 141.669C164.298 139.209 162.305 137.215 159.848 137.215C157.391 137.215 155.398 139.209 155.398 141.669C155.398 144.129 157.391 146.123 159.848 146.123Z" fill="#231815"/><path d="M176.07 143.887V157.755" stroke="#231815" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M171.75 168.492C171.75 168.492 175.01 170.499 180.388 168.492" stroke="#231815" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M156.459 186.992C156.459 186.992 167.607 194.449 191.126 187.661L192.088 195.835C192.088 195.835 178.136 204.695 155.562 195.427L156.459 186.992Z" fill="#272828"/><path d="M191.275 132.76L202.163 131.993L200.989 111.549L213.621 136.447H223.596C223.596 136.447 247.424 79.1627 202.098 80.3537C202.098 80.3537 164.627 46.319 125.233 86.6353C125.233 86.6353 101.176 117.586 126.195 139.743L138.011 138.585L141.255 112.545L191.275 132.76Z" fill="#272828"/></g><path d="M174.096 209.362C203.558 209.362 227.441 179.485 227.441 142.63C227.441 105.775 203.558 75.8984 174.096 75.8984C144.634 75.8984 120.75 105.775 120.75 142.63C120.75 179.485 144.634 209.362 174.096 209.362Z" stroke="#00C1B6" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M174.1 195.685C198.128 195.685 217.607 171.427 217.607 141.504C217.607 111.582 198.128 87.3242 174.1 87.3242C150.072 87.3242 130.594 111.582 130.594 141.504C130.594 171.427 150.072 195.685 174.1 195.685Z" stroke="#00C1B6" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="5 5"/></svg>';
69
70
  const DEFAULT_ICON_URI = 'data:image/png;base64,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';
70
71
 
71
72
  const defaultIdentityVerificationConfig = {
@@ -96,7 +97,9 @@ const defaultLivenessConfig = {
96
97
  headerMode: 1,
97
98
  showCloseButton: true,
98
99
  subtitle: null,
99
- uploadFullFrame: false
100
+ uploadFullFrame: false,
101
+ passive: false,
102
+ compareCustomerClientId: null
100
103
  };
101
104
  const defaultIdRecognitionConfig = {
102
105
  icon: DEFAULT_ICON_URI,
@@ -115,7 +118,8 @@ const defaultIdRecognitionConfig = {
115
118
  uploadFullFrame: true,
116
119
  disablePassportConfirm: false,
117
120
  antiFraudIMetalTagValidCountTh: false,
118
- cardTypes: []
121
+ cardTypes: [],
122
+ cardTypeConfigs: []
119
123
  };
120
124
 
121
125
  function setCorrectViewHeight() {
@@ -7074,9 +7078,11 @@ const card_ud = () => ({
7074
7078
  markers: []
7075
7079
  });
7076
7080
 
7077
- const success = () => {
7078
- const authmeScannerSuccess = getCssVariable('--authme__upload_success', 'authme-container');
7081
+ const success = params => {
7082
+ var _a;
7083
+ const authmeScannerSuccess = (_a = params === null || params === void 0 ? void 0 : params.color) !== null && _a !== void 0 ? _a : getCssVariable('--authme__upload_success', 'authme-container');
7079
7084
  const lottieColor = authmeScannerSuccess ? RGBToLottieColor(colorToRGB(authmeScannerSuccess)) : [];
7085
+ const opacity = (params === null || params === void 0 ? void 0 : params.opacity) ? params.opacity * 100 : 100;
7080
7086
  return {
7081
7087
  v: '5.7.4',
7082
7088
  fr: 29.9700012207031,
@@ -7816,7 +7822,7 @@ const success = () => {
7816
7822
  ks: {
7817
7823
  o: {
7818
7824
  a: 0,
7819
- k: 100,
7825
+ k: opacity,
7820
7826
  ix: 11
7821
7827
  },
7822
7828
  r: {
@@ -8619,11 +8625,16 @@ const arrow_down = () => {
8619
8625
  };
8620
8626
  };
8621
8627
 
8622
- const scan = () => {
8623
- const authmeScannning = getCssVariable('--authme__scanning', 'authme-container');
8628
+ const scan = params => {
8629
+ var _a, _b;
8630
+ const authmeScannning = (_a = params === null || params === void 0 ? void 0 : params.color) !== null && _a !== void 0 ? _a : getCssVariable('--authme__scanning', 'authme-container');
8631
+ const authmeScannningGradient = (_b = params === null || params === void 0 ? void 0 : params.gradient) !== null && _b !== void 0 ? _b : getCssVariable('--authme__scanning', 'authme-container');
8624
8632
  const lottieColor = authmeScannning ? RGBToLottieColor(colorToRGB(authmeScannning)) : [];
8625
8633
  const [r, g, b] = lottieColor.map(c => parseFloat(c.toFixed(3)));
8626
- const lottieGradient = [0, r, g, b, 0.5, r, g, b, 1, r, g, b, 0, 0.03, 0.5, 0.515, 1, 1];
8634
+ const lottieColorGradient = authmeScannningGradient ? RGBToLottieColor(colorToRGB(authmeScannningGradient)) : [];
8635
+ const [rGradient, gGradient, bGradient] = lottieColorGradient.map(c => parseFloat(c.toFixed(3)));
8636
+ const opacity = (params === null || params === void 0 ? void 0 : params.opacity) ? params.opacity * 100 : 40;
8637
+ const lottieGradient = [0, rGradient, gGradient, bGradient, 0.5, r, g, b, 1, r, g, b, 0, 0.03, 0.5, 0.515, 1, 1];
8627
8638
  return {
8628
8639
  v: '5.9.2',
8629
8640
  fr: 29.9700012207031,
@@ -8646,7 +8657,7 @@ const scan = () => {
8646
8657
  ks: {
8647
8658
  o: {
8648
8659
  a: 0,
8649
- k: 100,
8660
+ k: opacity,
8650
8661
  ix: 11
8651
8662
  },
8652
8663
  r: {
@@ -8804,7 +8815,7 @@ const scan = () => {
8804
8815
  ks: {
8805
8816
  o: {
8806
8817
  a: 0,
8807
- k: 100,
8818
+ k: opacity,
8808
8819
  ix: 11
8809
8820
  },
8810
8821
  r: {
@@ -23497,8 +23508,8 @@ const renderLivenessUI = config => {
23497
23508
  config.videoContainer.appendChild(titleTextPanel);
23498
23509
  config.videoContainer.appendChild(statusTextPanel);
23499
23510
  // Set init text
23500
- titleText.textContent = translateService.translate('liveness.title');
23501
- statusText.textContent = translateService.translate('liveness.error.noFace');
23511
+ titleText.textContent = translateService.translate('sdk.liveness.detection.step');
23512
+ statusText.textContent = translateService.translate('sdk.general.verify.error.noFace');
23502
23513
  setStatusTextTop({
23503
23514
  maskHeight,
23504
23515
  statusTextPanel,
@@ -23578,17 +23589,15 @@ const renderLivenessGuideUI = ({
23578
23589
  ele.classList.add('liveness-guide-header-title');
23579
23590
  const title = document.createElement('div');
23580
23591
  title.classList.add('liveness-guide-header-title-text');
23581
- title.textContent = translateService.translate('liveness.guide.title');
23592
+ title.textContent = translateService.translate('sdk.liveness.detection.title');
23582
23593
  ele.appendChild(title);
23583
23594
  return ele;
23584
23595
  };
23585
23596
  const createLivenessGuideImg = () => {
23586
23597
  const ele = document.createElement('div');
23587
23598
  ele.classList.add('liveness-guide-img-container');
23588
- const img = document.createElement('img');
23589
- img.classList.add('liveness-guid-img');
23590
- img.src = LIVENESS_GUIDE_IMG;
23591
- ele.appendChild(img);
23599
+ const svg = LIVENESS_GUIDE_IMG;
23600
+ ele.innerHTML = svg;
23592
23601
  return ele;
23593
23602
  };
23594
23603
  const createLivenessHintGroup = () => {
@@ -23598,11 +23607,12 @@ const renderLivenessGuideUI = ({
23598
23607
  };
23599
23608
  const createLivenessHints = () => {
23600
23609
  const ul = document.createElement('ul');
23601
- for (const key of ['hint1', 'hint2', 'hint3']) {
23610
+ const descList = ['sdk.liveness.detection.infopageHint.face', 'sdk.liveness.detection.infopageHint.environment'];
23611
+ descList.forEach(desc => {
23602
23612
  const li = document.createElement('li');
23603
- li.textContent = translateService.translate(`liveness.${key}`);
23613
+ li.textContent = translateService.translate(desc);
23604
23614
  ul.appendChild(li);
23605
- }
23615
+ });
23606
23616
  return ul;
23607
23617
  };
23608
23618
  const createContinueButtonDivide = () => {
@@ -23613,7 +23623,7 @@ const renderLivenessGuideUI = ({
23613
23623
  const createContinueButton = () => {
23614
23624
  const ele = document.createElement('div');
23615
23625
  ele.classList.add('liveness-guid-continue-btn');
23616
- ele.textContent = translateService.translate('liveness.continue');
23626
+ ele.textContent = translateService.translate('sdk.general.start');
23617
23627
  return ele;
23618
23628
  };
23619
23629
  const background = createLivenessBackground();
@@ -23686,7 +23696,7 @@ const sendFrame = (canvasSizeInfo, canvas, video, frameCallback, fps, bas64Forma
23686
23696
  })), tap(() => received = true))))));
23687
23697
  };
23688
23698
 
23689
- const translateService = getTranslateInstance();
23699
+ const translateService$1 = getTranslateInstance();
23690
23700
  var RESIZE_STYLE;
23691
23701
  (function (RESIZE_STYLE) {
23692
23702
  RESIZE_STYLE[RESIZE_STYLE["RESIZE_WIDTH_LIMIT"] = 320] = "RESIZE_WIDTH_LIMIT";
@@ -23701,15 +23711,35 @@ var RESIZE_EVENT;
23701
23711
  function detectScreenResize$() {
23702
23712
  const initWidth = window.outerWidth;
23703
23713
  const initHeight = window.outerHeight;
23704
- const resize$ = merge(fromEvent(window, 'resize'), of(0)).pipe(map(() => {
23705
- if (window.innerWidth < RESIZE_STYLE.RESIZE_WIDTH_LIMIT || window.innerHeight < RESIZE_STYLE.RESIZE_HEIGHT_LIMIT) {
23706
- return RESIZE_EVENT.SCREEN_RESOLUTION_TOO_LOW;
23714
+ let resize$;
23715
+ if (isMobile()) {
23716
+ if (!window.visualViewport) {
23717
+ return of(RESIZE_EVENT.PASS);
23707
23718
  }
23708
- if (window.outerWidth !== initWidth || window.outerHeight !== initHeight) {
23709
- return RESIZE_EVENT.SCREEN_SIZE_CHANGED;
23710
- }
23711
- return RESIZE_EVENT.PASS;
23712
- }));
23719
+ resize$ = merge(fromEvent(window.visualViewport, 'resize'), of(0)).pipe(map(() => {
23720
+ var _a, _b, _c;
23721
+ const scale = ((_a = window === null || window === void 0 ? void 0 : window.visualViewport) === null || _a === void 0 ? void 0 : _a.scale) || 1;
23722
+ const width = ((_b = window === null || window === void 0 ? void 0 : window.visualViewport) === null || _b === void 0 ? void 0 : _b.width) || window.outerWidth;
23723
+ const height = ((_c = window === null || window === void 0 ? void 0 : window.visualViewport) === null || _c === void 0 ? void 0 : _c.height) || window.outerHeight;
23724
+ if (width < RESIZE_STYLE.RESIZE_WIDTH_LIMIT || height < RESIZE_STYLE.RESIZE_HEIGHT_LIMIT) {
23725
+ return RESIZE_EVENT.SCREEN_RESOLUTION_TOO_LOW;
23726
+ }
23727
+ if (scale > 1.1) {
23728
+ return RESIZE_EVENT.SCREEN_SIZE_CHANGED;
23729
+ }
23730
+ return RESIZE_EVENT.PASS;
23731
+ }));
23732
+ } else {
23733
+ resize$ = merge(fromEvent(window, 'resize'), of(0)).pipe(map(() => {
23734
+ if (window.innerWidth < RESIZE_STYLE.RESIZE_WIDTH_LIMIT || window.innerHeight < RESIZE_STYLE.RESIZE_HEIGHT_LIMIT) {
23735
+ return RESIZE_EVENT.SCREEN_RESOLUTION_TOO_LOW;
23736
+ }
23737
+ if (window.outerWidth !== initWidth || window.outerHeight !== initHeight) {
23738
+ return RESIZE_EVENT.SCREEN_SIZE_CHANGED;
23739
+ }
23740
+ return RESIZE_EVENT.PASS;
23741
+ }));
23742
+ }
23713
23743
  return resize$;
23714
23744
  }
23715
23745
  function handleScreenResizeError$(resize$, unsubscribe$, shouldResizeTriggerError) {
@@ -23717,10 +23747,10 @@ function handleScreenResizeError$(resize$, unsubscribe$, shouldResizeTriggerErro
23717
23747
  hidePopup();
23718
23748
  switch (x) {
23719
23749
  case RESIZE_EVENT.SCREEN_SIZE_CHANGED:
23720
- showPopup(translateService.translate('error.screenSizeChange.title'), translateService.translate('error.screenSizeChange.content'), false);
23750
+ showPopup(translateService$1.translate('sdk.general.error.screenSizeChange.title'), translateService$1.translate('sdk.general.error.screenSizeChange.content'), false);
23721
23751
  break;
23722
23752
  case RESIZE_EVENT.SCREEN_RESOLUTION_TOO_LOW:
23723
- showPopup(translateService.translate('error.screenSize.title'), translateService.translate('error.screenSize.content'), false);
23753
+ showPopup(translateService$1.translate('sdk.general.insufficientScreen.title'), translateService$1.translate('sdk.general.insufficientScreen.content'), false);
23724
23754
  break;
23725
23755
  }
23726
23756
  }), map(x => __awaiter(this, void 0, void 0, function* () {
@@ -23805,19 +23835,19 @@ function startLiveness(config) {
23805
23835
  let errorMessage = undefined;
23806
23836
  switch ((_f = (_e = (_d = error.cause) === null || _d === void 0 ? void 0 : _d.meta) === null || _e === void 0 ? void 0 : _e.responseContent) === null || _f === void 0 ? void 0 : _f.message) {
23807
23837
  case INIT_RESPONSE_ERROR_MESSAGE__LivenessInavailable:
23808
- errorMessage = 'eventName.invalid.functionNotEnabled';
23838
+ errorMessage = 'sdk.general.error.functionNotEnabled';
23809
23839
  throwError = new AuthmeError(ErrorCode.EVENT_NAME_WRONG, INIT_RESPONSE_ERROR_MESSAGE__LivenessInavailable);
23810
23840
  break;
23811
23841
  case INIT_RESPONSE_ERROR_MESSAGE__NotAllowedNewEvent:
23812
- errorMessage = 'eventName.invalid.notAllowedNewEvent';
23842
+ errorMessage = 'sdk.general.error.notAllowedNewEvent';
23813
23843
  throwError = new AuthmeError(ErrorCode.EVENT_NAME_WRONG, INIT_RESPONSE_ERROR_MESSAGE__NotAllowedNewEvent);
23814
23844
  break;
23815
23845
  }
23816
23846
  if (errorMessage) {
23817
- yield asyncOnLineShowErrorMessage(translateService.translate(errorMessage), false);
23847
+ yield asyncOnLineShowErrorMessage(translateService.translate(errorMessage), translateService.translate('sdk.general.error.retry'), false);
23818
23848
  } else {
23819
- const defaultErrorMessage = `${translateService.translate('eventName.invalid.promptTitle')} : ${translateService.translate('eventName.invalid.promptText')}`;
23820
- yield asyncOnLineShowErrorMessage(defaultErrorMessage, false);
23849
+ const defaultErrorMessage = `${translateService.translate('sdk.general.error.eventNameInvalid.title')} : ${translateService.translate('sdk.general.error.eventNameInvalid.content')}`;
23850
+ yield asyncOnLineShowErrorMessage(defaultErrorMessage, translateService.translate('sdk.general.error.retry'), false);
23821
23851
  }
23822
23852
  yield waitTime(SHOW_ERROR_MESSAGE_INTERVAL);
23823
23853
  throw throwError;
@@ -23829,19 +23859,19 @@ function startLiveness(config) {
23829
23859
  sendStatusDescription$2(fasRecognitionResultMapping(result.eStatus));
23830
23860
  switch (result.eStatus) {
23831
23861
  case FasRecognitionResult.NoFace:
23832
- statusText.textContent = translateService.translate('liveness.error.noFace');
23862
+ statusText.textContent = translateService.translate('sdk.general.verify.error.noFace');
23833
23863
  setBorderStatus('error');
23834
23864
  break;
23835
23865
  case FasRecognitionResult.FaceNotAtCenter:
23836
- statusText.textContent = translateService.translate('liveness.error.faceNotAtCenter');
23866
+ statusText.textContent = translateService.translate('sdk.general.verify.error.faceNotAtCenter');
23837
23867
  setBorderStatus('error');
23838
23868
  break;
23839
23869
  case FasRecognitionResult.FaceTooSmall:
23840
- statusText.textContent = translateService.translate('liveness.error.faceTooSmall');
23870
+ statusText.textContent = translateService.translate('sdk.general.verify.error.getCloser');
23841
23871
  setBorderStatus('error');
23842
23872
  break;
23843
23873
  case FasRecognitionResult.FaceTooLarge:
23844
- statusText.textContent = translateService.translate('liveness.error.faceTooLarge');
23874
+ statusText.textContent = translateService.translate('sdk.general.verify.error.faceTooLarge');
23845
23875
  if (result.eStage === EAuthMeFASServiceStage.Scale) {
23846
23876
  setBorderStatus(null);
23847
23877
  setFrameScaleSmall();
@@ -23850,31 +23880,31 @@ function startLiveness(config) {
23850
23880
  }
23851
23881
  break;
23852
23882
  case FasRecognitionResult.NeedFaceToCamera:
23853
- statusText.textContent = translateService.translate('liveness.error.needFaceToCamera');
23883
+ statusText.textContent = translateService.translate('sdk.general.verify.error.needFaceToCamera');
23854
23884
  setBorderStatus('error');
23855
23885
  break;
23856
23886
  case FasRecognitionResult.FaceMasked:
23857
- statusText.textContent = translateService.translate('liveness.error.faceMasked');
23887
+ statusText.textContent = translateService.translate('sdk.general.verify.error.noShelter');
23858
23888
  setBorderStatus('error');
23859
23889
  break;
23860
23890
  case FasRecognitionResult.NeedOpenMouth:
23861
- statusText.textContent = translateService.translate('liveness.error.needOpenMouth');
23891
+ statusText.textContent = translateService.translate('sdk.general.verify.error.needOpenMouth');
23862
23892
  setBorderStatus(null);
23863
23893
  break;
23864
23894
  case FasRecognitionResult.NeedCloseMouth:
23865
- statusText.textContent = translateService.translate('liveness.error.needCloseMouth');
23895
+ statusText.textContent = translateService.translate('sdk.general.verify.error.needCloseMouth');
23866
23896
  setBorderStatus(null);
23867
23897
  break;
23868
23898
  case FasRecognitionResult.NeedSmile:
23869
- statusText.textContent = translateService.translate('liveness.error.needSmile');
23899
+ statusText.textContent = translateService.translate('sdk.general.verify.error.needSmile');
23870
23900
  setBorderStatus(null);
23871
23901
  break;
23872
23902
  case FasRecognitionResult.NeedOpenEyes:
23873
- statusText.textContent = translateService.translate('liveness.error.needOpenEyes');
23903
+ statusText.textContent = translateService.translate('sdk.general.verify.error.needOpenEyes');
23874
23904
  setBorderStatus('error');
23875
23905
  break;
23876
23906
  case FasRecognitionResult.NeedMoreFrame:
23877
- statusText.textContent = translateService.translate('liveness.needMoreFrame');
23907
+ statusText.textContent = translateService.translate('sdk.general.verify.success');
23878
23908
  setBorderStatus('pass');
23879
23909
  break;
23880
23910
  case FasRecognitionResult.Pass:
@@ -23886,13 +23916,13 @@ function startLiveness(config) {
23886
23916
  }
23887
23917
  break;
23888
23918
  case FasRecognitionResult.Error:
23889
- statusText.textContent = translateService.translate('verify.error.serverError');
23890
- showErrorMessage(translateService.translate('verify.error.serverError'), true);
23919
+ statusText.textContent = translateService.translate('sdk.general.error.alert.serverError');
23920
+ showErrorMessage(translateService.translate('sdk.general.error.alert.serverError'), true);
23891
23921
  break;
23892
23922
  }
23893
23923
  };
23894
23924
  // Register Event
23895
- fromEvent(window, 'offline').pipe(switchMap(() => asyncOnLineShowErrorMessage(translateService.translate('network.error.offline'), true)), takeUntil(unsubscribe$)).subscribe();
23925
+ fromEvent(window, 'offline').pipe(switchMap(() => asyncOnLineShowErrorMessage(translateService.translate('sdk.general.error.alert.offline'), translateService.translate('sdk.general.error.retry'), true)), takeUntil(unsubscribe$)).subscribe();
23896
23926
  fromEvent(window, 'resize').pipe(throttleTime(100), switchMap(() => getCanvasSize(video)), tap(canvasSizeInfo => {
23897
23927
  config.setFrameSize(canvasSizeInfo.canvasWidth, canvasSizeInfo.canvasHeight);
23898
23928
  const maskHeight = window.outerHeight * 0.48;
@@ -23910,8 +23940,8 @@ function startLiveness(config) {
23910
23940
  showCloseButton: config.livenessConfig.showCloseButton
23911
23941
  }));
23912
23942
  const step2 = of({}).pipe(tap(() => {
23913
- startSpinner(translateService.translate('general.loading'), true);
23914
- headerTitle.textContent = translateService.translate('liveness.header.liveness');
23943
+ startSpinner(translateService.translate('sdk.general.loading'), true);
23944
+ headerTitle.textContent = translateService.translate('sdk.liveness.detection.header');
23915
23945
  if (config.livenessConfig.subtitle) {
23916
23946
  headerSubtitle.textContent = translateService.translate(config.livenessConfig.subtitle);
23917
23947
  }
@@ -23989,7 +24019,7 @@ function startLiveness(config) {
23989
24019
  // : of(resp).pipe(
23990
24020
  // tap(() =>
23991
24021
  // showErrorMessage(
23992
- // translateService.translate('verify.error.timeout')
24022
+ // translateService.translate('sdk.general.error.timeout.content')
23993
24023
  // )
23994
24024
  // ),
23995
24025
  // switchMap(() => waitTime(2000)),
@@ -23997,9 +24027,9 @@ function startLiveness(config) {
23997
24027
  // map(() => resp)
23998
24028
  // )
23999
24029
  // ),
24000
- switchMap(resp => window.navigator.onLine ? of(resp) : from(asyncOnLineShowErrorMessage(translateService.translate('network.error.offline'), true)).pipe(map(() => resp))), tap(() => {
24030
+ switchMap(resp => window.navigator.onLine ? of(resp) : from(asyncOnLineShowErrorMessage(translateService.translate('sdk.general.error.alert.offline'), translateService.translate('sdk.general.error.retry'), true)).pipe(map(() => resp))), tap(() => {
24001
24031
  sendStatusDescription$2(StatusDescription.UploadingStart);
24002
- startSpinner(translateService.translate('liveness.uploading'), true);
24032
+ startSpinner(translateService.translate('sdk.general.uploading'), true);
24003
24033
  }), switchMap(() => defer(() => config.onSuccess())))));
24004
24034
  return of({}).pipe(() => {
24005
24035
  var _a;
@@ -24179,24 +24209,51 @@ var OcrRotateAnimationName;
24179
24209
  OcrRotateAnimationName["Bottom"] = "slideinBottom";
24180
24210
  OcrRotateAnimationName["BottomToDefault"] = "slideinBottomToDefault";
24181
24211
  })(OcrRotateAnimationName || (OcrRotateAnimationName = {}));
24182
- const initAnimation = params => {
24212
+ var OcrFrame;
24213
+ (function (OcrFrame) {
24214
+ OcrFrame["borderType"] = "cornered";
24215
+ OcrFrame["borderColor"] = "#FFF";
24216
+ OcrFrame[OcrFrame["borderOpacity"] = 1] = "borderOpacity";
24217
+ OcrFrame["lineColor"] = "#00C1B6";
24218
+ OcrFrame["lineGradient"] = "#7CFFF9";
24219
+ OcrFrame[OcrFrame["lineGradientOpacity"] = 0.5] = "lineGradientOpacity";
24220
+ OcrFrame["successColor"] = "#7CFFF9";
24221
+ OcrFrame[OcrFrame["successOpacity"] = 1] = "successOpacity";
24222
+ OcrFrame["textColor"] = "#FFF";
24223
+ OcrFrame[OcrFrame["textOpacity"] = 0.7] = "textOpacity";
24224
+ OcrFrame["imageColor"] = "#FFF";
24225
+ OcrFrame[OcrFrame["imageOpacity"] = 0.4] = "imageOpacity";
24226
+ })(OcrFrame || (OcrFrame = {}));
24227
+ const initScanAnimation = params => {
24228
+ var _a, _b, _c;
24229
+ lottie.destroy('scan');
24183
24230
  lottie.loadAnimation({
24184
24231
  container: params.scanAnimationContainer,
24185
24232
  renderer: 'svg',
24186
24233
  loop: true,
24187
24234
  autoplay: true,
24188
24235
  name: 'scan',
24189
- animationData: scan()
24236
+ animationData: scan({
24237
+ color: (_a = params.scanColor) !== null && _a !== void 0 ? _a : OcrFrame.lineColor,
24238
+ gradient: (_b = params.scanGradient) !== null && _b !== void 0 ? _b : OcrFrame.lineGradient,
24239
+ opacity: (_c = params.scanOpacity) !== null && _c !== void 0 ? _c : OcrFrame.lineGradientOpacity
24240
+ })
24190
24241
  });
24242
+ lottie.stop('scan');
24243
+ };
24244
+ const initSuccessAnimation = params => {
24245
+ lottie.destroy('success');
24191
24246
  lottie.loadAnimation({
24192
- container: params.successAnimationContainer,
24247
+ container: params.animationContainer,
24193
24248
  renderer: 'svg',
24194
24249
  loop: false,
24195
24250
  autoplay: true,
24196
24251
  name: 'success',
24197
- animationData: success()
24252
+ animationData: success({
24253
+ color: '#7CFFF9',
24254
+ opacity: 1
24255
+ })
24198
24256
  });
24199
- lottie.stop('scan');
24200
24257
  lottie.stop('success');
24201
24258
  };
24202
24259
  const renderCameraSwitch = config => {
@@ -24244,14 +24301,17 @@ const renderOCRUI = config => {
24244
24301
  //Statement
24245
24302
  const statementContainer = document.createElement('div');
24246
24303
  statementContainer.classList.add('statement');
24247
- statementContainer.textContent = translateService.translate('verify.menu.footer.content');
24304
+ statementContainer.textContent = translateService.translate('sdk.general.footer');
24248
24305
  // Animation
24249
24306
  const scanAnimationContainer = document.createElement('div');
24250
24307
  scanAnimationContainer.classList.add('scan');
24251
24308
  const successAnimationContainer = document.createElement('div');
24252
- successAnimationContainer.classList.add('success');
24309
+ successAnimationContainer.classList.add('success_container');
24310
+ const successAnimationDom = document.createElement('div');
24311
+ successAnimationDom.classList.add('success');
24253
24312
  const arrowAnimationContainer = document.createElement('div');
24254
- arrowAnimationContainer.classList.add('arrow');
24313
+ arrowAnimationContainer.classList.add('arrow_container');
24314
+ successAnimationContainer.appendChild(successAnimationDom);
24255
24315
  config.videoContainer.appendChild(titleTextPanel);
24256
24316
  if (config.showStatement) {
24257
24317
  config.videoContainer.appendChild(statementContainer);
@@ -24267,14 +24327,14 @@ const renderOCRUI = config => {
24267
24327
  antiFraudInstructionContainer.classList.add('anti-fraud-instruction-container');
24268
24328
  const instructionText = document.createElement('div');
24269
24329
  instructionText.classList.add('anti-fraud-instruction-container__text');
24270
- instructionText.textContent = translateService.translate('verify.fraudDescribe');
24330
+ instructionText.textContent = translateService.translate('sdk.guard.verify.guide.fraudDescribe');
24271
24331
  const antiFraudInstructionAnimationContainer = document.createElement('div');
24272
24332
  antiFraudInstructionAnimationContainer.classList.add('anti-fraud-instruction-animation-container');
24273
24333
  const btnContainer = document.createElement('div');
24274
24334
  btnContainer.classList.add('btn-container');
24275
24335
  const confirmBtn = document.createElement('button');
24276
24336
  confirmBtn.classList.add('confirm-btn');
24277
- confirmBtn.textContent = translateService.translate('verify.startVerifyBtn.loading');
24337
+ confirmBtn.textContent = translateService.translate('sdk.general.preparing');
24278
24338
  confirmBtn.disabled = true;
24279
24339
  btnContainer.appendChild(confirmBtn);
24280
24340
  antiFraudInstructionContainer.appendChild(instructionText);
@@ -24287,7 +24347,7 @@ const renderOCRUI = config => {
24287
24347
  confirmImageContainer.classList.add('confirm-image-container');
24288
24348
  const imageTypeText = document.createElement('div');
24289
24349
  imageTypeText.classList.add('image-type-text');
24290
- imageTypeText.textContent = translateService.translate('verify.frontSide');
24350
+ imageTypeText.textContent = translateService.translate('sdk.general.frontSide');
24291
24351
  const imageLine = document.createElement('div');
24292
24352
  imageLine.classList.add('image-line');
24293
24353
  const imageLineLineDesktop = document.createElement('div');
@@ -24300,10 +24360,10 @@ const renderOCRUI = config => {
24300
24360
  imageFooter.classList.add('image-footer');
24301
24361
  const retryBtn = document.createElement('button');
24302
24362
  retryBtn.classList.add('btn-retry');
24303
- retryBtn.textContent = translateService.translate('verify.retryBtn');
24363
+ retryBtn.textContent = translateService.translate('sdk.ocr.verify.retry');
24304
24364
  const completeBtn = document.createElement('button');
24305
24365
  completeBtn.classList.add('btn-complete');
24306
- completeBtn.textContent = translateService.translate('verify.clearBtn');
24366
+ completeBtn.textContent = translateService.translate('sdk.ocr.verify.clear');
24307
24367
  imageFooter.appendChild(completeBtn);
24308
24368
  imageFooter.appendChild(retryBtn);
24309
24369
  confirmImageContainer.appendChild(imageTypeText);
@@ -24312,10 +24372,6 @@ const renderOCRUI = config => {
24312
24372
  confirmImageContainer.appendChild(imageLineLineDesktop);
24313
24373
  confirmImageContainer.appendChild(imageFooter);
24314
24374
  config.container.appendChild(confirmImageContainer);
24315
- initAnimation({
24316
- scanAnimationContainer,
24317
- successAnimationContainer
24318
- });
24319
24375
  return {
24320
24376
  antiFraudInstructionContainer,
24321
24377
  titleTextPanel,
@@ -24326,6 +24382,7 @@ const renderOCRUI = config => {
24326
24382
  lottieMask,
24327
24383
  arrowAnimationContainer,
24328
24384
  successAnimationContainer,
24385
+ successAnimationDom,
24329
24386
  scanAnimationContainer,
24330
24387
  antiFraudInstructionAnimationContainer,
24331
24388
  confirmImageContainer,
@@ -24366,19 +24423,23 @@ function renderConfirmUI({
24366
24423
  const keyMapping = {
24367
24424
  [IdRecognitionCardType.IDCard]: 'idCard',
24368
24425
  [IdRecognitionCardType.DriverLicense]: 'driverLicense',
24369
- [IdRecognitionCardType.HealthCard]: 'healthCard',
24426
+ [IdRecognitionCardType.HealthCard]: 'HealthCard',
24370
24427
  [IdRecognitionCardType.ResidentCard]: 'residentCard',
24371
24428
  [IdRecognitionCardType.Passport]: 'passport'
24372
24429
  };
24373
24430
  elem.classList.add('data-type');
24374
- elem.textContent = translate(cardType ? `confirm.${keyMapping[cardType]}` : '');
24431
+ elem.textContent = translate(cardType ? `sdk.ocr.verify.result.title.${keyMapping[cardType]}` : '');
24375
24432
  }), _render('div', elem => {
24376
24433
  elem.classList.add('data');
24377
24434
  }, items.columns.map(column => _render('div', elem => {
24378
24435
  elem.classList.add('data-column');
24379
24436
  }, [_render('div', elem => {
24380
24437
  elem.classList.add('title');
24381
- elem.textContent = translate('confirm.' + column);
24438
+ if (column === 'issueReason') {
24439
+ elem.textContent = translate('sdk.ocr.verify.result.issueType');
24440
+ } else {
24441
+ elem.textContent = translate('sdk.ocr.verify.result.' + column);
24442
+ }
24382
24443
  }), column === 'address' ? _render('textarea', elem => {
24383
24444
  var _a;
24384
24445
  elem.name = column;
@@ -24386,7 +24447,7 @@ function renderConfirmUI({
24386
24447
  elem.classList.add('content');
24387
24448
  elem.classList.add('textarea');
24388
24449
  elem.textContent = (_a = items.details[column]) !== null && _a !== void 0 ? _a : '';
24389
- elem.placeholder = translate('home.input.placeHolder');
24450
+ elem.placeholder = translate('sdk.ocr.verify.result.placeHolder');
24390
24451
  }) : _render('input', elem => {
24391
24452
  var _a;
24392
24453
  elem.value;
@@ -24394,7 +24455,7 @@ function renderConfirmUI({
24394
24455
  elem.type = 'text';
24395
24456
  elem.classList.add('content');
24396
24457
  elem.value = (_a = items.details[column]) !== null && _a !== void 0 ? _a : '';
24397
- elem.placeholder = translate('home.input.placeHolder');
24458
+ elem.placeholder = translate('sdk.ocr.verify.result.placeHolder');
24398
24459
  })]))), _render('div', elem => {
24399
24460
  elem.classList.add('d-flex');
24400
24461
  elem.classList.add('justify-content-center');
@@ -24404,7 +24465,7 @@ function renderConfirmUI({
24404
24465
  elem.classList.add('btn-success');
24405
24466
  elem.classList.add('text-light');
24406
24467
  elem.classList.add('confirm-btn');
24407
- elem.textContent = translate('confirm.confirmBtn');
24468
+ elem.textContent = translate('sdk.general.accept');
24408
24469
  })])])]);
24409
24470
  document.body.appendChild(confirmContainerElem);
24410
24471
  return new Promise((resolve, reject) => {
@@ -24468,15 +24529,23 @@ function mirrorPoints(points) {
24468
24529
  }));
24469
24530
  }
24470
24531
  const renderOCRMask = params => {
24532
+ let newCardPoints;
24533
+ let borderColor = '';
24534
+ let borderOpacity = OcrFrame.borderOpacity;
24535
+ let borderColorSuccess = '';
24536
+ let borderOpacitySuccess = OcrFrame.successOpacity;
24471
24537
  const {
24472
24538
  cardPoints,
24473
- container,
24474
- cardFrameColor
24539
+ container
24475
24540
  } = params;
24476
24541
  const _cardPoints = params.mirrored ? mirrorPoints(cardPoints) : cardPoints;
24542
+ const windowWidth = container.offsetWidth;
24543
+ const windowHeight = container.offsetHeight;
24544
+ const radius = 10;
24545
+ let borderType = OcrFrame.borderType;
24477
24546
  // 創建SVG元素
24478
24547
  const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
24479
- svg.setAttribute('id', 'authme-mask-svg');
24548
+ svg.setAttribute('id', 'authme_frame_border');
24480
24549
  svg.setAttribute('width', '100%');
24481
24550
  svg.setAttribute('height', '100%');
24482
24551
  svg.style.position = 'absolute';
@@ -24498,10 +24567,78 @@ const renderOCRMask = params => {
24498
24567
  mask.appendChild(path);
24499
24568
  defs.appendChild(mask);
24500
24569
  svg.appendChild(defs);
24570
+ const rectOfFrame = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
24571
+ rectOfFrame.setAttribute('rx', '10');
24572
+ rectOfFrame.setAttribute('ry', '10');
24573
+ rectOfFrame.setAttribute('stroke', OcrFrame.borderColor);
24574
+ rectOfFrame.setAttribute('stroke-width', '3');
24575
+ rectOfFrame.setAttribute('fill', 'none');
24501
24576
  const pathOfFrame = document.createElementNS('http://www.w3.org/2000/svg', 'path');
24502
24577
  pathOfFrame.setAttribute('fill', 'none');
24503
- pathOfFrame.setAttribute('stroke', cardFrameColor !== null && cardFrameColor !== void 0 ? cardFrameColor : '#fff');
24578
+ pathOfFrame.setAttribute('stroke', OcrFrame.borderColor);
24504
24579
  pathOfFrame.setAttribute('stroke-width', '3');
24580
+ const setBorderType = params => {
24581
+ var _a;
24582
+ const _mirrored = (_a = params.mirrored) !== null && _a !== void 0 ? _a : false;
24583
+ borderType = params.type;
24584
+ if (params.color) {
24585
+ borderColor = params.color;
24586
+ }
24587
+ if (params.strokeOpacity !== undefined) {
24588
+ borderOpacity = params.strokeOpacity;
24589
+ }
24590
+ if (params.type === 'bordered') {
24591
+ const rectX = newCardPoints[0].x * windowWidth;
24592
+ const rectY = newCardPoints[0].y * windowHeight;
24593
+ const rectWidth = newCardPoints[1].x * windowWidth - rectX;
24594
+ const rectHeight = newCardPoints[3].y * windowHeight - rectY;
24595
+ pathOfFrame.setAttribute('visibility', 'hidden');
24596
+ rectOfFrame.setAttribute('visibility', 'visible');
24597
+ rectOfFrame.setAttribute('x', rectX.toString());
24598
+ rectOfFrame.setAttribute('y', rectY.toString());
24599
+ rectOfFrame.setAttribute('width', rectWidth.toString());
24600
+ rectOfFrame.setAttribute('height', rectHeight.toString());
24601
+ rectOfFrame.setAttribute('stroke-opacity', borderOpacity.toString());
24602
+ svg.appendChild(rectOfFrame);
24603
+ } else {
24604
+ rectOfFrame.setAttribute('visibility', 'hidden');
24605
+ pathOfFrame.setAttribute('visibility', 'visible');
24606
+ // 掃描框的樣式,四個圓角
24607
+ const dFrame = newCardPoints.reduce((acc, {
24608
+ x,
24609
+ y
24610
+ }, index) => {
24611
+ var _a, _b;
24612
+ const lineRotio = 2;
24613
+ const previosPoint = (_a = newCardPoints[index - 1]) !== null && _a !== void 0 ? _a : newCardPoints[newCardPoints.length - 1];
24614
+ const nextPoint = (_b = newCardPoints[index + 1]) !== null && _b !== void 0 ? _b : newCardPoints[0];
24615
+ const _x1 = windowWidth * previosPoint.x;
24616
+ const _y1 = windowHeight * previosPoint.y;
24617
+ const _x2 = windowWidth * x;
24618
+ const _y2 = windowHeight * y;
24619
+ const _x3 = windowWidth * nextPoint.x;
24620
+ const _y3 = windowHeight * nextPoint.y;
24621
+ const v = new Vector({
24622
+ x: _x1,
24623
+ y: _y1
24624
+ }, {
24625
+ x: _x2,
24626
+ y: _y2
24627
+ });
24628
+ const vNext = new Vector({
24629
+ x: _x2,
24630
+ y: _y2
24631
+ }, {
24632
+ x: _x3,
24633
+ y: _y3
24634
+ });
24635
+ return `${acc} M ${_x2 - lineRotio * radius * v.unitVector.x},${_y2 - lineRotio * radius * v.unitVector.y} L ${_x2 - radius * v.unitVector.x}, ${_y2 - radius * v.unitVector.y} A 10, 10 0 0, ${_mirrored ? '0' : '1'} ${_x2 + radius * vNext.unitVector.x},${_y2 + radius * vNext.unitVector.y} L ${_x2 + lineRotio * radius * vNext.unitVector.x},${_y2 + lineRotio * radius * vNext.unitVector.y} `;
24636
+ }, '');
24637
+ pathOfFrame.setAttribute('d', dFrame);
24638
+ pathOfFrame.setAttribute('stroke-opacity', borderOpacity.toString());
24639
+ svg.appendChild(pathOfFrame);
24640
+ }
24641
+ };
24505
24642
  // 創建帶有遮罩的長方形
24506
24643
  const maskedRect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
24507
24644
  maskedRect.setAttribute('width', '100%');
@@ -24509,12 +24646,10 @@ const renderOCRMask = params => {
24509
24646
  maskedRect.setAttribute('fill', 'rgba(0, 0, 0, 0.65)');
24510
24647
  maskedRect.setAttribute('mask', 'url(#hole)');
24511
24648
  svg.appendChild(maskedRect);
24512
- svg.appendChild(pathOfFrame);
24513
24649
  // 添加SVG到容器
24514
24650
  container.appendChild(svg);
24515
- const radius = 10;
24516
- const setCardPoints = (_newCardPoints, mirrored = false) => {
24517
- const newCardPoints = mirrored ? mirrorPoints(_newCardPoints) : _newCardPoints;
24651
+ const setCardPoints = (_newCardPoints, antiFraud = false, _mirrored = false) => {
24652
+ newCardPoints = _mirrored ? mirrorPoints(_newCardPoints) : _newCardPoints;
24518
24653
  const d = newCardPoints.reduce((acc, {
24519
24654
  x,
24520
24655
  y
@@ -24545,9 +24680,9 @@ const renderOCRMask = params => {
24545
24680
  x: _x3,
24546
24681
  y: _y3
24547
24682
  });
24548
- return `${acc} ${command} ${_x2 - radius * v.unitVector.x},${_y2 - radius * v.unitVector.y} A 10,10 0 0, ${mirrored ? '0' : '1'} ${_x2 + radius * vNext.unitVector.x},${_y2 + radius * vNext.unitVector.y}`;
24683
+ return `${acc} ${command} ${_x2 - radius * v.unitVector.x},${_y2 - radius * v.unitVector.y} A 10,10 0 0, ${_mirrored ? '0' : '1'} ${_x2 + radius * vNext.unitVector.x},${_y2 + radius * vNext.unitVector.y}`;
24549
24684
  }, '') + ' Z'; // 結尾加上'Z'來關閉路徑
24550
- const dFrame = newCardPoints.reduce((acc, {
24685
+ newCardPoints.reduce((acc, {
24551
24686
  x,
24552
24687
  y
24553
24688
  }, index) => {
@@ -24577,31 +24712,126 @@ const renderOCRMask = params => {
24577
24712
  x: _x3,
24578
24713
  y: _y3
24579
24714
  });
24580
- return `${acc} M ${_x2 - lineRotio * radius * v.unitVector.x},${_y2 - lineRotio * radius * v.unitVector.y} L ${_x2 - radius * v.unitVector.x}, ${_y2 - radius * v.unitVector.y} A 10, 10 0 0, ${mirrored ? '0' : '1'} ${_x2 + radius * vNext.unitVector.x},${_y2 + radius * vNext.unitVector.y} L ${_x2 + lineRotio * radius * vNext.unitVector.x},${_y2 + lineRotio * radius * vNext.unitVector.y} `;
24715
+ return `${acc} M ${_x2 - lineRotio * radius * v.unitVector.x},${_y2 - lineRotio * radius * v.unitVector.y} L ${_x2 - radius * v.unitVector.x}, ${_y2 - radius * v.unitVector.y} A 10, 10 0 0, ${_mirrored ? '0' : '1'} ${_x2 + radius * vNext.unitVector.x},${_y2 + radius * vNext.unitVector.y} L ${_x2 + lineRotio * radius * vNext.unitVector.x},${_y2 + lineRotio * radius * vNext.unitVector.y} `;
24581
24716
  }, '');
24582
24717
  path.setAttribute('d', d);
24583
- pathOfFrame.setAttribute('d', dFrame);
24718
+ if (antiFraud) {
24719
+ setBorderType({
24720
+ type: borderType,
24721
+ mirrored: _mirrored
24722
+ });
24723
+ }
24584
24724
  };
24585
- const setCardBorderColor = status => {
24586
- let color = '#fff';
24725
+ function setBorderSuccess(color, opacity) {
24726
+ borderColorSuccess = color;
24727
+ borderOpacitySuccess = opacity;
24728
+ }
24729
+ function setCardBorderColor(status) {
24730
+ let color = borderColor;
24731
+ let opacity = borderOpacity;
24587
24732
  switch (status) {
24588
24733
  case 'error':
24589
- color = 'var(--authme-scanner-error-color)';
24734
+ color = borderColor || 'var(--authme-scanner-error-color)';
24735
+ opacity = borderOpacity;
24590
24736
  break;
24591
24737
  case 'pass':
24592
- color = 'var(--authme-scanning_color)';
24593
- break;
24594
- default:
24595
- color = '#fff';
24738
+ color = borderColorSuccess || 'var(--authme-scanning_color)';
24739
+ opacity = borderOpacitySuccess;
24596
24740
  break;
24597
24741
  }
24598
- pathOfFrame.setAttribute('stroke', color);
24599
- };
24742
+ if (borderType === 'bordered') {
24743
+ rectOfFrame.setAttribute('stroke', color);
24744
+ rectOfFrame.setAttribute('stroke-opacity', opacity.toString());
24745
+ } else {
24746
+ pathOfFrame.setAttribute('stroke', color);
24747
+ pathOfFrame.setAttribute('stroke-opacity', opacity.toString());
24748
+ }
24749
+ }
24750
+ function frameImage(faceMode, zIndex, base64, color, opacity) {
24751
+ color = color !== null && color !== void 0 ? color : OcrFrame.imageColor;
24752
+ opacity = opacity !== null && opacity !== void 0 ? opacity : OcrFrame.imageOpacity;
24753
+ const rectX = newCardPoints[0].x * windowWidth;
24754
+ const rectY = newCardPoints[0].y * windowHeight;
24755
+ const rectWidth = newCardPoints[1].x * windowWidth - rectX;
24756
+ const rectHeight = newCardPoints[3].y * windowHeight - rectY;
24757
+ let domContainer = document.querySelector('#authme_frame_image');
24758
+ let domImage = document.querySelector('#authme_frame_image_svg');
24759
+ const domImageStyle = `
24760
+ width: 100%;
24761
+ height: 100%;
24762
+ background-color: ${color};
24763
+ opacity: ${opacity};
24764
+ -webkit-mask-image: url(data:image/svg+xml;base64,${base64});
24765
+ mask-image: url(data:image/svg+xml;base64,${base64});
24766
+ -webkit-mask-size: contain;
24767
+ mask-size: contain;
24768
+ mask-repeat: no-repeat no-repeat;
24769
+ mask-position: center center;
24770
+ `;
24771
+ if (!domContainer) {
24772
+ domContainer = document.createElement('div');
24773
+ domContainer.setAttribute('id', 'authme_frame_image');
24774
+ container.appendChild(domContainer);
24775
+ }
24776
+ if (!domImage) {
24777
+ domImage = document.createElement('div');
24778
+ domImage.setAttribute('id', 'authme_frame_image_svg');
24779
+ domContainer.appendChild(domImage);
24780
+ }
24781
+ if (faceMode === 'front') {
24782
+ domImage.classList.add('front');
24783
+ }
24784
+ domImage.setAttribute('style', domImageStyle);
24785
+ domImage.setAttribute('preserveAspectRatio', 'none');
24786
+ domContainer.setAttribute('style', `
24787
+ z-index: ${zIndex};
24788
+ position: absolute;
24789
+ left: ${rectX}px;
24790
+ top: ${rectY}px;
24791
+ width: ${rectWidth}px;
24792
+ height: ${rectHeight}px;
24793
+ opacity: ${opacity};
24794
+ `);
24795
+ }
24796
+ function frameText(zIndex, text, color, opacity) {
24797
+ color = color !== null && color !== void 0 ? color : OcrFrame.textColor;
24798
+ opacity = opacity !== null && opacity !== void 0 ? opacity : OcrFrame.textOpacity;
24799
+ const rectX = newCardPoints[0].x * windowWidth;
24800
+ const rectY = newCardPoints[0].y * windowHeight;
24801
+ const rectWidth = newCardPoints[1].x * windowWidth - rectX;
24802
+ const rectHeight = newCardPoints[3].y * windowHeight - rectY;
24803
+ let dom = document.querySelector('#authme_frame_text');
24804
+ if (!dom) {
24805
+ dom = document.createElement('div');
24806
+ dom.setAttribute('id', 'authme_frame_text');
24807
+ container.appendChild(dom);
24808
+ }
24809
+ dom.setAttribute('style', `
24810
+ z-index: ${zIndex};
24811
+ position: absolute;
24812
+ left: ${rectX}px;
24813
+ top: ${rectY}px;
24814
+ width: ${rectWidth}px;
24815
+ height: ${rectHeight}px;
24816
+ opacity: ${opacity};
24817
+ color: ${color};
24818
+ display: flex;
24819
+ align-items: center;
24820
+ justify-content: center;
24821
+ font-size: 60px;
24822
+ font-weight: 500;
24823
+ `);
24824
+ dom.textContent = text;
24825
+ }
24600
24826
  // 初始化位置
24601
24827
  setCardPoints(_cardPoints);
24602
24828
  return {
24603
24829
  setCardPoints,
24604
- setCardBorderColor
24830
+ setCardBorderColor,
24831
+ setBorderType,
24832
+ frameImage,
24833
+ frameText,
24834
+ setBorderSuccess
24605
24835
  };
24606
24836
  };
24607
24837
 
@@ -24613,7 +24843,8 @@ const cardSvgStyle = `.d{fill:#f7f7f7;}.e{fill:#f2f2f2;}.f{fill:#ed5454;}.g{fill
24613
24843
  function makeSvgTag(viewBox, styleSetting = '') {
24614
24844
  const newSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
24615
24845
  const style = makeStyleTag(styleSetting);
24616
- newSvg.style['position'] = 'absolute';
24846
+ newSvg.style['position'] = 'relative';
24847
+ newSvg.style['width'] = '100%';
24617
24848
  newSvg.setAttribute('version', '1.1');
24618
24849
  newSvg.setAttribute('xmlns', 'http://www.w3.org/2000/svg');
24619
24850
  newSvg.setAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink');
@@ -24657,16 +24888,19 @@ function renderCardRotateAnimate(container) {
24657
24888
  const {
24658
24889
  cardMainGroup
24659
24890
  } = createSvgCard();
24660
- container.style.transition = `opacity ${fadeDuration}ms`;
24661
- container.style.opacity = '0';
24891
+ const div = document.createElement('div');
24892
+ div.setAttribute('class', 'arrow');
24893
+ div.style.transition = `opacity ${fadeDuration}ms`;
24894
+ div.style.opacity = '0';
24662
24895
  cardSvg.style.transition = `transform ${aimateDuration}ms `;
24663
24896
  cardSvg.style.zIndex = `var(--authme-layers-1-z-index)`;
24664
24897
  frontArrowSvg.style.zIndex = `var(--authme-layers-2-z-index)`;
24665
24898
  cardSvg.appendChild(cardMainGroup);
24666
- container.appendChild(cardSvg);
24899
+ div.appendChild(cardSvg);
24667
24900
  cardSvg.style.display = 'none';
24668
24901
  frontArrowSvg.style.display = 'none';
24669
24902
  backArrowSvg.style.display = 'none';
24903
+ container.appendChild(div);
24670
24904
  return {
24671
24905
  stopAnimate: () => {
24672
24906
  if (rotateTimeout.length > 0) {
@@ -25000,7 +25234,7 @@ function renderCardRotateAnimate(container) {
25000
25234
  });
25001
25235
  }
25002
25236
  function fadeAnimate(inOrOut) {
25003
- container.style.opacity = inOrOut === 'in' ? '0.8' : '0';
25237
+ div.style.opacity = inOrOut === 'in' ? '0.8' : '0';
25004
25238
  return new Promise(resolve => {
25005
25239
  setTimeout(() => {
25006
25240
  resolve(true);
@@ -25056,10 +25290,442 @@ function renderCardRotateAnimate(container) {
25056
25290
  cardSvg.style.display = 'none';
25057
25291
  frontArrowSvg.style.display = 'none';
25058
25292
  backArrowSvg.style.display = 'none';
25059
- // container.removeChild(svg);
25293
+ // div.removeChild(svg);
25060
25294
  }
25061
25295
  }
25062
25296
 
25297
+ const captureButton = () => {
25298
+ let dom = document.querySelector('#btn_capture');
25299
+ if (dom) {
25300
+ return dom;
25301
+ }
25302
+ const videoContainer = document.querySelector('.video-container');
25303
+ if (!videoContainer) {
25304
+ console.error('captureButton: videoContainer not found');
25305
+ return null;
25306
+ }
25307
+ dom = document.createElement('div');
25308
+ dom.id = 'btn_capture';
25309
+ const pictureInner = document.createElement('div');
25310
+ pictureInner.classList.add('inner');
25311
+ dom.appendChild(pictureInner);
25312
+ videoContainer.appendChild(dom);
25313
+ return dom;
25314
+ };
25315
+
25316
+ const modal = arg => {
25317
+ const authmeContainer = document.querySelector('.authme-container');
25318
+ if (!authmeContainer) {
25319
+ console.error('modal: authmeContainer not found');
25320
+ return;
25321
+ }
25322
+ function removeModal() {
25323
+ var _a;
25324
+ (_a = document.querySelector('.video-container__modal')) === null || _a === void 0 ? void 0 : _a.remove();
25325
+ }
25326
+ const domModal = document.createElement('div');
25327
+ const domHeaderContainer = document.createElement('div');
25328
+ const domHeader = document.createElement('div');
25329
+ const domContainer = document.createElement('div');
25330
+ const domTitle = document.createElement('div');
25331
+ const domSubtitle = document.createElement('div');
25332
+ const domImage = document.createElement('img');
25333
+ const domContent = document.createElement('div');
25334
+ const domFooter = document.createElement('div');
25335
+ const domClose = document.createElement('div');
25336
+ const domConfirm = document.createElement('div');
25337
+ const domCopyRight = document.createElement('div');
25338
+ domModal.classList.add('video-container__modal');
25339
+ domHeaderContainer.classList.add('video-container__modal-header-container');
25340
+ domHeader.classList.add('video-container__modal-header');
25341
+ domContainer.classList.add('video-container__modal-container');
25342
+ domTitle.classList.add('video-container__modal-title');
25343
+ domSubtitle.classList.add('video-container__modal-subtitle');
25344
+ domImage.classList.add('video-container__modal-image');
25345
+ domContent.classList.add('video-container__modal-content');
25346
+ domFooter.classList.add('video-container__modal-footer');
25347
+ domClose.classList.add('video-container__modal-close');
25348
+ domConfirm.classList.add('video-container__modal-confirm');
25349
+ domCopyRight.classList.add('video-container__modal-copy-right');
25350
+ domHeader.innerText = arg.header;
25351
+ domTitle.innerText = arg.title;
25352
+ domSubtitle.innerText = arg.subtitle;
25353
+ domImage.src = arg.image;
25354
+ domContent.innerHTML = arg.content;
25355
+ domClose.innerHTML = '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M19.1943 6.41714C19.6393 5.97216 19.6393 5.2507 19.1943 4.80571C18.7493 4.36073 18.0278 4.36073 17.5829 4.80571L12 10.3886L6.41714 4.80572C5.97216 4.36073 5.2507 4.36073 4.80571 4.80571C4.36073 5.2507 4.36073 5.97216 4.80571 6.41714L10.3886 12L4.80571 17.5829C4.36073 18.0278 4.36073 18.7493 4.80571 19.1943C5.2507 19.6393 5.97216 19.6393 6.41714 19.1943L12 13.6114L17.5829 19.1943C18.0278 19.6393 18.7493 19.6393 19.1943 19.1943C19.6393 18.7493 19.6393 18.0278 19.1943 17.5829L13.6114 12L19.1943 6.41714Z" fill="#545454"/></svg>';
25356
+ domConfirm.innerText = arg.confirm;
25357
+ domClose.addEventListener('click', () => __awaiter(void 0, void 0, void 0, function* () {
25358
+ if (arg.onClose) {
25359
+ yield arg.onClose();
25360
+ }
25361
+ removeModal();
25362
+ }));
25363
+ domConfirm.addEventListener('click', () => __awaiter(void 0, void 0, void 0, function* () {
25364
+ if (arg.onConfirm) {
25365
+ yield arg.onConfirm();
25366
+ }
25367
+ removeModal();
25368
+ }));
25369
+ domHeaderContainer.appendChild(domHeader);
25370
+ domHeaderContainer.appendChild(domClose);
25371
+ domModal.appendChild(domHeaderContainer);
25372
+ domContainer.appendChild(domTitle);
25373
+ domContainer.appendChild(domSubtitle);
25374
+ domContainer.appendChild(domImage);
25375
+ domContainer.appendChild(domContent);
25376
+ domModal.appendChild(domContainer);
25377
+ domFooter.appendChild(domConfirm);
25378
+ domModal.appendChild(domFooter);
25379
+ if (arg.copyRight) {
25380
+ domCopyRight.innerText = arg.copyRight;
25381
+ domFooter.appendChild(domCopyRight);
25382
+ }
25383
+ authmeContainer.appendChild(domModal);
25384
+ };
25385
+
25386
+ const tiltFrame = isTilt => {
25387
+ var _a, _b, _c, _d;
25388
+ document.querySelector('.video-container');
25389
+ if (isTilt) {
25390
+ (_a = document.querySelector('#authme_frame_image')) === null || _a === void 0 ? void 0 : _a.classList.add('svg-tilt');
25391
+ (_b = document.querySelector('#authme_frame_image_svg')) === null || _b === void 0 ? void 0 : _b.classList.add('svg-tilt');
25392
+ } else {
25393
+ (_c = document.querySelector('#authme_frame_image')) === null || _c === void 0 ? void 0 : _c.classList.remove('svg-tilt');
25394
+ (_d = document.querySelector('#authme_frame_image_svg')) === null || _d === void 0 ? void 0 : _d.classList.remove('svg-tilt');
25395
+ }
25396
+ };
25397
+ const resetFrame = () => {
25398
+ const domContainer = document.querySelector('#authme_frame_image');
25399
+ const domImage = document.querySelector('#authme_frame_image_svg');
25400
+ if (domContainer) {
25401
+ domContainer.setAttribute('style', 'display: none');
25402
+ }
25403
+ if (domImage) {
25404
+ domImage.setAttribute('style', 'display: none');
25405
+ }
25406
+ };
25407
+ const countdownTimer = (time, doSomething) => {
25408
+ let end = false;
25409
+ const init = () => {
25410
+ const endTime = new Date().getTime() + time * 1000;
25411
+ const timer = setInterval(function () {
25412
+ const currentTime = new Date().getTime();
25413
+ const remainingTime = endTime - currentTime;
25414
+ if (remainingTime <= 0) {
25415
+ clearInterval(timer);
25416
+ end = true;
25417
+ if (doSomething) {
25418
+ doSomething();
25419
+ }
25420
+ }
25421
+ }, 300);
25422
+ };
25423
+ const getStatus = () => {
25424
+ return end;
25425
+ };
25426
+ return {
25427
+ init: init,
25428
+ end: getStatus
25429
+ };
25430
+ };
25431
+
25432
+ const translateService = getTranslateInstance();
25433
+ // TODO 處理參數
25434
+ const startThickness = (type, cardType, cardTypeConfig, setHintTextLocale, setCardPoints, setCardBorderColor, statusText, canvasSizeInfo$, showVideoElement, config, cardRotateByStage, getCardBorderPoint, setBorderType, setBorderSuccess, scanAnimationContainer, successAnimationContainer, frameImage, frameText, facingMode, ocrEngineConfig, sdkFlowTimeout = undefined, makeSDKFlowTimeout, image, video, retryBtn, completeBtn, confirmImageContainer) => {
25435
+ const videoToCanvas = (sizeInfo, data) => {
25436
+ const ctx2 = image.getContext('2d');
25437
+ image.width = sizeInfo.canvasWidth;
25438
+ image.height = sizeInfo.canvasHeight;
25439
+ if (data) {
25440
+ const imgData = ctx2.createImageData(image.width, image.height);
25441
+ imgData.data.set(data);
25442
+ ctx2.putImageData(imgData, 0, 0);
25443
+ } else {
25444
+ ctx2.drawImage(video, sizeInfo.startX, sizeInfo.startY, sizeInfo.width, sizeInfo.height, 0, 0, sizeInfo.canvasWidth, sizeInfo.canvasHeight);
25445
+ }
25446
+ };
25447
+ const checkConfirmImageManual = (sizeInfo, data) => __awaiter(void 0, void 0, void 0, function* () {
25448
+ videoToCanvas(sizeInfo, data);
25449
+ showVideoElement(false);
25450
+ showElement(confirmImageContainer);
25451
+ const retryEvents = fromEvent(retryBtn, 'click').pipe(mapTo(true));
25452
+ const confirmEvents = fromEvent(completeBtn, 'click').pipe(mapTo(false));
25453
+ const allEvents$ = merge(retryEvents, confirmEvents);
25454
+ return yield firstValueFrom(allEvents$.pipe());
25455
+ });
25456
+ const generateImage = canvasSizeInfo => {
25457
+ return dataURItoBlob(image.toDataURL('image/jpeg', 0.85));
25458
+ // const ocrOriginImg = UintArrayToBlob(
25459
+ // canvasSizeInfo.width,
25460
+ // canvasSizeInfo.height,
25461
+ // data.data,
25462
+ // virtualCanvas
25463
+ // );
25464
+ //
25465
+ // return ocrOriginImg;
25466
+ };
25467
+
25468
+ const initThicknessFrame = () => __awaiter(void 0, void 0, void 0, function* () {
25469
+ const cardMatchROI = config.getCardMatchROI ? yield config.getCardMatchROI() : undefined;
25470
+ yield cardRotateByStage(EAuthMeIDCardAntiFraudStage.Down, false, cardMatchROI);
25471
+ });
25472
+ const applyTextByResult = result => {
25473
+ if (!setCardBorderColor) return;
25474
+ statusText.classList.add('non-empty');
25475
+ switch (result.eStatus) {
25476
+ case EAuthMeIDCardAntiFraudStatus.PositionNotMatch:
25477
+ statusText.textContent = translateService.translate('sdk.general.verify.error.missmatch');
25478
+ sendStatusDescription$1(StatusDescription.PositionNotMatch);
25479
+ setCardBorderColor('error');
25480
+ break;
25481
+ case EAuthMeIDCardAntiFraudStatus.NeedMoreFrame:
25482
+ statusText.textContent = '';
25483
+ statusText.classList.remove('non-empty');
25484
+ sendStatusDescription$1(StatusDescription.NeedMoreFrame);
25485
+ setCardBorderColor('pass');
25486
+ break;
25487
+ case EAuthMeIDCardAntiFraudStatus.Detect:
25488
+ statusText.textContent = '';
25489
+ statusText.classList.remove('non-empty');
25490
+ sendStatusDescription$1(StatusDescription.NeedMoreFrame);
25491
+ setCardBorderColor('pass');
25492
+ break;
25493
+ case EAuthMeIDCardAntiFraudStatus.NoCard:
25494
+ statusText.textContent = translateService.translate('sdk.general.verify.error.noCard');
25495
+ sendStatusDescription$1(StatusDescription.NoCard);
25496
+ setCardBorderColor('error');
25497
+ break;
25498
+ case EAuthMeIDCardAntiFraudStatus.WrongCardType:
25499
+ statusText.textContent = translateService.translate('sdk.general.verify.error.wrongCardType');
25500
+ sendStatusDescription$1(StatusDescription.WrongCardType);
25501
+ setCardBorderColor('error');
25502
+ break;
25503
+ case EAuthMeIDCardAntiFraudStatus.CardThicknessFailed:
25504
+ statusText.textContent = translateService.translate('sdk.general.verify.error.CardThicknessFailed');
25505
+ sendStatusDescription$1(StatusDescription.CardThicknessFailed);
25506
+ setCardBorderColor('error');
25507
+ break;
25508
+ case EAuthMeIDCardAntiFraudStatus.Reflective:
25509
+ statusText.textContent = translateService.translate('sdk.general.verify.error.reflective');
25510
+ sendStatusDescription$1(StatusDescription.Reflective);
25511
+ setCardBorderColor('error');
25512
+ break;
25513
+ case EAuthMeIDCardAntiFraudStatus.Blur:
25514
+ statusText.textContent = translateService.translate('sdk.general.verify.error.blur');
25515
+ sendStatusDescription$1(StatusDescription.Blur);
25516
+ setCardBorderColor('error');
25517
+ break;
25518
+ case EAuthMeIDCardAntiFraudStatus.Gray:
25519
+ statusText.classList.remove('non-empty');
25520
+ statusText.textContent = '';
25521
+ sendStatusDescription$1(StatusDescription.Gray);
25522
+ setCardBorderColor('error');
25523
+ break;
25524
+ case EAuthMeIDCardAntiFraudStatus.Error:
25525
+ statusText.textContent = translateService.translate('sdk.general.error.alert.serverError');
25526
+ showErrorMessage(translateService.translate('sdk.general.error.alert.serverError'), true);
25527
+ sendStatusDescription$1(StatusDescription.Error);
25528
+ break;
25529
+ case EAuthMeIDCardAntiFraudStatus.NeedDeformationFrontal:
25530
+ statusText.textContent = translateService.translate('sdk.general.verify.error.needDeformationFrontal');
25531
+ break;
25532
+ case EAuthMeIDCardAntiFraudStatus.NeedDeformationLeft:
25533
+ statusText.textContent = translateService.translate('sdk.general.verify.error.needDeformationFrontal');
25534
+ break;
25535
+ case EAuthMeIDCardAntiFraudStatus.NeedDeformationRight:
25536
+ statusText.textContent = translateService.translate('sdk.general.verify.error.needDeformationFrontal');
25537
+ break;
25538
+ case EAuthMeIDCardAntiFraudStatus.NeedDeformationUp:
25539
+ statusText.textContent = translateService.translate('sdk.general.verify.error.needDeformationFrontal');
25540
+ break;
25541
+ case EAuthMeIDCardAntiFraudStatus.NeedDeformationDown:
25542
+ statusText.textContent = translateService.translate('sdk.general.verify.error.needDeformationFrontal');
25543
+ break;
25544
+ case EAuthMeIDCardAntiFraudStatus.CardCutByCamera:
25545
+ statusText.textContent = translateService.translate('sdk.general.verify.error.cardCutByCamera');
25546
+ break;
25547
+ case EAuthMeIDCardAntiFraudStatus.CardNotInROI:
25548
+ statusText.textContent = translateService.translate('verify.error.CardNotInROI');
25549
+ break;
25550
+ case EAuthMeIDCardAntiFraudStatus.CardTooSmall:
25551
+ statusText.textContent = translateService.translate('sdk.general.verify.error.getCloser');
25552
+ break;
25553
+ case EAuthMeIDCardAntiFraudStatus.NeedHoldCard:
25554
+ statusText.textContent = translateService.translate('sdk.general.verify.error.needHoldCard');
25555
+ break;
25556
+ case EAuthMeIDCardAntiFraudStatus.StagePass:
25557
+ statusText.textContent = translateService.translate('sdk.general.verify.error.stagePass');
25558
+ setCardBorderColor('pass');
25559
+ break;
25560
+ case EAuthMeIDCardAntiFraudStatus.Pass:
25561
+ setCardBorderColor('pass');
25562
+ statusText.textContent = translateService.translate('sdk.general.verify.error.pass');
25563
+ break;
25564
+ case EAuthMeIDCardAntiFraudStatus.Failed:
25565
+ setCardBorderColor('error');
25566
+ statusText.textContent = translateService.translate('sdk.general.verify.error.pass');
25567
+ break;
25568
+ default:
25569
+ emptyStatusText();
25570
+ break;
25571
+ }
25572
+ function emptyStatusText() {
25573
+ setCardBorderColor(null);
25574
+ statusText.textContent = '';
25575
+ statusText.classList.remove('non-empty');
25576
+ }
25577
+ };
25578
+ const init = retry => canvasSizeInfo$.pipe(take(1), switchMap(canvasSizeInfo => from(config.setFrameSize(canvasSizeInfo.canvasWidth, canvasSizeInfo.canvasHeight)).pipe(switchMap(() => checkOnlineStatus(translateService.translate('sdk.general.error.alert.offline'), translateService.translate('sdk.general.error.retry'))), tap(() => {
25579
+ if (!retry) {
25580
+ startSpinner(translateService.translate('sdk.general.loading'), true);
25581
+ }
25582
+ }), switchMap(() => config.thicknessStart ? config.thicknessStart(getCardBorderPoint(), type, setBorderType, setCardBorderColor, setBorderSuccess, scanAnimationContainer, successAnimationContainer, frameImage, frameText, facingMode, cardType, cardTypeConfig, retry) : of(thicknessDefaultConfig)), switchMap(result => {
25583
+ tiltFrame(true);
25584
+ if (result && result.thicknessWelcomeSetting && result.thicknessWelcomeSetting.welcome && !retry) {
25585
+ thicknessMode = cardTypeConfig.mode;
25586
+ return new Observable(observer => {
25587
+ const pageInfo = result.thicknessWelcomeSetting;
25588
+ modal({
25589
+ header: translateService.translate('sdk.thickness.detection.guide.title'),
25590
+ title: pageInfo.title.enable ? pageInfo.title.text : translateService.translate(thicknessDefaultConfig.thicknessWelcomeSetting.title.text),
25591
+ subtitle: pageInfo.subtitle ? pageInfo.subtitle.text : translateService.translate(thicknessDefaultConfig.thicknessWelcomeSetting.subtitle.text),
25592
+ image: pageInfo.imageShow.enable ? pageInfo.imageShow.src : translateService.translate(thicknessDefaultConfig.thicknessWelcomeSetting.imageShow.src),
25593
+ content: pageInfo.content.enable ? pageInfo.content.text : translateService.translate(thicknessDefaultConfig.thicknessWelcomeSetting.content.text),
25594
+ confirm: translateService.translate('sdk.general.continue'),
25595
+ onClose: () => {
25596
+ return observer.error({
25597
+ isSuccess: false,
25598
+ code: `${ErrorCode.USER_CANCEL}`,
25599
+ message: new AuthmeError(ErrorCode.USER_CANCEL).message,
25600
+ data: {}
25601
+ });
25602
+ },
25603
+ onConfirm: () => {
25604
+ observer.next(canvasSizeInfo);
25605
+ observer.complete();
25606
+ }
25607
+ });
25608
+ });
25609
+ } else {
25610
+ return of(canvasSizeInfo);
25611
+ }
25612
+ }), tap(() => {
25613
+ stopSpinner();
25614
+ if (!retry) {
25615
+ thicknessTimer.init();
25616
+ }
25617
+ }), map(() => canvasSizeInfo))));
25618
+ const autoDetectProcess = retry => init(retry).pipe(tap(() => {
25619
+ setStatusView(StatusView.Running);
25620
+ if (ocrEngineConfig.expiredIn && !sdkFlowTimeout) {
25621
+ sdkFlowTimeout = makeSDKFlowTimeout(ocrEngineConfig.expiredIn);
25622
+ }
25623
+ }), switchMap(canvasSizeInfo => {
25624
+ // 不用使用 await 等待 initThicknessFrame 完成, 因為這段是非同步的, 單純出 UI 而已
25625
+ initThicknessFrame();
25626
+ if (!config.onThicknessFrame) {
25627
+ return of(canvasSizeInfo);
25628
+ }
25629
+ return of(true).pipe(sendFrame(canvasSizeInfo, image, video, config.onThicknessFrame, ocrEngineConfig.fraudMaxFps, false, 'jpg', cardType, undefined, type), tap(x => applyTextByResult(x.result)), filter(({
25630
+ result
25631
+ }) => {
25632
+ if (result.eStatus === EAuthMeIDCardAntiFraudStatus.Pass) {
25633
+ statusText.textContent = translateService.translate('sdk.general.verify.success');
25634
+ }
25635
+ return result.eStatus === EAuthMeIDCardAntiFraudStatus.Pass || thicknessTimer.end();
25636
+ }), take(1),
25637
+ // tap(() => {
25638
+ // statusText.textContent = translateService.translate(
25639
+ // 'sdk.general.verify.success'
25640
+ // );
25641
+ // }),
25642
+ switchMap(({
25643
+ result
25644
+ }) => {
25645
+ if (thicknessTimer.end()) {
25646
+ startSpinner(translateService.translate('sdk.general.uploading'), true);
25647
+ videoToCanvas(canvasSizeInfo, result.imageData);
25648
+ return config.confirmThickness ? config.confirmThickness(generateImage(), cardType) : of(false);
25649
+ }
25650
+ return from(checkConfirmImageManual(canvasSizeInfo, result.imageData)).pipe(tap(() => applyTextByResult('')), switchMap(needRetry => {
25651
+ startSpinner(translateService.translate('sdk.general.uploading'), true);
25652
+ return needRetry ? of(true) : from(config.confirmThickness ? config.confirmThickness(generateImage(), cardType) : of(false)).pipe(tap(() => sendStatusAction$1(StatusAction.Uploading)), map(confirmResp => !confirmResp));
25653
+ }), switchMap(confirmResp => {
25654
+ showVideoElement(true);
25655
+ hideElement(confirmImageContainer);
25656
+ stopSpinner();
25657
+ if (confirmResp) {
25658
+ return autoDetectProcess(true);
25659
+ } else {
25660
+ return of(confirmResp);
25661
+ }
25662
+ }));
25663
+ }));
25664
+ }));
25665
+ const manualProcess = () => init(false).pipe(tap(() => {
25666
+ setStatusView(StatusView.Running);
25667
+ if (ocrEngineConfig.expiredIn && !sdkFlowTimeout) {
25668
+ sdkFlowTimeout = makeSDKFlowTimeout(ocrEngineConfig.expiredIn);
25669
+ }
25670
+ }), switchMap(() => {
25671
+ return new Observable(observer => {
25672
+ const captureBtn = captureButton();
25673
+ if (captureBtn) {
25674
+ showElement(captureBtn);
25675
+ }
25676
+ const interval$ = interval(400);
25677
+ const checkTimeout = interval$.pipe(takeWhile(() => !thicknessTimer.end()),
25678
+ // 當 end() 函數返回 false 時繼續
25679
+ finalize$1(() => __awaiter(void 0, void 0, void 0, function* () {
25680
+ if (thicknessTimer.end()) {
25681
+ startSpinner(translateService.translate('sdk.general.uploading'), true);
25682
+ const sizeInfo = yield getCanvasSize(video);
25683
+ videoToCanvas(sizeInfo);
25684
+ if (config.confirmThickness) {
25685
+ yield config.confirmThickness(generateImage(), cardType);
25686
+ }
25687
+ hideElement(captureBtn);
25688
+ checkTimeout.unsubscribe();
25689
+ observer.next(sizeInfo);
25690
+ }
25691
+ }))).subscribe(() => {
25692
+ // 在每次 interval 發出值時執行的操作
25693
+ });
25694
+ fromEvent(captureBtn, 'click').pipe(switchMap(() => getCanvasSize(video)), switchMap(canvasSizeInfo => {
25695
+ return from(checkConfirmImageManual(canvasSizeInfo)).pipe(switchMap(needRetry => {
25696
+ startSpinner(translateService.translate('sdk.general.uploading'), true);
25697
+ return needRetry ? of(true) : from(config.confirmThickness ? config.confirmThickness(generateImage(), cardType) : of(false)).pipe(tap(() => sendStatusAction$1(StatusAction.Uploading)), map(confirmResp => !confirmResp));
25698
+ }), tap(confirmResp => {
25699
+ hideElement(confirmImageContainer);
25700
+ stopSpinner();
25701
+ showVideoElement(true);
25702
+ if (!confirmResp) {
25703
+ checkTimeout.unsubscribe(); // 取消 interval$ 的訂閱
25704
+ hideElement(captureBtn);
25705
+ observer.next(canvasSizeInfo);
25706
+ }
25707
+ }));
25708
+ }), map(confirmResp => {
25709
+ of(confirmResp);
25710
+ })).subscribe();
25711
+ });
25712
+ }));
25713
+ const thicknessTimer = countdownTimer(60); // TODO default 60 need get from server
25714
+ let thicknessMode = cardTypeConfig.mode;
25715
+ const point = getCardBorderPoint();
25716
+ setCardPoints(point.map(([x, y]) => ({
25717
+ x,
25718
+ y
25719
+ })), false);
25720
+ setCardBorderColor(null);
25721
+ setHintTextLocale();
25722
+ if (thicknessMode === 'auto') {
25723
+ return autoDetectProcess(false);
25724
+ } else {
25725
+ return manualProcess();
25726
+ }
25727
+ };
25728
+
25063
25729
  const initEvenTrackingStatus = ocrConfig => {
25064
25730
  setFeature$1(ocrConfig.needAntiFraud ? Feature.OCRFraud : Feature.OCR);
25065
25731
  };
@@ -25124,6 +25790,7 @@ function startOCR(config) {
25124
25790
  lottieMask,
25125
25791
  arrowAnimationContainer,
25126
25792
  scanAnimationContainer,
25793
+ successAnimationDom,
25127
25794
  antiFraudInstructionAnimationContainer,
25128
25795
  confirmImageContainer,
25129
25796
  imageTypeText,
@@ -25139,7 +25806,11 @@ function startOCR(config) {
25139
25806
  const cardPoints = getCardBorderPoint();
25140
25807
  const {
25141
25808
  setCardPoints,
25142
- setCardBorderColor
25809
+ setCardBorderColor,
25810
+ setBorderType,
25811
+ frameImage,
25812
+ frameText,
25813
+ setBorderSuccess
25143
25814
  } = renderOCRMask({
25144
25815
  cardPoints: cardPoints.map(point => ({
25145
25816
  x: point[0],
@@ -25168,9 +25839,18 @@ function startOCR(config) {
25168
25839
  // fromEvent(window, 'resize').pipe(switchMapTo(getCanvasSize(video)))
25169
25840
  );
25170
25841
 
25842
+ const currentType = (() => {
25843
+ const data = {};
25844
+ return (method, obj) => {
25845
+ if (method === 'set') {
25846
+ Object.assign(data, obj);
25847
+ }
25848
+ return data;
25849
+ };
25850
+ })();
25171
25851
  function makeSDKFlowTimeout(expiredIn) {
25172
25852
  return setTimeout(() => __awaiter(this, void 0, void 0, function* () {
25173
- asyncShowErrorMessage(translateService.translate('verify.error.timeout'), false);
25853
+ asyncShowErrorMessage(translateService.translate('sdk.general.error.timeout.content'), false);
25174
25854
  yield waitTime(3 * TIME_UNIT.SECOND);
25175
25855
  timeout$.next({
25176
25856
  isSuccess: false,
@@ -25194,7 +25874,7 @@ function startOCR(config) {
25194
25874
  statusText.classList.add('non-empty');
25195
25875
  switch (result.eStatus) {
25196
25876
  case EAuthMeIDCardAntiFraudStatus.PositionNotMatch:
25197
- statusText.textContent = translateService.translate('verify.error.mismatch');
25877
+ statusText.textContent = translateService.translate('sdk.general.verify.error.missmatch');
25198
25878
  sendStatusDescription$1(StatusDescription.PositionNotMatch);
25199
25879
  setCardBorderColor('error');
25200
25880
  break;
@@ -25211,22 +25891,22 @@ function startOCR(config) {
25211
25891
  setCardBorderColor('pass');
25212
25892
  break;
25213
25893
  case EAuthMeIDCardAntiFraudStatus.NoCard:
25214
- statusText.textContent = translateService.translate('verify.error.noCard');
25894
+ statusText.textContent = translateService.translate('sdk.general.verify.error.noCard');
25215
25895
  sendStatusDescription$1(StatusDescription.NoCard);
25216
25896
  setCardBorderColor('error');
25217
25897
  break;
25218
25898
  case EAuthMeIDCardAntiFraudStatus.WrongCardType:
25219
- statusText.textContent = translateService.translate('verify.error.wrongCardType');
25899
+ statusText.textContent = translateService.translate('sdk.general.verify.error.wrongCardType');
25220
25900
  sendStatusDescription$1(StatusDescription.WrongCardType);
25221
25901
  setCardBorderColor('error');
25222
25902
  break;
25223
25903
  case EAuthMeIDCardAntiFraudStatus.Reflective:
25224
- statusText.textContent = translateService.translate('verify.error.reflective');
25904
+ statusText.textContent = translateService.translate('sdk.general.verify.error.reflective');
25225
25905
  sendStatusDescription$1(StatusDescription.Reflective);
25226
25906
  setCardBorderColor('error');
25227
25907
  break;
25228
25908
  case EAuthMeIDCardAntiFraudStatus.Blur:
25229
- statusText.textContent = translateService.translate('verify.error.blur');
25909
+ statusText.textContent = translateService.translate('sdk.general.verify.error.blur');
25230
25910
  blurCount++;
25231
25911
  sendStatusDescription$1(StatusDescription.Blur);
25232
25912
  setCardBorderColor('error');
@@ -25238,55 +25918,55 @@ function startOCR(config) {
25238
25918
  setCardBorderColor('error');
25239
25919
  break;
25240
25920
  case EAuthMeIDCardAntiFraudStatus.Error:
25241
- statusText.textContent = translateService.translate('verify.error.serverError');
25242
- showErrorMessage(translateService.translate('verify.error.serverError'), true);
25921
+ statusText.textContent = translateService.translate('sdk.general.error.alert.serverError');
25922
+ showErrorMessage(translateService.translate('sdk.general.error.alert.serverError'), true);
25243
25923
  sendStatusDescription$1(StatusDescription.Error);
25244
25924
  break;
25245
25925
  case EAuthMeIDCardAntiFraudStatus.NeedDeformationFrontal:
25246
25926
  needDeformationCount++;
25247
- statusText.textContent = translateService.translate('verify.error.NeedDeformationFrontal');
25927
+ statusText.textContent = translateService.translate('sdk.general.verify.error.needDeformationFrontal');
25248
25928
  break;
25249
25929
  case EAuthMeIDCardAntiFraudStatus.NeedDeformationLeft:
25250
25930
  needDeformationCount++;
25251
- statusText.textContent = translateService.translate('verify.error.NeedDeformationFrontal');
25931
+ statusText.textContent = translateService.translate('sdk.general.verify.error.needDeformationFrontal');
25252
25932
  break;
25253
25933
  case EAuthMeIDCardAntiFraudStatus.NeedDeformationRight:
25254
25934
  needDeformationCount++;
25255
- statusText.textContent = translateService.translate('verify.error.NeedDeformationFrontal');
25935
+ statusText.textContent = translateService.translate('sdk.general.verify.error.needDeformationFrontal');
25256
25936
  break;
25257
25937
  case EAuthMeIDCardAntiFraudStatus.NeedDeformationUp:
25258
25938
  needDeformationCount++;
25259
- statusText.textContent = translateService.translate('verify.error.NeedDeformationFrontal');
25939
+ statusText.textContent = translateService.translate('sdk.general.verify.error.needDeformationFrontal');
25260
25940
  break;
25261
25941
  case EAuthMeIDCardAntiFraudStatus.NeedDeformationDown:
25262
25942
  needDeformationCount++;
25263
- statusText.textContent = translateService.translate('verify.error.NeedDeformationFrontal');
25943
+ statusText.textContent = translateService.translate('sdk.general.verify.error.needDeformationFrontal');
25264
25944
  break;
25265
25945
  case EAuthMeIDCardAntiFraudStatus.CardCutByCamera:
25266
- statusText.textContent = translateService.translate('verify.error.CardCutByCamera');
25946
+ statusText.textContent = translateService.translate('sdk.general.verify.error.cardCutByCamera');
25267
25947
  break;
25268
25948
  case EAuthMeIDCardAntiFraudStatus.CardNotInROI:
25269
25949
  statusText.textContent = translateService.translate('verify.error.CardNotInROI');
25270
25950
  break;
25271
25951
  case EAuthMeIDCardAntiFraudStatus.CardTooSmall:
25272
- statusText.textContent = translateService.translate('verify.error.CardTooSmall');
25952
+ statusText.textContent = translateService.translate('sdk.general.verify.error.getCloser');
25273
25953
  break;
25274
25954
  case EAuthMeIDCardAntiFraudStatus.NeedHoldCard:
25275
- statusText.textContent = translateService.translate('verify.error.NeedHoldCard');
25955
+ statusText.textContent = translateService.translate('sdk.general.verify.error.needHoldCard');
25276
25956
  break;
25277
25957
  case EAuthMeIDCardAntiFraudStatus.StagePass:
25278
- statusText.textContent = translateService.translate('verify.error.StagePass');
25958
+ statusText.textContent = translateService.translate('sdk.general.verify.error.stagePass');
25279
25959
  stopAnimate();
25280
25960
  previosAntiFraudAnimateTime = Date.now();
25281
25961
  setCardBorderColor('pass');
25282
25962
  break;
25283
25963
  case EAuthMeIDCardAntiFraudStatus.Pass:
25284
25964
  setCardBorderColor('pass');
25285
- statusText.textContent = translateService.translate('verify.error.Pass');
25965
+ statusText.textContent = translateService.translate('sdk.general.verify.error.pass');
25286
25966
  break;
25287
25967
  case EAuthMeIDCardAntiFraudStatus.Failed:
25288
25968
  setCardBorderColor('pass');
25289
- statusText.textContent = translateService.translate('verify.error.Pass');
25969
+ statusText.textContent = translateService.translate('sdk.general.verify.error.pass');
25290
25970
  break;
25291
25971
  default:
25292
25972
  emptyStatusText();
@@ -25307,7 +25987,7 @@ function startOCR(config) {
25307
25987
  statusText.classList.remove('non-empty');
25308
25988
  }
25309
25989
  };
25310
- const antiFraudStart$ = of(true).pipe(switchMap(() => checkOnlineStatus(translateService.translate('network.error.offline'))), switchMap(() => canvasSizeInfo$), switchMap(canvasSizeInfo => from(config.setFrameSize(canvasSizeInfo.canvasWidth, canvasSizeInfo.canvasHeight)).pipe(switchMap(() => config.antiFraudStart(getCardBorderPoint())), tap(() => __awaiter(this, void 0, void 0, function* () {
25990
+ const antiFraudStart$ = of(true).pipe(switchMap(() => checkOnlineStatus(translateService.translate('sdk.general.error.alert.offline'), translateService.translate('sdk.general.error.retry'))), switchMap(() => canvasSizeInfo$), switchMap(canvasSizeInfo => from(config.setFrameSize(canvasSizeInfo.canvasWidth, canvasSizeInfo.canvasHeight)).pipe(switchMap(() => config.antiFraudStart(getCardBorderPoint(), setBorderType, setCardBorderColor, setBorderSuccess, scanAnimationContainer, successAnimationDom, frameImage, frameText, facingMode)), tap(() => __awaiter(this, void 0, void 0, function* () {
25311
25991
  setStatusView(StatusView.Aligning);
25312
25992
  if (buttonDisable$) {
25313
25993
  const cardMatchROI = config.getCardMatchROI ? yield config.getCardMatchROI() : undefined;
@@ -25337,7 +26017,7 @@ function startOCR(config) {
25337
26017
  // }
25338
26018
  // throw err;
25339
26019
  // }),
25340
- takeWhile(x => x.eStatus !== EAuthMeIDCardAntiFraudStatus.Pass,
26020
+ takeWhile$1(x => x.eStatus !== EAuthMeIDCardAntiFraudStatus.Pass,
25341
26021
  // &&
25342
26022
  // x.eStatus !== EAuthMeIDCardAntiFraudStatus.Failed,
25343
26023
  true))), shareReplay(1));
@@ -25368,57 +26048,57 @@ function startOCR(config) {
25368
26048
  if (!config.ocrConfig.needOCR && type === EAuthMeCardClass.TWN_IDCard_Front) {
25369
26049
  return of(true);
25370
26050
  }
25371
- if (config.ocrConfig.needAntiFraud) {
25372
- const point = getCardBorderPoint();
25373
- setCardPoints(point.map(([x, y]) => ({
25374
- x,
25375
- y
25376
- })));
25377
- setHintTextLocale();
25378
- }
26051
+ // if (config.ocrConfig.needAntiFraud) {
26052
+ const point = getCardBorderPoint();
26053
+ setCardPoints(point.map(([x, y]) => ({
26054
+ x,
26055
+ y
26056
+ })), config.ocrConfig.needAntiFraud);
26057
+ setHintTextLocale();
26058
+ // }
25379
26059
  const applyTextByResult = result => {
25380
26060
  statusText.classList.add('non-empty');
25381
26061
  switch (result.eStatus) {
25382
26062
  case EAuthMeCardOCRStatus.NoCard:
25383
26063
  case EAuthMeMRZServiceStatus.NotFound:
25384
- statusText.textContent = translateService.translate('verify.error.noCard');
26064
+ statusText.textContent = translateService.translate('sdk.general.verify.error.noCard');
25385
26065
  sendStatusDescription$1(StatusDescription.NoCard);
25386
26066
  setCardBorderColor('error');
25387
26067
  break;
25388
26068
  case EAuthMeCardOCRStatus.WrongCardType:
25389
- statusText.textContent = translateService.translate('verify.error.wrongCardType');
26069
+ statusText.textContent = translateService.translate('sdk.general.verify.error.wrongCardType');
25390
26070
  sendStatusDescription$1(StatusDescription.WrongCardType);
25391
26071
  setCardBorderColor('error');
25392
26072
  break;
25393
26073
  case EAuthMeCardOCRStatus.PositionNotMatch:
25394
- statusText.textContent = translateService.translate('verify.error.mismatch');
26074
+ statusText.textContent = translateService.translate('sdk.general.verify.error.missmatch');
25395
26075
  sendStatusDescription$1(StatusDescription.PositionNotMatch);
25396
26076
  setCardBorderColor('error');
25397
26077
  break;
25398
26078
  case EAuthMeCardOCRStatus.Reflective:
25399
- statusText.textContent = translateService.translate('verify.error.reflective');
26079
+ statusText.textContent = translateService.translate('sdk.general.verify.error.reflective');
25400
26080
  sendStatusDescription$1(StatusDescription.Reflective);
25401
26081
  setCardBorderColor('error');
25402
26082
  break;
25403
26083
  case EAuthMeCardOCRStatus.Blur:
25404
- statusText.textContent = translateService.translate('verify.error.blur');
26084
+ statusText.textContent = translateService.translate('sdk.general.verify.error.blur');
25405
26085
  sendStatusDescription$1(StatusDescription.Blur);
25406
26086
  setCardBorderColor('error');
25407
26087
  blurCount++;
25408
26088
  break;
25409
26089
  case EAuthMeMRZServiceStatus.RecogFailed:
25410
26090
  case EAuthMeMRZServiceStatus.WrongCardType:
25411
- statusText.textContent = translateService.translate('verify.error.wrongCardType');
26091
+ statusText.textContent = translateService.translate('sdk.general.verify.error.wrongCardType');
25412
26092
  sendStatusDescription$1(StatusDescription.WrongCardType);
25413
26093
  setCardBorderColor('error');
25414
26094
  break;
25415
26095
  case EAuthMeMRZServiceStatus.NotAligned:
25416
- statusText.textContent = translateService.translate('verify.error.mismatch');
26096
+ statusText.textContent = translateService.translate('sdk.general.verify.error.missmatch');
25417
26097
  sendStatusDescription$1(StatusDescription.NotAligned);
25418
26098
  setCardBorderColor('error');
25419
26099
  break;
25420
26100
  case EAuthMeMRZServiceStatus.Reflective:
25421
- statusText.textContent = translateService.translate('verify.error.reflective');
26101
+ statusText.textContent = translateService.translate('sdk.general.verify.error.reflective');
25422
26102
  sendStatusDescription$1(StatusDescription.Reflective);
25423
26103
  setCardBorderColor('error');
25424
26104
  break;
@@ -25427,7 +26107,8 @@ function startOCR(config) {
25427
26107
  showCameraSwitchButton(deviceMetas);
25428
26108
  }
25429
26109
  };
25430
- const init = retry => canvasSizeInfo$.pipe(take(1), switchMap(canvasSizeInfo => from(config.setFrameSize(canvasSizeInfo.canvasWidth, canvasSizeInfo.canvasHeight)).pipe(switchMap(() => checkOnlineStatus(translateService.translate('network.error.offline'))), switchMap(() => config.ocrStart(getCardBorderPoint(), type, cardType, retry)), tap(() => {
26110
+ const init = retry => canvasSizeInfo$.pipe(take(1), switchMap(canvasSizeInfo => from(config.setFrameSize(canvasSizeInfo.canvasWidth, canvasSizeInfo.canvasHeight)).pipe(switchMap(() => checkOnlineStatus(translateService.translate('sdk.general.error.alert.offline'), translateService.translate('sdk.general.error.retry'))), switchMap(() => config.ocrStart(getCardBorderPoint(), type, setBorderType, setCardBorderColor, setBorderSuccess, scanAnimationContainer, successAnimationDom, frameImage, frameText, facingMode, cardType, retry)), tap(() => {
26111
+ tiltFrame(false);
25431
26112
  stopSpinner();
25432
26113
  showElement(scanAnimationContainer);
25433
26114
  scanAnimationContainer.style.width = `${cardSizeInfo.width + scanPadding}px`;
@@ -25455,7 +26136,7 @@ function startOCR(config) {
25455
26136
  // }),
25456
26137
  take(1), tap(() => {
25457
26138
  setCardBorderColor('pass');
25458
- statusText.textContent = translateService.translate('verify.ocrSuccess');
26139
+ statusText.textContent = translateService.translate('sdk.general.verify.success');
25459
26140
  lottie.stop('scan');
25460
26141
  hideElement(scanAnimationContainer);
25461
26142
  }), switchMap(resp => of(true).pipe(tap(() => {
@@ -25463,23 +26144,60 @@ function startOCR(config) {
25463
26144
  }), map(() => resp))), switchMap(({
25464
26145
  result
25465
26146
  }) => from(type === EAuthMeCardClass.Passport && config.ocrConfig.disablePassportConfirm ? of(false) : checkConfirmImage(result.imageData, result.iWidth, result.iHeight)).pipe(switchMap(needRetry => {
25466
- startSpinner(translateService.translate('verify.uploading'));
26147
+ startSpinner(translateService.translate('sdk.general.uploading'));
25467
26148
  return needRetry ? of(true) : from(config.confirmImage(type, cardType)).pipe(tap(() => sendStatusAction$1(StatusAction.Uploading)), map(confirmResp => !confirmResp));
25468
26149
  }), tap(() => {
25469
26150
  hideElement(confirmImageContainer);
26151
+ stopSpinner();
25470
26152
  showVideoElement();
25471
26153
  }), switchMap(needRetry => needRetry ? recognition(true) : of(true)))))));
25472
26154
  return recognition(false);
25473
26155
  }
25474
- function createFlowByType(type, cardType) {
26156
+ function createFlowByType(type, cardType, cardTypeConfig) {
25475
26157
  return of(true).pipe(tap(() => {
26158
+ currentType('set', {
26159
+ type,
26160
+ cardType
26161
+ });
25476
26162
  setStatusEvent$1(cardClassMapping(type));
25477
26163
  setUIByType(type, cardType);
25478
- }), switchMap(() => startAntiFraud(type)), tap(() => {
25479
- setStatusEvent$1(cardClassMapping(type));
25480
- setUIByType(type, cardType);
25481
- }), switchMap(() => startOCR(type, cardType)));
26164
+ }), switchMap(() => {
26165
+ if (type === EAuthMeCardClass.TWN_IDCard_Front && config.ocrConfig.needAntiFraud) {
26166
+ return from(startAntiFraud(type)).pipe(switchMap(() => {
26167
+ hideFrameUI(false);
26168
+ return startOCR(type, cardType);
26169
+ }));
26170
+ } else if (cardType.toLocaleLowerCase().includes('thickness')) {
26171
+ hideCameraSwitchButton();
26172
+ return startThickness(type, cardType, cardTypeConfig, setHintTextLocale, setCardPoints, setCardBorderColor, statusText, canvasSizeInfo$, showVideoElement, {
26173
+ getCardMatchROI: config.getCardMatchROI,
26174
+ setFrameSize: config.setFrameSize,
26175
+ thicknessStart: config.thicknessStart,
26176
+ onThicknessFrame: config.onThicknessFrame,
26177
+ confirmThickness: config.confirmThickness
26178
+ }, cardRotateByStage, getCardBorderPoint, setBorderType, setBorderSuccess, scanAnimationContainer, successAnimationDom, frameImage, frameText, facingMode, ocrEngineConfig, sdkFlowTimeout, makeSDKFlowTimeout, image, video, retryBtn, completeBtn, confirmImageContainer);
26179
+ } else if (cardType.toLocaleLowerCase().includes('front')) {
26180
+ hideFrameUI(false);
26181
+ return startOCR(type, cardType);
26182
+ } else if (cardType.toLocaleLowerCase().includes('back')) {
26183
+ hideFrameUI(false);
26184
+ return startOCR(type, cardType);
26185
+ } else if (cardType.toLocaleLowerCase().includes('passport')) {
26186
+ hideFrameUI(false);
26187
+ return startOCR(type, cardType);
26188
+ } else {
26189
+ console.error('unknow flow');
26190
+ return of(false);
26191
+ }
26192
+ })
26193
+ // tap(() => {
26194
+ // setStatusEvent(cardClassMapping(type));
26195
+ // setUIByType(type, cardType);
26196
+ // }),
26197
+ // switchMap(() => startOCR(type, cardType)),
26198
+ );
25482
26199
  }
26200
+
25483
26201
  function main() {
25484
26202
  const flags = {
25485
26203
  onConfirm: false
@@ -25491,9 +26209,9 @@ function startOCR(config) {
25491
26209
  } = showAntiFraudLottie();
25492
26210
  buttonDisable$ = buttonDisable;
25493
26211
  } else {
25494
- startSpinner(translateService.translate('general.loading'));
26212
+ startSpinner(translateService.translate('sdk.general.loading'));
25495
26213
  }
25496
- const flow$ = config.cardTypes.map(x => createFlowByType(mapCardtypeToAuthmeClass(x), x)).reduce((prev, cur) => prev.pipe(switchMap(() => cur)), canvasSizeInfo$.pipe(take(1), tap(() => {
26214
+ const flow$ = config.cardTypes.map((x, index) => createFlowByType(mapCardtypeToAuthmeClass(x), x, config.cardTypeConfigs[index])).reduce((prev, cur) => prev.pipe(switchMap(() => cur)), canvasSizeInfo$.pipe(take(1), tap(() => {
25497
26215
  setUIByType(mapCardtypeToAuthmeClass(config.cardTypes[0]), config.cardTypes[0]);
25498
26216
  }), switchMap(canvasSizeInfo => from(config.init(canvasSizeInfo.canvasWidth, canvasSizeInfo.canvasHeight)).pipe(tap(x => ocrEngineConfig = x), tap(() => __awaiter(this, void 0, void 0, function* () {
25499
26217
  if (config.ocrConfig.needAntiFraud) return;
@@ -25501,7 +26219,7 @@ function startOCR(config) {
25501
26219
  })), tap(() => eventListenerService$1.start()))))).pipe(tap(() => {
25502
26220
  sendStatusAction$1(StatusAction.Uploading);
25503
26221
  hideElement(videoContainer);
25504
- startSpinner(translateService.translate('verify.uploading'));
26222
+ startSpinner(translateService.translate('sdk.general.uploading'));
25505
26223
  }), switchMap(() => config.onSuccess()), tap(() => {
25506
26224
  setStatusEvent$1(cardClassResultMapping(config.acceptTypes[config.acceptTypes.length - 1]));
25507
26225
  stopSpinner();
@@ -25541,20 +26259,28 @@ function startOCR(config) {
25541
26259
  stopSpinner();
25542
26260
  reset();
25543
26261
  }));
25544
- const cancel$ = fromEvent(closeIcon, 'click').pipe(map(() => {
25545
- document.body.removeChild(container);
25546
- sendStatusAction$1(StatusAction.BtnClose);
25547
- return {
26262
+ const cancel$ = fromEvent(closeIcon, 'click').pipe(switchMap(() => getCanvasSize(video)), concatMap(canvasSizeInfo => {
26263
+ const type = currentType('get', null).type;
26264
+ const cardType = currentType('get', null).cardType;
26265
+ const ctx = image.getContext('2d');
26266
+ const imageData = getImageData(image, ctx, video, canvasSizeInfo, false, 'jpg');
26267
+ const imageBlob = UintArrayToBlob(canvasSizeInfo.width, canvasSizeInfo.height, imageData.data);
26268
+ const cancelResultObj = {
25548
26269
  isSuccess: false,
25549
26270
  code: `${ErrorCode.USER_CANCEL}`,
25550
26271
  message: new AuthmeError(ErrorCode.USER_CANCEL).message,
25551
26272
  data: {}
25552
26273
  };
25553
- }), takeUntil(unsubscribe$));
26274
+ const cancelResult = config.ocrCancel ? from(config.ocrCancel(type, cardType, imageBlob)).pipe(map(() => cancelResultObj)) : of(cancelResultObj);
26275
+ return cancelResult;
26276
+ }), takeUntil(unsubscribe$), finalize(() => {
26277
+ document.body.removeChild(container);
26278
+ sendStatusAction$1(StatusAction.BtnClose);
26279
+ }));
25554
26280
  const detectScreenResizeError$ = handleScreenResizeError$(detectScreenResize$(), unsubscribe$, () => !flags.onConfirm);
25555
26281
  return merge(flow$, cancel$, detectScreenResizeError$, timeout$).pipe(take(1));
25556
26282
  }
25557
- fromEvent(window, 'offline').pipe(switchMap(() => asyncOnLineShowErrorMessage(translateService.translate('network.error.offline'), true)), takeUntil(unsubscribe$)).subscribe();
26283
+ fromEvent(window, 'offline').pipe(switchMap(() => asyncOnLineShowErrorMessage(translateService.translate('sdk.general.error.alert.offline'), translateService.translate('sdk.general.error.retry'), true)), takeUntil(unsubscribe$)).subscribe();
25558
26284
  // resize
25559
26285
  fromEvent(window, 'resize').pipe(switchMapTo(getCanvasSize(video)), switchMap(canvasSizeInfo => config.setFrameSize(canvasSizeInfo.canvasWidth, canvasSizeInfo.canvasHeight, getCardBorderPoint())), tap(() => {
25560
26286
  scanAnimationContainer.style.width = `${cardSizeInfo.width + scanPadding}px`;
@@ -25566,7 +26292,7 @@ function startOCR(config) {
25566
26292
  showVideoElement(false);
25567
26293
  showElement(antiFraudInstructionContainer);
25568
26294
  showElement(lottieMask);
25569
- setHeaderText(translateService.translate('verify.idCard'), translateService.translate('verify.header.step', {
26295
+ setHeaderText(translateService.translate('verify.idCard'), translateService.translate('sdk.verify.header.stepper', {
25570
26296
  current: 1,
25571
26297
  total: 3
25572
26298
  }));
@@ -25603,11 +26329,11 @@ function startOCR(config) {
25603
26329
  function countdownTimer(countdown) {
25604
26330
  return __awaiter(this, void 0, void 0, function* () {
25605
26331
  if (countdown <= 0 && !isTutorialFinish) {
25606
- confirmBtn.innerText = translateService.translate('verify.startVerifyBtn');
26332
+ confirmBtn.innerText = translateService.translate('sdk.guard.verify.guide.start');
25607
26333
  yield finishTutorial(point);
25608
26334
  return;
25609
26335
  }
25610
- confirmBtn.innerText = `${translateService.translate('verify.startVerifyBtn')} (${countdown})`;
26336
+ confirmBtn.innerText = `${translateService.translate('sdk.guard.verify.guide.start')} (${countdown})`;
25611
26337
  setTimeout(() => {
25612
26338
  countdownTimer(countdown - 1);
25613
26339
  }, TIME_UNIT.SECOND);
@@ -25636,6 +26362,35 @@ function startOCR(config) {
25636
26362
  return yield firstValueFrom(allEvents$.pipe());
25637
26363
  });
25638
26364
  }
26365
+ function hideFrameUI(flag) {
26366
+ const frameImageDom = document.querySelector('#authme_frame_image');
26367
+ const frameTextDom = document.querySelector('#authme_frame_text');
26368
+ if (frameImageDom) {
26369
+ if (flag) {
26370
+ hideElement(frameImageDom);
26371
+ } else {
26372
+ showElement(frameImageDom);
26373
+ }
26374
+ }
26375
+ if (frameTextDom) {
26376
+ if (flag) {
26377
+ hideElement(frameTextDom);
26378
+ } else {
26379
+ showElement(frameTextDom);
26380
+ }
26381
+ }
26382
+ }
26383
+ // function tiltFrame(isTilt: boolean) {
26384
+ // if (isTilt) {
26385
+ // videoContainer.classList.add('container-tilt');
26386
+ // document.querySelector('#authme_frame_border')?.classList.add('svg-tilt');
26387
+ // document.querySelector('#authme_frame_image')?.classList.add('svg-tilt');
26388
+ // } else {
26389
+ // videoContainer.classList.remove('container-tilt');
26390
+ // document.querySelector('#authme_frame_border')?.classList.remove('svg-tilt');
26391
+ // document.querySelector('#authme_frame_image')?.classList.remove('svg-tilt');
26392
+ // }
26393
+ // }
25639
26394
  function setTopText(title) {
25640
26395
  titleText.textContent = title;
25641
26396
  }
@@ -25647,16 +26402,18 @@ function startOCR(config) {
25647
26402
  function setTextByType(type, cardType) {
25648
26403
  var _a, _b, _c;
25649
26404
  const _typeMap = {
25650
- EAuthMeCardClass_Passport: 'verify.passportFrontSide',
25651
- EAuthMeCardClass_TWN_IDCard_Front: 'verify.idCardFrontSide',
25652
- EAuthMeCardClass_TWN_IDCard_Back: 'verify.idCardBackSide',
25653
- EAuthMeCardClass_TWN_DriverLicense_Front: 'verify.licenseFrontSide',
25654
- EAuthMeCardClass_TWN_DriverLicense_Back: 'verify.licenseBackSide',
25655
- EAuthMeCardClass_TWN_ResidentCard_Front: 'verify.residentCardFrontSide',
25656
- EAuthMeCardClass_TWN_ResidentCard_Back: 'verify.residentCardBackSide',
25657
- EAuthMeCardClass_TWN_HealthCard_Front: 'verify.healthFrontSide',
26405
+ EAuthMeCardClass_Passport: 'sdk.ocr.verify.passportFrontSide',
26406
+ EAuthMeCardClass_TWN_IDCard_Front: 'sdk.ocr.verify.idCardFrontSide',
26407
+ EAuthMeCardClass_TWN_IDCard_Back: 'sdk.ocr.verify.idCardBackSide',
26408
+ EAuthMeCardClass_TWN_DriverLicense_Front: 'sdk.ocr.verify.driverFrontSide',
26409
+ EAuthMeCardClass_TWN_DriverLicense_Back: 'sdk.ocr.verify.driverBackSide',
26410
+ EAuthMeCardClass_TWN_ResidentCard_Front: 'sdk.ocr.verify.residentCardFrontSide',
26411
+ EAuthMeCardClass_TWN_ResidentCard_Back: 'sdk.ocr.verify.residentCardBackSide',
26412
+ EAuthMeCardClass_TWN_HealthCard_Front: 'sdk.ocr.verify.healthCardFrontSide',
25658
26413
  EAuthMeCardClass_TWN_VehiclesLicense_Front: 'verify.vehiclesLicenseFrontSide'
26414
+ // EAuthMeCardClass_TWN_IDCard_Thickness: 'verify.idCardThickness',
25659
26415
  };
26416
+
25660
26417
  const typeMap = _typeMap;
25661
26418
  let titleKey = typeMap[`${type}`];
25662
26419
  if (typeMap[`${type}`] == null) {
@@ -25666,18 +26423,20 @@ function startOCR(config) {
25666
26423
  titleText.textContent = translateService.translate(titleKey !== null && titleKey !== void 0 ? titleKey : 'verify.unexpected');
25667
26424
  statusText.textContent = '';
25668
26425
  statusText.classList.remove('non-empty');
25669
- hintText.textContent = type.includes('Back') ? translateService.translate('verify.backSide') : translateService.translate('verify.frontSide');
26426
+ hintText.textContent = type.includes('Back') ? translateService.translate('sdk.general.backSide') : translateService.translate('sdk.general.frontSide');
25670
26427
  const _typeConfirmTextMap = {
25671
- EAuthMeCardClass_Passport: 'verify.confirmPassportFrontSide',
25672
- EAuthMeCardClass_TWN_IDCard_Front: 'verify.confirmIdCardFront',
25673
- EAuthMeCardClass_TWN_IDCard_Back: 'verify.confirmIdCardBack',
25674
- EAuthMeCardClass_TWN_DriverLicense_Front: 'verify.confirmLicenseFront',
25675
- EAuthMeCardClass_TWN_DriverLicense_Back: 'verify.confirmLicenseBack',
25676
- EAuthMeCardClass_TWN_ResidentCard_Front: 'verify.confirmResidentCardFrontSide',
25677
- EAuthMeCardClass_TWN_ResidentCard_Back: 'verify.confirmResidentCardBackSide',
25678
- EAuthMeCardClass_TWN_HealthCard_Front: 'verify.confirmHealthFront',
26428
+ EAuthMeCardClass_Passport: 'sdk.ocr.verify.confirmPassportFront',
26429
+ EAuthMeCardClass_TWN_IDCard_Front: 'sdk.ocr.verify.confirmIdCardFront',
26430
+ EAuthMeCardClass_TWN_IDCard_Back: 'sdk.ocr.verify.confirmIdCardBack',
26431
+ EAuthMeCardClass_TWN_DriverLicense_Front: 'sdk.ocr.verify.confirmDriverFront',
26432
+ EAuthMeCardClass_TWN_DriverLicense_Back: 'sdk.ocr.verify.confirmDriverBack',
26433
+ EAuthMeCardClass_TWN_ResidentCard_Front: 'sdk.ocr.verify.confirmResidentCardFront',
26434
+ EAuthMeCardClass_TWN_ResidentCard_Back: 'sdk.ocr.verify.confirmResidentCardBack',
26435
+ EAuthMeCardClass_TWN_HealthCard_Front: 'sdk.ocr.verify.confirmHealthCardFront',
25679
26436
  EAuthMeCardClass_TWN_VehiclesLicense_Front: 'verify.confirmVehiclesLicenseFrontSide'
26437
+ // EAuthMeCardClass_TWN_IDCard_Thickness: 'verify.confirmIdCardThickness',
25680
26438
  };
26439
+
25681
26440
  const typeConfirmTextMap = _typeConfirmTextMap;
25682
26441
  let titleConfirmKey = typeConfirmTextMap[type];
25683
26442
  if (titleConfirmKey == null) {
@@ -25687,33 +26446,38 @@ function startOCR(config) {
25687
26446
  }
25688
26447
  function setHeaderByType(type) {
25689
26448
  const typeMap = {
25690
- EAuthMeCardClass_Passport: 'verify.header.passport',
25691
- EAuthMeCardClass_TWN_IDCard_Front: 'verify.header.idCard',
25692
- EAuthMeCardClass_TWN_IDCard_Back: 'verify.header.idCard',
25693
- EAuthMeCardClass_TWN_DriverLicense_Front: 'verify.header.driverLicense',
25694
- EAuthMeCardClass_TWN_DriverLicense_Back: 'verify.header.driverLicense',
25695
- EAuthMeCardClass_TWN_HealthCard_Front: 'verify.header.healthCard'
26449
+ EAuthMeCardClass_Passport: 'sdk.verify.passport.header',
26450
+ EAuthMeCardClass_TWN_IDCard_Front: 'sdk.verify.idCard.header',
26451
+ EAuthMeCardClass_TWN_IDCard_Back: 'sdk.verify.idCard.header',
26452
+ EAuthMeCardClass_TWN_DriverLicense_Front: 'sdk.verify.driverLicense.header',
26453
+ EAuthMeCardClass_TWN_DriverLicense_Back: 'sdk.verify.driverLicense.header',
26454
+ EAuthMeCardClass_TWN_HealthCard_Front: 'sdk.verify.healthCard.header',
26455
+ EAuthMeCardClass_JPN_IDCard_Front: 'sdk.verify.myNumberCard.header',
26456
+ EAuthMeCardClass_JPN_IDCard_Back: 'sdk.verify.myNumberCard.header',
26457
+ EAuthMeCardClass_JPN_IDCard_Thickness: 'sdk.verify.myNumberCard.header',
26458
+ EAuthMeCardClass_TWN_ResidentCard_Front: 'sdk.verify.residentCard.header',
26459
+ EAuthMeCardClass_TWN_ResidentCard_Back: 'sdk.verify.residentCard.header'
25696
26460
  };
25697
26461
  if (type.includes('Health') || type.includes('Passport')) {
25698
- setHeaderText(translateService.translate(typeMap[type]), translateService.translate('verify.header.step', {
26462
+ setHeaderText(translateService.translate(typeMap[type]), translateService.translate('sdk.verify.header.stepper', {
25699
26463
  current: 1,
25700
26464
  total: 1
25701
26465
  }));
25702
26466
  } else {
25703
26467
  if (type.includes('Front')) {
25704
- const stepNow = type.includes('TWN_IDCard') ? translateService.translate('verify.header.step', {
26468
+ const stepNow = type.includes('TWN_IDCard') ? translateService.translate('sdk.verify.header.stepper', {
25705
26469
  current: 2,
25706
26470
  total: 3
25707
- }) : translateService.translate('verify.header.step', {
26471
+ }) : translateService.translate('sdk.verify.header.stepper', {
25708
26472
  current: 1,
25709
26473
  total: 2
25710
26474
  });
25711
26475
  setHeaderText(translateService.translate(typeMap[type]), stepNow);
25712
26476
  } else {
25713
- const stepNow = type.includes('TWN_IDCard') ? translateService.translate('verify.header.step', {
26477
+ const stepNow = type.includes('TWN_IDCard') ? translateService.translate('sdk.verify.header.stepper', {
25714
26478
  current: 3,
25715
26479
  total: 3
25716
- }) : translateService.translate('verify.header.step', {
26480
+ }) : translateService.translate('sdk.verify.header.stepper', {
25717
26481
  current: 2,
25718
26482
  total: 2
25719
26483
  });
@@ -25722,6 +26486,7 @@ function startOCR(config) {
25722
26486
  }
25723
26487
  }
25724
26488
  function setCardSize(type) {
26489
+ var _a, _b;
25725
26490
  let CARD_SIZE;
25726
26491
  (function (CARD_SIZE) {
25727
26492
  CARD_SIZE[CARD_SIZE["MAX_WIDTH_RATE"] = 0.95] = "MAX_WIDTH_RATE";
@@ -25751,7 +26516,8 @@ function startOCR(config) {
25751
26516
  width,
25752
26517
  height
25753
26518
  };
25754
- statusTextPanel.style.top = `${windowHeight / 2 + height / 2}px`;
26519
+ const textTopRef = ((_a = document.querySelector('.video-container')) === null || _a === void 0 ? void 0 : _a.clientHeight) || windowHeight;
26520
+ (_b = document.querySelector('.status')) === null || _b === void 0 ? void 0 : _b.setAttribute('style', `top: ${textTopRef / 2 + height / 2}px`);
25755
26521
  scanAnimationContainer.style.width = `${width + scanPadding}px`;
25756
26522
  scanAnimationContainer.style.height = `${height + scanPadding}px`;
25757
26523
  }
@@ -25791,7 +26557,7 @@ function startOCR(config) {
25791
26557
  } = renderCameraSwitch({
25792
26558
  container: videoContainer
25793
26559
  });
25794
- cameraHint.textContent = translateService.translate('verify.switchCamera');
26560
+ cameraHint.innerHTML = translateService.translate('sdk.general.verify.error.switchCamera');
25795
26561
  cameraSwitchContainer.addEventListener('click', () => __awaiter(this, void 0, void 0, function* () {
25796
26562
  const _nextCameraNumber = parseInt(switchText.textContent) + 1;
25797
26563
  const nextCameraNumber = _nextCameraNumber > backCameraList.length ? 1 : _nextCameraNumber;
@@ -25803,13 +26569,19 @@ function startOCR(config) {
25803
26569
  switchText.textContent = '1';
25804
26570
  cameraSwitchShow = true;
25805
26571
  }
26572
+ function hideCameraSwitchButton() {
26573
+ var _a, _b;
26574
+ cameraSwitchShow = false;
26575
+ (_a = document.querySelector('.camera-switch-container')) === null || _a === void 0 ? void 0 : _a.remove();
26576
+ (_b = document.querySelector('.camera-switch__hint')) === null || _b === void 0 ? void 0 : _b.remove();
26577
+ }
25806
26578
  function cardRotateByStage(stage, mandatoryRotate = false, point) {
25807
26579
  return __awaiter(this, void 0, void 0, function* () {
25808
26580
  if ((stage === EAuthMeIDCardAntiFraudStage.Done || stage === currentAntiFraudStage) && mandatoryRotate === false) return;
25809
26581
  const cardMatchROI = point ? point : config.getCardMatchROI ? yield config.getCardMatchROI() : null;
25810
- if (!cardMatchROI) throw new AuthmeError(ErrorCode.SDK_INTERNAL_ERROR, 'getCardMatchROI is null');
26582
+ if (!cardMatchROI || cardMatchROI.length == 0) throw new AuthmeError(ErrorCode.SDK_INTERNAL_ERROR, 'getCardMatchROI is null');
25811
26583
  setCardBorderColor('error');
25812
- setCardPoints(cardMatchROI, facingMode === 'front');
26584
+ setCardPoints(cardMatchROI, config.ocrConfig.needAntiFraud, facingMode === 'front');
25813
26585
  setHintTextLocale();
25814
26586
  currentAntiFraudStage = stage;
25815
26587
  if (isTutorialFinish && !getIsRotateCardAnimating() || mandatoryRotate) {
@@ -25821,16 +26593,16 @@ function startOCR(config) {
25821
26593
  function cardRotateTextProcess(stage) {
25822
26594
  switch (stage) {
25823
26595
  case EAuthMeIDCardAntiFraudStage.Left:
25824
- facingMode === 'front' ? setTopText(translateService.translate('verify.idCardFlipRight')) : setTopText(translateService.translate('verify.idCardFlipLeft'));
26596
+ facingMode === 'front' ? setTopText(translateService.translate('sdk.guard.verify.guide.idCardFlip')) : setTopText(translateService.translate('sdk.guard.verify.guide.idCardFlip'));
25825
26597
  break;
25826
26598
  case EAuthMeIDCardAntiFraudStage.Right:
25827
- facingMode === 'front' ? setTopText(translateService.translate('verify.idCardFlipLeft')) : setTopText(translateService.translate('verify.idCardFlipRight'));
26599
+ facingMode === 'front' ? setTopText(translateService.translate('sdk.guard.verify.guide.idCardFlip')) : setTopText(translateService.translate('sdk.guard.verify.guide.idCardFlip'));
25828
26600
  break;
25829
26601
  case EAuthMeIDCardAntiFraudStage.Up:
25830
- setTopText(translateService.translate('verify.idCardFlipUp'));
26602
+ setTopText(translateService.translate('sdk.guard.verify.guide.idCardFlip'));
25831
26603
  break;
25832
26604
  case EAuthMeIDCardAntiFraudStage.Down:
25833
- setTopText(translateService.translate('verify.idCardFlipDown'));
26605
+ setTopText(translateService.translate('sdk.guard.verify.guide.idCardFlip'));
25834
26606
  break;
25835
26607
  }
25836
26608
  }
@@ -25878,10 +26650,10 @@ function startOCR(config) {
25878
26650
  }
25879
26651
  function setHintTextLocale() {
25880
26652
  var _a;
25881
- const TITLE_TOP_RANGE = 40;
26653
+ const TITLE_TOP_RANGE = 100;
25882
26654
  const ORIGINAL_TITLE_CLIENT_HEIGHT = window.getComputedStyle(titleText).getPropertyValue('line-height');
25883
26655
  const titleClientHight = parseInt(ORIGINAL_TITLE_CLIENT_HEIGHT.replace('px', ''));
25884
- const maskRect = (_a = document.querySelector('#authme-mask-svg path')) === null || _a === void 0 ? void 0 : _a.getClientRects();
26656
+ const maskRect = (_a = document.querySelector('#authme_frame_border path')) === null || _a === void 0 ? void 0 : _a.getClientRects();
25885
26657
  if (!maskRect || (maskRect === null || maskRect === void 0 ? void 0 : maskRect.length) <= 0) return;
25886
26658
  titleTextPanel.style.top = `${maskRect[0].top - TITLE_TOP_RANGE - titleClientHight}px`;
25887
26659
  }
@@ -25911,7 +26683,7 @@ const renderExtraUI = config => {
25911
26683
  config.videoContainer.appendChild(titleTextPanel);
25912
26684
  config.videoContainer.appendChild(cardborderContainer);
25913
26685
  // Set init text
25914
- titleText.textContent = translateService.translate('extra.title');
26686
+ titleText.innerHTML = translateService.translate('extra.title');
25915
26687
  // Picture
25916
26688
  const confirmImageContainer = document.createElement('div');
25917
26689
  confirmImageContainer.classList.add('confirm-image-container', 'confirm-image-container-extra');
@@ -25932,10 +26704,10 @@ const renderExtraUI = config => {
25932
26704
  imageFooter.classList.add('image-footer');
25933
26705
  const retryBtn = document.createElement('button');
25934
26706
  retryBtn.classList.add('btn-retry');
25935
- retryBtn.textContent = translateService.translate('verify.retryBtn');
26707
+ retryBtn.textContent = translateService.translate('sdk.ocr.verify.retry');
25936
26708
  const completeBtn = document.createElement('button');
25937
26709
  completeBtn.classList.add('btn-complete');
25938
- completeBtn.textContent = translateService.translate('verify.clearBtn');
26710
+ completeBtn.textContent = translateService.translate('sdk.ocr.verify.clear');
25939
26711
  imageFooter.appendChild(completeBtn);
25940
26712
  imageFooter.appendChild(retryBtn);
25941
26713
  confirmImageContainer.appendChild(confirmImageWapper);
@@ -25962,7 +26734,7 @@ const renderExtraUI = config => {
25962
26734
  endBtn.textContent = translateService.translate('verify.endBtn');
25963
26735
  const continueBtn = document.createElement('button');
25964
26736
  continueBtn.classList.add('btn-continue');
25965
- continueBtn.textContent = translateService.translate('verify.continueBtn');
26737
+ continueBtn.textContent = translateService.translate('sdk.general.continue');
25966
26738
  checkOtherImageFooter.appendChild(continueBtn);
25967
26739
  checkOtherImageFooter.appendChild(endBtn);
25968
26740
  checkOtherImageContainer.appendChild(checkOtherImageWapper);
@@ -26028,7 +26800,7 @@ function startExtra(config) {
26028
26800
  const canvas = document.createElement('canvas');
26029
26801
  // Register Event
26030
26802
  const requestCamera$ = of(true).pipe(tap(() => {
26031
- startSpinner(translateService.translate('general.loading'));
26803
+ startSpinner(translateService.translate('sdk.general.loading'));
26032
26804
  }), switchMap(() => from(requestCamera({
26033
26805
  video,
26034
26806
  facingMode: 'back',
@@ -26041,7 +26813,7 @@ function startExtra(config) {
26041
26813
  stopSpinner();
26042
26814
  showElement(videoContainer);
26043
26815
  }));
26044
- fromEvent(window, 'offline').pipe(switchMap(() => asyncOnLineShowErrorMessage(translateService.translate('network.error.offline'), true)), takeUntil(unsubscribe$)).subscribe();
26816
+ fromEvent(window, 'offline').pipe(switchMap(() => asyncOnLineShowErrorMessage(translateService.translate('sdk.general.error.alert.offline'), translateService.translate('sdk.general.error.retry'), true)), takeUntil(unsubscribe$)).subscribe();
26045
26817
  fromEvent(window, 'resize').pipe(throttleTime(100), switchMap(() => getCanvasSize(video)), takeUntil(unsubscribe$)).subscribe();
26046
26818
  fromEvent(closeIcon, 'click').pipe(switchMap(() => reset()), takeUntil(unsubscribe$)).subscribe();
26047
26819
  fromEvent(pictureIcon, 'click').pipe(switchMap(() => getCanvasSize(video)), switchMap(canvasSizeInfo => from(checkConfirmImage(canvasSizeInfo)).pipe(switchMap(needRetry => needRetry ? of(true) : from(config.confirmImage(canvasSizeInfo.canvasWidth, canvasSizeInfo.canvasHeight, imageData, canvas)).pipe(map(confirmResp => !confirmResp))), tap(() => {
@@ -26061,10 +26833,10 @@ function startExtra(config) {
26061
26833
  showVideoElement();
26062
26834
  hideElement(checkOtherImageContainer);
26063
26835
  }), switchMap(needContinue => needContinue ? of(true) : reset()))), takeUntil(unsubscribe$)).subscribe();
26064
- merge(fromEvent(window, 'resize'), of(0)).pipe(map(() => window.innerWidth >= 320 && window.innerHeight >= 500), filter(x => x !== isValidScreenSize), tap(x => isValidScreenSize = x), tap(x => x ? hidePopup() : showPopup(translateService.translate('error.screenSize.title'), translateService.translate('error.screenSize.content'), false)), takeUntil(unsubscribe$)).subscribe();
26836
+ merge(fromEvent(window, 'resize'), of(0)).pipe(map(() => window.innerWidth >= 320 && window.innerHeight >= 500), filter(x => x !== isValidScreenSize), tap(x => isValidScreenSize = x), tap(x => x ? hidePopup() : showPopup(translateService.translate('sdk.general.insufficientScreen.title'), translateService.translate('sdk.general.insufficientScreen.content'), false)), takeUntil(unsubscribe$)).subscribe();
26065
26837
  // Start
26066
26838
  // headerTitle.textContent = translateService.translate(
26067
- // 'liveness.header.liveness'
26839
+ // 'sdk.liveness.detection.header'
26068
26840
  // );
26069
26841
  showElement(pictureIcon);
26070
26842
  function main() {
@@ -26133,7 +26905,7 @@ function startExtra(config) {
26133
26905
 
26134
26906
  function SendRequestWithRetry$4(promiseFactory) {
26135
26907
  return retryPromiseWithCondition(promiseFactory, () => __awaiter(this, void 0, void 0, function* () {
26136
- return asyncShowErrorMessage(getTranslateInstance().translate('verify.error.serverError'), true);
26908
+ return asyncShowErrorMessage(getTranslateInstance().translate('sdk.general.error.alert.serverError'), true);
26137
26909
  }));
26138
26910
  }
26139
26911
  class ExtraModule {
@@ -26157,7 +26929,7 @@ class ExtraModule {
26157
26929
  })
26158
26930
  }));
26159
26931
  if (resp.retry) {
26160
- yield asyncShowPopup(translateService.translate('verify.error.blur'), translateService.translate('verify.error.blurDescribe'), true);
26932
+ yield asyncShowPopup(translateService.translate('sdk.verify.error.blurRetake.title'), translateService.translate('sdk.verify.error.blurRetake.content'), true);
26161
26933
  throw 'recognition failed';
26162
26934
  }
26163
26935
  result.push(resp);
@@ -26195,7 +26967,7 @@ class ExtraModule {
26195
26967
 
26196
26968
  function SendRequestWithRetry$3(promiseFactory) {
26197
26969
  return retryPromiseWithCondition(promiseFactory, () => __awaiter(this, void 0, void 0, function* () {
26198
- return asyncShowErrorMessage(getTranslateInstance().translate('verify.error.serverError'), true);
26970
+ return asyncShowErrorMessage(getTranslateInstance().translate('sdk.general.error.alert.serverError'), true);
26199
26971
  }));
26200
26972
  }
26201
26973
  class LivenessVerifyModule {
@@ -26243,22 +27015,22 @@ class LivenessVerifyModule {
26243
27015
  return resp.parameters;
26244
27016
  } catch (e) {
26245
27017
  let error = e;
26246
- let message = getTranslateInstance().translate('verify.error.serverError');
27018
+ let message = getTranslateInstance().translate('sdk.general.error.alert.serverError');
26247
27019
  while (error instanceof AuthmeError) {
26248
27020
  error = error.cause;
26249
27021
  }
26250
27022
  switch ((_b = (_a = error === null || error === void 0 ? void 0 : error.error) === null || _a === void 0 ? void 0 : _a.error) === null || _b === void 0 ? void 0 : _b.code) {
26251
27023
  case 'AuthMe.CustomerManagementService:000111':
26252
- message = getTranslateInstance().translate('livenessVerify.error.customerNotFound');
27024
+ message = getTranslateInstance().translate('sdk.general.verify.error.clientCustomerId.notFound');
26253
27025
  break;
26254
27026
  case 'AuthMe.CustomerManagementService:000131':
26255
- message = getTranslateInstance().translate('livenessVerify.error.deactivateCustomer');
27027
+ message = getTranslateInstance().translate('sdk.general.verify.error.clientCustomerId.deactivate');
26256
27028
  break;
26257
27029
  case 'AuthMe.CustomerManagementService:000132':
26258
- message = getTranslateInstance().translate('livenessVerify.error.customerInProgress');
27030
+ message = getTranslateInstance().translate('sdk.general.verify.error.clientCustomerId.inProgress');
26259
27031
  break;
26260
27032
  case 'AuthMe.CustomerManagementService:000202':
26261
- message = getTranslateInstance().translate('livenessVerify.error.unexpectedError');
27033
+ message = getTranslateInstance().translate('sdk.general.error.unexpectedError');
26262
27034
  break;
26263
27035
  default:
26264
27036
  break;
@@ -26423,7 +27195,7 @@ class LivenessVerifyModule {
26423
27195
 
26424
27196
  function SendRequestWithRetry$2(promiseFactory) {
26425
27197
  return retryPromiseWithCondition(promiseFactory, () => __awaiter(this, void 0, void 0, function* () {
26426
- return asyncShowErrorMessage(getTranslateInstance().translate('verify.error.serverError'), true);
27198
+ return asyncShowErrorMessage(getTranslateInstance().translate('sdk.general.error.alert.serverError'), true);
26427
27199
  }));
26428
27200
  }
26429
27201
  class LivenessModule {
@@ -26451,7 +27223,7 @@ class LivenessModule {
26451
27223
  try {
26452
27224
  const result = yield firstValueFrom(startLiveness({
26453
27225
  init: () => __awaiter(this, void 0, void 0, function* () {
26454
- const resp = yield LivenessAPI.IdentityVerification.init(true);
27226
+ const resp = yield LivenessAPI.IdentityVerification.init(true, config.passive, config.compareCustomerClientId);
26455
27227
  id = resp.id;
26456
27228
  if (resp.parameters.pubKey) {
26457
27229
  yield this.fasService.setPublicKeyForJson(resp.parameters.pubKey);
@@ -26625,9 +27397,188 @@ class LivenessModule {
26625
27397
  }
26626
27398
  }
26627
27399
 
27400
+ function initFrameView(cardPoints, scanId, faceMode, scanView, cardType, cardTypeConfig, setBorderType, setCardBorderColor, setBorderSuccess) {
27401
+ return __awaiter(this, void 0, void 0, function* () {
27402
+ const scanAnimationContainer = document.querySelector('.scan');
27403
+ const successAnimationDom = document.querySelector('.success');
27404
+ document.querySelector('#authme_frame_border');
27405
+ const videoContainer = document.querySelector('.video-container');
27406
+ const windowWidth = videoContainer.offsetWidth;
27407
+ const windowHeight = videoContainer.offsetHeight;
27408
+ const lottieScanSetting = {
27409
+ scanAnimationContainer: scanAnimationContainer
27410
+ };
27411
+ const lottieSuccessSetting = {
27412
+ animationContainer: successAnimationDom
27413
+ };
27414
+ function frameImage(faceMode, zIndex, base64, color, opacity) {
27415
+ color = color !== null && color !== void 0 ? color : OcrFrame.imageColor;
27416
+ opacity = opacity !== null && opacity !== void 0 ? opacity : OcrFrame.imageOpacity;
27417
+ const rectX = cardPoints[0][0] * windowWidth;
27418
+ const rectY = cardPoints[0][1] * windowHeight;
27419
+ const rectWidth = cardPoints[1][0] * windowWidth - rectX;
27420
+ const rectHeight = cardPoints[3][1] * windowHeight - rectY;
27421
+ let domContainer = document.querySelector('#authme_frame_image');
27422
+ let domImage = document.querySelector('#authme_frame_image_svg');
27423
+ const domImageStyle = `
27424
+ width: 100%;
27425
+ height: 100%;
27426
+ background-color: ${color};
27427
+ opacity: ${opacity};
27428
+ -webkit-mask-image: url(data:image/svg+xml;base64,${base64});
27429
+ mask-image: url(data:image/svg+xml;base64,${base64});
27430
+ -webkit-mask-size: contain;
27431
+ mask-size: contain;
27432
+ mask-repeat: no-repeat no-repeat;
27433
+ mask-position: center center;
27434
+ `;
27435
+ if (!domContainer) {
27436
+ domContainer = document.createElement('div');
27437
+ domContainer.setAttribute('id', 'authme_frame_image');
27438
+ videoContainer.appendChild(domContainer);
27439
+ }
27440
+ if (!domImage) {
27441
+ domImage = document.createElement('div');
27442
+ domImage.setAttribute('id', 'authme_frame_image_svg');
27443
+ domContainer.appendChild(domImage);
27444
+ }
27445
+ if (faceMode === 'front') {
27446
+ domImage.classList.add('front');
27447
+ }
27448
+ domImage.setAttribute('style', domImageStyle);
27449
+ domImage.setAttribute('preserveAspectRatio', 'none');
27450
+ domContainer.setAttribute('style', `
27451
+ z-index: ${zIndex};
27452
+ position: absolute;
27453
+ left: ${rectX}px;
27454
+ top: ${rectY}px;
27455
+ width: ${rectWidth}px;
27456
+ height: ${rectHeight}px;
27457
+ opacity: ${opacity};
27458
+ `);
27459
+ }
27460
+ function frameText(zIndex, text, color, opacity) {
27461
+ color = color !== null && color !== void 0 ? color : OcrFrame.textColor;
27462
+ opacity = opacity !== null && opacity !== void 0 ? opacity : OcrFrame.textOpacity;
27463
+ const rectX = cardPoints[0][0] * windowWidth;
27464
+ const rectY = cardPoints[0][1] * windowHeight;
27465
+ const rectWidth = cardPoints[1][0] * windowWidth - rectX;
27466
+ const rectHeight = cardPoints[3][1] * windowHeight - rectY;
27467
+ let dom = document.querySelector('#authme_frame_text');
27468
+ if (!dom) {
27469
+ dom = document.createElement('div');
27470
+ dom.setAttribute('id', 'authme_frame_text');
27471
+ videoContainer.appendChild(dom);
27472
+ }
27473
+ dom.setAttribute('style', `
27474
+ z-index: ${zIndex};
27475
+ position: absolute;
27476
+ left: ${rectX}px;
27477
+ top: ${rectY}px;
27478
+ width: ${rectWidth}px;
27479
+ height: ${rectHeight}px;
27480
+ opacity: ${opacity};
27481
+ color: ${color};
27482
+ display: flex;
27483
+ align-items: center;
27484
+ justify-content: center;
27485
+ font-size: 60px;
27486
+ font-weight: 500;
27487
+ `);
27488
+ dom.textContent = text;
27489
+ }
27490
+ initSuccessAnimation(lottieSuccessSetting);
27491
+ const scanViewSetting = {
27492
+ document_type: '',
27493
+ border: {
27494
+ enable: true,
27495
+ type: OcrFrame.borderType,
27496
+ color: OcrFrame.borderColor,
27497
+ opacity: OcrFrame.borderOpacity
27498
+ },
27499
+ success: {
27500
+ enable: false,
27501
+ color: OcrFrame.successColor,
27502
+ opacity: 1
27503
+ },
27504
+ content: [],
27505
+ line: {
27506
+ enable: false,
27507
+ color: OcrFrame.lineColor,
27508
+ gradient: {
27509
+ enable: false,
27510
+ color: OcrFrame.lineGradient,
27511
+ opacity: OcrFrame.lineGradientOpacity
27512
+ }
27513
+ }
27514
+ };
27515
+ if (scanView) {
27516
+ Object.assign(scanViewSetting, scanView);
27517
+ }
27518
+ if (cardType.includes('Thickness')) {
27519
+ if (cardTypeConfig.mode === 'manual') {
27520
+ setBorderType({
27521
+ type: scanViewSetting.border.type,
27522
+ strokeOpacity: 0,
27523
+ color: scanViewSetting.border.color
27524
+ });
27525
+ setCardBorderColor(null);
27526
+ // success setting
27527
+ // TODO need to check the success style
27528
+ if (scanViewSetting.success.enable) {
27529
+ setBorderSuccess(scanViewSetting.success.color, scanViewSetting.success.opacity);
27530
+ }
27531
+ } else {
27532
+ setBorderType({
27533
+ type: scanViewSetting.border.type,
27534
+ strokeOpacity: 0,
27535
+ color: scanViewSetting.border.color
27536
+ });
27537
+ if (scanViewSetting.success.enable) {
27538
+ setBorderSuccess(scanViewSetting.success.color, 0);
27539
+ }
27540
+ }
27541
+ } else {
27542
+ if (scanViewSetting.border.enable) {
27543
+ setBorderType({
27544
+ type: scanViewSetting.border.type,
27545
+ strokeOpacity: scanViewSetting.border.opacity,
27546
+ color: scanViewSetting.border.color
27547
+ });
27548
+ setCardBorderColor(null);
27549
+ // success setting
27550
+ if (scanViewSetting.success.enable) {
27551
+ setBorderSuccess(scanViewSetting.success.color, scanViewSetting.success.opacity);
27552
+ }
27553
+ }
27554
+ }
27555
+ // scan setting
27556
+ if (scanViewSetting.line.enable) {
27557
+ lottieScanSetting['scanColor'] = scanViewSetting.line.color;
27558
+ if (scanViewSetting.line.gradient.enable) {
27559
+ lottieScanSetting['scanOpacity'] = scanViewSetting.line.gradient.opacity;
27560
+ lottieScanSetting['scanGradient'] = scanViewSetting.line.gradient.color;
27561
+ }
27562
+ initScanAnimation(lottieScanSetting);
27563
+ }
27564
+ // content setting
27565
+ resetFrame();
27566
+ for (let i = 0; i < scanViewSetting.content.length; i++) {
27567
+ const contentSetting = scanViewSetting.content[i];
27568
+ if (contentSetting.type === 'svg') {
27569
+ const imageData = yield initScanDocumentResourceBase64(scanId, contentSetting.content);
27570
+ frameImage(faceMode, i, imageData.data, contentSetting.color, contentSetting.opacity);
27571
+ }
27572
+ if (contentSetting.type === 'text') {
27573
+ frameText(i, contentSetting.content, contentSetting.color, contentSetting.opacity);
27574
+ }
27575
+ }
27576
+ });
27577
+ }
27578
+
26628
27579
  function SendRequestWithRetry$1(promiseFactory) {
26629
27580
  return retryPromiseWithCondition(promiseFactory, () => __awaiter(this, void 0, void 0, function* () {
26630
- return asyncShowErrorMessage(getTranslateInstance().translate('verify.error.serverError'), true);
27581
+ return asyncShowErrorMessage(getTranslateInstance().translate('sdk.general.error.alert.serverError'), true);
26631
27582
  }));
26632
27583
  }
26633
27584
  class MRZModule {
@@ -26694,7 +27645,7 @@ class MRZModule {
26694
27645
  expiredIn: resp.expiredIn
26695
27646
  });
26696
27647
  }),
26697
- ocrStart: (points, type, cardType, retry = false) => __awaiter(this, void 0, void 0, function* () {
27648
+ ocrStart: (points, type, setBorderType, setCardBorderColor, setBorderSuccess, scanAnimationContainer, successAnimationContainer, frameImage, frameText, faceMode, cardType, retry = false) => __awaiter(this, void 0, void 0, function* () {
26698
27649
  yield this.mrzService.init();
26699
27650
  yield this.mrzService.setFrameSize(frameWidth, frameHeight);
26700
27651
  yield this.mrzService.setMaskPosition(points.map(([x, y]) => [Number(x.toFixed(2)), Number(y.toFixed(2))]));
@@ -26703,7 +27654,7 @@ class MRZModule {
26703
27654
  docInfos[type].ocrImg = null;
26704
27655
  docInfos[type].ocrOriginImg = null;
26705
27656
  } else {
26706
- const resp = yield SendRequestWithRetry$1(() => initScanDocument(scanId, twoWayAuthmeCardClassMap.toServer(type)));
27657
+ const resp = yield SendRequestWithRetry$1(() => initScanDocument(scanId, cardType));
26707
27658
  if (docInfos[type]) {
26708
27659
  docInfos[type].docId = resp.scanDocumentId;
26709
27660
  } else {
@@ -26715,6 +27666,9 @@ class MRZModule {
26715
27666
  fraudResult: null
26716
27667
  };
26717
27668
  }
27669
+ if (resp.scanView) {
27670
+ initFrameView(points, scanId, faceMode, resp.scanView, cardType, '', setBorderType, setCardBorderColor, setBorderSuccess);
27671
+ }
26718
27672
  }
26719
27673
  return true;
26720
27674
  }),
@@ -26768,6 +27722,7 @@ class MRZModule {
26768
27722
  }
26769
27723
  }),
26770
27724
  cardTypes: config.cardTypes,
27725
+ cardTypeConfigs: config.cardTypeConfigs,
26771
27726
  antiFraudStart: () => __awaiter(this, void 0, void 0, function* () {
26772
27727
  throw 'MRZ Fraud Not Supported.';
26773
27728
  }),
@@ -26826,9 +27781,9 @@ function SendRequestWithRetry(promiseFactory, options = {}) {
26826
27781
  return retryPromiseWithCondition(promiseFactory, e => __awaiter(this, void 0, void 0, function* () {
26827
27782
  var _a, _b, _c;
26828
27783
  const errorParams = (options === null || options === void 0 ? void 0 : options.onErrorHandler) ? options === null || options === void 0 ? void 0 : options.onErrorHandler(e) : {};
26829
- return asyncShowErrorMessage(getTranslateInstance().translate((_a = errorParams === null || errorParams === void 0 ? void 0 : errorParams.errorText) !== null && _a !== void 0 ? _a : 'verify.error.serverError'), errorParams.showRetryButton, {
27784
+ return asyncShowErrorMessage(getTranslateInstance().translate((_a = errorParams === null || errorParams === void 0 ? void 0 : errorParams.errorText) !== null && _a !== void 0 ? _a : 'sdk.general.error.alert.serverError'), errorParams.showRetryButton, {
26830
27785
  callback: errorParams === null || errorParams === void 0 ? void 0 : errorParams.onButtonClick,
26831
- buttonText: getTranslateInstance().translate((_b = errorParams === null || errorParams === void 0 ? void 0 : errorParams.buttonText) !== null && _b !== void 0 ? _b : 'verify.error.retryBtn'),
27786
+ buttonText: getTranslateInstance().translate((_b = errorParams === null || errorParams === void 0 ? void 0 : errorParams.buttonText) !== null && _b !== void 0 ? _b : 'sdk.general.error.retry'),
26832
27787
  titleText: getTranslateInstance().translate((_c = errorParams === null || errorParams === void 0 ? void 0 : errorParams.titleText) !== null && _c !== void 0 ? _c : ''),
26833
27788
  showErrorMessageHandler: errorParams === null || errorParams === void 0 ? void 0 : errorParams.showErrorMessageHandler
26834
27789
  });
@@ -26989,7 +27944,7 @@ class OCRModule {
26989
27944
  yield this.antiFraudInstance.destroy();
26990
27945
  });
26991
27946
  }
26992
- run(config, cardTypes) {
27947
+ run(config, cardTypes, cardTypeConfigs) {
26993
27948
  return __awaiter(this, void 0, void 0, function* () {
26994
27949
  let scanId = '';
26995
27950
  let frameHeight = 0;
@@ -27035,6 +27990,7 @@ class OCRModule {
27035
27990
  const translateService = getTranslateInstance();
27036
27991
  const eventNameWrong$ = new Subject();
27037
27992
  return yield firstValueFrom(race(startOCR({
27993
+ cardTypeConfigs: cardTypeConfigs,
27038
27994
  ocrConfig: config,
27039
27995
  init: (width, height) => __awaiter(this, void 0, void 0, function* () {
27040
27996
  var _a, _b, _c, _d;
@@ -27048,9 +28004,9 @@ class OCRModule {
27048
28004
  const _error = e;
27049
28005
  if (((_c = (_b = (_a = _error === null || _error === void 0 ? void 0 : _error.cause) === null || _a === void 0 ? void 0 : _a.meta) === null || _b === void 0 ? void 0 : _b.responseContent) === null || _c === void 0 ? void 0 : _c.code) === 7) {
27050
28006
  return {
27051
- buttonText: 'verify.error.wrongEventCode.close',
27052
- titleText: 'eventName.invalid.promptTitle',
27053
- errorText: 'verify.error.wrongEventCode',
28007
+ buttonText: 'sdk.general.confirm',
28008
+ titleText: 'sdk.general.error.eventNameInvalid.title',
28009
+ errorText: 'sdk.general.error.eventNameInvalid.content',
27054
28010
  onButtonClick: () => {
27055
28011
  eventNameWrong$.next({
27056
28012
  isSuccess: false,
@@ -27087,9 +28043,8 @@ class OCRModule {
27087
28043
  expiredIn: resp.expiredIn
27088
28044
  });
27089
28045
  }),
27090
- ocrStart: (points, type, cardType, retry = false) => __awaiter(this, void 0, void 0, function* () {
27091
- const _service = type === EAuthMeCardClass$1.TWN_ResidentCard_Back // workaround: resident card need MRZ, refactor later.
27092
- ? this.residentCardMrzService : this.ocrService;
28046
+ ocrStart: (points, type, setBorderType, setCardBorderColor, setBorderSuccess, scanAnimationContainer, successAnimationContainer, frameImage, frameText, faceMode, cardType, retry = false) => __awaiter(this, void 0, void 0, function* () {
28047
+ const _service = this.ocrService;
27093
28048
  yield _service.init();
27094
28049
  yield _service.setFrameSize(frameWidth, frameHeight);
27095
28050
  yield _service.setMaskPosition(points.map(([x, y]) => [Number(x.toFixed(2)), Number(y.toFixed(2))]));
@@ -27098,6 +28053,7 @@ class OCRModule {
27098
28053
  const oldParams = yield this.ocrService.getParams();
27099
28054
  newParams[F_IMAGE_BLUE_TH] = 750;
27100
28055
  newParams['fCardMatchTh'] = 0.5;
28056
+ newParams['fImageReflectiveTriggerTh'] = 0.15;
27101
28057
  yield this.ocrService.setParams(Object.assign(Object.assign({}, oldParams), newParams));
27102
28058
  if (cardTypes.map(mapCardtypeToAuthmeClass).filter(n => n == EAuthMeCardClass$1.Unknown).length > 0) {
27103
28059
  this.ocrService.setOption({
@@ -27127,16 +28083,320 @@ class OCRModule {
27127
28083
  fraudResult: null
27128
28084
  };
27129
28085
  }
28086
+ const scanView = resp.scanView ? true : false;
28087
+ const lottieScanSetting = {
28088
+ scanAnimationContainer: scanAnimationContainer
28089
+ };
28090
+ const lottieSuccessSetting = {
28091
+ animationContainer: successAnimationContainer
28092
+ };
28093
+ initSuccessAnimation(lottieSuccessSetting);
28094
+ const scanViewSetting = {
28095
+ document_type: '',
28096
+ border: {
28097
+ enable: true,
28098
+ type: OcrFrame.borderType,
28099
+ color: OcrFrame.borderColor,
28100
+ opacity: OcrFrame.borderOpacity
28101
+ },
28102
+ success: {
28103
+ enable: true,
28104
+ color: OcrFrame.successColor,
28105
+ opacity: 1
28106
+ },
28107
+ content: [],
28108
+ line: {
28109
+ enable: true,
28110
+ color: OcrFrame.lineColor,
28111
+ gradient: {
28112
+ enable: true,
28113
+ color: OcrFrame.lineGradient,
28114
+ opacity: OcrFrame.lineGradientOpacity
28115
+ }
28116
+ }
28117
+ };
28118
+ if (scanView) {
28119
+ Object.assign(scanViewSetting, resp.scanView);
28120
+ }
28121
+ // border setting
28122
+ if (scanViewSetting.border.enable) {
28123
+ setBorderType({
28124
+ type: scanViewSetting.border.type,
28125
+ strokeOpacity: scanViewSetting.border.opacity,
28126
+ color: scanViewSetting.border.color
28127
+ });
28128
+ setCardBorderColor(null);
28129
+ // success setting
28130
+ if (scanViewSetting.success.enable) {
28131
+ setBorderSuccess(scanViewSetting.success.color, scanViewSetting.success.opacity);
28132
+ }
28133
+ }
28134
+ // scan setting
28135
+ if (scanViewSetting.line.enable) {
28136
+ lottieScanSetting['scanColor'] = scanViewSetting.line.color;
28137
+ if (scanViewSetting.line.gradient.enable) {
28138
+ lottieScanSetting['scanOpacity'] = scanViewSetting.line.gradient.opacity;
28139
+ lottieScanSetting['scanGradient'] = scanViewSetting.line.gradient.color;
28140
+ }
28141
+ initScanAnimation(lottieScanSetting);
28142
+ }
28143
+ // content setting
28144
+ resetFrame();
28145
+ for (let i = 0; i < scanViewSetting.content.length; i++) {
28146
+ const contentSetting = scanViewSetting.content[i];
28147
+ if (contentSetting.type === 'svg') {
28148
+ const imageData = yield initScanDocumentResourceBase64(scanId, contentSetting.content);
28149
+ frameImage(faceMode, i, imageData.data, contentSetting.color, contentSetting.opacity);
28150
+ }
28151
+ if (contentSetting.type === 'text') {
28152
+ frameText(i, contentSetting.content, contentSetting.color, contentSetting.opacity);
28153
+ }
28154
+ }
27130
28155
  }
27131
28156
  return true;
27132
28157
  }),
28158
+ thicknessStart: (points, type, setBorderType, setCardBorderColor, setBorderSuccess, scanAnimationContainer, successAnimationContainer, frameImage, frameText, faceMode, cardType, cardTypeConfig, retry = false) => __awaiter(this, void 0, void 0, function* () {
28159
+ const _service = this.antiFraudInstance;
28160
+ yield _service.init();
28161
+ yield _service.setFrameSize(frameWidth, frameHeight);
28162
+ yield _service.setMaskPosition(points.map(([x, y]) => [Number(x.toFixed(2)), Number(y.toFixed(2))]));
28163
+ const newParams = {};
28164
+ const oldParams = yield _service.getParams();
28165
+ if (config.antiFraudIMetalTagValidCountTh !== false) newParams['iMetalTagValidCountTh'] = config.antiFraudIMetalTagValidCountTh;
28166
+ newParams['timeoutSec'] = 1000;
28167
+ newParams['fCardMatchTh'] = 0.5;
28168
+ newParams['fImageReflectiveTriggerTh'] = 0.15;
28169
+ newParams['fImageThicknessTh'] = 0.3;
28170
+ newParams['fCardDeformationTh'] = 12;
28171
+ yield _service.setParams(Object.assign(Object.assign({}, oldParams), newParams));
28172
+ _service.setOption({
28173
+ key: 'thickness_detector',
28174
+ value: 'enable'
28175
+ });
28176
+ _service.setOption({
28177
+ key: 'ignore_card_type_checking',
28178
+ value: 'enable'
28179
+ });
28180
+ yield _service.setStage([EAuthMeIDCardAntiFraudStage$1.Down]);
28181
+ yield _service.startSession();
28182
+ let thicknessWelcomeSetting = thicknessDefaultConfig.thicknessWelcomeSetting;
28183
+ if (retry) {
28184
+ docInfos[cardType].ocrImg = null;
28185
+ docInfos[cardType].ocrOriginImg = null;
28186
+ } else {
28187
+ const resp = yield SendRequestWithRetry(() => initScanDocument(scanId, cardType));
28188
+ if (docInfos[cardType]) {
28189
+ docInfos[cardType].docId = resp.scanDocumentId;
28190
+ } else {
28191
+ docInfos[cardType] = {
28192
+ docId: resp.scanDocumentId,
28193
+ ocrImg: null,
28194
+ ocrOriginImg: null,
28195
+ fraudOriginImg: null,
28196
+ fraudResult: null
28197
+ };
28198
+ }
28199
+ // TODO assign
28200
+ if (resp.welcome) {
28201
+ thicknessWelcomeSetting = resp.welcome;
28202
+ } else {
28203
+ thicknessWelcomeSetting.title.text = translateService.translate(thicknessWelcomeSetting.title.text);
28204
+ thicknessWelcomeSetting.subtitle.text = translateService.translate(thicknessWelcomeSetting.subtitle.text);
28205
+ thicknessWelcomeSetting.content.text = translateService.translate(thicknessWelcomeSetting.content.text);
28206
+ }
28207
+ const scanView = resp.scanView ? true : false;
28208
+ const lottieScanSetting = {
28209
+ scanAnimationContainer: scanAnimationContainer
28210
+ };
28211
+ const lottieSuccessSetting = {
28212
+ animationContainer: successAnimationContainer
28213
+ };
28214
+ initSuccessAnimation(lottieSuccessSetting);
28215
+ const scanViewSetting = {
28216
+ document_type: '',
28217
+ border: {
28218
+ enable: true,
28219
+ type: OcrFrame.borderType,
28220
+ color: OcrFrame.borderColor,
28221
+ opacity: OcrFrame.borderOpacity
28222
+ },
28223
+ success: {
28224
+ enable: false,
28225
+ color: OcrFrame.successColor,
28226
+ opacity: 1
28227
+ },
28228
+ content: [],
28229
+ line: {
28230
+ enable: false,
28231
+ color: OcrFrame.lineColor,
28232
+ gradient: {
28233
+ enable: false,
28234
+ color: OcrFrame.lineGradient,
28235
+ opacity: OcrFrame.lineGradientOpacity
28236
+ }
28237
+ }
28238
+ };
28239
+ if (scanView) {
28240
+ Object.assign(scanViewSetting, resp.scanView);
28241
+ }
28242
+ // TODO for test, remove for prod
28243
+ // my number card
28244
+ //
28245
+ // if (cardType === 'JPN_IDCard_Thickness') {
28246
+ // frameImage(
28247
+ // faceMode,
28248
+ // 1,
28249
+ // 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI2LjIuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IuWcluWxpF8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB2aWV3Qm94PSIwIDAgMzM5IDIyMC40IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAzMzkgMjIwLjQ7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5zdDB7b3BhY2l0eTowLjQ7ZmlsbDojRkZGRkZGO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyAgICA7fQoJLnN0MXtmaWxsOm5vbmU7c3Ryb2tlOiNGRkZGRkY7c3Ryb2tlLXdpZHRoOjI7fQoJLnN0MntmaWxsOm5vbmU7c3Ryb2tlOiNGRkZGRkY7c3Ryb2tlLXdpZHRoOjEuNTt9Cgkuc3Qze29wYWNpdHk6MC4yO2ZpbGw6I0ZGRkZGRjtlbmFibGUtYmFja2dyb3VuZDpuZXcgICAgO30KCS5zdDR7b3BhY2l0eTowLjU7ZmlsbDojRkZGRkZGO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyAgICA7fQoJLnN0NXtmaWxsOm5vbmU7c3Ryb2tlOiNGRkZGRkY7c3Ryb2tlLXdpZHRoOjIuOTIwMjt9Cjwvc3R5bGU+CjxnPgoJPGc+CgkJPHBhdGggY2xhc3M9InN0MCIgZD0iTTExLDE3LjVoODhjMS4xLDAsMiwwLjksMiwydjEzYzAsMS4xLTAuOSwyLTIsMkgxMWMtMS4xLDAtMi0wLjktMi0ydi0xM0M5LDE4LjQsOS45LDE3LjUsMTEsMTcuNXoiLz4KCQk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTEsNDIuNWgyMThjMS4xLDAsMiwwLjksMiwydjEzYzAsMS4xLTAuOSwyLTIsMkgxMWMtMS4xLDAtMi0wLjktMi0ydi0xM0M5LDQzLjQsOS45LDQyLjUsMTEsNDIuNXoiLz4KCQk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTIyLDc3LjVoMjA2YzEuMSwwLDIsMC45LDIsMnY5YzAsMS4xLTAuOSwyLTIsMkgxMjJjLTEuMSwwLTItMC45LTItMnYtOUMxMjAsNzguNCwxMjAuOSw3Ny41LDEyMiw3Ny41eiIvPgoJCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0yODMsNTkuNWg0MWMxLjEsMCwyLDAuOSwyLDJ2OWMwLDEuMS0wLjksMi0yLDJoLTQxYy0xLjEsMC0yLTAuOS0yLTJ2LTlDMjgxLDYwLjQsMjgxLjksNTkuNSwyODMsNTkuNXoiLz4KCQk8cGF0aCBjbGFzcz0ic3QxIiBkPSJNMjk5LDE1LjVoMjNjMy45LDAsNywzLjEsNyw3djI1YzAsMy45LTMuMSw3LTcsN2gtMjNjLTMuOSwwLTctMy4xLTctN3YtMjVDMjkyLDE4LjcsMjk1LjIsMTUuNSwyOTksMTUuNXoiLz4KCQk8cGF0aCBjbGFzcz0ic3QyIiBkPSJNMTIsOC41aDMxNWM1LjUsMCwxMCw0LjUsMTAsMTB2MTkwYzAsNS41LTQuNSwxMC0xMCwxMEgxMmMtNS41LDAtMTAtNC41LTEwLTEwdi0xOTBDMiwxMyw2LjUsOC41LDEyLDguNXoiLz4KCQk8cGF0aCBjbGFzcz0ic3QzIiBkPSJNMTEsNjkuNWg5MGMxLjEsMCwyLDAuOSwyLDJ2MTE1YzAsMS4xLTAuOSwyLTIsMkgxMWMtMS4xLDAtMi0wLjktMi0ydi0xMTVDOSw3MC40LDkuOSw2OS41LDExLDY5LjV6Ii8+CgkJPHBhdGggY2xhc3M9InN0NCIgZD0iTTEwLDE4OC41di04LjJjMCwwLDI1LjEtNS4zLDI4LjItMTNsMy4xLTcuN2MwLDAtOC4zLTcuMS04LjktMTcuN2MwLDAtMy4xLDAuOS00LTkuN3MyLjItNy43LDIuMi03LjcKCQkJcy0xLjktMTQuNywwLTE4LjljMS45LTQuMSwwLjktMTUuNiwyMi4yLTIxLjJDNzQsNzksODEuMSw5Ni43LDgxLjEsOTYuN3MzLjcsMi40LDQuMyw4LjVjMC42LDYuMiwwLjksMTkuMiwwLjksMTkuMgoJCQlzMy40LTAuOSwyLjgsNWMtMC42LDUuOS0zLjEsMTMuOC01LjUsMTNjMCwwLTEuMiwxMy4zLTgsMTUuNmMwLDAsMS41LDEzLDkuNSwxNS4zczE4LDYuMiwxOCw2LjJ2OUwxMCwxODguNUwxMCwxODguNXoiLz4KCQk8cGF0aCBjbGFzcz0ic3QxIiBkPSJNMTEsNzAuNWg5MGMwLjYsMCwxLDAuNCwxLDF2MTE1YzAsMC42LTAuNCwxLTEsMUgxMWMtMC42LDAtMS0wLjQtMS0xdi0xMTVDMTAsNzEsMTAuNSw3MC41LDExLDcwLjV6Ii8+CgkJPHBhdGggY2xhc3M9InN0MSIgZD0iTTEyMSwxMTguNWMwLTAuNiwwLjQtMSwxLTFoMjA2YzAuNiwwLDEsMC40LDEsMXY1OWMwLDAuNi0wLjQsMS0xLDFIMTIyYy0wLjYsMC0xLTAuNC0xLTFWMTE4LjV6Ii8+CgkJPHBhdGggY2xhc3M9InN0MSIgZD0iTTIxMyw5OS41YzAtMC42LDAuNC0xLDEtMWgxMTRjMC42LDAsMSwwLjQsMSwxdjEyYzAsMC42LTAuNCwxLTEsMUgyMTRjLTAuNiwwLTEtMC40LTEtMVY5OS41eiIvPgoJCTxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0xMjEsMTMwLjVoMjA4Ii8+CgkJPGxpbmUgY2xhc3M9InN0MSIgeDE9IjEyMSIgeTE9IjE0Ni41IiB4Mj0iMzI5IiB5Mj0iMTQ2LjUiLz4KCQk8bGluZSBjbGFzcz0ic3QxIiB4MT0iMTIxIiB5MT0iMTYyLjUiIHgyPSIzMzAiIHkyPSIxNjIuNSIvPgoJCTxsaW5lIGNsYXNzPSJzdDEiIHgxPSIyNDciIHkxPSI5OC41IiB4Mj0iMjQ3IiB5Mj0iMTEyLjUiLz4KCTwvZz4KCTxwYXRoIGNsYXNzPSJzdDUiIGQ9Ik0xMS41LDEuOWgzMTZjNS41LDAsMTAsNC40LDEwLDkuOHYxOTcuMWMwLDUuNC00LjUsOS44LTEwLDkuOGgtMzE2Yy01LjUsMC0xMC00LjQtMTAtOS44VjExLjYKCQlDMS41LDYuMyw2LDEuOSwxMS41LDEuOXoiLz4KPC9nPgo8L3N2Zz4K',
28250
+ // '#fff',
28251
+ // 1
28252
+ // );
28253
+ // }
28254
+ //
28255
+ // // driver
28256
+ //
28257
+ // if (cardType === 'JPN_DriverLicense_Thickness') {
28258
+ // frameImage(
28259
+ // faceMode,
28260
+ // 1,
28261
+ // 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI2LjIuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IuWcluWxpF8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB2aWV3Qm94PSIwIDAgMzM5IDIyMC40IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAzMzkgMjIwLjQ7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5zdDB7b3BhY2l0eTowLjI7ZmlsbDojRkZGRkZGO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyAgICA7fQoJLnN0MXtmaWxsOm5vbmU7c3Ryb2tlOiNGRkZGRkY7c3Ryb2tlLXdpZHRoOjI7fQoJLnN0MntvcGFjaXR5OjAuNDtmaWxsOiNGRkZGRkY7ZW5hYmxlLWJhY2tncm91bmQ6bmV3ICAgIDt9Cgkuc3Qze29wYWNpdHk6MC41O2ZpbGw6I0ZGRkZGRjtlbmFibGUtYmFja2dyb3VuZDpuZXcgICAgO30KCS5zdDR7ZmlsbDpub25lO3N0cm9rZTojRkZGRkZGO3N0cm9rZS13aWR0aDoxLjU7fQoJLnN0NXtmaWxsOm5vbmU7c3Ryb2tlOiNGRkZGRkY7c3Ryb2tlLXdpZHRoOjIuOTIwMjt9Cjwvc3R5bGU+CjxnPgoJPGc+CgkJPHBhdGggY2xhc3M9InN0MCIgZD0iTTIzMi41LDY1LjVoOTFjMS4xLDAsMiwwLjksMiwydjExOWMwLDEuMS0wLjksMi0yLDJoLTkxYy0xLjEsMC0yLTAuOS0yLTJ2LTExOQoJCQlDMjMwLjUsNjYuNCwyMzEuNCw2NS41LDIzMi41LDY1LjV6Ii8+CgkJPHBhdGggY2xhc3M9InN0MSIgZD0iTTIzMi41LDY2LjVoOTFjMC42LDAsMSwwLjQsMSwxdjExOWMwLDAuNi0wLjQsMS0xLDFoLTkxYy0wLjYsMC0xLTAuNC0xLTF2LTExOUMyMzEuNSw2NywyMzIsNjYuNSwyMzIuNSw2Ni41CgkJCXoiLz4KCQk8cGF0aCBjbGFzcz0ic3QxIiBkPSJNMjAuNSw1MC41aDI5OGMzLjksMCw3LDMuMSw3LDd2MTQ0YzAsMy45LTMuMSw3LTcsN2gtMjk4Yy0zLjksMC03LTMuMS03LTd2LTE0NAoJCQlDMTMuNSw1My43LDE2LjcsNTAuNSwyMC41LDUwLjV6Ii8+CgkJPHBhdGggY2xhc3M9InN0MSIgZD0iTTIxLDE3LjVoMjk3YzQuMSwwLDcuNSwzLjQsNy41LDcuNWwwLDBjMCw0LjEtMy40LDcuNS03LjUsNy41SDIxYy00LjEsMC03LjUtMy40LTcuNS03LjVsMCwwCgkJCUMxMy41LDIwLjksMTYuOSwxNy41LDIxLDE3LjV6Ii8+CgkJPGxpbmUgY2xhc3M9InN0MSIgeDE9IjM4LjUiIHkxPSIxNi41IiB4Mj0iMzguNSIgeTI9IjMyLjUiLz4KCQk8bGluZSBjbGFzcz0ic3QxIiB4MT0iMjEyLjciIHkxPSIxNy41IiB4Mj0iMjEyLjciIHkyPSIzMy41Ii8+CgkJPGxpbmUgY2xhc3M9InN0MSIgeDE9IjEyLjUiIHkxPSI2NC41IiB4Mj0iMzI2LjUiIHkyPSI2NC41Ii8+CgkJPGxpbmUgY2xhc3M9InN0MSIgeDE9IjEyLjUiIHkxPSI4MC41IiB4Mj0iMjI3LjUiIHkyPSI4MC41Ii8+CgkJPHJlY3QgeD0iMTIuNSIgeT0iODEuNSIgY2xhc3M9InN0MiIgd2lkdGg9IjIwMSIgaGVpZ2h0PSIyMCIvPgoJCTxyZWN0IHg9IjEyMi41IiB5PSIxNjguNSIgY2xhc3M9InN0MSIgd2lkdGg9Ijg4IiBoZWlnaHQ9IjM2Ii8+CgkJPGxpbmUgY2xhc3M9InN0MSIgeDE9IjEzMy41IiB5MT0iMTg1LjUiIHgyPSIyMTEuNSIgeTI9IjE4NS41Ii8+CgkJPGxpbmUgY2xhc3M9InN0MSIgeDE9IjEzNC41IiB5MT0iMTY3LjUiIHgyPSIxMzQuNSIgeTI9IjIwMy41Ii8+CgkJPGxpbmUgY2xhc3M9InN0MSIgeDE9IjE0NS41IiB5MT0iMTY3LjUiIHgyPSIxNDUuNSIgeTI9IjIwMy41Ii8+CgkJPGxpbmUgY2xhc3M9InN0MSIgeDE9IjE3OC41IiB5MT0iMTY3LjUiIHgyPSIxNzguNSIgeTI9IjIwMy41Ii8+CgkJPGxpbmUgY2xhc3M9InN0MSIgeDE9IjE4OS41IiB5MT0iMTY3LjUiIHgyPSIxODkuNSIgeTI9IjIwMy41Ii8+CgkJPGxpbmUgY2xhc3M9InN0MSIgeDE9IjIwMC41IiB5MT0iMTY3LjUiIHgyPSIyMDAuNSIgeTI9IjIwMy41Ii8+CgkJPGxpbmUgY2xhc3M9InN0MSIgeDE9IjE1Ni41IiB5MT0iMTY3LjUiIHgyPSIxNTYuNSIgeTI9IjIwMy41Ii8+CgkJPGxpbmUgY2xhc3M9InN0MSIgeDE9IjE2Ny41IiB5MT0iMTY3LjUiIHgyPSIxNjcuNSIgeTI9IjIwMy41Ii8+CgkJPHBhdGggY2xhc3M9InN0MyIgZD0iTTIzMS41LDE4Ny41di04LjJjMCwwLDI1LjEtNS4zLDI4LjItMTNsMy4xLTcuN2MwLDAtOC4zLTcuMS04LjktMTcuN2MwLDAtMy4xLDAuOS00LTkuNwoJCQljLTAuOS0xMC42LDIuMi03LjcsMi4yLTcuN3MtMS45LTE0LjcsMC0xOC45YzEuOS00LjEsMC45LTE1LjYsMjIuMi0yMS4yYzIxLjMtNS42LDI4LjMsMTIuMSwyOC4zLDEyLjFzMy43LDIuNCw0LjMsOC41CgkJCWMwLjYsNi4yLDAuOSwxOS4yLDAuOSwxOS4yczMuNC0wLjksMi44LDVjLTAuNiw1LjktMy4xLDEzLjgtNS41LDEzYzAsMC0xLjIsMTMuMy04LDE1LjZjMCwwLDEuNSwxMyw5LjUsMTUuM2M4LDIuNCwxOCw2LjIsMTgsNi4yCgkJCXY5TDIzMS41LDE4Ny41TDIzMS41LDE4Ny41eiIvPgoJCTxwYXRoIGNsYXNzPSJzdDQiIGQ9Ik0xMS41LDguNWgzMTZjNS41LDAsMTAsNC41LDEwLDEwdjE5MGMwLDUuNS00LjUsMTAtMTAsMTBoLTMxNmMtNS41LDAtMTAtNC41LTEwLTEwdi0xOTAKCQkJQzEuNSwxMyw2LDguNSwxMS41LDguNXoiLz4KCTwvZz4KCTxwYXRoIGNsYXNzPSJzdDUiIGQ9Ik0xMS41LDEuOWgzMTZjNS41LDAsMTAsNC40LDEwLDkuOHYxOTcuMWMwLDUuNC00LjUsOS44LTEwLDkuOGgtMzE2Yy01LjUsMC0xMC00LjQtMTAtOS44VjExLjYKCQlDMS41LDYuMyw2LDEuOSwxMS41LDEuOXoiLz4KPC9nPgo8L3N2Zz4K',
28262
+ // '#fff',
28263
+ // 1
28264
+ // );
28265
+ // }
28266
+ //
28267
+ // // resident
28268
+ //
28269
+ // if (cardType === 'JPN_ResidentCard_Thickness') {
28270
+ // frameImage(
28271
+ // faceMode,
28272
+ // 1,
28273
+ // 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI2LjIuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IuWcluWxpF8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB2aWV3Qm94PSIwIDAgMzM5IDIyMC40IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAzMzkgMjIwLjQ7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojRkZGRkZGO3N0cm9rZS13aWR0aDoxLjU7fQoJLnN0MXtvcGFjaXR5OjAuNDtmaWxsOiNGRkZGRkY7ZW5hYmxlLWJhY2tncm91bmQ6bmV3ICAgIDt9Cgkuc3Qye29wYWNpdHk6MC4yO2ZpbGw6I0ZGRkZGRjtlbmFibGUtYmFja2dyb3VuZDpuZXcgICAgO30KCS5zdDN7ZmlsbDpub25lO3N0cm9rZTojRkZGRkZGO3N0cm9rZS13aWR0aDoyO30KCS5zdDR7b3BhY2l0eTowLjQ7ZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojRkZGRkZGO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyAgICA7fQoJLnN0NXtvcGFjaXR5OjAuNTtmaWxsOiNGRkZGRkY7ZW5hYmxlLWJhY2tncm91bmQ6bmV3ICAgIDt9Cgkuc3Q2e2ZpbGw6bm9uZTtzdHJva2U6I0ZGRkZGRjtzdHJva2Utd2lkdGg6Mi45MjAyO30KPC9zdHlsZT4KPGc+Cgk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTEuNiw5LjJoMzE2YzUuNSwwLDEwLDQuNSwxMCwxMHYxODkuN2MwLDUuNS00LjUsMTAtMTAsMTBoLTMxNmMtNS41LDAtMTAtNC41LTEwLTEwVjE5LjIKCQlDMS42LDEzLjcsNi4xLDkuMiwxMS42LDkuMnoiLz4KCTxyZWN0IHg9IjEuNiIgeT0iMTguMiIgY2xhc3M9InN0MSIgd2lkdGg9IjMzNiIgaGVpZ2h0PSIxNiIvPgoJPHBhdGggY2xhc3M9InN0MSIgZD0iTTMuNiwxOTMuOWgyNDFjMS4xLDAsMiwwLjksMiwydjEyYzAsMS4xLTAuOSwyLTIsMkgzLjZjLTEuMSwwLTItMC45LTItMnYtMTJDMS42LDE5NC44LDIuNSwxOTMuOSwzLjYsMTkzLjl6IgoJCS8+Cgk8cGF0aCBjbGFzcz0ic3QxIiBkPSJNODMuNiwxMTRoMTQ5YzEuMSwwLDIsMC45LDIsMnYyNGMwLDEuMS0wLjksMi0yLDJoLTE0OWMtMS4xLDAtMi0wLjktMi0ydi0yNEM4MS42LDExNC45LDgyLjUsMTE0LDgzLjYsMTE0eiIKCQkvPgoJPHBhdGggY2xhc3M9InN0MiIgZD0iTTIzOC42LDY0LjFoOTEuOGMxLjEsMCwyLDAuOSwyLDJ2MTE5YzAsMS4xLTAuOSwyLTIsMmgtOTEuOGMtMS4xLDAtMi0wLjktMi0ydi0xMTkKCQlDMjM2LjYsNjUsMjM3LjUsNjQuMSwyMzguNiw2NC4xeiIvPgoJPHBhdGggY2xhc3M9InN0MiIgZD0iTTIzOC42LDY0LjFoOTEuOGMxLjEsMCwyLDAuOSwyLDJ2MTE5YzAsMS4xLTAuOSwyLTIsMmgtOTEuOGMtMS4xLDAtMi0wLjktMi0ydi0xMTkKCQlDMjM2LjYsNjUsMjM3LjUsNjQuMSwyMzguNiw2NC4xeiIvPgoJPHBhdGggY2xhc3M9InN0MyIgZD0iTTIzOC42LDY1LjFoOTEuOGMwLjYsMCwxLDAuNCwxLDF2MTE5YzAsMC42LTAuNCwxLTEsMWgtOTEuOGMtMC42LDAtMS0wLjQtMS0xdi0xMTkKCQlDMjM3LjYsNjUuNSwyMzguMSw2NS4xLDIzOC42LDY1LjF6Ii8+Cgk8cGF0aCBjbGFzcz0ic3Q0IiBkPSJNMTkxLjYsMTc3LjlsLTUtNmw1LTZsMCwwbDUsNkwxOTEuNiwxNzcuOUwxOTEuNiwxNzcuOXoiLz4KCTxwYXRoIGNsYXNzPSJzdDQiIGQ9Ik0yMjYuNiwxNzcuOWwtNS02bDUtNmwwLDBsNSw2TDIyNi42LDE3Ny45TDIyNi42LDE3Ny45eiIvPgoJPHBhdGggY2xhc3M9InN0NCIgZD0iTTIxOS42LDE3MS45bDUsNmwwLDBoLTMxbDUtNmwtNS02aDMxTDIxOS42LDE3MS45eiIvPgoJPHBhdGggY2xhc3M9InN0NSIgZD0iTTIzOC42LDE4Ny4yVjE3OWMwLDAsMjUuMS01LjMsMjguMi0xM2wzLjEtNy43YzAsMC04LjMtNy4xLTguOS0xNy43YzAsMC0zLjEsMC45LTQtOS43CgkJYy0wLjktMTAuNiwyLjItNy43LDIuMi03LjdzLTEuOS0xNC43LDAtMTguOWMxLjgtNC4xLDAuOS0xNS42LDIyLjItMjEuMmMyMS4zLTUuNiwyOC4zLDEyLjEsMjguMywxMi4xczMuNywyLjQsNC4zLDguNQoJCWMwLjYsNi4yLDAuOSwxOS4yLDAuOSwxOS4yczMuNC0wLjksMi44LDVjLTAuNiw1LjktMy4xLDEzLjgtNS41LDEzYzAsMC0xLjIsMTMuMy04LDE1LjZjMCwwLDEuNSwxMyw5LjUsMTUuM2M4LDIuNCwxOCw2LjIsMTgsNi4yCgkJdjlMMjM4LjYsMTg3LjJMMjM4LjYsMTg3LjJ6Ii8+Cgk8cGF0aCBjbGFzcz0ic3Q2IiBkPSJNMTEuNiwyLjJoMzE2YzUuNSwwLDEwLDQuNCwxMCw5Ljh2MTk3LjFjMCw1LjQtNC41LDkuOC0xMCw5LjhoLTMxNmMtNS41LDAtMTAtNC40LTEwLTkuOFYxMgoJCUMxLjYsNi42LDYuMSwyLjIsMTEuNiwyLjJ6Ii8+CjwvZz4KPC9zdmc+Cg==',
28274
+ // '#fff',
28275
+ // 1
28276
+ // );
28277
+ // }
28278
+ // border setting
28279
+ if (scanViewSetting.border.enable && cardTypeConfig.mode === 'manual') {
28280
+ setBorderType({
28281
+ type: scanViewSetting.border.type,
28282
+ strokeOpacity: 0,
28283
+ color: scanViewSetting.border.color
28284
+ });
28285
+ setCardBorderColor(null);
28286
+ // success setting
28287
+ // TODO need to check the success style
28288
+ if (scanViewSetting.success.enable) {
28289
+ setBorderSuccess(scanViewSetting.success.color, scanViewSetting.success.opacity);
28290
+ }
28291
+ } else {
28292
+ setBorderType({
28293
+ type: scanViewSetting.border.type,
28294
+ strokeOpacity: 0,
28295
+ color: scanViewSetting.border.color
28296
+ });
28297
+ if (scanViewSetting.success.enable) {
28298
+ setBorderSuccess(scanViewSetting.success.color, 0);
28299
+ }
28300
+ }
28301
+ // scan setting
28302
+ if (scanViewSetting.line.enable) {
28303
+ lottieScanSetting['scanColor'] = scanViewSetting.line.color;
28304
+ if (scanViewSetting.line.gradient.enable) {
28305
+ lottieScanSetting['scanOpacity'] = scanViewSetting.line.gradient.opacity;
28306
+ lottieScanSetting['scanGradient'] = scanViewSetting.line.gradient.color;
28307
+ }
28308
+ initScanAnimation(lottieScanSetting);
28309
+ }
28310
+ // content setting
28311
+ resetFrame();
28312
+ for (let i = 0; i < scanViewSetting.content.length; i++) {
28313
+ const contentSetting = scanViewSetting.content[i];
28314
+ if (contentSetting.type === 'svg') {
28315
+ const imageData = yield initScanDocumentResourceBase64(scanId, contentSetting.content);
28316
+ frameImage(faceMode, i, imageData.data, contentSetting.color, contentSetting.opacity);
28317
+ }
28318
+ if (contentSetting.type === 'text') {
28319
+ frameText(i, contentSetting.content, contentSetting.color, contentSetting.opacity);
28320
+ }
28321
+ }
28322
+ }
28323
+ return {
28324
+ thicknessWelcomeSetting
28325
+ };
28326
+ }),
28327
+ onThicknessFrame: (data, _base64, cardType, type) => __awaiter(this, void 0, void 0, function* () {
28328
+ var _e, _f;
28329
+ nextDebugRound(type);
28330
+ const antiFraudRecogitionResult = yield functionLogging(() => __awaiter(this, void 0, void 0, function* () {
28331
+ var _g;
28332
+ return yield (_g = this.antiFraudInstance) === null || _g === void 0 ? void 0 : _g.recognition(data);
28333
+ }), {
28334
+ runFunction: RUN_FUNCTION_NAME.ANTI_FARUD_RECOGNITION,
28335
+ isAntiFraud: true
28336
+ });
28337
+ if (!cardType) {
28338
+ return antiFraudRecogitionResult;
28339
+ }
28340
+ if (this.canvas) {
28341
+ const debugData = yield (_e = this.antiFraudInstance) === null || _e === void 0 ? void 0 : _e.getDebugImageData(data);
28342
+ const ctx = this.canvas.getContext('2d');
28343
+ this.canvas.width = frameWidth;
28344
+ this.canvas.height = frameHeight;
28345
+ ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
28346
+ const imgData = ctx.createImageData(frameWidth, frameHeight);
28347
+ imgData.data.set(debugData);
28348
+ ctx.putImageData(imgData, 0, 0);
28349
+ }
28350
+ saveDebugImage({
28351
+ data,
28352
+ type,
28353
+ getDebugImageData: (_f = this.antiFraudInstance) === null || _f === void 0 ? void 0 : _f.getDebugImageData.bind(this.antiFraudInstance),
28354
+ result,
28355
+ width: frameWidth,
28356
+ height: frameHeight
28357
+ });
28358
+ const fraudOriginImg = UintArrayToBlob(frameWidth, frameHeight, data, virtualCanvas);
28359
+ const thicknessResult = Object.assign(Object.assign({}, antiFraudRecogitionResult), {
28360
+ imageData: data
28361
+ });
28362
+ if (antiFraudRecogitionResult.eStatus === EAuthMeIDCardAntiFraudStatus.Pass || antiFraudRecogitionResult.eStatus === EAuthMeIDCardAntiFraudStatus.Failed) {
28363
+ yield this.antiFraudInstance.stop();
28364
+ yield this.antiFraudInstance.destroy();
28365
+ } else if (uploadFullFrame) {
28366
+ const docId = docInfos[cardType].docId;
28367
+ const requestImg = yield encryptImageBase64(fraudOriginImg);
28368
+ pushNewDebugImage(fraudOriginImg, {
28369
+ result: thicknessResult,
28370
+ status: 'recognition',
28371
+ type: type,
28372
+ isAntiFraud: true
28373
+ });
28374
+ frameIndex++;
28375
+ backgroundRequest(() => uploadFrameBase64(docId, requestImg, frameIndex, ResourceImageType.Recognition // upload fill frame 時先使用 recognition 當成一個過渡方案, 目前後端會對這個處理存成 original image, 後續會再調整
28376
+ ));
28377
+ }
28378
+
28379
+ return thicknessResult;
28380
+ }),
28381
+ confirmThickness: (imageData, cardType) => __awaiter(this, void 0, void 0, function* () {
28382
+ const frameIndex = 0;
28383
+ const docId = docInfos[cardType].docId;
28384
+ const requestImg = yield encryptImageBase64(imageData);
28385
+ try {
28386
+ yield SendRequestWithRetry(() => uploadFrameBase64(docId, requestImg, frameIndex, ResourceImageType.Attach, undefined));
28387
+ yield SendRequestWithRetry(() => finishScanDocument(docId, {}, null));
28388
+ return true;
28389
+ } catch (error) {
28390
+ console.error('confirmThickness:', error);
28391
+ return false;
28392
+ }
28393
+ }),
27133
28394
  cardTypes,
27134
28395
  acceptTypes: cardTypes.map(mapCardtypeToAuthmeClass),
27135
28396
  recognition: (data, _base64, cardType, type) => __awaiter(this, void 0, void 0, function* () {
27136
28397
  const durationTimeRecognition = setTimeDuration(`ocr_recognition_${type}`);
27137
28398
  nextDebugRound(type);
27138
- const _service = type === EAuthMeCardClass$1.TWN_ResidentCard_Back // workaround: resident card need MRZ, refactor later.
27139
- ? this.residentCardMrzService : this.ocrService;
28399
+ const _service = this.ocrService;
27140
28400
  const result = yield functionLogging(() => __awaiter(this, void 0, void 0, function* () {
27141
28401
  return yield _service.recognition(data);
27142
28402
  }), {
@@ -27161,7 +28421,6 @@ class OCRModule {
27161
28421
  height: frameHeight
27162
28422
  });
27163
28423
  const ocrOriginImg = UintArrayToBlob(frameWidth, frameHeight, data, virtualCanvas);
27164
- // console.log("cardType:" + cardType + ":" + docInfos[cardType ?? ""]);
27165
28424
  const eClass = cardType !== null && cardType !== void 0 ? cardType : '';
27166
28425
  if (result.eStatus === EAuthMeCardOCRStatus.Pass && result.imageData && !!docInfos[eClass].docId) {
27167
28426
  const resultOcrImg = UintArrayToBlob(result.iWidth, result.iHeight, result === null || result === void 0 ? void 0 : result.imageData, virtualCanvas);
@@ -27193,7 +28452,7 @@ class OCRModule {
27193
28452
  durationTimeRecognition.end();
27194
28453
  return result;
27195
28454
  }),
27196
- confirmImage: (type, cardType) => __awaiter(this, void 0, void 0, function* () {
28455
+ confirmImage: (type, cardType, imageData) => __awaiter(this, void 0, void 0, function* () {
27197
28456
  // 將二進位圖片進行加密,目前不需要使用,不確定未來是否需要,先註解
27198
28457
  // const encryptImage = async (blob: Blob): Promise<Blob> => {
27199
28458
  // const imageArrayBuffer = await blobToArrayBuffer(blob);
@@ -27207,7 +28466,12 @@ class OCRModule {
27207
28466
  const docId = docInfos[cardType].docId;
27208
28467
  if (docId) {
27209
28468
  const needFraudOption = config.needAntiFraud && type === EAuthMeCardClass$1.TWN_IDCard_Front;
27210
- const ocrOriginImg = docInfos[cardType].ocrOriginImg;
28469
+ let ocrOriginImg;
28470
+ if (imageData) {
28471
+ ocrOriginImg = imageData;
28472
+ } else {
28473
+ ocrOriginImg = docInfos[cardType].ocrOriginImg;
28474
+ }
27211
28475
  const requestImg = yield encryptImageBase64(ocrOriginImg);
27212
28476
  const report = yield this.ocrService.getReport();
27213
28477
  docInfos[cardType].docId = '';
@@ -27222,7 +28486,7 @@ class OCRModule {
27222
28486
  const _requestImg = yield encryptImageBase64(ocrImg);
27223
28487
  const resp = yield SendRequestWithRetry(() => recognitionEncrypt(docId, _requestImg, report, RecognitionFileType.FlatImage));
27224
28488
  if (resp.retry) {
27225
- yield asyncShowPopup(translateService.translate('verify.error.blur'), translateService.translate('verify.error.blurDescribe'), true);
28489
+ yield asyncShowPopup(translateService.translate('sdk.verify.error.blurRetake.title'), translateService.translate('sdk.verify.error.blurRetake.content'), true);
27226
28490
  throw 'recognition failed';
27227
28491
  }
27228
28492
  result = unionMerge(result, resp && resp.details || {});
@@ -27240,7 +28504,32 @@ class OCRModule {
27240
28504
  return false;
27241
28505
  }
27242
28506
  }),
27243
- antiFraudStart: points => __awaiter(this, void 0, void 0, function* () {
28507
+ ocrCancel: (type, cardType, imageData) => __awaiter(this, void 0, void 0, function* () {
28508
+ const docId = docInfos[cardType].docId;
28509
+ if (docId) {
28510
+ let ocrOriginImg;
28511
+ if (imageData) {
28512
+ ocrOriginImg = imageData;
28513
+ } else {
28514
+ ocrOriginImg = docInfos[cardType].ocrOriginImg;
28515
+ }
28516
+ const requestImg = yield encryptImageBase64(ocrOriginImg);
28517
+ yield this.ocrService.stop();
28518
+ const report = yield this.ocrService.getReport();
28519
+ docInfos[cardType].docId = '';
28520
+ modifyDeubgLog(getDebugLogsLength() - 1, {
28521
+ report: report
28522
+ });
28523
+ frameIndex++;
28524
+ SendRequestWithRetry(() => uploadFrameBase64(docId, requestImg, frameIndex, ResourceImageType.Recognition, report));
28525
+ frameIndex = 0;
28526
+ return true;
28527
+ } else {
28528
+ console.error('didnt find docid , retry');
28529
+ return false;
28530
+ }
28531
+ }),
28532
+ antiFraudStart: (points, setBorderType, setCardBorderColor, setBorderSuccess, scanAnimationContainer, successAnimationContainer, frameImage, frameText, faceMode) => __awaiter(this, void 0, void 0, function* () {
27244
28533
  yield this.antiFraudInstance.init();
27245
28534
  yield this.antiFraudInstance.setFrameSize(frameWidth, frameHeight);
27246
28535
  yield this.antiFraudInstance.setMaskPosition(points.map(([x, y]) => [Number(x.toFixed(2)), Number(y.toFixed(2))]));
@@ -27271,15 +28560,30 @@ class OCRModule {
27271
28560
  fraudResult: null
27272
28561
  };
27273
28562
  }
28563
+ const lottieSuccessSetting = {
28564
+ animationContainer: successAnimationContainer
28565
+ };
28566
+ initSuccessAnimation(lottieSuccessSetting);
28567
+ // TODO 等開始處理防偽的時候再處理
28568
+ // if (resp.scanView && resp.scanView.enable) {
28569
+ // setBorderType({
28570
+ // type: resp.scanView.type
28571
+ // })
28572
+ // setCardBorderColor(null)
28573
+ // } else {
28574
+ // setBorderType({
28575
+ // type: 'cornered',
28576
+ // })
28577
+ // }
27274
28578
  return true;
27275
28579
  }),
27276
28580
  onAntiFraudFrame: data => __awaiter(this, void 0, void 0, function* () {
27277
- var _e, _f;
28581
+ var _h, _j;
27278
28582
  const type = EAuthMeCardClass$1.TWN_IDCard_Front;
27279
28583
  nextDebugRound(type);
27280
28584
  const antiFraudRecogitionResult = yield functionLogging(() => __awaiter(this, void 0, void 0, function* () {
27281
- var _g;
27282
- return yield (_g = this.antiFraudInstance) === null || _g === void 0 ? void 0 : _g.recognition(data);
28585
+ var _k;
28586
+ return yield (_k = this.antiFraudInstance) === null || _k === void 0 ? void 0 : _k.recognition(data);
27283
28587
  }), {
27284
28588
  runFunction: RUN_FUNCTION_NAME.ANTI_FARUD_RECOGNITION,
27285
28589
  isAntiFraud: true
@@ -27288,7 +28592,7 @@ class OCRModule {
27288
28592
  return antiFraudRecogitionResult;
27289
28593
  }
27290
28594
  if (this.canvas) {
27291
- const debugData = yield (_e = this.antiFraudInstance) === null || _e === void 0 ? void 0 : _e.getDebugImageData(data);
28595
+ const debugData = yield (_h = this.antiFraudInstance) === null || _h === void 0 ? void 0 : _h.getDebugImageData(data);
27292
28596
  const ctx = this.canvas.getContext('2d');
27293
28597
  this.canvas.width = frameWidth;
27294
28598
  this.canvas.height = frameHeight;
@@ -27300,7 +28604,7 @@ class OCRModule {
27300
28604
  saveDebugImage({
27301
28605
  data,
27302
28606
  type,
27303
- getDebugImageData: (_f = this.antiFraudInstance) === null || _f === void 0 ? void 0 : _f.getDebugImageData.bind(this.antiFraudInstance),
28607
+ getDebugImageData: (_j = this.antiFraudInstance) === null || _j === void 0 ? void 0 : _j.getDebugImageData.bind(this.antiFraudInstance),
27304
28608
  result,
27305
28609
  width: frameWidth,
27306
28610
  height: frameHeight
@@ -27344,27 +28648,27 @@ class OCRModule {
27344
28648
  return antiFraudStageList;
27345
28649
  },
27346
28650
  setFrameSize: (width, height, points) => __awaiter(this, void 0, void 0, function* () {
27347
- var _h, _j, _k, _l;
28651
+ var _l, _m, _o, _p;
27348
28652
  frameWidth = width;
27349
28653
  frameHeight = height;
27350
- yield (_h = this.ocrService) === null || _h === void 0 ? void 0 : _h.setFrameSize(width, height);
27351
- yield (_j = this.antiFraudInstance) === null || _j === void 0 ? void 0 : _j.setFrameSize(width, height);
28654
+ yield (_l = this.ocrService) === null || _l === void 0 ? void 0 : _l.setFrameSize(width, height);
28655
+ yield (_m = this.antiFraudInstance) === null || _m === void 0 ? void 0 : _m.setFrameSize(width, height);
27352
28656
  if (config.type === IdRecognitionCardType.ResidentCard) {
27353
28657
  // workaround: resident card need MRZ, refactor later.
27354
- yield (_k = this.residentCardMrzService) === null || _k === void 0 ? void 0 : _k.setFrameSize(width, height);
28658
+ yield (_o = this.residentCardMrzService) === null || _o === void 0 ? void 0 : _o.setFrameSize(width, height);
27355
28659
  }
27356
28660
  if (points) {
27357
- yield (_l = this.ocrService) === null || _l === void 0 ? void 0 : _l.setMaskPosition(points.map(([x, y]) => [Number(x.toFixed(2)), Number(y.toFixed(2))]));
28661
+ yield (_p = this.ocrService) === null || _p === void 0 ? void 0 : _p.setMaskPosition(points.map(([x, y]) => [Number(x.toFixed(2)), Number(y.toFixed(2))]));
27358
28662
  }
27359
28663
  }),
27360
28664
  onSuccess: () => __awaiter(this, void 0, void 0, function* () {
27361
- var _m, _o, _p;
28665
+ var _q, _r, _s;
27362
28666
  durationTime.end();
27363
28667
  const ocrIdcardResultFormat = Storage.getItem(STORAGE_KEY['OCR_IDCARD_RESULT_FORMAT']);
27364
- (_m = this.antiFraudInstance) === null || _m === void 0 ? void 0 : _m.destroy();
27365
- (_o = this.ocrService) === null || _o === void 0 ? void 0 : _o.destroy();
28668
+ (_q = this.antiFraudInstance) === null || _q === void 0 ? void 0 : _q.destroy();
28669
+ (_r = this.ocrService) === null || _r === void 0 ? void 0 : _r.destroy();
27366
28670
  // workaround: resident card need MRZ, refactor later.
27367
- (_p = this.residentCardMrzService) === null || _p === void 0 ? void 0 : _p.destroy();
28671
+ (_s = this.residentCardMrzService) === null || _s === void 0 ? void 0 : _s.destroy();
27368
28672
  if (config.type === IdRecognitionCardType.IDCard && ocrIdcardResultFormat === 'splitDateAndAddress') {
27369
28673
  result = splitResult(result);
27370
28674
  }
@@ -27375,10 +28679,10 @@ class OCRModule {
27375
28679
  };
27376
28680
  }),
27377
28681
  onDestroy: () => __awaiter(this, void 0, void 0, function* () {
27378
- var _q, _r;
28682
+ var _t, _u;
27379
28683
  durationTime.end();
27380
- yield (_q = this.ocrService) === null || _q === void 0 ? void 0 : _q.destroy();
27381
- yield (_r = this.antiFraudInstance) === null || _r === void 0 ? void 0 : _r.destroy();
28684
+ yield (_t = this.ocrService) === null || _t === void 0 ? void 0 : _t.destroy();
28685
+ yield (_u = this.antiFraudInstance) === null || _u === void 0 ? void 0 : _u.destroy();
27382
28686
  }),
27383
28687
  getCardMatchROI: () => __awaiter(this, void 0, void 0, function* () {
27384
28688
  return yield this.antiFraudInstance.getCardMatchROI();
@@ -27420,96 +28724,20 @@ function renderCardTypeAndCountryConfig(config) {
27420
28724
  setStatusEvent(StatusEvent.SelectCardTypeAndCountry);
27421
28725
  setStatusView$1(StatusView.Select);
27422
28726
  sendStatusAction(StatusAction.Show);
27423
- const allCardTypes = Object.values(IdRecognitionCardType);
27424
- config.supportCardTypes(config.defaultCountry);
27425
28727
  const translate = key => getTranslateInstance().translate(key);
27426
- const extraInfoWeapMap = new WeakMap();
27427
- const componentElem = _render('div', elem => elem.classList.add('authme-select-container'), [_render('div', elem => elem.classList.add('menu-header'), [_render('div', elem => elem.classList.add('menu-header-left'), [_render('i', elem => elem.classList.add('menu-header-back'))]), _render('div', elem => elem.classList.add('menu-header-title'), [_render('div', elem => {
27428
- elem.classList.add('menu-header-title-text');
27429
- })]), _render('div', elem => elem.classList.add('menu-header-right'), [_render('i', elem => elem.classList.add('menu-header-close'))])]), _render('div', elem => elem.classList.add('menu-content'), [_render('div', elem => elem.classList.add('country-select'), [_render('label', elem => {
27430
- elem.classList.add('country-select-label');
27431
- elem.innerText = translate('verify.menu.country');
27432
- }), _render('div', elem => elem.classList.add('country-select-dropdown'), [_render('div', elem => elem.classList.add('country-select-dropdown-frame'), [_render('div', elem => {
27433
- elem.classList.add('country-select-dropdown-text');
27434
- elem.innerText = translate(`verify.menu.country.${CountryCode.TWN}`);
27435
- }), _render('div', elem => elem.classList.add('country-select-dropdown-icon'))]), _render('div', elem => {
27436
- elem.classList.add('dropdown-country-list');
27437
- })])]), _render('div', elem => elem.classList.add('card-type-select'), [_render('label', elem => {
27438
- elem.classList.add('card-type-select-label');
27439
- elem.innerText = translate('verify.menu.card.type');
27440
- }), ...allCardTypes.map(cardType => _render('div', elem => {
27441
- elem.classList.add('card-out-frame');
27442
- elem.classList.add('card-frame');
27443
- elem.classList.add('card-frame-' + cardType.toLowerCase());
27444
- extraInfoWeapMap.set(elem, {
27445
- cardType
27446
- });
27447
- }, [_render('div', elem => elem.classList.add('card-in-frame'), [_render('label', elem => {
27448
- elem.classList.add('card-label');
27449
- elem.classList.add(cardType.toLocaleLowerCase());
27450
- elem.innerText = translate(`verify.menu.card.${cardType}`);
27451
- }), _render('i', elem => elem.classList.add('card-icon'))])]))]), _render('div', elem => elem.classList.add('space')), _render('div', elem => {
27452
- elem.classList.add('menu-content-footer');
27453
- }, [_render('div', elem => {
27454
- elem.classList.add('menu-content-footer-content');
27455
- }, [_render('div', elem => {
27456
- elem.classList.add('footer-confirm-button');
27457
- elem.classList.add('disable');
27458
- elem.innerText = translate(`liveness.continue`);
27459
- }), _render('div', elem => {
27460
- elem.classList.add('footer-statement');
27461
- elem.innerText = translate(`verify.menu.footer.content`);
27462
- })])])])]);
27463
28728
  let currentCardTypeAndCountry;
27464
- const removeAllChild = element => {
27465
- while (element.firstChild) {
27466
- element.removeChild(element.firstChild);
27467
- }
27468
- };
27469
- const reloadCardTypeSelect = currentCountry => {
27470
- const countryList = config.supportCountries;
27471
- const dropdownCountryList = componentElem.querySelector('.authme-select-container .dropdown-country-list');
27472
- removeAllChild(dropdownCountryList);
27473
- const frames = document.querySelectorAll('.card-frame');
27474
- for (let i = 0; i < frames.length; i++) {
27475
- frames[i].style.display = 'none';
27476
- }
27477
- const cardtypes = config.supportCardTypes(currentCountry);
27478
- cardtypes.forEach(cardType => {
27479
- const node = componentElem.querySelector('.card-frame-' + cardType.toLowerCase());
27480
- node.style.display = '';
27481
- });
27482
- countryList.filter(country => country !== currentCountry).forEach(country => {
27483
- const countryElem = _render('div', elem => {
27484
- elem.classList.add('dropdown-country-list-item');
27485
- extraInfoWeapMap.set(elem, {
27486
- country
27487
- });
27488
- elem.addEventListener('click', event => {
27489
- event.stopPropagation();
27490
- setCurrentCountry(country);
27491
- currentCardTypeAndCountry = Object.assign(Object.assign({}, currentCardTypeAndCountry), {
27492
- country
27493
- });
27494
- });
27495
- }, [_render('div', elem => {
27496
- elem.classList.add('dropdown-country-list-item-frame');
27497
- }, [_render('div', elem => {
27498
- elem.classList.add('dropdown-country-list-item-text');
27499
- elem.innerText = translate(`verify.menu.country.${country}`);
27500
- })])]);
27501
- dropdownCountryList.appendChild(countryElem);
27502
- });
27503
- };
27504
28729
  const setCurrentCountry = (country, disableSwitch = false) => {
27505
- const countrySelectDropdown = componentElem.querySelector('.authme-select-container .country-select-dropdown');
28730
+ const countrySelectDropdown = containerDom.querySelector('.authme-select-container .country-select-dropdown');
27506
28731
  const countrySelectDropdownFramw = countrySelectDropdown.querySelector('.country-select-dropdown-frame');
27507
28732
  const countrySelectDropdownText = countrySelectDropdownFramw.querySelector('.country-select-dropdown-text');
27508
28733
  if (!disableSwitch) {
27509
28734
  dropdownSwitch(false);
27510
28735
  }
27511
- countrySelectDropdownText.innerText = translate(`verify.menu.country.${country}`);
27512
- reloadCardTypeSelect(country);
28736
+ currentCardTypes = config.supportCardTypes(country);
28737
+ currentCardTypeAndCountry = Object.assign(Object.assign({}, currentCardTypeAndCountry), {
28738
+ country
28739
+ });
28740
+ countrySelectDropdownText.innerText = translate(`sdk.home.selectCountry.${country}`);
27513
28741
  };
27514
28742
  const dropdownSwitch = switchTarget => {
27515
28743
  const closeDropdown = () => {
@@ -27519,20 +28747,83 @@ function renderCardTypeAndCountryConfig(config) {
27519
28747
  countrySelectDropdown.classList.remove('closing');
27520
28748
  }, 280);
27521
28749
  };
27522
- const countrySelectDropdown = componentElem.querySelector('.authme-select-container .country-select-dropdown');
28750
+ const countrySelectDropdown = containerDom.querySelector('.authme-select-container .country-select-dropdown');
27523
28751
  if (switchTarget !== undefined) {
27524
28752
  switchTarget === false ? closeDropdown() : countrySelectDropdown.classList.add('active');
27525
28753
  return;
27526
28754
  }
27527
28755
  countrySelectDropdown.classList.contains('active') ? closeDropdown() : countrySelectDropdown.classList.add('active');
27528
28756
  };
28757
+ let currentCardTypes = config.supportCardTypes(config.defaultCountry);
28758
+ const containerDom = document.createElement('div');
28759
+ containerDom.classList.add('authme-select-container');
28760
+ containerDom.innerHTML = `
28761
+ <div class="menu-header">
28762
+ <div class="menu-header-left">
28763
+ <i class="menu-header-back"></i>
28764
+ </div>
28765
+ <div class="menu-header-title">
28766
+ <div class="menu-header-title-text"></div>
28767
+ </div>
28768
+ <div class="menu-header-right">
28769
+ <i class="menu-header-close"></i>
28770
+ </div>
28771
+ </div>
28772
+ <div class="menu-content">
28773
+ <div class="country-select">
28774
+ <label class="country-select-label">${translate('sdk.home.selectCountry')}</label>
28775
+ <div class="country-select-dropdown">
28776
+ <div class="country-select-dropdown-frame">
28777
+ <div class="country-select-dropdown-text">${translate(`sdk.home.selectCountry.${CountryCode.TWN}`)}</div>
28778
+ <div class="country-select-dropdown-icon"></div>
28779
+ </div>
28780
+ <div class="dropdown-country-list"></div>
28781
+ </div>
28782
+ </div>
28783
+ <div class="card-type-select">
28784
+ <label class="card-type-select-label">${translate('sdk.home.selectDocument')}</label>
28785
+ </div>
28786
+ <div class="space"></div>
28787
+ <div class="menu-content-footer">
28788
+ <div class="menu-content-footer-content">
28789
+ <div class="footer-confirm-button disable">${translate(`sdk.general.continue`)}</div>
28790
+ <div class="footer-statement">${translate(`sdk.general.footer`)}</div>
28791
+ </div>
28792
+ </div>
28793
+ </div>
28794
+ `;
28795
+ const confirmBtn = containerDom.querySelector('.footer-confirm-button');
28796
+ const initCountryList = currentCountry => {
28797
+ const countryList = config.supportCountries;
28798
+ const dropdownCountryList = containerDom.querySelector('.dropdown-country-list');
28799
+ const countries = dropdownCountryList === null || dropdownCountryList === void 0 ? void 0 : dropdownCountryList.querySelectorAll('.dropdown-country-list-item');
28800
+ for (let index = countries.length - 1; index >= 0; index--) {
28801
+ countries[index].remove();
28802
+ }
28803
+ countryList.filter(country => country !== currentCountry).forEach(country => {
28804
+ const countryDom = document.createElement('div');
28805
+ countryDom.classList.add('dropdown-country-list-item');
28806
+ countryDom.innerHTML = `
28807
+ <div class="dropdown-country-list-item-frame">
28808
+ <div class="dropdown-country-list-item-text">${translate(`sdk.home.selectCountry.${country}`)}</div>
28809
+ </div>
28810
+ `;
28811
+ countryDom.addEventListener('click', event => {
28812
+ event.stopPropagation();
28813
+ setCurrentCountry(country);
28814
+ initCardTypeList();
28815
+ initCountryList(country);
28816
+ });
28817
+ dropdownCountryList.appendChild(countryDom);
28818
+ });
28819
+ };
27529
28820
  const initCountrySelectDropdown = () => {
27530
- const countrySelectDropdown = componentElem.querySelector('.authme-select-container .country-select-dropdown');
28821
+ const countrySelectDropdown = containerDom.querySelector('.country-select-dropdown');
27531
28822
  const countryList = config.supportCountries;
27532
- setCurrentCountry(config.defaultCountry, true);
27533
28823
  currentCardTypeAndCountry = Object.assign(Object.assign({}, currentCardTypeAndCountry), {
27534
28824
  country: config.defaultCountry
27535
28825
  });
28826
+ initCountryList(config.defaultCountry);
27536
28827
  countrySelectDropdown.addEventListener('click', () => {
27537
28828
  if (countryList.length <= 1) {
27538
28829
  return;
@@ -27540,32 +28831,55 @@ function renderCardTypeAndCountryConfig(config) {
27540
28831
  dropdownSwitch();
27541
28832
  });
27542
28833
  };
27543
- return new Promise((resolve, reject) => {
27544
- const cardTypeElems = [].slice.call(componentElem.querySelectorAll('.authme-select-container .card-out-frame'));
27545
- const confirmBtn = componentElem.querySelector('.authme-select-container .menu-content-footer .footer-confirm-button');
27546
- const frames = componentElem.querySelectorAll('.card-frame');
27547
- for (let i = 0; i < frames.length; i++) {
27548
- frames[i].style.display = 'none';
27549
- }
27550
- const cardtypes = config.supportCardTypes(config.defaultCountry);
27551
- cardtypes.forEach(cardType => {
27552
- const node = componentElem.querySelector('.card-frame-' + cardType.toLowerCase());
27553
- node.style.display = '';
28834
+ const handleCardTypeClick = e => {
28835
+ const currentTarget = e.currentTarget;
28836
+ const list = currentTarget.parentElement.querySelectorAll('.card-out-frame');
28837
+ const matchSupportCardType = JSON.parse(currentTarget.dataset.cardTypeObj);
28838
+ // const matchSupportCardType = currentCardTypes.find(
28839
+ // (item) => item.cardType === currentTarget.dataset.cardType
28840
+ // );
28841
+ const cardType = matchSupportCardType === null || matchSupportCardType === void 0 ? void 0 : matchSupportCardType.cardType;
28842
+ const config = (matchSupportCardType === null || matchSupportCardType === void 0 ? void 0 : matchSupportCardType.config) || {};
28843
+ currentCardTypeAndCountry = Object.assign(Object.assign({}, currentCardTypeAndCountry), {
28844
+ cardType,
28845
+ config
27554
28846
  });
27555
- initCountrySelectDropdown();
27556
- cardTypeElems.map(cardTypeElem => {
27557
- cardTypeElem.addEventListener('click', () => {
27558
- cardTypeElems.forEach(ele => ele.classList.remove('active'));
27559
- cardTypeElem.classList.add('active');
27560
- const cardType = extraInfoWeapMap.get(cardTypeElem).cardType;
27561
- currentCardTypeAndCountry = Object.assign(Object.assign({}, currentCardTypeAndCountry), {
27562
- cardType
27563
- });
27564
- confirmBtn.classList.remove('disable');
27565
- });
28847
+ list.forEach(item => {
28848
+ item.classList.remove('active');
28849
+ });
28850
+ currentTarget.classList.add('active');
28851
+ confirmBtn === null || confirmBtn === void 0 ? void 0 : confirmBtn.classList.remove('disable');
28852
+ };
28853
+ const initCardTypeList = () => {
28854
+ const cardTypeSelect = containerDom.querySelector('.card-type-select');
28855
+ const cardTypeList = cardTypeSelect === null || cardTypeSelect === void 0 ? void 0 : cardTypeSelect.querySelectorAll('.card-type-item');
28856
+ if (!cardTypeSelect || !cardTypeList) {
28857
+ return;
28858
+ }
28859
+ for (let index = cardTypeList.length - 1; index >= 0; index--) {
28860
+ const cardTypeDom = cardTypeList[index];
28861
+ cardTypeDom.removeEventListener('click', handleCardTypeClick);
28862
+ cardTypeDom.remove();
28863
+ }
28864
+ currentCardTypes.forEach(item => {
28865
+ const dom = document.createElement('div');
28866
+ dom.setAttribute('class', `card-out-frame card-frame card-type-item card-frame-${item.cardType.toLowerCase()}`);
28867
+ dom.setAttribute('data-card-type', item.cardType);
28868
+ dom.setAttribute('data-card-type-obj', JSON.stringify(item));
28869
+ dom.addEventListener('click', handleCardTypeClick);
28870
+ dom.innerHTML = `
28871
+ <div class="card-in-frame">
28872
+ <label class="card-label ${item.cardType.toLowerCase()}">${item.display}</label>
28873
+ <i class="card-icon"></i>
28874
+ </div>
28875
+ `;
28876
+ cardTypeSelect.appendChild(dom);
27566
28877
  });
27567
- confirmBtn.addEventListener('click', () => {
27568
- componentElem.remove();
28878
+ confirmBtn === null || confirmBtn === void 0 ? void 0 : confirmBtn.classList.add('disable');
28879
+ };
28880
+ return new Promise((resolve, reject) => {
28881
+ confirmBtn === null || confirmBtn === void 0 ? void 0 : confirmBtn.addEventListener('click', () => {
28882
+ containerDom.remove();
27569
28883
  const _currentCardTypeAndCountry = Object.assign(Object.assign({}, currentCardTypeAndCountry), {
27570
28884
  hasResult: true
27571
28885
  });
@@ -27573,16 +28887,18 @@ function renderCardTypeAndCountryConfig(config) {
27573
28887
  eventListenerService.stop();
27574
28888
  resolve(_currentCardTypeAndCountry);
27575
28889
  });
27576
- const menuBackElem = componentElem.querySelector('.authme-select-container .menu-header-close');
27577
- menuBackElem.addEventListener('click', () => {
27578
- componentElem.remove();
28890
+ const menuBackDom = containerDom.querySelector('.menu-header-close');
28891
+ menuBackDom.addEventListener('click', () => {
28892
+ containerDom.remove();
27579
28893
  sendStatusAction(StatusAction.BtnClose);
27580
28894
  eventListenerService.stop();
27581
28895
  resolve({
27582
28896
  hasResult: false
27583
28897
  });
27584
28898
  });
27585
- document.body.appendChild(componentElem);
28899
+ document.body.appendChild(containerDom);
28900
+ initCountrySelectDropdown();
28901
+ initCardTypeList();
27586
28902
  });
27587
28903
  }
27588
28904
 
@@ -27655,7 +28971,7 @@ class AuthmeIdentityVerification extends AuthmeFunctionModule {
27655
28971
  yield getTranslateInstance().fetchSource(`${config.scriptPath}locale`);
27656
28972
  } catch (error) {
27657
28973
  if (error instanceof AuthmeError && error.code === ErrorCode.BROWSER_NOT_SUPPORT) {
27658
- alert(getTranslateInstance().translate('browser.error.notSupport'));
28974
+ alert(getTranslateInstance().translate('sdk.general.error.browser.doesntSupportCamera'));
27659
28975
  }
27660
28976
  throw error;
27661
28977
  }
@@ -27690,13 +29006,20 @@ class AuthmeIdentityVerification extends AuthmeFunctionModule {
27690
29006
  getCardTypeAndCountry(userConfig) {
27691
29007
  var _a, _b;
27692
29008
  return __awaiter(this, void 0, void 0, function* () {
27693
- const defaultCountries = [CountryCode.TWN, CountryCode.JPN, CountryCode.ZAF, CountryCode.USA, CountryCode.CHN, CountryCode.PHL, CountryCode.GBR, CountryCode.KOR, CountryCode.HKG, CountryCode.FRA, CountryCode.ESP, CountryCode.MEX, CountryCode.ITA, CountryCode.IND, CountryCode.COL, CountryCode.RUS, CountryCode.DEU, CountryCode.TUR, CountryCode.CAN, CountryCode.AUS];
29009
+ const defaultCountries = [CountryCode.TWN, CountryCode.JPN, CountryCode.ZAF, CountryCode.USA, CountryCode.CHN, CountryCode.PHL, CountryCode.GBR, CountryCode.KOR, CountryCode.HKG, CountryCode.FRA, CountryCode.ESP, CountryCode.MEX, CountryCode.ITA, CountryCode.IND, CountryCode.COL, CountryCode.RUS, CountryCode.DEU, CountryCode.TUR, CountryCode.CAN, CountryCode.AUS, CountryCode.IDN, CountryCode.MYS, CountryCode.EGY, CountryCode.SAU, CountryCode.NLD, CountryCode.SGP];
27694
29010
  const defaultCountry = userConfig.defaultCountry !== undefined && defaultCountries.includes(userConfig.defaultCountry) ? userConfig.defaultCountry : defaultCountries[0];
27695
- return renderCardTypeAndCountryConfig({
27696
- supportCountries: (_a = userConfig.supportCountries) !== null && _a !== void 0 ? _a : defaultCountries,
27697
- defaultCountry: defaultCountry,
27698
- supportCardTypes: (_b = userConfig.supportCardTypes) !== null && _b !== void 0 ? _b : () => Object.values(IdRecognitionCardType)
29011
+ const supportCountries = (_a = userConfig.supportCountries) !== null && _a !== void 0 ? _a : defaultCountries;
29012
+ const supportCardTypes = (_b = userConfig.supportCardTypes) !== null && _b !== void 0 ? _b : Object.values(IdRecognitionCardType).map(x => {
29013
+ return {
29014
+ cardType: x
29015
+ };
27699
29016
  });
29017
+ const cardTypeAndCountryConfig = {
29018
+ defaultCountry,
29019
+ supportCountries,
29020
+ supportCardTypes
29021
+ };
29022
+ return renderCardTypeAndCountryConfig(cardTypeAndCountryConfig);
27700
29023
  });
27701
29024
  }
27702
29025
  extraDocument(userConfig = {}) {
@@ -27728,10 +29051,11 @@ class AuthmeIdentityVerification extends AuthmeFunctionModule {
27728
29051
  cardSubTypes = config.cardTypes.map(mapCardtypeToAuthmeClass);
27729
29052
  } else {
27730
29053
  cardSubTypes = getCardSubTypes(config.type, config.country);
27731
- const defaultCardTypes = cardSubTypes.map(c => twoWayAuthmeCardClassMap.toServer(c));
27732
- config.cardTypes = defaultCardTypes;
29054
+ cardSubTypes.map(c => twoWayAuthmeCardClassMap.toServer(c));
29055
+ // config.cardTypes = defaultCardTypes;
29056
+ config.cardTypes = getCardTypes(config.type, config.country);
27733
29057
  }
27734
- return config.type === IdRecognitionCardType.Passport ? this.mrzModule.run(config, cardSubTypes) : this.ocrModule.run(config, config.cardTypes);
29058
+ return config.type === IdRecognitionCardType.Passport ? this.mrzModule.run(config, cardSubTypes) : this.ocrModule.run(config, config.cardTypes, config.cardTypeConfigs);
27735
29059
  });
27736
29060
  }
27737
29061
  confirmOCRResult(data) {
@@ -27783,8 +29107,8 @@ class AuthmeIdentityVerification extends AuthmeFunctionModule {
27783
29107
  }
27784
29108
 
27785
29109
  var name = "authme/sdk";
27786
- var version$1 = "2.4.8";
27787
- var date = "2023-12-20T07:24:47+0000";
29110
+ var version$1 = "2.7.0";
29111
+ var date = "2024-05-30T14:54:23+0000";
27788
29112
  var packageInfo = {
27789
29113
  name: name,
27790
29114
  version: version$1,