{"version":3,"sources":["webpack:///../WCC.UI/App/components/wccVideoPicker/wccVideoPicker.html?9f42","webpack:///../WCC.UI/App/components/wccVideoPicker/wccVideoPicker.scss?7098","webpack:///../WCC.UI/App/components/wccVideoPicker/wccVideoPicker.ts","webpack:///../WCC.UI/App/helpers/recording.ts","webpack:///../WCC.UI/App/managers/uploads/s3/video.ts","webpack:///../WCC.UI/App/webpack/runtime/htmlExposer.js","webpack:///../WCC.UI/App/components/wccVideoPicker/wccVideoPicker.scss","webpack:///../WCC.UI/App/components/wccVideoPicker/wccVideoPicker.html"],"names":["content","expose","__esModule","default","api","module","i","options","exports","locals","components","preload","WCCVideoPickerVM","constructor","config","info","_config$onUploaded","this","onUploadedCallback","onUploaded","_","noop","videoUploader","WCCS3VideoUploader","key","uploadTask","uploads","first","pluck","u","title","labels","Uploading","progress","isReady","ko","observable","isRecordingSupported","items","pureComputed","push","UploadVideo","icon","onClick","pickVideo","RecordVideo","recordVideo","mediaPickerConfig","task","ready","applyBindingsToNode","element","RecordingHelpers","checkIfVideoRecordingIsSupported","then","value","video","upload","FilesHelpers","pickFile","blob","Promise","resolve","overlayManager","toOverlay","lock","buttons","data","stage","fitViewport","onRecorded","close","onClose","undefined","__decorate","injectable","__param","inject","wccModules","componentConfig","componentInfo","system","lazyAsync","async","window","MediaRecorder","navigator","mediaDevices","getUserMedia","getTracks","forEach","track","stop","checkIfAudioRecordingIsSupported","audio","checkIfScreenRecordingSupportedInternal","lazy","_browser$satisfies","bowser","getParser","userAgent","satisfies","safari","MediaStreamTrack","prototype","checkIfScreenRecordingSupported","device","isMobile","v2Attachments","allowedUploadVideoExtensions","settings","WCCUploader","super","transport","transportFactory","getTransport","type","allowedExtensions","previewUploader","WCCS3ImageUploader","fileOrBlob","WCCUpload","name","getPreview","preview","width","height","src","ex","uploadResult","previewFile","uploadPreview","toLowerCase","WCCVideo","FileType","enums","AttachmentTypes","Video","CreateDate","Date","toISOString","Files","UserFileId","fileId","Name","Extension","getExtension","Link","link","Width","Height","Type","UserFileTypes","OriginalVideo","files","CDNFileName","videoName","ext","Error","replace","blobWrapper","base64toBlob","file","find","f","OriginalImage","VideoThumbnail","console","warn","SystemHelpers","html","getTemplatesAndResources","node","document","head","appendChild","___CSS_LOADER_API_IMPORT___"],"mappings":"iJAAA,UAAO,CACC,iHACA,wDAIC,KAJyC,EAAF,SAAYA,EAASC,GAGzD,OADAA,EADAD,EAAUA,EAAQE,WAAaF,EAAQG,QAAUH,GAE1CA,GACV,4B,8ECNT,IAAII,EAAM,EAAQ,gFACFJ,EAAU,EAAQ,4JAIC,iBAFvBA,EAAUA,EAAQE,WAAaF,EAAQG,QAAUH,KAG/CA,EAAU,CAAC,CAACK,EAAOC,EAAIN,EAAS,MAG9C,IAAIO,EAAU,CAEd,OAAiB,OACjB,WAAoB,GAEPH,EAAIJ,EAASO,GAI1BF,EAAOG,QAAUR,EAAQS,QAAU,I,w8BCLnCC,EAAWC,QAAQ,qBAAsB,uBASzC,IAAqBC,EAArB,MAOIC,YACwCC,EACFC,GAAiC,IAAAC,EAEnEC,KAAKC,mBAAsC,QAApBF,EAAGF,EAAOK,kBAAU,IAAAH,IAAII,EAAEC,KAEjDJ,KAAKK,cAAgB,IAAIC,IAAmB,CAAEC,IAAKV,EAAOU,MAC1D,MACMC,EADSR,KAAKK,cAAcI,QAAQC,QAChBC,MAAMC,IAAK,CAA0BC,MAAOC,EAAOC,UAAWC,SAAUJ,EAAEI,YAE9FC,EAAUC,EAAGC,YAAW,GACxBC,EAAuBF,EAAGC,YAAW,GAErCE,EAAQH,EAAGI,aAAa,KAC1B,GAAIL,IAAW,CACX,MAAMI,EAAsC,GAgB5C,OAdAA,EAAME,KAAK,CACPV,MAAOC,EAAOU,YACdC,KAAM,sBACNC,QAASA,IAAM1B,KAAK2B,cAGpBP,KACAC,EAAME,KAAK,CACPV,MAAOC,EAAOc,YACdH,KAAM,gBACNC,QAASA,IAAM1B,KAAK6B,gBAIrBR,KAIfrB,KAAK8B,kBAAoB,CACrBT,MAAOA,EACPU,KAAMvB,EACNwB,MAAOf,GAGXC,EAAGe,oBAAoBnC,EAAKoC,QAAS,CACjC,IAAO,CACH,oBAAoB,KAI5BC,IAAiBC,mCAAmCC,KAAKC,IACrDlB,EAAqBkB,GACrBrB,GAAQ,KAIR,kBACJ,MAAMsB,QAAcvC,KAAKK,cAAcmC,aAAaC,eAAaC,UAAS,EAAM,YAChF1C,KAAKC,mBAAmBsC,GAGpB,oBACJ,MAAMI,QAAa,IAAIC,QAAiCC,IACpDC,UAAeC,UAAU,8CAA+C,CACpEC,MAAM,EACNC,QAAS,CAAC,SAEVC,KAAMC,IAC6B,CAC3BC,aAAa,EAEbC,WAAYV,IACRE,EAAQF,GACRQ,EAAMG,WAKlBC,QAASA,IAAMV,OAAQW,OAI/B,GAAYA,MAARb,EAAmB,CACnB,MAAMJ,QAAcvC,KAAKK,cAAcmC,OAAOG,GAC9C3C,KAAKC,mBAAmBsC,QAExBvC,KAAKC,wBAAmBuD,KA1Ff7D,EAAgB8D,EAAA,CADpCC,cASQC,EAAA,EAAAC,YAAOC,IAAWC,kBAClBH,EAAA,EAAAC,YAAOC,IAAWE,iBATNpE,gB,gSCtBrB,sDAEcwC,EAFd,yCAEA,SAAcA,GACGA,EAAAC,iCAAmC4B,EAAOC,UAAUC,UAC7D,IACI,GAA4BV,MAAxBW,OAAOC,cAA4B,CAInC,aAHqBC,UAAUC,aAAaC,aAAa,CAAEhC,OAAO,KAC3DiC,YAAYC,QAAQC,GAASA,EAAMC,SAEnC,EAGX,OAAO,EACT,MACE,OAAO,KAIFxC,EAAAyC,iCAAmCZ,EAAOC,UAAUC,UAC7D,IACI,GAA4BV,MAAxBW,OAAOC,cAA4B,CAInC,aAHqBC,UAAUC,aAAaC,aAAa,CAAEM,OAAO,KAC3DL,YAAYC,QAAQC,GAASA,EAAMC,SAEnC,EAGX,OAAO,EACT,MACE,OAAO,KAIf,MAAMG,EAA0Cd,EAAOe,KAAK,KAAK,IAAAC,EAI7D,QAFqD,QAAvCA,EADEC,EAAOC,UAAUf,OAAOE,UAAUc,WACzBC,UAAU,CAAEC,OAAQ,eAAQ,IAAAL,QAKjD,iBAAkBX,WAAa,oBAAqBA,UAAUC,eAC1D,iBAAkBD,WAAa,iBAAkBA,WAAa,iBAAwBA,UAAWC,eACpE,mBAAlBF,cACA,eAAgBkB,iBAAiBC,eAHpD,KAQSpD,EAAAqD,gCAAkCtE,EAAGI,aAAa,KAAOmE,UAAOC,YAAcZ,KA9C/F,CAAc3C,MAAgB,O,ioBCQ9B,MAAM,cAAEwD,EAAa,6BAAEC,GAAiCC,EAM1C,MAAOvF,UAA2BwF,IAG5ClG,YAAYC,GACRkG,MAAM,CACFC,UAAWC,IAAiBC,aAAa,CACrCC,KAAM,QACN5F,IAAW,MAANV,OAAM,EAANA,EAAQU,MAGjB6F,kBAAmBR,IAGvB5F,KAAKqG,gBAAkB,IAAIC,UAGZ,gBAAgBC,GAC/B,IACI,MAAM/D,EAAS,IAAIgE,IAAU,CAAEC,KAAMF,EAAWE,OAQhD,OANAhE,eAAaiE,WAAWH,GAAYlE,KAAKsE,IACrCnE,EAAOoE,MAAMD,EAAQC,OACrBpE,EAAOqE,OAAOF,EAAQE,QACtBrE,EAAOmE,QAAQA,EAAQG,OAGpBtE,EACT,MAAOuE,GACL,OAAO,IAAIP,IAAU,CAAEC,KAAMF,EAAWE,QAItC,gBAAgBO,EAAiCxE,EAAmB+D,GAC1E,GAAIZ,EAAe,CACf,IAAIsB,EAEJ,IACI,MAAMN,QAAgBlE,eAAaiE,WAAWH,GAC9CU,QAAoBjH,KAAKkH,cAAcX,EAAWE,KAAKU,cAAeR,EAAQG,KAChF,MAAOC,IAET,MAAMxE,EAAQ,IAAI6E,IAAS,CACvBC,SAAUC,EAAMC,gBAAgBC,MAAMlF,MACtCmF,YAAY,IAAIC,MAAOC,cAEvBC,MAAO,CACH,CACIC,WAAYb,EAAac,OACzBC,KAAMxB,EAAWE,KACjBuB,UAAWhE,EAAOiE,aAAa1B,EAAWE,MAC1CyB,KAAMlB,EAAamB,KACnBC,MAAO5F,EAAOoE,QACdyB,OAAQ7F,EAAOqE,SACfyB,KAAMhB,EAAMiB,cAAcC,cAAclG,MACxCmF,YAAY,IAAIC,MAAOC,kBAQnC,OAHmBnE,MAAfyD,GACA1E,EAAMkG,MAAMlH,KAAK0F,GAEd1E,EAGX,OAAO,IAAI6E,IAAS,CAChBC,SAAUC,EAAMC,gBAAgBC,MAAMlF,MACtC4F,KAAMlB,EAAamB,KACnBC,MAAO5F,EAAOoE,QACdyB,OAAQ7F,EAAOqE,SACfgB,WAAYb,EAAac,OACzBY,YAAa1B,EAAazG,IAC1BkH,YAAY,IAAIC,MAAOC,gBAIvB,oBAAoBgB,EAAmB5J,GAC3C,IACI,MAAM6J,EAAM5E,EAAOiE,aAAaU,GAEhC,GAAWnF,MAAPoF,EACA,MAAM,IAAIC,MAAM,qBAEpB,MAAMpC,EAAOkC,EAAUG,QAAQF,EAAK,OAG9BG,EAA2B,CAAEpG,KADtBF,eAAauG,aAAajK,GACE0H,QAGnCwC,SADmBjJ,KAAKqG,gBAAgB7D,OAAOuG,IAC7BN,QAAQS,KAAKC,GAAKA,EAAEhD,QAAUmB,EAAMiB,cAAca,cAAc9G,OAExF,GAAYkB,MAARyF,EACA,MAAM,IAAIJ,MAAM,yBAGpB,OADAI,EAAK9C,KAAKmB,EAAMiB,cAAcc,eAAe/G,OACtC2G,EACT,MAAOlC,GAEL,YADAuC,QAAQC,KAAK,SAASZ,8BAAuC5B,Q,kMCjHzE,WAOC,KAPD,aACI,MAAM/C,EAAS,EAAQ,mCAAkBwF,cAEzC,OAAO,SAAUC,GACbzF,EAAO0F,yBAAyBD,GAC3BhF,SAAQ,SAAUkF,GAAQC,SAASC,KAAKC,YAAYH,QAEhE,+B,4KCLDpK,EADkC,EAAQ,wDAChCwK,EAA4B,IAE9BxI,KAAK,CAACnC,EAAOC,EAAI,mCAAoC,KAE7DD,EAAOG,QAAUA,G,4HCHjBH,EAAOG,QAFI","file":"228.838ceb4c55aa6e217094.js","sourcesContent":["define([\n \"!!../../../node_modules/html-loader/dist/cjs.js??ref--26-1!./wccVideoPicker.html\", \n \"!../../webpack/runtime/htmlExposer.js\"], function (content, expose) {\n content = content.__esModule ? content.default : content;\n expose(content);\n return content;\n });","var api = require(\"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n var content = require(\"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/sass-loader/dist/cjs.js!./wccVideoPicker.scss\");\n\n content = content.__esModule ? content.default : content;\n\n if (typeof content === 'string') {\n content = [[module.id, content, '']];\n }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};","import { MediaPickerDialogConfig, MediaPickerDialogItem, MediaPickerDialogTask } from 'components/mediaPickerDialog/mediaPickerDialog';\r\nimport { WCCVideoRecorderConfig } from 'components/videoRecorder/videoRecorder';\r\nimport { wccModules } from 'enums/wccModules';\r\nimport { FilesHelpers } from 'helpers/files';\r\nimport { RecordingHelpers } from 'helpers/recording';\r\nimport { BlobWrapper } from 'interfaces/blobWrapper';\r\nimport { inject, injectable } from 'inversify';\r\nimport overlayManager from 'managers/overlay';\r\nimport WCCS3VideoUploader from 'managers/uploads/s3/video';\r\nimport WCCVideo from 'models/attachments/video';\r\nimport './wccVideoPicker.html';\r\nimport './wccVideoPicker.scss';\r\n\r\ncomponents.preload('wcc-video-recorder', 'media-picker-dialog');\r\n\r\nexport interface WCCVideoPickerVMConfig {\r\n key?: string,\r\n\r\n onUploaded?: Action<[WCCVideo | undefined]>\r\n}\r\n\r\n@injectable()\r\nexport default class WCCVideoPickerVM {\r\n private videoUploader: WCCS3VideoUploader;\r\n\r\n private onUploadedCallback: Action<[WCCVideo | undefined]>\r\n\r\n mediaPickerConfig: MediaPickerDialogConfig\r\n\r\n constructor(\r\n @inject(wccModules.componentConfig) config: WCCVideoPickerVMConfig,\r\n @inject(wccModules.componentInfo) info: ko.components.ComponentInfo\r\n ) {\r\n this.onUploadedCallback = config.onUploaded ?? _.noop;\r\n\r\n this.videoUploader = new WCCS3VideoUploader({ key: config.key });\r\n const upload = this.videoUploader.uploads.first();\r\n const uploadTask = upload.pluck(u => ({ title: labels.Uploading, progress: u.progress }));\r\n\r\n const isReady = ko.observable(false);\r\n const isRecordingSupported = ko.observable(true);\r\n\r\n const items = ko.pureComputed(() => {\r\n if (isReady()) {\r\n const items = >[];\r\n\r\n items.push({\r\n title: labels.UploadVideo,\r\n icon: 'fas fa-cloud-upload',\r\n onClick: () => this.pickVideo()\r\n });\r\n\r\n if (isRecordingSupported()) {\r\n items.push({\r\n title: labels.RecordVideo,\r\n icon: 'fas fa-webcam',\r\n onClick: () => this.recordVideo()\r\n });\r\n }\r\n\r\n return items;\r\n }\r\n }); \r\n\r\n this.mediaPickerConfig = {\r\n items: items,\r\n task: uploadTask,\r\n ready: isReady\r\n }\r\n\r\n ko.applyBindingsToNode(info.element, {\r\n 'css': {\r\n 'wcc-video-picker': true\r\n }\r\n });\r\n\r\n RecordingHelpers.checkIfVideoRecordingIsSupported().then(value => {\r\n isRecordingSupported(value);\r\n isReady(true);\r\n });\r\n }\r\n\r\n private async pickVideo() {\r\n const video = await this.videoUploader.upload(await FilesHelpers.pickFile(true, 'video/*'));\r\n this.onUploadedCallback(video);\r\n }\r\n\r\n private async recordVideo() {\r\n const blob = await new Promise(resolve => {\r\n overlayManager.toOverlay(``, {\r\n lock: true,\r\n buttons: ['close'],\r\n\r\n data: stage => {\r\n return {\r\n fitViewport: true,\r\n\r\n onRecorded: blob => {\r\n resolve(blob);\r\n stage.close();\r\n }\r\n }\r\n },\r\n\r\n onClose: () => resolve(undefined)\r\n });\r\n });\r\n\r\n if (blob != undefined) {\r\n const video = await this.videoUploader.upload(blob);\r\n this.onUploadedCallback(video);\r\n } else {\r\n this.onUploadedCallback(undefined);\r\n }\r\n }\r\n}","import device from 'managers/device';\r\n\r\nexport module RecordingHelpers {\r\n export const checkIfVideoRecordingIsSupported = system.lazyAsync(async () => {\r\n try {\r\n if (window.MediaRecorder != undefined) {\r\n const stream = await navigator.mediaDevices.getUserMedia({ video: true }); //get stream\r\n stream.getTracks().forEach(track => track.stop()); //dispose stream\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n } catch {\r\n return false;\r\n }\r\n });\r\n\r\n export const checkIfAudioRecordingIsSupported = system.lazyAsync(async () => {\r\n try {\r\n if (window.MediaRecorder != undefined) {\r\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true }); //get stream\r\n stream.getTracks().forEach(track => track.stop()); //dispose stream\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n } catch {\r\n return false;\r\n }\r\n });\r\n\r\n const checkIfScreenRecordingSupportedInternal = system.lazy(() => {\r\n const browser = bowser.getParser(window.navigator.userAgent);\r\n const isSafari = browser.satisfies({ safari: '>=1' }) ?? false;\r\n\r\n if (isSafari)\r\n return false;\r\n\r\n if (\"mediaDevices\" in navigator && \"getDisplayMedia\" in navigator.mediaDevices) {\r\n if (\"getUserMedia\" in navigator || \"mediaDevices\" in navigator && \"getUserMedia\" in (navigator).mediaDevices) {\r\n if (typeof MediaRecorder === \"function\")\r\n return \"readyState\" in MediaStreamTrack.prototype\r\n }\r\n }\r\n });\r\n\r\n export const checkIfScreenRecordingSupported = ko.pureComputed(() => !device.isMobile() && checkIfScreenRecordingSupportedInternal());\r\n}","import { FilesHelpers } from 'helpers/files';\r\nimport { BlobWrapper } from 'interfaces/blobWrapper';\r\nimport WCCVideo from 'models/attachments/video';\r\nimport WCCUpload from 'models/upload';\r\nimport UserFile from 'models/userFile';\r\nimport WCCUploader from '../uploader';\r\nimport WCCS3ImageUploader from './image';\r\nimport transportFactory from './transportFactory';\r\nimport { WCCS3UploadResult } from './uploadResult';\r\n\nconst { v2Attachments, allowedUploadVideoExtensions } = settings;\n\nexport interface WCCS3VideoUploaderConfig {\n key?: string\r\n}\n\nexport default class WCCS3VideoUploader extends WCCUploader {\n private previewUploader: WCCS3ImageUploader\n\n constructor(config?: WCCS3VideoUploaderConfig) {\n super({\n transport: transportFactory.getTransport({\n type: 'video',\n key: config?.key\r\n }),\n\n allowedExtensions: allowedUploadVideoExtensions,\n });\n\n this.previewUploader = new WCCS3ImageUploader();\n }\n\n protected override async getUpload(fileOrBlob: File | BlobWrapper) {\n try {\n const upload = new WCCUpload({ name: fileOrBlob.name });\n\n FilesHelpers.getPreview(fileOrBlob).then(preview => {\r\n upload.width(preview.width);\r\n upload.height(preview.height);\r\n upload.preview(preview.src);\r\n });\r\n\r\n return upload;\r\n } catch (ex) {\n return new WCCUpload({ name: fileOrBlob.name });\r\n }\n }\n\n protected async getResult(uploadResult: WCCS3UploadResult, upload: WCCUpload, fileOrBlob: File | BlobWrapper) {\n if (v2Attachments) {\n let previewFile: UserFile | undefined;\n\n try {\n const preview = await FilesHelpers.getPreview(fileOrBlob);\n previewFile = await this.uploadPreview(fileOrBlob.name.toLowerCase(), preview.src);\n } catch (ex) {}\n\n const video = new WCCVideo({\n FileType: enums.AttachmentTypes.Video.value,\n CreateDate: new Date().toISOString(),\n\n Files: [\n {\n UserFileId: uploadResult.fileId,\n Name: fileOrBlob.name,\n Extension: system.getExtension(fileOrBlob.name),\n Link: uploadResult.link,\n Width: upload.width(),\n Height: upload.height(),\n Type: enums.UserFileTypes.OriginalVideo.value,\n CreateDate: new Date().toISOString()\n }\n ]\n });\n\n if (previewFile != undefined)\n video.files.push(previewFile);\n\n return video;\n }\n\n return new WCCVideo({\n FileType: enums.AttachmentTypes.Video.value,\n Link: uploadResult.link,\n Width: upload.width(),\n Height: upload.height(),\n UserFileId: uploadResult.fileId,\n CDNFileName: uploadResult.key,\n CreateDate: new Date().toISOString()\n });\n }\n\n private async uploadPreview(videoName: string, content: string) {\n try {\n const ext = system.getExtension(videoName);\n\n if (ext == undefined)\n throw new Error('invalid extension');\n\n const name = videoName.replace(ext, 'jpg');\n\n const blob = FilesHelpers.base64toBlob(content);\r\n const blobWrapper = { blob, name };\r\n\r\n const attachment = await this.previewUploader.upload(blobWrapper);\r\n const file = attachment.files().find(f => f.type() == enums.UserFileTypes.OriginalImage.value);\r\n\r\n if (file == undefined)\r\n throw new Error('preview upload failed');\r\n\r\n file.type(enums.UserFileTypes.VideoThumbnail.value);\r\n return file;\r\n } catch (ex) {\r\n console.warn(`video ${videoName} preview generation failed`, ex);\r\n return undefined;\r\n }\r\n }\n}","define(function () {\r\n const system = require('helpers/system').SystemHelpers;\r\n\r\n return function (html) {\r\n system.getTemplatesAndResources(html)\r\n .forEach(function (node) { document.head.appendChild(node) });\r\n }\r\n});","// Imports\nvar ___CSS_LOADER_API_IMPORT___ = require(\"../../../node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.id, \".wcc-video-picker{display:block}\", \"\"]);\n// Exports\nmodule.exports = exports;\n","// Module\nvar code = \"\";\n// Exports\nmodule.exports = code;"],"sourceRoot":""}