kwikid-camera
Version:
KwikID's Camera Component
519 lines • 80.6 kB
JavaScript
import { __awaiter, __decorate } from "tslib";
/* eslint-disable brace-style */
import { animate, style, transition, trigger } from "@angular/animations";
import { ChangeDetectionStrategy, Component, EventEmitter, Inject, Input, Output, SecurityContext, ViewChild } from "@angular/core";
import { TUI_SANITIZER, TuiAlertService } from "@taiga-ui/core";
import { NgDompurifySanitizer } from "@tinkoff/ng-dompurify";
import { checkObjectKeyExists, isNotEmptyValue, logMethod, mergeObjects } from "kwikid-toolkit";
import { BUTTON_PROPERTIES, DEFAULT_CONFIG } from "./kwikid-camera-record.constants";
import { IRecordingState } from "./kwikid-camera-record.definitions";
import { getCorrectVideoFormat, getDevice, getDevicesList } from "./kwikid-camera-record.helper";
import * as i0 from "@angular/core";
import * as i1 from "./kwikid-camera-record.service";
import * as i2 from "@angular/platform-browser";
import * as i3 from "kwikui";
import * as i4 from "@taiga-ui/core";
import * as i5 from "@angular/common";
export class KwikIDCameraRecordComponent {
constructor(recordService, ref, sanitizer, kwikuiLoaderService, alert) {
this.recordService = recordService;
this.ref = ref;
this.sanitizer = sanitizer;
this.kwikuiLoaderService = kwikuiLoaderService;
this.alert = alert;
this.BUTTON_PROPS = BUTTON_PROPERTIES;
this.config = DEFAULT_CONFIG;
this.video = null;
/**
* Video is emitted at following scenarios -
* 1. When stop button is clicked and blob is retrieved from RecordRTC subscription.
* 2. When save button is clicked from Preview Dialog.
*/
this.getVideo = new EventEmitter();
this.onClickBack = new EventEmitter();
this.onClickClose = new EventEmitter();
this.onClickSave = new EventEmitter();
this.originalVideoBlob = null;
this.mediaStreamSubscription = null;
this.blobSubscription = null;
this.timerSubscription = null;
this.recordingTime = 0;
this.recordingState = IRecordingState.NONE;
this.recordingStateSuscription = null;
this.videoPreviewVisible = false;
this.files = [];
this.mediaStream = null;
this.devicesList = [];
this.activeDeviceId = "";
this.changeDetectionRefInterval = undefined;
// Camera Settings
this.isSwitching = false;
// Misc Methods
this.loading = null;
}
setVideo(video) {
this.video = video;
}
resetVideo() {
this.video = null;
}
getOriginalVideoBlob() {
return (this.sanitizer.sanitize(SecurityContext.URL, this.originalVideoBlob) || "");
}
setOriginalVideoBlob(video) {
this.originalVideoBlob = this.sanitizer.bypassSecurityTrustUrl(getCorrectVideoFormat(video));
}
resetOriginalVideoBlob() {
this.originalVideoBlob = null;
}
showVideoPreview() {
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) &&
isNotEmptyValue(this.originalVideoBlob)) {
this.previewElement.nativeElement.style.display = "flex";
this.videoPreviewVisible = true;
}
else {
this.hideVideoPreview();
}
}
hideVideoPreview() {
this.previewElement.nativeElement.style.display = "none";
this.videoPreviewVisible = false;
}
// Lifecycle Methods
ngOnInit() {
return __awaiter(this, void 0, void 0, function* () {
this.config = mergeObjects({}, DEFAULT_CONFIG, this.config);
this.mediaStreamSubscription = this.recordService
.getMediaStream()
.subscribe((data) => {
this.videoElement.nativeElement.srcObject = data;
this.ref.detectChanges();
});
this.recordingStateSuscription = this.recordService
.getRecordingState()
.subscribe((state) => {
this.recordingState = state;
this.ref.detectChanges();
});
this.blobSubscription = this.recordService.getBlob().subscribe((data) => {
var _a, _b, _c;
this.setOriginalVideoBlob(data);
this.resetVideo();
this.ref.detectChanges();
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.showVideoPreview();
}
else {
this.getVideo.emit({
originalVideo: data
});
}
});
this.timerSubscription = this.recordService
.getTimerUpdate()
.subscribe((currentRecordingTime) => {
var _a, _b, _c, _d;
this.recordingTime = currentRecordingTime;
if (isNotEmptyValue((_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.others) === null || _b === void 0 ? void 0 : _b.maxRecordingTime) &&
currentRecordingTime > ((_d = (_c = this.config) === null || _c === void 0 ? void 0 : _c.others) === null || _d === void 0 ? void 0 : _d.maxRecordingTime)) {
this.stopRecording();
}
this.ref.detectChanges();
});
this.changeDetectionRefInterval = setInterval(() => {
this.ref.detectChanges();
}, 500);
this.presentLoading("Loading...");
this.devicesList = yield getDevicesList();
this.startCamera();
this.dismissLoading();
});
}
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("video")) {
const video = changes.video.currentValue;
this.setOriginalVideoBlob(video);
if (isNotEmptyValue(video)) {
this.showVideoPreview();
}
}
}
ngAfterViewInit() {
return __awaiter(this, void 0, void 0, function* () {
if (isNotEmptyValue(this.originalVideoBlob)) {
this.showVideoPreview();
}
else {
this.hideVideoPreview();
}
});
}
ngOnDestroy() {
if (isNotEmptyValue(this.recordingStateSuscription)) {
this.recordingStateSuscription.unsubscribe();
}
if (isNotEmptyValue(this.mediaStreamSubscription)) {
this.mediaStreamSubscription.unsubscribe();
}
if (isNotEmptyValue(this.blobSubscription)) {
this.blobSubscription.unsubscribe();
}
if (this.changeDetectionRefInterval) {
clearInterval(this.changeDetectionRefInterval);
}
this.stopCamera();
this.resetVideo();
this.resetOriginalVideoBlob();
}
// Camera Functionality
startCamera() {
return __awaiter(this, void 0, void 0, function* () {
this.hideVideoPreview();
this.dismissLoading();
const activeDevice = yield getDevice(this.devicesList, this.config.others.isFrontCamera);
this.activeDeviceId = activeDevice.deviceId;
if (isNotEmptyValue(this.activeDeviceId)) {
navigator.mediaDevices
.getUserMedia({
audio: false,
video: {
deviceId: {
exact: this.activeDeviceId
}
}
})
.then((stream) => {
this.dismissLoading();
this.mediaStream = stream;
const track = stream.getVideoTracks()[0];
const settings = track.getSettings();
if ((settings === null || settings === void 0 ? void 0 : settings.facingMode) === "user") {
this.config.others.isFrontCamera = true;
}
else if ((settings === null || settings === void 0 ? void 0 : settings.facingMode) === "environment") {
this.config.others.isFrontCamera = false;
}
this.correctMirror();
this.videoElement.nativeElement.srcObject = stream;
this.videoElement.nativeElement.play();
})
.catch((error) => {
console.log("Error accessing camera:", error);
});
}
else {
navigator.mediaDevices
.getUserMedia({
audio: false,
video: {
facingMode: this.config.others.isFrontCamera
? "user"
: "environment"
}
})
.then((stream) => {
this.dismissLoading();
this.mediaStream = stream;
const track = stream.getVideoTracks()[0];
const settings = track.getSettings();
if ((settings === null || settings === void 0 ? void 0 : settings.facingMode) === "user") {
this.config.others.isFrontCamera = true;
}
else if ((settings === null || settings === void 0 ? void 0 : settings.facingMode) === "environment") {
this.config.others.isFrontCamera = false;
}
this.correctMirror();
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;
}
}
// Recording Functionality
startRecording() {
var _a, _b, _c, _d, _e, _f;
this.presentLoading();
this.recordService.startRecording({
minRecordingTimeInSeconds: (_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.others) === null || _b === void 0 ? void 0 : _b.minRecordingTimeInSeconds,
maxRecordingTimeInSeconds: (_d = (_c = this.config) === null || _c === void 0 ? void 0 : _c.others) === null || _d === void 0 ? void 0 : _d.maxRecordingTimeInSeconds,
isFrontCamera: (_f = (_e = this.config) === null || _e === void 0 ? void 0 : _e.others) === null || _f === void 0 ? void 0 : _f.isFrontCamera,
videoDeviceId: this.activeDeviceId
});
this.dismissLoading();
}
pauseRecording() {
this.recordService.pauseRecording();
}
resumeRecording() {
this.recordService.resumeRecording();
}
stopRecording() {
this.presentLoading();
this.recordService.stopRecording();
this.dismissLoading();
}
downloadRecording() {
this.presentLoading();
this.recordService.downloadRecording();
this.dismissLoading();
}
clearRecording() {
this.presentLoading();
this.recordService.clearRecording();
this.resetVideo();
this.resetOriginalVideoBlob();
this.startCamera();
}
// Layout & Buttons Functionality
back() {
this.onClickBack.emit({});
}
close() {
this.onClickClose.emit({});
}
retry() {
this.inputFile.nativeElement.value = "";
this.resetVideo();
this.resetOriginalVideoBlob();
this.clearRecording();
this.hideVideoPreview();
this.startCamera();
}
save() {
this.onClickSave.emit({
originalVideo: this.getOriginalVideoBlob()
});
}
// File Upload Functionality
handleOnSelectInputFile() {
this.presentLoading();
const file = this.inputFile.nativeElement.files[0];
const reader = new FileReader();
reader.onloadend = () => {
var _a, _b, _c;
const videoBase64 = reader.result;
this.setOriginalVideoBlob(videoBase64);
this.dismissLoading();
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.showVideoPreview();
}
else {
this.getVideo.emit({
originalVideo: videoBase64
});
}
};
reader.readAsDataURL(file);
}
upload() {
if (this.inputFile) {
this.inputFile.nativeElement.value = "";
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* () {
this.isSwitching = true;
this.config.others.isFrontCamera = !this.config.others.isFrontCamera;
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 */ KwikIDCameraRecordComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDCameraRecordComponent, deps: [{ token: i1.KwikIDCameraRecordService }, { token: i0.ChangeDetectorRef }, { token: i2.DomSanitizer }, { token: i3.KwikUILoaderService }, { token: TuiAlertService }], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ KwikIDCameraRecordComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: KwikIDCameraRecordComponent, selector: "kwikid-camera-record", inputs: { config: "config", video: "video" }, outputs: { getVideo: "getVideo", 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: "inputFile", first: true, predicate: ["inputFile"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<video\n id=\"video-player\"\n #videoElement\n autoplay\n playsInline\n loop\n [class.flip-horizontal]=\"config.others?.flipHorizontal\"\n>\n <source\n [src]=\"originalVideoBlob\"\n type=\"video/*\"\n />\n Your browser does not support the video tag.\n</video>\n\n<div\n class=\"overlay-message loading\"\n *ngIf=\"loading\"\n>\n Loading...\n</div>\n\n<div\n class=\"overlay-message camera-switching\"\n *ngIf=\"isSwitching && !loading\"\n>\n Switching...\n</div>\n\n<div\n class=\"overlay-message no-permission\"\n *ngIf=\"devicesList.length === 0 && !isSwitching && !loading\"\n>\n We couldn't detect a camera or microphone.\n <br />\n <br />\n Please check your device settings or grant permission when prompted.\n</div>\n\n<div\n class=\"overlay-message start-recording\"\n *ngIf=\"\n devicesList.length > 0 &&\n recordingState !== 'RECORDING' &&\n !isSwitching &&\n !loading\n \"\n>\n Please click the play button to start recording!\n</div>\n\n<input\n type=\"file\"\n accept=\"video/*,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='record-header']\"></ng-content>\n </header>\n <main></main>\n <footer>\n <div class=\"footer-left\">\n <kwikui-button\n *ngIf=\"\n config?.footer?.isUpload &&\n recordingState !== 'RECORDING' &&\n recordingState !== 'PAUSED'\n \"\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 <kwikui-button\n *ngIf=\"devicesList.length > 0 && recordingState === 'RECORDING'\"\n [appearance]=\"BUTTON_PROPS.appearance_whiteblock\"\n icon=\"tuiIconPause\"\n label=\"\"\n shape=\"rounded\"\n [size]=\"BUTTON_PROPS.size_m\"\n (click)=\"pauseRecording()\"\n ></kwikui-button>\n <kwikui-button\n *ngIf=\"devicesList.length > 0 && recordingState === 'PAUSED'\"\n [appearance]=\"BUTTON_PROPS.appearance_whiteblock\"\n icon=\"tuiIconPlay\"\n label=\"\"\n shape=\"rounded\"\n [size]=\"BUTTON_PROPS.size_m\"\n (click)=\"resumeRecording()\"\n ></kwikui-button>\n </div>\n <div class=\"footer-center\">\n <kwikui-button\n *ngIf=\"\n devicesList.length > 0 &&\n (recordingState === 'NONE' || recordingState === 'RECORDED')\n \"\n [appearance]=\"BUTTON_PROPS.appearance_whiteblock\"\n icon=\"tuiIconPlayLarge\"\n label=\"\"\n shape=\"rounded\"\n [size]=\"BUTTON_PROPS.size_l\"\n (click)=\"startRecording()\"\n ></kwikui-button>\n <kwikui-button\n *ngIf=\"\n devicesList.length > 0 &&\n (recordingState === 'RECORDING' || recordingState === 'PAUSED')\n \"\n [appearance]=\"BUTTON_PROPS.appearance_whiteblock\"\n [disabled]=\"\n this.config?.others?.minRecordingTimeInSeconds > this.recordingTime\n \"\n [tuiHint]=\"\n this.config?.others?.minRecordingTimeInSeconds > this.recordingTime\n ? TOOLTIP_FOR_INDICATING_MINIMUM_RECORDING_TIME\n : null\n \"\n tuiHintDirection=\"top\"\n icon=\"tuiIconSquareLarge\"\n label=\"\"\n shape=\"rounded\"\n [size]=\"BUTTON_PROPS.size_l\"\n (click)=\"stopRecording()\"\n ></kwikui-button>\n </div>\n <div class=\"footer-right\">\n <kwikui-button\n *ngIf=\"\n config?.footer?.isFlip &&\n devicesList.length > 0 &&\n recordingState !== 'RECORDING' &&\n recordingState !== 'PAUSED'\n \"\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=\"\n config?.footer?.isSwitch &&\n devicesList.length > 1 &&\n recordingState !== 'RECORDING' &&\n recordingState !== 'PAUSED'\n \"\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 class=\"preview-frame\">\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 <video\n id=\"preview-video-player\"\n autoplay\n controls\n [src]=\"originalVideoBlob\"\n >\n Your browser does not support the video tag.\n </video>\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\n<!-- Templates -->\n<ng-template #TOOLTIP_FOR_INDICATING_MINIMUM_RECORDING_TIME>\n <div>\n You can stop the recording after\n {{ this.config?.others?.minRecordingTimeInSeconds - this.recordingTime }}s.\n </div>\n</ng-template>\n", styles: [".button-container{display:flex;flex-direction:row;align-content:center;justify-content:center;align-items:center;grid-gap:1rem;gap:1rem;position:absolute;bottom:1rem;left:50%;transform:translate(-50%);z-index:1}.video-container{width:500px;height:500px;border:2px solid black}.container{display:flex;flex-direction:column}: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 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%;height:100%;overflow:auto;background:transparent;box-shadow:#64646f33 0 7px 29px;border-radius:.5rem;display:flex;flex-direction:row;align-content:center;justify-content:center;align-items:center}#preview-frame-container .preview-frame{width:100%;height:auto;max-width:min(90%,420px);max-height:min(90%);overflow:auto;display:flex;background:white;border-radius:.5rem;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 main video{position:unset!important}#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#video-player{background-color:#121212}video.flip-horizontal{transform:scaleX(-1);-webkit-transform:scaleX(-1)}canvas{position:absolute;width:100%;height:100%;top:0;left:0;object-fit:cover}.overlay-message{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;padding:1rem;font-size:1rem;text-align:center;line-height:1.5rem;text-shadow:0px 0px 10px black}.overlay-message.start-recording{background:rgba(0,0,0,.35)}\n"], components: [{ type: i3.KwikUIButtonComponent, selector: "kwikui-button", inputs: ["appearance", "class", "disabled", "icon", "iconRight", "id", "label", "shape", "showLoader", "size", "styles", "type", "pseudoHover"], outputs: ["onClick"] }, { type: i4.TuiSvgComponent, selector: "tui-svg", inputs: ["src"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.TuiHintDirective, selector: "[tuiHint]:not(ng-container):not(ng-template)", inputs: ["tuiHint", "tuiHintContext", "tuiHintAppearance"] }, { type: i4.TuiHintDriverDirective, selector: "[tuiHint]:not(ng-container):not(ng-template)" }, { type: i4.TuiHintHoverDirective, selector: "[tuiHint]:not(ng-container):not(ng-template)", inputs: ["tuiHintShowDelay", "tuiHintHideDelay"], exportAs: ["tuiHintHover"] }, { type: i4.TuiHintPositionDirective, selector: "[tuiHint]:not(ng-container):not(ng-template)", inputs: ["tuiHintDirection"] }], 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
], KwikIDCameraRecordComponent.prototype, "setVideo", null);
__decorate([
logMethod
], KwikIDCameraRecordComponent.prototype, "resetVideo", null);
__decorate([
logMethod
], KwikIDCameraRecordComponent.prototype, "getOriginalVideoBlob", null);
__decorate([
logMethod
], KwikIDCameraRecordComponent.prototype, "setOriginalVideoBlob", null);
__decorate([
logMethod
], KwikIDCameraRecordComponent.prototype, "resetOriginalVideoBlob", null);
__decorate([
logMethod
], KwikIDCameraRecordComponent.prototype, "showVideoPreview", null);
__decorate([
logMethod
], KwikIDCameraRecordComponent.prototype, "hideVideoPreview", null);
__decorate([
logMethod
], KwikIDCameraRecordComponent.prototype, "ngOnInit", null);
__decorate([
logMethod
], KwikIDCameraRecordComponent.prototype, "ngOnChanges", null);
__decorate([
logMethod
], KwikIDCameraRecordComponent.prototype, "ngAfterViewInit", null);
__decorate([
logMethod
], KwikIDCameraRecordComponent.prototype, "ngOnDestroy", null);
__decorate([
logMethod
], KwikIDCameraRecordComponent.prototype, "startCamera", null);
__decorate([
logMethod
], KwikIDCameraRecordComponent.prototype, "stopCamera", null);
__decorate([
logMethod
], KwikIDCameraRecordComponent.prototype, "startRecording", null);
__decorate([
logMethod
], KwikIDCameraRecordComponent.prototype, "pauseRecording", null);
__decorate([
logMethod
], KwikIDCameraRecordComponent.prototype, "resumeRecording", null);
__decorate([
logMethod
], KwikIDCameraRecordComponent.prototype, "stopRecording", null);
__decorate([
logMethod
], KwikIDCameraRecordComponent.prototype, "downloadRecording", null);
__decorate([
logMethod
], KwikIDCameraRecordComponent.prototype, "clearRecording", null);
__decorate([
logMethod
], KwikIDCameraRecordComponent.prototype, "back", null);
__decorate([
logMethod
], KwikIDCameraRecordComponent.prototype, "close", null);
__decorate([
logMethod
], KwikIDCameraRecordComponent.prototype, "retry", null);
__decorate([
logMethod
], KwikIDCameraRecordComponent.prototype, "save", null);
__decorate([
logMethod
], KwikIDCameraRecordComponent.prototype, "handleOnSelectInputFile", null);
__decorate([
logMethod
], KwikIDCameraRecordComponent.prototype, "upload", null);
__decorate([
logMethod
], KwikIDCameraRecordComponent.prototype, "flip", null);
__decorate([
logMethod
], KwikIDCameraRecordComponent.prototype, "correctMirror", null);
__decorate([
logMethod
], KwikIDCameraRecordComponent.prototype, "switchCamera", null);
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDCameraRecordComponent, decorators: [{
type: Component,
args: [{
selector: "kwikid-camera-record",
templateUrl: "./kwikid-camera-record.component.html",
styleUrls: ["./kwikid-camera-record.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.KwikIDCameraRecordService }, { type: i0.ChangeDetectorRef }, { type: i2.DomSanitizer }, { type: i3.KwikUILoaderService }, { type: i4.TuiAlertService, decorators: [{
type: Inject,
args: [TuiAlertService]
}] }]; }, propDecorators: { videoElement: [{
type: ViewChild,
args: ["videoElement", { static: true }]
}], previewElement: [{
type: ViewChild,
args: ["previewElement", { static: true }]
}], inputFile: [{
type: ViewChild,
args: ["inputFile", { static: false }]
}], config: [{
type: Input
}], video: [{
type: Input
}], setVideo: [], resetVideo: [], getVideo: [{
type: Output
}], onClickBack: [{
type: Output
}], onClickClose: [{
type: Output
}], onClickSave: [{
type: Output
}], getOriginalVideoBlob: [], setOriginalVideoBlob: [], resetOriginalVideoBlob: [], showVideoPreview: [], hideVideoPreview: [], ngOnInit: [], ngOnChanges: [], ngAfterViewInit: [], ngOnDestroy: [], startCamera: [], stopCamera: [], startRecording: [], pauseRecording: [], resumeRecording: [], stopRecording: [], downloadRecording: [], clearRecording: [], back: [], close: [], retry: [], save: [], handleOnSelectInputFile: [], upload: [], flip: [], correctMirror: [], switchCamera: [] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3dpa2lkLWNhbWVyYS1yZWNvcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva3dpa2lkLWNhbWVyYS9zcmMvbGliL2NvbXBvbmVudHMva3dpa2lkLWNhbWVyYS1yZWNvcmQva3dpa2lkLWNhbWVyYS1yZWNvcmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva3dpa2lkLWNhbWVyYS9zcmMvbGliL2NvbXBvbmVudHMva3dpa2lkLWNhbWVyYS1yZWNvcmQva3dpa2lkLWNhbWVyYS1yZWNvcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLGdDQUFnQztBQUNoQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDMUUsT0FBTyxFQUVMLHVCQUF1QixFQUV2QixTQUFTLEVBRVQsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBSUwsTUFBTSxFQUNOLGVBQWUsRUFFZixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM3RCxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLGVBQWUsRUFDZixTQUFTLEVBQ1QsWUFBWSxFQUNiLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixjQUFjLEVBQ2YsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEVBQ0wsZUFBZSxFQUVoQixNQUFNLG9DQUFvQyxDQUFDO0FBQzVDLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsU0FBUyxFQUNULGNBQWMsRUFDZixNQUFNLCtCQUErQixDQUFDOzs7Ozs7O0FBMEJ2QyxNQUFN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