ngx-cam-shoot
Version:
An angular component to use you device's cameras easily. Obtain and save images faster. Thought to use on mobile devices.
1 lines • 80.3 kB
Source Map (JSON)
{"version":3,"file":"ngx-cam-shoot.mjs","sources":["../../../projects/ngx-cam-shoot/src/lib/ngx-cam-shoot.component.ts","../../../projects/ngx-cam-shoot/src/public-api.ts","../../../projects/ngx-cam-shoot/src/ngx-cam-shoot.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\r\nimport { Component, ElementRef, EventEmitter, HostListener, Input, Output, SimpleChanges, ViewChild } from '@angular/core';\r\nimport { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\r\n//import { Subscription } from 'rxjs';\r\n\r\nexport enum eCamShootType{\r\n DEFAULT = 'DEFAULT',\r\n SELFIE = 'SELFIE',\r\n DOCFRONT = 'DOCFRONT',\r\n DOCBACK = 'DOCBACK'\r\n}\r\nexport enum eCamShootFaceMode{\r\n USER = 'user',\r\n ENVIRONMENT = 'environment'\r\n}\r\nexport interface ICamShootDevice{\r\n label: string;\r\n deviceId: string;\r\n isFront?: boolean;\r\n mode: eCamShootFaceMode\r\n haveTorch: boolean;\r\n}\r\n\r\nexport interface ICamShootConfig{\r\n displayTitle?: boolean;\r\n title?: string;\r\n showFaceMode?: boolean;\r\n canChangeMode?: boolean;\r\n type?: eCamShootType;\r\n color?: string;\r\n usePreview?: boolean;\r\n btnTakeAnother?: string;\r\n btnAcceptCapture?: string;\r\n}\r\n\r\ninterface IZoomConfig{\r\n min: number;\r\n max: number;\r\n step: number;\r\n}\r\n\r\n@Component({\r\n selector: 'ngx-cam-shoot',\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule\r\n ],\r\n standalone: true,\r\n template: `\r\n <ng-container *ngIf=\"usePreview && displayPreview\">\r\n <div class=\"cam-shoot-backdrop\"></div>\r\n <div class=\"cam-shoot-preview\">\r\n <div class=\"preview-dialog\">\r\n <div class=\"preview-content\">\r\n <div class=\"preview-image\">\r\n <picture *ngIf=\"isCaptured\">\r\n <img [src]=\"imageCaptured\">\r\n </picture>\r\n </div>\r\n <div class=\"preview-btns\">\r\n <button (click)=\"takeAnother()\" [innerHTML]=\"btnTakeAnother\"></button>\r\n <button (click)=\"sendCapture()\" [innerHTML]=\"btnAcceptCapture\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-container>\r\n<div *ngIf=\"modalCapture\" class=\"cam-shoot l{{orientationDegs}}\" [class.landscape2]=\"isMobile && isLandscape\" [style]=\"getStyleConfig()\">\r\n <div class=\"video-container\">\r\n <div class=\"video-block\">\r\n <video\r\n [class.show]=\"!isCaptured\"\r\n [class.hide]=\"isCaptured\"\r\n [class.selfie]=\"faceMode=='user'\"\r\n #videoImage\r\n id=\"videocap\"\r\n width=\"100%\"\r\n autoplay\r\n playsinline\r\n ></video>\r\n </div>\r\n <canvas\r\n #canvasImage\r\n id=\"canvas\"\r\n ></canvas>\r\n </div>\r\n <div class=\"mask\">\r\n <div class=\"changing\" *ngIf=\"isChangingDevice\"><span>Loading device</span></div>\r\n <div *ngIf=\"showErrors && error.length>0\" class=\"msgError\" [innerHtml]=\"getErrors()\" (dblclick)=\"error = ''\"></div>\r\n <div *ngIf=\"debugMode && debug.length>0\" class=\"msgError\" [innerHtml]=\"getDebugInfo()\" (dblclick)=\"debug = ''\"></div>\r\n\r\n <div class=\"close-btn\" (click)=\"close()\"></div>\r\n <div *ngIf=\"displayTitle\" class=\"head-title\">{{title}} <span *ngIf=\"showFaceMode\" [innerHTML]=\"faceMode=='user'?'😀':'📱'\"]></span><!-- <span *ngIf=\"isLandscape\"> (L)</span><span *ngIf=\"isMobile\"> (M)</span> --></div>\r\n\r\n <div class=\"focus-aim\" *ngIf=\"!isDefault()\">\r\n <div class=\"selfie-aim\" *ngIf=\"isSelfie()\">\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n </div>\r\n <div class=\"doc-aim\" [class.doc-front]=\"isDocFront()\" *ngIf=\"isDocument()\"></div>\r\n </div>\r\n\r\n <div class=\"config\">\r\n <div class=\"btnx btn-devices\" *ngIf=\"hasMultipleDevicesOnMode\">\r\n <select [formControl]=\"device\">\r\n <ng-container *ngFor=\"let c of devices\">\r\n <option *ngIf=\"c.mode==faceMode\" [value]=\"c.deviceId\">{{c.label}}<span *ngIf=\"c.haveTorch\">(🔦)</span><span *ngIf=\"debugMode\"> - {{c.deviceId}}</span></option>\r\n </ng-container>\r\n </select>\r\n </div>\r\n </div>\r\n <div class=\"controls\">\r\n <div class=\"zoom\" *ngIf=\"canActiveZoom && !isDocument()\">\r\n <input type=\"range\" [formControl]=\"zoom\" [min]=\"zoomConfig.min\" [max]=\"zoomConfig.max\" [step]=\"zoomConfig.step\">\r\n <span [innerHTML]=\"getZoomPercent()\"></span>\r\n </div>\r\n <button role=\"btn\" class=\"btnx btn-flash\" [ngClass]=\"{'not-available':!canUseFlash,'opaque':!canActiveFlash,'lights-on':isFlashActive}\" (click)=\"toogleFlash()\"> </button>\r\n <button role=\"btn\" class=\"btnx btn-shoot\" (click)=\"takeCapture()\"> </button>\r\n <button role=\"btn\" class=\"btnx btn-change\" [ngClass]=\"{'opaque':devices.length==1 || isChangingDevice}\" (click)=\"toogleMode()\" *ngIf=\"canChangeMode\"> </button>\r\n </div>\r\n </div>\r\n</div>\r\n `,\r\n styles: `*, ::before, ::after {\r\n box-sizing: border-box;\r\n}\r\n.cam-shoot-backdrop{\r\n --bs-backdrop-zindex: ;\r\n --bs-backdrop-bg: ;\r\n --bs-backdrop-opacity: ;\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n z-index: 1050;\r\n width: 100vw;\r\n height: 100vh;\r\n background-color: #000;\r\n opacity: 0.5;\r\n}\r\n.cam-shoot-preview{\r\n display: block !important;\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n z-index: 1055;\r\n width: 100%;\r\n height: 100%;\r\n overflow-x: hidden;\r\n overflow-y: auto;\r\n outline: 0;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n}\r\n.cam-shoot-preview .preview-dialog{\r\n position: relative;\r\n width: auto;\r\n margin: 1.75rem;\r\n pointer-events: none;\r\n\r\n height: 100%;\r\n display: flex;\r\n align-items: center;\r\n}\r\n.cam-shoot-preview .preview-dialog .preview-content{\r\n position: relative;\r\n display: flex;\r\n flex-direction: column;\r\n width: 100%;\r\n color: var(--bs-modal-color);\r\n pointer-events: auto;\r\n background-color: #fff;\r\n background-clip: padding-box;\r\n border: 1px solid rgba(0,0,0,.175);\r\n border-radius: .5rem;\r\n outline: 0;\r\n padding:.75rem;\r\n}\r\n@media (min-width: 576px) {\r\n .cam-shoot-preview .preview-dialog {\r\n max-width: 500px;\r\n margin-right: auto;\r\n margin-left: auto;\r\n }\r\n}\r\n.camera{\r\n cursor: pointer;\r\n background-color: #fff;\r\n background-image: url('data:image/svg+xml,<svg width=\"800px\" height=\"800px\" viewBox=\"0 -3 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><g stroke-width=\"0\"/><g stroke-linecap=\"round\" stroke-linejoin=\"round\"/><g><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M3 3H5.58579L8 0.58579C8.37507 0.21071 8.88378 0 9.41421 0H14.5858C15.1162 0 15.6249 0.21071 16 0.58579L18.4142 3H21C22.6569 3 24 4.34315 24 6V15C24 16.6569 22.6569 18 21 18H3C1.34315 18 0 16.6569 0 15V6C0 4.34315 1.34315 3 3 3zM15 10C15 11.6569 13.6569 13 12 13C10.3431 13 9 11.6569 9 10C9 8.3431 10.3431 7 12 7C13.6569 7 15 8.3431 15 10zM17 10C17 12.7614 14.7614 15 12 15C9.23858 15 7 12.7614 7 10C7 7.2386 9.23858 5 12 5C14.7614 5 17 7.2386 17 10z\" fill=\"%23758ca3\"/></g></svg>');\r\n background-repeat: no-repeat;\r\n background-position: center;\r\n background-size: 100px;\r\n height: 120px;\r\n width: 100%;\r\n display: flex;\r\n border: 4px dashed #000;\r\n border-radius: 12px;\r\n margin: 12px 0;\r\n}\r\npicture>img{\r\n max-width: 100%;\r\n height: auto;\r\n}\r\n.preview-btns{\r\n display: grid;\r\n gap: 1rem;\r\n grid-template-columns: 1fr 1fr;\r\n margin-top: .4rem;\r\n}\r\n.preview-btns button{\r\n border-radius: 4px;\r\n padding: 3px 6px;\r\n background-color: #282828;\r\n color: #fff;\r\n font-size: .8rem;\r\n border: 0;\r\n}\r\n.cam-shoot{\r\n height: 100%;\r\n width: 100%;\r\n z-index:10000001;\r\n position: fixed;\r\n top:0;\r\n left:0;\r\n right:0;\r\n bottom:0;\r\n background-color: #fff;\r\n overflow-x: hidden;\r\n overflow-y: hidden !important;\r\n}\r\n.cam-shoot.landscape{\r\n transform: rotate(-90deg);\r\n width: var(--cs-sh);\r\n height: var(--cs-sw);\r\n background: orange;\r\n transform-origin: top right;\r\n margin-left: calc( var(--cs-sh) * -1);\r\n margin-top: 1px;\r\n}\r\n/* .cam-shoot>.head-title{\r\n width: 100%;\r\n background-color: var(--cs-head-color);\r\n color:#fff;\r\n height: 50px;\r\n line-height: 20px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-size: 1.2rem;\r\n position: relative;\r\n z-index: 2;\r\n user-select: none;\r\n -moz-user-select: none;\r\n -webkit-user-select: none;\r\n} */\r\n.cam-shoot .video-mask,\r\n.cam-shoot .video-container,\r\n.cam-shoot .video-container .video-block{\r\n height: 100%;\r\n width: 100%;\r\n position: relative;\r\n display: flex;\r\n}\r\n.cam-shoot .video-container{\r\n z-index: 1;\r\n}\r\n.cam-shoot .video-container video,\r\n.cam-shoot .video-mask video{\r\n /* height: calc(100% - 50px); */\r\n margin-top: -50px;\r\n}\r\n.cam-shoot.landscape .video-container .video-block{\r\n transition: transform .5s;\r\n transform: rotate(90deg);\r\n transform-origin: center;\r\n background-color: green;\r\n}\r\n.cam-shoot.landscape .video-container .video-block video,\r\n.cam-shoot.landscape .video-mask .video-block video{\r\n width: 100%;\r\n height: 100%;\r\n position: absolute;\r\n left: calc(calc(var(--cs-sw)/2 - var(--cs-sh)/2) * -1);\r\n top: 0;\r\n}\r\n.cam-shoot:not(.landscape) .video-container video,\r\n.cam-shoot:not(.landscape) .video-mask video{\r\n object-fit: cover;\r\n}\r\n.cam-shoot .video-container video.selfie,\r\n.cam-shoot .video-mask video.selfie{\r\n -webkit-transform: scaleX(-1);\r\n transform: scaleX(-1);\r\n}\r\n.cam-shoot .video-container video.mirror,\r\n.cam-shoot .video-mask video.mirror {\r\n -webkit-transform: rotateY(180deg);\r\n transform: rotateY(180deg);\r\n}\r\n.cam-shoot .video-container canvas,\r\n.cam-shoot .video-mask canvas {\r\n display: none !important;\r\n /* width: 192px;\r\n height: 192px; */\r\n -webkit-transform: scaleX(-1); /* mirror effect while using front cam */\r\n transform: scaleX(-1); /* mirror effect while using front cam */\r\n}\r\n\r\n\r\n\r\n.msgError{\r\n position: absolute;\r\n top: 25%;\r\n left: 5%;\r\n width: 90%;\r\n border-radius: 5px;\r\n background-color: red;\r\n color: #fff;\r\n padding: 10px;\r\n font-size: .95rem;\r\n text-align: left;\r\n height: 300px;\r\n overflow-y: scroll;\r\n opacity: .85;\r\n z-index: 3;\r\n word-wrap: break-word;\r\n}\r\n/*======================================*/\r\n/*======================================*/\r\n/*======================================*/\r\n/*======================================*/\r\n/*======================================*/\r\n/*======================================*/\r\n/*======================================*/\r\n/*======================================*/\r\n/*======================================*/\r\n/*======================================*/\r\n.cam-shoot .mask{\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n display: grid;\r\n /* background-color: orange; */\r\n \r\n width: 100%;\r\n height: 100%;\r\n z-index: 2;\r\n grid-auto-flow: row;\r\n grid-template-rows: auto 1fr 1fr 1fr;\r\n}\r\n.cam-shoot.landscape2 .mask{\r\n /* transform-origin: top right;\r\n transform: rotate(-90deg);\r\n margin-left: calc( var(--cs-sh) * -1); */\r\n width: var(--cs-sh);\r\n height: var(--cs-sw);\r\n /* background: rgb(0, 255, 76); */\r\n \r\n}\r\n.cam-shoot.landscape2 .mask,\r\n.cam-shoot.landscape2.l90 .mask{\r\n transform-origin: top right;\r\n transform: rotate(-90deg);\r\n margin-left: calc( var(--cs-sh) * -1);\r\n}\r\n.cam-shoot.landscape2.l-90 .mask{\r\n transform-origin: top left;\r\n transform: rotate(90deg);\r\n margin-left: calc( var(--cs-sw) - 31px);\r\n}\r\n.cam-shoot .mask .close-btn{\r\n z-index: 3;\r\n position: absolute;\r\n right: .55rem;\r\n top: .6rem;\r\n width: 1.5rem;\r\n height: 1.5rem;\r\n padding: 1rem;\r\n /* color: var(--bs-btn-close-color); */\r\n /* background: transparent var(--bs-btn-close-bg) center/1em auto no-repeat; */\r\n border: 0;\r\n border-radius: 1rem;\r\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e\");\r\n background-color: #fff;\r\n background-size: 60%;\r\n background-repeat: no-repeat;\r\n background-position: center;\r\n cursor: pointer;\r\n}\r\n.cam-shoot .mask .head-title{\r\n width: 100%;\r\n background-color: var(--cs-head-color);\r\n color:#fff;\r\n height: 50px;\r\n line-height: 20px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-size: 1.2rem;\r\n position: relative;\r\n z-index: 2;\r\n user-select: none;\r\n -moz-user-select: none;\r\n -webkit-user-select: none;\r\n}\r\n\r\n.cam-shoot .mask .changing{\r\n position:absolute;\r\n top: 9%;\r\n left: 0;\r\n width: 100%;\r\n z-index: 3;\r\n text-align: center;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n}\r\n.cam-shoot .mask .changing>span{\r\n background-color: #282828;\r\n opacity: .7;\r\n color:#fff;\r\n border-radius: 6px;\r\n padding: 3px 8px;\r\n}\r\n.cam-shoot .mask .focus-aim{\r\n position: absolute; \r\n top:0; \r\n right:0;\r\n bottom:0;\r\n left:0;\r\n display: flex;\r\n align-items: start;/* center; */\r\n justify-content: center;\r\n}\r\n.cam-shoot .mask .focus-aim .selfie-aim{\r\n width: 250px;\r\n height: 250px;\r\n position: absolute;\r\n margin-top: 50%;\r\n position: relative;\r\n}\r\n.cam-shoot .mask .focus-aim .selfie-aim>div{\r\n position:absolute;\r\n width:75px;\r\n height:75px;\r\n border: 5px solid var(--cs-item-color);;\r\n}\r\n.cam-shoot .mask .focus-aim .selfie-aim > div:nth-child(1){\r\n left:0;\r\n top:0;\r\n border-right: none;\r\n border-bottom: none;\r\n}\r\n.cam-shoot .mask .focus-aim .selfie-aim > div:nth-child(2){\r\n right:0;\r\n top:0;\r\n border-left: none;\r\n border-bottom: none;\r\n}\r\n\r\n.cam-shoot .mask .focus-aim .selfie-aim > div:nth-child(3){\r\n left:0;\r\n bottom:0;\r\n border-right: none;\r\n border-top: none;\r\n}\r\n.cam-shoot .mask .focus-aim .selfie-aim > div:nth-child(4){\r\n right:0;\r\n bottom:0;\r\n border-left: none;\r\n border-top: none;\r\n}\r\n.cam-shoot .mask .focus-aim .doc-aim{\r\n position:absolute;\r\n top: 23%;\r\n width: 75%;\r\n height: 55%;\r\n border: 5px solid var(--cs-item-color);\r\n opacity: .6;\r\n border-radius: 8px;\r\n}\r\n.cam-shoot .mask .focus-aim .doc-aim.doc-front::before{\r\n content: '';\r\n position:absolute;\r\n top: 0;\r\n width: 150px;\r\n height: 120px;\r\n border: 5px solid var(--cs-item-color);\r\n right: 0;\r\n margin-right: -5px;\r\n margin-top: -5px;\r\n border-top-right-radius: 8px;\r\n border-bottom-left-radius: 8px;\r\n}\r\n.cam-shoot .mask .config{\r\n /* background-color: pink; */\r\n}\r\n.cam-shoot .mask .controls{\r\n position: absolute;\r\n width: 100%;\r\n bottom: 0;\r\n /* height: 20%; */\r\n min-height: 150px;\r\n display: flex;\r\n /* margin-bottom: 50px; */\r\n justify-content: center;\r\n /* background: purple; */\r\n}\r\n.cam-shoot.landscape2 .mask .controls{\r\n margin-bottom: 1.5rem;\r\n}\r\n.cam-shoot .mask .controls .zoom{\r\n width: 70%;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n}\r\n.cam-shoot .mask .controls .zoom>input[type=\"range\"]{\r\n accent-color: var(--cs-item-color) !important;\r\n width: 100%;\r\n z-index: 2;\r\n}\r\n.cam-shoot .mask .controls .zoom>span{\r\n text-align: center;\r\n /* width: 100%;\r\n display: block;\r\n margin-top: -10px; */\r\n user-select: none;\r\n -moz-user-select: none;\r\n -webkit-user-select: none;\r\n\r\n background-color: var(--cs-item-color);\r\n color: #fff;\r\n border-radius: 8px;\r\n padding: 0 9px 0 4px;\r\n opacity: .9;\r\n display: inline-flex;\r\n width: 45px;\r\n margin-top: 3px;\r\n margin-left: 8px;\r\n}\r\n.cam-shoot .mask .controls .zoom>span::before{\r\n content: '\\\\00a0 ';\r\n}\r\n.cam-shoot .mask .controls .zoom>span::after{\r\n content: 'x';\r\n}\r\n.cam-shoot.landscape2 .mask .controls .zoom>span{\r\n transition: transform .5s;\r\n /* transform: rotate(90deg); */\r\n margin-top: 7px;\r\n margin-left: 0;\r\n padding: 0 3px 1px;\r\n}\r\n.cam-shoot.landscape2 .mask .btnx{\r\n transition: transform 1s;\r\n}\r\n.cam-shoot.landscape2 .mask .btnx,\r\n.cam-shoot.landscape2 .mask .msgError,\r\n.cam-shoot.landscape2 .mask .controls .zoom>span\r\n.cam-shoot.landscape2 .mask .btnx,\r\n.cam-shoot.landscape2 .mask .msgError,\r\n.cam-shoot.landscape2 .mask .controls .zoom>span{\r\n transform: rotate(90deg);\r\n}\r\n.cam-shoot.landscape2.l-90 .mask .btnx,\r\n.cam-shoot.landscape2.l-90 .mask .msgError,\r\n.cam-shoot.landscape2.l-90 .mask .controls .zoom>span{\r\n transform: rotate(-90deg);\r\n}\r\n.cam-shoot .mask .btnx{ \r\n background-color: var(--cs-item-color) !important;\r\n user-select: none;\r\n -moz-user-select: none;\r\n -webkit-user-select: none;\r\n cursor: pointer;\r\n\r\n display: inline-block;\r\n padding: 0.375rem 0.75;\r\n /* font-family: var(--bs-btn-font-family); */\r\n font-size: 1rem;\r\n font-weight: 400;\r\n line-height: 1.5;\r\n color: #212529;\r\n text-align: center;\r\n text-decoration: none;\r\n vertical-align: middle;\r\n cursor: pointer;\r\n -webkit-user-select: none;\r\n user-select: none;\r\n border: 1px solid transparent;\r\n border-radius: 0.375rem;\r\n background-color: transparent;\r\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\r\n -webkit-appearance: button;\r\n text-transform: none;\r\n margin: 0;\r\n border-radius: 0;\r\n}\r\n.cam-shoot .mask .btnx:active {\r\n transform: translateY(-1px);\r\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\r\n}\r\n.cam-shoot .mask .btnx.btn-devices,\r\n.cam-shoot .mask .btnx.btn-devices>select{\r\n width:70px;\r\n height:70px;\r\n border-radius: 35px;\r\n}\r\n.cam-shoot .mask .btnx.btn-devices{\r\n position:absolute;\r\n top:13%;\r\n left:3%;\r\n /* width:70px;\r\n height:70px;\r\n border-radius: 35px; */\r\n border: none !important;\r\n}\r\n.cam-shoot .mask .btnx.btn-devices>select{\r\n /* margin-left: -20px;\r\n margin-top: -12.5px; */\r\n margin-left: -.5px;\r\n margin-top: -1px;\r\n /* width: 70px;\r\n height: 70px;\r\n border-radius: 35px; */\r\n -webkit-appearance: none;\r\n -moz-appearance: none;\r\n color: transparent;\r\n border: none !important;\r\n cursor: pointer;\r\n background-color: transparent;\r\n}\r\n.cam-shoot .mask .btnx.btn-devices select::-ms-expand {\r\n display: none;\r\n}\r\n.cam-shoot .mask .btnx.btn-config{\r\n position:absolute;\r\n top:13%;\r\n right: 3%;\r\n width:70px;\r\n height:70px;\r\n border-radius: 35px;\r\n\r\n background-image: url(\"data:image/svg+xml,%3Csvg width='800px' height='800px' viewBox='0 0 512 512' version='1.1' xml:space='preserve' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill='%23000000'%3E%3Cg stroke-width='0'/%3E%3Cg stroke-linecap='round' stroke-linejoin='round'/%3E%3Cg%3E%3Cg%3E%3Cpath fill='%23fff' d='M161.6,237.5c3.6-1.2,7.5-1.8,11.4-1.8c6.3,0,12.5,1.6,17.9,4.5l13.5-13.5l25.4-25.4l21.2,21.2l34.3-34.3 l-4.4-4.8c19.5-36.7,16.5-83.1-11.2-117.5c-28-34.8-73.2-47.5-113.5-35.7l64.9,80.6l-64.2,51.7L92.2,81.9 c-20.1,36.9-17.3,83.8,10.7,118.5C118.4,219.7,139.2,232.2,161.6,237.5z'/%3E%3Cpath fill='%23fff' d='M332.1,239.4L300,271.5l21.2,21.2l-37.1,37.1l-1.7,1.7L364.7,448c19.5,27.6,58.2,33,84.5,11.8 c26.3-21.2,29.3-60.1,6.5-85.1L332.1,239.4z'/%3E%3Cpath fill='%23fff' d='M263.5,330.5L263.5,330.5L192,259v0l-2.4-2.4c-9.1-9.1-23.9-9.1-33,0L43.4,369.8c-9.1,9.1-9.1,23.9,0,33 l76.4,76.4c9.1,9.1,23.9,9.1,33,0L266,366c9.1-9.1,9.1-23.9,0-33L263.5,330.5z'/%3E%3Cpath fill='%23e0e0e0' d='M471.7,110.9l-48.2,48.2c-5,5-13.2,5-18.2,0l-6.3-6.3L322.6,229l-42.5,42.4l21.2,21.2l-27.2,27.2l-0.8,0.8 l-4.1-4.1L206,253.2v0l-4.1-4.1l12.4-12.4l15.5-15.5l21.2,21.2l43.8-43.8l75-75l-6.3-6.3c-5-5.1-5-13.2,0-18.2l48.2-48.2 c5-5,13.2-5,18.2,0l41.8,41.8C476.7,97.7,476.7,105.8,471.7,110.9z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E\");\r\n background-repeat: no-repeat;\r\n background-position: center;\r\n background-size: 50%;\r\n}\r\n.cam-shoot .mask .btnx.btn-flash{\r\n position:absolute;\r\n bottom:10%;\r\n left:5%;\r\n width:70px;\r\n height:70px;\r\n border-radius: 35px;\r\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512' fill='%23fff'%3E%3Cpath d='M349.4 44.6c5.9-13.7 1.5-29.7-10.6-38.5s-28.6-8-39.9 1.8l-256 224c-10 8.8-13.6 22.9-8.9 35.3S50.7 288 64 288H175.5L98.6 467.4c-5.9 13.7-1.5 29.7 10.6 38.5s28.6 8 39.9-1.8l256-224c10-8.8 13.6-22.9 8.9-35.3s-16.6-20.7-30-20.7H272.5L349.4 44.6z'/%3E%3C/svg%3E\");\r\n /* <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\" fill=\"currentColor\"><path d=\"M349.4 44.6c5.9-13.7 1.5-29.7-10.6-38.5s-28.6-8-39.9 1.8l-256 224c-10 8.8-13.6 22.9-8.9 35.3S50.7 288 64 288H175.5L98.6 467.4c-5.9 13.7-1.5 29.7 10.6 38.5s28.6 8 39.9-1.8l256-224c10-8.8 13.6-22.9 8.9-35.3s-16.6-20.7-30-20.7H272.5L349.4 44.6z\"/></svg> */\r\n background-position: 50%;\r\n background-repeat: no-repeat;\r\n background-size: 50%;\r\n}\r\n.cam-shoot .mask .btnx.btn-flash.lights-on{\r\n background-color: gold !important;\r\n}\r\n.cam-shoot .mask .btnx.btn-shoot{\r\n position:absolute;\r\n bottom:10%;\r\n left:calc(50% - 35px);\r\n width:70px;\r\n height:70px;\r\n border-radius: 35px;\r\n}\r\n.cam-shoot .mask .btnx.btn-change{\r\n position:absolute;\r\n bottom:10%;\r\n right:5%;\r\n width:70px;\r\n height:70px;\r\n border-radius: 35px;\r\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512' fill='%23fff'%3E%3Cpath d='M149.1 64.8L138.7 96H64C28.7 96 0 124.7 0 160V416c0 35.3 28.7 64 64 64H448c35.3 0 64-28.7 64-64V160c0-35.3-28.7-64-64-64H373.3L362.9 64.8C356.4 45.2 338.1 32 317.4 32H194.6c-20.7 0-39 13.2-45.5 32.8zM384 256c0 8.8-7.2 16-16 16H291.3c-6.2 0-11.3-5.1-11.3-11.3c0-3 1.2-5.9 3.3-8L307 229c-13.6-13.4-31.9-21-51-21c-19.2 0-37.7 7.6-51.3 21.3L185 249c-9.4 9.4-24.6 9.4-33.9 0s-9.4-24.6 0-33.9l19.7-19.7C193.4 172.7 224 160 256 160c31.8 0 62.4 12.6 85 35l23.7-23.7c2.1-2.1 5-3.3 8-3.3c6.2 0 11.3 5.1 11.3 11.3V256zM128 320c0-8.8 7.2-16 16-16h76.7c6.2 0 11.3 5.1 11.3 11.3c0 3-1.2 5.9-3.3 8L205 347c13.6 13.4 31.9 21 51 21c19.2 0 37.7-7.6 51.3-21.3L327 327c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9l-19.7 19.7C318.6 403.3 288 416 256 416c-31.8 0-62.4-12.6-85-35l-23.7 23.7c-2.1 2.1-5 3.3-8 3.3c-6.2 0-11.3-5.1-11.3-11.3V320z'/%3E%3C/svg%3E\");\r\n /* <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\" fill=\"currentColor\"><path d=\"M149.1 64.8L138.7 96H64C28.7 96 0 124.7 0 160V416c0 35.3 28.7 64 64 64H448c35.3 0 64-28.7 64-64V160c0-35.3-28.7-64-64-64H373.3L362.9 64.8C356.4 45.2 338.1 32 317.4 32H194.6c-20.7 0-39 13.2-45.5 32.8zM384 256c0 8.8-7.2 16-16 16H291.3c-6.2 0-11.3-5.1-11.3-11.3c0-3 1.2-5.9 3.3-8L307 229c-13.6-13.4-31.9-21-51-21c-19.2 0-37.7 7.6-51.3 21.3L185 249c-9.4 9.4-24.6 9.4-33.9 0s-9.4-24.6 0-33.9l19.7-19.7C193.4 172.7 224 160 256 160c31.8 0 62.4 12.6 85 35l23.7-23.7c2.1-2.1 5-3.3 8-3.3c6.2 0 11.3 5.1 11.3 11.3V256zM128 320c0-8.8 7.2-16 16-16h76.7c6.2 0 11.3 5.1 11.3 11.3c0 3-1.2 5.9-3.3 8L205 347c13.6 13.4 31.9 21 51 21c19.2 0 37.7-7.6 51.3-21.3L327 327c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9l-19.7 19.7C318.6 403.3 288 416 256 416c-31.8 0-62.4-12.6-85-35l-23.7 23.7c-2.1 2.1-5 3.3-8 3.3c-6.2 0-11.3-5.1-11.3-11.3V320z\"/></svg> */\r\n background-position: 50%;\r\n background-repeat: no-repeat;\r\n background-size: 50%;\r\n}\r\n.btn-change:active{\r\n -webkit-transform: rotateY(180deg);\r\n transform: rotateY(180deg);\r\n}\r\n.cam-shoot .mask .btnx.opaque:not(.not-available){\r\n pointer-events: none;\r\n /* background-color: #97bccd !important; */\r\n opacity: .75;;\r\n}\r\n.cam-shoot .mask .btnx.not-available{\r\n pointer-events: none;\r\n background-color: rgb(151, 151, 151) !important;\r\n /* background-color: grey var(--cs-item-color); */\r\n}`\r\n})\r\nexport class NgxCamShoot {\r\n @Output() sendImage = new EventEmitter<string|null>();\r\n \r\n private stream!: MediaStream | undefined;\r\n\r\n modalCapture: boolean = false;\r\n \r\n isCaptured: boolean = false;\r\n imageCaptured!: string | undefined;\r\n error: string = '';\r\n debug: string = '';\r\n\r\n @ViewChild(\"videoImage\") public video!: ElementRef<HTMLVideoElement>;\r\n @ViewChild(\"canvasImage\") public canvas!: ElementRef<HTMLCanvasElement>;\r\n\r\n @Input() config!: ICamShootConfig;\r\n\r\n @Input() canChangeMode: boolean = true;\r\n @Input() type: eCamShootType = eCamShootType.DEFAULT;\r\n @Input() color: string = '#282828';\r\n @Input() displayTitle: boolean = !0;\r\n @Input() title: string = 'Capture image';\r\n @Input() showFaceMode: boolean = false;\r\n @Input() usePreview: boolean = true;\r\n @Input() showErrors: boolean = false;\r\n @Input() debugMode: boolean = false;\r\n @Input() btnTakeAnother: string = 'Take another';\r\n @Input() btnAcceptCapture: string = 'Accept capture';\r\n\r\n havePermissions: boolean = false;\r\n isChangingDevice: boolean = false;\r\n\r\n faceMode: eCamShootFaceMode = eCamShootFaceMode.USER;\r\n \r\n canUseFlash: boolean = false;\r\n canActiveFlash: boolean = false;\r\n isFlashActive: boolean = false;\r\n\r\n //private zoomSubs!: Subscription;\r\n zoom = new FormControl<number|null>(null);\r\n zoomConfig: IZoomConfig = {min:-1,max:10,step:2};\r\n canUseZoom: boolean = false;\r\n canActiveZoom: boolean = false;\r\n\r\n devices: ICamShootDevice[] = [];\r\n //private deviceSubs!: Subscription;\r\n device = new FormControl<string|null>(null);\r\n\r\n displayPreview: boolean = false;\r\n\r\n isMobile: boolean = false;\r\n hasTouchSupport: boolean = false;\r\n isLandscape: boolean = false;\r\n orientationDegs: number = 0;\r\n screen_w: number = 0;\r\n screen_h: number = 0;\r\n\r\n fullScreenStart: boolean = false;\r\n\r\n private maxTryStream: number = 25;\r\n\r\n @HostListener('window:resize')\r\n resize(){\r\n this.debug += \"[resize] start.\\n\";\r\n this.isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\r\n this.hasTouchSupport = this.hasTouch(navigator); //'ontouchstart' in window || navigator.maxTouchPoints > 0;\r\n this.isLandscape = window.matchMedia(\"(orientation: landscape)\").matches && this.hasTouchSupport;\r\n //this.isLandscape = screen.availHeight < screen.availWidth;\r\n if(this.isLandscape && window.orientation!=undefined){\r\n this.orientationDegs = window.orientation;\r\n this.debug += \"[resize] have orientation: \",window.orientation,\"\\n\";\r\n }else{\r\n this.orientationDegs = 0;\r\n }\r\n this.screen_w = screen.availWidth;\r\n this.screen_h = screen.availHeight;\r\n this.debug += \"[resize] screen \"+this.screen_w+\"x\"+this.screen_h+\".\\n\";\r\n }\r\n\r\n constructor() {\r\n this.initConfig(this.config)\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if(changes['canChangeMode']){\r\n console.log('canChangeMode',changes['canChangeMode'].currentValue)\r\n this.canChangeMode = changes['canChangeMode'].currentValue;\r\n }\r\n if(changes['type']){\r\n if(this.type==eCamShootType.SELFIE && !this.canChangeMode){\r\n this.faceMode = eCamShootFaceMode.USER;\r\n }else{\r\n this.faceMode = eCamShootFaceMode.ENVIRONMENT;\r\n }\r\n if(!changes['type'].firstChange){\r\n this.device.reset();\r\n this.clear();\r\n this.initDevices();\r\n }\r\n }\r\n }\r\n\r\n ngOnInit() {\r\n this.resize();\r\n /* this.deviceSubs = */ this.device.valueChanges.subscribe((v)=>{\r\n if(v==null) return;\r\n console.log('device changed',v)\r\n this.debug += \"[ngOnInit] device value changes.\\n\";\r\n this.isChangingDevice = true;\r\n this.clearAndLoadDevices();\r\n this.checkDeviceMode(v);\r\n });\r\n /* this.zoomSubs = */ this.zoom.valueChanges.subscribe((v)=>{\r\n if(v!=null){\r\n this.updateZoom(v);\r\n }\r\n })\r\n }\r\n\r\n private initConfig(config: ICamShootConfig){\r\n if(config==undefined) return;\r\n this.displayTitle = config.displayTitle??this.displayTitle;\r\n this.title = config.title??this.title;\r\n this.showFaceMode = config.showFaceMode??this.showFaceMode;\r\n this.canChangeMode = config.canChangeMode??this.canChangeMode;\r\n this.type = config.type??this.type;\r\n this.color = config.color??this.color;\r\n this.usePreview = config.usePreview??this.usePreview;\r\n this.btnTakeAnother = config.btnTakeAnother??this.btnTakeAnother;\r\n this.btnAcceptCapture = config.btnAcceptCapture??this.btnAcceptCapture;\r\n }\r\n\r\n initCapture(faceMode: eCamShootFaceMode = eCamShootFaceMode.USER){\r\n this.debug += \"[initCapture] start;\\n\";\r\n this.isChangingDevice = true;\r\n this.modalCapture = true;\r\n this.faceMode = faceMode;\r\n this.debug += \"[initCapture] modalCapture = true;\\n\";\r\n document.getElementsByTagName('body')[0].style.overflowY = 'hidden';\r\n document.getElementsByTagName('body')[0].focus();\r\n\r\n this.requestPermissions();\r\n }\r\n takeCapture(){\r\n this.modalCapture = false;\r\n document.getElementsByTagName('body')[0].style.overflowY = 'auto';\r\n this.drawImageToCanvas(this.video.nativeElement);\r\n }\r\n takeAnother(){\r\n this.debug += \"[takeAnother] start;\\n\";\r\n this.clear();\r\n this.initCapture(this.faceMode);\r\n }\r\n sendCapture(){\r\n this.cancelFullScreen();\r\n this.send();\r\n this.clear();\r\n }\r\n\r\n close(){\r\n this.cancelFullScreen();\r\n this.modalCapture = false;\r\n \r\n this.devices = [];\r\n this.device.reset(null,{emitEvent:false});\r\n /* this.deviceSubs.unsubscribe();\r\n this.zoomSubs.unsubscribe(); */\r\n this.clear();\r\n }\r\n private clearAndLoadDevices(){\r\n this.clear();\r\n setTimeout(()=>{\r\n this.loadDevices();\r\n },250)\r\n }\r\n private clear(){\r\n this.debug += \"[clear] start.\\n\";\r\n this.imageCaptured = undefined;\r\n this.isCaptured = false;\r\n\r\n this.canUseFlash = false;\r\n this.canActiveFlash = false;\r\n this.isFlashActive = false;\r\n\r\n this.canUseZoom = false;\r\n this.canActiveZoom = false;\r\n\r\n this.displayPreview = false;\r\n\r\n try{\r\n const webcam = this.video.nativeElement;\r\n if(webcam){\r\n this.debug += \"[clear] exist video, setting pause, empty and null.\\n\";\r\n webcam.pause();\r\n webcam.src = \"\";\r\n webcam.srcObject = null;\r\n }\r\n } catch (e: any) {\r\n this.debug += \"[clear] webcam error: \"+e.message+\", setting pause, empty and null.\\n\";\r\n this.error += \"[clear] webcam error: \"+e.message+\", setting pause, empty and null.\\n\";\r\n }\r\n\r\n if(this.stream===undefined) return;\r\n\r\n try{\r\n let me = this;\r\n this.stream.getTracks().forEach(function(track) {\r\n me.debug += \"[clear] getTracks(), id: \"+track.id+\".\\n\";\r\n if (track.readyState == 'live' && track.kind === 'video') {\r\n me.debug += \"[clear] stopping track id: \"+track.id+\".\\n\";\r\n track.stop();\r\n /* if(me.stream!=undefined){\r\n me.stream.removeTrack(track);\r\n } */\r\n }\r\n });\r\n this.debug += \"[clear] set stream to undefined.\\n\";\r\n this.stream = undefined;\r\n } catch (e: any) {\r\n console.log('[STRM] '+e.message)\r\n }\r\n }\r\n\r\n drawImageToCanvas(image: any) {\r\n let ctx = this.canvas.nativeElement.getContext(\"2d\");\r\n //console.log('draw type',this.type)\r\n \r\n //const webcam = document.getElementById('videocap') as HTMLVideoElement;//functional\r\n const webcam = this.video.nativeElement;\r\n\r\n /* if(this.type!=eCamShootType.SELFIE){\r\n\r\n this.canvas.nativeElement.width = webcam.videoHeight;\r\n this.canvas.nativeElement.height = webcam.videoWidth;\r\n\r\n ctx.save(); \r\n\r\n ctx.translate(webcam.videoHeight/2, webcam.videoWidth/2);\r\n ctx.rotate(-90 * Math.PI/180);\r\n ctx.drawImage(image, -(webcam.videoWidth/2), -(webcam.videoHeight/2));\r\n ctx.restore();\r\n }else{\r\n this.canvas.nativeElement.width = webcam.videoWidth;\r\n this.canvas.nativeElement.height = webcam.videoHeight;\r\n ctx.scale(-1, 1);\r\n ctx.drawImage(image, 0, 0, this.canvas.nativeElement.width*-1, this.canvas.nativeElement.height);\r\n } */\r\n\r\n /* if(this.type==eCamShootType.SELFIE){\r\n if(this.faceMode==eCamShootFaceMode.USER){\r\n this.canvas.nativeElement.width = webcam.videoWidth;\r\n this.canvas.nativeElement.height = webcam.videoHeight;\r\n ctx.scale(-1, 1);\r\n ctx.drawImage(image, 0, 0, this.canvas.nativeElement.width*-1, this.canvas.nativeElement.height);\r\n }else{\r\n this.canvas.nativeElement.width = webcam.videoWidth;\r\n this.canvas.nativeElement.height = webcam.videoHeight;\r\n ctx.drawImage(image, 0, 0, this.canvas.nativeElement.width, this.canvas.nativeElement.height);\r\n }\r\n }else{\r\n this.canvas.nativeElement.width = webcam.videoHeight;\r\n this.canvas.nativeElement.height = webcam.videoWidth;\r\n\r\n ctx.save(); \r\n\r\n ctx.translate(webcam.videoHeight/2, webcam.videoWidth/2);\r\n ctx.rotate(-90 * Math.PI/180);\r\n ctx.drawImage(image, -(webcam.videoWidth/2), -(webcam.videoHeight/2));\r\n ctx.restore();\r\n } */\r\n\r\n\r\n //is front\r\n if(this.faceMode==eCamShootFaceMode.USER){\r\n this.canvas.nativeElement.width = webcam.videoWidth;\r\n this.canvas.nativeElement.height = webcam.videoHeight;\r\n ctx?.scale(-1, 1);\r\n ctx?.drawImage(image, 0, 0, this.canvas.nativeElement.width*-1, this.canvas.nativeElement.height);\r\n }else{\r\n //is back\r\n //without focus marker\r\n if(this.type==eCamShootType.DEFAULT){\r\n this.canvas.nativeElement.width = webcam.videoWidth;\r\n this.canvas.nativeElement.height = webcam.videoHeight;\r\n ctx?.drawImage(image, 0, 0, this.canvas.nativeElement.width, this.canvas.nativeElement.height);\r\n }else{\r\n //shoot document (rotate)\r\n this.canvas.nativeElement.width = webcam.videoHeight;\r\n this.canvas.nativeElement.height = webcam.videoWidth;\r\n\r\n ctx?.save(); \r\n\r\n ctx?.translate(webcam.videoHeight/2, webcam.videoWidth/2);\r\n ctx?.rotate(-90 * Math.PI/180);\r\n ctx?.drawImage(image, -(webcam.videoWidth/2), -(webcam.videoHeight/2));\r\n ctx?.restore();\r\n }\r\n }\r\n \r\n this.imageCaptured = this.canvas.nativeElement.toDataURL(\"image/png\")\r\n this.isCaptured = true;\r\n\r\n if(!this.usePreview){\r\n this.sendCapture();\r\n }else{\r\n this.displayPreview = true;\r\n }\r\n\r\n }\r\n private send(){\r\n this.sendImage.emit(this.imageCaptured);\r\n }\r\n\r\n async initDevices() {\r\n this.debug += \"[initDevices] start;\\n\";\r\n\r\n if(this.devices.length>0){\r\n this.debug += \"[initDevices] devices previously loaded, continue to loadDevices();\\n\";\r\n this.loadDevices();\r\n return\r\n }\r\n\r\n this.devices = [];\r\n \r\n if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia!=undefined) {\r\n this.debug += \"[initDevices] navigator.mediaDevices exist.\\n\";\r\n\r\n await navigator\r\n .mediaDevices\r\n .enumerateDevices()\r\n .then(devices => {\r\n this.debug += \"[initDevices] enumerateDevices() executed.\\n\";\r\n\r\n const videoDevies = devices.filter((d)=>d.kind=='videoinput');\r\n this.debug += \"[initDevices] enumerateDevices() found \"+videoDevies.length+\" video devices.\\n\";\r\n \r\n videoDevies.forEach((device,i) => {\r\n this.debug += \"[initDevices] enumerateDevices() forEach index: \"+i+\".\\n\";\r\n this.pushDevice(device);\r\n });\r\n\r\n if(this.devices.length==0){\r\n this.debug += \"[initDevices] don't have camera devices.\\n\";\r\n this.error += \"No posees una entrada de camara.\\n\";\r\n }else{\r\n if(this.devices[0].deviceId==''){\r\n this.debug += \"[initDevices] device default is empty, you don't have permissons, go to loadDevices().\\n\";\r\n this.loadDevices();\r\n return;\r\n }\r\n this.assignDevice();\r\n }\r\n });\r\n }else{\r\n this.debug += \"[initDevices] navigator.mediaDevices don't exist.\\n\";\r\n this.error += \"No tienes acceso a los dispositivos.\\n\";\r\n }\r\n \r\n }\r\n\r\n cancelFullScreen(){\r\n this.debug += \"[cancelFullScreen] start.\\n\";\r\n var el: any = document;\r\n\r\n var cancelFullScreenMethod = el.exitFullscreen || el.webkitExitFullscreen\r\n || el.mozCancelFullScreen || el.msExitFullscreen;\r\n\r\n if (cancelFullScreenMethod && el.fullscreenElement) {\r\n this.debug += \"[cancelFullScreen] executed.\\n\";\r\n \r\n cancelFullScreenMethod.call(el);\r\n this.resize();\r\n }\r\n }\r\n requestFullScreen() {\r\n this.debug += \"[requestFullScreen] start.\\n\";\r\n var el: any = document.body;\r\n \r\n var requestMethod = el.requestFullScreen || el.webkitRequestFullScreen \r\n || el.mozRequestFullScreen || el.msRequestFullScreen;\r\n \r\n if (requestMethod) {\r\n this.debug += \"[requestFullScreen] executed on body.\\n\";\r\n requestMethod.call(el);\r\n this.debug += \"[requestFullScreen] go to resize().\\n\";\r\n this.resize();\r\n }\r\n }\r\n\r\n private async requestPermissions(){\r\n //for safary (ios)\r\n //<meta name=\"viewport\" content=\"minimal-ui, width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no\">\r\n /* let body: any = document.querySelector(\"body\");\r\n body.requestFullscreen().then(() => {\r\n //document.querySelector(\"body\").style.overflow = \"auto\";\r\n this.debug += \"[requestPermissions] se dio permiso de pantalla.\\n\";\r\n }); */\r\n this.debug += \"[requestPermissions] start.\\n\";\r\n if(this.havePermissions){\r\n this.requestFullScreen();\r\n this.debug += \"[requestPermissions] the session already have permissions, go to initDevices().\\n\";\r\n this.initDevices();\r\n return;\r\n }\r\n try {\r\n let constraints: any = {\r\n width: {min: 640, ideal: 1280, max: 1920},\r\n height: {min: 480, ideal: 720},\r\n focusMode: 'continuous'\r\n };\r\n await navigator\r\n .mediaDevices\r\n .getUserMedia({\r\n video:constraints\r\n })\r\n .then((stream) => {\r\n this.havePermissions = true;\r\n this.requestFullScreen();\r\n this.debug += \"[requestPermissions] permissions granted, go to initDevices().\\n\";\r\n this.initDevices();\r\n })\r\n .catch((err) => {\r\n this.havePermissions = false;\r\n this.debug += \"[requestPermissions] permissions fail: \"+err+\".\\n\";\r\n console.error(`you got an error: ${err}`);\r\n });\r\n } catch (e) {\r\n this.debug += \"[requestPermissions] catch: \"+JSON.stringify(e)+\".\\n\";\r\n console.log('[ERR] '+e)\r\n }\r\n }\r\n\r\n private assignDevice(){\r\n this.debug += \"[assignDevice] start.\\n\";\r\n this.debug += \"[assignDevice] devices existing: \"+this.devices.length+\".\\n\";\r\n this.debug += \"[assignDevice] faceMode: \"+this.faceMode+\".\\n\";\r\n if(this.devices.length==1){\r\n this.debug += \"[assignDevice] only have 1 device.\\n\";\r\n const firstDevice = this.devices[0];\r\n this.device.setValue(firstDevice.deviceId,{emitEvent:false});\r\n if(this.faceMode==eCamShootFaceMode.ENVIRONMENT){\r\n this.debug += \"[assignDevice] faceMode=ENVIRONMENT on 1 device, probably has laptop or pc, go to changeMode().\\n\";\r\n this.toogleMode();\r\n return;\r\n }\r\n }else if(this.faceMode==eCamShootFaceMode.ENVIRONMENT){\r\n this.debug += \"[assignDevice] faceMode=ENVIRONMENT.\\n\";\r\n if(this.getBackDevices().length>0){\r\n this.debug += \"[assignDevice] set ENVIRONMENT mode device.\\n\";\r\n this.device.setValue(this.getBackDevices()[0].deviceId,{emitEvent:false});\r\n }else{\r\n this.debug += \"[assignDevice] ENVIRONMENT devices=0. Executing changeMode().\\n\";\r\n this.toogleMode();\r\n return;\r\n }\r\n }else{\r\n this.debug += \"[assignDevice] set USER mode device.\\n\";\r\n this.device.setValue(this.getFrontDevices()[0].deviceId,{emitEvent:false});\r\n }\r\n this.debug += \"[assignDevice] execute loadDevices().\\n\";\r\n this.loadDevices();\r\n }\r\n private async loadDevices(count: number = 1){\r\n this.debug += \"[loadDevices]\"+(count>1?'[number '+count+\"]\":'')+\" start.\\n\";\r\n\r\n const iWidth = this.screen_h;//this.isLandscape?this.screen_w:this.screen_h;\r\n const iHeight = this.screen_w;//this.isLandscape?this.screen_h:this.screen_w;\r\n \r\n let videoConstraints: MediaTrackConstraints|any = {\r\n /* width: {min: 640, ideal: 1280, max: 1920},\r\n height: {min: 480, ideal: 720, max: 1080}, */\r\n /* width: this.screen_h,\r\n height: this.screen_w, */\r\n width: iWidth,\r\n height: iHeight,\r\n focusMode: 'continuous'\r\n }\r\n if(this.device.value!=null && this.device.value!=''){\r\n this.debug += \"[loadDevices] devices has been set, init constraints with deviceId: \"+this.device.value+\".\\n\";\r\n videoConstraints = {\r\n ...videoConstraints,\r\n deviceId: { exact: this.device.value }\r\n }\r\n }else{\r\n this.debug += \"[loadDevices] devices has not been set, init constraints with faceMode.\\n\";\r\n videoConstraints = {\r\n ...videoConstraints,\r\n facingMode: this.faceMode\r\n }\r\n }\r\n if (this.stream==undefined) {\r\n this.debug += \"[loadDevices] stream is undefined.\\n\";\r\n }\r\n\r\n this.startStream({video: videoConstraints});\r\n }\r\n\r\n private async startStream(constraints: MediaStreamConstraints, count: number = 1){\r\n this.debug += \"[startStream] start.\\n\";\r\n this.debug += \"[startStream] constraints: \"+JSON.stringify(constraints)+\".\\n\";\r\n navigator.mediaDevices.getUserMedia(constraints)\r\n .then((stream)=>{\r\n this.isChangingDevice = false;\r\n this.stream = stream;\r\n this.debug += \"[startStream] stream has been initialized.\\n\";\r\n \r\n this.checkFlash(this.device.value);\r\n this.checkZoom();\r\n\r\n this.debug += \"[startStream] initialize handleStream.\\n\";\r\n this.handleStream(stream);\r\n },(reason: any)=>{\r\n this.debug += \"[startStream] getUserMedia fail: \"+reason+\".\\n\";\r\n if(count>this.maxTryStream){\r\n this.isChangingDevice = false;\r\n this.debug += \"[startStream] getUserMedia fail. More than 20 times has been tried to start stream and fail.\\n\";\r\n return;\r\n }\r\n this.debug += \"[startStream] getUserMedia fail. Try \"+count+\" time in .25s.\\n\";\r\n setTimeout(()=>{\r\n this.startStream(constraints,count+1);\r\n },250)\r\n })\r\n }\r\n private handleStream(stream: MediaStream | undefined){\r\n this.debug += \"[handleStream] start.\\n\";\r\n if(stream==undefined){\r\n this.debug += \"[handleStream] stream is undefined, cancel action.\\n\";\r\n return;\r\n }\r\n\r\n const webcam = this.video.nativeElement;\r\n webcam.srcObject = stream;\r\n\r\n if(this.device.value==null || this.device.value==''){\r\n this.debug += \"[handleStream] device is null or empty.\\n\";\r\n setTimeout(()=>{\r\n this.debug += \"[handleStream] executing setTimeout to initDevices().\\n\";\r\n this.initDevices();\r\n },500)\r\n }\r\n\r\n webcam.onloadedmetadata = async (event) => {\r\n try {\r\n this.debug += \"[handleStream] video sizes \"+webcam.videoWidth+\"x\"+webcam.videoHeight+\".\\n\";\r\n await webcam.play();\r\n } catch (e) {\r\n console.error(e)\r\n }\r\n }\r\n }\r\n\r\n toogleMode(){\r\n this.debug += \"[changeMode] start.\\n\";\r\n \r\n const fm = this.faceMode;\r\n this.debug += \"[changeMode] current faceMode: \"+fm+\".\\n\";\r\n this.faceMode = this.faceMode==eCamShootFaceMode.USER?eCamShootFaceMode.ENVIRONMENT:eCamShootFaceMode.USER;\r\n this.debug += \"[changeMode] new faceMode: \"+this.faceMode+\".\\n\";\r\n \r\n let canContinue: boolean = false;\r\n if(this.faceMode==eCamShootFaceMode.ENVIRONMENT && this.getBackDevices().length>0){\r\n canContinue = true;\r\n }else if(this.faceMode==eCamShootFaceMode.USER && this.getFrontDevices().length>0){\r\n canContinue = true;\r\n }\r\n if(!canContinue){\r\n this.debug += \"[changeMode] don't have devices to change, cancel action.\\n\";\r\n return;\r\n }\r\n this.isChangingDevice = true;\r\n if(this.faceMode==eCamShootFaceMode.ENVIRONMENT){\r\n this.debug += \"[changeMode] faceMode = ENVIRONMENT.\\n\";\r\n this.debug += \"[changeMode] ENVIRONMENT devices: \"+this.getBackDevices().length+\".\\n\";\r\n this.device.setValue(this.getBackDevices()[0].deviceId,{emitEvent:false});\r\n }else{\r\n this.debug += \"[changeMode] faceMode = USER.\\n\";\r\n this.debug += \"[changeMode] USER devices: \"+this.getFrontDevices().length+\".\\n\";\r\n this.device.setValue(this.getFrontDevices()[0].deviceId,{emitEvent:false});\r\n }\r\n this.clearAndLoadDevices();\r\n }\r\n\r\n private checkFlash(deviceId: string | null){\r\n this.debug += \"[checkFlash] start.\\n\";\r\n if(this.stream==undefined) return;\r\n let track = this.stream.getVideoTracks()[0];\r\n if(!track.getCapabilities){\r\n this.debug += \"[checkFlash] track can't use capabilities.\\n\";\r\n this.canUseFlash = false;\r\n this.canActiveFlash = false;\r\n return;\r\n }\r\n this.canUseFlash = true;\r\n this.canActiveFlash = 'torch' in track.getCapabilities()\r\n if(deviceId!=null && this.canActiveFlash){\r\n this.debug += \"[checkFlash] device canActiveFlash = true.\\n\";\r\n this.setDeviceFlash(deviceId,this.canActiveFlash);\r\n }\r\n this.debug += \"[checkFlash] canActiveFlash: \"+this.canActiveFlash+\".\\n\";\r\n }\r\n private setDeviceFlash(deviceId: string, torch: boolean){\r\n this.debug += \"[setDeviceFlash] start.\\n\";\r\n let dev = this.devices.find((e)=>e.deviceId==deviceId);\r\n this.debug += \"[setDeviceFlash] find on devices, where deviceId: \"+deviceId+\".\\n\";\r\n if(dev!=undefined){\r\n this.debug += \"[setDeviceFlash] device found, set haveTorch to: \"+torch+\".\\n\";\r\n dev.haveTorch = torch;\r\n }\r\n }\r\n toogleFlash(){\r\n this.debug += \"[toogleFlash] start.\\n\";\r\n if(this.stream==undefined) return;\r\n\r\n const track: MediaStreamTrack = this.stream.getVideoTracks()[0];\r\n\r\n this.isFlashActive = !this.isFlashActive;\r\n this.debug += \"[toogleFlash] applyAdvanceConstraint torch to \"+this.isFlashActive+\".\\n\";\r\n this.applyAdvanceConstraint({torch: this.isFlashActive});\r\n }\r\n private checkZoom(){\r\n this.debug += \"[checkZoom] start.\\n\";\r\n if(this.stream==undefined) return;\r\n const prev = this.canUseZoom;\r\n let track = this.stream.getVideoTracks()[0];\r\n if(!track.getCapabilities){\r\n this.debug += \"[checkZoom] track can't use capabilities.\\n\";\r\n this.canUseZoom = false;\r\n return;\r\n }\r\n this.canUseZoom = true;\r\n this.canActiveZoom = 'zoom' in track.getCapabilities()\r\n this.debug += \"[checkZoom] canActiveZoom: \"+this.canActiveZoom+\".\\n\";\r\n this.zoomConfig = (track.getCapabilities() as any).zoom;\r\n if(this.zoomConfig!=undefined){\r\n this.zoom.setValue(this.zoomConfig.min);\r\n }\r\n }\r\n private updateZoom(zoom: number){\r\n this.debug += \"[updateZoom] start.\\n\";\r\n if(this.zoomConfig==undefined){\r\n this.debug += \"[updateZoom] zoomConfig is undefined, cancel.\\n\";\r\n }\r\n this.debug += \"[updateZoom] applyAdvanceConstraint zoom to \"+zoom+\".\\n\";\r\n this.applyAdvanceConstraint({zoom:zoom});\r\n }\r\n private applyAdvanceConstraint(constraint: MediaTrackConstraintSet | any){\r\n this.debug += \"[applyAdvanceConstraint] start.\\n\";\r\n if(this.stream==undefined){\r\n this.debug += \"[applyAdvanceConstraint] stream is undefined.\\n\";\r\n return;\r\n }\r\n\r\n const track: MediaStreamTrack = this.stream.getVideoTracks()[0];\r\n this.debug += \"[applyAdvanceConstraint] constraint set: \"+JSON.stringify(constraint)+\".\\n\";\r\n const constraints: MediaTrackConstraints | any = {\r\n advanced: [constraint]\r\n }\r\n track.applyConstraints(constraints)\r\n .then(() => {\r\n this.debug += \"[applyAdvanceConstraint] constraints has been applied.\\n\";\r\n })\r\n .catch(e => {\r\n this.debug += \"[applyAdvanceConstraint] constraints not has been applied.\\n\";\r\n });\r\n }\r\n getZoomPercent(): string{\r\n const zoomVal = this.zoom.value;\r\n if(zoomVal==null || zoomVal==this.zoomConfig.min) return '1.0';\r\n console.log('getZoomPercent',zoomVal)\r\n return ((zoomVal)/this.zoomConfig.min).toFixed(1);\r\n }\r\n\r\n private checkDeviceMode(deviceId: any){\r\n this.debug += \"[checkDeviceMode] start.\\n\";\r\n let device = this.devices.filter((e)=>e.deviceId==deviceId)[0];\r\n let isFrontDev = this.isFront(device.label);\r\n if(isFrontDev!=device.isFront){\r\n this.debug += \"[checkDeviceMode] faceMode front device not match, changing.\\n\";\r\n this.faceMode = isFrontDev?eCamShootFaceMode.USER:eCamShootFaceMode.ENVIRONMENT;\r\n }\r\n }\r\n private isFront(label: string){\r\n return label.match(/back|trasera/i)===null;\r\n }\r\n\r\n private getFrontDevices(): ICamShootDevice[]{\r\n return this.devices.filter(e=>e.isFront)\r\n }\r\n private getBackDevices(): ICamShootDevice[]{\r\n return this.devices.filter(e=>!e.isFront)\r\n }\r\n get hasMultipleDevicesOnMode(): boolean{\r\n if(this.faceMode==eCamShootFaceMode.USER){\r\n return this.getFrontDevices().length>1;\r\n }\r\n if(this.faceMode==eCamShootFaceMode.ENVIRONMENT){\r\n return this.getBackDevices().length>1;\r\n }\r\n return false;\r\n }\r\n\r\n private pushDevice(device: MediaDeviceInfo){\r\n this.debug += \"[pushDevice] start.\\n\";\r\n const isFrontDev = this.isFront(device.label);\r\n let devLabel = device.label;\r\n if(device.label==''){\r\n devLabel = `Cam ${isFrontDev?'user':'env'} ${this.devices.filter((e)=>e.isFront==isFrontDev).length+1}`;\r\n }\r\n\r\n const dev = {\r\n isFront: isFrontDev,\r\n mode: (isFrontDev?eCamShootFaceMode.USER:eCamShootFaceMode.ENVIRONMENT),\r\n label: devLabel,\r\n deviceId: device.deviceId,\r\n haveTorch: false\r\n }\r\n \r\n this.debug += \"[pushDevice] push:\"+JSON.stringify(dev)+\".\\n\";\r\n this.devices.push(dev);\r\n }\r\n\r\n private hasTouch(navigator: Navigator|any): boolean{\r\n if (\"maxTouchPoints\" in navigator) {\r\n return navigator.maxTouchPoints > 0;\r\n } else if (\"msMaxTouchPoints\" in navigator) {\r\n return navigator.msMaxTouchPoints > 0;\r\n } else {\r\n const mQ = matchMedia?.(\"(pointer:coarse)\");\r\n if (mQ?.media === \"(pointer:coarse)\") {\r\n return !!mQ.matches;\r\n } else if (\"orientation\" in window) {\r\n return true; // deprecated, but good fallback\r\n } else {\r\n // Only as a last resort, fall back to user agent sniffing\r\n const UA: string = navigator.userAgent;\r\n return /\\b(BlackBerry|webOS|iPhone|IEMobile)\\b/i.test(UA) ||\r\n /\\b(Android|Windows Phone|iPad|iPod)\\b/i.test(UA);\r\n }\r\n }\r\n }\r\n\r\n getErrors(): string{\r\n return this.showErrors?this.error.replace(/\\n/g, \"<br />\"):'';\r\n }\r\n getDebugInfo(): string{\r\n return this.debugMode?this.debug.replace(/\\n/g, \"<br />\"):'';\r\n }\r\n getStyleConfig(): string{\r\n return `--cs-sw: ${this.screen_w}px; --cs-sh: ${this.screen_h}px; --cs-head-color: ${this.color}; --cs-item-color: ${this.color};`;\r\n }\r\n\r\n isDefault(){\r\n return this.type==eCamShootType.DEFAULT;\r\n }\r\n isSelfie(){\r\n return this.type==eCamShootType.SELFIE;\r\n }\r\n isDocument(){\r\n return this.type==eCamShootType.DOCFRONT || this.type==eCamShootType.DOCBACK;\r\n }\r\n isDocFront(){\r\n return this.type==eCamShootType.DOCFRONT;\r\n }\r\n}\r\n","/*\r\n * Public API Surface of ngx-cam-shoot\r\n */\r\n\r\nexport * from './lib/ngx-cam-shoot.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}