@authme/identity-verification 2.8.24 → 2.8.26

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
@@ -7,7 +7,7 @@ import 'core-js/modules/es.promise.js';
7
7
  import { getTranslateInstance, EventListenerService, TrackingEvent, generateStatus, StatusDescription, AuthmeError, ErrorCode, Feature, StatusEvent, StatusView, StatusAction, setRequestLoggingFunc, setAccessToken, getCustomerState } from '@authme/core';
8
8
  import { EAuthMeFASServiceStatus, EAuthMeIDCardAntiFraudStage as EAuthMeIDCardAntiFraudStage$1, EAuthMeCardClass as EAuthMeCardClass$1, AuthmeFunctionModule, MlEngine, EngineModule, EAuthMeEngineReturnCode, AuthmeEngineModuleBase } from '@authme/engine';
9
9
  import { IdRecognitionCardType, CountryCode, EAuthMeCardClass, EAuthMeIDCardAntiFraudStatus, EAuthMeIDCardAntiFraudStage, thicknessDefaultConfig, mapCardtypeToAuthmeClass, getRecognitionColumnOrder, cardTypeTitle, cardTypeConfirmTitle, cardTypeHeader, EAuthMeCardOCRStatus, EAuthMeMRZServiceStatus, saveExtraDoc, initScanDocumentResourceBase64, MRZService, option, themeUI, initScan, initScanDocument, ResourceImageType, uploadFrameBase64, finishScanDocument, CardOCR, IdCardAntiFraudService, twoWayAuthmeCardClassMap, RecognitionFileType, recognizeBase64, getCardSubTypes, getCardTypes, confirmScan } from '@authme/id-recognition';
10
- import { getCssVariable, RGBToLottieColor, colorToRGB, Storage, useState, uiThemeText, uiThemeHint, clearCanvas, getImageData, isMobile, hidePopup, showPopup, waitTime, TIME_UNIT, AuthmeError as AuthmeError$1, ErrorCode as ErrorCode$1, uiThemeButton, uiThemeSmallButton, requestCamera, showElement, asyncOnLineShowErrorMessage, getCanvasSize, startSpinner, stopSpinner, themeConfigDefault, fontWeight, hideElement, dataURItoBlob, showErrorMessage, checkOnlineStatus, dropMenu, hideErrorMessage, UintArrayToBlob, isIphone14proOrProMax, cropByRatio, switchCamera, asyncShowPopup, retryPromiseWithCondition, asyncShowErrorMessage, uploadModal, backgroundRequest, debugTools, RUN_FUNCTION_NAME, STORAGE_KEY, splitResult, DEVICE_TYPE, combineResult, startLoadingSDK, stopLoadingSDK } from '@authme/util';
10
+ import { getCssVariable, RGBToLottieColor, colorToRGB, Storage, useState, uiThemeText, uiThemeHint, clearCanvas, getImageData, isMobile, hidePopup, showPopup, waitTime, TIME_UNIT, AuthmeError as AuthmeError$1, ErrorCode as ErrorCode$1, uiThemeButton, uiThemeSmallButton, requestCamera, showElement, asyncOnLineShowErrorMessage, getCanvasSize, startSpinner, stopSpinner, themeConfigDefault, uiThemeDirection, fontWeight, hideElement, dataURItoBlob, showErrorMessage, checkOnlineStatus, dropMenu, hideErrorMessage, UintArrayToBlob, isIphone14proOrProMax, cropByRatio, switchCamera, asyncShowPopup, retryPromiseWithCondition, asyncShowErrorMessage, uploadModal, backgroundRequest, debugTools, RUN_FUNCTION_NAME, STORAGE_KEY, splitResult, DEVICE_TYPE, combineResult, startLoadingSDK, stopLoadingSDK } from '@authme/util';
11
11
  import { mergeMap, animationFrames, filter, tap, map, from, catchError, EMPTY, of, merge, fromEvent, concatAll, takeUntil, Subject, defer, throttleTime, switchMap, raceWith, concatMap, throwError, finalize, timer, Observable, take, interval, mapTo, firstValueFrom, shareReplay, switchMapTo, takeWhile as takeWhile$1, race } from 'rxjs';
12
12
  import 'core-js/modules/es.regexp.to-string.js';
13
13
  import { FasRecognitionResult, EAuthMeFASServiceStage, FasService, LivenessAPI, EAuthMeMouthStatus, LivenessResultStatus } from '@authme/liveness';
@@ -9917,7 +9917,8 @@ const scan = params => {
9917
9917
  const [r, g, b] = lottieColor.map(c => parseFloat(c.toFixed(3)));
9918
9918
  const lottieColorGradient = authmeScannningGradient ? RGBToLottieColor(colorToRGB(authmeScannningGradient)) : [];
9919
9919
  const [rGradient, gGradient, bGradient] = lottieColorGradient.map(c => parseFloat(c.toFixed(3)));
9920
- const opacity = (params === null || params === void 0 ? void 0 : params.opacity) ? params.opacity * 100 : 40;
9920
+ // const opacity = params?.opacity ? params.opacity * 100 : 40;
9921
+ const opacity = 0;
9921
9922
  const lottieGradient = [0, rGradient, gGradient, bGradient, 0.5, r, g, b, 1, r, g, b, 0, 0.03, 0.5, 0.515, 1, 1];
9922
9923
  return {
9923
9924
  v: '5.9.2',
@@ -28856,6 +28857,7 @@ const renderBasicUI = userConfig => {
28856
28857
  video.playsInline = true;
28857
28858
  video.loop = true;
28858
28859
  video.setAttribute('webkit-playsinline', '');
28860
+ video.setAttribute('poster', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUAAAADwCAYAAABxLb1rAAAABmJLR0QA/wD/AP+gvaeTAAADKUlEQVR4nO3UMQEAIAzAsIF/zyBjRxMFvXpm5g1A0N0OANhigECWAQJZBghkGSCQZYBAlgECWQYIZBkgkGWAQJYBAlkGCGQZIJBlgECWAQJZBghkGSCQZYBAlgECWQYIZBkgkGWAQJYBAlkGCGQZIJBlgECWAQJZBghkGSCQZYBAlgECWQYIZBkgkGWAQJYBAlkGCGQZIJBlgECWAQJZBghkGSCQZYBAlgECWQYIZBkgkGWAQJYBAlkGCGQZIJBlgECWAQJZBghkGSCQZYBAlgECWQYIZBkgkGWAQJYBAlkGCGQZIJBlgECWAQJZBghkGSCQZYBAlgECWQYIZBkgkGWAQJYBAlkGCGQZIJBlgECWAQJZBghkGSCQZYBAlgECWQYIZBkgkGWAQJYBAlkGCGQZIJBlgECWAQJZBghkGSCQZYBAlgECWQYIZBkgkGWAQJYBAlkGCGQZIJBlgECWAQJZBghkGSCQZYBAlgECWQYIZBkgkGWAQJYBAlkGCGQZIJBlgECWAQJZBghkGSCQZYBAlgECWQYIZBkgkGWAQJYBAlkGCGQZIJBlgECWAQJZBghkGSCQZYBAlgECWQYIZBkgkGWAQJYBAlkGCGQZIJBlgECWAQJZBghkGSCQZYBAlgECWQYIZBkgkGWAQJYBAlkGCGQZIJBlgECWAQJZBghkGSCQZYBAlgECWQYIZBkgkGWAQJYBAlkGCGQZIJBlgECWAQJZBghkGSCQZYBAlgECWQYIZBkgkGWAQJYBAlkGCGQZIJBlgECWAQJZBghkGSCQZYBAlgECWQYIZBkgkGWAQJYBAlkGCGQZIJBlgECWAQJZBghkGSCQZYBAlgECWQYIZBkgkGWAQJYBAlkGCGQZIJBlgECWAQJZBghkGSCQZYBAlgECWQYIZBkgkGWAQJYBAlkGCGQZIJBlgECWAQJZBghkGSCQZYBAlgECWQYIZBkgkGWAQJYBAlkGCGQZIJBlgECWAQJZBghkGSCQZYBAlgECWQYIZBkgkGWAQJYBAlkGCGQZIJBlgECWAQJZBghkGSCQZYBAlgECWQYIZBkgkGWAQJYBAlkfVV0C319akPEAAAAASUVORK5CYII=');
28859
28861
  const lottieScreen = document.createElement('div');
28860
28862
  lottieScreen.classList.add('lottie-screen');
28861
28863
  const pictureIcon = document.createElement('div');
@@ -29102,7 +29104,6 @@ const renderLivenessUI = config => {
29102
29104
  };
29103
29105
  const createTextTitle = () => {
29104
29106
  const ele = document.createElement('div');
29105
- ele.classList.add('text-title');
29106
29107
  return ele;
29107
29108
  };
29108
29109
  const createTextHint = () => {
@@ -29128,12 +29129,8 @@ const renderLivenessUI = config => {
29128
29129
  faceMask.style.setProperty('--authme-liveness-scanner-error-border-width', `${uiThemeConfig.livenessErrorScanFrame.borderWidth}px`);
29129
29130
  // text panel
29130
29131
  const titleTextPanel = createTextPanel();
29131
- titleTextPanel.classList.add('title');
29132
29132
  const titleText = createTextTitle();
29133
- //由於setStatusTop會與titile font size 相關,所以直接在這邊用innerStyle修改,避免未來CSS污染導致setStatusTop失效
29134
- titleText.style.fontSize = `${MASK_STYLE.TITLE_TEXT_FONT_SIZE}px`;
29135
29133
  const statusTextPanel = createTextPanel();
29136
- statusTextPanel.classList.add('status');
29137
29134
  const statusText = createTextHint();
29138
29135
  titleTextPanel.appendChild(titleText);
29139
29136
  statusTextPanel.appendChild(statusText);
@@ -29141,22 +29138,16 @@ const renderLivenessUI = config => {
29141
29138
  config.videoContainer.appendChild(statusTextPanel);
29142
29139
  //Statement
29143
29140
  const statementContainer = document.createElement('div');
29144
- statementContainer.classList.add('statement');
29145
29141
  uiThemeText(statementContainer, uiThemeConfig.bodyThreeDarkMode);
29146
29142
  statementContainer.textContent = translateService.translate('sdk.general.footer');
29147
29143
  if (uiThemeConfig.isStatementEnabled) {
29148
29144
  config.videoContainer.appendChild(statementContainer);
29149
29145
  }
29150
29146
  uiThemeText(titleText, uiThemeConfig.titleThree);
29151
- uiThemeHint(statusText, uiThemeConfig.hint);
29147
+ uiThemeHint(statusText, uiThemeConfig.hint, '15vh');
29152
29148
  // Set init text
29153
29149
  titleText.textContent = translateService.translate('sdk.liveness.detection.step');
29154
29150
  statusText.textContent = translateService.translate('sdk.general.verify.error.noFace');
29155
- setStatusTextTop({
29156
- maskHeight,
29157
- statusTextPanel,
29158
- titleTextPanel
29159
- });
29160
29151
  return {
29161
29152
  statusText,
29162
29153
  faceMask,
@@ -29164,18 +29155,6 @@ const renderLivenessUI = config => {
29164
29155
  statusTextPanel
29165
29156
  };
29166
29157
  };
29167
- const setStatusTextTop = params => {
29168
- const {
29169
- maskHeight,
29170
- maskTop,
29171
- titleTextPanel,
29172
- statusTextPanel
29173
- } = params;
29174
- const _maskTop = maskTop !== null && maskTop !== void 0 ? maskTop : window.innerHeight / 2 - maskHeight / 2;
29175
- const _maskBotton = _maskTop + maskHeight;
29176
- titleTextPanel.style.top = `${_maskTop - MASK_STYLE.MASK_TITLE_MARGIN - MASK_STYLE.TITLE_TEXT_FONT_SIZE}px`;
29177
- statusTextPanel.style.top = `${_maskBotton + MASK_STYLE.MASK_TITLE_MARGIN + 60}px`;
29178
- };
29179
29158
 
29180
29159
  const limitFPS = fps => {
29181
29160
  let now = Date.now();
@@ -29796,12 +29775,6 @@ function startLiveness(config) {
29796
29775
  height: ellipseHeight,
29797
29776
  axisProduct: ellipseWidthRate * ellipseHeightRate
29798
29777
  };
29799
- setStatusTextTop({
29800
- maskTop: window.innerHeight * fTop,
29801
- maskHeight: window.innerHeight * (fBottom - fTop),
29802
- titleTextPanel: uiComponentLiveness.titleTextPanel,
29803
- statusTextPanel: uiComponentLiveness.statusTextPanel
29804
- });
29805
29778
  })).pipe(switchMap(() => of(null).pipe(
29806
29779
  // 明確建立一個 Observable 作為輸入
29807
29780
  sendFrame(canvasSizeInfo, canvas, uiComponentBasic.video, config.onFrame, livenessConfig.fasMaxFps, true, 'all', undefined, frameFlags), tap(({
@@ -30112,19 +30085,25 @@ const renderOCRUI = config => {
30112
30085
  config.container.classList.add('ocr-container');
30113
30086
  // Text
30114
30087
  const titleTextPanel = createTextPanel();
30115
- titleTextPanel.classList.add('title');
30116
30088
  const titleText = document.createElement('span');
30117
- titleText.classList.add('title-text');
30118
30089
  titleTextPanel.appendChild(titleText);
30119
30090
  const hintText = document.createElement('div');
30120
- hintText.classList.add('hint-text');
30121
30091
  const statusTextPanel = createTextPanel();
30122
- statusTextPanel.classList.add('status');
30123
30092
  const statusText = document.createElement('span');
30124
- statusText.classList.add('status-text');
30125
30093
  statusTextPanel.appendChild(statusText);
30094
+ const directionTextPanel = createTextPanel();
30095
+ directionTextPanel.classList.add('direction-panel');
30096
+ const directionText = document.createElement('span');
30097
+ directionText.classList.add('status-text');
30098
+ directionText.textContent = '';
30099
+ const directionIcon = document.createElement('span');
30100
+ directionIcon.classList.add('direction-icon');
30101
+ // Put icon and text as siblings in directionTextPanel
30102
+ directionTextPanel.appendChild(directionIcon);
30103
+ directionTextPanel.appendChild(directionText);
30126
30104
  uiThemeText(titleText, uiThemeConfig.titleOneDarkMode);
30127
30105
  uiThemeHint(statusText, uiThemeConfig.hint);
30106
+ uiThemeDirection(directionTextPanel, uiThemeConfig.fraudScanHintText);
30128
30107
  //Statement
30129
30108
  const statementContainer = document.createElement('div');
30130
30109
  statementContainer.classList.add('statement');
@@ -30158,6 +30137,7 @@ const renderOCRUI = config => {
30158
30137
  config.videoContainer.appendChild(statementContainer);
30159
30138
  }
30160
30139
  config.videoContainer.appendChild(statusTextPanel);
30140
+ config.videoContainer.appendChild(directionTextPanel);
30161
30141
  config.videoContainer.appendChild(scanAnimationContainer);
30162
30142
  config.videoContainer.appendChild(successContainer);
30163
30143
  config.videoContainer.appendChild(arrowAnimationContainer);
@@ -30165,14 +30145,15 @@ const renderOCRUI = config => {
30165
30145
  // Anti-fraud Instruction
30166
30146
  const lottieMask = document.createElement('div');
30167
30147
  lottieMask.classList.add('lottie-mask');
30148
+ lottieMask.style.opacity = uiThemeConfig.fraudAnimationLoadingPage.backgroundOpacity;
30168
30149
  const antiFraudInstructionContainer = document.createElement('div');
30169
30150
  antiFraudInstructionContainer.classList.add('anti-fraud-instruction-container');
30151
+ const antiFraudInstructionAnimationContainer = document.createElement('div');
30152
+ antiFraudInstructionAnimationContainer.classList.add('anti-fraud-instruction-animation-container');
30170
30153
  const instructionText = document.createElement('div');
30171
30154
  instructionText.classList.add('anti-fraud-instruction-container__text');
30172
30155
  instructionText.textContent = translateService.translate('sdk.guard.verify.guide.fraudDescribe');
30173
30156
  uiThemeText(instructionText, uiThemeConfig.titleOneDarkMode);
30174
- const antiFraudInstructionAnimationContainer = document.createElement('div');
30175
- antiFraudInstructionAnimationContainer.classList.add('anti-fraud-instruction-animation-container');
30176
30157
  const btnContainer = document.createElement('div');
30177
30158
  btnContainer.classList.add('btn-container');
30178
30159
  const confirmBtn = document.createElement('button');
@@ -30226,6 +30207,9 @@ const renderOCRUI = config => {
30226
30207
  titleText,
30227
30208
  hintText,
30228
30209
  statusText,
30210
+ directionTextPanel,
30211
+ directionText,
30212
+ directionIcon,
30229
30213
  statusTextPanel,
30230
30214
  lottieMask,
30231
30215
  arrowAnimationContainer,
@@ -30383,11 +30367,13 @@ function mirrorPoints(points) {
30383
30367
  }));
30384
30368
  }
30385
30369
  const renderOCRMask = params => {
30370
+ const uiThemeConfig = Storage.getItem('themeConfig');
30386
30371
  let newCardPoints;
30387
- let borderColor = '';
30388
- let borderOpacity = OcrFrame.borderOpacity;
30389
- let borderColorSuccess = '';
30390
- let borderOpacitySuccess = OcrFrame.successOpacity;
30372
+ let borderColor = uiThemeConfig.scanFrame.undetectedColor;
30373
+ let borderOpacity = uiThemeConfig.scanFrame.opacity;
30374
+ let borderColorSuccess = uiThemeConfig.scanFrame.detectedColor;
30375
+ let borderOpacitySuccess = uiThemeConfig.scanFrame.opacity;
30376
+ const strokeWidth = uiThemeConfig.scanFrame.width;
30391
30377
  const {
30392
30378
  cardPoints,
30393
30379
  container
@@ -30405,7 +30391,7 @@ const renderOCRMask = params => {
30405
30391
  svg.style.position = 'absolute';
30406
30392
  svg.style.top = '0';
30407
30393
  svg.style.left = '0';
30408
- svg.style.boxShadow = 'rgba(0, 0, 0, 0.65) 0 0 0 2000px';
30394
+ svg.style.boxShadow = 'rgba(0, 0, 0, 1) 0 0 0 2000px';
30409
30395
  // 創建遮罩
30410
30396
  const defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');
30411
30397
  const mask = document.createElementNS('http://www.w3.org/2000/svg', 'mask');
@@ -30431,6 +30417,13 @@ const renderOCRMask = params => {
30431
30417
  pathOfFrame.setAttribute('fill', 'none');
30432
30418
  pathOfFrame.setAttribute('stroke', OcrFrame.borderColor);
30433
30419
  pathOfFrame.setAttribute('stroke-width', '3');
30420
+ // Create a border path that matches the mask exactly
30421
+ const borderPath = document.createElementNS('http://www.w3.org/2000/svg', 'path');
30422
+ borderPath.setAttribute('id', 'authme-border-path');
30423
+ borderPath.setAttribute('stroke', borderColor);
30424
+ borderPath.setAttribute('stroke-width', strokeWidth);
30425
+ borderPath.setAttribute('fill', 'none');
30426
+ borderPath.setAttribute('stroke-opacity', borderOpacity.toString());
30434
30427
  const setBorderType = params => {
30435
30428
  var _a;
30436
30429
  const _mirrored = (_a = params.mirrored) !== null && _a !== void 0 ? _a : false;
@@ -30500,6 +30493,8 @@ const renderOCRMask = params => {
30500
30493
  maskedRect.setAttribute('fill', 'rgba(0, 0, 0, 0.65)');
30501
30494
  maskedRect.setAttribute('mask', 'url(#hole)');
30502
30495
  svg.appendChild(maskedRect);
30496
+ // Add the border path that matches the mask
30497
+ svg.appendChild(borderPath);
30503
30498
  // 添加SVG到容器
30504
30499
  container.appendChild(svg);
30505
30500
  const setCardPoints = (_newCardPoints, antiFraud = false, _mirrored = false) => {
@@ -30536,39 +30531,9 @@ const renderOCRMask = params => {
30536
30531
  });
30537
30532
  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}`;
30538
30533
  }, '') + ' Z'; // 結尾加上'Z'來關閉路徑
30539
- newCardPoints.reduce((acc, {
30540
- x,
30541
- y
30542
- }, index) => {
30543
- var _a, _b;
30544
- const lineRotio = 2;
30545
- const previosPoint = (_a = newCardPoints[index - 1]) !== null && _a !== void 0 ? _a : newCardPoints[newCardPoints.length - 1];
30546
- const nextPoint = (_b = newCardPoints[index + 1]) !== null && _b !== void 0 ? _b : newCardPoints[0];
30547
- const windowWidth = container.offsetWidth;
30548
- const windowHeight = container.offsetHeight;
30549
- const _x1 = windowWidth * previosPoint.x;
30550
- const _y1 = windowHeight * previosPoint.y;
30551
- const _x2 = windowWidth * x;
30552
- const _y2 = windowHeight * y;
30553
- const _x3 = windowWidth * nextPoint.x;
30554
- const _y3 = windowHeight * nextPoint.y;
30555
- const v = new Vector({
30556
- x: _x1,
30557
- y: _y1
30558
- }, {
30559
- x: _x2,
30560
- y: _y2
30561
- });
30562
- const vNext = new Vector({
30563
- x: _x2,
30564
- y: _y2
30565
- }, {
30566
- x: _x3,
30567
- y: _y3
30568
- });
30569
- 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} `;
30570
- }, '');
30571
30534
  path.setAttribute('d', d);
30535
+ // Set the same path for the border to match the mask exactly
30536
+ borderPath.setAttribute('d', d);
30572
30537
  if (antiFraud) {
30573
30538
  setBorderType({
30574
30539
  type: borderType,
@@ -30596,6 +30561,8 @@ const renderOCRMask = params => {
30596
30561
  if (borderType === 'bordered') {
30597
30562
  rectOfFrame.setAttribute('stroke', color);
30598
30563
  rectOfFrame.setAttribute('stroke-opacity', opacity.toString());
30564
+ borderPath.setAttribute('stroke', color);
30565
+ borderPath.setAttribute('stroke-opacity', opacity.toString());
30599
30566
  } else {
30600
30567
  pathOfFrame.setAttribute('stroke', color);
30601
30568
  pathOfFrame.setAttribute('stroke-opacity', opacity.toString());
@@ -32492,6 +32459,9 @@ function startOCR(config) {
32492
32459
  hintText: document.createElement('div'),
32493
32460
  statusText: document.createElement('div'),
32494
32461
  statusTextPanel: document.createElement('div'),
32462
+ directionText: document.createElement('div'),
32463
+ directionIcon: document.createElement('div'),
32464
+ directionTextPanel: document.createElement('div'),
32495
32465
  lottieMask: document.createElement('div'),
32496
32466
  arrowAnimationContainer: document.createElement('div'),
32497
32467
  scanAnimationContainer: document.createElement('div'),
@@ -32558,7 +32528,6 @@ function startOCR(config) {
32558
32528
  let rotateCard;
32559
32529
  let getIsRotateCardAnimating;
32560
32530
  let stopAnimate;
32561
- setHintTextLocale();
32562
32531
  setCorrectViewHeight();
32563
32532
  let countdownCaptureTimer;
32564
32533
  let toastManualCapture = null;
@@ -32630,6 +32599,7 @@ function startOCR(config) {
32630
32599
  function startAntiFraud(type, cardType) {
32631
32600
  const animateInterval = 2 * TIME_UNIT.SECOND;
32632
32601
  const nextAnimateInterval = 6 * TIME_UNIT.SECOND;
32602
+ let eStage = null;
32633
32603
  let needDeformationCount = 0;
32634
32604
  setStatusEvent$1(StatusEvent.TWID);
32635
32605
  setStatusView(StatusView.Init);
@@ -32727,6 +32697,10 @@ function startOCR(config) {
32727
32697
  stopAnimate();
32728
32698
  previosAntiFraudAnimateTime = Date.now();
32729
32699
  uiComponentOCRMask.setCardBorderColor('pass');
32700
+ // Add 2 second delay before moving to next stage
32701
+ setTimeout(() => {
32702
+ console.log('Stage pass delay completed, ready for next direction');
32703
+ }, 2000);
32730
32704
  break;
32731
32705
  case EAuthMeIDCardAntiFraudStatus.Pass:
32732
32706
  uiComponentOCRMask.setCardBorderColor('pass');
@@ -32768,7 +32742,10 @@ function startOCR(config) {
32768
32742
  })), sendFrame(canvasSizeInfo, uiComponentOCR.image, uiComponentBasic.video, config.onAntiFraudFrame, ocrEngineConfig.fraudMaxFps, false, 'jpg', undefined), map(x => x.result), tap(x => {
32769
32743
  applyTextByResult(x);
32770
32744
  cardRotateByStage(x.eStage);
32771
- cardRotateTextProcess(x.eStage);
32745
+ if (isTutorialFinish) {
32746
+ cardRotateTextProcess(x.eStage, eStage != x.eStage);
32747
+ eStage = x.eStage;
32748
+ }
32772
32749
  if (x.eStage !== currentAntiFraudStage) {
32773
32750
  needDeformationCount = 0;
32774
32751
  previosAntiFraudAnimateTime = 0;
@@ -32826,8 +32803,6 @@ function startOCR(config) {
32826
32803
  x,
32827
32804
  y
32828
32805
  })), config.ocrConfig.needAntiFraud);
32829
- setHintTextLocale();
32830
- // }
32831
32806
  const applyTextByResult = result => {
32832
32807
  uiComponentOCR.statusText.classList.add('non-empty');
32833
32808
  switch (result.eStatus) {
@@ -32858,6 +32833,11 @@ function startOCR(config) {
32858
32833
  uiComponentOCRMask.setCardBorderColor('error');
32859
32834
  blurCount++;
32860
32835
  break;
32836
+ case EAuthMeCardOCRStatus.Motion:
32837
+ uiComponentOCR.statusText.textContent = translateService.translate('sdk.general.verify.error.motion');
32838
+ sendStatusDescription$1(StatusDescription.Motion);
32839
+ uiComponentOCRMask.setCardBorderColor('error');
32840
+ break;
32861
32841
  case EAuthMeMRZServiceStatus.RecogFailed:
32862
32842
  case EAuthMeMRZServiceStatus.WrongCardType:
32863
32843
  uiComponentOCR.statusText.textContent = translateService.translate('sdk.general.verify.error.wrongCardType');
@@ -32927,8 +32907,8 @@ function startOCR(config) {
32927
32907
  if (!confirmBtns || !(confirmBtns === null || confirmBtns === void 0 ? void 0 : confirmBtns.buttonRetry) || !(confirmBtns === null || confirmBtns === void 0 ? void 0 : confirmBtns.buttonNext)) {
32928
32908
  throw new AuthmeError(ErrorCode.SDK_INTERNAL_ERROR, 'confirmBtns is null');
32929
32909
  }
32930
- const retryEvents = fromEvent(confirmBtns.buttonRetry, 'click').pipe(mapTo(true));
32931
- const confirmEvents = fromEvent(confirmBtns.buttonNext, 'click').pipe(mapTo(false));
32910
+ const retryEvents = fromEvent(confirmBtns.buttonRetry, 'click').pipe(map(() => true));
32911
+ const confirmEvents = fromEvent(confirmBtns.buttonNext, 'click').pipe(map(() => false));
32932
32912
  const allEvents$ = merge(retryEvents, confirmEvents);
32933
32913
  return yield firstValueFrom(allEvents$.pipe());
32934
32914
  // showElement(uiComponentOCR.confirmImageContainer);
@@ -32982,7 +32962,7 @@ function startOCR(config) {
32982
32962
  }), switchMap(needRetry => {
32983
32963
  if (needRetry) {
32984
32964
  ocrSendFrameAnimation = false;
32985
- return recognition(true).pipe(map(() => true));
32965
+ return recognition(true).pipe(map(() => false));
32986
32966
  } else {
32987
32967
  hideElement(captureBtn);
32988
32968
  // hideElement(uiComponentOCR.confirmImageContainer);
@@ -33426,13 +33406,16 @@ function startOCR(config) {
33426
33406
  yield finishTutorial(point);
33427
33407
  return;
33428
33408
  }))));
33429
- countdownTimer(3);
33430
- uiComponentOCR.confirmBtn.disabled = false;
33409
+ countdownTimer(uiThemeConfig.fraudAnimationLoadingPage.countdownTime);
33410
+ uiComponentOCR.confirmBtn.disabled = true;
33431
33411
  function countdownTimer(countdown) {
33432
33412
  return __awaiter(this, void 0, void 0, function* () {
33433
33413
  if (countdown <= 0 && !isTutorialFinish) {
33434
33414
  uiComponentOCR.confirmBtn.innerText = translateService.translate('sdk.guard.verify.guide.start');
33435
- yield finishTutorial(point);
33415
+ uiComponentOCR.confirmBtn.disabled = false;
33416
+ if (uiThemeConfig.fraudAnimationLoadingPage.isAutoTapEnabled) {
33417
+ yield finishTutorial(point);
33418
+ }
33436
33419
  return;
33437
33420
  }
33438
33421
  uiComponentOCR.confirmBtn.innerText = `${translateService.translate('sdk.guard.verify.guide.start')} (${countdown})`;
@@ -33704,7 +33687,6 @@ function startOCR(config) {
33704
33687
  if (!cardMatchROI || cardMatchROI.length == 0) throw new AuthmeError(ErrorCode.SDK_INTERNAL_ERROR, 'getCardMatchROI is null');
33705
33688
  uiComponentOCRMask.setCardBorderColor('error');
33706
33689
  uiComponentOCRMask.setCardPoints(cardMatchROI, config.ocrConfig.needAntiFraud, facingMode === 'front');
33707
- setHintTextLocale();
33708
33690
  currentAntiFraudStage = stage;
33709
33691
  if (uiThemeConfig.fraudScanHint.isEnabled && (isTutorialFinish && !getIsRotateCardAnimating() || mandatoryRotate)) {
33710
33692
  yield stopAnimate();
@@ -33712,19 +33694,69 @@ function startOCR(config) {
33712
33694
  }
33713
33695
  });
33714
33696
  }
33715
- function cardRotateTextProcess(stage) {
33697
+ function cardRotateTextProcess(stage, showDirection = false) {
33698
+ // Clear any existing text and icon first
33699
+ uiComponentOCR.directionIcon.innerHTML = '';
33700
+ // Helper function to set up direction display
33701
+ const setupDirectionDisplay = (direction, translationKey, iconOnRight = false) => {
33702
+ const arrow = createDirectionArrow(direction);
33703
+ console.log(`DEBUG: Created ${direction} arrow SVG:`, arrow);
33704
+ uiComponentOCR.directionIcon.appendChild(arrow);
33705
+ // Set text
33706
+ uiComponentOCR.directionText.textContent = translateService.translate(translationKey);
33707
+ console.log('DEBUG: Direction text set to:', uiComponentOCR.directionText.textContent);
33708
+ // Re-order elements based on direction
33709
+ if (iconOnRight) {
33710
+ // Text first, then icon
33711
+ uiComponentOCR.directionTextPanel.appendChild(uiComponentOCR.directionText);
33712
+ uiComponentOCR.directionTextPanel.appendChild(uiComponentOCR.directionIcon);
33713
+ } else {
33714
+ // Icon first, then text
33715
+ uiComponentOCR.directionTextPanel.appendChild(uiComponentOCR.directionIcon);
33716
+ uiComponentOCR.directionTextPanel.appendChild(uiComponentOCR.directionText);
33717
+ }
33718
+ if (showDirection) {
33719
+ uiComponentOCR.directionTextPanel.style.display = 'flex';
33720
+ // Set timer to hide panel after 2 seconds (for any direction)
33721
+ setTimeout(() => {
33722
+ uiComponentOCR.directionTextPanel.style.display = 'none';
33723
+ }, 2000);
33724
+ }
33725
+ // Set top text
33726
+ setTopText(translateService.translate('sdk.guard.verify.guide.idCardFlip'));
33727
+ };
33728
+ // Create direction arrow using embedded SVG content
33729
+ const createDirectionArrow = direction => {
33730
+ const container = document.createElement('div');
33731
+ const svgContent = {
33732
+ left: `<svg width="72" height="72" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
33733
+ <path d="M35.6768 31.1478C36.2223 32.1083 37.4431 32.4447 38.4036 31.8993C39.3641 31.3538 39.7005 30.133 39.155 29.1725L37.4159 30.1601L35.6768 31.1478ZM1.16989 17.0763C0.388844 17.8573 0.388844 19.1237 1.16989 19.9047L13.8978 32.6326C14.6789 33.4137 15.9452 33.4137 16.7262 32.6326C17.5073 31.8516 17.5073 30.5853 16.7262 29.8042L5.41253 18.4905L16.7262 7.1768C17.5073 6.39575 17.5073 5.12942 16.7262 4.34837C15.9452 3.56732 14.6789 3.56732 13.8978 4.34837L1.16989 17.0763ZM37.4159 30.1601L39.155 29.1725C34.775 21.46 29.0347 18.217 22.5604 16.9896C19.3956 16.3896 16.0872 16.2747 12.7603 16.2999C11.0948 16.3125 9.39768 16.3609 7.70512 16.4052C6.00456 16.4497 4.30124 16.4905 2.58411 16.4905V18.4905V20.4905C4.35894 20.4905 6.10892 20.4484 7.80987 20.4038C9.5188 20.3591 11.1714 20.3121 12.7906 20.2998C16.0333 20.2752 19.0348 20.3924 21.8153 20.9196C27.2316 21.9464 31.9232 24.5383 35.6768 31.1478L37.4159 30.1601Z" fill="#4AD396"/>
33734
+ </svg>`,
33735
+ right: `<svg width="72" height="72" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
33736
+ <path d="M0.844991 29.1725C0.29952 30.133 0.635957 31.3538 1.59644 31.8993C2.55693 32.4447 3.77775 32.1083 4.32322 31.1478L2.58411 30.1601L0.844991 29.1725ZM38.8301 19.9047C39.6112 19.1237 39.6112 17.8573 38.8301 17.0763L26.1022 4.34837C25.3212 3.56732 24.0548 3.56732 23.2738 4.34837C22.4927 5.12942 22.4927 6.39575 23.2738 7.1768L34.5875 18.4905L23.2738 29.8042C22.4927 30.5853 22.4927 31.8516 23.2738 32.6326C24.0548 33.4137 25.3212 33.4137 26.1022 32.6326L38.8301 19.9047ZM2.58411 30.1601L4.32322 31.1478C8.07682 24.5383 12.7684 21.9464 18.1847 20.9196C20.9652 20.3924 23.9667 20.2752 27.2094 20.2998C28.8287 20.3121 30.4812 20.3591 32.1902 20.4038C33.8911 20.4484 35.6411 20.4905 37.4159 20.4905V18.4905V16.4905C35.6988 16.4905 33.9955 16.4497 32.2949 16.4052C30.6023 16.3609 28.9052 16.3125 27.2397 16.2999C23.9128 16.2747 20.6044 16.3896 17.4396 16.9896C10.9653 18.217 5.225 21.46 0.844991 29.1725L2.58411 30.1601Z" fill="#4AD396"/>
33737
+ </svg>`,
33738
+ up: `<svg width="72" height="72" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
33739
+ <path d="M31.1478 35.6768C32.1083 36.2223 32.4447 37.4431 31.8993 38.4036C31.3538 39.3641 30.133 39.7005 29.1725 39.155L30.1601 37.4159L31.1478 35.6768ZM17.0763 1.16989C17.8573 0.388844 19.1237 0.388844 19.9047 1.16989L32.6326 13.8978C33.4137 14.6789 33.4137 15.9452 32.6326 16.7262C31.8516 17.5073 30.5853 17.5073 29.8042 16.7262L18.4905 5.41253L7.1768 16.7262C6.39575 17.5073 5.12942 17.5073 4.34837 16.7262C3.56733 15.9452 3.56733 14.6789 4.34837 13.8978L17.0763 1.16989ZM30.1601 37.4159L29.1725 39.155C21.46 34.775 18.217 29.0347 16.9896 22.5604C16.3896 19.3956 16.2747 16.0872 16.2999 12.7603C16.3125 11.0948 16.3609 9.39768 16.4052 7.70512C16.4497 6.00456 16.4905 4.30124 16.4905 2.58411L18.4905 2.58411L20.4905 2.58411C20.4905 4.35894 20.4484 6.10892 20.4038 7.80987C20.3591 9.5188 20.3121 11.1714 20.2998 12.7906C20.2752 16.0333 20.3924 19.0348 20.9196 21.8153C21.9465 27.2316 24.5383 31.9232 31.1478 35.6768L30.1601 37.4159Z" fill="#4AD396"/>
33740
+ </svg>`,
33741
+ down: `<svg width="72" height="72" viewBox="0 0 41 40" fill="none" xmlns="http://www.w3.org/2000/svg">
33742
+ <path d="M15.0559 0.844991C14.0954 0.299519 12.8746 0.635956 12.3291 1.59644C11.7837 2.55693 12.1201 3.77775 13.0806 4.32322L14.0683 2.58411L15.0559 0.844991ZM24.3237 38.8301C25.1047 39.6112 26.371 39.6112 27.1521 38.8301L39.88 26.1022C40.6611 25.3212 40.6611 24.0548 39.88 23.2738C39.099 22.4927 37.8326 22.4927 37.0516 23.2738L25.7379 34.5875L14.4242 23.2738C13.6431 22.4927 12.3768 22.4927 11.5957 23.2738C10.8147 24.0548 10.8147 25.3212 11.5957 26.1022L24.3237 38.8301ZM14.0683 2.58411L13.0806 4.32322C19.6901 8.07682 22.2819 12.7684 23.3088 18.1847C23.836 20.9652 23.9531 23.9667 23.9286 27.2094C23.9163 28.8287 23.8693 30.4812 23.8246 32.1902C23.78 33.8911 23.7379 35.6411 23.7379 37.4159L25.7379 37.4159L27.7379 37.4159C27.7379 35.6988 27.7786 33.9955 27.8232 32.2949C27.8675 30.6023 27.9159 28.9052 27.9285 27.2397C27.9537 23.9128 27.8388 20.6044 27.2388 17.4396C26.0113 10.9653 22.7684 5.225 15.0559 0.844991L14.0683 2.58411Z" fill="#4AD396"/>
33743
+ </svg>`
33744
+ };
33745
+ container.innerHTML = svgContent[direction];
33746
+ return container;
33747
+ };
33716
33748
  switch (stage) {
33717
33749
  case EAuthMeIDCardAntiFraudStage.Left:
33718
- facingMode === 'front' ? setTopText(translateService.translate('sdk.guard.verify.guide.idCardFlip')) : setTopText(translateService.translate('sdk.guard.verify.guide.idCardFlip'));
33750
+ setupDirectionDisplay('left', 'sdk.guard.verify.guide.idCardFlip.left');
33719
33751
  break;
33720
33752
  case EAuthMeIDCardAntiFraudStage.Right:
33721
- facingMode === 'front' ? setTopText(translateService.translate('sdk.guard.verify.guide.idCardFlip')) : setTopText(translateService.translate('sdk.guard.verify.guide.idCardFlip'));
33753
+ setupDirectionDisplay('right', 'sdk.guard.verify.guide.idCardFlip.right', true);
33722
33754
  break;
33723
33755
  case EAuthMeIDCardAntiFraudStage.Up:
33724
- setTopText(translateService.translate('sdk.guard.verify.guide.idCardFlip'));
33756
+ setupDirectionDisplay('up', 'sdk.guard.verify.guide.idCardFlip.up');
33725
33757
  break;
33726
33758
  case EAuthMeIDCardAntiFraudStage.Down:
33727
- setTopText(translateService.translate('sdk.guard.verify.guide.idCardFlip'));
33759
+ setupDirectionDisplay('down', 'sdk.guard.verify.guide.idCardFlip.down', true);
33728
33760
  break;
33729
33761
  }
33730
33762
  }
@@ -34386,7 +34418,7 @@ class LivenessVerifyModule {
34386
34418
  }
34387
34419
  }
34388
34420
 
34389
- function handleUploadError$1(error) {
34421
+ function handleUploadError$1(_error) {
34390
34422
  return new Promise(resolve => {
34391
34423
  uploadModal({
34392
34424
  type: 'error',
@@ -34450,6 +34482,7 @@ class LivenessModule {
34450
34482
  try {
34451
34483
  const result = yield firstValueFrom(yield startLiveness({
34452
34484
  getOptionConfig: () => __awaiter(this, void 0, void 0, function* () {
34485
+ console.log('config.deviceType', config.deviceType);
34453
34486
  const res = yield LivenessAPI.IdentityVerification.option(config.deviceType);
34454
34487
  const themeId = res.themeId;
34455
34488
  if (!themeId) {
@@ -34585,7 +34618,7 @@ class LivenessModule {
34585
34618
  // );
34586
34619
  yield handleUpload(id, frameList, resultList, meta, config, shouldEncrypt, encryptDataBase64);
34587
34620
  // upload finish view
34588
- const successView = uploadModal({
34621
+ uploadModal({
34589
34622
  type: 'success',
34590
34623
  titleSuccess: getTranslateInstance().translate('sdk.general.successUpload')
34591
34624
  });
@@ -37164,7 +37197,7 @@ class AuthmeIdentityVerification extends AuthmeFunctionModule {
37164
37197
  getCustomerState(arg) {
37165
37198
  return __awaiter(this, void 0, void 0, function* () {
37166
37199
  const paramsDefault = {
37167
- waitingTime: 3,
37200
+ waitingTime: 60,
37168
37201
  retryTimes: 2
37169
37202
  };
37170
37203
  if (arg === null || arg === void 0 ? void 0 : arg.retryTimes) {
@@ -37213,8 +37246,8 @@ class AuthmeIdentityVerification extends AuthmeFunctionModule {
37213
37246
  }
37214
37247
 
37215
37248
  var name = "authme/sdk";
37216
- var version$1 = "2.8.24";
37217
- var date = "2025-07-31T06:39:41+0000";
37249
+ var version$1 = "2.8.26";
37250
+ var date = "2025-09-30T03:00:07+0000";
37218
37251
  var packageInfo = {
37219
37252
  name: name,
37220
37253
  version: version$1,
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@authme/identity-verification",
3
- "version": "2.8.24",
3
+ "version": "2.8.26",
4
4
  "peerDependencies": {
5
5
  "core-js": "^3.6.0",
6
6
  "lottie-web": "^5.9.2",
7
7
  "rxjs": "^7.4.0",
8
- "@authme/core": "2.8.24",
9
- "@authme/engine": "2.8.24",
10
- "@authme/id-recognition": "2.8.24",
11
- "@authme/liveness": "2.8.24",
12
- "@authme/util": "2.8.24"
8
+ "@authme/core": "2.8.26",
9
+ "@authme/engine": "2.8.26",
10
+ "@authme/id-recognition": "2.8.26",
11
+ "@authme/liveness": "2.8.26",
12
+ "@authme/util": "2.8.26"
13
13
  },
14
14
  "module": "./index.js",
15
15
  "main": "./index.cjs",
@@ -69,6 +69,9 @@ export declare const renderOCRUI: (config: {
69
69
  titleText: HTMLSpanElement;
70
70
  hintText: HTMLDivElement;
71
71
  statusText: HTMLSpanElement;
72
+ directionTextPanel: HTMLDivElement;
73
+ directionText: HTMLSpanElement;
74
+ directionIcon: HTMLSpanElement;
72
75
  statusTextPanel: HTMLDivElement;
73
76
  lottieMask: HTMLDivElement;
74
77
  arrowAnimationContainer: HTMLDivElement;