{"version":3,"sources":["webpack:///../WCC.UI/App/components/editors/chat/tools/emojis/emojis.html?606a","webpack:///../WCC.UI/App/components/editors/chat/tools/emojis/emojis.ts","webpack:///../WCC.UI/App/components/editors/chat/tools/tool.ts","webpack:///../WCC.UI/App/helpers/css.ts","webpack:///../WCC.UI/App/managers/addpipe.ts","webpack:///../WCC.UI/App/managers/audioPicker.ts","webpack:///../WCC.UI/App/managers/genericVideoPicker.ts","webpack:///../WCC.UI/App/managers/topic/media.ts","webpack:///../WCC.UI/App/managers/uploads/s3/audio.ts","webpack:///../WCC.UI/App/managers/uploads/s3/video.ts","webpack:///../WCC.UI/App/managers/videoUploaders/qualzyVideoPickerManager.ts","webpack:///../WCC.UI/App/managers/wccVideoPicker.ts","webpack:///../WCC.UI/App/components/editors/chat/tools/emojis/emojis.html"],"names":["content","expose","__esModule","default","components","preload","EmojisTool","Tool","constructor","jsonModel","_jsonModel$pick","super","component","this","pick","_","noop","EmojisToolVM","ToolVM","model","info","element","icon","__decorate","injectable","__param","inject","wccModules","componentConfig","componentInfo","_jsonModel$action","action","ko","observable","unwrap","tooltip","css","isSpecial","isActive","isDisabled","isVisible","tool","node","cTooltip","cCSS","cIsSpecial","cIsActive","cIsDisabled","cIsVisible","applyBindingsToNode","message","buckets","async","loadCSS","urlOrList","tasks","isArray","map","url","bucket","find","name","fetchFromCache","undefined","StorageBucket","push","createBucket","markLoading","Promise","resolve","tag","cssTag","document","createElement","setAttribute","getCSSNode","resolveFunc","onload","addEventListener","track","Image","onerror","src","head","appendChild","attachNode","loadSingleCSSFile","markReady","isReady","when","awaitSingleCSSFile","all","$script","require","availableViewportSizeToOverlay","CDN_AWS_ImageURLPrefix","AddPipe_Folder","settings","resourcesAwaiter","pureComputed","system","getPromiseAwaiter","areResourcesLoaded","_ko$unwrap","getAddPipeSize","maxWidth","device","width","maxHeight","height","scale","addpipeParams","size","qualityurl","accountHash","addPipeAccountHash","eid","addPipeEnvironmentId","mrt","dup","videoAddPipeParams","AddPipeManager","preloadOrConfig","_preloadOrConfig$prel","effects","withEffects","isCreatingAttachment","uploads","observableArray","checkIfReady","isBusy","ctx","register","ServicesContext","isBoolean","container","pickVideo","uploadFile","file","id","recorder","$","hide","input","DOMHelpers","waitFor","dt","DataTransfer","items","add","files","event","Event","dispatchEvent","recordScreen","srec","click","dispose","params","init","Error","uniqueId","tpl","getOverlayTemplate","onOpen","openCallback","video","awaitVideo","remove","attempts","checkIfContainerIsRendered","getElementById","setTimeout","console","error","onClose","renderInContainer","renderInOverlay","options","$wrapper","html","$container","children","append","wrapper","applyBindings","getTemplateData","utils","domNodeDisposal","addDisposeCallback","setAddpipeSize","once","$addpipe","setAddpipeBodySize","$addpipeBody","$addpipeFooter","observer","MutationObserver","length","disconnect","observe","childList","subtree","removeNode","overlayManager","toOverlay","lock","buttons","data","stage","close","initRecorder","reject","upload","WCCUpload","cancellable","PipeSDK","insert","onDesktopVideoUploadStarted","recorderId","filename","filetype","audioOnly","fileInput","_fileInput$files","preview","FilesHelpers","getPreview","onDesktopVideoUploadProgress","percent","progress","onDesktopVideoUploadSuccess","videoId","location","createAttachment","onDesktopVideoUploadFailed","onVideoUploadStarted","querySelector","_fileInput$files2","onVideoUploadProgress","onVideoUploadSuccess","onVideoUploadFailed","onSaveOk","streamName","streamDuration","cameraName","micName","userId","audioCodec","videoCodec","onConnectionClosed","handleError","messages","UnknownError","thumbnailName","thumbnailURL","videoName","videoURL","thumbnailResult","videoResult","userFilesService","queries","addpipeFiles","Link","Name","AddPipeId","WCCVideo","FileType","enums","AttachmentTypes","Video","value","CreateDate","Date","toISOString","Files","UserFileId","FileId","Extension","SignedS3Link","Type","UserFileTypes","PendingVideoThumbnail","PendingVideo","AudioPickerManager","config","_this$config","attachmentType","onUploaded","audio","allowedUploadVideoExtensions","GenericVideoPickerManager","videoUploader","WCCS3VideoUploader","key","addPipe","addPipeEnabled","wccVideoPicker","WCCVideoPickerManager","qualzyVideoPicker","QualzyVideoPickerManager","useNewVideoUpload","proxyTaskResources","pickFile","discussionId","allowedUploadImageExtensionsForTopicThreads","TopicMediaManager","attachments","topic","flattenComputed","s3VideoKey","pluck","imagesUploader","WCCS3ImageUploader","filesUploader","mapNotNull","WCCS3FileUploader","allowMultiple","allowedExtensions","allowedAttachmentExtensions","audioUploader","WCCS3AudioUploader","videoPicker","audioPicker","_this$videoUploader$u","_this$videoUploader","_this$filesUploader$u","_this$filesUploader","reduce","result","concat","media","images","filter","a","isImage","videos","isVideo","isFile","type","pickImage","pickFiles","pickAudio","forEach","uploadImage","invokeNotNull","wccVideo","ex","wccAudio","fileOrBlob","wccImage","wccFile","uploadVideo","removeAttachment","attachment","confirm","AreYouSureYouWantToDeleteThisFile","allowedUploadAudioExtensions","WCCUploader","_config$allowMultiple","transport","transportFactory","getTransport","getResult","uploadResult","_this$config$attachme","WCCAudio","Audio","fileId","getExtension","link","v2Attachments","previewUploader","then","previewFile","uploadPreview","toLowerCase","Width","Height","OriginalVideo","CDNFileName","ext","replace","blobWrapper","blob","base64toBlob","f","OriginalImage","VideoThumbnail","warn","_totalFilesUploading","dialog","headerText","hideFooter","showCancelInHeader","fitContent","animate","cancel","showErrorMessage","labels","PleaseWait","s3FileUploaderConfig","UploadToS3Config","WCC","Settings","S3Bucket","S3Region","WccApiUrl","loginToken","OnFileUploadStarting","OnFileUploaded","createVideoFromResult","OnFileUploadComplete","FileUrl","module","exports"],"mappings":"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","file":"8.f63870258965835e93d1.js","sourcesContent":["define([\n        \"!!../../../../../../node_modules/html-loader/dist/cjs.js??ref--26-1!./emojis.html\", \n        \"!../../../../../webpack/runtime/htmlExposer.js\"], function (content, expose) {\n            content = content.__esModule ? content.default : content;\n            expose(content);\n            return content;\n        });","import EmojisPickerEmoji from 'components/emojisPicker/models/emoji';\r\nimport { wccModules } from 'enums/wccModules';\r\nimport { inject, injectable } from 'inversify';\r\nimport { PureComputed } from 'knockout';\r\nimport { JSONTool, Tool, ToolVM } from '../tool';\r\nimport './emojis.html';\r\n\r\ncomponents.preload('wcc-emojispicker');\r\n\r\ninterface JSONEmojisTool extends JSONTool {\r\n    pick?: (emoji: EmojisPickerEmoji) => void\r\n}\r\n\r\nexport class EmojisTool extends Tool {\r\n    component = 'chat-editor-emojis-tool'\r\n\r\n    pick: (emoji: EmojisPickerEmoji) => void\r\n\r\n    constructor(jsonModel: JSONEmojisTool) {\r\n        super(jsonModel);\r\n\r\n        this.pick = jsonModel.pick ?? _.noop;\r\n    }\r\n}\r\n\r\n@injectable()\r\nexport default class EmojisToolVM extends ToolVM {\r\n    icon: PureComputed<string | undefined>\r\n    pick: (emoji: EmojisPickerEmoji) => void\r\n\r\n    constructor(\r\n        @inject(wccModules.componentConfig) model: EmojisTool,\r\n        @inject(wccModules.componentInfo) info: ko.components.ComponentInfo\r\n    ) {\r\n        super(model, info.element);\r\n\r\n        this.icon = model.icon;\r\n        this.pick = model.pick;\r\n    }\r\n}","import { SubscribableOrValue, PureComputed } from \"knockout\";\r\nimport { injectable } from \"inversify\";\r\n\r\nexport interface JSONTool {\r\n    action?: () => void\r\n    icon?: SubscribableOrValue<string | undefined>\r\n    tooltip?: SubscribableOrValue<string | undefined>\r\n    css?: SubscribableOrValue<string | undefined>\r\n\r\n    isSpecial?: SubscribableOrValue<boolean>\r\n    isActive?: SubscribableOrValue<boolean>\r\n    isDisabled?: SubscribableOrValue<boolean>\r\n    isVisible?: SubscribableOrValue<boolean>\r\n}\r\n\r\nexport class Tool {\r\n    action: () => void\r\n    icon: PureComputed<string | undefined>\r\n    tooltip: PureComputed<string | undefined>\r\n    css: PureComputed<string | undefined>\r\n\r\n    isSpecial: PureComputed<boolean>\r\n    isActive: PureComputed<boolean>\r\n    isDisabled: PureComputed<boolean>\r\n    isVisible: PureComputed<boolean>\r\n\r\n    constructor(jsonModel: JSONTool) {\r\n        this.action = jsonModel.action ?? _.noop;\r\n        this.icon = ko.observable(jsonModel.icon).unwrap();\r\n        this.tooltip = ko.observable(jsonModel.tooltip).unwrap();\r\n        this.css = ko.observable(jsonModel.css).unwrap();\r\n\r\n        this.isSpecial = ko.observable(jsonModel.isSpecial).unwrap().default(false);\r\n        this.isActive = ko.observable(jsonModel.isActive).unwrap().default(false);\r\n        this.isDisabled = ko.observable(jsonModel.isDisabled).unwrap().default(false);\r\n        this.isVisible = ko.observable(jsonModel.isVisible).unwrap().default(true);\r\n    }\r\n}\r\n\r\n@injectable()\r\nexport class ToolVM {\r\n    constructor(tool: Tool, node: Node) {\r\n        var cTooltip = tool.tooltip,\r\n            cCSS = tool.css;\r\n\r\n        var cIsSpecial = tool.isSpecial,\r\n            cIsActive = tool.isActive,\r\n            cIsDisabled = tool.isDisabled,\r\n            cIsVisible = tool.isVisible;\r\n\r\n        ko.applyBindingsToNode(node, {\r\n            'click': tool.action,\r\n            'visible': cIsVisible,\r\n\r\n            'css': {\r\n                'chat-editor__tool': true,\r\n                'chat-editor__tool--active': cIsActive,\r\n                'chat-editor__tool--disabled': cIsDisabled,\r\n                'chat-editor__tool--special': cIsSpecial\r\n            },\r\n\r\n            'tooltip': { message: cTooltip }\r\n        }, this);\r\n\r\n        ko.applyBindingsToNode(node, {\r\n            'css': cCSS\r\n        }, this);\r\n    }\r\n}","import { StorageBucket } from 'models/storage/bucket';\n\nconst buckets: Array<StorageBucket> = [];\n\n/**\n * Loads css file(s)\n */\nexport async function loadCSS(urlOrList: string | Array<string>) {\n    const urls = _.isArray(urlOrList) ? urlOrList : [urlOrList];\n    const tasks = urls.map(url => awaitSingleCSSFile(url));\n\n    await Promise.all(tasks);\n}\n\n/**\r\n * awaits css file with provided URL\r\n * @param url\r\n */\nasync function awaitSingleCSSFile(url: string) {\n    let bucket = fetchFromCache(url);\n\n    if (bucket == undefined) {\n        bucket = createBucket(url);\r\n        bucket.markLoading();\r\n\r\n        await loadSingleCSSFile(url);\n\n        bucket.markReady();\r\n    } else {\n        await bucket.isReady.when();\r\n    }\n}\n\n/**\r\n * returns css bucket from cache if it exists\r\n * @param url bucket key\r\n */\nfunction fetchFromCache(url: string) {\n    return _(buckets).find(bucket => bucket.name() == url);\n}\n\n/**\r\n * Creates new bucket and adds to cache\r\n * @param url bucket key\r\n */\nfunction createBucket(url: string) {\n    const bucket = new StorageBucket(url);\n    buckets.push(bucket);\n\n    return bucket;\n}\n\n/**\n * Loads css file with provided URL\n */\nfunction loadSingleCSSFile(url: string) {\n    return new Promise<HTMLLinkElement>(resolve => {\n        const tag = getCSSNode(url);\n        const resolveFunc = () => resolve(tag);\n\n        if (tag.onload !== undefined) {\n            tag.onload = resolveFunc;\n        } else if (tag.addEventListener) {\n            tag.addEventListener('load', resolveFunc, false);\n        } else {\n            var track = new Image();\n\n            track.onerror = resolveFunc;\n            track.src = url;\n        }\n\n        attachNode(tag);\n    });\n}\n\nfunction getCSSNode(url: string) {\n    const cssTag = document.createElement(\"link\");\n\n    cssTag.setAttribute(\"rel\", \"stylesheet\");\n    cssTag.setAttribute(\"type\", \"text/css\");\n    cssTag.setAttribute(\"href\", url);\n\n    return cssTag;\n}\n\n/**\r\n * Attaches node to document\r\n * @param tag node to attach\r\n */\nfunction attachNode(tag: HTMLElement) {\n    document.head.appendChild(tag);\n}","import { loadCSS } from 'helpers/css';\r\nimport { DOMHelpers } from 'helpers/dom';\r\nimport { FilesHelpers } from 'helpers/files';\r\nimport { Size } from 'interfaces/size';\r\nimport { Subscribable, SubscribableOrNullableValue } from 'knockout';\r\nimport device from 'managers/device';\r\nimport overlayManager from 'managers/overlay';\r\nimport { EffectsContainer, withEffects } from 'mixins/withEffects';\r\nimport WCCVideo from 'models/attachments/video';\r\nimport WCCUpload from 'models/upload';\r\nimport { ServicesContext } from 'services/context';\r\n\r\ninterface AddpipeParams {\r\n    size?: Size\r\n    qualityurl?: string //this is the video res quality settings\r\n    accountHash?: string\r\n    eid?: string //environmentId\r\n    mrt?: number //MRT = Max Record Time (in seconds)\r\n    dup?: 0 | 1 //allow Desktop Upload Prerecorded Video Files\r\n    srec?: 0 | 1//allow screen recording\r\n}\r\n\r\ndeclare const PipeSDK: any;\r\n\r\nconst $script = require('scriptjs');\r\n\r\nconst { availableViewportSizeToOverlay, CDN_AWS_ImageURLPrefix, AddPipe_Folder } = settings;\r\n\r\n//Lazy addpipe resources loader\r\n//starts loading once called\r\nconst resourcesAwaiter = ko.pureComputed(() => {\r\n    return system.getPromiseAwaiter(async () => {\r\n        await Promise.all([\r\n            new Promise(resolve => $script('//cdn.addpipe.com/2.0/pipe.js', resolve)),\r\n            loadCSS('//cdn.addpipe.com/2.0/pipe.css')\r\n        ]);\r\n\r\n        return true;\r\n    });\r\n});\r\n\r\nconst areResourcesLoaded = ko.pureComputed(() => ko.unwrap(resourcesAwaiter()) ?? false);\r\n\r\nfunction getAddPipeSize() {\r\n    const maxWidth = device.width() * availableViewportSizeToOverlay;\r\n    const maxHeight = device.height() * availableViewportSizeToOverlay;\r\n\r\n    let width = 640;\r\n    let height = 390;\r\n\r\n    if (width > maxWidth) {\r\n        const scale = width / maxWidth;\r\n        width = maxWidth;\r\n        height /= scale;\r\n    } else if (height > maxHeight) {\r\n        const scale = height / maxHeight;\r\n        width /= scale;\r\n        height = maxHeight;\r\n    }\r\n\r\n    return { width, height };\r\n}\r\n\r\nconst addpipeParams = (): AddpipeParams => {\r\n    return {\r\n        size: getAddPipeSize(),\r\n        qualityurl: \"avq/720p.xml\", //this is the video res quality settings\r\n        accountHash: settings.addPipeAccountHash,\r\n        eid: settings.addPipeEnvironmentId,\r\n        mrt: 600, //MRT = Max Record Time (in seconds)\r\n        dup: 1 //allow Desktop Upload Prerecorded Video Files\r\n    }\r\n}\r\n\r\nconst videoAddPipeParams = addpipeParams;\r\n\r\nconst screenRecordingAddPipeParams = () => ({\r\n    ...addpipeParams(),\r\n\r\n    mrt: 1800,\r\n    srec: 1//allow screen recording\r\n});\r\n\r\nexport interface AddPipeManagerConfig {\r\n    preload?: boolean\r\n    container?: SubscribableOrNullableValue<HTMLElement>\r\n}\r\n\r\ninterface RenderOptions {\r\n    onOpen?: Action\r\n    onClose?: Action\r\n}\r\n\r\ninterface TemplateData {\r\n    isBusy: Subscribable<boolean>\r\n}\r\n\r\nexport default class AddPipeManager {\r\n    private ctx: ServicesContext\r\n    private effects = withEffects()\r\n    private container?: SubscribableOrNullableValue<HTMLElement>\r\n\r\n    private isCreatingAttachment = ko.observable(false);\r\n\r\n    uploads = ko.observableArray<WCCUpload>();\r\n    \r\n    isReady = ko.pureComputed(() => this.checkIfReady())\r\n    isBusy = ko.observable(false);\r\n\r\n    /**\r\n     * disposable\r\n     * @param preload will start loading addpipe resources on construction if true\r\n     */\r\n    constructor(preloadOrConfig: AddPipeManagerConfig | boolean = false) {\r\n        this.ctx = this.effects.register(new ServicesContext());\r\n\r\n        let preload: boolean\r\n\r\n        if (_.isBoolean(preloadOrConfig)) {\r\n            preload = preloadOrConfig;\r\n        } else {\r\n            preload = preloadOrConfig.preload ?? false;\r\n            this.container = preloadOrConfig.container;\r\n        }\r\n\r\n        if (preload)\r\n            resourcesAwaiter();\r\n    }\r\n\r\n    pickVideo() {\r\n        return this.pick(videoAddPipeParams());\r\n    }\r\n\r\n    uploadFile(file: File) {\r\n        return this.pick(videoAddPipeParams(), async (id, recorder) => {\r\n            $(`#${id}`).hide();\r\n\r\n            const input = <HTMLInputElement | undefined>await DOMHelpers.waitFor(`#${id} .pipeStartUploading`);\r\n\r\n            if (input != undefined) {\r\n                const dt = new DataTransfer();\r\n                dt.items.add(file);\r\n\r\n                input.files = dt.files;\r\n                //window.$(input).trigger('change'); //addpipe seems to override $ so we have to call it using reference inside window\r\n                const event = new Event('change');\r\n                input.dispatchEvent(event);\r\n            }\r\n        });\r\n    }\r\n\r\n    recordScreen() {\r\n        return this.pick(screenRecordingAddPipeParams(), (id, recorder) => {\r\n            $(`#pipeRecordScreen-${recorder.name}`).click();\r\n        });\r\n    }\r\n\r\n    dispose() {\r\n        this.effects.dispose();\r\n    }\r\n\r\n    private checkIfReady() {\r\n        return areResourcesLoaded();\r\n    }    \r\n\r\n    private async pick(params: StringMap<any>, init?: Action<[id: string, recorder: any]>) {\r\n        if (this.isBusy())\r\n            throw new Error('AddPipe is busy with previous operation');\r\n\r\n        this.isBusy(true);\r\n\r\n        await this.isReady.when();\r\n\r\n        //overlay side effects\r\n        const effects = withEffects();\r\n\r\n        //add overlay side effects to component side effects\r\n        //so overlay get disposed on component dispose call\r\n        this.effects.register(effects);\r\n\r\n        try {\r\n            return await new Promise<WCCVideo | undefined>(resolve => {\r\n                const id = _.uniqueId('add-pipe-recorder-');\r\n                const tpl = this.getOverlayTemplate(id);\r\n                const container = ko.unwrap(this.container);\r\n\r\n                const onOpen = async () => {\r\n                    const openCallback = async () => {\r\n                        //wait for video from addpipe\r\n                        const video = await this.awaitVideo(id, params, effects, recorder => {\r\n                            //remove reconder on overlay dispose\r\n                            effects.register([\r\n                                () => {\r\n                                    try {\r\n                                        recorder.remove();\r\n                                    } catch {\r\n                                    }\r\n                                }\r\n                            ]);\r\n\r\n                            init?.(id, recorder);\r\n                        });\r\n\r\n                        resolve(video);\r\n                    };\r\n                    \r\n                    let attempts = 0;\r\n                    const checkIfContainerIsRendered = async () => {\r\n                        attempts++;\r\n                        const containerEl = document.getElementById(id);\r\n                        if(containerEl) {\r\n                            openCallback();\r\n                        }\r\n                        else {\r\n                            if(attempts < 10) {\r\n                                setTimeout(checkIfContainerIsRendered, 100);\r\n                            }\r\n                            else {\r\n                                console.error('ADD PIPE CONTAINER NOT FOUND');\r\n                            }\r\n                        }\r\n                    }\r\n                    let containerExists = false;\r\n                    checkIfContainerIsRendered();\r\n                }\r\n\r\n                const onClose = () => resolve(undefined)\r\n\r\n                if (container != undefined)\r\n                    this.renderInContainer(id, container, tpl, effects, { onOpen, onClose })\r\n                else\r\n                    this.renderInOverlay(tpl, effects, { onOpen, onClose });\r\n            });\r\n        } finally {\r\n            this.isBusy(false);\r\n            effects.dispose();\r\n        }\r\n    }\r\n\r\n    private renderInContainer(id: string, container: HTMLElement, tpl: string, effects: EffectsContainer, options?: RenderOptions) {\r\n        const $wrapper = $('<div/>');\r\n        $wrapper.html(tpl);\r\n\r\n        const $container = $(container);        \r\n        $container.children().remove();\r\n        $container.append($wrapper);\r\n\r\n        const wrapper = $wrapper[0];\r\n\r\n        ko.applyBindings(this.getTemplateData(), wrapper);\r\n        ko.utils.domNodeDisposal.addDisposeCallback(wrapper, () => {\r\n            options?.onClose?.()\r\n        });\r\n\r\n        const setAddpipeSize = _.once(($addpipe: JQuery) => {\r\n            $addpipe.css({ height: 'auto' });\r\n        });\r\n\r\n        const setAddpipeBodySize = _.once(($addpipeBody: JQuery, $addpipeFooter: JQuery) => {\r\n            $addpipeBody.css({ width: 'auto', height: 'auto' });\r\n            $addpipeFooter.css({ width: 'auto' });\r\n        });\r\n\r\n        effects.register(() => {\r\n            const observer = new MutationObserver(() => {\r\n                const $addpipe = $(`#${id}`, wrapper);\r\n                const $addpipeBody = $(`#pipeVrec-${id}`, wrapper);\r\n                const $addpipeFooter = $(`#pipeMenu-${id}`, wrapper);\r\n\r\n                if ($addpipe.length > 0)\r\n                    setAddpipeSize($addpipe)\r\n\r\n                if ($addpipeBody.length > 0 && $addpipeFooter.length > 0) {\r\n                    setAddpipeBodySize($addpipeBody, $addpipeFooter);\r\n                    observer.disconnect();\r\n                }\r\n            });\r\n\r\n            observer.observe(wrapper, { childList: true, subtree: true });\r\n\r\n            return () => observer.disconnect();\r\n        });\r\n\r\n        effects.register([\r\n            () => ko.removeNode(wrapper)\r\n        ]);\r\n\r\n        options?.onOpen?.();\r\n    }\r\n\r\n    private renderInOverlay(tpl: string, effects: EffectsContainer, options?: RenderOptions) {\r\n        overlayManager.toOverlay(tpl, {\r\n            lock: true,\r\n            buttons: ['close'],\r\n\r\n            data: this.getTemplateData(),\r\n\r\n            onOpen: stage => {\r\n                effects.register(isCreatingAttachment => {\r\n                    stage.isBusy(isCreatingAttachment);\r\n                }, [this.isCreatingAttachment]);\r\n\r\n                //close stage on overlay dispose\r\n                effects.register([\r\n                    () => stage.close()\r\n                ]);\r\n\r\n                options?.onOpen?.();\r\n            },\r\n\r\n            onClose: () => options?.onClose?.()\r\n        });\r\n    }\r\n\r\n    private getTemplateData() {\r\n        return <TemplateData>{\r\n            isBusy: this.isCreatingAttachment\r\n        }\r\n    }\r\n\r\n    private awaitVideo(id: string, params: StringMap<any>, effects: EffectsContainer, initRecorder: Action<[any]>) {\r\n        return new Promise<WCCVideo | undefined>((resolve, reject) => {\r\n            const upload = new WCCUpload({ cancellable: false });\r\n\r\n            PipeSDK.insert(id, params, (recorder: any) => {\r\n                recorder.onDesktopVideoUploadStarted = async (recorderId: string, filename: string, filetype: string, audioOnly: boolean) => {\r\n                    if (recorderId === id) {\r\n                        upload.name(filename);\r\n                        this.uploads.push(upload);\r\n\r\n                        const fileInput = <HTMLInputElement | undefined>document.getElementById(`pipeStartUploading-${recorder.name}`);\r\n\r\n                        if (fileInput != undefined) {\r\n                            const file = fileInput.files?.[0];\r\n\r\n                            if (file != undefined) {\r\n                                const preview = await FilesHelpers.getPreview(file);\r\n\r\n                                upload.width(preview.width);\r\n                                upload.height(preview.height);\r\n                                upload.preview(preview.src);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                recorder.onDesktopVideoUploadProgress = (recorderId: string, percent: number) => {\r\n                    if (recorderId === id)\r\n                        upload.progress(percent);\r\n                }\r\n\r\n                //this event gets fired on selected file upload\r\n                recorder.onDesktopVideoUploadSuccess = (recorderId: string, filename: string, filetype: string, videoId: string, audioOnly: boolean, location: string) => {\r\n                    if (recorderId === id) {\r\n                        this.uploads.remove(upload);\r\n                        resolve(this.createAttachment(location, filename, videoId));\r\n                    }\r\n                }\r\n\r\n                recorder.onDesktopVideoUploadFailed = (recorderId: string, error: string) => {\r\n                    if (recorderId === id) {\r\n                        this.uploads.remove(upload);\r\n                        reject(new Error(error));\r\n                    }\r\n                }\r\n\r\n                recorder.onVideoUploadStarted = async (recorderId: string, filename: string, filetype: string, audioOnly: boolean) => {\r\n                    if (recorderId === id) {\r\n                        upload.name(filename);\r\n                        this.uploads.push(upload);\r\n\r\n                        const fileInput = <HTMLInputElement | undefined>document.querySelector(`#${id} .pipeStartUploading`);\r\n\r\n                        if (fileInput != undefined) {\r\n                            const file = fileInput.files?.[0];\r\n\r\n                            if (file != undefined) {\r\n                                const preview = await FilesHelpers.getPreview(file);\r\n\r\n                                upload.width(preview.width);\r\n                                upload.height(preview.height);\r\n                                upload.preview(preview.src);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                recorder.onVideoUploadProgress = (recorderId: string, percent: number) => {\r\n                    if (recorderId === id)\r\n                        upload.progress(percent);\r\n                }\r\n\r\n                //this event gets fired for mobile upload success - might be needed for direct file uploads on mobile.\r\n                recorder.onVideoUploadSuccess = (recorderId: string, filename: string, filetype: string, videoId: string, audioOnly: boolean, location: string) => {\r\n                    if (recorderId === id) {\r\n                        this.uploads.remove(upload);\r\n                        resolve(this.createAttachment(location, filename, videoId));\r\n                    }\r\n                }\r\n\r\n                recorder.onVideoUploadFailed = (recorderId: string, error: string) => {\r\n                    if (recorderId === id) {\r\n                        this.uploads.remove(upload);\r\n                        reject(new Error(error));\r\n                    }\r\n                }\r\n\r\n                recorder.onSaveOk = (recorderId: string, streamName: string, streamDuration: number, cameraName: string, micName: string, userId: string, audioCodec: string, videoCodec: string, videoId: string, audioOnly: boolean, location: string) => {\r\n                    if (recorderId === id)\r\n                        resolve(this.createAttachment(location, streamName, videoId));\r\n                }\r\n\r\n                recorder.onConnectionClosed = (recorderId: string) => {\r\n                    if (recorderId === id) {\r\n                        system.handleError(messages.UnknownError);\r\n                        reject(new Error('Connection is lost'));\r\n                    }\r\n                }\r\n\r\n                initRecorder(recorder);                \r\n            });\r\n        });\r\n    }\r\n\r\n    private async createAttachment(location: string, streamName: string, videoId?: string) {\r\n        this.isCreatingAttachment(true);\r\n\r\n        try {\r\n            const thumbnailName = `${streamName}.jpg`;\r\n            const thumbnailURL = `${CDN_AWS_ImageURLPrefix}/${AddPipe_Folder}/${thumbnailName}`;\r\n\r\n            const videoName = `${streamName}.mp4`;\r\n            const videoURL = `${CDN_AWS_ImageURLPrefix}/${AddPipe_Folder}/${videoName}`;\r\n\r\n            const [thumbnailResult, videoResult] = await Promise.all([\r\n                this.ctx.userFilesService.queries.addpipeFiles().add({ Link: thumbnailURL, Name: thumbnailName }),\r\n                this.ctx.userFilesService.queries.addpipeFiles().add({ Link: videoURL, Name: videoName, AddPipeId: videoId })\r\n            ]);\r\n\r\n            const attachment = new WCCVideo({\r\n                FileType: enums.AttachmentTypes.Video.value,\r\n                CreateDate: new Date().toISOString(),\r\n\r\n                Files: [\r\n                    {\r\n                        UserFileId: thumbnailResult.FileId,\r\n                        Name: thumbnailName,\r\n                        Extension: 'jpg',\r\n                        Link: thumbnailResult.SignedS3Link, //thumbnailURL,\r\n                        Type: enums.UserFileTypes.PendingVideoThumbnail.value,\r\n                        CreateDate: new Date().toISOString()\r\n                    },\r\n\r\n                    {\r\n                        UserFileId: videoResult.FileId,\r\n                        Name: videoName,\r\n                        Extension: 'mp4',\r\n                        Link: videoResult.SignedS3Link,//videoURL,\r\n                        Type: enums.UserFileTypes.PendingVideo.value,\r\n                        CreateDate: new Date().toISOString()\r\n                    },\r\n                ]\r\n            });\r\n\r\n            return attachment;\r\n        } finally {\r\n            this.isCreatingAttachment(false);\r\n        }\r\n    }\r\n\r\n    private getOverlayTemplate(id: string) {\r\n        return `\r\n<div>\r\n    <div data-bind=\"visible: !isBusy()\">\r\n        <div id=\"${id}\"></div>\r\n    </div>\r\n    <spinner-new params=\"active: isBusy, height: 100, color: '#fff'\"></spinner-new>\r\n</div>`;\r\n    }\r\n}","import { AudioPickerVMConfig } from 'components/audioPicker/audioPicker';\r\nimport WCCAudio from 'models/attachments/audio';\r\nimport overlayManager from './overlay';\r\n\r\ncomponents.preload('audio-recorder');\r\n\r\nexport interface AudioPickerManagerConfig {\r\n    attachmentType?: number\r\n}\r\n\r\nexport default class AudioPickerManager {\r\n    constructor(private config?: AudioPickerManagerConfig) { }\r\n\r\n    pick() {\r\n        return new Promise<WCCAudio | undefined>(resolve => {\r\n            overlayManager.toOverlay('<audio-picker params=\"model: $data\"></audio-recorder>', {\r\n                lock: true,\r\n                buttons: ['close'],\r\n\r\n                data: stage => <AudioPickerVMConfig>{\r\n                    attachmentType: this.config?.attachmentType,\r\n\r\n                    onUploaded: audio => {\r\n                        resolve(audio);\r\n                        stage.close();\r\n                    }\r\n                },\r\n\r\n                onClose: () => resolve(undefined)\r\n            });\r\n        });\r\n    }\r\n}","import { FilesHelpers } from 'helpers/files';\r\nimport { withEffects } from 'mixins/withEffects';\r\nimport AddPipeManager from './addpipe';\r\nimport WCCS3VideoUploader from './uploads/s3/video';\r\nimport QualzyVideoPickerManager from './videoUploaders/qualzyVideoPickerManager';\r\nimport WCCVideoPickerManager from './wccVideoPicker';\r\n\r\nconst { allowedUploadVideoExtensions } = settings;\r\n\r\nexport interface GenericVideoPickerManagerConfig {\r\n    key?: string\r\n}\r\n\r\nexport default class GenericVideoPickerManager {\r\n    private effects = withEffects()\r\n\r\n    private videoUploader: WCCS3VideoUploader\r\n    private addPipe: AddPipeManager\r\n    private wccVideoPicker: WCCVideoPickerManager\r\n    private qualzyVideoPicker: QualzyVideoPickerManager\r\n\r\n    constructor(config: GenericVideoPickerManagerConfig = {}) {\r\n        this.videoUploader = new WCCS3VideoUploader({ key: config.key });\r\n        this.addPipe = this.effects.register(new AddPipeManager(settings.addPipeEnabled));\r\n        this.wccVideoPicker = new WCCVideoPickerManager({ key: config.key });\r\n        this.qualzyVideoPicker = new QualzyVideoPickerManager({ key: config.key });\r\n    }\r\n\r\n    async pick() {\r\n        if (settings.addPipeEnabled) {\r\n            if (settings.useNewVideoUpload) {\r\n                return this.qualzyVideoPicker.pick();\r\n            }\r\n            else if (settings.proxyTaskResources) {\r\n                return await this.wccVideoPicker.pick();\r\n            } else {\r\n                return await this.addPipe.pickVideo();\r\n            }\r\n        } else {\r\n            if (settings.useNewVideoUpload) {\r\n                return this.qualzyVideoPicker.pick();\r\n            }\r\n            else {\r\n                return await this.videoUploader.upload(await FilesHelpers.pickFile(true, allowedUploadVideoExtensions));\r\n            }\r\n        }\r\n    }\r\n\r\n    dispose() {\r\n        this.effects.dispose();\r\n    }\r\n}","import { ThreadContentTypes } from 'enums/comments/contentTypes'\r\nimport { FilesHelpers } from 'helpers/files'\r\nimport { BlobWrapper } from 'interfaces/blobWrapper'\r\nimport { ThreadMedia } from 'interfaces/threadMedia'\r\nimport { ObservableArray, Subscribable, SubscribableOrNullableValue } from 'knockout'\r\nimport AudioPickerManager from 'managers/audioPicker'\r\nimport GenericVideoPickerManager from 'managers/genericVideoPicker'\r\nimport WCCS3AudioUploader from 'managers/uploads/s3/audio'\r\nimport WCCS3FileUploader from 'managers/uploads/s3/file'\r\nimport WCCS3ImageUploader from 'managers/uploads/s3/image'\r\nimport WCCS3VideoUploader from 'managers/uploads/s3/video'\r\nimport { withEffects } from 'mixins/withEffects'\r\nimport WCCAttachment from 'models/attachments/attachment'\r\nimport WCCFile from 'models/attachments/file'\r\nimport WCCImage from 'models/attachments/image'\r\nimport WCCVideo from 'models/attachments/video'\r\nimport { Topic } from 'models/topic'\r\nimport WCCUpload from 'models/upload'\r\n\r\nconst {\r\n    discussionId,\r\n    allowedUploadImageExtensionsForTopicThreads\r\n} = settings\r\n\r\nexport interface TopicMediaManagerConfig {\r\n    topic: SubscribableOrNullableValue<Topic>\r\n}\r\n\r\nexport default class TopicMediaManager {\r\n    private effects = withEffects();\r\n\r\n    private topic: Subscribable<Topic | undefined>\r\n\r\n    private imagesUploader: WCCS3ImageUploader\r\n    private filesUploader: Subscribable<WCCS3FileUploader | undefined>\r\n    private videoUploader: Subscribable<WCCS3VideoUploader | undefined>\r\n    private audioUploader: WCCS3AudioUploader\r\n\r\n    private videoPicker: Subscribable<GenericVideoPickerManager | undefined>\r\n    private audioPicker: AudioPickerManager\r\n\r\n    attachments: ObservableArray<WCCAttachment> = ko.observableArray()\r\n    uploads: Subscribable<Array<WCCUpload>>\r\n    media: Subscribable<Array<ThreadMedia>>\r\n\r\n    images: Subscribable<Array<WCCImage>>\r\n    files: Subscribable<Array<WCCFile>>\r\n    videos: Subscribable<Array<WCCVideo>>\r\n\r\n    isReady: Subscribable<boolean>\r\n\r\n    constructor(config: TopicMediaManagerConfig) {\r\n        this.topic = ko.flattenComputed(config.topic);\r\n\r\n        const s3VideoKey = this.topic.pluck(topic => discussionId + '/' + topic.id());\r\n\r\n        this.imagesUploader = new WCCS3ImageUploader();\r\n        this.filesUploader = this.topic.mapNotNull(topic => new WCCS3FileUploader({ allowMultiple: true, allowedExtensions: topic.allowedAttachmentExtensions() }));\r\n        this.videoUploader = s3VideoKey.mapNotNull(s3VideoKey => new WCCS3VideoUploader({ key: s3VideoKey }));\r\n        this.audioUploader = new WCCS3AudioUploader({ allowMultiple: true });\r\n\r\n        this.videoPicker = s3VideoKey.mapNotNull(s3VideoKey => this.effects.register(new GenericVideoPickerManager({ key: s3VideoKey })));\r\n        this.audioPicker = new AudioPickerManager();\r\n\r\n        this.uploads = ko.pureComputed(() => {\r\n            return [\r\n                this.imagesUploader.uploads(),\r\n                this.videoUploader()?.uploads() ?? [],\r\n                this.filesUploader()?.uploads() ?? [],\r\n                this.audioUploader.uploads()\r\n            ].reduce((result, uploads) => result.concat(uploads), <Array<WCCUpload>>[]);\r\n        });\r\n\r\n        this.media = ko.pureComputed(() => (<Array<ThreadMedia>>this.attachments()).concat(this.uploads()));\r\n\r\n        this.images = this.attachments.filter<WCCImage>(a => a.isImage());\r\n        this.videos = this.attachments.filter<WCCVideo>(a => a.isVideo());\r\n        this.files = this.attachments.filter<WCCFile>(a => a.isFile());\r\n\r\n        this.isReady = ko.pureComputed(() => this.topic() != undefined);\r\n    }\r\n\r\n    pick(type: ThreadContentTypes) {\r\n        switch (type) {\r\n            case 'image':\r\n                this.pickImage();\r\n                break;\r\n            case 'files':\r\n                this.pickFiles();\r\n                break;\r\n            case 'video':\r\n            case 'videoblog':\r\n                this.pickVideo();\r\n                break;\r\n            case 'audio':\r\n                this.pickAudio();\r\n                break;\r\n        }\r\n    }\r\n\r\n    async pickImage() {\r\n        const files = await FilesHelpers.pickFiles(allowedUploadImageExtensionsForTopicThreads);\r\n        files.forEach(file => this.uploadImage(file));\r\n    }\r\n\r\n    async pickFiles() {\r\n        const topic = this.topic();\r\n\r\n        if (topic != undefined) {\r\n            const files = await FilesHelpers.pickFiles(topic.allowedAttachmentExtensions());\r\n            files.forEach(file => this.uploadFile(file));\r\n        }\r\n    }\r\n\r\n    pickVideo() {\r\n        this.videoPicker.invokeNotNull(async videoPicker => {\r\n            try {\r\n                const wccVideo = await videoPicker.pick();\r\n\r\n                if (wccVideo != undefined)\r\n                    this.attachments.push(wccVideo);\r\n            } catch (ex) {\r\n                system.handleError(ex);\r\n            }\r\n        })\r\n    }\r\n\r\n    async pickAudio() {\r\n        try {\r\n            const wccAudio = await this.audioPicker.pick();\r\n\r\n            if (wccAudio != undefined)\r\n                this.attachments.push(wccAudio);\r\n        } catch (ex) {\r\n            system.handleError(ex);\r\n        }\r\n    }\r\n\r\n    async uploadImage(fileOrBlob: File | BlobWrapper) {\r\n        try {\r\n            const wccImage = await this.imagesUploader.upload(fileOrBlob);\r\n\r\n            if (wccImage != undefined)\r\n                this.attachments.push(wccImage);\r\n        } catch (ex) {\r\n            system.handleError(ex);\r\n        }\r\n    }\r\n\r\n    uploadFile(fileOrBlob: File | BlobWrapper) {\r\n        this.filesUploader.invokeNotNull(async filesUploader => {\r\n            try {\r\n                const wccFile = await filesUploader.upload(fileOrBlob);\r\n\r\n                if (wccFile != undefined)\r\n                    this.attachments.push(wccFile);\r\n            } catch (ex) {\r\n                system.handleError(ex);\r\n            }\r\n        });\r\n    }\r\n\r\n    uploadVideo(fileOrBlob: File | BlobWrapper) {\r\n        this.videoUploader.invokeNotNull(async videoUploader => {\r\n            try {\r\n                this.attachments.push(await videoUploader.upload(fileOrBlob));\r\n            } catch (ex) {\r\n                system.handleError(ex);\r\n            }\r\n        });\r\n    }\r\n\r\n    async uploadAudio(fileOrBlob: File | BlobWrapper) {\r\n        try {\r\n            this.attachments.push(await this.audioUploader.upload(fileOrBlob));\r\n        } catch (ex) {\r\n            system.handleError(ex);\r\n        }        \r\n    }\r\n\r\n    removeAttachment(attachment: WCCAttachment) {\r\n        system.confirm(messages.AreYouSureYouWantToDeleteThisFile, () => this.attachments.remove(attachment));\r\n    }\r\n\r\n    dispose() {\r\n        this.effects.dispose();\r\n    }\r\n}","import { BlobWrapper } from 'interfaces/blobWrapper';\r\nimport WCCAudio from 'models/attachments/audio';\r\nimport type WCCUpload from 'models/upload';\r\nimport WCCUploader from '../uploader';\r\nimport transportFactory from './transportFactory';\r\nimport { WCCS3UploadResult } from './uploadResult';\r\n\r\nconst { allowedUploadAudioExtensions } = settings;\r\n\r\nexport interface WCCS3AudioUploaderConfig {\r\n    attachmentType?: number\r\n    allowMultiple?: boolean\r\n}\r\n\nexport default class WCCS3AudioUploader extends WCCUploader<WCCAudio, WCCS3UploadResult> {\n    constructor(private config?: WCCS3AudioUploaderConfig) {\n        super({\n            transport: transportFactory.getTransport({\n                type: 'file',\r\n\r\n                allowMultiple: config?.allowMultiple ?? true,\r\n                allowedExtensions: allowedUploadAudioExtensions\r\n            }),\r\n\r\n            allowedExtensions: allowedUploadAudioExtensions\r\n        });\n    }\n\n    protected getResult(uploadResult: WCCS3UploadResult, upload: WCCUpload, fileOrBlob: File | BlobWrapper) {\n        return new WCCAudio({\n            FileType: this.config?.attachmentType ?? enums.AttachmentTypes.Audio.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                    Type: enums.UserFileTypes.Audio.value,\n                    Link: uploadResult.link,\n                    CreateDate: new Date().toISOString()\n                }\n            ]\n        });\r\n    }\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<WCCVideo, WCCS3UploadResult> {\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 = <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}","import WCCVideo from 'models/attachments/video';\r\nimport { UploadToS3Config, UploadToS3Result } from \"../../components/controls/uploaders/operations/uploadToS3\";\r\nimport { WCCDialogConfig } from '../../components/dialog/dialog';\r\nimport overlayManager from '../overlay';\r\n\r\nconst { allowedUploadVideoExtensions } = settings;\r\n\r\ncomponents.preload('qualzy-s3-file-uploader');\r\n\r\nexport interface QualzyVideoPickerManagerConfig {\r\n    key?: string\r\n}\r\nexport default class QualzyVideoPickerManager {\r\n\r\n    private _totalFilesUploading = 0;\r\n    \r\n    constructor(private config: QualzyVideoPickerManagerConfig) { }\r\n\r\n    pick() {        \r\n        return new Promise<WCCVideo | undefined>(resolve => {            \r\n            overlayManager.toOverlay(`\r\n<wcc-dialog params=\"model: dialog\">\r\n    <qualzy-s3-file-uploader params=\"model: s3FileUploaderConfig\" />\r\n</wcc-dialog>`, {\r\n                lock: true,\r\n\r\n                data: stage => ({\r\n                    dialog: <WCCDialogConfig>{\r\n                        headerText: '',\r\n                        //headerColor: 'transparent',\r\n                        hideFooter: true,\r\n                        showCancelInHeader: true,\r\n                        fitContent: true,\r\n                        animate: true,\r\n                        width: 620,\r\n                        height: 'auto',\r\n                        cancel: ['Close', async () => {\r\n                            if (this._totalFilesUploading > 0) {\r\n                                system.showErrorMessage(labels.PleaseWait);\r\n                            }\r\n                            else {\r\n                                stage.close();\r\n                            }\r\n                        }]                        \r\n                    },\r\n\r\n                    s3FileUploaderConfig: new UploadToS3Config(\r\n                        WCC.Settings.S3Bucket,                                          // bucket\r\n                        WCC.Settings.S3Region,                                          // region\r\n                        \"userfiles/\",                                                   // folder\r\n                        `${WCC.Settings.WccApiUrl}/api/s3/start-single-part-upload`,    // singleFileStartUploadUrl\r\n                        `${WCC.Settings.WccApiUrl}/api/s3/start-multi-part-upload`,     // multiPartFileStartUploadUrl\r\n                        `${WCC.Settings.WccApiUrl}/api/s3/finish-multi-part-upload`,    // multiPartFileFinishUploadUrl\r\n                        false,                                                          // allowMultipleFiles\r\n                        null, //1024 * 1024 * 2                                         // allowedMaxSizeInBytes\r\n                        allowedUploadVideoExtensions.map(ext => `.${ext}`),             // allowedFileExtensions\r\n                        settings.loginToken(),                                          // authToken\r\n                        {\r\n                            //events\r\n                            OnFileUploadStarting: () => {\r\n                                this._totalFilesUploading++;\r\n                            },\r\n                            \r\n                            OnFileUploaded: (result: UploadToS3Result) => {\r\n                                resolve(this.createVideoFromResult(result));\r\n                                // close dialog\r\n                                stage.close();\r\n                            },\r\n                            \r\n                            OnFileUploadComplete: () => {\r\n                                this._totalFilesUploading--;\r\n                            }\r\n                        },\r\n                        true,                                                           // allowVideoRecording\r\n                        false,                                                          // allowAudioRecording\r\n                        false,                                                          // allowScreenRecording\r\n                        false,                                                          // allowScreenAndVideoRecording\r\n                        true                                                            // allow picked files\r\n                    )\r\n                }),\r\n\r\n                onClose: () => resolve(undefined)\r\n            });\r\n        });\r\n    }\r\n\r\n    createVideoFromResult(result: UploadToS3Result): WCCVideo { \r\n        // Note: (DB) - we don't need all the details like width/height/filename here as they get recreated as part of the pipeline processing\r\n        return new WCCVideo({\r\n            FileType: enums.AttachmentTypes.Video.value,\r\n            Link: result.FileUrl,\r\n            UserFileId: result.FileId,\r\n            CDNFileName: this.config.key,\r\n            CreateDate: new Date().toISOString(),\r\n            Files: [    // we need the file as part of the video object so it gets wired up correctly when the thread saves\r\n                {\r\n                    UserFileId: result.FileId,\r\n                    Link: result.FileUrl,\r\n                    Type: enums.UserFileTypes.OriginalVideo.value,\r\n                    CreateDate: new Date().toISOString()\r\n                }\r\n            ]\r\n        });\r\n    }\r\n}","import { WCCVideoPickerVMConfig } from 'components/wccVideoPicker/wccVideoPicker';\r\nimport WCCVideo from 'models/attachments/video';\r\nimport overlayManager from './overlay';\r\n\r\ncomponents.preload('wcc-video-picker');\r\n\r\nexport interface WCCVideoPickerManagerConfig {\r\n    key?: string\r\n}\r\n\r\nexport default class WCCVideoPickerManager {\r\n    constructor(private config: WCCVideoPickerManagerConfig) { }\r\n\r\n    pick() {\r\n        return new Promise<WCCVideo | undefined>(resolve => {\r\n            overlayManager.toOverlay(`<wcc-video-picker params=\"model: $data\"/>`, {\r\n                lock: true,\r\n                buttons: ['close'],\r\n\r\n                data: stage => {\r\n                    return <WCCVideoPickerVMConfig>{\r\n                        key: this.config.key,\r\n\r\n                        onUploaded: video => {\r\n                            resolve(video);\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}","// Module\nvar code = \"<script id=\\\"wcc-components-chat-editor-emojis-tool\\\" type=\\\"text/template\\\">\\r\\n    <wcc-emojispicker params=\\\"pick: pick\\\" component-ready=\\\"false\\\">\\r\\n        <span class=\\\"chat-editor__tool__icon\\\" data-bind=\\\"css: icon\\\"></span>\\r\\n    </wcc-emojispicker>\\r\\n</script>\";\n// Exports\nmodule.exports = code;"],"sourceRoot":""}