UNPKG

kwikid-camera

Version:
446 lines 70.2 kB
import { __awaiter, __decorate } from "tslib"; /* eslint-disable brace-style */ /* eslint-disable no-unused-vars */ /* eslint-disable @typescript-eslint/no-unused-vars */ import { animate, style, transition, trigger } from "@angular/animations"; import { ChangeDetectionStrategy, Component, EventEmitter, Inject, Input, Output, ViewChild } from "@angular/core"; import { TUI_SANITIZER, TuiAlertService } from "@taiga-ui/core"; import { NgDompurifySanitizer } from "@tinkoff/ng-dompurify"; import { checkObjectKeyExists, getObjectDeepCopy, isNotEmptyString, isNotEmptyValue, logMethod, mergeObjects } from "kwikid-toolkit"; import { closeSvg, cloudUploadSvg, flipSvg, uploadSvg } from "../../kwikid-camera.icons"; import { BUTTON_PROPERTIES, DEFAULT_CONFIG } from "./kwikid-camera-capture.constants"; import { getCorrectImageFormat, getCroppedImage, getCroppedImageFromMask, getDeviceId, getDevicesList, getImageFromBase64, getScaledImageFromVideo, getWatermarkedImage } from "./kwikid-camera-capture.helper"; import * as i0 from "@angular/core"; import * as i1 from "kwikui"; import * as i2 from "@taiga-ui/core"; import * as i3 from "@angular/common"; export class KwikIDCameraCaptureComponent { constructor(kwikuiLoaderService, alert, ref) { this.kwikuiLoaderService = kwikuiLoaderService; this.alert = alert; this.ref = ref; this.SVG = { flipSvg, uploadSvg, cloudUploadSvg, closeSvg }; this.BUTTON_PROPS = BUTTON_PROPERTIES; this.config = DEFAULT_CONFIG; this.image = ""; this.originalImage = ""; this.croppedImage = ""; this.maskedImage = ""; this.data = { watermark: {} }; this.getImage = new EventEmitter(); this.onClickBack = new EventEmitter(); this.onClickClose = new EventEmitter(); this.onClickSave = new EventEmitter(); this.imagePreviewVisible = false; this.files = []; this.mediaStream = null; this.devicesList = []; this.currentDeviceId = ""; this.changeDetectionRefInterval = undefined; // Camera Settings this.isSwitching = false; // Misc Methods this.loading = undefined; } showImagePreview() { var _a, _b, _c; if ((_c = (_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.others) === null || _b === void 0 ? void 0 : _b.preview) === null || _c === void 0 ? void 0 : _c.show) { this.image = getCorrectImageFormat(this.image); this.originalImage = this.image; this.previewElement.nativeElement.style.display = "flex"; this.imagePreviewVisible = true; } else { this.hideImagePreview(); } } hideImagePreview() { this.previewElement.nativeElement.style.display = "none"; this.imagePreviewVisible = false; } ngOnInit() { return __awaiter(this, void 0, void 0, function* () { this.config = mergeObjects({}, DEFAULT_CONFIG, this.config); if (isNotEmptyValue(this.image)) { this.showImagePreview(); } this.devicesList = yield getDevicesList(); this.changeDetectionRefInterval = setInterval(() => { this.ref.detectChanges(); }, 500); }); } ngOnChanges(changes) { const verifyChange = (key) => { return checkObjectKeyExists(changes, key) && !changes[key].firstChange; }; if (verifyChange("config")) { this.config = mergeObjects({}, DEFAULT_CONFIG, changes.config.currentValue); } if (verifyChange("image")) { this.image = changes.image.currentValue; if (isNotEmptyValue(this.image)) { this.showImagePreview(); } } if (verifyChange("data")) { this.data = getObjectDeepCopy(changes.data.currentValue); } } ngAfterViewInit() { return __awaiter(this, void 0, void 0, function* () { if (isNotEmptyValue(this.image)) { this.showImagePreview(); } this.currentDeviceId = yield getDeviceId(null); this.correctMirror(); this.startCamera(); }); } ngOnDestroy() { this.stopCamera(); this.image = ""; this.originalImage = ""; this.croppedImage = ""; this.maskedImage = ""; if (this.changeDetectionRefInterval) { clearInterval(this.changeDetectionRefInterval); } } startCamera() { this.hideImagePreview(); this.handleMaskingRatio(); navigator.mediaDevices .getUserMedia({ audio: false, video: { facingMode: this.config.others.isFrontCamera ? "user" : "environment" } }) .then((stream) => { this.dismissLoading(); this.mediaStream = stream; this.videoElement.nativeElement.srcObject = stream; this.videoElement.nativeElement.play(); }) .catch((error) => { console.log("Error accessing camera:", error); }); } stopCamera() { if (this.mediaStream) { this.mediaStream.getTracks().forEach((track) => { track.stop(); }); this.mediaStream = null; this.videoElement.nativeElement.srcObject = null; } } capture() { var _a, _b, _c, _d, _e; return __awaiter(this, void 0, void 0, function* () { // this.presentLoading(); const video = this.videoElement.nativeElement; const mask = this.maskElement.nativeElement; const requiredWidth = video.clientWidth; const requiredHeight = video.clientHeight; const { image: scaledImage, imageBase64: scaledImageBase64 } = yield getScaledImageFromVideo(video, this.config.others.flipHorizontal); const { image: croppedImage, imageBase64: croppedImageBase64 } = yield getCroppedImage(scaledImage, requiredWidth, requiredHeight); const { image: maskedImage, imageBase64: maskedImageBase64 } = yield getCroppedImageFromMask(croppedImage, mask.getBoundingClientRect().x - video.getBoundingClientRect().x, mask.getBoundingClientRect().y - video.getBoundingClientRect().y, mask.getBoundingClientRect().width, mask.getBoundingClientRect().height); if ((_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.others) === null || _b === void 0 ? void 0 : _b.isWatermark) { const { image: scaledImageWithWatermark, imageBase64: scaledImageWithWatermarkBase64 } = yield getWatermarkedImage(scaledImage, (_c = this.data) === null || _c === void 0 ? void 0 : _c.watermark); const { image: croppedImageWithWatermark, imageBase64: croppedImageWithWatermarkBase64 } = yield getWatermarkedImage(croppedImage, (_d = this.data) === null || _d === void 0 ? void 0 : _d.watermark); const { image: maskedImageWithWatermark, imageBase64: maskedImageWithWatermarkBase64 } = yield getWatermarkedImage(maskedImage, (_e = this.data) === null || _e === void 0 ? void 0 : _e.watermark); /** * Commented since before showing preview, * we might want to process the image at backend which will take time. * So till then we can show loader instead of showing the original captured image. */ // this.image = scaledImageBase64; this.originalImage = scaledImageWithWatermarkBase64; this.croppedImage = croppedImageWithWatermarkBase64; this.maskedImage = maskedImageWithWatermarkBase64; } else { /** * Commented since before showing preview, * we might want to process the image at backend which will take time. * So till then we can show loader instead of showing the original captured image. */ // this.image = scaledImageWithWatermarkBase64; this.originalImage = scaledImageBase64; this.croppedImage = croppedImageBase64; this.maskedImage = maskedImageBase64; } this.getImage.emit({ originalImage: this.originalImage, croppedImage: this.croppedImage, maskedImage: this.maskedImage }); }); } back() { this.onClickBack.emit({}); } close() { this.onClickClose.emit({}); } retry() { this.image = ""; this.originalImage = ""; this.croppedImage = ""; this.maskedImage = ""; this.hideImagePreview(); this.startCamera(); } save() { this.onClickSave.emit({ originalImage: this.originalImage, croppedImage: this.croppedImage, maskedImage: this.maskedImage }); } handleOnSelectInputFile() { const file = this.inputFile.nativeElement.files[0]; const reader = new FileReader(); reader.onloadend = () => __awaiter(this, void 0, void 0, function* () { var _a, _b, _c; /** * Commented since before showing preview, * we might want to process the image at backend which will take time. * So till then we can show loader instead of showing the original captured image. */ let uploadedImageStr = reader.result; let uploadedImage = yield getImageFromBase64(uploadedImageStr); if ((_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.others) === null || _b === void 0 ? void 0 : _b.isWatermarkForImageUpload) { const { image: imageWithWatermark, imageBase64: imageWithWatermarkBase64 } = yield getWatermarkedImage(uploadedImage, (_c = this.data) === null || _c === void 0 ? void 0 : _c.watermark); uploadedImageStr = imageWithWatermarkBase64; uploadedImage = imageWithWatermark; } this.image = uploadedImageStr; this.originalImage = uploadedImageStr; this.croppedImage = ""; this.maskedImage = ""; this.getImage.emit({ originalImage: this.originalImage }); }); reader.readAsDataURL(file); } handleMaskingRatio() { var _a, _b, _c; const maskElement = this.maskElement.nativeElement; const videoElement = this.videoElement.nativeElement; const rect = videoElement.getBoundingClientRect(); const innerWidth = rect.width; const innerHeight = rect.height; const shape = (_c = (_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.others) === null || _b === void 0 ? void 0 : _b.mask) === null || _c === void 0 ? void 0 : _c.shape; if (isNotEmptyString(shape)) { switch (shape) { case "OVAL": if (innerWidth > innerHeight) { maskElement.style.setProperty("width", "calc(var(--height) * 5 / 8)"); } else { maskElement.style.setProperty("height", "calc(var(--width) * 8 / 5)"); } break; default: break; } } } upload() { if (this.inputFile) { this.inputFile.nativeElement.click(); } } flip() { this.config.others.flipHorizontal = !this.config.others.flipHorizontal; } // Helpers Methods correctMirror() { if (this.config.others.isFrontCamera) { this.config.others.flipHorizontal = true; } else { this.config.others.flipHorizontal = false; } } switchCamera() { return __awaiter(this, void 0, void 0, function* () { // Commented the below code because we can use video.facingMode directly. // if (this.devicesList.length > 1) { // this.isSwitching = true; // this.presentLoading("Switching..."); // // this.config.others.isFrontCamera = !this.config.others.isFrontCamera; // this.correctMirror(); // // this.currentDeviceId = await getDeviceId(this.currentDeviceId); // // this.startCamera(); // // setTimeout(() => { // this.isSwitching = false; // this.dismissLoading(); // }, 500); // } this.isSwitching = true; this.config.others.isFrontCamera = !this.config.others.isFrontCamera; this.correctMirror(); this.startCamera(); setTimeout(() => { this.isSwitching = false; }, 500); }); } presentLoading(msg) { this.loading = true; this.kwikuiLoaderService.show({ loaderText: isNotEmptyValue(msg) ? msg : "Please wait...", fullscreen: true }); } dismissLoading() { this.loading = false; this.kwikuiLoaderService.hide(); } } /** @nocollapse */ KwikIDCameraCaptureComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDCameraCaptureComponent, deps: [{ token: i1.KwikUILoaderService }, { token: TuiAlertService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ KwikIDCameraCaptureComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: KwikIDCameraCaptureComponent, selector: "kwikid-camera-capture", inputs: { config: "config", image: "image", data: "data" }, outputs: { getImage: "getImage", onClickBack: "onClickBack", onClickClose: "onClickClose", onClickSave: "onClickSave" }, providers: [ { provide: TUI_SANITIZER, useClass: NgDompurifySanitizer } ], viewQueries: [{ propertyName: "videoElement", first: true, predicate: ["videoElement"], descendants: true, static: true }, { propertyName: "previewElement", first: true, predicate: ["previewElement"], descendants: true, static: true }, { propertyName: "maskElement", first: true, predicate: ["maskElement"], descendants: true }, { propertyName: "inputFile", first: true, predicate: ["inputFile"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<video\n #videoElement\n [class.flip-horizontal]=\"config.others?.flipHorizontal\"\n></video>\n\n<div\n id=\"video-switching\"\n *ngIf=\"isSwitching\"\n>\n Switching...\n</div>\n\n<input\n type=\"file\"\n accept=\"image/*,capture=camera\"\n multiple=\"false\"\n #inputFile\n (change)=\"handleOnSelectInputFile()\"\n (click)=\"inputFile.value = null\"\n style=\"visibility: hidden; position: absolute; top: -10000px; left: -10000px\"\n/>\n\n<div class=\"camera-capture\">\n <div class=\"video-frame\">\n <header>\n <ng-content select=\"[slot='capture-header']\"></ng-content>\n </header>\n <main>\n <div\n #maskElement\n [class.mask]=\"config?.others?.mask !== undefined\"\n [class.shape-square]=\"config?.others?.mask?.shape === 'SQUARE'\"\n [class.shape-rectangle]=\"config?.others?.mask?.shape === 'RECTANGLE'\"\n [class.shape-oval]=\"config?.others?.mask?.shape === 'OVAL'\"\n [class.shape-circle]=\"config?.others?.mask?.shape === 'CIRCLE'\"\n ></div>\n </main>\n <footer>\n <div class=\"footer-left\">\n <kwikui-button\n *ngIf=\"config?.footer?.isUpload\"\n [appearance]=\"BUTTON_PROPS.appearance_whiteblock\"\n icon=\"tuiIconUpload\"\n label=\"UPLOAD\"\n shape=\"rounded\"\n [size]=\"BUTTON_PROPS.size_s\"\n (onClick)=\"upload()\"\n ></kwikui-button>\n </div>\n <div class=\"footer-center\">\n <button\n id=\"capture\"\n (click)=\"capture()\"\n >\n </button>\n </div>\n <div class=\"footer-right\">\n <kwikui-button\n *ngIf=\"config?.footer?.isFlip && false\"\n [appearance]=\"BUTTON_PROPS.appearance_whiteblock\"\n icon=\"tuiIconRefreshCcw\"\n label=\"FLIP\"\n shape=\"rounded\"\n [size]=\"BUTTON_PROPS.size_s\"\n (onClick)=\"flip()\"\n ></kwikui-button>\n <kwikui-button\n *ngIf=\"config?.footer?.isSwitch && devicesList.length > 1\"\n [appearance]=\"BUTTON_PROPS.appearance_whiteblock\"\n icon=\"tuiIconRepeat\"\n label=\"SWITCH\"\n shape=\"rounded\"\n [size]=\"BUTTON_PROPS.size_s\"\n (onClick)=\"switchCamera()\"\n ></kwikui-button>\n </div>\n </footer>\n </div>\n</div>\n\n<div\n #previewElement\n id=\"preview-frame-container\"\n [@panelInOut]\n>\n <div\n *ngIf=\"imagePreviewVisible\"\n class=\"preview-frame\"\n >\n <header>\n <div class=\"header-left\">\n <button\n *ngIf=\"config?.preview?.header?.isBack\"\n class=\"button-icon\"\n id=\"back\"\n (click)=\"back()\"\n >\n <tui-svg src=\"tuiIconArrowLeftLarge\"></tui-svg>\n </button>\n </div>\n <div class=\"header-center\">\n <div class=\"header-title\">\n {{ config?.header?.title }}\n </div>\n </div>\n <div class=\"header-right\">\n <button\n *ngIf=\"config?.preview?.header?.isClose\"\n class=\"button-icon\"\n id=\"close\"\n (click)=\"close()\"\n >\n <tui-svg src=\"tuiIconCloseLarge\"></tui-svg>\n </button>\n </div>\n </header>\n <main>\n <kwikui-image\n [altText]=\"config?.header?.title || 'Image'\"\n [id]=\"'image'\"\n [imageSrc]=\"image\"\n styles=\"width: 100%\"\n ></kwikui-image>\n </main>\n <footer>\n <div class=\"footer-left\"></div>\n <div class=\"footer-center\">\n <kwikui-button\n [appearance]=\"BUTTON_PROPS.appearance_secondary\"\n [disabled]=\"false\"\n id=\"retry\"\n label=\"Retry\"\n [showLoader]=\"false\"\n shape=\"rounded\"\n styles=\"width: 100%\"\n [size]=\"BUTTON_PROPS.size_m\"\n (onClick)=\"retry()\"\n ></kwikui-button>\n <kwikui-button\n [appearance]=\"BUTTON_PROPS.appearance_primary\"\n [disabled]=\"false\"\n id=\"proceed\"\n label=\"Proceed\"\n [showLoader]=\"false\"\n shape=\"rounded\"\n styles=\"width: 100%\"\n [size]=\"BUTTON_PROPS.size_m\"\n (onClick)=\"save()\"\n ></kwikui-button>\n </div>\n <div class=\"footer-right\"></div>\n </footer>\n </div>\n</div>\n", styles: [":host{position:relative;display:block;width:100%;height:100%}::-webkit-scrollbar{width:8px}::-webkit-scrollbar-track{border-radius:10px}::-webkit-scrollbar-thumb{background:lightgray;border-radius:10px}::-webkit-scrollbar-thumb:hover{background:gray}.camera-capture{position:absolute;top:0px;left:0px;width:100%;height:100%}.camera-capture .video-frame{width:100%;height:100%;display:flex;flex-direction:column;align-content:space-around;justify-content:space-between;align-items:stretch}.camera-capture .video-frame header{padding:1rem;display:flex;flex-direction:row;align-content:center;justify-content:center;align-items:center;grid-gap:2rem;gap:2rem;width:100%;margin:0 auto}.camera-capture .video-frame main{flex-grow:1;padding:1rem;position:relative}.camera-capture .video-frame main .mask{display:block;width:100%;height:100%;position:absolute;top:0;left:50%;transform:translate(-50%);max-width:600px;margin:0 auto}.camera-capture .video-frame main .mask.shape-rectangle{--width: min(600px, calc(100% - 2rem));aspect-ratio:16/9;border-radius:5px;border:1px solid rgba(0,0,0,.4);box-shadow:0 2rem 100rem #0006;height:auto;margin:1rem auto;max-height:100%;width:var(--width)}.camera-capture .video-frame main .mask.shape-square{--width: min(600px, calc(100% - 2rem));aspect-ratio:1/1;border-radius:5px;border:1px solid rgba(0,0,0,.4);box-shadow:0 0 100rem #0006;height:auto;margin:1rem auto;max-height:100%;width:var(--width)}.camera-capture .video-frame main .mask.shape-oval{--width: min(600px, calc(100% - 2rem));--height: min(720px, 92%);aspect-ratio:5/8;border-radius:50%;box-shadow:0 0 100rem #0006;border:1px solid rgba(0,0,0,.4);margin:1rem auto;max-height:min(720px,92%);width:var(--width)}.camera-capture .video-frame main .mask.shape-circle{--width: min(600px, calc(100% - 2rem));aspect-ratio:1/1;border-radius:50%;box-shadow:0 0 100rem #0006;border:1px solid rgba(0,0,0,.4);margin:1rem auto;height:var(--width);width:var(--width)}@keyframes blink{0%{outline-width:1px}to{outline-width:5px}}.camera-capture .video-frame footer{padding:1.5rem 1rem;display:flex;flex-direction:row;align-content:center;justify-content:center;align-items:center;grid-gap:2rem;gap:2rem;width:100%;max-width:600px;margin:0 auto}.camera-capture .video-frame footer .footer-left{flex-grow:1;display:flex;flex-direction:row;align-content:center;justify-content:center;align-items:center;grid-gap:2rem;gap:2rem;width:100%;overflow:hidden}.camera-capture .video-frame footer .footer-right{flex-grow:1;display:flex;flex-direction:row;align-content:center;justify-content:center;align-items:center;grid-gap:2rem;gap:2rem;width:100%;overflow:hidden}#preview-frame-container{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:100%;max-width:min(90%,420px);height:auto;max-height:min(90%);overflow:auto;background:white;box-shadow:#64646f33 0 7px 29px;border-radius:.5rem}#preview-frame-container .preview-frame{width:100%;height:100%;overflow:auto;display:flex;flex-direction:column;align-content:space-around;justify-content:space-between;align-items:stretch;z-index:1;position:relative}#preview-frame-container .preview-frame header{background:white;width:100%;padding:1rem;display:flex;flex-direction:row;align-content:center;justify-content:center;align-items:center;grid-gap:2rem;gap:2rem;z-index:2}#preview-frame-container .preview-frame main{flex-grow:1;padding:1rem;display:flex;flex-direction:row;align-content:center;justify-content:center;align-items:center}#preview-frame-container .preview-frame footer{padding:1rem;display:flex;flex-direction:row;align-content:center;justify-content:center;align-items:center;grid-gap:2rem;gap:2rem;background-color:#fff}#preview-frame-container .preview-frame footer .footer-left{flex-grow:1;display:flex;flex-direction:row;align-content:center;justify-content:center;align-items:center;grid-gap:2rem;gap:2rem;width:100%}#preview-frame-container .preview-frame footer .footer-center{width:100%;display:flex;flex-direction:row;align-content:center;justify-content:center;align-items:center;grid-gap:1rem;gap:1rem}#preview-frame-container .preview-frame footer .footer-right{flex-grow:1;display:flex;flex-direction:row;align-content:center;justify-content:center;align-items:center;grid-gap:2rem;gap:2rem;width:100%}#capture{width:3rem;height:3rem;background-color:#fff;border-radius:100%;transition:all .1s ease-in-out;outline:.3rem solid #fff;margin:auto}#capture:hover{transform:scale(1.1)}#capture:focus,#capture:active{transform:scale(1)}#upload-container{padding:0;border-radius:10rem;color:#fff;border:none;width:-moz-fit-content;width:fit-content;max-width:4.5rem;height:2.5rem;display:flex;flex-direction:row;align-content:center;justify-content:center;align-items:stretch}#upload-container.added-files{background-color:#fff;padding:.2rem}.button-icon{width:2.5rem;height:2.5rem;color:#fff;background-color:transparent;border-radius:100%;padding:.5rem;border:none;outline:none;transition:all .2s ease-in-out;filter:drop-shadow(0px 0px 3px black)}.button-icon:hover{transform:scale(1.05)}.button-icon#close tui-svg{font-size:1.4rem}.button-icon tui-svg{width:100%;height:100%}button{cursor:pointer;display:flex;flex-direction:row;align-content:center;justify-content:center;align-items:center}video{position:absolute;width:100%;height:100%;top:0;left:0;object-fit:cover;-o-object-fit:cover;object-position:center;-o-object-position:center;transform:scaleX(1);-webkit-transform:scaleX(1)}video.flip-horizontal{transform:scaleX(-1);-webkit-transform:scaleX(-1)}#video-switching{position:absolute;width:100%;height:100%;top:0;left:0;object-fit:cover;-o-object-fit:cover;object-position:center;-o-object-position:center;transform:scaleX(1);-webkit-transform:scaleX(1);background:black;color:#fff;display:flex;flex-direction:row;align-content:center;justify-content:center;align-items:center}\n"], components: [{ type: i1.KwikUIButtonComponent, selector: "kwikui-button", inputs: ["appearance", "class", "disabled", "icon", "iconRight", "id", "label", "shape", "showLoader", "size", "styles", "type", "pseudoHover"], outputs: ["onClick"] }, { type: i2.TuiSvgComponent, selector: "tui-svg", inputs: ["src"] }, { type: i1.KwikUIImageComponent, selector: "kwikui-image", inputs: ["altText", "class", "html", "id", "imageSrc", "imageType", "loadingType", "styles"], outputs: ["onClick"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], animations: [ trigger("panelInOut", [ transition(":enter", [ style({ transform: "translateY(100%)" }), animate(300) ]), transition(":leave", [ animate(100, style({ transform: "translateY(100%)" })) ]) ]) ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); __decorate([ logMethod ], KwikIDCameraCaptureComponent.prototype, "showImagePreview", null); __decorate([ logMethod ], KwikIDCameraCaptureComponent.prototype, "hideImagePreview", null); __decorate([ logMethod ], KwikIDCameraCaptureComponent.prototype, "ngOnInit", null); __decorate([ logMethod ], KwikIDCameraCaptureComponent.prototype, "ngOnChanges", null); __decorate([ logMethod ], KwikIDCameraCaptureComponent.prototype, "ngAfterViewInit", null); __decorate([ logMethod ], KwikIDCameraCaptureComponent.prototype, "ngOnDestroy", null); __decorate([ logMethod ], KwikIDCameraCaptureComponent.prototype, "startCamera", null); __decorate([ logMethod ], KwikIDCameraCaptureComponent.prototype, "stopCamera", null); __decorate([ logMethod ], KwikIDCameraCaptureComponent.prototype, "capture", null); __decorate([ logMethod ], KwikIDCameraCaptureComponent.prototype, "back", null); __decorate([ logMethod ], KwikIDCameraCaptureComponent.prototype, "close", null); __decorate([ logMethod ], KwikIDCameraCaptureComponent.prototype, "retry", null); __decorate([ logMethod ], KwikIDCameraCaptureComponent.prototype, "save", null); __decorate([ logMethod ], KwikIDCameraCaptureComponent.prototype, "handleOnSelectInputFile", null); __decorate([ logMethod ], KwikIDCameraCaptureComponent.prototype, "handleMaskingRatio", null); __decorate([ logMethod ], KwikIDCameraCaptureComponent.prototype, "upload", null); __decorate([ logMethod ], KwikIDCameraCaptureComponent.prototype, "flip", null); __decorate([ logMethod ], KwikIDCameraCaptureComponent.prototype, "correctMirror", null); __decorate([ logMethod ], KwikIDCameraCaptureComponent.prototype, "switchCamera", null); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDCameraCaptureComponent, decorators: [{ type: Component, args: [{ selector: "kwikid-camera-capture", templateUrl: "./kwikid-camera-capture.component.html", styleUrls: ["./kwikid-camera-capture.component.scss"], providers: [ { provide: TUI_SANITIZER, useClass: NgDompurifySanitizer } ], animations: [ trigger("panelInOut", [ transition(":enter", [ style({ transform: "translateY(100%)" }), animate(300) ]), transition(":leave", [ animate(100, style({ transform: "translateY(100%)" })) ]) ]) ], changeDetection: ChangeDetectionStrategy.OnPush }] }], ctorParameters: function () { return [{ type: i1.KwikUILoaderService }, { type: i2.TuiAlertService, decorators: [{ type: Inject, args: [TuiAlertService] }] }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { videoElement: [{ type: ViewChild, args: ["videoElement", { static: true }] }], previewElement: [{ type: ViewChild, args: ["previewElement", { static: true }] }], maskElement: [{ type: ViewChild, args: ["maskElement", { static: false }] }], inputFile: [{ type: ViewChild, args: ["inputFile", { static: false }] }], config: [{ type: Input }], image: [{ type: Input }], data: [{ type: Input }], getImage: [{ type: Output }], onClickBack: [{ type: Output }], onClickClose: [{ type: Output }], onClickSave: [{ type: Output }], showImagePreview: [], hideImagePreview: [], ngOnInit: [], ngOnChanges: [], ngAfterViewInit: [], ngOnDestroy: [], startCamera: [], stopCamera: [], capture: [], back: [], close: [], retry: [], save: [], handleOnSelectInputFile: [], handleMaskingRatio: [], upload: [], flip: [], correctMirror: [], switchCamera: [] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3dpa2lkLWNhbWVyYS1jYXB0dXJlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2t3aWtpZC1jYW1lcmEvc3JjL2xpYi9jb21wb25lbnRzL2t3aWtpZC1jYW1lcmEtY2FwdHVyZS9rd2lraWQtY2FtZXJhLWNhcHR1cmUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva3dpa2lkLWNhbWVyYS9zcmMvbGliL2NvbXBvbmVudHMva3dpa2lkLWNhbWVyYS1jYXB0dXJlL2t3aWtpZC1jYW1lcmEtY2FwdHVyZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsZ0NBQWdDO0FBQ2hDLG1DQUFtQztBQUNuQyxzREFBc0Q7QUFDdEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFFLE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUlMLE1BQU0sRUFFTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM3RCxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLGlCQUFpQixFQUNqQixnQkFBZ0IsRUFDaEIsZUFBZSxFQUNmLFNBQVMsRUFDVCxZQUFZLEVBQ2IsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQ0wsUUFBUSxFQUNSLGNBQWMsRUFDZCxPQUFPLEVBQ1AsU0FBUyxFQUNWLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixjQUFjLEVBQ2YsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzQyxP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aW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuaW1wb3J0IHsgYW5pbWF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tIFwiQGFuZ3VsYXIvYW5pbWF0aW9uc1wiO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IFRVSV9TQU5JVElaRVIsIFR1aUFsZXJ0U2VydmljZSB9IGZyb20gXCJAdGFpZ2EtdWkvY29yZVwiO1xuaW1wb3J0IHsgTmdEb21wdXJpZnlTYW5pdGl6ZXIgfSBmcm9tIFwiQHRpbmtvZmYvbmctZG9tcHVyaWZ5XCI7XG5pbXBvcnQge1xuICBjaGVja09iamVjdEtleUV4aXN0cyxcbiAgZ2V0T2JqZWN0RGVlcENvcHksXG4gIGlzTm90RW1wdHlTdHJpbmcsXG4gIGlzTm90RW1wdHlWYWx1ZSxcbiAgbG9nTWV0aG9kLFxuICBtZXJnZU9iamVjdHNcbn0gZnJvbSBcImt3aWtpZC10b29sa2l0XCI7XG5pbXBvcnQgeyBLd2lrVUlMb2FkZXJTZXJ2aWNlIH0gZnJvbSBcImt3aWt1aVwiO1xuaW1wb3J0IHtcbiAgY2xvc2VTdmcsXG4gIGNsb3VkVXBsb2FkU3ZnLFxuICBmbGlwU3ZnLFxuICB1cGxvYWRTdmdcbn0gZnJvbSBcIi4uLy4uL2t3aWtpZC1jYW1lcmEuaWNvbnNcIjtcbmltcG9ydCB7XG4gIEJVVFRPTl9QUk9QRVJUSUVTLFxuICBERUZBVUxUX0NPTkZJR1xufSBmcm9tIFwiLi9rd2lraWQtY2FtZXJhLWNhcHR1cmUuY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBnZXRDb3JyZWN0SW1hZ2VGb3JtYXQsXG4gIGdldENyb3BwZWRJbWFnZSxcbiAgZ2V0Q3JvcHBlZEltYWdlRnJvbU1hc2ssXG4gIGdldERldmljZUlkLFxuICBnZXREZXZpY2VzTGlzdCxcbiAgZ2V0SW1hZ2VGcm9tQmFzZTY0LFxuICBnZXRTY2FsZWRJbWFnZUZyb21WaWRlbyxcbiAgZ2V0V2F0ZXJtYXJrZWRJbWFnZVxufSBmcm9tIFwiLi9rd2lraWQtY2FtZXJhLWNhcHR1cmUuaGVscGVyXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJrd2lraWQtY2FtZXJhLWNhcHR1cmVcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9rd2lraWQtY2FtZXJhLWNhcHR1cmUuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuL2t3aWtpZC1jYW1lcmEtY2FwdHVyZS5jb21wb25lbnQuc2Nzc1wiXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogVFVJX1NBTklUSVpFUixcbiAgICAgIHVzZUNsYXNzOiBOZ0RvbXB1cmlmeVNhbml0aXplclxuICAgIH1cbiAgXSxcbiAgYW5pbWF0aW9uczogW1xuICAgIHRyaWdnZXIoXCJwYW5lbEluT3V0XCIsIFtcbiAgICAgIHRyYW5zaXRpb24oXCI6ZW50ZXJcIiwgW1xuICAgICAgICBzdHlsZSh7IHRyYW5zZm9ybTogXCJ0cmFuc2xhdGVZKDEwMCUpXCIgfSksXG4gICAgICAgIGFuaW1hdGUoMzAwKVxuICAgICAgXSksXG4gICAgICB0cmFuc2l0aW9uKFwiOmxlYXZlXCIsIFtcbiAgICAgICAgYW5pbWF0ZSgxMDAsIHN0eWxlKHsgdHJhbnNmb3JtOiBcInRyYW5zbGF0ZVkoMTAwJSlcIiB9KSlcbiAgICAgIF0pXG4gICAgXSlcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgS3dpa0lEQ2FtZXJhQ2FwdHVyZUNvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3lcbntcbiAgcmVhZG9ubHkgU1ZHOiBhbnkgPSB7XG4gICAgZmxpcFN2ZyxcbiAgICB1cGxvYWRTdmcsXG4gICAgY2xvdWRVcGxvYWRTdmcsXG4gICAgY2xvc2VTdmdcbiAgfTtcblxuICByZWFkb25seSBCVVRUT05fUFJPUFM6IGFueSA9IEJVVFRPTl9QUk9QRVJUSUVTO1xuXG4gIEBWaWV3Q2hpbGQoXCJ2aWRlb0VsZW1lbnRcIiwgeyBzdGF0aWM6IHRydWUgfSlcbiAgdmlkZW9FbGVtZW50OiBFbGVtZW50UmVmPEhUTUxWaWRlb0VsZW1lbnQ+O1xuXG4gIEBWaWV3Q2hpbGQoXCJwcmV2aWV3RWxlbWVudFwiLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBwcmV2aWV3RWxlbWVudDogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgQFZpZXdDaGlsZChcIm1hc2tFbGVtZW50XCIsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBtYXNrRWxlbWVudDogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgQFZpZXdDaGlsZChcImlucHV0RmlsZVwiLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgaW5wdXRGaWxlOiBFbGVtZW50UmVmPGFueT47XG5cbiAgQElucHV0KClcbiAgY29uZmlnOiBhbnkgPSBERUZBVUxUX0NPTkZJRztcblxuICBASW5wdXQoKVxuICBpbWFnZSA9IFwiXCI7XG5cbiAgb3JpZ2luYWxJbWFnZSA9IFwiXCI7XG5cbiAgY3JvcHBlZEltYWdlID0gXCJcIjtcblxuICBtYXNrZWRJbWFnZSA9IFwiXCI7XG5cbiAgQElucHV0KClcbiAgZGF0YTogYW55ID0ge1xuICAgIHdhdGVybWFyazoge31cbiAgfTtcblxuICBAT3V0cHV0KClcbiAgZ2V0SW1hZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQE91dHB1dCgpXG4gIG9uQ2xpY2tCYWNrOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBPdXRwdXQoKVxuICBvbkNsaWNrQ2xvc2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5c