UNPKG

kwikid-camera

Version:
128 lines 15.9 kB
import { __awaiter, __decorate } from "tslib"; /* eslint-disable brace-style */ /* eslint-disable no-unused-vars */ /* eslint-disable @typescript-eslint/no-unused-vars */ import { ChangeDetectionStrategy, Component, Input, ViewChild } from "@angular/core"; import { TUI_SANITIZER } from "@taiga-ui/core"; import { NgDompurifySanitizer } from "@tinkoff/ng-dompurify"; import { checkObjectKeyExists, mergeObjects, logMethod } from "kwikid-toolkit"; import { DEFAULT_CONFIG } from "./kwikid-camera-view.constants"; import { getDeviceId } from "./kwikid-camera-view.helper"; import * as i0 from "@angular/core"; import * as i1 from "kwikui"; export class KwikIDCameraViewComponent { constructor(kwikuiLoaderService, ref) { this.kwikuiLoaderService = kwikuiLoaderService; this.ref = ref; this.config = DEFAULT_CONFIG; this.mediaStream = null; this.currentDeviceId = ""; this.changeDetectionRefInterval = undefined; } ngOnInit() { return __awaiter(this, void 0, void 0, function* () { this.config = mergeObjects({}, DEFAULT_CONFIG, this.config); this.changeDetectionRefInterval = setInterval(() => { this.ref.detectChanges(); }, 500); }); } ngOnChanges(changes) { if (checkObjectKeyExists(changes, "config") && !changes.config.firstChange) { this.config = mergeObjects({}, DEFAULT_CONFIG, changes.config.currentValue); this.applyCameraSettings(); } } ngAfterViewInit() { return __awaiter(this, void 0, void 0, function* () { this.currentDeviceId = yield getDeviceId(null); this.applyCameraSettings(); this.startCamera(); }); } ngOnDestroy() { this.stopCamera(); if (this.changeDetectionRefInterval) { clearInterval(this.changeDetectionRefInterval); } } applyCameraSettings() { var _a; if (this.videoElement) { this.videoElement.nativeElement.style.transform = ((_a = this.config.others) === null || _a === void 0 ? void 0 : _a.flipHorizontal) ? "scaleX(-1); translate(50%, -50%)" : "scaleX(1); translate(-50%, -50%)"; } } startCamera() { navigator.mediaDevices .getUserMedia({ audio: false, video: { facingMode: this.config.others.isFrontCamera ? "user" : "environment" } }) .then((stream) => { 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; } } } /** @nocollapse */ KwikIDCameraViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDCameraViewComponent, deps: [{ token: i1.KwikUILoaderService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ KwikIDCameraViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: KwikIDCameraViewComponent, selector: "kwikid-camera-view", inputs: { config: "config" }, providers: [ { provide: TUI_SANITIZER, useClass: NgDompurifySanitizer } ], viewQueries: [{ propertyName: "videoElement", first: true, predicate: ["videoElement"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<video\n #videoElement\n playsinline\n autoplay\n muted\n></video>\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}.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{width:100%;height:100%;object-fit:cover;overflow:hidden;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}video.flip-horizontal{transform:scaleX(-1) translate(50%,-50%)}#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"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); __decorate([ logMethod ], KwikIDCameraViewComponent.prototype, "ngOnInit", null); __decorate([ logMethod ], KwikIDCameraViewComponent.prototype, "ngOnChanges", null); __decorate([ logMethod ], KwikIDCameraViewComponent.prototype, "ngAfterViewInit", null); __decorate([ logMethod ], KwikIDCameraViewComponent.prototype, "ngOnDestroy", null); __decorate([ logMethod ], KwikIDCameraViewComponent.prototype, "applyCameraSettings", null); __decorate([ logMethod ], KwikIDCameraViewComponent.prototype, "startCamera", null); __decorate([ logMethod ], KwikIDCameraViewComponent.prototype, "stopCamera", null); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDCameraViewComponent, decorators: [{ type: Component, args: [{ selector: "kwikid-camera-view", templateUrl: "./kwikid-camera-view.component.html", styleUrls: ["./kwikid-camera-view.component.scss"], providers: [ { provide: TUI_SANITIZER, useClass: NgDompurifySanitizer } ], changeDetection: ChangeDetectionStrategy.OnPush }] }], ctorParameters: function () { return [{ type: i1.KwikUILoaderService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { videoElement: [{ type: ViewChild, args: ["videoElement", { static: true }] }], config: [{ type: Input }], ngOnInit: [], ngOnChanges: [], ngAfterViewInit: [], ngOnDestroy: [], applyCameraSettings: [], startCamera: [], stopCamera: [] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3dpa2lkLWNhbWVyYS12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2t3aWtpZC1jYW1lcmEvc3JjL2xpYi9jb21wb25lbnRzL2t3aWtpZC1jYW1lcmEtdmlldy9rd2lraWQtY2FtZXJhLXZpZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva3dpa2lkLWNhbWVyYS9zcmMvbGliL2NvbXBvbmVudHMva3dpa2lkLWNhbWVyYS12aWV3L2t3aWtpZC1jYW1lcmEtdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsZ0NBQWdDO0FBQ2hDLG1DQUFtQztBQUNuQyxzREFBc0Q7QUFDdEQsT0FBTyxFQUVMLHVCQUF1QixFQUV2QixTQUFTLEVBRVQsS0FBSyxFQUtMLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0MsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDN0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUvRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDOzs7QUFjMUQsTUFBTSxPQUFPLHlCQUF5QjtJQWVwQyxZQUNTLG1CQUF3QyxFQUN2QyxHQUFzQjtRQUR2Qix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3ZDLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBVmhDLFdBQU0sR0FBUSxjQUFjLENBQUM7UUFFckIsZ0JBQVcsR0FBdUIsSUFBSSxDQUFDO1FBRS9DLG9CQUFlLEdBQUcsRUFBRSxDQUFDO1FBRXJCLCtCQUEwQixHQUFRLFNB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QVM7eURBTVQ7QUFHRDtJQURDLFNBQVM7NERBTVQ7QUFHRDtJQURDLFNBQVM7Z0VBS1Q7QUFHRDtJQURDLFNBQVM7NERBTVQ7QUFHRDtJQURDLFNBQVM7b0VBTVQ7QUFHRDtJQURDLFNBQVM7NERBaUJUO0FBR0Q7SUFEQyxTQUFTOzJEQU1UOzRGQXBGVSx5QkFBeUI7a0JBWnJDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLG9CQUFvQjtvQkFDOUIsV0FBVyxFQUFFLHFDQUFxQztvQkFDbEQsU0FBUyxFQUFFLENBQUMscUNBQXFDLENBQUM7b0JBQ2xELFNBQVMsRUFBRTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsYUFBYTs0QkFDdEIsUUFBUSxFQUFFLG9CQUFvQjt5QkFDL0I7cUJBQ0Y7b0JBQ0QsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07aUJBQ2hEOzBJQUtDLFlBQVk7c0JBRFgsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUkzQyxNQUFNO3NCQURMLEtBQUs7Z0JBZUEsUUFBUSxNQVFkLFdBQVcsTUFRTCxlQUFlLE1BT3JCLFdBQVcsTUFRWCxtQkFBbUIsTUFRbkIsV0FBVyxNQW1CWCxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgYnJhY2Utc3R5bGUgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBUVUlfU0FOSVRJWkVSIH0gZnJvbSBcIkB0YWlnYS11aS9jb3JlXCI7XG5pbXBvcnQgeyBOZ0RvbXB1cmlmeVNhbml0aXplciB9IGZyb20gXCJAdGlua29mZi9uZy1kb21wdXJpZnlcIjtcbmltcG9ydCB7IGNoZWNrT2JqZWN0S2V5RXhpc3RzLCBtZXJnZU9iamVjdHMsIGxvZ01ldGhvZCB9IGZyb20gXCJrd2lraWQtdG9vbGtpdFwiO1xuaW1wb3J0IHsgS3dpa1VJTG9hZGVyU2VydmljZSB9IGZyb20gXCJrd2lrdWlcIjtcbmltcG9ydCB7IERFRkFVTFRfQ09ORklHIH0gZnJvbSBcIi4va3dpa2lkLWNhbWVyYS12aWV3LmNvbnN0YW50c1wiO1xuaW1wb3J0IHsgZ2V0RGV2aWNlSWQgfSBmcm9tIFwiLi9rd2lraWQtY2FtZXJhLXZpZXcuaGVscGVyXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJrd2lraWQtY2FtZXJhLXZpZXdcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9rd2lraWQtY2FtZXJhLXZpZXcuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuL2t3aWtpZC1jYW1lcmEtdmlldy5jb21wb25lbnQuc2Nzc1wiXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogVFVJX1NBTklUSVpFUixcbiAgICAgIHVzZUNsYXNzOiBOZ0RvbXB1cmlmeVNhbml0aXplclxuICAgIH1cbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgS3dpa0lEQ2FtZXJhVmlld0NvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3lcbntcbiAgQFZpZXdDaGlsZChcInZpZGVvRWxlbWVudFwiLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICB2aWRlb0VsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTFZpZGVvRWxlbWVudD47XG5cbiAgQElucHV0KClcbiAgY29uZmlnOiBhbnkgPSBERUZBVUxUX0NPTkZJRztcblxuICBwcml2YXRlIG1lZGlhU3RyZWFtOiBNZWRpYVN0cmVhbSB8IG51bGwgPSBudWxsO1xuXG4gIGN1cnJlbnREZXZpY2VJZCA9IFwiXCI7XG5cbiAgY2hhbmdlRGV0ZWN0aW9uUmVmSW50ZXJ2YWw6IGFueSA9IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMga3dpa3VpTG9hZGVyU2VydmljZTogS3dpa1VJTG9hZGVyU2VydmljZSxcbiAgICBwcml2YXRlIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7fVxuXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5jb25maWcgPSBtZXJnZU9iamVjdHMoe30sIERFRkFVTFRfQ09ORklHLCB0aGlzLmNvbmZpZyk7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rpb25SZWZJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9LCA1MDApO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGNoYW5nZXMsIFwiY29uZmlnXCIpICYmICFjaGFuZ2VzLmNvbmZpZy5maXJzdENoYW5nZSkge1xuICAgICAgdGhpcy5jb25maWcgPSBtZXJnZU9iamVjdHMoe30sIERFRkFVTFRfQ09ORklHLCBjaGFuZ2VzLmNvbmZpZy5jdXJyZW50VmFsdWUpO1xuICAgICAgdGhpcy5hcHBseUNhbWVyYVNldHRpbmdzKCk7XG4gICAgfVxuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBuZ0FmdGVyVmlld0luaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5jdXJyZW50RGV2aWNlSWQgPSBhd2FpdCBnZXREZXZpY2VJZChudWxsKTtcbiAgICB0aGlzLmFwcGx5Q2FtZXJhU2V0dGluZ3MoKTtcbiAgICB0aGlzLnN0YXJ0Q2FtZXJhKCk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcENhbWVyYSgpO1xuICAgIGlmICh0aGlzLmNoYW5nZURldGVjdGlvblJlZkludGVydmFsKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuY2hhbmdlRGV0ZWN0aW9uUmVmSW50ZXJ2YWwpO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgYXBwbHlDYW1lcmFTZXR0aW5ncygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52aWRlb0VsZW1lbnQpIHtcbiAgICAgIHRoaXMudmlkZW9FbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID1cbiAgICAgICAgdGhpcy5jb25maWcub3RoZXJzPy5mbGlwSG9yaXpvbnRhbCA/IFwic2NhbGVYKC0xKTsgdHJhbnNsYXRlKDUwJSwgLTUwJSlcIiA6IFwic2NhbGVYKDEpOyB0cmFuc2xhdGUoLTUwJSwgLTUwJSlcIjtcbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIHN0YXJ0Q2FtZXJhKCkge1xuICAgIG5hdmlnYXRvci5tZWRpYURldmljZXNcbiAgICAgIC5nZXRVc2VyTWVkaWEoe1xuICAgICAgICBhdWRpbzogZmFsc2UsXG4gICAgICAgIHZpZGVvOiB7XG4gICAgICAgICAgZmFjaW5nTW9kZTogdGhpcy5jb25maWcub3RoZXJzLmlzRnJvbnRDYW1lcmEgPyBcInVzZXJcIiA6IFwiZW52aXJvbm1lbnRcIlxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLnRoZW4oKHN0cmVhbSkgPT4ge1xuICAgICAgICB0aGlzLm1lZGlhU3RyZWFtID0gc3RyZWFtO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudC5uYXRpdmVFbGVtZW50LnNyY09iamVjdCA9IHN0cmVhbTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnQubmF0aXZlRWxlbWVudC5wbGF5KCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIGFjY2Vzc2luZyBjYW1lcmE6XCIsIGVycm9yKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBzdG9wQ2FtZXJhKCkge1xuICAgIGlmICh0aGlzLm1lZGlhU3RyZWFtKSB7XG4gICAgICB0aGlzLm1lZGlhU3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2goKHRyYWNrKSA9PiB0cmFjay5zdG9wKCkpO1xuICAgICAgdGhpcy5tZWRpYVN0cmVhbSA9IG51bGw7XG4gICAgfVxuICB9XG59XG4iLCI8dmlkZW9cbiAgI3ZpZGVvRWxlbWVudFxuICBwbGF5c2lubGluZVxuICBhdXRvcGxheVxuICBtdXRlZFxuPjwvdmlkZW8+XG4iXX0=