kwikid-components
Version:
KwikID's Components Library
528 lines • 88.7 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, 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.status = "GRANTED";
cameraBothPermission.granted = true;
}
if (cameraFrontPermission) {
cameraFrontPermission.status = "GRANTED";
cameraFrontPermission.granted = true;
}
if (cameraBackPermission) {
cameraBackPermission.status = "GRANTED";
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.status = "GRANTED";
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.status = "GRANTED";
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
};
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbi1jaGVja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2t3aWtpZC1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9wZXJtaXNzaW9uLWNoZWNrZXIvcGVybWlzc2lvbi1jaGVja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2t3aWtpZC1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9wZXJtaXNzaW9uLWNoZWNrZXIvcGVybWlzc2lvbi1jaGVja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLHVCQUF1QixFQUV4QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUNMLGdCQUFnQixFQUNoQiwyQkFBMkIsRUFDM0IseUJBQXlCLEVBQ3pCLGNBQWMsRUFDZCxlQUFlLEVBQ2YsY0FBYyxFQUNmLE1BQU0sNkJBQTZCLENBQUM7QUFPckMsT0FBTyxFQUVMLDhCQUE4QixFQUM5Qix1QkFBdUIsRUFDdkIsZ0NBQWdDLEVBRWhDLHNCQUFzQixFQUN0QiwwQkFBMEIsRUFDM0IsTUFBTSxnQ0FBZ0MsQ0FBQzs7Ozs7OztBQVF4QyxNQUFNLE9BQU8sZ0NBQWdDO0lBOEQzQyxZQUFvQixHQUFzQjtRQUF0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQTVEMUMsV0FBTSxHQUE0QixTQUFTLENBQUM7UUFHbkMseUJBQW9CLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFHbEUsMEJBQXFCLEdBQXVCLElBQUksWUFBWSxFQUFRLENBQUM7UUFHckUsb0JBQWUsR0FJbkIsSUFBSSxZQUFZLEVBSWpCLENBQUM7UUFHSSwyQkFBc0Is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