UNPKG

kwikid-components

Version:
528 lines 88.7 kB
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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