@clickview/lite 0.83.0-rc.0 → 0.83.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundles.json +1 -1
- package/dist/css/2074-lite-ac8da6c78b.chunk.css +4 -0
- package/dist/languages/en.json +1 -1
- package/dist/scripts/{1199-01cc084886-lite.chunk.js → 1199-da55d69853-lite.chunk.js} +1 -1
- package/dist/scripts/{1199-01cc084886-lite.chunk.js.map → 1199-da55d69853-lite.chunk.js.map} +1 -1
- package/dist/scripts/1202-d96ad80884-lite.chunk.js +2 -0
- package/dist/scripts/1202-d96ad80884-lite.chunk.js.map +1 -0
- package/dist/scripts/{4208-0706461da6-lite.chunk.js → 1336-1826f6e582-lite.chunk.js} +2 -2
- package/dist/scripts/1336-1826f6e582-lite.chunk.js.map +1 -0
- package/dist/scripts/1938-c52383e98d-lite.chunk.js +3 -0
- package/dist/scripts/1938-c52383e98d-lite.chunk.js.map +1 -0
- package/dist/scripts/2074-39b86b9a22-lite.chunk.js +2 -0
- package/dist/scripts/2074-39b86b9a22-lite.chunk.js.map +1 -0
- package/dist/scripts/{2664-907153c03b-lite.chunk.js → 2664-87c8cbfa7f-lite.chunk.js} +2 -2
- package/dist/scripts/2664-87c8cbfa7f-lite.chunk.js.map +1 -0
- package/dist/scripts/2888-2596e106a5-lite.chunk.js +2 -0
- package/dist/scripts/2888-2596e106a5-lite.chunk.js.map +1 -0
- package/dist/scripts/289-669c0c8222-lite.chunk.js +2 -0
- package/dist/scripts/289-669c0c8222-lite.chunk.js.map +1 -0
- package/dist/scripts/{9911-8892b6dbfe-lite.chunk.js → 3612-8c6423bd51-lite.chunk.js} +2 -2
- package/dist/scripts/{9911-8892b6dbfe-lite.chunk.js.map → 3612-8c6423bd51-lite.chunk.js.map} +1 -1
- package/dist/scripts/3836-bf1359bed7-lite.chunk.js +3 -0
- package/dist/scripts/3836-bf1359bed7-lite.chunk.js.map +1 -0
- package/dist/scripts/3840-98c79fc0d8-lite.chunk.js +2 -0
- package/dist/scripts/3840-98c79fc0d8-lite.chunk.js.map +1 -0
- package/dist/scripts/3893-2856933742-lite.chunk.js +2 -0
- package/dist/scripts/3893-2856933742-lite.chunk.js.map +1 -0
- package/dist/scripts/4006-9dfe9cec1b-lite.chunk.js +3 -0
- package/dist/scripts/4006-9dfe9cec1b-lite.chunk.js.map +1 -0
- package/dist/scripts/{4177-2d876c7b14-lite.chunk.js → 4177-285ddf9ae3-lite.chunk.js} +2 -2
- package/dist/scripts/4177-285ddf9ae3-lite.chunk.js.map +1 -0
- package/dist/scripts/{4578-27028d26eb-lite.chunk.js → 4578-7578bcf17a-lite.chunk.js} +2 -2
- package/dist/scripts/4578-7578bcf17a-lite.chunk.js.map +1 -0
- package/dist/scripts/{4621-7fb0a05bcb-lite.chunk.js → 4621-1f79d94416-lite.chunk.js} +2 -2
- package/dist/scripts/4621-1f79d94416-lite.chunk.js.map +1 -0
- package/dist/scripts/4806-f36469abb7-lite.chunk.js +2 -0
- package/dist/scripts/4806-f36469abb7-lite.chunk.js.map +1 -0
- package/dist/scripts/{4948-ba684e5f4f-lite.chunk.js → 4948-de1c75e7fb-lite.chunk.js} +1 -1
- package/dist/scripts/{4948-ba684e5f4f-lite.chunk.js.map → 4948-de1c75e7fb-lite.chunk.js.map} +1 -1
- package/dist/scripts/4985-bdfa839f8f-lite.chunk.js +2 -0
- package/dist/scripts/4985-bdfa839f8f-lite.chunk.js.map +1 -0
- package/dist/scripts/{5554-f1f3baf822-lite.chunk.js → 5554-17bb3b86fc-lite.chunk.js} +2 -2
- package/dist/scripts/5554-17bb3b86fc-lite.chunk.js.map +1 -0
- package/dist/scripts/5579-a9c152057f-lite.chunk.js +2 -0
- package/dist/scripts/5579-a9c152057f-lite.chunk.js.map +1 -0
- package/dist/scripts/5712-e784cfe89c-lite.chunk.js +2 -0
- package/dist/scripts/5712-e784cfe89c-lite.chunk.js.map +1 -0
- package/dist/scripts/6070-a390fdce21-lite.chunk.js +2 -0
- package/dist/scripts/6070-a390fdce21-lite.chunk.js.map +1 -0
- package/dist/scripts/{6909-ba75701156-lite.chunk.js → 6909-a9b8930e37-lite.chunk.js} +2 -2
- package/dist/scripts/6909-a9b8930e37-lite.chunk.js.map +1 -0
- package/dist/scripts/7401-833bc4a088-lite.chunk.js +2 -0
- package/dist/scripts/7401-833bc4a088-lite.chunk.js.map +1 -0
- package/dist/scripts/{7617-211f084b70-lite.chunk.js → 7617-9d34c841e6-lite.chunk.js} +2 -2
- package/dist/scripts/7617-9d34c841e6-lite.chunk.js.map +1 -0
- package/dist/scripts/7742-342db3ce4f-lite.chunk.js +2 -0
- package/dist/scripts/7742-342db3ce4f-lite.chunk.js.map +1 -0
- package/dist/scripts/7843-f6033528ce-lite.chunk.js +2 -0
- package/dist/scripts/7843-f6033528ce-lite.chunk.js.map +1 -0
- package/dist/scripts/787-dcb3a0a26c-lite.chunk.js +2 -0
- package/dist/scripts/787-dcb3a0a26c-lite.chunk.js.map +1 -0
- package/dist/scripts/8077-bfb3530f78-lite.chunk.js +3 -0
- package/dist/scripts/8077-bfb3530f78-lite.chunk.js.map +1 -0
- package/dist/scripts/{3392-f7f8cb65e5-lite.chunk.js → 8133-ffcff3b7fc-lite.chunk.js} +3 -3
- package/dist/scripts/8133-ffcff3b7fc-lite.chunk.js.map +1 -0
- package/dist/scripts/8364-ff63447d36-lite.chunk.js +3 -0
- package/dist/scripts/8364-ff63447d36-lite.chunk.js.map +1 -0
- package/dist/scripts/8672-6967ce8a23-lite.chunk.js +2 -0
- package/dist/scripts/8672-6967ce8a23-lite.chunk.js.map +1 -0
- package/dist/scripts/{9042-fd7e79b891-lite.chunk.js → 9042-fdc5ecb459-lite.chunk.js} +1 -1
- package/dist/scripts/{9042-fd7e79b891-lite.chunk.js.map → 9042-fdc5ecb459-lite.chunk.js.map} +1 -1
- package/dist/scripts/9295-4242401e60-lite.chunk.js +2 -0
- package/dist/scripts/9295-4242401e60-lite.chunk.js.map +1 -0
- package/dist/scripts/{9742-3f6b75484a-lite.chunk.js → 9742-5f99d74bb0-lite.chunk.js} +2 -2
- package/dist/scripts/9742-5f99d74bb0-lite.chunk.js.map +1 -0
- package/dist/scripts/979-4b893e5603-lite.chunk.js +2 -0
- package/dist/scripts/979-4b893e5603-lite.chunk.js.map +1 -0
- package/dist/scripts/9911-9272b96e46-lite.chunk.js +2 -0
- package/dist/scripts/9911-9272b96e46-lite.chunk.js.map +1 -0
- package/dist/scripts/bundle-dcea87749e.min.js +3 -0
- package/dist/scripts/{bundle-f926852f33.min.js.map → bundle-dcea87749e.min.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/1074-fdce06d863-lite.chunk.js +0 -2
- package/dist/scripts/1074-fdce06d863-lite.chunk.js.map +0 -1
- package/dist/scripts/1938-e067e06dac-lite.chunk.js +0 -3
- package/dist/scripts/1938-e067e06dac-lite.chunk.js.map +0 -1
- package/dist/scripts/2664-907153c03b-lite.chunk.js.map +0 -1
- package/dist/scripts/2970-024b1dd55d-lite.chunk.js +0 -2
- package/dist/scripts/2970-024b1dd55d-lite.chunk.js.map +0 -1
- package/dist/scripts/3392-f7f8cb65e5-lite.chunk.js.map +0 -1
- package/dist/scripts/3836-2c82a9fbf7-lite.chunk.js +0 -3
- package/dist/scripts/3836-2c82a9fbf7-lite.chunk.js.map +0 -1
- package/dist/scripts/3840-59e5e53cda-lite.chunk.js +0 -2
- package/dist/scripts/3840-59e5e53cda-lite.chunk.js.map +0 -1
- package/dist/scripts/4177-2d876c7b14-lite.chunk.js.map +0 -1
- package/dist/scripts/4208-0706461da6-lite.chunk.js.map +0 -1
- package/dist/scripts/4578-27028d26eb-lite.chunk.js.map +0 -1
- package/dist/scripts/4598-8f5266e4c2-lite.chunk.js +0 -2
- package/dist/scripts/4598-8f5266e4c2-lite.chunk.js.map +0 -1
- package/dist/scripts/4621-7fb0a05bcb-lite.chunk.js.map +0 -1
- package/dist/scripts/4806-a6f31d703c-lite.chunk.js +0 -2
- package/dist/scripts/4806-a6f31d703c-lite.chunk.js.map +0 -1
- package/dist/scripts/4985-7e02d5df40-lite.chunk.js +0 -2
- package/dist/scripts/4985-7e02d5df40-lite.chunk.js.map +0 -1
- package/dist/scripts/5554-f1f3baf822-lite.chunk.js.map +0 -1
- package/dist/scripts/5712-7cee70c6b4-lite.chunk.js +0 -2
- package/dist/scripts/5712-7cee70c6b4-lite.chunk.js.map +0 -1
- package/dist/scripts/6550-d99e0ed75d-lite.chunk.js +0 -2
- package/dist/scripts/6550-d99e0ed75d-lite.chunk.js.map +0 -1
- package/dist/scripts/6909-ba75701156-lite.chunk.js.map +0 -1
- package/dist/scripts/7148-1ced1b5dce-lite.chunk.js +0 -2
- package/dist/scripts/7148-1ced1b5dce-lite.chunk.js.map +0 -1
- package/dist/scripts/7568-55e9b01367-lite.chunk.js +0 -3
- package/dist/scripts/7568-55e9b01367-lite.chunk.js.map +0 -1
- package/dist/scripts/7617-211f084b70-lite.chunk.js.map +0 -1
- package/dist/scripts/7742-514844bd1a-lite.chunk.js +0 -2
- package/dist/scripts/7742-514844bd1a-lite.chunk.js.map +0 -1
- package/dist/scripts/7843-cbebf1a786-lite.chunk.js +0 -2
- package/dist/scripts/7843-cbebf1a786-lite.chunk.js.map +0 -1
- package/dist/scripts/8077-870bd8e245-lite.chunk.js +0 -3
- package/dist/scripts/8077-870bd8e245-lite.chunk.js.map +0 -1
- package/dist/scripts/843-4dbc5df109-lite.chunk.js +0 -3
- package/dist/scripts/843-4dbc5df109-lite.chunk.js.map +0 -1
- package/dist/scripts/8735-e74a148502-lite.chunk.js +0 -2
- package/dist/scripts/8735-e74a148502-lite.chunk.js.map +0 -1
- package/dist/scripts/8856-2d332952ae-lite.chunk.js +0 -2
- package/dist/scripts/8856-2d332952ae-lite.chunk.js.map +0 -1
- package/dist/scripts/904-2784e45cfc-lite.chunk.js +0 -2
- package/dist/scripts/904-2784e45cfc-lite.chunk.js.map +0 -1
- package/dist/scripts/9295-eb130a0b17-lite.chunk.js +0 -2
- package/dist/scripts/9295-eb130a0b17-lite.chunk.js.map +0 -1
- package/dist/scripts/9528-4e954d9dff-lite.chunk.js +0 -2
- package/dist/scripts/9528-4e954d9dff-lite.chunk.js.map +0 -1
- package/dist/scripts/9742-3f6b75484a-lite.chunk.js.map +0 -1
- package/dist/scripts/979-6a70a0e616-lite.chunk.js +0 -2
- package/dist/scripts/979-6a70a0e616-lite.chunk.js.map +0 -1
- package/dist/scripts/bundle-f926852f33.min.js +0 -3
- /package/dist/css/{9528-lite-4a892bdbf2.chunk.css → 1202-lite-4a892bdbf2.chunk.css} +0 -0
- /package/dist/css/{7148-lite-856c02f000.chunk.css → 2888-lite-856c02f000.chunk.css} +0 -0
- /package/dist/css/{904-lite-2435a34b13.chunk.css → 289-lite-2435a34b13.chunk.css} +0 -0
- /package/dist/css/{9911-lite-2b4142796a.chunk.css → 3612-lite-2b4142796a.chunk.css} +0 -0
- /package/dist/css/{8856-lite-f8e496136d.chunk.css → 5579-lite-f8e496136d.chunk.css} +0 -0
- /package/dist/css/{6550-lite-45dc286aab.chunk.css → 6070-lite-45dc286aab.chunk.css} +0 -0
- /package/dist/css/{2970-lite-5a317efacd.chunk.css → 787-lite-5a317efacd.chunk.css} +0 -0
- /package/dist/css/{843-lite-db31e36b79.chunk.css → 8364-lite-db31e36b79.chunk.css} +0 -0
- /package/dist/css/{8735-lite-856c02f000.chunk.css → 9911-lite-856c02f000.chunk.css} +0 -0
- /package/dist/scripts/{1938-e067e06dac-lite.chunk.js.LICENSE.txt → 1938-c52383e98d-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{3392-f7f8cb65e5-lite.chunk.js.LICENSE.txt → 3836-bf1359bed7-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{3836-2c82a9fbf7-lite.chunk.js.LICENSE.txt → 4006-9dfe9cec1b-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{7568-55e9b01367-lite.chunk.js.LICENSE.txt → 8077-bfb3530f78-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{8077-870bd8e245-lite.chunk.js.LICENSE.txt → 8133-ffcff3b7fc-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{843-4dbc5df109-lite.chunk.js.LICENSE.txt → 8364-ff63447d36-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{bundle-f926852f33.min.js.LICENSE.txt → bundle-dcea87749e.min.js.LICENSE.txt} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts/3836-bf1359bed7-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/upload/errors/file-type/FileTypeError.ts","file:///app/packages/libs/shared/src/apps/upload/enums/FileLifestyle.ts","file:///app/packages/libs/shared/src/apps/upload/flight-requests/UploadRequests.ts","file:///app/packages/libs/shared/src/apps/upload/errors/internet-connectivity/InternetConnectivityError.ts","file:///app/packages/libs/shared/src/apps/upload/errors/slow-internet/SlowInternetError.ts","file:///app/packages/libs/shared/src/apps/upload/services/DropzoneWrapper.ts","file:///app/packages/libs/shared/src/apps/upload/services/UploadService.ts","file:///app/packages/libs/shared/src/enums/PendingProcessOrigin.ts","file:///app/packages/libs/shared/src/enums/SubtitleExtractionOptions.ts","file:///app/packages/libs/shared/src/enums/VideoOrigin.ts","file:///app/packages/projects/lite/src/apps/upload/services/VideoUploadService.ts"],"sourcesContent":["import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { DialogError } from 'libs/shared/errors/primitives/DialogError';\nimport { DialogOptions } from 'libs/shared/interfaces';\n\n/**\n * TODO: Create a more useful message here.\n * Perhaps using the mime types listen on MDN\n * https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Complete_list_of_MIME_types\n * or in the list of all the official mime types\n * https://www.iana.org/assignments/media-types/media-types.xhtml\n */\nexport class FileTypeError extends DialogError {\n constructor(message: string) {\n super(message);\n }\n\n // @ts-ignore\n public get name(): string {\n return 'FileTypeError';\n }\n\n // @ts-ignore\n public get lang(): string {\n return 'upload.fileType';\n }\n\n // @ts-ignore\n public get dialogOptions(): DialogOptions {\n return {\n title: LanguageService.getPhrase(this.lang, 'heading'),\n text: LanguageService.getPhrase(this.lang, 'body'),\n buttons: [{\n text: LanguageService.getPhrase(this.lang, 'okay'),\n className: 'btn btn-dark',\n success: true\n }, {\n text: LanguageService.getPhrase(this.lang, 'close'),\n className: 'btn btn-link',\n close: true\n }]\n };\n }\n}","export enum FileLifestyle {\n Permanent = 0,\n Temporary = 1\n}","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Flight } from 'libs/common/react/index';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { FileLifestyle } from '../enums/FileLifestyle';\n\nexport const UploadRequests = {\n requestUpload(file: File, fileLifestyle: FileLifestyle): Flight.Request {\n const splitName = file.name.split('.');\n\n const dateExpires = fileLifestyle === FileLifestyle.Permanent\n ? null\n : DateHelper.add(new Date(), 7, 'days').toISOString();\n\n const data = {\n name: splitName.join('.'),\n extension: splitName.length > 1 ? splitName.pop() : '',\n size: file.size,\n lifestyle: fileLifestyle,\n dateExpires,\n contentType: file.type || 'application/octet-stream',\n chunkUploadEnabled: true\n };\n\n return {\n url: `{gateway}/v1/files/upload`,\n key: 'upload:file',\n type: HttpVerbs.POST,\n data\n };\n }\n};","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { DialogError } from 'libs/shared/errors/primitives/DialogError';\nimport { DialogOptions } from 'libs/shared/interfaces';\n\nconst lang = 'upload.internetConnectivityError';\n\nexport class InternetConnectivityError extends DialogError {\n constructor() {\n super(LanguageService.getPhrase(lang, 'title'));\n }\n\n // @ts-ignore\n public get name(): string {\n return 'InternetConnectivityError';\n }\n\n // @ts-ignore\n public get dialogOptions(): DialogOptions {\n return {\n title: LanguageService.getPhrase(lang, 'heading'),\n text: LanguageService.getPhrase(lang, 'body'),\n buttons: [{\n text: LanguageService.getPhrase(lang, 'okay'),\n className: 'btn btn-outline-dark',\n success: true\n }]\n };\n }\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { DialogError } from 'libs/shared/errors/primitives/DialogError';\nimport { DialogOptions } from 'libs/shared/interfaces';\n\nconst lang = 'upload.slowInternetError';\n\nexport class SlowInternetError extends DialogError {\n constructor() {\n super(LanguageService.getPhrase(lang, 'title'));\n }\n\n // @ts-ignore\n public get name(): string {\n return 'SlowInternetError';\n }\n\n // @ts-ignore\n public get dialogOptions(): DialogOptions {\n return {\n title: LanguageService.getPhrase(lang, 'heading'),\n text: LanguageService.getPhrase(lang, 'body'),\n buttons: [{\n text: LanguageService.getPhrase(lang, 'okay'),\n className: 'btn btn-outline-dark',\n success: true\n }]\n };\n }\n}","import { ObjectHash, Radio } from 'backbone';\nimport Dropzone from 'dropzone';\nimport * as _ from 'underscore';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { InternetConnectivityError } from 'libs/shared/apps/upload/errors/internet-connectivity/InternetConnectivityError';\nimport { AlertError } from 'libs/shared/errors/primitives/AlertError';\n\nimport { UploadEventNames } from '../constants/UploadConstants';\nimport { SlowInternetError } from '../errors/slow-internet/SlowInternetError';\n\nexport interface UploadApiWrapperOptions extends Core.ServiceOptions {\n maxFileSize: number;\n chunkSize: number;\n chunkingEnabled: boolean;\n loggingEnabled: boolean;\n acceptedFiles: string;\n channelName: string;\n}\n\nexport interface UploadApiWrapper {\n addFile(file: File): void;\n destroy(): void;\n start(): void;\n getId(file: File): string;\n removeFile(file: File): void;\n}\n\nconst dropzoneEvents: string[] = [\n // 'uploadprogress', 'totaluploadprogress',\n // 'addedfile', 'removedfile', 'thumbnail', 'error', 'processing',\n // 'sending', 'success', 'complete', 'addedfile',\n // 'maxfilesreached', 'maxfilesexceeded', 'processingmultiple',\n // 'sendingmultiple', 'completemultiple', 'canceledmultiple',\n // 'reset', 'queuecomplete'\n];\n\nexport class DropzoneWrapper extends Core.Service implements UploadApiWrapper {\n private dropzone: Dropzone;\n public options: UploadApiWrapperOptions;\n\n private slowInternetTimeout: {[uploadId: string]: number} = {};\n private showSlowInternetTimeout: boolean = true;\n\n // @ts-ignore\n public get name(): string {\n return 'DropzoneWrapper';\n }\n\n constructor(options: UploadApiWrapperOptions) {\n super(options);\n }\n\n public initialize(options: UploadApiWrapperOptions): void {\n const { loggingEnabled } = this.options;\n\n const uploadChannel = Radio.channel(options.channelName);\n\n /**\n * Thought I wouldn't see this in any of our TS\n * Guess I was wrong - sha\n */\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n\n this.dropzone = new Dropzone(document.createElement('div'), {\n url: ((files: Dropzone.DropzoneFile[]) => {\n const file = files[0] as any;\n\n const { ingestUrl } = file.cvUpload;\n\n return ingestUrl;\n }) as any,\n\n chunking: this.options.chunkingEnabled,\n chunkSize: this.options.chunkSize,\n forceChunking: true,\n autoProcessQueue: true,\n maxFilesize: this.options.maxFileSize,\n acceptedFiles: this.options.acceptedFiles,\n paramName: 'content',\n timeout: 180000, // 3 mins in milliseconds\n\n init: function (): void {\n if (!loggingEnabled)\n return;\n\n _.each(dropzoneEvents, (eventName: string) => {\n this.on(eventName, (...args: any[]) => {\n const file = args[0] instanceof File ? args[0].name : args[0];\n console.info(eventName, file, args);\n });\n });\n\n this.on('uploadprogress', (file: File, percentage: number, totalBytes: number) => {\n const progress = totalBytes / file.size * 100;\n uploadChannel.trigger('progress', self.getId(file), progress, totalBytes);\n });\n\n this.on('success', (file: File) => {\n /**\n * This is sort of a hack. It assumes the last chunk will be the last chunk that is uploaded\n * which may not necessarily be the case\n */\n const chunks = (file as any).upload.chunks;\n\n const lastChunk = _.last(chunks) as any;\n\n let xhr = lastChunk.xhr;\n\n if (!xhr)\n xhr = lastChunk.file.xhr;\n\n const response = JSON.parse(xhr.response);\n\n (file as any).cvUpload.fileId = response.id;\n\n uploadChannel.trigger(UploadEventNames.UPLOAD_SUCCESS, file, response);\n });\n\n this.on('error', (file: File, messageObj: ObjectHash, xhr: XMLHttpRequest) => {\n if (xhr && xhr.status === 0) {\n Core.ErrorHelper.throw(new InternetConnectivityError());\n return;\n }\n\n /**\n * Don't throw if the error was caused by canceling\n * the chunk upload. this will happen when the user cancels\n * an upload themselves.\n */\n if ((file as Dropzone.DropzoneFile).status !== 'canceled')\n Core.ErrorHelper.throw(\n new AlertError(LanguageService.getPhrase('upload.services', 'uploadError', {\n fileName: file.name,\n message: messageObj.message\n }))\n );\n });\n\n /**\n * We've increased the upload timeout from 30s to 3mins. This means that the upload\n * will not timeout with an upload speed as slow as 200Kbps. However if a single chunk takes\n * longer than 30s, which is an upload speed of 1Mbps. We'll show a dialog letting the user\n * know that their internet speed is very slow, and the upload may take quite some time.\n * - Sha\n */\n this.on('sending', (file: File) => {\n window.clearTimeout(self.slowInternetTimeout[(file as any).path]);\n\n if (!self.showSlowInternetTimeout)\n return;\n\n self.slowInternetTimeout[(file as any).path] = window.setTimeout(() => {\n if (self.showSlowInternetTimeout)\n Core.ErrorHelper.throw(new SlowInternetError());\n\n self.showSlowInternetTimeout = false;\n }, 30000); // 30s\n });\n\n /**\n * Complete will trigger both on successful uploads and on a cancelled upload.\n */\n this.on('complete', (file: File) => window.clearTimeout(self.slowInternetTimeout[(file as any).path]));\n },\n\n params: (files: Dropzone.DropzoneFile[], xhr: XMLHttpRequest, chunk: any) => {\n if (!chunk)\n return;\n\n return {\n chunk_index: chunk.index,\n upload_length: chunk.file.size\n };\n },\n\n /**\n * These methods are here to disable Dropzone's UI related features\n */\n addedfile: () => {},\n thumbnail: () => {},\n uploadprogress: () => {}\n });\n }\n\n public getId(file: File): string {\n return (file as any).upload.uuid;\n }\n\n public addFile(file: Dropzone.DropzoneFile): void {\n this.dropzone.addFile(file);\n }\n\n public removeFile(file: Dropzone.DropzoneFile): void {\n this.dropzone.removeFile(file);\n }\n\n public start(): void {\n this.dropzone.processQueue();\n }\n\n public destroy(): void {\n this.dropzone.destroy();\n }\n\n public static isValidFile(file: File, acceptedFiles: string): boolean {\n return Dropzone.isValidFile(file, acceptedFiles);\n }\n}","import { Radio } from 'backbone';\nimport { Store } from 'redux';\nimport * as _ from 'underscore';\n\nimport { Caches } from 'libs/common/backbone/constants/Caches';\nimport { CommonServices } from 'libs/common/backbone/constants/CommonServices';\nimport { DataProviders } from 'libs/common/backbone/constants/DataProviders';\nimport { BaseDataService } from 'libs/common/backbone/services/BaseDataService';\nimport { InstanceManager } from 'libs/common/backbone/services/InstanceManager';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ViewModelService } from 'libs/common/backbone/services/ViewModelService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/react/index';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, EntityType, LocationContext, OperationDescriptor, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { UploadEventNames } from 'libs/shared/apps/upload/constants/UploadConstants';\nimport { FileLifestyle } from 'libs/shared/apps/upload/enums/FileLifestyle';\nimport { FileTypeError } from 'libs/shared/apps/upload/errors/file-type/FileTypeError';\nimport { FileExtensions } from 'libs/shared/apps/upload/utils/FileExtensionsHelper';\nimport { SharedServiceChannels } from 'libs/shared/constants/RadioChannels';\nimport { SharedServices } from 'libs/shared/constants/SharedServices';\n\nimport { UploadRequests } from '../flight-requests/UploadRequests';\n\nimport { DropzoneWrapper, UploadApiWrapper } from './DropzoneWrapper';\n\ntype FileUploadRequestResponse = {\n maxChunkSize: number;\n minChunkSize: number;\n uploadExpireDate: string;\n uploadId: string;\n uploadUrl: string;\n}\n\n/**\n * This data service is locally private and is only\n * used by the UploadService to request/cancel uploads from\n * FileApi\n */\nclass UploadDataService extends BaseDataService {\n constructor() {\n super({\n dataProvider: InstanceManager.getInstance(DataProviders.Ajax),\n cache: InstanceManager.getInstance(Caches.Fifo),\n alertService: InstanceManager.getInstance(CommonServices.ALERT)\n });\n }\n\n private incrementingUploadId: number = 0;\n\n // @ts-ignore\n public get name(): string {\n /**\n * This string is not in DataServices because this data service is private.\n */\n return 'UploadDataService';\n }\n\n /**\n * This is not sitting in RadioChannels\n * because it is only used in this file\n */\n // @ts-ignore\n public get channelName(): string {\n return 'private:upload:data:service';\n }\n\n public requestUploads(\n resource: string,\n files: File[],\n fileLifestyle: FileLifestyle,\n fileCallback: (file: File, response: any) => void,\n callback: () => void\n ): void {\n const chain = this.chain();\n\n _.each(files, file => {\n this.incrementingUploadId++;\n\n chain.create({\n resource,\n eventPrefix: `request:upload:${this.incrementingUploadId}`,\n data: this.getFileUploadRequest(file, fileLifestyle),\n callback: (response: any) => {\n fileCallback(file, response);\n },\n errorHandler: this.alertService.error(`Something went wrong while we were uploading your video. Please try again.`)\n });\n });\n\n chain.func(() => {\n callback();\n }).run();\n }\n\n public cancelUpload(uploadId: string, ingestUrl: string, callback?: (response: any) => void): void {\n this.create({\n resource: '/api/upload/cancel',\n eventPrefix: 'cancel:upload',\n data: {\n uploadId, ingestUrl\n },\n callback\n });\n }\n\n private getFileUploadRequest(file: File, fileLifestyle: FileLifestyle): HashObject {\n const splitName = file.name.split('.');\n\n /**\n * TODO: We may need to set the file permanence in file api to\n * permanent for resources and subtitles\n * Check what Prad/Cam say in\n * https://app.asana.com/0/720933954350984/735809491718142\n */\n return {\n name: splitName.join('.'),\n extension: splitName.length > 1 ? splitName.pop() : '',\n fileSize: file.size,\n fileLifestyle\n };\n }\n\n public onDestroy(): void {\n InstanceManager\n .releaseInstance(DataProviders.Ajax)\n .releaseInstance(Caches.Fifo);\n }\n}\n\n\nexport interface UploadItem extends Core.Model {\n file: File;\n name: string;\n progress: number;\n}\n\nexport enum UploadType {\n Video,\n LearningResource,\n Subtitle,\n MixedMedia\n}\n\nconst AcceptedFiles = {\n [UploadType.Video]: FileExtensions.VIDEO,\n [UploadType.LearningResource]: FileExtensions.RESOURCES,\n [UploadType.Subtitle]: FileExtensions.SUBTITLES,\n [UploadType.MixedMedia]: FileExtensions.MIXED_MEDIA\n};\n\nconst ChannelNames = {\n [UploadType.Video]: SharedServiceChannels.VIDEO_UPLOAD,\n [UploadType.LearningResource]: SharedServiceChannels.RESOURCE_UPLOAD,\n [UploadType.Subtitle]: SharedServiceChannels.SUBTITLE_UPLOAD,\n [UploadType.MixedMedia]: SharedServiceChannels.MIXED_MEDIA_UPLOAD\n};\n\nconst CHUNK_SIZE = 1024 * 1024 * 4; // 4mb\nconst MAX_FILE_SIZE = 1024 * 1024 * 1024 * 50; // 50gb\n\nexport interface UploadServiceOptions {\n store?: Store;\n}\n\nclass UploadService extends Core.Service {\n protected options: UploadServiceOptions;\n protected uploadType: UploadType;\n protected fileLifestyle: FileLifestyle;\n\n protected uploader: UploadApiWrapper;\n\n private progressViewModel: Core.Model;\n\n private uploadDataService: UploadDataService;\n\n private collection: Core.Collection<UploadItem>;\n\n public initialize(): void {\n this.uploadDataService = new UploadDataService();\n\n this.progressViewModel = ViewModelService.get(`upload:progress:${this.uploadType}`);\n\n this.bindListeners();\n }\n\n // @ts-ignore\n public get channelName(): string {\n return ChannelNames[this.uploadType];\n }\n\n // @ts-ignore\n public get lang(): string {\n return 'uploadShared.services';\n }\n\n /**\n * Dropzone is initialized once after the first upload is requested and it's chunk size\n * is set for the rest of the uploads. If we happen to have multiple ingest\n * servers that have different chunk max / min sizes, this may voilate those\n * sizes.\n */\n private initUploader(minChunkSize: number, maxChunkSize: number): void {\n if (this.uploader)\n return;\n\n let chunkSize = CHUNK_SIZE;\n\n if (minChunkSize && chunkSize < minChunkSize)\n chunkSize = minChunkSize;\n\n if (maxChunkSize && chunkSize > maxChunkSize)\n chunkSize = maxChunkSize;\n\n this.uploader = new DropzoneWrapper({\n chunkingEnabled: true,\n loggingEnabled: true,\n chunkSize,\n maxFileSize: MAX_FILE_SIZE,\n acceptedFiles: this.getAcceptedFiles(),\n channelName: this.channelName\n });\n }\n\n private bindListeners(): void {\n this.listenTo(this.channelName, 'progress', this.onProgress);\n\n this.listenTo(this.channelName, UploadEventNames.UPLOAD_SUCCESS, this.onSuccess);\n }\n\n private onProgress(id: string, percentage: number, totalUploaded: number): void {\n const model = this.collection.get(id);\n\n if (!model)\n return;\n\n model.set({\n progress: percentage > 100 ? 100 : percentage,\n totalUploaded\n });\n\n this.setOverallProgress();\n }\n\n public isUploading(): boolean {\n return !!this.getCollection().length;\n }\n\n public getCollection(): Core.Collection<UploadItem> {\n if (this.collection)\n return this.collection;\n\n this.collection = new Core.Collection<UploadItem>();\n return this.collection;\n }\n\n public setOverallProgress(): void {\n let totalUploaded = 0;\n let totalFileSize = 0;\n\n const collection = this.getCollection();\n\n if (!collection.length) {\n this.progressViewModel.set({ progress: 0 });\n return;\n }\n\n collection.each((model: Core.Model) => {\n totalUploaded += model.get('totalUploaded') || 0;\n totalFileSize += model.get('file').size || 0;\n });\n\n const percentage = totalUploaded / totalFileSize * 100;\n\n const done = percentage >= 100;\n\n const updateProgress = () => {\n this.progressViewModel.set({\n progress: done ? 100 : percentage,\n done\n });\n };\n\n if (!done) {\n updateProgress();\n return;\n }\n \n /**\n * The ingest backend takes a short while after an upload is done\n * before the complete endpoint will actually response successfully.\n * So this prevents the eager beavers from clicking \"finish\" immediately\n * and having their entire upload session break.\n * - Sha\n */\n window.setTimeout(updateProgress, 2000);\n }\n\n public isValidFile(file: File): boolean {\n return DropzoneWrapper.isValidFile(file, this.getAcceptedFiles());\n }\n\n /**\n * Request uploads from fileApi and starts uploading.\n * @param files Array of browser File objects\n * @returns Returns false if any of the files did not match the accepted file list.\n */\n public addFiles(files: File[], analyticsOptions?: AnalyticsOptions): void {\n if (_.any(files, file => !this.isValidFile(file))) {\n Core.ErrorHelper.throw(\n new FileTypeError(LanguageService.getPhrase(this.lang, 'invalidFileType'))\n );\n return;\n }\n\n this.requestUploads(files, analyticsOptions);\n }\n\n private async requestUploads(files: File[], analyticsOptions?: AnalyticsOptions): Promise<void> {\n const wasUploading = this.isUploading();\n\n const collection = this.getCollection();\n\n for (const file of files) {\n const response = await Flight.fetchAsync<FileUploadRequestResponse>(\n this.options.store.dispatch,\n UploadRequests.requestUpload(file, this.fileLifestyle)\n );\n\n if ('minChunkSize' in response && 'maxChunkSize' in response) {\n this.initUploader(response.minChunkSize, response.maxChunkSize);\n }\n\n (file as any).cvUpload = {\n uploadId: response.uploadId,\n ingestUrl: response.uploadUrl\n };\n\n this.uploader.addFile(file);\n\n let fileName = file.name;\n\n // Remove file extension from filename if video\n if (this.uploadType === UploadType.Video)\n fileName = fileName.replace(/\\.[^/.]+$/, '');\n\n const id = this.uploader.getId(file);\n collection.add({\n id,\n file,\n name: fileName,\n ...this.getAdditionalFileInfo(file, response)\n }, { at: collection.length - 1 });\n }\n\n if (analyticsOptions) {\n AnalyticsHelper.logUserAction({\n uploadCount: files.length\n }, analyticsOptions);\n }\n\n const channel = Radio.channel(this.channelName);\n channel.trigger(UploadEventNames.FILES_ADDED, files, wasUploading);\n }\n\n public addFile(file: File, analyticsOptions: AnalyticsOptions): void {\n this.addFiles([file], analyticsOptions);\n }\n\n public cancelUpload(id: string): void {\n const collection = this.getCollection();\n const model = collection.get(id);\n\n if (!model)\n return;\n\n const file = model.get('file') as any;\n\n this.uploader.removeFile(file);\n collection.remove(model);\n\n this.uploadDataService.cancelUpload(file.cvUpload.uploadId, file.cvUpload.ingestUrl, () => {\n AnalyticsHelper.logUserAction(model.toJSON(), {\n entity: EntityType.Video,\n actionType: UserAction.Upload,\n workflowPhase: WorkflowPhase.Discard,\n descriptor: OperationDescriptor.Single,\n location: LocationContext.MyUploads\n });\n\n Radio.channel(this.channelName).trigger(UploadEventNames.UPLOAD_CANCELLED);\n });\n\n this.setOverallProgress();\n }\n\n protected onSuccess(file: File, response: any): void {\n const fileId = this.uploader.getId(file);\n\n const upload = this.getCollection().get(fileId);\n\n upload.set('fileInfo', response);\n\n AnalyticsHelper.logUserAction({\n id: (file as any).cvUpload.uploadId\n }, {\n entity: EntityType.Video,\n actionType: UserAction.Upload,\n workflowPhase: WorkflowPhase.Complete,\n descriptor: OperationDescriptor.Single,\n location: LocationContext.VideoUpload\n });\n\n const channel = Radio.channel(this.channelName);\n channel.trigger(UploadEventNames.UPLOAD_COMPLETE, upload);\n }\n\n public cancelAllUploads(): void {\n /**\n * We're using model ids and _.each\n * instead of collection.each because this.cancelUpload\n * removes items from the collection which breaks collection.each\n */\n const models = this.getCollection().map(m => m.get('id'));\n _.each(models, m => this.cancelUpload(m));\n }\n\n public getUpload(file: File): Core.Model {\n const fileId = this.uploader.getId(file);\n\n return this.getCollection().get(fileId);\n }\n\n protected getAcceptedFiles(): string {\n return AcceptedFiles[this.uploadType];\n }\n\n // eslint-disable-next-line\n protected getAdditionalFileInfo(file: File, response: any): HashObject {\n return {};\n }\n}\n\nexport class BaseVideoUploadService extends UploadService {\n // @ts-ignore\n protected get uploadType(): UploadType {\n return UploadType.Video;\n }\n\n // @ts-ignore\n public get name(): string {\n return SharedServices.VideoUpload;\n }\n\n // @ts-ignore\n public get fileLifestyle(): FileLifestyle {\n return FileLifestyle.Temporary;\n }\n}\n\nexport class SubtitleUploadService extends UploadService {\n // @ts-ignore\n protected get uploadType(): UploadType {\n return UploadType.Subtitle;\n }\n\n // @ts-ignore\n public get name(): string {\n return SharedServices.SubtitleUpload;\n }\n\n // @ts-ignore\n public get fileLifestyle(): FileLifestyle {\n return FileLifestyle.Permanent;\n }\n}\n\nexport class LearningResourceUploadService extends UploadService {\n // @ts-ignore\n protected get uploadType(): UploadType {\n return UploadType.LearningResource;\n }\n\n // @ts-ignore\n public get name(): string {\n return SharedServices.ResourceUpload;\n }\n\n // @ts-ignore\n public get fileLifestyle(): FileLifestyle {\n return FileLifestyle.Permanent;\n }\n}\n\nexport class MixedMediaUploadService extends UploadService {\n // @ts-ignore\n protected get uploadType(): UploadType {\n return UploadType.MixedMedia;\n }\n\n // @ts-ignore\n public get name(): string {\n return SharedServices.MixedMediaUpload;\n }\n\n // @ts-ignore\n public get fileLifestyle(): FileLifestyle {\n return FileLifestyle.Temporary;\n }\n}","export enum PendingProcessOrigin {\n Upload = 1,\n Tv = 2\n}","export enum SubtitleExtractionOptions {\n ExternalOnly = 0,\n EmbeddedOnly = 1\n}","export enum VideoOrigin {\n IosApp = 1,\n AndroidApp = 2,\n WinApp = 3,\n LibraryPublisher = 4,\n ExchangeClient = 5,\n Online = 6,\n Tinder = 7,\n Cloud247 = 8,\n Livestream = 9,\n Curator = 10,\n LibraryEditor = 11,\n Lite = 12\n}","import { Radio } from 'backbone';\n\nimport { CommonServices } from 'libs/common/backbone/constants/CommonServices';\nimport { AlertType, BaseAlert, BaseAlertService } from 'libs/common/backbone/services/BaseAlertService';\nimport { InstanceManager } from 'libs/common/backbone/services/InstanceManager';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { UploadEventNames } from 'libs/shared/apps/upload/constants/UploadConstants';\nimport { BasePendingItemsService } from 'libs/shared/apps/upload/services/BasePendingItemsService';\nimport { BaseVideoUploadService, UploadServiceOptions } from 'libs/shared/apps/upload/services/UploadService';\nimport { PendingProcessOrigin } from 'libs/shared/enums/PendingProcessOrigin';\nimport { SettingName, SettingsLookup } from 'libs/shared/enums/SettingName';\nimport { SubtitleExtractionOptions } from 'libs/shared/enums/SubtitleExtractionOptions';\nimport { VideoOrigin } from 'libs/shared/enums/VideoOrigin';\nimport { CurrentUser } from 'libs/shared/interfaces';\nimport { ContextService } from 'libs/shared/services/ContextService';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { DataServices, Services } from 'shared/constants/Services';\nimport { FlightUserDataService } from 'shared/services/FlightUserDataService';\nimport { LeftNavHelper } from 'shared/utils/LeftNavHelper';\n\nimport { CombinedUploadStatus } from './CombinedUploadsStatus';\nimport { FlightVideoUploadDataService } from './FlightVideoUploadDataService';\n\nconst getPhrase = LanguageService.encloseNamespace('upload.services');\n\ninterface VideoUploadServiceOptions extends UploadServiceOptions {\n}\n\nexport class VideoUploadService extends BaseVideoUploadService {\n private videoUploadDataService: FlightVideoUploadDataService;\n private pendingItemsService: BasePendingItemsService;\n private userDataService: FlightUserDataService;\n private alertService: BaseAlertService;\n public options: VideoUploadServiceOptions;\n\n constructor(options: VideoUploadServiceOptions) {\n super(options);\n }\n\n public initialize(): void {\n super.initialize();\n\n this.videoUploadDataService = InstanceManager.getInstance(DataServices.VideoUpload, this);\n this.pendingItemsService = InstanceManager.getInstance(Services.PendingItems, this);\n this.userDataService = InstanceManager.getInstance(DataServices.FlightUser, this);\n this.alertService = InstanceManager.getInstance(CommonServices.ALERT, this);\n\n this.listenTo(this.channelName, UploadEventNames.FILES_ADDED, this.onUploadStart);\n this.listenTo(this.channelName, UploadEventNames.UPLOAD_COMPLETE, this.unlockNav);\n this.listenTo(this.channelName, UploadEventNames.UPLOAD_CANCELLED, this.unlockNav);\n }\n\n private onUploadStart(files: FileList): void {\n const alert: BaseAlert = {\n type: AlertType.Success,\n heading: getPhrase('startUploadAlertHeading'),\n message: files.length === 1\n ? getPhrase('startUploadSingleAlertBody', { videoName: files[0].name })\n : getPhrase('startUploadMultipleAlertBody', { uploadCount: files.length })\n };\n\n const { appLink: currentAppLink } = ContextService.getCurrentContext();\n\n const uploadAppLinks = LeftNavHelper.getMyVideosAppLinks();\n const inUploadApp = !!uploadAppLinks.find(a => (\n currentAppLink.application === a.application && currentAppLink.action === a.action\n ));\n\n // If the user is not on the \"My Videos\" page, add an applink to the alert\n if (!inUploadApp) {\n alert.appLinkText = getPhrase('startUploadAlertAppLinkText', { smartCount: files.length });\n alert.appLink = {\n application: AppChannels.MY_VIDEOS,\n action: Actions.MyVideos.MY_VIDEOS\n };\n alert.appLinkClassName = 'info-link';\n }\n\n this.alertService.createAlert(alert);\n }\n\n private unlockNav(): void {\n const collection = this.getCollection();\n\n if (collection.some(upload => upload.get('progress') < 100))\n return;\n\n Radio.channel(this.channelName).trigger(UploadEventNames.UNLOCK_NAV);\n }\n\n private completeUpload(upload: Core.Model, response: any): void {\n upload.set('sending', true);\n\n this.userDataService.getCurrentUser((user: CurrentUser) => {\n this.userDataService.getCustomerSettings(user, (settings: SettingsLookup) => {\n this.userDataService.getWorkspace((workspace: HashObject) => {\n const uploadData = {\n id: upload.get('id'),\n userId: user.id,\n customerId: user.customerId,\n libraryId: workspace.id,\n categoryId: upload.get('categoryId') || null,\n pendingProcessOrigin: PendingProcessOrigin.Upload,\n origin: VideoOrigin.Lite,\n fileId: response.id,\n subtitleOptions: {\n subtitleExtractOptions: SubtitleExtractionOptions.EmbeddedOnly\n },\n video: { name: upload.get('name'), description: upload.get('description') },\n autoCaption: !!settings[SettingName.AutoCaptioning].value\n };\n\n const success = (item: any) => {\n upload.set('pendingProcessId', item.pendingProcessId);\n \n this.pendingItemsService.forceFetchPendingItems({\n resetTimeout: true\n });\n };\n\n const error = () => {\n upload.set('status', CombinedUploadStatus.Errored);\n upload.set('sending', false);\n\n this.alertService.createAlert({\n type: AlertType.Fail,\n heading: getPhrase('uploadErrorAlertHeading'),\n message: getPhrase('errorAlertMessage', { videoName: upload.get('name') })\n });\n };\n\n this.videoUploadDataService.completeVideoUpload(uploadData, success, error);\n });\n });\n });\n }\n\n protected onSuccess(file: File, response: any): void {\n super.onSuccess(file, response);\n\n const upload = this.getUpload(file);\n\n /**\n * editingMetadata is set by the EditUploadView.\n * If it's set, we wait till the user is done editing the metadata before\n * we post the data\n */\n if (upload.get('editingMetadata')) {\n this.listenToOnce(upload, 'change:editingMetadata', () => {\n this.completeUpload(upload, response);\n });\n } else {\n this.completeUpload(upload, response);\n }\n }\n\n // eslint-disable-next-line\n protected getAdditionalFileInfo(file: File, response: any): HashObject {\n const { appLink } = ContextService.getCurrentRoute();\n\n if (appLink.application !== AppChannels.MY_VIDEOS || appLink.action !== Actions.MyVideos.MY_VIDEOS_FOLDER)\n return {};\n\n return {\n categoryId: +appLink.args[0]\n };\n }\n}\n"],"names":["FileTypeError","message","title","this","lang","text","buttons","className","success","close","FileLifestyle","UploadRequests","file","fileLifestyle","splitName","name","split","dateExpires","Permanent","DateHelper","Date","toISOString","data","join","extension","length","pop","size","lifestyle","contentType","type","chunkUploadEnabled","url","key","HttpVerbs","InternetConnectivityError","LanguageService","DialogError","SlowInternetError","dropzoneEvents","DropzoneWrapper","options","slowInternetTimeout","showSlowInternetTimeout","loggingEnabled","uploadChannel","Radio","channelName","self","dropzone","document","createElement","files","cvUpload","ingestUrl","chunking","chunkingEnabled","chunkSize","forceChunking","autoProcessQueue","maxFilesize","maxFileSize","acceptedFiles","paramName","timeout","init","eventName","on","args","File","console","info","percentage","totalBytes","progress","trigger","getId","chunks","upload","lastChunk","xhr","response","JSON","parse","fileId","id","messageObj","status","AlertError","fileName","window","clearTimeout","path","setTimeout","params","chunk","chunk_index","index","upload_length","addedfile","thumbnail","uploadprogress","uuid","addFile","removeFile","processQueue","destroy","UploadType","UploadDataService","dataProvider","InstanceManager","DataProviders","cache","Caches","alertService","CommonServices","incrementingUploadId","resource","fileCallback","callback","chain","create","eventPrefix","getFileUploadRequest","errorHandler","error","func","run","uploadId","fileSize","releaseInstance","BaseDataService","B","AcceptedFiles","Video","LearningResource","Subtitle","MixedMedia","ChannelNames","UploadService","uploadDataService","progressViewModel","ViewModelService","uploadType","bindListeners","minChunkSize","maxChunkSize","uploader","getAcceptedFiles","listenTo","onProgress","onSuccess","totalUploaded","model","collection","get","set","setOverallProgress","getCollection","totalFileSize","each","done","updateProgress","isValidFile","analyticsOptions","requestUploads","wasUploading","isUploading","store","dispatch","initUploader","uploadUrl","replace","add","getAdditionalFileInfo","at","AnalyticsHelper","uploadCount","addFiles","remove","cancelUpload","toJSON","entity","actionType","workflowPhase","descriptor","location","models","map","m","BaseVideoUploadService","SharedServices","Temporary","SubtitleUploadService","LearningResourceUploadService","MixedMediaUploadService","PendingProcessOrigin","SubtitleExtractionOptions","VideoOrigin","getPhrase","VideoUploadService","videoUploadDataService","pendingItemsService","Services","userDataService","onUploadStart","unlockNav","alert","heading","videoName","currentAppLink","ContextService","appLink","LeftNavHelper","find","a","application","action","appLinkText","smartCount","appLinkClassName","createAlert","some","getCurrentUser","user","getCustomerSettings","settings","getWorkspace","workspace","uploadData","userId","customerId","libraryId","categoryId","pendingProcessOrigin","Upload","origin","Lite","subtitleOptions","subtitleExtractOptions","EmbeddedOnly","video","description","autoCaption","SettingName","value","completeVideoUpload","item","pendingProcessId","forceFetchPendingItems","resetTimeout","getUpload","listenToOnce","completeUpload"],"sourceRoot":""}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[3840],{22406:(e,t,n)=>{n.d(t,{r:()=>u});var a=n(32735),r=n(23481),i=n(83914),o=n(36532),l=n(35223);const s={tag:"XRj8d",tooltip:"X6mLk"};var c="specialEventCalendar.comingSoonTag";function u(e){return a.createElement(o.u,{title:r.T.getPhrase(c,"tooltip"),spanHackClassName:"d-block ".concat(s.tooltip),spanHack:!0},a.createElement("div",{className:"d-flex text-dark align-items-center ".concat(s.tag," ").concat(e.className)},a.createElement(i.x,{svgName:l.vn.Timer}),!e.onlyIcon&&r.T.getPhrase(c,"comingSoon")))}},78408:(e,t,n)=>{n.d(t,{s:()=>o});var a=n(32735),r=n(15611);const i={dateItem:"I3SBm",label:"PRORs",body:"RfiM_",bodyDay:"ZOVny",bodyRange:"vYhXN",bodyMonth:"mYslO",month:"EPkkQ"};function o(e){var t,n,o;return a.createElement(r.F,{appLink:null===(t=e.getAppLink)||void 0===t?void 0:t.call(e),className:"text-decoration-none text-center bg-white text-dark border border-3 ".concat(null===(n=e.theme)||void 0===n?void 0:n.border," rounded-3 d-block fw-semibold ").concat(e.className),analyticsData:e.analyticsData,analyticsOptions:e.analyticsOptions},a.createElement("div",{className:"position-relative ".concat(i.dateItem)},a.createElement("div",{className:"".concat(null===(o=e.theme)||void 0===o?void 0:o.background," py-1 ").concat(i.label," d-flex align-items-center justify-content-center")},e.label?e.label:a.createElement(a.Fragment,null," ")),a.createElement("div",{className:"".concat(function(){switch(e.body.type){case"range":return i.bodyRange;case"day":return i.bodyDay;case"month":return i.bodyMonth}}()," ").concat(i.body," my-2")},e.body.text),a.createElement("div",{className:"mb-0 ".concat(i.month)},e.month)))}},49087:(e,t,n)=>{n.d(t,{G:()=>i});var a=n(1048),r=n(4594),i={isPlaylist:function(e){return(null==e?void 0:e.typeId)===r.E.Playlist},isOwner:function(e,t){var n;return!(!t||!e||a.t.isEmpty(e._liteOwner))&&e._liteOwner.id.toString()===(null===(n=t.id)||void 0===n?void 0:n.toString())},getVideoCount:function(e){var t,n,a;if(e){var r=0;return(null===(t=e.videos)||void 0===t?void 0:t.count)&&(r+=e.videos.count),(null===(n=e.clips)||void 0===n?void 0:n.count)&&(r+=e.clips.count),(null===(a=e.interactives)||void 0===a?void 0:a.count)&&(r+=e.interactives.count),r}}}},67814:(e,t,n)=>{n.d(t,{p:()=>k,v:()=>P});var a=n(32735),r=n(110),i=n(50690),o=n(22406),l=n(78408),s=n(83657),c=n(23481),u=n(15611),d=n(83914),m=n(35223),p="shared.backButton";function f(e){var t=Object.assign({textShadow:!0},e),n=t.backToName,r=t.appLink,i=t.color,o=t.extraClasses,l=t.textShadow,s=n?c.T.getPhrase(p,"backTo",{backToName:n}):c.T.getPhrase(p,"back"),f="black"===i?"":"text-white",v=l?"text-shadow":"";return a.createElement(u.F,{appLink:r,className:"d-inline-flex align-items-center h5 mb-0 ".concat(o," ").concat(f," ").concat(v)},a.createElement(d.x,{svgName:m.vn.ChevronLeft,size:d.S.Medium}),a.createElement("span",{className:"ms-1"},s))}f.defaultProps={color:"black",extraClasses:""};var v=n(4527),y=n(83345),g=n(7733),h=n(10587),b=n(94232),C=n(54610),w=n(79967),S=n(9085),E=n(67453);const I={bannerContent:"sSCTB",actionsContainer:"Z5WI2",bannerContentWithLogo:"rgs7Q",container:"M51HJ",logoContainer:"vkeJk",logoContainerLeft:"M3U9B",logoHeading:"EtRwC",specialEventContainer:"rOxDc",headingLarge:"_8pnV",heading:"JXVBH"};var A="".concat(h.y[C.__.Banners].width,":").concat(h.y[C.__.Banners].height);function O(e){return e.length<160?"h1":I.headingLarge}var k=a.memo(function(e){var t,n,c,u,d=e.heading,m=e.banner,p=e.imageCdnUrl,h=e.actions,k=e.sortComponent,P=e.blockColourClass,L=e.specialEvent,N=a.useContext(b.n),x=(0,w.k)().xxl?1920:1200,j=a.useMemo(function(){if(!L||e.showComingSoon)return!1;var t=r.O.format(new Date,"YYYY-MM-DD");return L.endDate?L.startDate<=t&&L.endDate>=t:L.startDate===t},[L]),F=e.imageOptions||{width:x,ratio:A,resizeType:C.Nq.Cover},T=!!m&&!!p&&E.j.createBannerUrl(m,{fallbackBaseUrl:p,fallbackCategoryName:d,type:C.__.Banners},F),V={className:"banner banner-header ".concat(e.bannerClassName),style:T?{backgroundImage:"url('".concat(T,"')")}:{}};!m&&P&&(delete V.style,V.className+=" ".concat(P));var D=e.detailsComponent,M=(0,S.x)(e.heading,g.o);return i.b.renderInPortalIfExists(a.createElement("header",Object.assign({},V),a.createElement("div",{className:"container ".concat(I.container," position-relative inner-banner")},e.backButtonAppLink&&a.createElement("div",{className:"pt-3"},a.createElement(f,{appLink:e.backButtonAppLink,backToName:e.backButtonText,extraClasses:e.backButtonClasses,color:"white"})),a.createElement("div",{className:"".concat(e.alignLogoLeft?"position-absolute top-50 start-0 translate-middle-y w-100 ps-4":"".concat(I.bannerContent," px-2 ").concat((null===(t=e.logo)||void 0===t?void 0:t.url)?I.bannerContentWithLogo:""))},!!L&&a.createElement("div",{className:"position-relative ".concat(I.specialEventContainer)},a.createElement(l.s,{body:{type:L.endDate?"range":"day",text:L.endDate?"".concat(r.O.format(L.startDate,"DD"),"-").concat(r.O.format(L.endDate,"DD")):r.O.format(L.startDate,"DD")},month:function(e){return e.endDate?r.O.isSame(e.startDate,e.endDate,"month")?r.O.format(e.startDate,"MMMM"):"".concat(r.O.format(e.startDate,"MMM")," - ").concat(r.O.format(e.endDate,"MMM")):r.O.format(e.startDate,"MMMM")}(L),theme:e.calendarTheme})),a.createElement("div",null,j&&a.createElement("div",{className:"rounded-pill py-1 px-2 my-1 me-1 fw-semibold bg-light-blue lh-1 d-inline-block"},a.createElement(y.x,{namespace:"shared.bannerHeader",phrase:"onToday"})),e.showComingSoon&&a.createElement(o.r,{className:"pe-2 fw-semibold mb-1 rounded-pill justify-content-start text-nowrap"}),a.createElement("div",{className:"d-flex align-items-center"},e.alignLogoLeft&&(null===(n=e.logo)||void 0===n?void 0:n.url)&&a.createElement("div",{className:"".concat(I.logoContainerLeft," d-none d-md-block rounded-circle overflow-hidden me-3 ").concat(M)},a.createElement(v.w,{src:E.j.createUrl(null===(c=e.logo)||void 0===c?void 0:c.url,{size:C.h2.Medium}),style:{backgroundColor:e.logoBgColour}})),a.createElement("h1",{className:"text-white text-shadow pe-3 position-static ".concat(I.heading," ").concat(O(d)," ").concat(e.alignLogoLeft?"w-50":"")},d,D&&a.createElement(D,null)))),!!h&&a.createElement("div",{className:I.actionsContainer},a.createElement(s.e,{actions:h,sortComponent:k,actionsDropdownClassName:e.actionsDropdownClassName}))),!e.alignLogoLeft&&!!(null===(u=e.logo)||void 0===u?void 0:u.url)&&a.createElement("div",{className:I.logoContainer},a.createElement("img",{src:E.j.createUrl(e.logo.url,{size:C.h2.Medium}),className:"rounded-circle"})))),null==N?void 0:N.container)},function(e,t){var n,a;return e.actions===t.actions&&e.heading===t.heading&&(null===(n=e.logo)||void 0===n?void 0:n.url)===(null===(a=t.logo)||void 0===a?void 0:a.url)});function P(){var e=a.useContext(b.n);return i.b.renderInPortalIfExists(a.createElement("div",{className:"partial-banner partial-loading-background ".concat(I.banner)}),null==e?void 0:e.container)}},94644:(e,t,n)=>{n.d(t,{r:()=>u});var a=n(50242),r=n(81886),i=n(67058),o=n(14553),l=n(49267),s=n(49075),c={notFound:i.d,forbidden:{rating:o.q,yearLevel:o.q,region:l.a,privacy:o.q},badRequest:s._,internalServerError:s._};function u(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e){var i;i="number"==typeof e?e:e.status;var o=Object.assign(Object.assign({},c),t);i&&r.Q.Ry.isStatusCodeError(i)&&(i!==a.o.InternalServer?i!==a.o.NotFound?i!==a.o.Forbidden?n.badRequest||r.Q.Ry.throw(new o.badRequest):n.forbidden||r.Q.Ry.throw(new o.forbidden.privacy):n.notFound||r.Q.Ry.throw(new o.notFound):n.internalServerError||r.Q.Ry.throw(new s._))}}},39902:(e,t,n)=>{n.d(t,{FN:()=>f,SW:()=>v,fh:()=>p});var a=n(32735),r=n(20354),i=n(75896);function o(e){return function(e){if(Array.isArray(e))return s(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||l(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function l(e,t){if(e){if("string"==typeof e)return s(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(e,t):void 0}}function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}function c(e){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},c(e)}function u(e,t,n){return(t=function(e){var t=function(e){if("object"!=c(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=c(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==c(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var d=function(e,t){var n={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&t.indexOf(a)<0&&(n[a]=e[a]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(a=Object.getOwnPropertySymbols(e);r<a.length;r++)t.indexOf(a[r])<0&&Object.prototype.propertyIsEnumerable.call(e,a[r])&&(n[a[r]]=e[a[r]])}return n},m=50;function p(e,t){var n=i.m.chunk(e,m).map(function(e){return t(i.m.uniq(e))}),a=r.a.useBasicFetchAll(n),o=i.m.flatten(a.data),l=a.data.length?o.reduce(function(e,t){return Object.assign(Object.assign({},e),u({},t.id,t))},{}):null;return{itemsArr:o,items:l,isFetching:a.isFetching,hasCompleted:a.hasCompleted}}function f(e,t,n){var r=null!=n?n:function(e){return"object"===c(e)?e.id:e},i=v({getRequest:t,_getKey:n}),o=i.fetchItems,l=d(i,["fetchItems"]);return a.useEffect(function(){(null==e?void 0:e.length)&&o(e)},[null==e?void 0:e.map(r).join(",")]),l}function v(e){var t,n,s,d,p,f=null!==(t=e._getKey)&&void 0!==t?t:function(e){return"object"===c(e)?e.id:e},v=a.useRef(new Set),y=(d=a.useState([]),p=2,function(e){if(Array.isArray(e))return e}(d)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,i,o,l=[],s=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(a=i.call(n)).done)&&(l.push(a.value),l.length!==t);s=!0);}catch(e){c=!0,r=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(c)throw r}}return l}}(d,p)||l(d,p)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),g=y[0],h=y[1],b=r.a.useBasicFetchAll(g),C=i.m.flatten(b.data),w=b.data.length?C.reduce(function(e,t){return Object.assign(Object.assign({},e),u({},f(t),t))},{}):null;return{hasFirstRequestCompleted:!!(null===(s=null===(n=b.responses)||void 0===n?void 0:n[0])||void 0===s?void 0:s.hasCompleted),itemsArr:C,items:w,isFetching:b.isFetching,fetchItems:function(t){if(null==t?void 0:t.length){var n=[];t.forEach(function(e){var t=f(e);v.current.has(t)||(n.push(e),v.current.add(t))}),n.length&&h(function(t){return[].concat(o(t),o(i.m.chunk(n,m).map(e.getRequest)))})}}}}},91286:(e,t,n)=>{n.d(t,{v:()=>o});var a=n(32735),r=n(94644);function i(e){return e.map(function(e){return e.statusCode}).join(":")}function o(e,t,n){var o=Array.isArray(e)?e:[e];(0,a.useEffect)(function(){o.forEach(function(e){(0,r.r)(e.statusCode,t,n)})},[i(o),t,n])}},60115:(e,t,n)=>{n.d(t,{K:()=>c});var a=n(32735),r=n(50242),i=n(91967),o=400,l=n(45719);function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}function c(e,t,n,c,u,d){var m,p,f,v,y=(m=(0,a.useState)(0),p=2,function(e){if(Array.isArray(e))return e}(m)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,i,o,l=[],s=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(a=i.call(n)).done)&&(l.push(a.value),l.length!==t);s=!0);}catch(e){c=!0,r=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(c)throw r}}return l}}(m,p)||function(e,t){if(e){if("string"==typeof e)return s(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(e,t):void 0}}(m,p)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),g=y[0],h=y[1],b=t,C=(0,l.P)(function(t){if(!e)return null;var n=e(t);return n?n.key:null},c,u);return f={fetchNextPage:function(){if(t&&e&&C)return h(function(e){return e+1}),b(C.nextCursor)},hasMore:!!(null==C?void 0:C.nextCursor),isFetching:null==C?void 0:C.isFetching,scrollContainer:d},v=function(){if(!f.isFetching){if(f.scrollContainer){var e=f.scrollContainer;if(e.getBoundingClientRect().height+e.scrollTop<e.scrollHeight-o)return}else if(window.innerHeight+document.documentElement.scrollTop<document.documentElement.scrollHeight-o)return;f.fetchNextPage()}},(0,a.useEffect)(function(){var e=i.q.throttle(v,200),t=f.scrollContainer||window;return f.hasMore&&t.addEventListener("scroll",e),function(){return t.removeEventListener("scroll",e)}},[f.hasMore,f.fetchNextPage,f.scrollContainer]),(0,a.useEffect)(function(){C&&C.shouldInitialFetch&&t&&(b(),h(function(e){return e+1}))},[null==C?void 0:C.shouldInitialFetch,t]),(0,a.useEffect)(function(){var e,t;if((null==C?void 0:C.statusCode)&&i.q.isFunction(n)){var a=+(null===(t=null===(e=C.statusCode)||void 0===e?void 0:e.toString())||void 0===t?void 0:t.substr(0,1));a!==r.k.ClientError&&a!==r.k.ServerError||n(g,C.statusCode)}},[null==C?void 0:C.statusCode]),{items:null==C?void 0:C.items,hasMore:!!(null==C?void 0:C.nextCursor),nextCursor:null==C?void 0:C.nextCursor,isFetching:null==C?void 0:C.isFetching,totalItems:null==C?void 0:C.totalItems,hasFirstPageCompleted:null==C?void 0:C.hasFirstPageCompleted}}},63719:(e,t,n)=>{n.d(t,{h:()=>l});var a=n(32735),r=n(77316);function i(e,t){if(e){if("string"==typeof e)return o(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?o(e,t):void 0}}function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}function l(e){var t,n,l=(t=a.useMemo(function(){return r.p.getBuilder()},[]),n=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,i,o,l=[],s=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(a=i.call(n)).done)&&(l.push(a.value),l.length!==t);s=!0);}catch(e){c=!0,r=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(c)throw r}}return l}}(t,n)||i(t,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),s=l[0],c=(0,l[1])(s);return c&&e?[].concat(function(e){return function(e){if(Array.isArray(e))return o(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||i(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(c),[Object.assign(Object.assign({},e),{active:!0})]):c}},93840:(e,t,n)=>{n.r(t),n.d(t,{PlaylistView:()=>Ve});var a=n(32735),r=n(70680),i=n(23481),o=n(81886),l=n(20354),s=n(65858),c=n(49087),u=n(87801),d=n(51365),m=n(183),p=n(89454),f=n(21750),v=n(39151),y=n(1666),g=n(5112),h=n(31949),b=n(69883),C=n(63719),w=n(56520),S=n(91286),E=n(60115),I=n(22902);function A(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var O=n(79612),k=n(76753),P=n(54569),L=n(31908),N=n(14070),x=n(97291),j=n(58321),F=n(7179),T=n(97816),V=n(10741),D=n(33192),M=n(22490),U=n(110),B=n(28400),R=n(97392),_=n(83345),G="playlists.playlistHeaderDetails",H=function(e){var t=e.className;return a.createElement("span",{className:t},"•")};function q(e){var t=e._liteOwner;if(t)return t.name&&t.surname?B.m.toTitleCase(t.name+" "+t.surname.substring(0,1)):t.name?t.name.split(" ")[0]:void 0}function Y(e){var t,n,r=c.G.isOwner(e.playlist,e.currentUser),i=null===(t=e.playlist.followers)||void 0===t?void 0:t.count,o=function(e){if(!e.contentModifiedDate)return"";var t=new Date,n=U.O.convertUTCToLocal(e.contentModifiedDate);return U.O.isBefore(n,U.O.subtract(t,1,"month"))?"":U.O.fromNow(n)}(e.playlist);return a.createElement("div",{className:e.detailsClassName},!e.hideOwnerName&&!r&&a.createElement(a.Fragment,null,(null===(n=e.playlist._isClickViewCurated)||void 0===n?void 0:n.value)?a.createElement(a.Fragment,null,a.createElement("div",{className:e.clickViewAvatarClassName},a.createElement(R.F,null)),a.createElement("span",null,"ClickView")):a.createElement(_.x,{namespace:G,phrase:"createdBy",options:{user:q(e.playlist)}}),a.createElement(H,{className:e.separatorClassName})),"number"==typeof e.totalVideos&&a.createElement(_.x,{namespace:G,phrase:"videos",options:{smartCount:e.totalVideos}}),i>0&&a.createElement(a.Fragment,null,a.createElement(H,{className:e.separatorClassName}),a.createElement(_.x,{namespace:G,phrase:"followers",options:{smartCount:i}})),!!o&&a.createElement(a.Fragment,null,a.createElement(H,{className:e.separatorClassName}),a.createElement(_.x,{namespace:G,phrase:"lastUpdated",options:{timeAgo:o}})))}var Q=n(67814),W=n(49935),$=n(7733),z=n(86764),X=n(16714),Z=n(3747),J=n(37802),K=n(9085),ee=n(46390),te=n(12909);const ne={partialDescription:"vDX0m"};function ae(){return a.createElement(a.Fragment,null,a.createElement(Q.v,null),a.createElement("div",{className:"mb-2"},a.createElement("div",{className:"partial-loading-background my-2 border-bottom ".concat(ne.partialDescription)})))}var re=n(49985),ie=n(80783),oe=n(35223),le=n(40254),se=i.T.encloseNamespace("playlists.playlistHeader"),ce={getPlaylistActions:function(e,t){var n,a,r,i,o,l,u=t.isAuthenticated,d=t.isPlugin,m=t.isMobile,p=t.setIsFollowing,f=t.isFollowing,v=t.setShowFollowSpinner,y=t.showFollowSpinner,g=t.isUserCurator,h=t.openInCuratorLink,b={id:e.playlist.id,name:e.playlist.name,followerCount:null===(n=e.playlist.followers)||void 0===n?void 0:n.count,videoCount:null===(a=e.playlist.videos)||void 0===a?void 0:a.count,interactiveCount:null===(r=e.playlist.interactives)||void 0===r?void 0:r.count,clipCount:null===(i=e.playlist.clips)||void 0===i?void 0:i.count,isClickViewPlaylist:null===(o=e.playlist._isClickViewCurated)||void 0===o?void 0:o.value},C={location:s.LZ.Banner,entity:s.py.Playlist,workflowPhase:s.eu.Start},S=[];if(!u)return S;if(t.isGuest)return S;var E=c.G.isOwner(e.playlist,e.currentUser),I=ie.z.hideAssignButtonOnVideoActions(e.currentUser),A=t.hasShareFlowV2&&!t.isStudent&&!I;return d||(e.playAllAppLink&&S.push({label:se("playAll"),appLink:e.playAllAppLink,svgName:oe.vn.Play,className:m?"":"btn btn-outline-dark me-2",button:!m,analyticsData:b,analyticsOptions:Object.assign(Object.assign({},C),{actionType:s.Vw.Play})}),A&&S.push({label:se("assign"),appLink:le.W.flowSelector({entityType:"playlist",objectId:e.playlist.id}),svgName:oe.vn.Classrooms,className:m?"":"btn btn-outline-dark me-2",button:!m,analyticsData:b,analyticsOptions:Object.assign(Object.assign({},C),{actionType:s.Vw.Share,entity:s.py.Assign})}),g&&S.push({label:(0,w.eR)(),href:h,openInNewTab:!0}),S.push({label:!A&&se("share"),tooltip:A&&se("share"),appLink:{application:x.O.SHARE,action:N.e.Share.SHARE,args:[e.playlist.id],params:{entityType:"playlist"}},svgName:t.hasShareFlowV2?oe.vn.Link:oe.vn.Share,className:m?"":"btn btn-outline-dark me-2 align-self-stretch",button:!m,analyticsData:b,analyticsOptions:Object.assign(Object.assign({},C),{actionType:s.Vw.Share,eventVersion:s.eq.V3})})),E||S.push({label:se(f?"following":"follow"),onClick:function(){p(!f),v(!0),e.follow(!f,function(){v(!1),re.k.logUserAction(b,Object.assign(Object.assign({},C),{actionType:s.Vw.Follow,descriptor:f?s.DL.Off:s.DL.On,workflowPhase:s.eu.Complete}))},function(){v(!1),p(f)})},svgName:f?oe.vn.BellFilled:oe.vn.Bell,className:m?"":"btn follow-btn btn-".concat(f?"outline-dark":"dark"," me-2"),button:!m,showSpinner:y}),E&&(S.push({label:se("edit"),appLink:{application:x.O.PLAYLISTS,action:N.e.Playlists.EDIT_PLAYLIST,args:[e.playlist.id]},svgName:oe.vn.Edit,button:!1,analyticsData:b,analyticsOptions:Object.assign(Object.assign({},C),{actionType:s.Vw.Edit})}),S.push({label:se("delete"),appLink:{application:x.O.PLAYLISTS,action:N.e.Playlists.DELETE_PLAYLIST,args:[e.playlist.id]},svgName:oe.vn.Delete,className:"text-danger",button:!1,analyticsData:b,analyticsOptions:Object.assign(Object.assign({},C),{actionType:s.Vw.Delete})})),(null===(l=e.playlist._isClickViewCurated)||void 0===l?void 0:l.value)&&S.push({label:se("copy"),appLink:{application:x.O.PLAYLISTS,action:N.e.Playlists.COPY_PLAYLIST,args:[e.playlist.id]},button:!1,analyticsData:b,analyticsOptions:Object.assign(Object.assign({},C),{actionType:s.Vw.Copy})}),S}};const ue={clickViewAvatar:"PHe9c"};function de(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,i,o,l=[],s=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(a=i.call(n)).done)&&(l.push(a.value),l.length!==t);s=!0);}catch(e){c=!0,r=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(c)throw r}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return me(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?me(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function me(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}function pe(e){var t=(0,ee.G)().isPlugin,n=(0,I.T)(),r=n.hasPermissions,i=n.getGatedPermission,o=(0,J.r)(null).hasShareFlowV2,l=de(a.useState(e.isFollowing),2),s=l[0],c=l[1],u=de(a.useState(!1),2),d=u[0],m=u[1];a.useEffect(function(){return c(e.isFollowing)},[e.isFollowing]);var p=(0,Z.a)(z.r.XS);if(e.showPartialLoading)return a.createElement(ae,null);var f=e.playlist.description,v=ce.getPlaylistActions(e,{isAuthenticated:e.currentUser.isAuthenticated,isPlugin:t,isMobile:p,setIsFollowing:c,isFollowing:s,setShowFollowSpinner:m,showFollowSpinner:d,isUserCurator:e.isUserCurator,openInCuratorLink:e.openInCuratorLink,hasShareFlowV2:o,isStudent:r(X.C.StudentExperience),isGuest:r(X.C.GuestExperience)}),y=e.getBreadcrumbs();return a.createElement(a.Fragment,null,a.createElement(Q.p,{heading:e.playlist.name,banner:e.playlist.banner,imageCdnUrl:e.imageCdnUrl,actions:v.length&&v,actionsDropdownClassName:"btn btn-outline-dark",blockColourClass:(0,K.x)(e.playlist.name,$.o),detailsComponent:function(){return a.createElement(Y,{playlist:e.playlist,currentUser:e.currentUser,detailsClassName:"mb-n1 font-size-normal fw-normal mt-1",clickViewAvatarClassName:ue.clickViewAvatar,separatorClassName:"mx-1",totalVideos:e.totalVideos})}}),(!!f||!!(null==y?void 0:y.length))&&a.createElement("div",{className:"border-bottom py-3"},!e.playlist||e.classificationId&&!e.topicPath?a.createElement(W.b2,null):a.createElement("div",{className:"pb-2"},"soft-gate"===i(X.C.CreatePlaylist)&&a.createElement(te.H,null),a.createElement(W.Oo,{breadcrumbs:y})),!!f&&a.createElement("p",{className:"mb-0"},f)))}var fe=n(56050),ve=n(91967),ye=n(83914),ge=n(1860),he=n(3534);function be(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var Ce=function(e,t){var n={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&t.indexOf(a)<0&&(n[a]=e[a]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(a=Object.getOwnPropertySymbols(e);r<a.length;r++)t.indexOf(a[r])<0&&Object.prototype.propertyIsEnumerable.call(e,a[r])&&(n[a[r]]=e[a[r]])}return n};function we(e){var t,n,r=e.onSortComplete,i=e.onSortStart,l=e.showPartialLoading,s=Ce(e,["onSortComplete","onSortStart","showPartialLoading"]),c=(t=a.useState(),n=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,i,o,l=[],s=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(a=i.call(n)).done)&&(l.push(a.value),l.length!==t);s=!0);}catch(e){c=!0,r=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(c)throw r}}return l}}(t,n)||function(e,t){if(e){if("string"==typeof e)return be(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?be(e,t):void 0}}(t,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),u=c[0],d=c[1];return l?a.createElement(ge.S,{withReordering:e.canEdit||e.showIndexes}):e.canEdit?a.createElement(he.NB,Object.assign({},s,{currentSortingIndex:u,onSortStart:function(t){var n=e.videos.findIndex(function(e){return e.id.toString()===t.active.id.toString()});d(n),ve.q.isFunction(i)&&i(n)},onSortEnd:function(t){d(null);var n=t.active,a=t.over,i=e.videos.findIndex(function(e){return e.id.toString()===n.id.toString()}),l=e.videos.findIndex(function(e){return e.id.toString()===a.id.toString()});ve.q.isFunction(r)?r(i,l):o.Q.Ry.throw(new fe.H("An onSortComplete callback function must be passed to SortableVideoListComponent"))},dragHandleIcon:oe.vn.Hamburger,dragHandleIconSize:ye.S.XXL,presentationAudiences:e.presentationAudiences})):a.createElement(he.E4,Object.assign({},s))}var Se=n(97958),Ee=n(99742),Ie="playlists.playlistEmptyState";function Ae(){return a.createElement(_.D.Provider,{value:Ie},a.createElement(Se.u,null,a.createElement(Se.u.Image,{src:Ee.W.EmptyStates.Playlists.PLAYLIST_VIDEOS}),a.createElement(Se.u.Heading,null,a.createElement(_.x,{phrase:"heading"})),a.createElement(Se.u.Info,null,a.createElement(_.x,{phrase:"info"}))))}n(75896);var Oe=n(81493),ke=n(9680),Pe=n(10671);function Le(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var Ne=i.T.encloseNamespace("playlists.playlist");function xe(e,t,n){re.k.logUserAction({id:t,playlistId:e},{location:s.LZ.VideoList,entity:s.py.Video,actionType:s.Vw.Move,workflowPhase:n})}var je={notFound:Oe.N,forbidden:{privacy:ke.J}};function Fe(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var Te=i.T.encloseNamespace("playlists.playlist");function Ve(e){var t,n,i,U,B,R,_,G,H,q,Y,Q,W,$,z,X=(0,r.I0)(),Z=(0,b.Z)(),J=l.a.useBasicFetch(v.L.config()),K=l.a.useBasicFetch(h.N.currentUser()),ee=(0,w.R0)(),te=ee.isUserCurator,ne=ee.getOpenInCurationStudioLink,ae=(0,I.T)().hasPermissions,re=l.a.useBasicFetch((null===(t=K.data)||void 0===t?void 0:t.isAuthenticated)&&y.h.yearGroups(K.data.customerId)),ie=l.a.useBasicFetch(e.classificationId&&f.x.path(e.classificationId)),le=l.a.useBasicFetch(e.classificationId&&f.x.classification(e.classificationId,null===(n=K.data)||void 0===n?void 0:n.id)),se=l.a.useBasicFetch(le.hasCompleted&&f.x.presentationById(null===(i=le.data)||void 0===i?void 0:i.presentationId)),ce=(null===(U=K.data)||void 0===U?void 0:U.isAuthenticated)?!e.classificationId||se.hasCompleted:!!(null===(B=se.data)||void 0===B?void 0:B.id),ue=l.a.useBasicFetch(ce&&p.O.presentationAudiences(null===(R=se.data)||void 0===R?void 0:R.id)),de=(0,j.U)({locationContext:s.LZ.VideoThumbnail,mtv:e.moviesAndTv,sharedPlaylist:!!e.shareId}).commonVideoProps,me=e.shareId?g.C.getSharedPlaylist(e.playlistId,e.shareId):g.C.getPlaylist(e.playlistId),fe=e.shareId?g.C.getSharedPlaylistVideosCount(e.playlistId,e.shareId):g.C.getPlaylistVideosCount(e.playlistId),ve=l.a.useBasicFetch(me),ye=l.a.useBasicFetch(fe),ge=function(e,t,n){var a=(0,Pe._)({location:Pe.i.VideoItem,shareId:n});return c.G.isOwner(e,t)?Object.assign(Object.assign({},a),{getVideoActions:function(t,n){var r,i=L.M.getCanBeConsumed(t).canConsume,o={label:Ne("removeFromPlaylist"),button:!1,svgName:oe.vn.Delete,appLink:{application:x.O.PLAYLISTS,action:N.e.Playlists.REMOVE_VIDEO_FROM_PLAYLIST,args:[t.id,e.id],params:{typeId:t.typeId}},className:"text-danger",analyticsOptions:{entity:s.py.Video,actionType:s.Vw.Dissociate,location:s.LZ.VideoListItem,workflowPhase:s.eu.Start,descriptor:s.iF.Playlist},analyticsData:{id:t.id,playlistId:e.id},group:"delete"};return i?[].concat(function(e){if(Array.isArray(e))return Le(e)}(r=a.getVideoActions(t,n))||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(r)||function(e,t){if(e){if("string"==typeof e)return Le(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Le(e,t):void 0}}(r)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(),[o]):[o]}}):a}(ve.data,K.data,e.shareId);(0,S.v)(ve,je);var he=function(t){return e.shareId?g.C.getSharedPlaylistVideos(e.playlistId,e.shareId,t):g.C.getPlaylistVideos(e.playlistId,t)},be=l.a.useBasicFetch((null===(_=K.data)||void 0===_?void 0:_.id)&&g.C.getIsFollowingPlaylist(e.playlistId,null===(G=K.data)||void 0===G?void 0:G.id)),Ce=function(e){l.a.getFetch(X)(he(e))},Se=(0,E.K)(he,Ce),Ee=Se.items,Ie=Se.hasMore,Oe=Se.isFetching;(0,T.V)(Ee);var ke,Ve,De,Me,Ue,Be,Re=function(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,i,o,l=[],s=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(a=i.call(n)).done)&&(l.push(a.value),l.length!==t);s=!0);}catch(e){c=!0,r=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(c)throw r}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return Fe(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Fe(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}((ke=Ee,Ue=(0,a.useState)(),Be=2,Ve=function(e){if(Array.isArray(e))return e}(Ue)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,i,o,l=[],s=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(a=i.call(n)).done)&&(l.push(a.value),l.length!==t);s=!0);}catch(e){c=!0,r=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(c)throw r}}return l}}(Ue,Be)||function(e,t){if(e){if("string"==typeof e)return A(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?A(e,t):void 0}}(Ue,Be)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(),De=Ve[0],Me=Ve[1],(0,a.useEffect)(function(){De&&(ke.length!==De.length||function(e,t){var n=!0;if(e.length!==t.length)return!1;for(var a=0;a<e.length;a++)if(e[a].id!==t[a].id){n=!1;break}return n}(ke,De))&&Me(null)},[ke]),[De,Me]),2),_e=Re[0],Ge=Re[1];(0,F.P)({id:e.playlistId,app:"playlists",shareId:e.shareId}),(0,O.M)(k.CG.getPlaylistMetadata({content:ve.data,phraseContext:{phraseHandler:Te,titlePhrase:"pageTitle",descriptionPhrase:"pageDescription"},canonicalLink:D.f.getCanonicalLink({stripPresentationSlug:!0}),allowIndexing:!1}));var He=!!Ee&&0===Ee.length,qe=function(t,n){var a,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return M.W.getAppLink(t,Object.assign(Object.assign({},r),{contextId:e.playlistId,context:m.Q.Playlist,shareId:e.shareId,moviesAndTv:e.moviesAndTv,playNext:n,includeContext:(null===(a=K.data)||void 0===a?void 0:a.isAuthenticated)||!!e.shareId}))},Ye=!(null===(H=K.data)||void 0===H?void 0:H.isAuthenticated)||!!be.hasCompleted,Qe=null==Ee?void 0:Ee.find(function(e){var t;return null===(t=L.M.getCanBeConsumed(e))||void 0===t?void 0:t.canConsume}),We=c.G.isOwner(ve.data,K.data),$e=Ee&&K.data&&J.data,ze=(0,C.h)({name:null===(q=ve.data)||void 0===q?void 0:q.name});return a.createElement(d.M.Provider,{value:(null===(Y=K.data)||void 0===Y?void 0:Y.isAuthenticated)&&ge},a.createElement("div",{className:"bg-white px-3"},a.createElement(pe,{playlist:ve.data,currentUser:K.data,isFollowing:null===(Q=be.data)||void 0===Q?void 0:Q.isFollowing,follow:function(t,n,a){var r,i=t?g.C.followPlaylist:g.C.unfollowPlaylist;l.a.fetch(X,i(e.playlistId,null===(r=K.data)||void 0===r?void 0:r.id,n,function(){a(),Z.error(Te(t?"followError":"unfollowError"))}))},playAllAppLink:Qe&&qe(Qe,!0),showPartialLoading:!ve.data||!$e||!Ye,imageCdnUrl:!!J.data&&J.data.imageCdnUrl,getBreadcrumbs:function(){return e.hideBreadCrumbs?null:ze},topicPath:ie.data,moviesAndTv:e.moviesAndTv,classificationId:e.classificationId,isUserCurator:te,openInCuratorLink:ne(null===(W=ve.data)||void 0===W?void 0:W.typeId,null===($=ve.data)||void 0===$?void 0:$.id),totalVideos:c.G.getVideoCount(ye.data)}),a.createElement("div",{className:"mt-2"},He?a.createElement(Ae,null):a.createElement(we,{videos:_e||Ee,yearGroups:re.data,playlistId:!!ve.data&&ve.data.id,onSortStart:function(t){var n=Ee[t];n&&xe(e.playlistId,n.id,s.eu.Start)},onSortComplete:function(t,n){if(t!==n){var a=Ee[t];if(a){var r=P.l.reorder(Ee,t,n),i=r.reorderedItems,o=r.reorderRequest;Ge(i),xe(e.playlistId,a.id,s.eu.Complete),l.a.fetch(X,g.C.reorderVideos(e.playlistId,o,null,function(){Ge(null)}))}}},canEdit:We,showPartialLoading:!$e,getVideoAppLink:function(e,t){return qe(e,!1,t)},showSignIn:!(null===(z=K.data)||void 0===z?void 0:z.isAuthenticated),getSignInAppLink:function(e){var t=o.Q.C$.getHref(e),n="/"!==t?{redirectUrl:t}:{};return{application:x.O.DEFAULT,action:N.e.Default.CHALLENGE,params:n}},canRemovePrivateVideos:We,presentationAudiences:e.moviesAndTv?null:ue.data,showIndexes:!0,hasPermissions:ae,getPreviewQuestionsAppLink:function(e){return V.j.getPreviewQuestionsAppLink(e)},commonVideoProps:de})),(Ie||Oe)&&a.createElement(u._,{isFetching:Oe,fetchNext:Ce})))}},12909:(e,t,n)=>{n.d(t,{H:()=>d});var a=n(32735),r=n(15611),i=n(83914),o=n(83345),l=n(35223),s=n(14070),c=n(97291),u="signUp.softGateBanner";function d(){return a.createElement("div",{role:"alert",className:"bg-light-indigo text-indigo rounded p-2 mb-4 d-flex align-items-center"},a.createElement(i.x,{svgName:l.vn.StarOutline,size:i.S.Large}),a.createElement(o.x,{namespace:u,phrase:"softGate"})," ",a.createElement(r.F,{appLink:{application:c.O.SIGN_UP,action:s.e.SignUp.PREMIUM_FEATURES},className:"indigo-link text-indigo text-underline d-inline"},a.createElement(o.x,{namespace:u,phrase:"learnMore"})))}},58321:(e,t,n)=>{n.d(t,{U:()=>f});var a=n(20354),r=n(16714),i=n(39151),o=n(1666),l=n(31949),s=n(22902),c=n(37802),u=n(22490),d=n(82431),m=n(46390),p=n(27638);function f(e){var t,n,f,v=e||{},y=v.locationContext,g=v.mtv,h=v.flightNamespace,b=v.sharedPlaylist,C=(0,m.G)(),w=C.isPlugin,S=C.params,E=(0,p.u)(y,h),I=E.setFavourite,A=E.canFavourite,O=(0,c.r)(null),k=O.hasTopicDirectories,P=O.isLoadingSettings,L=(0,s.T)(),N=L.hasPermissions,x=L.isLoaded,j=N(r.C.StudentExperience),F=N(r.C.GuestExperience),T=a.a.useBasicFetch(i.L.config()),V=a.a.useBasicFetch(l.N.currentUser()),D=a.a.useBasicFetch((null===(t=V.data)||void 0===t?void 0:t.isAuthenticated)&&o.h.yearGroups(V.data.customerId));return{hasCommonVideoPropsCompleted:!P&&x&&T.hasCompleted&&V.hasCompleted&&(!(null===(n=V.data)||void 0===n?void 0:n.isAuthenticated)||D.hasCompleted),commonVideoProps:{subTextType:"series",getSubTextAppLink:function(e){var t;return"series"in e?b&&!(null===(t=V.data)||void 0===t?void 0:t.isAuthenticated)?null:d.j.getSeriesAppLink(e.series,{mtv:g}):null},isPlugin:w,isPluginPopup:!!(null==S?void 0:S.popup),canFavourite:A,setFavourite:I,imageCdnUrl:null===(f=T.data)||void 0===f?void 0:f.imageCdnUrl,yearGroups:D.data,getClassroomGuideAppLink:u.W.getClassroomGuideAppLink,getInteractiveGuidanceAppLink:u.W.getInteractiveGuidanceAppLink,getResourceGuidanceAppLink:u.W.getResourceGuidanceAppLink,showNewVideoIndicator:k,companyLogoFallbackUrl:null,hasStudentExperience:j,hasGuestExperience:F}}}},97816:(e,t,n)=>{n.d(t,{V:()=>l,l:()=>s});var a=n(1575),r=n(39902),i=n(31908);function o(e){return e?Array.isArray(e)?e.filter(function(e){return!!e&&(i.M.isVideo(e)||i.M.isClip(e))}):"data"in e?e.data.filter(function(e){return!!e&&(i.M.isVideo(e)||i.M.isClip(e))}):[]:[]}function l(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=o(e).map(function(e){return e.id});(0,r.FN)(n,function(e){return a.R.videoMixinAssocs(e,t.flightNamespace)},null)}function s(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=(0,r.SW)({getRequest:function(t){return a.R.videoMixinAssocs(t,e.flightNamespace)}}).fetchItems;return{fetchObjects:function(e){return t(o(e).map(function(e){return e.id}))}}}}}]);
|
|
2
|
+
//# sourceMappingURL=3840-98c79fc0d8-lite.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts/3840-98c79fc0d8-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/calendar/components/coming-soon-tag/coming-soon-tag.scss","file:///app/packages/libs/shared/src/apps/calendar/components/coming-soon-tag/ComingSoonTag.tsx","file:///app/packages/libs/shared/src/apps/calendar/components/generic-calendar-date/generic-calendar-date.scss","file:///app/packages/libs/shared/src/apps/calendar/components/generic-calendar-date/GenericCalendarDate.tsx","file:///app/packages/libs/shared/src/apps/playlists/utils/PlaylistHelper.ts","file:///app/packages/libs/shared/src/components/back-button/BackButton.tsx","file:///app/packages/libs/shared/src/components/banner-header/banner-header.scss","file:///app/packages/libs/shared/src/components/banner-header/BannerHeader.tsx","file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/hooks/UseBatchFetch.ts","file:///app/packages/libs/shared/src/hooks/UseHandleObjectError.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteScroll.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteList.ts","file:///app/packages/libs/shared/src/hooks/useBreadcrumbs.ts","file:///app/packages/libs/shared/src/apps/playlists/components/playlist-header-details/PlaylistHeaderDetails.tsx","file:///app/packages/projects/lite/src/apps/playlists/components/playlist-header/partial-loading/partial-playlist-header.scss","file:///app/packages/projects/lite/src/apps/playlists/components/playlist-header/partial-loading/PartialPlaylistHeader.tsx","file:///app/packages/projects/lite/src/apps/playlists/components/playlist-header/PlaylistHeaderUtils.ts","file:///app/packages/projects/lite/src/apps/playlists/components/playlist-header/playlist-header.scss","file:///app/packages/projects/lite/src/apps/playlists/components/playlist-header/PlaylistHeader.tsx","file:///app/packages/projects/lite/src/apps/playlists/components/video-list/SortableVideoListContainer.tsx","file:///app/packages/projects/lite/src/apps/playlists/views/playlist/empty-state/PlaylistEmptyState.tsx","file:///app/packages/projects/lite/src/apps/playlists/views/playlist/PlaylistViewUtils.ts","file:///app/packages/projects/lite/src/apps/playlists/views/playlist/PlaylistView.tsx","file:///app/packages/libs/shared/src/hooks/UseReorderedItems.ts","file:///app/packages/projects/lite/src/apps/sign-up/components/soft-gate-banner/SoftGateBanner.tsx","file:///app/packages/projects/lite/src/shared/hooks/useCommonVideoProps.ts","file:///app/packages/projects/lite/src/shared/hooks/useVideoMixin.ts"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"tag\":\"XRj8d\",\"tooltip\":\"X6mLk\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './coming-soon-tag.scss';\n\nconst namespace = 'specialEventCalendar.comingSoonTag';\n\ninterface ComingSoonProps {\n className?: string;\n onlyIcon?: boolean;\n}\n\nexport function ComingSoonTag(props: ComingSoonProps): JSX.Element {\n return (\n <Tooltip title={LanguageService.getPhrase(namespace, 'tooltip')} spanHackClassName={`d-block ${styles.tooltip}`} spanHack>\n <div className={`d-flex text-dark align-items-center ${styles.tag} ${props.className}`}>\n <SvgContainer svgName={cvSvgLibrary.Timer} />\n {!props.onlyIcon && LanguageService.getPhrase(namespace, 'comingSoon')}\n </div>\n </Tooltip>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"dateItem\":\"I3SBm\",\"label\":\"PRORs\",\"body\":\"RfiM_\",\"bodyDay\":\"ZOVny\",\"bodyRange\":\"vYhXN\",\"bodyMonth\":\"mYslO\",\"month\":\"EPkkQ\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { CalendarTheme } from 'libs/shared/apps/calendar/interfaces/CalendarTheme';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\n\nimport styles from './generic-calendar-date.scss';\n\nexport interface GenericCalendarDateProps {\n label?: string;\n body: {\n type: 'month' | 'range' | 'day';\n text: string;\n };\n month?: string;\n getAppLink?: () => Core.AppLink;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n className?: string;\n theme?: CalendarTheme;\n}\n\nexport function GenericCalendarDate(props: GenericCalendarDateProps): JSX.Element {\n function getBodyClass(): string {\n switch (props.body.type) {\n case 'range':\n return styles.bodyRange;\n case 'day':\n return styles.bodyDay;\n case 'month':\n return styles.bodyMonth;\n }\n }\n\n return (\n <AppLink\n appLink={props.getAppLink?.()}\n className={`text-decoration-none text-center bg-white text-dark border border-3 ${props.theme?.border} rounded-3 d-block fw-semibold ${props.className}`}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n >\n <div className={`position-relative ${styles.dateItem}`}>\n <div className={`${props.theme?.background} py-1 ${styles.label} d-flex align-items-center justify-content-center`}>\n {props.label ? props.label : <> </>}\n </div>\n <div className={`${getBodyClass()} ${styles.body} my-2`}>\n {props.body.text}\n </div>\n <div className={`mb-0 ${styles.month}`}>\n {props.month}\n </div>\n </div>\n </AppLink>\n );\n}","import { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { BaseObject, CurrentUser, Playlist } from 'libs/shared/interfaces';\n\nexport const PlaylistHelper = {\n isPlaylist(obj: BaseObject): obj is Playlist {\n return obj?.typeId === MasterType.Playlist;\n },\n\n isOwner(playlist: Playlist, currentUser: CurrentUser): boolean {\n if (!currentUser || !playlist || ObjectHelper.isEmpty(playlist._liteOwner))\n return false;\n\n return playlist._liteOwner.id.toString() === currentUser.id?.toString();\n },\n\n getVideoCount(playlist: Playlist): number {\n if (!playlist)\n return;\n\n let count = 0;\n\n if (playlist.videos?.count)\n count += playlist.videos.count;\n\n if (playlist.clips?.count)\n count += playlist.clips.count;\n\n if (playlist.interactives?.count)\n count += playlist.interactives.count;\n\n return count;\n }\n};","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.backButton';\n\ninterface BackButtonProps {\n appLink: Core.AppLink;\n backToName?: string;\n color?: 'black' | 'white';\n extraClasses?: string;\n /**\n * Whether or not the button text has a text shadow. Defaults to true\n */\n textShadow?: boolean;\n}\n\nBackButton.defaultProps = {\n color: 'black',\n extraClasses: ''\n};\n\nexport function BackButton(props: BackButtonProps): React.ReactElement {\n const { backToName, appLink, color, extraClasses, textShadow } = {\n textShadow: true,\n ...props\n };\n\n const backPhrase = backToName\n ? LanguageService.getPhrase(namespace, 'backTo', { backToName })\n : LanguageService.getPhrase(namespace, 'back');\n\n const colorClass = color === 'black' ? '' : 'text-white';\n const textShadowClass = textShadow ? 'text-shadow' : '';\n\n return (\n <AppLink\n appLink={appLink}\n className={`d-inline-flex align-items-center h5 mb-0 ${extraClasses} ${colorClass} ${textShadowClass}`}\n >\n <SvgContainer svgName={cvSvgLibrary.ChevronLeft} size={SvgContainerSize.Medium} />\n <span className='ms-1'>{backPhrase}</span>\n </AppLink>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"bannerContent\":\"sSCTB\",\"actionsContainer\":\"Z5WI2\",\"bannerContentWithLogo\":\"rgs7Q\",\"container\":\"M51HJ\",\"logoContainer\":\"vkeJk\",\"logoContainerLeft\":\"M3U9B\",\"logoHeading\":\"EtRwC\",\"specialEventContainer\":\"rOxDc\",\"headingLarge\":\"_8pnV\",\"heading\":\"JXVBH\"};","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\nimport { PortalHelper } from 'libs/common/react/utils/PortalHelper';\n\nimport { ComingSoonTag } from 'libs/shared/apps/calendar/components/coming-soon-tag/ComingSoonTag';\nimport { GenericCalendarDate } from 'libs/shared/apps/calendar/components/generic-calendar-date/GenericCalendarDate';\nimport { CalendarTheme } from 'libs/shared/apps/calendar/interfaces/CalendarTheme';\nimport { ActionOptions, Actions } from 'libs/shared/components/actions/Actions';\nimport { BackButton } from 'libs/shared/components/back-button/BackButton';\nimport { LazyImage } from 'libs/shared/components/lazy-image/LazyImage';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { ImageMinDimensions } from 'libs/shared/constants/ImageSizes';\nimport { BannerPortalContext } from 'libs/shared/context/BannerPortalContext';\nimport { ImageSize, ImageType, ResizeType } from 'libs/shared/enums/Images';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Banner, CalendarEvent, Logo } from 'libs/shared/interfaces';\nimport { getBgColorClass } from 'libs/shared/utils/getBgColorClass';\nimport { ImageHelper, ImageOptions } from 'libs/shared/utils/ImageHelper';\n\nimport styles from './banner-header.scss';\n\nconst RATIO = `${ImageMinDimensions[ImageType.Banners].width}:${ImageMinDimensions[ImageType.Banners].height}`;\nconst DEFAULT_WIDTH = 1200; // This is ImageSize.Large for a Banner.\nconst LARGE_SCREEN_WIDTH = 1920;\n\nfunction useGetImageWidth(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xxl)\n return LARGE_SCREEN_WIDTH;\n\n return DEFAULT_WIDTH;\n}\n\nfunction getSizeClass(heading: string): string {\n if (heading.length < 160)\n return 'h1';\n\n return styles.headingLarge;\n}\n\ninterface BannerHeaderProps {\n heading: string;\n banner?: Banner;\n bannerClassName?: string;\n imageCdnUrl?: string;\n logo?: Logo;\n logoBgColour?: string;\n actions?: ActionOptions[];\n specialEvent?: CalendarEvent;\n backButtonAppLink?: Core.AppLink;\n backButtonText?: string;\n backButtonClasses?: string;\n sortComponent?: JSX.Element;\n blockColourClass?: string;\n actionsDropdownClassName?: string;\n detailsComponent?: () => React.ReactElement;\n imageOptions?: ImageOptions;\n showComingSoon?: boolean;\n alignLogoLeft?: boolean;\n calendarTheme?: CalendarTheme;\n}\n\nconst namespace = 'shared.bannerHeader';\n\nexport const BannerHeader = React.memo(function(props: React.PropsWithChildren<BannerHeaderProps>): React.ReactElement {\n const { heading, banner, imageCdnUrl, actions, sortComponent, blockColourClass, specialEvent } = props;\n\n const portalContainerContext = React.useContext(BannerPortalContext);\n\n const imageWidth = useGetImageWidth();\n\n const specialEventIsToday = React.useMemo(() => {\n if (!specialEvent || props.showComingSoon)\n return false;\n\n const today = DateHelper.format(new Date(), 'YYYY-MM-DD');\n\n if (!specialEvent.endDate)\n return specialEvent.startDate === today;\n\n return specialEvent.startDate <= today && specialEvent.endDate >= today;\n }, [specialEvent]);\n\n function getSpecialEventMonthText(specialEvent: CalendarEvent): string {\n if (!specialEvent.endDate)\n return DateHelper.format(specialEvent.startDate, 'MMMM');\n\n if (DateHelper.isSame(specialEvent.startDate, specialEvent.endDate, 'month'))\n return DateHelper.format(specialEvent.startDate, 'MMMM');\n\n return `${DateHelper.format(specialEvent.startDate, 'MMM')} - ${DateHelper.format(specialEvent.endDate, 'MMM')}`;\n }\n\n const imageOptions = props.imageOptions || {\n width: imageWidth,\n ratio: RATIO,\n resizeType: ResizeType.Cover\n };\n\n const url = !!banner && !!imageCdnUrl && ImageHelper.createBannerUrl(banner, {\n fallbackBaseUrl: imageCdnUrl,\n fallbackCategoryName: heading,\n type: ImageType.Banners\n }, imageOptions);\n\n const containerProps: React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement> = {\n className: `banner banner-header ${props.bannerClassName}`,\n style: url ? { backgroundImage: `url('${url}')` } : {}\n };\n\n if (!banner && blockColourClass) {\n delete containerProps.style;\n containerProps.className += ` ${blockColourClass}`;\n }\n\n const DetailsComponent = props.detailsComponent;\n\n const logoFallbackBgClassName = getBgColorClass(props.heading, BG_COLOUR_CLASS_NAMES);\n\n return PortalHelper.renderInPortalIfExists(\n // \"banner\" is used in playlists in Online. banner-header is used by all other projects\n <header {...containerProps}>\n <div className={`container ${styles.container} position-relative inner-banner`}>\n {props.backButtonAppLink && (\n <div className='pt-3'>\n <BackButton\n appLink={props.backButtonAppLink}\n backToName={props.backButtonText}\n extraClasses={props.backButtonClasses}\n color='white'\n />\n </div>\n )}\n \n <div className={`${props.alignLogoLeft ? 'position-absolute top-50 start-0 translate-middle-y w-100 ps-4' : `${styles.bannerContent} px-2 ${props.logo?.url ? styles.bannerContentWithLogo : ''}`}`}>\n {!!specialEvent && (\n <div className={`position-relative ${styles.specialEventContainer}`}>\n <GenericCalendarDate\n body={{\n type: specialEvent.endDate ? 'range' : 'day',\n text: specialEvent.endDate\n ? `${DateHelper.format(specialEvent.startDate, 'DD')}-${DateHelper.format(specialEvent.endDate, 'DD')}`\n : DateHelper.format(specialEvent.startDate, 'DD')\n }}\n month={getSpecialEventMonthText(specialEvent)}\n theme={props.calendarTheme}\n />\n </div>\n )}\n <div>\n {specialEventIsToday && (\n <div className='rounded-pill py-1 px-2 my-1 me-1 fw-semibold bg-light-blue lh-1 d-inline-block'>\n <Text namespace={namespace} phrase='onToday' />\n </div>\n )}\n {props.showComingSoon && (\n <ComingSoonTag className='pe-2 fw-semibold mb-1 rounded-pill justify-content-start text-nowrap' />\n )}\n <div className='d-flex align-items-center'>\n {props.alignLogoLeft && props.logo?.url &&\n <div className={`${styles.logoContainerLeft} d-none d-md-block rounded-circle overflow-hidden me-3 ${logoFallbackBgClassName}`}>\n <LazyImage\n src={ImageHelper.createUrl(props.logo?.url, { size: ImageSize.Medium })}\n style={{ backgroundColor: props.logoBgColour }}\n />\n </div>\n }\n <h1 className={`text-white text-shadow pe-3 position-static ${styles.heading} ${getSizeClass(heading)} ${props.alignLogoLeft ? 'w-50' : ''}`}>\n {heading}\n {DetailsComponent && <DetailsComponent />}\n </h1>\n </div>\n </div>\n {!!actions && (\n <div className={styles.actionsContainer}>\n <Actions\n actions={actions}\n sortComponent={sortComponent}\n actionsDropdownClassName={props.actionsDropdownClassName}\n />\n </div>\n )}\n </div>\n {!props.alignLogoLeft && !!props.logo?.url &&\n <div className={styles.logoContainer}>\n <img\n src={ImageHelper.createUrl(props.logo.url, { size: ImageSize.Medium })}\n className='rounded-circle'\n />\n </div>\n }\n </div>\n </header>,\n portalContainerContext?.container\n );\n}, (prevProps, nextProps): boolean => (\n prevProps.actions === nextProps.actions\n && prevProps.heading === nextProps.heading\n && prevProps.logo?.url === nextProps.logo?.url\n));\n\nexport function PartialBannerHeader(): JSX.Element {\n const portalContainerContext = React.useContext(BannerPortalContext);\n\n return PortalHelper.renderInPortalIfExists(\n <div className={`partial-banner partial-loading-background ${styles.banner}`} />,\n portalContainerContext?.container\n );\n}","import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n internalServerError?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError,\n internalServerError: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.InternalServer) {\n if (!ignoreMap.internalServerError)\n Core.ErrorHelper.throw(new UnspecifiedError());\n return;\n }\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import React from 'react';\n\nimport { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { BaseObject } from 'libs/shared/interfaces';\n\nconst CHUNK_SIZE = 50;\n\nexport interface UseBatchFetchResult<T extends BaseObject> {\n itemsArr: T[];\n items: { [key: string]: T} | null;\n isFetching: boolean;\n hasCompleted: boolean;\n}\n\n/**\n * Used to fetch multiple items by id with Flight. Will fetch 25 items at a time firing off multiple\n * requests if there are more than 25 items.\n * This will return items as null until we have all our items. Items will be returned as an object with\n * their ids as they key for easy mapping\n * \n * @param itemIds \n * @param getRequest \n */\nexport function useBatchFetch<T extends BaseObject>(\n itemIds: string[],\n getRequest: (ids: string[]) => Flight.Request\n): UseBatchFetchResult<T> {\n const chunks = ArrayHelper.chunk<string>(itemIds, CHUNK_SIZE);\n\n const requests = chunks.map(chunk => getRequest(ArrayHelper.uniq(chunk)));\n\n const responses = Flight.useBasicFetchAll<T[]>(requests);\n\n const itemsArr = ArrayHelper.flatten(responses.data);\n const items = responses.data.length\n ? itemsArr.reduce((acc, item) => ({ ...acc, [item.id]: item }), {})\n : null;\n\n return {\n itemsArr,\n items,\n isFetching: responses.isFetching,\n hasCompleted: responses.hasCompleted\n };\n}\n\n/**\n * When you need the useBatchFetch() behavior, but your list of objects to hydrate\n * will grow, such as on a scrolling page. useGrowingBatchFetch() will use local state\n * to determine what we've already built a request for and what items are new\n * as to not re-fetch items - Sha\n */\nexport function useGrowingBatchFetch<TResponse, TObjects = string>(\n objs: TObjects[],\n getRequest: (items: TObjects[]) => Flight.Request,\n _getKey?: (obj: TObjects) => string\n) {\n const getKey = _getKey ?? ((obj: any) => {\n if (typeof obj === 'object')\n return obj.id;\n\n return obj;\n });\n\n const { fetchItems, ...data } = useGrowingBatchFetchFunc<TResponse, TObjects>({ getRequest, _getKey });\n\n React.useEffect(() => {\n if (!objs?.length)\n return;\n\n fetchItems(objs);\n }, [objs?.map(getKey).join(',')]);\n\n return data;\n}\n\ninterface UseGrowingBatchFetchFuncOptions<TObjects> {\n getRequest: (items: TObjects[]) => Flight.Request;\n _getKey?: (obj: TObjects) => string;\n}\n\n/**\n * When you need the useGrowingBatchFetch() behaviour, but need to trigger the\n * fetch manually and update the objects - Nish \n */\nexport function useGrowingBatchFetchFunc<TResponse, TObjects = string>(\n options: UseGrowingBatchFetchFuncOptions<TObjects>\n) {\n const getKey = options._getKey ?? ((obj: any) => {\n if (typeof obj === 'object')\n return obj.id;\n\n return obj;\n });\n\n const fetchedItems = React.useRef<Set<string>>(new Set<string>());\n const [ requests, setRequests ] = React.useState<Flight.Request[]>([]);\n\n function fetchItems(objs: TObjects[]) {\n if (!objs?.length)\n return;\n\n const unfetchedItems: TObjects[] = [];\n \n objs.forEach(obj => {\n const key = getKey(obj);\n\n if (fetchedItems.current.has(key))\n return;\n\n unfetchedItems.push(obj);\n fetchedItems.current.add(key);\n });\n \n if (!unfetchedItems.length)\n return;\n \n setRequests(r => ([ ...r, ...ArrayHelper.chunk<TObjects>(unfetchedItems, CHUNK_SIZE).map(options.getRequest) ]));\n }\n\n const responses = Flight.useBasicFetchAll<TResponse[]>(requests);\n const itemsArr = ArrayHelper.flatten(responses.data);\n const items = responses.data.length\n ? itemsArr.reduce<Record<string, TResponse>>((acc, item) => ({ ...acc, [getKey(item)]: item }), {})\n : null;\n\n return {\n hasFirstRequestCompleted: !!responses.responses?.[0]?.hasCompleted,\n itemsArr,\n items,\n isFetching: responses.isFetching,\n fetchItems\n };\n}\n","import { useEffect } from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { handleHttpError, HttpErrorMap, IgnoreHttpErrorMap } from 'libs/shared/errors/handlers/HttpErrorHandlers';\n\nfunction generateCacheKey(flightObjs: Array<Flight.Response<any>>): string {\n return flightObjs.map(obj => obj.statusCode).join(':');\n}\n\n// TODO: Change this to just `useHandleHttpError` and only accept a status code.\nexport function useHandleObjectError(\n _flightObjs: Flight.Response<any> | Array<Flight.Response<any>>,\n customErrors?: HttpErrorMap,\n ignoreErrors?: IgnoreHttpErrorMap\n): void {\n const flightObjs = Array.isArray(_flightObjs) ? _flightObjs : [_flightObjs];\n\n useEffect(() => {\n flightObjs.forEach(obj => {\n handleHttpError(obj.statusCode, customErrors, ignoreErrors);\n });\n }, [ generateCacheKey(flightObjs), customErrors, ignoreErrors ]);\n}","import { useEffect } from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst SCROLL_TOLERANCE = 400; // value in px\n\ninterface UseInfiniteScrollOptions {\n fetchNextPage: () => void;\n hasMore: boolean;\n isFetching: boolean;\n scrollContainer?: HTMLElement;\n}\n\nexport function useInfiniteScroll(options: UseInfiniteScrollOptions): void {\n const handleScroll = (): void => {\n if (options.isFetching)\n return;\n\n if (!options.scrollContainer) {\n const currentScrollHeight = window.innerHeight + document.documentElement.scrollTop;\n \n const totalHeight = document.documentElement.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n } else {\n const { scrollContainer } = options;\n const currentScrollHeight = scrollContainer.getBoundingClientRect().height + scrollContainer.scrollTop;\n \n const totalHeight = scrollContainer.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n }\n\n options.fetchNextPage();\n };\n\n useEffect(() => {\n const onScroll = FunctionHelper.throttle(handleScroll, 200);\n\n const scrollContainer = options.scrollContainer || window;\n\n if (options.hasMore)\n scrollContainer.addEventListener('scroll', onScroll);\n\n return () => scrollContainer.removeEventListener('scroll', onScroll);\n }, [ options.hasMore, options.fetchNextPage, options.scrollContainer ]);\n}","import { useEffect, useState } from 'react';\n\nimport { HttpStatus, HttpStatusClass } from 'libs/common/backbone/enums/HttpStatus';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { BaseObject, BasePaginatedCollection } from 'libs/shared/interfaces';\n\nimport { useInfiniteScroll } from './UseInfiniteScroll';\nimport { useSelectAllPages } from './UseSelectAllPages';\n\nexport interface UseInfiniteListResult<T extends BaseObject> {\n items: T[];\n hasMore: boolean;\n isFetching: boolean;\n nextCursor: string;\n totalItems?: number;\n hasFirstPageCompleted: boolean;\n}\n\n/**\n * Hook to extract an infinite list from the application state,\n * save it locally in state and only update when new data\n * is fetched.\n * \n * @param getRequest - callback function to get the request for each page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n * \n * @param fetchNext - callback function to fetch a page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n */\nexport function useInfiniteList<TObject = BaseObject, TResponse = BasePaginatedCollection<TObject>>(\n getRequest: ((cursor?: string) => Flight.Request) | false,\n fetchNext: ((cursor?: string) => void) | false,\n onError?: (pageNumber: number, statusCode: HttpStatus) => void,\n getItems?: (responseData: TResponse) => TObject[],\n getCursor?: (responseData: TResponse) => string,\n scrollContainer?: HTMLElement\n): UseInfiniteListResult<TObject> {\n const [ pagesFetched, setPagesFetched ] = useState(0);\n\n const fetchNextFn = fetchNext as (cursor?: string) => void;\n\n function getKey(cursor?: string): string {\n if (!getRequest)\n return null;\n\n const request = getRequest(cursor);\n\n if (!request)\n return null;\n\n return request.key;\n }\n\n const response = useSelectAllPages<TObject, TResponse>(\n getKey,\n getItems,\n getCursor\n );\n\n function fetchNextPage(): void {\n if (!fetchNext || !getRequest || !response)\n return;\n\n setPagesFetched(currentVal => currentVal + 1);\n return fetchNextFn(response.nextCursor);\n }\n\n useInfiniteScroll({\n fetchNextPage,\n hasMore: !!response?.nextCursor,\n isFetching: response?.isFetching,\n scrollContainer\n });\n\n useEffect(() => {\n if (!response)\n return;\n\n if (response.shouldInitialFetch && fetchNext) {\n fetchNextFn();\n setPagesFetched(currentVal => currentVal + 1);\n }\n }, [ response?.shouldInitialFetch, fetchNext ]);\n\n useEffect(() => {\n if (!response?.statusCode || !FunctionHelper.isFunction(onError))\n return;\n\n const httpStatusClass: HttpStatusClass = +(response.statusCode?.toString()?.substr(0, 1));\n\n if (httpStatusClass !== HttpStatusClass.ClientError && httpStatusClass !== HttpStatusClass.ServerError)\n return;\n\n onError(pagesFetched, response.statusCode);\n }, [response?.statusCode]);\n\n return {\n items: response?.items,\n hasMore: !!response?.nextCursor,\n nextCursor: response?.nextCursor,\n isFetching: response?.isFetching,\n totalItems: response?.totalItems,\n hasFirstPageCompleted: response?.hasFirstPageCompleted\n };\n}","import React from 'react';\n\nimport { Breadcrumb } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { BreadcrumbService } from 'libs/shared/services/BreadcrumbService';\n\nexport function useBreadcrumbs(current: Breadcrumb): Breadcrumb[] {\n const [ match, useBuilder ] = React.useMemo(() => BreadcrumbService.getBuilder(), []);\n\n const breadcrumbs = useBuilder(match);\n\n if (!breadcrumbs || !current)\n return breadcrumbs;\n\n return [ ...breadcrumbs, { ...current, active: true }];\n}\n\n","import React from 'react';\n\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { PlaylistHelper } from 'libs/shared/apps/playlists/utils/PlaylistHelper';\nimport { ClickViewAvatar } from 'libs/shared/components/clickview-avatar/ClickViewAvatar';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { CurrentUser, Playlist } from 'libs/shared/interfaces';\n\nconst namespace = 'playlists.playlistHeaderDetails';\n\nconst Separator = ({ className }: { className: string }) =>\n <span className={className}>•</span>;\n\nfunction getPlaylistOwnerName(playlist: Playlist): string {\n const { _liteOwner } = playlist;\n\n if (!_liteOwner)\n return;\n\n if (_liteOwner.name && _liteOwner.surname)\n return TextHelper.toTitleCase(_liteOwner.name + ' ' + _liteOwner.surname.substring(0, 1));\n\n if (_liteOwner.name)\n return _liteOwner.name.split(' ')[0];\n}\n\nfunction getLastUpdated(playlist: Playlist): string {\n if (!playlist.contentModifiedDate)\n return '';\n\n const now = new Date();\n const lastUpdated = DateHelper.convertUTCToLocal(playlist.contentModifiedDate);\n\n // Don't show if last updated over a month ago\n if (DateHelper.isBefore(lastUpdated, DateHelper.subtract(now, 1, 'month')))\n return '';\n\n return DateHelper.fromNow(lastUpdated);\n}\n\ninterface PlaylistHeaderDetailsProps {\n playlist: Playlist;\n currentUser: CurrentUser;\n totalVideos: number;\n \n hideOwnerName?: boolean;\n\n // Custom classes for everything as online and lite use different styles\n detailsClassName: string;\n clickViewAvatarClassName: string;\n separatorClassName: string;\n}\n\nexport function PlaylistHeaderDetails(props: PlaylistHeaderDetailsProps): React.ReactElement {\n const currentUserIsOwner = PlaylistHelper.isOwner(props.playlist, props.currentUser);\n\n const followerCount = props.playlist.followers?.count;\n\n const lastUpdated = getLastUpdated(props.playlist);\n\n return (\n <div className={props.detailsClassName}>\n {/* Owner name */}\n {(!props.hideOwnerName && !currentUserIsOwner) && (\n <>\n {props.playlist._isClickViewCurated?.value ? (\n <>\n <div className={props.clickViewAvatarClassName}>\n <ClickViewAvatar />\n </div>\n <span>ClickView</span>\n </>\n ) : (\n <Text namespace={namespace} phrase='createdBy' options={{ user: getPlaylistOwnerName(props.playlist) }} />\n )}\n\n <Separator className={props.separatorClassName} />\n </>\n )}\n\n {/* Video count */}\n {typeof props.totalVideos === 'number' && (\n <Text namespace={namespace} phrase='videos' options={{ smartCount: props.totalVideos }} />\n )}\n\n {/* Follower count */}\n {followerCount > 0 && (\n <>\n <Separator className={props.separatorClassName} />\n <Text namespace={namespace} phrase='followers' options={{ smartCount: followerCount }} />\n </>\n )}\n\n {/* Last updated */}\n {!!lastUpdated && (\n <>\n <Separator className={props.separatorClassName} />\n <Text namespace={namespace} phrase='lastUpdated' options={{ timeAgo: lastUpdated }} />\n </>\n )}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialDescription\":\"vDX0m\"};","import React from 'react';\n\nimport { PartialBannerHeader } from 'libs/shared/components/banner-header/BannerHeader';\n\nimport styles from './partial-playlist-header.scss';\n\nexport function PartialPlaylistHeader(): JSX.Element {\n return (\n <>\n <PartialBannerHeader />\n <div className='mb-2'>\n <div className={`partial-loading-background my-2 border-bottom ${styles.partialDescription}`} />\n </div>\n </>\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, EntityType, EventVersion, LocationContext, ToggleDescriptor, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { PlaylistHelper } from 'libs/shared/apps/playlists/utils/PlaylistHelper';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { getOpenInCurationStudioLabel } from 'libs/shared/hooks/useCurationStudio';\nimport { AssignHelper } from 'libs/shared/utils/AssignHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { AssignAppLinkHelper } from 'apps/assign/utils/AssignAppLinkHelper';\n\nimport { PlaylistHeaderProps } from './PlaylistHeader';\n\nconst namespace = 'playlists.playlistHeader';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface GetPlaylistActionsArgs {\n isAuthenticated: boolean;\n isPlugin: boolean;\n isMobile: boolean;\n setIsFollowing: (val: boolean) => void;\n isFollowing: boolean;\n setShowFollowSpinner: (val: boolean) => void;\n showFollowSpinner: boolean;\n isUserCurator: boolean;\n openInCuratorLink: string;\n hasShareFlowV2: boolean;\n isStudent: boolean;\n isGuest: boolean;\n}\n\nexport const PlaylistHeaderUtils = {\n getPlaylistActions(headerProps: PlaylistHeaderProps, args: GetPlaylistActionsArgs): ActionOptions[] {\n const {\n isAuthenticated,\n isPlugin,\n isMobile,\n setIsFollowing,\n isFollowing,\n setShowFollowSpinner,\n showFollowSpinner,\n isUserCurator,\n openInCuratorLink\n } = args;\n\n const analyticsData = {\n id: headerProps.playlist.id,\n name: headerProps.playlist.name,\n followerCount: headerProps.playlist.followers?.count,\n videoCount: headerProps.playlist.videos?.count,\n interactiveCount: headerProps.playlist.interactives?.count,\n clipCount: headerProps.playlist.clips?.count,\n isClickViewPlaylist: headerProps.playlist._isClickViewCurated?.value\n };\n\n const analyticsOptions: AnalyticsOptions = {\n location: LocationContext.Banner,\n entity: EntityType.Playlist,\n workflowPhase: WorkflowPhase.Start\n };\n\n const actions: ActionOptions[] = [];\n\n if (!isAuthenticated)\n return actions;\n\n if (args.isGuest)\n return actions;\n\n const isOwner = PlaylistHelper.isOwner(headerProps.playlist, headerProps.currentUser);\n const hideAssignButton = AssignHelper.hideAssignButtonOnVideoActions(headerProps.currentUser);\n const hasAssignActionButton = args.hasShareFlowV2 && !args.isStudent && !hideAssignButton;\n\n if (!isPlugin) {\n if (headerProps.playAllAppLink) {\n actions.push({\n label: getPhrase('playAll'),\n appLink: headerProps.playAllAppLink,\n svgName: cvSvgLibrary.Play,\n className: !isMobile ? 'btn btn-outline-dark me-2' : '',\n button: !isMobile,\n analyticsData,\n analyticsOptions: {\n ...analyticsOptions,\n actionType: UserAction.Play\n }\n });\n }\n\n if (hasAssignActionButton) {\n actions.push({\n label: getPhrase('assign'),\n appLink: AssignAppLinkHelper.flowSelector({\n entityType: 'playlist',\n objectId: headerProps.playlist.id\n }),\n svgName: cvSvgLibrary.Classrooms,\n className: !isMobile ? 'btn btn-outline-dark me-2' : '',\n button: !isMobile,\n analyticsData,\n analyticsOptions: {\n ...analyticsOptions,\n actionType: UserAction.Share,\n entity: EntityType.Assign\n }\n });\n }\n \n if (isUserCurator)\n actions.push({\n label: getOpenInCurationStudioLabel(),\n href: openInCuratorLink,\n openInNewTab: true\n });\n\n actions.push({\n label: !hasAssignActionButton && getPhrase('share'),\n tooltip: hasAssignActionButton && getPhrase('share'),\n appLink: {\n application: AppChannels.SHARE,\n action: Actions.Share.SHARE,\n args: [headerProps.playlist.id],\n params: { entityType: 'playlist' }\n },\n svgName: args.hasShareFlowV2 ? cvSvgLibrary.Link : cvSvgLibrary.Share,\n className: !isMobile ? 'btn btn-outline-dark me-2 align-self-stretch' : '',\n button: !isMobile,\n analyticsData,\n analyticsOptions: {\n ...analyticsOptions,\n actionType: UserAction.Share,\n eventVersion: EventVersion.V3\n }\n });\n }\n\n if (!isOwner) {\n actions.push({\n label: getPhrase(isFollowing ? 'following' : 'follow'),\n onClick: () => {\n setIsFollowing(!isFollowing);\n setShowFollowSpinner(true);\n headerProps.follow(\n !isFollowing,\n () => {\n setShowFollowSpinner(false);\n AnalyticsHelper.logUserAction(analyticsData, {\n ...analyticsOptions,\n actionType: UserAction.Follow,\n descriptor: isFollowing ? ToggleDescriptor.Off : ToggleDescriptor.On,\n workflowPhase: WorkflowPhase.Complete\n });\n },\n () => {\n setShowFollowSpinner(false);\n setIsFollowing(isFollowing);\n }\n );\n },\n svgName: isFollowing ? cvSvgLibrary.BellFilled : cvSvgLibrary.Bell,\n className: !isMobile\n ? `btn follow-btn btn-${isFollowing ? 'outline-dark' : 'dark'} me-2`\n : '',\n button: !isMobile,\n showSpinner: showFollowSpinner\n });\n }\n\n if (isOwner) {\n actions.push({\n label: getPhrase('edit'),\n appLink: {\n application: AppChannels.PLAYLISTS,\n action: Actions.Playlists.EDIT_PLAYLIST,\n args: [headerProps.playlist.id]\n },\n svgName: cvSvgLibrary.Edit,\n button: false,\n analyticsData,\n analyticsOptions: {\n ...analyticsOptions,\n actionType: UserAction.Edit\n }\n });\n\n actions.push({\n label: getPhrase('delete'),\n appLink: {\n application: AppChannels.PLAYLISTS,\n action: Actions.Playlists.DELETE_PLAYLIST,\n args: [headerProps.playlist.id]\n },\n svgName: cvSvgLibrary.Delete,\n className: 'text-danger',\n button: false,\n analyticsData,\n analyticsOptions: {\n ...analyticsOptions,\n actionType: UserAction.Delete\n }\n });\n }\n\n if (headerProps.playlist._isClickViewCurated?.value) {\n actions.push({\n label: getPhrase('copy'),\n appLink: {\n application: AppChannels.PLAYLISTS,\n action: Actions.Playlists.COPY_PLAYLIST,\n args: [headerProps.playlist.id]\n },\n button: false,\n analyticsData,\n analyticsOptions: {\n ...analyticsOptions,\n actionType: UserAction.Copy\n }\n });\n }\n\n return actions;\n }\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"clickViewAvatar\":\"PHe9c\"};","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { PlaylistHeaderDetails } from 'libs/shared/apps/playlists/components/playlist-header-details/PlaylistHeaderDetails';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { BannerHeader } from 'libs/shared/components/banner-header/BannerHeader';\nimport { Breadcrumb, Breadcrumbs, PartialBreadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Classification, CurrentUser, Playlist } from 'libs/shared/interfaces';\nimport { getBgColorClass } from 'libs/shared/utils/getBgColorClass';\n\nimport { usePluginHelper } from 'shared/hooks/use-plugin-helper/usePluginHelper';\n\nimport { SoftGateBanner } from 'apps/sign-up/components/soft-gate-banner/SoftGateBanner';\n\nimport { PartialPlaylistHeader } from './partial-loading/PartialPlaylistHeader';\nimport { PlaylistHeaderUtils } from './PlaylistHeaderUtils';\n\nimport styles from './playlist-header.scss';\n\nexport interface PlaylistHeaderProps {\n playlist: Playlist;\n currentUser: CurrentUser;\n isFollowing: boolean;\n follow: (shouldFollow: boolean, onSuccess: () => void, onError: () => void) => void;\n imageCdnUrl: string;\n showPartialLoading: boolean;\n playAllAppLink: Core.AppLink;\n isUserCurator: boolean;\n openInCuratorLink: string;\n\n // For breadcrumbs\n getBreadcrumbs: () => Breadcrumb[];\n topicPath: Classification[];\n moviesAndTv: boolean;\n classificationId: string;\n totalVideos: number;\n}\n\nexport function PlaylistHeader(props: PlaylistHeaderProps): JSX.Element {\n const { isPlugin } = usePluginHelper();\n const { hasPermissions, getGatedPermission } = usePermissions();\n const { hasShareFlowV2 } = useSettings(null);\n\n // Store isFollowing in local state so that it updates immediately.\n const [ isFollowing, setIsFollowing ] = React.useState(props.isFollowing);\n const [ showFollowSpinner, setShowFollowSpinner ] = React.useState(false);\n\n React.useEffect(() => setIsFollowing(props.isFollowing), [props.isFollowing]);\n\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n\n if (props.showPartialLoading)\n return <PartialPlaylistHeader />;\n\n const description = props.playlist.description;\n\n const actions: ActionOptions[] = PlaylistHeaderUtils.getPlaylistActions(props, {\n isAuthenticated: props.currentUser.isAuthenticated,\n isPlugin,\n isMobile,\n setIsFollowing,\n isFollowing,\n setShowFollowSpinner,\n showFollowSpinner,\n isUserCurator: props.isUserCurator,\n openInCuratorLink: props.openInCuratorLink,\n hasShareFlowV2,\n isStudent: hasPermissions(PermissionName.StudentExperience),\n isGuest: hasPermissions(PermissionName.GuestExperience)\n });\n\n const breadcrumbs = props.getBreadcrumbs();\n\n return (\n <>\n <BannerHeader\n heading={props.playlist.name}\n banner={props.playlist.banner}\n imageCdnUrl={props.imageCdnUrl}\n actions={actions.length && actions}\n actionsDropdownClassName='btn btn-outline-dark'\n blockColourClass={getBgColorClass(props.playlist.name, BG_COLOUR_CLASS_NAMES)}\n detailsComponent={() => (\n <PlaylistHeaderDetails\n playlist={props.playlist}\n currentUser={props.currentUser}\n detailsClassName='mb-n1 font-size-normal fw-normal mt-1'\n clickViewAvatarClassName={styles.clickViewAvatar}\n separatorClassName='mx-1'\n totalVideos={props.totalVideos}\n />\n )}\n />\n {(!!description || !!breadcrumbs?.length) && (\n <div className='border-bottom py-3'>\n {(() => {\n if (!props.playlist || (props.classificationId && !props.topicPath))\n return <PartialBreadcrumbs />;\n\n return (\n <div className='pb-2'>\n {getGatedPermission(PermissionName.CreatePlaylist) === 'soft-gate' && <SoftGateBanner />}\n <Breadcrumbs breadcrumbs={breadcrumbs} />\n </div>\n );\n })()}\n {!!description && <p className='mb-0'>{description}</p>}\n </div>\n )}\n </>\n );\n}\n","import * as React from 'react';\nimport { DragEndEvent, DragStartEvent } from '@dnd-kit/core';\n\nimport { DevError } from 'libs/common/backbone/errors/DevError';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Core } from 'libs/common/core';\n\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { PartialVideoList } from 'libs/shared/components/video-list/partial-loading/PartialVideoList';\nimport { SortableVideoList, VideoList, VideoListProps } from 'libs/shared/components/video-list/VideoList';\nimport { YearGroup } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\ninterface SortableVideoListContainerProps extends VideoListProps {\n playlistId: string;\n yearGroups: YearGroup[];\n onSortComplete: (oldIdx: number, newIdx: number) => void;\n onSortStart?: (index: number) => void;\n canEdit?: boolean;\n showPartialLoading?: boolean;\n fetchRestrictions?: () => void;\n showSignIn?: boolean;\n}\n\nexport function SortableVideoListContainer(props: SortableVideoListContainerProps): React.ReactElement {\n const { onSortComplete, onSortStart, showPartialLoading, ...videoListProps } = props;\n\n const [ currentSortingIndex, setCurrentSortingIndex ] = React.useState<number>();\n\n const onSortStartHandler = (event: DragStartEvent) => {\n const index = props.videos.findIndex(v => v.id.toString() === event.active.id.toString());\n\n setCurrentSortingIndex(index);\n\n if (FunctionHelper.isFunction(onSortStart))\n onSortStart(index);\n };\n\n const onSortEnd = (event: DragEndEvent) => {\n setCurrentSortingIndex(null);\n\n const { active, over } = event;\n \n const oldIndex = props.videos.findIndex(v => v.id.toString() === active.id.toString());\n const newIndex = props.videos.findIndex(v => v.id.toString() === over.id.toString());\n\n if (!FunctionHelper.isFunction(onSortComplete)) {\n Core.ErrorHelper.throw(new DevError('An onSortComplete callback function must be passed to SortableVideoListComponent'));\n return;\n }\n \n onSortComplete(oldIndex, newIndex);\n };\n\n if (showPartialLoading)\n return <PartialVideoList withReordering={props.canEdit || props.showIndexes} />;\n\n if (!props.canEdit)\n return <VideoList {...videoListProps} />;\n\n return (\n <SortableVideoList\n {...videoListProps}\n currentSortingIndex={currentSortingIndex}\n onSortStart={onSortStartHandler}\n onSortEnd={onSortEnd}\n dragHandleIcon={cvSvgLibrary.Hamburger}\n dragHandleIconSize={SvgContainerSize.XXL}\n presentationAudiences={props.presentationAudiences}\n />\n );\n}","import React from 'react';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nconst namespace = 'playlists.playlistEmptyState';\n\nexport function PlaylistEmptyState(): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.Playlists.PLAYLIST_VIDEOS} />\n\n <EmptyState.Heading><Text phrase='heading' /></EmptyState.Heading>\n\n <EmptyState.Info><Text phrase='info' /></EmptyState.Info>\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AssocDescriptor, EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { PlaylistHelper } from 'libs/shared/apps/playlists/utils/PlaylistHelper';\nimport { VideoActionsOptions } from 'libs/shared/context/VideoActionsContext';\nimport { CurrentUser, Playlist, Video, VideoTypes } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { PlaylistNotFoundError } from 'shared/errors/playlists/playlist-not-found/LitePlaylistNotFoundError';\nimport { PlaylistPrivateError } from 'shared/errors/playlists/playlist-private/PlaylistPrivateError';\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\n\nconst getPhrase = LanguageService.encloseNamespace('playlists.playlist');\n\n/**\n * NOTE:\n * This will be wrong if we increase the playlist limit from 100, or\n * stop fetching all 100 videos at once.\n */\nexport function getLastUpdatedDate(videos: Video[]): string {\n const videoLastUpdatedDates: string[] = videos && videos.length && videos.map(v => v.dateAssociated);\n\n return (videoLastUpdatedDates && videoLastUpdatedDates.length)\n ? ArrayHelper.max<string, number>(videoLastUpdatedDates, (date: string) => new Date(date).getTime())\n : null;\n}\n\nexport function usePlaylistViewVideoActions(\n playlist: Playlist,\n currentUser: CurrentUser,\n shareId: string\n) {\n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem, shareId });\n\n if (!PlaylistHelper.isOwner(playlist, currentUser))\n return videoActions;\n\n const getVideoActions = (video: VideoTypes, options?: VideoActionsOptions) => {\n const { canConsume } = VideoHelper.getCanBeConsumed(video);\n\n const removeFromPlaylistAction = {\n label: getPhrase('removeFromPlaylist'),\n button: false,\n svgName: cvSvgLibrary.Delete,\n appLink: {\n application: AppChannels.PLAYLISTS,\n action: Actions.Playlists.REMOVE_VIDEO_FROM_PLAYLIST,\n args: [ video.id, playlist.id ],\n params: { typeId: video.typeId }\n },\n className: 'text-danger',\n analyticsOptions: {\n entity: EntityType.Video,\n actionType: UserAction.Dissociate,\n location: LocationContext.VideoListItem,\n workflowPhase: WorkflowPhase.Start,\n descriptor: AssocDescriptor.Playlist\n },\n analyticsData: {\n id: video.id,\n playlistId: playlist.id\n },\n group: 'delete'\n };\n\n if (!canConsume)\n return [removeFromPlaylistAction];\n\n return [ ...videoActions.getVideoActions(video, options), removeFromPlaylistAction ];\n };\n\n return {\n ...videoActions,\n getVideoActions\n };\n}\n\nexport function logSortAction(playlistId: string, videoId: string, workflowPhase: WorkflowPhase): void {\n AnalyticsHelper.logUserAction({ id: videoId, playlistId }, {\n location: LocationContext.VideoList,\n entity: EntityType.Video,\n actionType: UserAction.Move,\n workflowPhase\n });\n}\n\nexport const playlistErrors = {\n notFound: PlaylistNotFoundError,\n forbidden: {\n privacy: PlaylistPrivateError\n }\n};","import * as React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\n\nimport { LocationContext, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { PlaylistHelper } from 'libs/shared/apps/playlists/utils/PlaylistHelper';\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { RelatedVideosContext } from 'libs/shared/enums/RelatedVideosContext';\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { PlaylistRequests } from 'libs/shared/flight-requests/PlaylistRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useBreadcrumbs } from 'libs/shared/hooks/useBreadcrumbs';\nimport { useCurationStudio } from 'libs/shared/hooks/useCurationStudio';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { useInfiniteList } from 'libs/shared/hooks/UseInfiniteList';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useReorderedItems } from 'libs/shared/hooks/UseReorderedItems';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Classification, Config, Following, OnlineCurrentUser, Playlist, Presentation, PresentationAudience, VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\nimport { ReorderHelper } from 'libs/shared/utils/ReorderHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { useCommonVideoProps } from 'shared/hooks/useCommonVideoProps';\nimport { useDeepLinks } from 'shared/hooks/useDeepLinks';\nimport { useVideoMixin } from 'shared/hooks/useVideoMixin';\nimport { InteractiveHelpers } from 'shared/utils/InteractiveHelper';\nimport { SeoHelper } from 'shared/utils/SeoHelper';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { PlaylistHeader } from 'apps/playlists/components/playlist-header/PlaylistHeader';\nimport { SortableVideoListContainer } from 'apps/playlists/components/video-list/SortableVideoListContainer';\n\nimport { PlaylistEmptyState } from './empty-state/PlaylistEmptyState';\nimport { logSortAction, playlistErrors, usePlaylistViewVideoActions } from './PlaylistViewUtils';\n\nconst namespace = 'playlists.playlist';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface PlaylistViewProps {\n playlistId: string;\n shareId?: string;\n classificationId?: string;\n moviesAndTv?: boolean;\n hideBreadCrumbs?: boolean;\n}\n\nexport function PlaylistView(props: PlaylistViewProps): React.ReactElement {\n const dispatch = useDispatch();\n const alerts = useAlerts();\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const currentUser = Flight.useBasicFetch<OnlineCurrentUser>(UserRequests.currentUser());\n const { isUserCurator, getOpenInCurationStudioLink } = useCurationStudio();\n const { hasPermissions } = usePermissions();\n\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const topicPath = Flight.useBasicFetch<Classification[]>(\n props.classificationId &&\n ClassificationRequests.path(props.classificationId)\n );\n\n const classification = Flight.useBasicFetch<Classification>(\n props.classificationId &&\n ClassificationRequests.classification(props.classificationId, currentUser.data?.id)\n );\n\n const classificationPresentation = Flight.useBasicFetch<Presentation>(\n classification.hasCompleted &&\n ClassificationRequests.presentationById(classification.data?.presentationId)\n );\n\n const shouldFetchAudiences = !currentUser.data?.isAuthenticated\n ? !!classificationPresentation.data?.id\n : !props.classificationId || classificationPresentation.hasCompleted;\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n shouldFetchAudiences &&\n AudienceRequests.presentationAudiences(classificationPresentation.data?.id)\n );\n\n const { commonVideoProps } = useCommonVideoProps({\n locationContext: LocationContext.VideoThumbnail,\n mtv: props.moviesAndTv,\n sharedPlaylist: !!props.shareId\n });\n\n const playlistRequest = props.shareId\n ? PlaylistRequests.getSharedPlaylist(props.playlistId, props.shareId)\n : PlaylistRequests.getPlaylist(props.playlistId);\n\n const playlistItemCountRequest = props.shareId\n ? PlaylistRequests.getSharedPlaylistVideosCount(props.playlistId, props.shareId)\n : PlaylistRequests.getPlaylistVideosCount(props.playlistId);\n\n const playlist = Flight.useBasicFetch<Playlist>(playlistRequest);\n const playlistWithCounts = Flight.useBasicFetch<Playlist>(playlistItemCountRequest);\n\n const getVideoItemActions = usePlaylistViewVideoActions(playlist.data, currentUser.data, props.shareId);\n\n useHandleObjectError(playlist, playlistErrors);\n\n const getVideosRequest = (cursor?: string) => {\n return props.shareId\n ? PlaylistRequests.getSharedPlaylistVideos(props.playlistId, props.shareId, cursor)\n : PlaylistRequests.getPlaylistVideos(props.playlistId, cursor);\n };\n\n const following = Flight.useBasicFetch<Following>(\n currentUser.data?.id &&\n PlaylistRequests.getIsFollowingPlaylist(props.playlistId, currentUser.data?.id)\n );\n\n const fetchNext = (cursor?: string) => {\n Flight.getFetch(dispatch)(getVideosRequest(cursor));\n };\n\n const { items: videos, hasMore, isFetching } = useInfiniteList<VideoTypes>(getVideosRequest, fetchNext);\n\n useVideoMixin(videos);\n\n // Locally stored array of videos used to immediately reflect changes in order.\n const [ reorderedVideos, setReorderedVideos ] = useReorderedItems(videos);\n\n useDeepLinks({ id: props.playlistId, app: 'playlists', shareId: props.shareId });\n useSetPageMetadata(PageMetadataHelper.getPlaylistMetadata({\n content: playlist.data,\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n },\n canonicalLink: SeoHelper.getCanonicalLink({ stripPresentationSlug: true }),\n allowIndexing: false\n }));\n\n const onSortStart = (index: number) => {\n const video = videos[index];\n\n if (video)\n logSortAction(props.playlistId, video.id, WorkflowPhase.Start);\n };\n\n const onSortComplete = (oldIdx: number, newIdx: number) => {\n if (oldIdx === newIdx)\n return;\n\n const video = videos[oldIdx];\n\n if (!video)\n return;\n\n const { reorderedItems, reorderRequest } = ReorderHelper.reorder(videos, oldIdx, newIdx);\n setReorderedVideos(reorderedItems);\n\n logSortAction(props.playlistId, video.id, WorkflowPhase.Complete);\n\n const onError = () => {\n setReorderedVideos(null);\n };\n\n Flight.fetch(dispatch, PlaylistRequests.reorderVideos(props.playlistId, reorderRequest, null, onError));\n };\n\n const follow = (shouldFollow: boolean, onSuccess: () => void, onError: () => void) => {\n const req = shouldFollow\n ? PlaylistRequests.followPlaylist\n : PlaylistRequests.unfollowPlaylist;\n\n const error = () => {\n onError();\n alerts.error(getPhrase(shouldFollow ? 'followError' : 'unfollowError'));\n };\n\n Flight.fetch(dispatch, req(props.playlistId, currentUser.data?.id, onSuccess, error));\n };\n\n const playlistIsEmpty = !!videos && videos.length === 0;\n\n const getVideoAppLink = (\n video: VideoTypes,\n playNext: boolean,\n options: GetVideoAppLinkOptions = {}\n ) => {\n return VideoAppLinkHelper.getAppLink(video, {\n ...options,\n contextId: props.playlistId,\n context: RelatedVideosContext.Playlist,\n shareId: props.shareId,\n moviesAndTv: props.moviesAndTv,\n playNext,\n includeContext: currentUser.data?.isAuthenticated || !!props.shareId\n });\n };\n\n const isFollowingComplete = !currentUser.data?.isAuthenticated || !!following.hasCompleted;\n\n // The play all applink should start from the first consumable video\n const firstPlayAllVideo = videos?.find(v => VideoHelper.getCanBeConsumed(v)?.canConsume);\n const canEdit = PlaylistHelper.isOwner(playlist.data, currentUser.data);\n\n const videoDataLoaded = (\n videos && currentUser.data && config.data\n );\n\n const getSignInAppLink = (appLink: Core.AppLink): Core.AppLink => {\n const redirectUrl = Core.AppLinkHelper.getHref(appLink);\n const params = redirectUrl !== '/' ? { redirectUrl } : {};\n \n return {\n application: AppChannels.DEFAULT,\n action: Actions.Default.CHALLENGE,\n params\n };\n };\n\n const breadcrumbs = useBreadcrumbs({ name: playlist.data?.name });\n\n return (\n <VideoActionsContext.Provider value={currentUser.data?.isAuthenticated && getVideoItemActions}>\n <div className='bg-white px-3'>\n <PlaylistHeader\n playlist={playlist.data}\n currentUser={currentUser.data}\n isFollowing={following.data?.isFollowing}\n follow={follow}\n playAllAppLink={firstPlayAllVideo && getVideoAppLink(firstPlayAllVideo, true)}\n showPartialLoading={!playlist.data || !videoDataLoaded || !isFollowingComplete}\n imageCdnUrl={!!config.data && config.data.imageCdnUrl}\n getBreadcrumbs={() => props.hideBreadCrumbs ? null : breadcrumbs}\n topicPath={topicPath.data}\n moviesAndTv={props.moviesAndTv}\n classificationId={props.classificationId}\n isUserCurator={isUserCurator}\n openInCuratorLink={getOpenInCurationStudioLink(playlist.data?.typeId, playlist.data?.id)}\n totalVideos={PlaylistHelper.getVideoCount(playlistWithCounts.data)}\n />\n <div className='mt-2'>\n {!playlistIsEmpty\n ? (\n <SortableVideoListContainer\n videos={reorderedVideos || videos}\n yearGroups={yearGroups.data}\n playlistId={!!playlist.data && playlist.data.id}\n onSortStart={onSortStart}\n onSortComplete={onSortComplete}\n canEdit={canEdit}\n showPartialLoading={!videoDataLoaded}\n getVideoAppLink={(v, opts) => getVideoAppLink(v, false, opts)}\n showSignIn={!currentUser.data?.isAuthenticated}\n getSignInAppLink={getSignInAppLink}\n canRemovePrivateVideos={canEdit}\n presentationAudiences={props.moviesAndTv ? null : audiences.data}\n showIndexes={true}\n hasPermissions={hasPermissions}\n getPreviewQuestionsAppLink={interactive => InteractiveHelpers.getPreviewQuestionsAppLink(interactive)}\n commonVideoProps={commonVideoProps}\n />\n ) : <PlaylistEmptyState />\n }\n </div>\n {(hasMore || isFetching) && <InfiniteScrollFooter isFetching={isFetching} fetchNext={fetchNext} />}\n </div>\n </VideoActionsContext.Provider>\n );\n}\n","import { useEffect, useState } from 'react';\n\nimport { BaseObject } from 'libs/shared/interfaces';\n\nfunction isOrderEqual(arr1: BaseObject[], arr2: BaseObject[]): boolean {\n let isEqual = true;\n\n if (arr1.length !== arr2.length)\n return false;\n\n for (let i = 0; i < arr1.length; i++) {\n if (arr1[i].id !== arr2[i].id) {\n isEqual = false;\n break;\n }\n }\n\n return isEqual;\n}\n\n/**\n * This function can be used to temporarily store an array of reordered objects\n * until the array obtained from the application store updates to the new order.\n * \n * @param items array of objects from application store.\n */\nexport function useReorderedItems<T extends BaseObject>(\n items: T[]\n): [ T[], React.Dispatch<React.SetStateAction<T[]>> ] {\n const [ reorderedItems, setReorderedItems ] = useState<T[]>();\n\n useEffect(() => {\n if (!reorderedItems)\n return;\n\n if (items.length !== reorderedItems.length || isOrderEqual(items, reorderedItems))\n setReorderedItems(null);\n }, [items]);\n\n return [ reorderedItems, setReorderedItems ];\n}","import React from 'react';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'signUp.softGateBanner';\n\nexport function SoftGateBanner(): JSX.Element {\n return (\n <div role='alert' className='bg-light-indigo text-indigo rounded p-2 mb-4 d-flex align-items-center'>\n <SvgContainer svgName={cvSvgLibrary.StarOutline} size={SvgContainerSize.Large} />\n <Text namespace={namespace} phrase='softGate' /> \n <AppLink\n appLink={{\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.PREMIUM_FEATURES\n }}\n className='indigo-link text-indigo text-underline d-inline'\n >\n <Text namespace={namespace} phrase='learnMore' />\n </AppLink>\n </div>\n );\n}","import { Core } from 'libs/common/backbone/index';\nimport { Flight } from 'libs/common/react/index';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, CurrentUser, VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\n\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { SeriesAppLinkHelper } from 'apps/series/SeriesAppLinkHelper';\n\nimport { usePluginHelper } from './use-plugin-helper/usePluginHelper';\nimport { useLiteFavourites } from './useLiteFavourites';\n\ninterface UseCommonVideoPropsResult {\n hasCommonVideoPropsCompleted: boolean;\n commonVideoProps: CommonVideoProps;\n}\n\ninterface UseCommonVideoPropsOptions {\n locationContext: LocationContext,\n mtv?: boolean;\n flightNamespace?: string;\n sharedPlaylist?: boolean;\n}\n\nexport function useCommonVideoProps(options: UseCommonVideoPropsOptions): UseCommonVideoPropsResult {\n const { locationContext, mtv, flightNamespace, sharedPlaylist } = options || {};\n\n const { isPlugin, params } = usePluginHelper();\n const { setFavourite, canFavourite } = useLiteFavourites(locationContext, flightNamespace);\n const { hasTopicDirectories, isLoadingSettings } = useSettings(null);\n const { hasPermissions, isLoaded: hasLoadedPermissions } = usePermissions();\n const hasStudentExperience = hasPermissions(PermissionName.StudentExperience);\n const hasGuestExperience = hasPermissions(PermissionName.GuestExperience);\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n function getSubTextAppLink(video: VideoTypes): Core.AppLink {\n if (!('series' in video))\n return null;\n\n /**\n * We do not allow navigating to series on shared playlists when the user is not signed in\n * because most series are customer created and will be empty for public users\n * \n * We do not have to do this for shared series, because all the series links are self referencing\n * - Sha\n */\n if (sharedPlaylist && !currentUser.data?.isAuthenticated)\n return null;\n \n return SeriesAppLinkHelper.getSeriesAppLink(video.series, { mtv });\n }\n\n const hasCommonVideoPropsCompleted = (\n !isLoadingSettings &&\n hasLoadedPermissions &&\n config.hasCompleted &&\n currentUser.hasCompleted &&\n (!currentUser.data?.isAuthenticated || yearGroups.hasCompleted)\n );\n\n return {\n hasCommonVideoPropsCompleted,\n commonVideoProps: {\n subTextType: 'series',\n getSubTextAppLink,\n isPlugin,\n isPluginPopup: !!params?.popup,\n canFavourite,\n setFavourite,\n imageCdnUrl: config.data?.imageCdnUrl,\n yearGroups: yearGroups.data,\n getClassroomGuideAppLink: VideoAppLinkHelper.getClassroomGuideAppLink,\n getInteractiveGuidanceAppLink: VideoAppLinkHelper.getInteractiveGuidanceAppLink,\n getResourceGuidanceAppLink: VideoAppLinkHelper.getResourceGuidanceAppLink,\n showNewVideoIndicator: hasTopicDirectories,\n companyLogoFallbackUrl: null,\n hasStudentExperience,\n hasGuestExperience\n }\n };\n}","import { Flight } from 'libs/common/react/index';\n\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useGrowingBatchFetch, useGrowingBatchFetchFunc } from 'libs/shared/hooks/UseBatchFetch';\nimport { Clip, ClipCollection, Video, VideoCollection } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\ntype Types = Video[] | VideoCollection | Clip[] | ClipCollection;\n\nfunction getValidObjects(objects: Types): (Video | Clip)[] {\n if (!objects)\n return [];\n\n if (Array.isArray(objects))\n return objects.filter(o => !!o && (VideoHelper.isVideo(o) || VideoHelper.isClip(o)));\n\n if ('data' in objects)\n return objects.data.filter(o => !!o && (VideoHelper.isVideo(o) || VideoHelper.isClip(o)));\n\n return [];\n}\n\ninterface VideoMixinOptions {\n /**\n * If the videos that are having new data mixed into are sitting on an explicit Flight namespace,\n * providing that namespace here is required\n */\n flightNamespace?: string;\n}\n\nexport function useVideoMixin(objects: Types, options: VideoMixinOptions = {}) {\n const videoIds = getValidObjects(objects).map(v => v.id);\n\n useGrowingBatchFetch(\n videoIds,\n ids => VideoRequests.videoMixinAssocs(ids, options.flightNamespace),\n null\n );\n}\n\nexport function useVideoMixinFunc(options: VideoMixinOptions = {}) {\n function getRequest(ids: string[]): Flight.Request {\n return VideoRequests.videoMixinAssocs(ids, options.flightNamespace);\n }\n \n function fetchObjects(items: Types) {\n return fetchItems(getValidObjects(items).map(v => v.id));\n }\n\n const { fetchItems } = useGrowingBatchFetchFunc({ getRequest });\n\n return { fetchObjects };\n}"],"names":["namespace","ComingSoonTag","props","Tooltip","title","LanguageService","spanHackClassName","spanHack","className","SvgContainer","svgName","onlyIcon","GenericCalendarDate","AppLink","appLink","getAppLink","theme","border","analyticsData","analyticsOptions","background","label","body","type","getBodyClass","text","month","PlaylistHelper","isPlaylist","obj","typeId","isOwner","playlist","currentUser","_liteOwner","id","toString","getVideoCount","count","videos","clips","interactives","BackButton","textShadow","backToName","color","extraClasses","backPhrase","colorClass","textShadowClass","size","S","defaultProps","RATIO","width","height","getSizeClass","heading","length","BannerHeader","banner","imageCdnUrl","actions","sortComponent","blockColourClass","specialEvent","portalContainerContext","BannerPortalContext","imageWidth","useBreakpoints","xxl","specialEventIsToday","showComingSoon","today","DateHelper","Date","endDate","startDate","imageOptions","ratio","resizeType","url","ImageHelper","fallbackBaseUrl","fallbackCategoryName","containerProps","bannerClassName","style","backgroundImage","DetailsComponent","detailsComponent","logoFallbackBgClassName","getBgColorClass","PortalHelper","backButtonAppLink","backButtonText","backButtonClasses","alignLogoLeft","logo","getSpecialEventMonthText","calendarTheme","Text","phrase","LazyImage","src","backgroundColor","logoBgColour","Actions","actionsDropdownClassName","container","prevProps","nextProps","PartialBannerHeader","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","internalServerError","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","CHUNK_SIZE","useBatchFetch","itemIds","getRequest","requests","map","chunk","responses","itemsArr","data","items","reduce","acc","item","isFetching","hasCompleted","useGrowingBatchFetch","objs","_getKey","getKey","useGrowingBatchFetchFunc","fetchItems","join","options","fetchedItems","Set","setRequests","hasFirstRequestCompleted","unfetchedItems","forEach","key","current","has","push","add","r","generateCacheKey","flightObjs","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","Array","isArray","useEffect","SCROLL_TOLERANCE","useInfiniteList","fetchNext","onError","getItems","getCursor","scrollContainer","handleScroll","useState","pagesFetched","setPagesFetched","fetchNextFn","response","cursor","request","fetchNextPage","currentVal","nextCursor","hasMore","getBoundingClientRect","scrollTop","scrollHeight","window","innerHeight","document","documentElement","onScroll","FunctionHelper","addEventListener","removeEventListener","shouldInitialFetch","httpStatusClass","substr","HttpStatus","totalItems","hasFirstPageCompleted","useBreadcrumbs","match","breadcrumbs","useBuilder","active","Separator","getPlaylistOwnerName","name","surname","TextHelper","substring","split","PlaylistHeaderDetails","currentUserIsOwner","followerCount","followers","lastUpdated","contentModifiedDate","now","getLastUpdated","detailsClassName","hideOwnerName","_isClickViewCurated","value","clickViewAvatarClassName","ClickViewAvatar","user","separatorClassName","totalVideos","smartCount","timeAgo","PartialPlaylistHeader","getPhrase","PlaylistHeaderUtils","getPlaylistActions","headerProps","args","isAuthenticated","isPlugin","isMobile","setIsFollowing","isFollowing","setShowFollowSpinner","showFollowSpinner","isUserCurator","openInCuratorLink","videoCount","interactiveCount","clipCount","isClickViewPlaylist","location","entity","workflowPhase","isGuest","hideAssignButton","AssignHelper","hasAssignActionButton","hasShareFlowV2","isStudent","playAllAppLink","button","actionType","AssignAppLinkHelper","entityType","objectId","href","openInNewTab","tooltip","application","action","params","eventVersion","onClick","follow","AnalyticsHelper","descriptor","showSpinner","PlaylistHeader","usePluginHelper","usePermissions","hasPermissions","getGatedPermission","useSettings","showPartialLoading","description","PermissionName","getBreadcrumbs","classificationId","topicPath","SoftGateBanner","Breadcrumbs","SortableVideoListContainer","onSortComplete","onSortStart","videoListProps","currentSortingIndex","setCurrentSortingIndex","PartialVideoList","withReordering","canEdit","showIndexes","event","index","findIndex","v","onSortEnd","over","oldIndex","newIndex","DevError","dragHandleIcon","dragHandleIconSize","presentationAudiences","VideoList","PlaylistEmptyState","EmptyState","ImageUrls","logSortAction","playlistId","videoId","playlistErrors","PlaylistPrivateError","PlaylistView","dispatch","alerts","config","ConfigRequests","UserRequests","useCurationStudio","getOpenInCurationStudioLink","yearGroups","CustomerRequests","customerId","ClassificationRequests","classification","classificationPresentation","presentationId","shouldFetchAudiences","audiences","AudienceRequests","commonVideoProps","useCommonVideoProps","locationContext","mtv","moviesAndTv","sharedPlaylist","shareId","playlistRequest","PlaylistRequests","playlistItemCountRequest","playlistWithCounts","getVideoItemActions","videoActions","useVideoActions","getVideoActions","video","canConsume","VideoHelper","removeFromPlaylistAction","group","usePlaylistViewVideoActions","getVideosRequest","following","useVideoMixin","reorderedItems","setReorderedItems","arr1","arr2","isEqual","i","isOrderEqual","reorderedVideos","setReorderedVideos","useDeepLinks","app","useSetPageMetadata","PageMetadataHelper","content","phraseContext","phraseHandler","titlePhrase","descriptionPhrase","canonicalLink","SeoHelper","stripPresentationSlug","allowIndexing","playlistIsEmpty","playNext","VideoAppLinkHelper","contextId","context","RelatedVideosContext","includeContext","isFollowingComplete","firstPlayAllVideo","find","videoDataLoaded","VideoActionsContext","shouldFollow","onSuccess","req","error","hideBreadCrumbs","oldIdx","newIdx","ReorderHelper","reorderRequest","getVideoAppLink","opts","showSignIn","getSignInAppLink","redirectUrl","canRemovePrivateVideos","getPreviewQuestionsAppLink","interactive","InteractiveHelper","InfiniteScrollFooter","role","flightNamespace","u","setFavourite","canFavourite","hasTopicDirectories","isLoadingSettings","hasLoadedPermissions","isLoaded","hasStudentExperience","hasGuestExperience","hasCommonVideoPropsCompleted","subTextType","getSubTextAppLink","series","isPluginPopup","popup","getClassroomGuideAppLink","getInteractiveGuidanceAppLink","getResourceGuidanceAppLink","showNewVideoIndicator","companyLogoFallbackUrl","getValidObjects","objects","filter","o","videoIds","ids","useVideoMixinFunc","fetchObjects"],"sourceRoot":""}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[3893],{73893:(e,t,a)=>{a.r(t),a.d(t,{PremiumFeaturesView:()=>N});var i=a(32735),n=a(81886),s=a(31453),r=a(15611),l=a(25882),c=a(79612),o=a(14070),m=a(97291),d=[{title:"Discover and Explore",items:["All subject hubs","Special events calendar","Movies + TV"]},{title:"Watch & learn",items:["HD playback","Clips","Citations","Transcripts","Resources","iOS and Android apps"]}],u=[{title:"Teach & assign",items:["Classrooms","Classroom analytics","Interactive quizzes"]},{title:"Create & manage",items:["Upload and manage videos","Favourite videos","Create playlists"]},{title:"Share integrations",items:["Google Classroom integration","Microsoft Teams integration"]}],g=[{title:"Integrations",items:["SSO","Rostering","Library cataloguing integrations","LMS integrations","LTI support","Export library data","RSS feed"]},{title:"Cast integrations",items:["Apple TV integration","Vivi integration"]},{title:"District management",items:["Library Editor","District library","District analytics"]},{title:"Content control & compliance",items:["Access settings","Student permissions","Content review","Content restrictions"]},{title:"Accessibility & Equity",items:["Local Cache"]}];function p(e){var t=e.sections;return i.createElement(i.Fragment,null,t.map(function(e){return i.createElement("div",{className:t[t.length-1].title===e.title?"":"mb-3",key:e.title},i.createElement("div",{className:"fw-semibold mb-1"},e.title),i.createElement("ul",{className:"mb-0"},e.items.map(function(e){return i.createElement("li",{key:e},e)})))}))}function b(){return i.createElement("span",{className:(0,s.A)("badge badge-wrapper rounded-pill d-flex justify-content-center","fw-medium text-indigo badge-sm bg-light-indigo")},"Active")}function v(e){var t=e.currentPlan;return i.createElement("div",{className:"card-body"},i.createElement("div",{className:"d-flex justify-content-between align-items-start mb-2"},i.createElement("h2",{className:"h5 mb-0"},"Teacher"),t&&i.createElement(b,null)),i.createElement("div",{className:"h1 fw-bold"},"Free"),i.createElement("p",{className:"text-body mt-2 mb-0"},"For educators creating engaging, inclusive, interactive classrooms."))}function E(e){var t=e.currentPlan;return i.createElement("div",{className:"card-body"},i.createElement("div",{className:"d-flex justify-content-between align-items-start mb-2"},i.createElement("h2",{className:"h5 mb-0"},"Teacher"),t&&i.createElement(b,null)),i.createElement("div",{className:"h1 fw-bold mb-1"},"14 day trial*"),i.createElement("p",{className:"text-muted mb-3"},"*change to Teacher Free after trial finishes"),i.createElement("p",{className:"mb-3 text-body"},"For teachers boosting engagement, personalizing learning, and giving real-time feedback."),i.createElement(r.F,{className:"btn btn-dark w-100",appLink:{application:m.O.SIGN_UP,action:o.e.SignUp.INVITE_COLLEAGUE}},"Invite a colleague to extend"))}function h(e){var t=e.currentPlan;return i.createElement("div",{className:"card-body"},i.createElement("div",{className:"d-flex justify-content-between align-items-start mb-2"},i.createElement("h2",{className:"h5 mb-0"},"School & District"),t&&i.createElement(b,null)),i.createElement("div",{className:"h1 fw-bold"},"Premium"),i.createElement("p",{className:"text-body mb-5"},"For schools and districts providing teachers with a platform for differentiated instruction across all grades and subjects."),i.createElement(r.F,{className:"btn btn-outline-dark w-100",appLink:{application:m.O.SIGN_UP,action:o.e.SignUp.UPGRADE}},"Request pricing"))}function f(e){var t=e.TopSection,a=e.sections,n=e.sectionsHeading,r=e.currentPlan;return i.createElement("div",{className:"col-12 col-xl-4"},i.createElement("div",{className:(0,s.A)("card h-100 shadow-sm",r&&"border-indigo")},i.createElement("div",{style:{minHeight:260}},i.createElement(t,{currentPlan:r})),i.createElement("div",{className:"card-body border-top"},i.createElement("div",{className:"fw-semibold mb-2"},n),i.createElement(p,{sections:a}))))}function N(){(0,c.M)({title:"Explore our premium features"});var e=(0,l.vb)(),t=e.accessPolicy,a=e.isLoaded;return i.useEffect(function(){a&&(l.uV.has(null==t?void 0:t.id)||n.Q.C$.trigger({application:m.O.DASHBOARD,action:o.e.Dashboard.HOME}))},[a,t]),i.createElement("div",{className:"container p-3"},i.createElement("h1",{className:"h3 mb-4"},"Explore our plans"),i.createElement("div",{className:"row g-4"},i.createElement(f,{TopSection:v,sections:d,sectionsHeading:"What you can do:",currentPlan:"system_cv_trial_reverse_ended_v1"===(null==t?void 0:t.id)}),i.createElement(f,{TopSection:E,sections:u,sectionsHeading:"Everything in previous, plus:",currentPlan:"system_cv_trial_reverse_14_v1"===(null==t?void 0:t.id)}),i.createElement(f,{TopSection:h,sections:g,sectionsHeading:"Everything in previous, plus:",currentPlan:!1})))}}}]);
|
|
2
|
+
//# sourceMappingURL=3893-2856933742-lite.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts/3893-2856933742-lite.chunk.js","mappings":"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","sources":["file:///app/packages/projects/lite/src/apps/sign-up/views/premium-features/PremiumFeaturesView.tsx"],"sourcesContent":["import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { EXPERIMENTAL_GATED_ACCESS_POLICY_IDS, useAccessPolicy } from 'libs/shared/hooks/useAccessPolicy';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\ntype FeatureSection = {\n title: string;\n items: string[];\n};\n\nconst FREE_SECTIONS: FeatureSection[] = [\n {\n title: 'Discover and Explore',\n items: [\n 'All subject hubs',\n 'Special events calendar',\n 'Movies + TV'\n ]\n },\n {\n title: 'Watch & learn',\n items: [\n 'HD playback',\n 'Clips',\n 'Citations',\n 'Transcripts',\n 'Resources',\n 'iOS and Android apps'\n ]\n }\n];\n\nconst PREMIUM_SECTIONS: FeatureSection[] = [\n {\n title: 'Teach & assign',\n items: [\n 'Classrooms',\n 'Classroom analytics',\n 'Interactive quizzes'\n ]\n },\n {\n title: 'Create & manage',\n items: [\n 'Upload and manage videos',\n 'Favourite videos',\n 'Create playlists'\n ]\n },\n {\n title: 'Share integrations',\n items: [\n 'Google Classroom integration',\n 'Microsoft Teams integration'\n ]\n }\n];\n\nconst SCHOOLS_SECTIONS: FeatureSection[] = [\n {\n title: 'Integrations',\n items: [\n 'SSO',\n 'Rostering',\n 'Library cataloguing integrations',\n 'LMS integrations',\n 'LTI support',\n 'Export library data',\n 'RSS feed'\n ]\n },\n {\n title: 'Cast integrations',\n items: [\n 'Apple TV integration',\n 'Vivi integration'\n ]\n },\n {\n title: 'District management',\n items: [\n 'Library Editor',\n 'District library',\n 'District analytics'\n ]\n },\n {\n title: 'Content control & compliance',\n items: [\n 'Access settings',\n 'Student permissions',\n 'Content review',\n 'Content restrictions'\n ]\n },\n {\n title: 'Accessibility & Equity',\n items: [\n 'Local Cache'\n ]\n }\n];\n\nfunction FeatureSections(props: { sections: FeatureSection[] }): JSX.Element {\n const { sections } = props;\n return (\n <>\n {sections.map(section => (\n <div className={sections[sections.length - 1].title === section.title ? '' : 'mb-3'} key={section.title}>\n <div className='fw-semibold mb-1'>{section.title}</div>\n <ul className='mb-0'>\n {section.items.map(item => (\n <li key={item}>{item}</li>\n ))}\n </ul>\n </div>\n ))}\n </>\n );\n}\n\nfunction CurrentPlanBadge(): JSX.Element {\n return (\n <span className={classNames(\n 'badge badge-wrapper rounded-pill d-flex justify-content-center',\n 'fw-medium text-indigo badge-sm bg-light-indigo'\n )}>\n Active\n </span>\n );\n}\n\nfunction TeacherFreeTop({ currentPlan }: { currentPlan: boolean }): JSX.Element {\n return (\n <div className='card-body'>\n <div className='d-flex justify-content-between align-items-start mb-2'>\n <h2 className='h5 mb-0'>Teacher</h2>\n {currentPlan && <CurrentPlanBadge />}\n </div>\n <div className='h1 fw-bold'>Free</div>\n <p className='text-body mt-2 mb-0'>\n For educators creating engaging, inclusive, interactive classrooms.\n </p>\n </div>\n );\n}\n\nfunction TeacherPremiumTop({ currentPlan }: { currentPlan: boolean }): JSX.Element {\n return (\n <div className='card-body'>\n <div className='d-flex justify-content-between align-items-start mb-2'>\n <h2 className='h5 mb-0'>Teacher</h2>\n {currentPlan && <CurrentPlanBadge />}\n </div>\n <div className='h1 fw-bold mb-1'>14 day trial*</div>\n <p className='text-muted mb-3'>*change to Teacher Free after trial finishes</p>\n <p className='mb-3 text-body'>For teachers boosting engagement, personalizing learning, and giving real-time feedback.</p>\n <AppLink\n className='btn btn-dark w-100'\n appLink={{\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.INVITE_COLLEAGUE\n }}\n >\n Invite a colleague to extend\n </AppLink>\n </div>\n );\n}\n\nfunction SchoolsDistrictsTop({ currentPlan }: { currentPlan: boolean }): JSX.Element {\n return (\n <div className='card-body'>\n <div className='d-flex justify-content-between align-items-start mb-2'>\n <h2 className='h5 mb-0'>School & District</h2>\n {currentPlan && <CurrentPlanBadge />}\n </div>\n <div className='h1 fw-bold'>Premium</div>\n <p className='text-body mb-5'>\n For schools and districts providing teachers with a platform for\n differentiated instruction across all grades and subjects.\n </p>\n <AppLink\n className='btn btn-outline-dark w-100'\n appLink={{\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.UPGRADE\n }}\n >\n Request pricing\n </AppLink>\n </div>\n );\n}\n\ntype PlanColumnProps = {\n TopSection: React.ComponentType<{ currentPlan: boolean }>;\n sections: FeatureSection[];\n sectionsHeading: string;\n currentPlan: boolean;\n};\n\nfunction PlanColumn(props: PlanColumnProps): JSX.Element {\n const {\n TopSection,\n sections,\n sectionsHeading,\n currentPlan\n } = props;\n\n return (\n <div className='col-12 col-xl-4'>\n <div className={classNames('card h-100 shadow-sm', currentPlan && 'border-indigo')}>\n <div style={{ minHeight: 260 }}>\n <TopSection currentPlan={currentPlan} />\n </div>\n <div className='card-body border-top'>\n <div className='fw-semibold mb-2'>{sectionsHeading}</div>\n <FeatureSections sections={sections} />\n </div>\n </div>\n </div>\n );\n}\n\nexport function PremiumFeaturesView(): JSX.Element {\n useSetPageMetadata({ title: 'Explore our premium features' });\n\n const { accessPolicy, isLoaded } = useAccessPolicy();\n\n React.useEffect(() => {\n if (!isLoaded)\n return;\n \n if (EXPERIMENTAL_GATED_ACCESS_POLICY_IDS.has(accessPolicy?.id))\n return;\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.DASHBOARD,\n action: Actions.Dashboard.HOME\n });\n }, [ isLoaded, accessPolicy ]);\n\n return (\n <div className='container p-3'>\n <h1 className='h3 mb-4'>Explore our plans</h1>\n\n <div className='row g-4'>\n {/* Teacher Free */}\n <PlanColumn\n TopSection={TeacherFreeTop}\n sections={FREE_SECTIONS}\n sectionsHeading='What you can do:'\n currentPlan={accessPolicy?.id === 'system_cv_trial_reverse_ended_v1'}\n />\n\n {/* Teacher Premium */}\n <PlanColumn\n TopSection={TeacherPremiumTop}\n sections={PREMIUM_SECTIONS}\n sectionsHeading='Everything in previous, plus:'\n currentPlan={accessPolicy?.id === 'system_cv_trial_reverse_14_v1'}\n />\n\n {/* Schools & Districts */}\n <PlanColumn\n TopSection={SchoolsDistrictsTop}\n sections={SCHOOLS_SECTIONS}\n sectionsHeading='Everything in previous, plus:'\n currentPlan={false}\n />\n </div>\n </div>\n );\n}"],"names":["FREE_SECTIONS","title","items","PREMIUM_SECTIONS","SCHOOLS_SECTIONS","FeatureSections","props","sections","map","section","className","length","key","item","CurrentPlanBadge","TeacherFreeTop","currentPlan","TeacherPremiumTop","appLink","application","action","SchoolsDistrictsTop","PlanColumn","TopSection","sectionsHeading","style","minHeight","PremiumFeaturesView","accessPolicy","isLoaded","id"],"sourceRoot":""}
|