Skip to content

Commit 7fba405

Browse files
committed
implement #6, #10 + demo improvements
1 parent 8bc1dc1 commit 7fba405

35 files changed

Lines changed: 337 additions & 78 deletions

File tree

app/backend/route/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ function load(app, storage) {
6969
userAgent: userAgent,
7070
websiteHostname: config_1.config.httpServerHost,
7171
showDetectedAgeNumber: true,
72+
verificationTypeList: ['selfie', 'scanId'],
7273
},
7374
verificationVersion: session_1.AvsStorageSession.VERIFICATION_IFRAME_V1,
7475
linkBack: linkBack,

app/backend/route/token.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ function load(app, storage) {
7474
}),
7575
isLiveness: true,
7676
showDetectedAgeNumber: payloadParsed['httpParamList']['showDetectedAgeNumber'] || false,
77+
verificationTypeList: payloadParsed['httpParamList']['verificationTypeList'] || [],
7778
verificationVersion: verificationVersion,
7879
d: payload,
7980
sessionId: sessionId,

app/frontend/static/css/main.css

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -816,6 +816,22 @@ a {
816816
#avsMainContainer .page#termsAndConditionsArea .introHeading {
817817
margin-left: 0;
818818
}
819+
#avsMainContainer .page .videoMirrorContainer {
820+
z-index: 5;
821+
position: fixed;
822+
bottom: 20px;
823+
right: 20px;
824+
font-size: 32px;
825+
opacity: 0.8;
826+
}
827+
#avsMainContainer .page .videoMirrorContainer a {
828+
cursor: pointer;
829+
color: rgb(255, 255, 255);
830+
padding: 10px;
831+
}
832+
#avsMainContainer .page .videoMirrorContainer a:hover {
833+
opacity: 0.5;
834+
}
819835
#avsMainContainer #debugArea {
820836
position: fixed;
821837
top: 0;

app/frontend/static/js/app/avs.js

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16271,6 +16271,8 @@ var Avs;
1627116271
VerificationStepGlobal.VERIFICATION_TYPE_SELFIE_AND_SCAN_ID_FORCED = 2;
1627216272
VerificationStepGlobal.VERIFICATION_TYPE_CREDIT_CARD = 3;
1627316273
VerificationStepGlobal.VERIFICATION_TYPE_SCAN_ID = 4;
16274+
VerificationStepGlobal.VERIFICATION_TYPE_SELFIE_NAME = 'selfie';
16275+
VerificationStepGlobal.VERIFICATION_TYPE_SCAN_ID_NAME = 'scanId';
1627416276
VerificationStepGlobal.FACE_API_TYPE_FAST = 1;
1627516277
VerificationStepGlobal.FACE_API_TYPE_PRECISE = 2;
1627616278
VerificationStepGlobal.TESSERACT_TYPE_FAST_EN = 1;
@@ -19182,6 +19184,9 @@ var Avs;
1918219184
Tabs.prototype.isSelected = function (tabNumber) {
1918319185
return this.element.find('.avsTab:eq(' + tabNumber + ')').hasClass('isSelected');
1918419186
};
19187+
Tabs.prototype.getFirstVisibleTab = function () {
19188+
return this.element.find('.avsTab:not(.isHidden)').index();
19189+
};
1918519190
Tabs.prototype.selectTab = function (tabNumber) {
1918619191
this.deselectAllTabs();
1918719192
this.unHighlightTab(tabNumber);
@@ -19190,6 +19195,9 @@ var Avs;
1919019195
this.element.parent().find('.avsTabContent').addClass('isHidden');
1919119196
this.element.parent().find('.avsTabContent:eq(' + tabNumber + ')').removeClass('isHidden');
1919219197
};
19198+
Tabs.prototype.clickTab = function (tabNumber) {
19199+
this.element.find('.avsTab:eq(' + tabNumber + ')').trigger('click');
19200+
};
1919319201
Tabs.prototype.deselectAllTabs = function () {
1919419202
this.element.find('.avsTab').removeClass('isSelected');
1919519203
};
@@ -23480,6 +23488,58 @@ var Avs;
2348023488
})(Ui = Avs.Ui || (Avs.Ui = {}));
2348123489
})(Avs || (Avs = {}));
2348223490

23491+
"use strict";
23492+
var __extends = (this && this.__extends) || (function () {
23493+
var extendStatics = function (d, b) {
23494+
extendStatics = Object.setPrototypeOf ||
23495+
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
23496+
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
23497+
return extendStatics(d, b);
23498+
};
23499+
return function (d, b) {
23500+
if (typeof b !== "function" && b !== null)
23501+
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
23502+
extendStatics(d, b);
23503+
function __() { this.constructor = d; }
23504+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
23505+
};
23506+
})();
23507+
var Avs;
23508+
(function (Avs) {
23509+
var Ui;
23510+
(function (Ui) {
23511+
var Library;
23512+
(function (Library) {
23513+
var VideoMirrorButton = /** @class */ (function (_super) {
23514+
__extends(VideoMirrorButton, _super);
23515+
function VideoMirrorButton(event, selector) {
23516+
var _this = _super.call(this, event) || this;
23517+
_this.event = event;
23518+
_this.getElement(selector);
23519+
_this.initStates();
23520+
return _this;
23521+
}
23522+
VideoMirrorButton.prototype.getElement = function (selector) {
23523+
if (!selector) {
23524+
selector = '#videoMirrorButton';
23525+
}
23526+
this.element = $(selector);
23527+
};
23528+
VideoMirrorButton.prototype.initStates = function () {
23529+
var entity = Avs.Entity.Ui.getInstance();
23530+
entity.states.VideoMirrorButton = {
23531+
visible: this.element.is(':visible'),
23532+
enabled: !this.element.attr('disabled')
23533+
};
23534+
this.states = entity.states.VideoMirrorButton;
23535+
};
23536+
return VideoMirrorButton;
23537+
}(Avs.Ui.Handler.Button));
23538+
Library.VideoMirrorButton = VideoMirrorButton;
23539+
})(Library = Ui.Library || (Ui.Library = {}));
23540+
})(Ui = Avs.Ui || (Avs.Ui = {}));
23541+
})(Avs || (Avs = {}));
23542+
2348323543
"use strict";
2348423544
var __extends = (this && this.__extends) || (function () {
2348523545
var extendStatics = function (d, b) {

app/frontend/static/js/app/avsFactory.js

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -701,6 +701,7 @@ var AvsFactory;
701701
ScanIdAgeVerificationConfirmationNoButton: new Avs.Ui.Library.ScanIdAgeVerificationConfirmationNoButton(ScanIdAgeVerificationPage.instance.event),
702702
DocumentProcessingCanvasLoadingOverlayArea: new Avs.Ui.Library.DocumentProcessingCanvasLoadingOverlayArea(ScanIdAgeVerificationPage.instance.event),
703703
ScanIdAgeVerificationFaceSimilarityArea: new Avs.Ui.Library.ScanIdAgeVerificationFaceSimilarityArea(ScanIdAgeVerificationPage.instance.event),
704+
VideoMirrorButton: new Avs.Ui.Library.VideoMirrorButton(ScanIdAgeVerificationPage.instance.event),
704705
};
705706
ScanIdAgeVerificationPage.instance.ui.ScanIdAgeVerificationLoadingLabelPercentCounter.setStepNumber(7);
706707
ScanIdAgeVerificationPage.instance.ui.ScanIdAgeVerificationBirthDateButton.showLoading();
@@ -772,6 +773,9 @@ var AvsFactory;
772773
ScanIdAgeVerificationPage.instance.ui.ScanIdAgeVerificationDocumentProcessingConfirmationArea.hide();
773774
ScanIdAgeVerificationPage.instance.ui.ScanIdAgeVerificationDocumentProcessingProcessArea.hide();
774775
});
776+
ScanIdAgeVerificationPage.instance.ui.VideoMirrorButton.onClick(function () {
777+
ScanIdAgeVerificationPage.instance.plugin.Library.Video.CameraSource.getVideoElement().toggleClass('mirrored');
778+
});
775779
};
776780
return Binding;
777781
}());
@@ -1469,7 +1473,7 @@ var AvsFactory;
14691473
detectedAgeString += 'Adult';
14701474
}
14711475
else {
1472-
detectedAgeString += 'Id card required';
1476+
detectedAgeString += 'Minor';
14731477
}
14741478
if (Application.showDetectedAgeNumber) {
14751479
detectedAgeString += ' (' + age + ')';
@@ -1566,7 +1570,11 @@ var AvsFactory;
15661570
}
15671571
return;
15681572
}
1569-
Method.goToNextStep();
1573+
if (AvsFactory.StartPage.Config.VERIFICATION_TYPE_LIST.includes(Avs.Entity.VerificationStepGlobal.VERIFICATION_TYPE_SCAN_ID_NAME)) {
1574+
Method.goToNextStep();
1575+
return;
1576+
}
1577+
Method.goToFailStep(25066, 'Adult age was not detected');
15701578
return;
15711579
}
15721580
if (SelfieAgeDetectionPage.instance.entity.SelfieAgeDetection.totalScanNumber == SelfieAgeDetectionPage.Config.MAX_TOTAL_FACE_SCAN_NUMBER) {
@@ -1825,6 +1833,10 @@ var AvsFactory;
18251833
Config.PAYLOAD = config.payload || Config.PAYLOAD;
18261834
Config.SESSION_ID = config.sessionId || Config.SESSION_ID;
18271835
Config.PARTNER_COLOR_CONFIG = config.partnerColorConfig || Config.PARTNER_COLOR_CONFIG;
1836+
if (config.verificationTypeList.includes(Avs.Entity.VerificationStepGlobal.VERIFICATION_TYPE_SELFIE_NAME) ||
1837+
config.verificationTypeList.includes(Avs.Entity.VerificationStepGlobal.VERIFICATION_TYPE_SCAN_ID_NAME)) {
1838+
Config.VERIFICATION_TYPE_LIST = config.verificationTypeList;
1839+
}
18281840
};
18291841
Config.MAIN_CONTAINER_SELECTOR = '#avsMainContainer';
18301842
Config.START_PAGE_LAYER_SELECTOR = '#startPage';
@@ -1863,6 +1875,7 @@ var AvsFactory;
18631875
Config.VERIFICATION_VERSION = Config.VERIFICATION_VERSION_STANDARD_V1;
18641876
Config.SESSION_ID = null;
18651877
Config.PARTNER_COLOR_CONFIG = null;
1878+
Config.VERIFICATION_TYPE_LIST = ['selfie', 'scanId'];
18661879
Config.DEFAULT_DEBUG_LEVEL = 4;
18671880
Config.API_BASE_ENDPOINT = '';
18681881
Config.KEY_LOCAL_STORAGE_TERMS_AGREED = 'GoCamLocalStorageTermsWereAgreed';
@@ -1918,6 +1931,8 @@ var AvsFactory;
19181931
if (Application.forceIpCountry) {
19191932
ipCountry = Application.forceIpCountry.toUpperCase();
19201933
}
1934+
StartPage.instance.ui.VerificationTypeTabs.hideTab(Avs.Ui.Library.VerificationTypeTabs.TAB_SELFIE_NUMBER);
1935+
StartPage.instance.ui.VerificationTypeTabs.hideTab(Avs.Ui.Library.VerificationTypeTabs.TAB_SCAN_ID_NUMBER);
19211936
// get this dynamically later
19221937
var countryToTabVisibilityConfig = {
19231938
"DE": (_a = {},
@@ -1926,16 +1941,21 @@ var AvsFactory;
19261941
_a)
19271942
};
19281943
if (typeof countryToTabVisibilityConfig[ipCountry] != "undefined") {
1929-
if (!countryToTabVisibilityConfig[ipCountry][Avs.Ui.Library.VerificationTypeTabs.TAB_SELFIE_NUMBER]) {
1930-
StartPage.instance.ui.VerificationTypeTabs.hideTab(Avs.Ui.Library.VerificationTypeTabs.TAB_SELFIE_NUMBER);
1944+
if (countryToTabVisibilityConfig[ipCountry][Avs.Ui.Library.VerificationTypeTabs.TAB_SELFIE_NUMBER]) {
1945+
StartPage.instance.ui.VerificationTypeTabs.showTab(Avs.Ui.Library.VerificationTypeTabs.TAB_SELFIE_NUMBER);
19311946
}
1932-
if (!countryToTabVisibilityConfig[ipCountry][Avs.Ui.Library.VerificationTypeTabs.TAB_SCAN_ID_NUMBER]) {
1933-
StartPage.instance.ui.VerificationTypeTabs.hideTab(Avs.Ui.Library.VerificationTypeTabs.TAB_SCAN_ID_NUMBER);
1947+
if (countryToTabVisibilityConfig[ipCountry][Avs.Ui.Library.VerificationTypeTabs.TAB_SCAN_ID_NUMBER]) {
1948+
StartPage.instance.ui.VerificationTypeTabs.showTab(Avs.Ui.Library.VerificationTypeTabs.TAB_SCAN_ID_NUMBER);
1949+
}
1950+
}
1951+
else {
1952+
if (StartPage.Config.VERIFICATION_TYPE_LIST.includes(Avs.Entity.VerificationStepGlobal.VERIFICATION_TYPE_SELFIE_NAME)) {
1953+
StartPage.instance.ui.VerificationTypeTabs.showTab(Avs.Ui.Library.VerificationTypeTabs.TAB_SELFIE_NUMBER);
1954+
}
1955+
if (StartPage.Config.VERIFICATION_TYPE_LIST.includes(Avs.Entity.VerificationStepGlobal.VERIFICATION_TYPE_SCAN_ID_NAME)) {
1956+
StartPage.instance.ui.VerificationTypeTabs.showTab(Avs.Ui.Library.VerificationTypeTabs.TAB_SCAN_ID_NUMBER);
19341957
}
19351958
}
1936-
// handle also the selected tab together with the visible tabs dynamically
1937-
var defaultTab = StartPage.instance.ui.VerificationTypeTabs.verificationTypeToTabNumber(StartPage.Config.VERIFICATION_TYPE_DEFAULT);
1938-
StartPage.instance.ui.VerificationTypeTabs.selectTab(defaultTab);
19391959
var termsWereAgreed = Avs.Helper.Common.getLocalStorageBooleanValue(StartPage.Config.KEY_LOCAL_STORAGE_TERMS_AGREED);
19401960
if (termsWereAgreed === true) {
19411961
StartPage.instance.ui.TermsAndConditionsCheckbox.check();
@@ -2047,8 +2067,10 @@ var AvsFactory;
20472067
// https://github.com/mexitek/phpColors/blob/master/src/Mexitek/PHPColors/Color.php#L474
20482068
Method.applyPartnerColor();
20492069
$('body').attr('style', '');
2070+
var defaultTab = StartPage.instance.ui.VerificationTypeTabs.getFirstVisibleTab();
2071+
StartPage.instance.ui.VerificationTypeTabs.selectTab(defaultTab);
2072+
StartPage.instance.ui.VerificationTypeTabs.clickTab(defaultTab);
20502073
StartPage.instance.postMessage.emit(StartPage.Config.EVENT_ON_START_PAGE_LOADED);
2051-
StartPage.instance.entity.VerificationStepGlobal.verificationType = StartPage.Config.VERIFICATION_TYPE_DEFAULT;
20522074
StartPage.instance.entity.VerificationStepGlobal.partnerId = StartPage.Config.PARTNER_ID;
20532075
StartPage.instance.entity.VerificationStepGlobal.payload = StartPage.Config.PAYLOAD;
20542076
StartPage.instance.entity.VerificationStepGlobal.sessionId = StartPage.Config.SESSION_ID;

app/frontend/static/js/app/common.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -838,6 +838,7 @@ var AvsToken;
838838
payload: Application.d,
839839
sessionId: Application.sessionId,
840840
partnerColorConfig: Application.partnerColorConfig,
841+
verificationTypeList: Application.verificationTypeList,
841842
});
842843
AvsFactory.StartPage.init();
843844
}

app/frontend/views/token/index.twig

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,12 @@
494494

495495
<div id="scanIdAgeVerificationPage" class="page layoutDetection isHidden">
496496

497+
<div class="videoMirrorContainer">
498+
<a id="videoMirrorButton">
499+
<i class="fa fa-refresh" aria-hidden="true"></i>
500+
</a>
501+
</div>
502+
497503
<div id="ratioRecommendArea" class="page layoutHint isHidden">
498504
<h1 class="introHeading">
499505
<i class="fa fa-asterisk" aria-hidden="true"></i>Performance hint

example/nodejs/app/app.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ const bodyParser = require('body-parser');
66
const favicon = require('serve-favicon');
77

88
const appConfig = {
9-
cipherKey: 'zIkmW2zEgzlTLTRC5xeMbcOhHcE5sBHB',
9+
cipherKey : 'zIkmW2zEgzlTLTRC5xeMbcOhHcE5sBHB',
10+
exampleBaseUrl: 'http://localhost:8000'
1011
};
1112

1213
app.use(bodyParser.urlencoded({extended: false}));
@@ -25,7 +26,7 @@ const iframeRoute = require('./route/iframe');
2526

2627
redirectRoute.load(app, appConfig);
2728
iframeRoute.load(app, appConfig);
28-
indexRoute.load(app);
29+
indexRoute.load(app, appConfig);
2930

3031
const server = http.Server(app);
3132

example/nodejs/app/route/iframe.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ function load(app, appConfig) {
3232
websiteHostname: 'example.com',
3333
paramList : {
3434
// optional
35-
showDetectedAgeNumber: false
35+
showDetectedAgeNumber: false,
36+
verificationTypeList : ['selfie', 'scanId'],
3637
}
3738
},
3839
verificationVersion: AvsNodejsSdkV1.VERIFICATION_VERSION_IFRAME_V1,
@@ -44,10 +45,11 @@ function load(app, appConfig) {
4445
stateCode : '',
4546
});
4647

47-
let goCamIframeUrl = avsSdk.toIframeUrl();
48+
let goCamIframeUrl = avsSdk.toIframeUrl('http://localhost:3300');
4849

4950
res.render('iframe.twig', {
50-
goCamIframeUrl: goCamIframeUrl
51+
goCamIframeUrl: goCamIframeUrl,
52+
exampleBaseUrl: appConfig.exampleBaseUrl,
5153
});
5254

5355
});
@@ -78,7 +80,7 @@ function load(app, appConfig) {
7880
return;
7981
}
8082

81-
if (avsSdk.verificationResult['state'] === 'success') {
83+
if (avsSdk.verificationResult['stateInt'] === 2) {
8284
res.send({
8385
success : 1,
8486
sessionId: avsSdk.verificationResult['sessionId']

example/nodejs/app/route/index.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,17 @@ const URL = require("url");
22
const fs = require('node:fs');
33
const path = require('path');
44

5-
function load(app) {
5+
function load(app, appConfig) {
66

77
app.use((req, res, next) => {
88
next();
99
});
1010

1111
app.get('/', (req, res) => {
1212

13-
res.render('index.twig');
13+
res.render('index.twig', {
14+
exampleBaseUrl: appConfig.exampleBaseUrl,
15+
});
1416

1517
});
1618

0 commit comments

Comments
 (0)