kwikid-components
Version:
KwikID's Components Library
529 lines • 89 kB
JavaScript
import { __awaiter, __decorate } from "tslib";
import { Component, EventEmitter, Input, Output, ChangeDetectionStrategy } from "@angular/core";
import { logMethod } from "kwikid-toolkit";
import { detectDeviceType, requestMicrophonePermission, requestLocationPermission, testBothCamera, testFrontCamera, testBackCamera } from "./permission-checker.helper";
import { DEVICE_PERMISSION_INSTRUCTIONS, INITIALIZATION_DELAY_MS, NEXT_PERMISSION_REQUEST_DELAY_MS, ALREADY_GRANTED_PERMISSION_DELAY_MS, DEFAULT_OVERALL_STATUS, DEFAULT_PERMISSION_CONFIGS } from "./permission-checker.constants";
import * as i0 from "@angular/core";
import * as i1 from "../page-header/page-header.component";
import * as i2 from "@taiga-ui/core";
import * as i3 from "kwikui";
import * as i4 from "../page-footer/page-footer.component";
import * as i5 from "@angular/common";
export class KwikIDPermissionCheckerComponent {
constructor(cdr) {
this.cdr = cdr;
this.config = undefined;
this.onClickScheduleLater = new EventEmitter();
this.allPermissionsGranted = new EventEmitter();
this.permissionError = new EventEmitter();
this.permissionStatusChange = new EventEmitter();
this.cameraTestComplete = new EventEmitter();
this.currentPermissionIndex = -1;
this.overallStatus = DEFAULT_OVERALL_STATUS;
this.errorMessage = null;
this.visiblePermissions = [];
this.headerConfig = undefined;
this.footerConfig = undefined;
this.scheduleLaterConfig = undefined;
this.currentDeviceType = "windows";
this.permissionInstructions = {};
this.isFrontCamera = false;
this.isBackCamera = false;
this.isFrontCameraGranted = false;
this.isBackCameraGranted = false;
this.hydratedPermissions = [];
}
ngOnInit() {
var _a, _b, _c;
this.currentDeviceType = detectDeviceType();
this.setDeviceSpecificInstructions();
if (this.config) {
this.headerConfig = (_a = this.config) === null || _a === void 0 ? void 0 : _a.headerConfig;
this.footerConfig = (_b = this.config) === null || _b === void 0 ? void 0 : _b.footerConfig;
this.scheduleLaterConfig = (_c = this.config) === null || _c === void 0 ? void 0 : _c.scheduleLaterConfig;
if (this.config.permissions) {
this.hydratedPermissions = this.config.permissions
.map((permInput) => {
const id = typeof permInput === "string" ? permInput : permInput.id;
if (!id) {
console.warn("PermissionChecker: Invalid permission input, ID missing.", permInput);
return null;
}
const baseConfig = DEFAULT_PERMISSION_CONFIGS[id];
let title;
let description;
let granted = false;
let status = "PENDING";
let errorMessage;
let showInstructions = false;
if (baseConfig) {
({ title, description } = baseConfig);
}
else {
if (typeof permInput === "string" ||
permInput.title === undefined ||
permInput.description === undefined) {
console.warn(`PermissionChecker: Base config for ID '${id}' not found, and title/description not provided directly in config. Skipping permission.`);
return null;
}
title = permInput.title;
description = permInput.description;
}
if (typeof permInput !== "string") {
const { title: inputTitle, description: inputDescription, granted: inputGranted, status: inputStatus, errorMessage: inputErrorMessage, showInstructions: inputShowInstructions } = permInput;
if (inputTitle !== undefined) {
title = inputTitle;
}
if (inputDescription !== undefined) {
description = inputDescription;
}
if (typeof inputGranted === "boolean") {
granted = inputGranted;
}
if (inputStatus !== undefined) {
status = inputStatus;
}
if (inputErrorMessage !== undefined) {
errorMessage = inputErrorMessage;
}
if (typeof inputShowInstructions === "boolean") {
showInstructions = inputShowInstructions;
}
}
return {
id,
title,
description,
granted,
status,
errorMessage,
showInstructions
};
})
.filter((p) => p !== null);
}
else {
this.hydratedPermissions = [];
}
}
this.checkExistingPermissions().then(() => {
this.visiblePermissions = this.getActivePermissions()
.map((id) => this.getPermissionById(id))
.filter((p) => p !== undefined);
this.updateVisiblePermissions();
setTimeout(() => {
this.startPermissionFlow();
}, INITIALIZATION_DELAY_MS);
});
}
getActivePermissions() {
const activeIdsFromConfig = [];
if (this.config && this.config.permissions) {
this.config.permissions.forEach((permissionInput) => {
const id = typeof permissionInput === "string"
? permissionInput
: permissionInput.id;
if (id &&
[
"CAMERA_BOTH",
"CAMERA_FRONT",
"CAMERA_BACK",
"MICROPHONE",
"LOCATION"
].includes(id)) {
activeIdsFromConfig.push(id);
}
});
}
const hasCameraBoth = activeIdsFromConfig.includes("CAMERA_BOTH");
const hasCameraFront = activeIdsFromConfig.includes("CAMERA_FRONT");
const hasCameraBack = activeIdsFromConfig.includes("CAMERA_BACK");
const finalActiveIds = [];
if (hasCameraFront && hasCameraBack) {
finalActiveIds.push("CAMERA_FRONT", "CAMERA_BACK");
}
else if (hasCameraBoth) {
finalActiveIds.push("CAMERA_BOTH");
}
else if (hasCameraFront) {
finalActiveIds.push("CAMERA_FRONT");
}
else if (hasCameraBack) {
finalActiveIds.push("CAMERA_BACK");
}
activeIdsFromConfig.forEach((id) => {
if (id === "MICROPHONE" && !finalActiveIds.includes("MICROPHONE")) {
finalActiveIds.push("MICROPHONE");
}
else if (id === "LOCATION" && !finalActiveIds.includes("LOCATION")) {
finalActiveIds.push("LOCATION");
}
});
return finalActiveIds;
}
setDeviceSpecificInstructions() {
switch (this.currentDeviceType) {
case "android":
this.permissionInstructions =
DEVICE_PERMISSION_INSTRUCTIONS.androidPermission;
break;
case "ios":
this.permissionInstructions =
DEVICE_PERMISSION_INSTRUCTIONS.iosPermission;
break;
case "windows":
default:
this.permissionInstructions =
DEVICE_PERMISSION_INSTRUCTIONS.windowsPermission;
break;
}
}
get deviceType() {
return (this.currentDeviceType.charAt(0).toUpperCase() +
this.currentDeviceType.slice(1));
}
checkExistingPermissions() {
return __awaiter(this, void 0, void 0, function* () {
try {
const devices = yield navigator.mediaDevices.enumerateDevices();
const hasVideoInput = devices.some((device) => device.kind === "videoinput");
const hasAudioInput = devices.some((device) => device.kind === "audioinput");
if (hasVideoInput) {
try {
const cameraPermissionState = yield navigator.permissions.query({
name: "camera"
});
const cameraBothPermission = this.getPermissionById("CAMERA_BOTH");
const cameraFrontPermission = this.getPermissionById("CAMERA_FRONT");
const cameraBackPermission = this.getPermissionById("CAMERA_BACK");
if (cameraPermissionState.state === "granted") {
if (cameraBothPermission) {
cameraBothPermission.granted = true;
}
if (cameraFrontPermission) {
cameraFrontPermission.granted = true;
}
if (cameraBackPermission) {
cameraBackPermission.granted = true;
}
}
}
catch (err) {
console.log("Could not check camera permission status");
}
}
if (hasAudioInput) {
try {
const micPermissionState = yield navigator.permissions.query({
name: "microphone"
});
const micPermission = this.getPermissionById("MICROPHONE");
if (micPermissionState.state === "granted" && micPermission) {
micPermission.granted = true;
}
}
catch (err) {
console.log("Could not check microphone permission status");
}
}
try {
const locationPermissionState = yield navigator.permissions.query({
name: "geolocation"
});
const locationPermission = this.getPermissionById("LOCATION");
if (locationPermissionState.state === "granted" && locationPermission) {
locationPermission.granted = true;
}
}
catch (err) {
console.log("Could not check location permission status");
}
}
catch (error) {
console.error("Error checking existing permissions:", error);
}
this.cdr.detectChanges();
});
}
handleOnClickScheduleLater() {
this.onClickScheduleLater.emit();
}
resetPermissionsState() {
this.currentPermissionIndex = -1;
this.overallStatus = DEFAULT_OVERALL_STATUS;
this.errorMessage = null;
this.config.permissions = this.config.permissions.map((p) => (Object.assign(Object.assign({}, p), { granted: false, status: "PENDING", showInstructions: false })));
this.visiblePermissions = this.getActivePermissions()
.map((id) => this.getPermissionById(id))
.filter((p) => p !== undefined);
this.updateVisiblePermissions();
this.startPermissionFlow();
this.cdr.detectChanges();
}
getPermissionById(id) {
return this.hydratedPermissions.find((p) => p.id === id);
}
toggleInstructions(permissionId) {
const permission = this.visiblePermissions.find((p) => p.id === permissionId);
if (permission) {
permission.showInstructions = !permission.showInstructions;
this.updateVisiblePermissions();
this.cdr.detectChanges();
}
}
getInstructionsForPermission(permissionId) {
var _a;
const p = this.getPermissionById(permissionId);
return ((_a = this.permissionInstructions[p === null || p === void 0 ? void 0 : p.id]) === null || _a === void 0 ? void 0 : _a.subInstruction) || [];
}
updatePermissionStatus(id, granted, error) {
const permission = this.visiblePermissions.find((p) => p.id === id);
const configPermission = this.getPermissionById(id);
if (permission) {
permission.granted = granted;
permission.status = granted ? "GRANTED" : "DENIED";
if (!granted) {
permission.errorMessage =
(error === null || error === void 0 ? void 0 : error.message) || "Permission was denied by the user.";
permission.showInstructions = true;
this.permissionError.emit({
permissionId: id,
errorMsg: permission.errorMessage,
error
});
}
this.cdr.detectChanges();
}
if (configPermission) {
configPermission.granted = granted;
configPermission.status = granted ? "GRANTED" : "DENIED";
if (!granted) {
if (!configPermission.errorMessage) {
configPermission.errorMessage =
(error === null || error === void 0 ? void 0 : error.message) || "Permission was denied by the user.";
}
configPermission.showInstructions = true;
}
}
this.permissionStatusChange.emit(this.visiblePermissions);
}
refreshPage() {
window.location.reload();
}
startPermissionFlow() {
if (this.config.permissions.length === 0) {
this.overallStatus = "completed";
this.allPermissionsGranted.emit();
this.cdr.detectChanges();
return;
}
this.currentPermissionIndex = -1;
this.overallStatus = "in-progress";
this.requestNextPermission();
this.cdr.detectChanges();
}
updateVisiblePermissions() {
if (this.currentPermissionIndex >= 0 &&
this.currentPermissionIndex < this.visiblePermissions.length) {
this.visiblePermissions.forEach((p, index) => {
if (index < this.currentPermissionIndex &&
p.status !== "GRANTED" &&
p.status !== "DENIED") {
// Safeguard: mark previously processed but not determined ones as pending.
// p.status = "PENDING"; // Or handle as error, log, etc.
}
else if (index === this.currentPermissionIndex &&
p.status !== "CURRENT") {
// Status is set in requestNextPermission before calling this.
}
else if (index > this.currentPermissionIndex &&
p.status !== "PENDING") {
// p.status = "PENDING"; // Ensure future ones are pending
}
});
}
this.cdr.detectChanges();
}
requestNextPermission() {
var _a, _b, _c;
return __awaiter(this, void 0, void 0, function* () {
this.currentPermissionIndex += 1;
if (this.currentPermissionIndex < this.visiblePermissions.length) {
const permission = this.visiblePermissions[this.currentPermissionIndex];
permission.status = "CURRENT";
this.updateVisiblePermissions();
try {
let permissionOutcome = {
granted: false,
error: undefined
};
// Check if permission is already granted
if (permission.granted) {
// If already granted, simulate a brief delay to show loading animation
yield new Promise((resolve) => setTimeout(resolve, ALREADY_GRANTED_PERMISSION_DELAY_MS));
permissionOutcome = { granted: true };
}
else if (permission.id === "CAMERA_BOTH") {
const bothCameraResult = yield testBothCamera();
permissionOutcome = {
granted: bothCameraResult.allGranted,
error: bothCameraResult.errorMessage
? new Error(bothCameraResult.errorMessage)
: undefined
};
this.isFrontCameraGranted = bothCameraResult.frontCamera.granted;
this.isBackCameraGranted = bothCameraResult.backCamera.granted;
}
else if (permission.id === "CAMERA_FRONT") {
const frontCameraResult = yield testFrontCamera();
permissionOutcome = {
granted: frontCameraResult.granted,
error: frontCameraResult.error
};
if (frontCameraResult.stream)
frontCameraResult.stream
.getTracks()
.forEach((track) => track.stop());
this.isFrontCameraGranted = frontCameraResult.granted;
}
else if (permission.id === "CAMERA_BACK") {
const backCameraResult = yield testBackCamera();
permissionOutcome = {
granted: backCameraResult.granted,
error: backCameraResult.error
};
if (backCameraResult.stream)
backCameraResult.stream
.getTracks()
.forEach((track) => track.stop());
this.isBackCameraGranted = backCameraResult.granted;
}
else if (permission.id === "MICROPHONE") {
permissionOutcome = yield requestMicrophonePermission();
}
else if (permission.id === "LOCATION") {
permissionOutcome = yield requestLocationPermission();
}
this.updatePermissionStatus(permission.id, permissionOutcome.granted, permissionOutcome.error);
if (permissionOutcome.granted) {
if (permission.id === "CAMERA_BOTH") {
const frontCam = this.visiblePermissions.find((p) => p.id === "CAMERA_FRONT");
if (frontCam && frontCam.status !== "GRANTED") {
this.updatePermissionStatus("CAMERA_FRONT", true);
}
const backCam = this.visiblePermissions.find((p) => p.id === "CAMERA_BACK");
if (backCam && backCam.status !== "GRANTED") {
this.updatePermissionStatus("CAMERA_BACK", true);
}
}
if (permission.id === "CAMERA_FRONT" ||
permission.id === "CAMERA_BACK") {
const frontCam = this.visiblePermissions.find((p) => p.id === "CAMERA_FRONT");
const backCam = this.visiblePermissions.find((p) => p.id === "CAMERA_BACK");
const bothCam = this.visiblePermissions.find((p) => p.id === "CAMERA_BOTH");
if ((frontCam === null || frontCam === void 0 ? void 0 : frontCam.granted) &&
(backCam === null || backCam === void 0 ? void 0 : backCam.granted) &&
bothCam &&
bothCam.status !== "GRANTED") {
this.updatePermissionStatus("CAMERA_BOTH", true);
}
}
if (permission.id.startsWith("CAMERA")) {
const frontCamGranted = ((_a = this.visiblePermissions.find((p) => p.id === "CAMERA_FRONT")) === null || _a === void 0 ? void 0 : _a.granted) || false;
const backCamGranted = ((_b = this.visiblePermissions.find((p) => p.id === "CAMERA_BACK")) === null || _b === void 0 ? void 0 : _b.granted) || false;
const bothCamGranted = ((_c = this.visiblePermissions.find((p) => p.id === "CAMERA_BOTH")) === null || _c === void 0 ? void 0 : _c.granted) || false;
this.cameraTestComplete.emit({
frontCamera: frontCamGranted ||
(bothCamGranted && this.isFrontCameraGranted),
backCamera: backCamGranted || (bothCamGranted && this.isBackCameraGranted)
});
}
setTimeout(() => this.requestNextPermission(), NEXT_PERMISSION_REQUEST_DELAY_MS);
}
else {
this.handlePermissionDenied();
}
}
catch (error) {
this.updatePermissionStatus(permission.id, false, error);
this.handlePermissionDenied();
}
}
else {
this.checkAllPermissionsGranted();
}
});
}
handlePermissionDenied() {
this.overallStatus = "error";
this.cdr.detectChanges();
}
checkAllPermissionsGranted() {
const allGranted = this.visiblePermissions.every((p) => p.granted);
if (allGranted) {
this.overallStatus = "completed";
this.allPermissionsGranted.emit();
}
else if (this.overallStatus !== "error") {
this.overallStatus = "error";
}
this.cdr.detectChanges();
}
}
/** @nocollapse */ KwikIDPermissionCheckerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDPermissionCheckerComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ KwikIDPermissionCheckerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: KwikIDPermissionCheckerComponent, selector: "kwikid-components-permission-checker", inputs: { config: "config" }, outputs: { onClickScheduleLater: "onClickScheduleLater", allPermissionsGranted: "allPermissionsGranted", permissionError: "permissionError", permissionStatusChange: "permissionStatusChange", cameraTestComplete: "cameraTestComplete" }, ngImport: i0, template: "<div class=\"container\">\n <kwikid-components-page-header [config]=\"headerConfig\">\n </kwikid-components-page-header>\n\n <main>\n <div\n *ngIf=\"config?.html?.before\"\n [innerHtml]=\"config?.html?.before | kwikuiSafeHtml\"\n >\n </div>\n\n <div class=\"permission-list\">\n <div\n *ngFor=\"let permission of visiblePermissions\"\n class=\"permission-item\"\n [ngClass]=\"{\n granted: permission.status === 'GRANTED',\n denied: permission.status === 'DENIED',\n current: permission.status === 'CURRENT'\n }\"\n >\n <div class=\"permission-icon\">\n <!-- SVG icons for different status states -->\n <div\n class=\"icon-wrapper granted-bg\"\n *ngIf=\"permission.status === 'GRANTED'\"\n >\n <tui-svg\n src=\"tuiIconCheckCircleLarge\"\n class=\"status-icon\"\n ></tui-svg>\n </div>\n <div\n class=\"icon-wrapper denied-bg\"\n *ngIf=\"permission.status === 'DENIED'\"\n >\n <tui-svg\n src=\"tuiIconCloseLarge\"\n class=\"status-icon\"\n ></tui-svg>\n </div>\n <div\n class=\"icon-wrapper\"\n *ngIf=\"permission.status === 'CURRENT'\"\n >\n <div class=\"spinner\"></div>\n </div>\n <div\n class=\"icon-wrapper\"\n *ngIf=\"permission.status === 'PENDING'\"\n >\n <div class=\"spinner\"></div>\n </div>\n </div>\n <div class=\"permission-details\">\n <div\n class=\"permission-title\"\n [innerHtml]=\"permission.title | kwikuiSafeHtml\"\n ></div>\n\n <!-- Per-permission error message with help toggle -->\n <div\n *ngIf=\"permission.status === 'DENIED'\"\n class=\"permission-error\"\n >\n <!-- Detailed instructions when expanded -->\n <div\n *ngIf=\"permission.showInstructions\"\n class=\"instruction-steps\"\n >\n <div class=\"instruction-header\">\n <span>How to enable:</span>\n <span [innerHtml]=\"permission.title | kwikuiSafeHtml\"></span>\n </div>\n\n <div\n class=\"instruction-step\"\n *ngFor=\"\n let step of getInstructionsForPermission(permission.id);\n let i = index\n \"\n >\n <div class=\"step-number\">{{ i + 1 }}</div>\n <div class=\"step-details\">\n <div class=\"step-title\">{{ step.title }}</div>\n <div class=\"step-description\">{{ step.detail }}</div>\n <img\n *ngIf=\"step.img\"\n [src]=\"step.img\"\n [alt]=\"step.title\"\n class=\"step-image\"\n />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Action buttons -->\n\n <div\n *ngIf=\"config?.html?.after\"\n [innerHtml]=\"config?.html?.after | kwikuiSafeHtml\"\n >\n </div>\n\n <div *ngIf=\"overallStatus === 'error'\">\n <kwikui-button\n appearance=\"primary\"\n size=\"m\"\n label=\"Refresh\"\n styles=\"width: 100%;\"\n (onClick)=\"refreshPage()\"\n ></kwikui-button>\n </div>\n </main>\n\n <kwikid-components-page-footer [config]=\"footerConfig\">\n </kwikid-components-page-footer>\n</div>\n", styles: [":host{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;width:100%}.container{display:flex;flex-direction:column;justify-content:flex-start;align-items:center;overflow:auto}.container>*:not(:last-child){margin-bottom:1px}.container main{display:flex;flex-direction:column;align-content:center;justify-content:flex-start;align-items:center;padding:0 1rem;width:100%;max-width:350px}.container main>*:not(:last-child){margin-bottom:5px}.permission-list{margin:10px 0;width:100%}.permission-item{display:flex;margin-bottom:15px;border-radius:8px;transition:all .3s ease;width:100%}.permission-icon{margin-right:10px;display:flex;align-items:flex-start;justify-content:center;padding-top:3px}.status-icon{width:20px;height:20px}.status-icon.loading{animation:spin 1.5s linear infinite}.permission-details{flex:1}.permission-title{font-weight:500;font-size:14px;margin-top:3px}.permission-description{font-size:14px;color:#666;margin-bottom:5px}.permission-status{font-size:14px;color:#4285f4;font-style:italic;margin-top:5px}.permission-error{margin-top:8px;border-radius:8px;overflow:hidden;background-color:#f5f5f5}.error-message{padding:10px 15px;background-color:#ffeef0;border-left:4px solid #e91e63;color:#e91e63;margin:15px 0;border-radius:4px;width:100%}.help-button{background-color:#2196f3;color:#fff;border:none;padding:5px 10px;border-radius:4px;cursor:pointer;font-size:12px;margin-top:5px;display:none}.instruction-steps{background-color:#f5f5f5;padding:8px;border-radius:4px}.instruction-header{color:#f44336;font-weight:500;background-color:#f44336;color:#fff;padding:8px 12px;font-size:14px;border-radius:4px 4px 0 0;margin:-8px -8px 8px}.instruction-step{margin-bottom:15px;padding:8px;background-color:#fff;border-radius:5px}.instruction-step:last-child{margin-bottom:0}.step-number{display:flex;align-items:center;justify-content:center;width:24px;height:24px;background-color:#ddd;border-radius:50%;font-weight:bold;margin-right:10px;flex-shrink:0}.step-details{flex:1}.step-title{font-weight:500;margin-bottom:3px}.step-description{font-size:13px;color:#666;margin-bottom:10px}.step-image{width:100%;max-width:100%;display:block;border:1px solid #ddd;border-radius:4px;position:relative}.step-image:after{content:\"Click Here\";position:absolute;font-size:12px;background-color:#fff;padding:3px 8px;border-radius:12px;box-shadow:0 1px 3px #0003;bottom:30px;left:50%;transform:translate(-50%)}.action-buttons{width:100%;color:#fff;margin:0;padding:0;height:33px;background-color:#3a78fc;cursor:pointer;border:none;border-radius:8px}.icon-wrapper{display:flex;width:20px;height:20px;border-radius:50%}.status-icon{width:20px;height:20px;color:#fff}.granted-bg{background-color:#05d624}.denied-bg{background-color:#fc4444}.current-bg{background-color:#2196f326}.spinner{border:2px solid rgba(0,0,0,.1);border-left-color:#007bff;border-radius:50%;width:20px;height:20px;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.pending-bg{background-color:#ffc10726}.permission-granted tui-svg{color:var(--tui-success-fill)}.permission-denied tui-svg{color:var(--tui-error-fill)}.permission-current tui-svg,.permission-pending tui-svg{color:var(--tui-info-fill)}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.loading{animation:spin 1.5s linear infinite}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{border-radius:10px}::-webkit-scrollbar-thumb{background:lightgray;border-radius:10px;background-clip:padding-box}::-webkit-scrollbar-thumb:hover{background:gray;background-clip:padding-box}\n"], components: [{ type: i1.KwikIDPageHeaderComponent, selector: "kwikid-components-page-header", inputs: ["config"] }, { type: i2.TuiSvgComponent, selector: "tui-svg", inputs: ["src"] }, { type: i3.KwikUIButtonComponent, selector: "kwikui-button", inputs: ["appearance", "class", "disabled", "icon", "iconRight", "id", "label", "shape", "showLoader", "size", "styles", "type", "pseudoHover"], outputs: ["onClick"] }, { type: i4.KwikIDPageFooterComponent, selector: "kwikid-components-page-footer", inputs: ["config"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], pipes: { "kwikuiSafeHtml": i3.KwikUISafeHtmlPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
__decorate([
logMethod
], KwikIDPermissionCheckerComponent.prototype, "getActivePermissions", null);
__decorate([
logMethod
], KwikIDPermissionCheckerComponent.prototype, "setDeviceSpecificInstructions", null);
__decorate([
logMethod
], KwikIDPermissionCheckerComponent.prototype, "checkExistingPermissions", null);
__decorate([
logMethod
], KwikIDPermissionCheckerComponent.prototype, "resetPermissionsState", null);
__decorate([
logMethod
], KwikIDPermissionCheckerComponent.prototype, "toggleInstructions", null);
__decorate([
logMethod
], KwikIDPermissionCheckerComponent.prototype, "updatePermissionStatus", null);
__decorate([
logMethod
], KwikIDPermissionCheckerComponent.prototype, "startPermissionFlow", null);
__decorate([
logMethod
], KwikIDPermissionCheckerComponent.prototype, "updateVisiblePermissions", null);
__decorate([
logMethod
], KwikIDPermissionCheckerComponent.prototype, "requestNextPermission", null);
__decorate([
logMethod
], KwikIDPermissionCheckerComponent.prototype, "handlePermissionDenied", null);
__decorate([
logMethod
], KwikIDPermissionCheckerComponent.prototype, "checkAllPermissionsGranted", null);
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDPermissionCheckerComponent, decorators: [{
type: Component,
args: [{
selector: "kwikid-components-permission-checker",
templateUrl: "./permission-checker.component.html",
styleUrls: ["./permission-checker.component.scss"],
changeDetection: ChangeDetectionStrategy.OnPush
}]
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { config: [{
type: Input
}], onClickScheduleLater: [{
type: Output
}], allPermissionsGranted: [{
type: Output
}], permissionError: [{
type: Output
}], permissionStatusChange: [{
type: Output
}], cameraTestComplete: [{
type: Output
}], getActivePermissions: [], setDeviceSpecificInstructions: [], checkExistingPermissions: [], resetPermissionsState: [], toggleInstructions: [], updatePermissionStatus: [], startPermissionFlow: [], updateVisiblePermissions: [], requestNextPermission: [], handlePermissionDenied: [], checkAllPermissionsGranted: [] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbi1jaGVja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2t3aWtpZC1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9wZXJtaXNzaW9uLWNoZWNrZXIvcGVybWlzc2lvbi1jaGVja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2t3aWtpZC1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9wZXJtaXNzaW9uLWNoZWNrZXIvcGVybWlzc2lvbi1jaGVja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLHVCQUF1QixFQUV4QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUNMLGdCQUFnQixFQUNoQiwyQkFBMkIsRUFDM0IseUJBQXlCLEVBQ3pCLGNBQWMsRUFDZCxlQUFlLEVBQ2YsY0FBYyxFQUNmLE1BQU0sNkJBQTZCLENBQUM7QUFPckMsT0FBTyxFQUVMLDhCQUE4QixFQUM5Qix1QkFBdUIsRUFDdkIsZ0NBQWdDLEVBQ2hDLG1DQUFtQyxFQUVuQyxzQkFBc0IsRUFDdEIsMEJBQTBCLEVBQzNCLE1BQU0sZ0NBQWdDLENBQUM7Ozs7Ozs7QUFReEMsTUFBTSxPQUFPLGdDQUFnQztJQThEM0MsWUFBb0IsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUE1RDFDLFdBQU0sR0FBNEIsU0FBUyxDQUFDO1FBR25DLHlCQUFvQixHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBR2xFLDBCQUFxQixHQUF1QixJQUFJLFlBQVksRUFBUSxDQUFDO1FBR3JFLG9CQUFlLEdBSW5CLElBQUksWUFBWSxFQUlqQixDQUFD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