@clickview/lite 0.52.4-rc.0 → 0.52.4-rc.2
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/{1329-lite-cdc45079de.chunk.css → 1329-lite-be86e46c78.chunk.css} +1 -1
- package/dist/css/{1760-lite-19ef9620ac.chunk.css → 1760-lite-bcd14ea6d2.chunk.css} +1 -1
- package/dist/css/{5549-lite-d751a30ca4.chunk.css → 3640-lite-97ed26d0aa.chunk.css} +1 -1
- package/dist/css/{5220-lite-8b4a93ca31.chunk.css → 5220-lite-9832e2c2fb.chunk.css} +1 -1
- package/dist/css/{3640-lite-d751a30ca4.chunk.css → 5549-lite-97ed26d0aa.chunk.css} +1 -1
- package/dist/css/{6094-lite-19ef9620ac.chunk.css → 6094-lite-bcd14ea6d2.chunk.css} +1 -1
- package/dist/scripts/{1329-57aa3d33cb-lite.chunk.js → 1329-9abd7031af-lite.chunk.js} +2 -2
- package/dist/scripts/{1329-57aa3d33cb-lite.chunk.js.map → 1329-9abd7031af-lite.chunk.js.map} +1 -1
- package/dist/scripts/{1760-19e88443c6-lite.chunk.js → 1760-8d51aa0b08-lite.chunk.js} +1 -1
- package/dist/scripts/{1760-19e88443c6-lite.chunk.js.map → 1760-8d51aa0b08-lite.chunk.js.map} +1 -1
- package/dist/scripts/{3640-ac303efb99-lite.chunk.js → 3640-1ac0a110f4-lite.chunk.js} +1 -1
- package/dist/scripts/{3640-ac303efb99-lite.chunk.js.map → 3640-1ac0a110f4-lite.chunk.js.map} +1 -1
- package/dist/scripts/5220-a0599fa845-lite.chunk.js +3 -0
- package/dist/scripts/5220-a0599fa845-lite.chunk.js.map +1 -0
- package/dist/scripts/{5549-ae40aeb0f8-lite.chunk.js → 5549-e0ed88aaa1-lite.chunk.js} +1 -1
- package/dist/scripts/{5549-ae40aeb0f8-lite.chunk.js.map → 5549-e0ed88aaa1-lite.chunk.js.map} +1 -1
- package/dist/scripts/{6094-d5fa8b07dc-lite.chunk.js → 6094-8546003d79-lite.chunk.js} +1 -1
- package/dist/scripts/{6094-d5fa8b07dc-lite.chunk.js.map → 6094-8546003d79-lite.chunk.js.map} +1 -1
- package/dist/scripts/6852-2ff4fd69ed-lite.chunk.js +2 -0
- package/dist/scripts/6852-2ff4fd69ed-lite.chunk.js.map +1 -0
- package/dist/scripts/8055-3449680f69-lite.chunk.js +3 -0
- package/dist/scripts/8055-3449680f69-lite.chunk.js.map +1 -0
- package/dist/scripts/{bundle-507079f8c6.min.js → bundle-3908df5fdf.min.js} +3 -3
- package/dist/scripts/{bundle-507079f8c6.min.js.map → bundle-3908df5fdf.min.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/5220-58d9529f21-lite.chunk.js +0 -3
- package/dist/scripts/5220-58d9529f21-lite.chunk.js.map +0 -1
- package/dist/scripts/6852-96412e2088-lite.chunk.js +0 -2
- package/dist/scripts/6852-96412e2088-lite.chunk.js.map +0 -1
- package/dist/scripts/8055-7d46e34c6a-lite.chunk.js +0 -3
- package/dist/scripts/8055-7d46e34c6a-lite.chunk.js.map +0 -1
- /package/dist/scripts/{1329-57aa3d33cb-lite.chunk.js.LICENSE.txt → 1329-9abd7031af-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{5220-58d9529f21-lite.chunk.js.LICENSE.txt → 5220-a0599fa845-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{8055-7d46e34c6a-lite.chunk.js.LICENSE.txt → 8055-3449680f69-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{bundle-507079f8c6.min.js.LICENSE.txt → bundle-3908df5fdf.min.js.LICENSE.txt} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts/5220-a0599fa845-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/common/src/react/hooks/UseEventsServiceSubscribe.ts","file:///app/packages/libs/common/src/react/services/EventsService.ts","file:///app/packages/libs/shared/src/components/curriculum-links/CurriculumLinkItem.tsx","file:///app/packages/libs/shared/src/components/curriculum-links/CurriculumLinksEmptyState.tsx","file:///app/packages/libs/shared/src/components/curriculum-links/partial-loading/PartialCurriculumLinks.tsx","file:///app/packages/libs/shared/src/components/curriculum-links/partial-loading/partial-curriculum-links.scss","file:///app/packages/libs/shared/src/components/play-page-v2/curriculum-links/curriculum-links.scss","file:///app/packages/libs/shared/src/components/play-page-v2/curriculum-links/CurriculumLinksV2.tsx","file:///app/packages/libs/shared/src/components/play-page-v2/curriculum-links/CurriculumsWidget.tsx","file:///app/packages/libs/shared/src/components/play-page-v2/glance/VideoAtAGlanceUtilsV2.ts","file:///app/packages/libs/shared/src/components/play-page-v2/glance/points-of-interest-list/points-of-interest-list.scss","file:///app/packages/libs/shared/src/components/play-page-v2/glance/points-of-interest-list/PointsOfInterestList.tsx","file:///app/packages/libs/shared/src/components/play-page-v2/glance/VideoAtAGlanceV2.tsx","file:///app/packages/libs/shared/src/components/tags/PartialTagItem.tsx","file:///app/packages/libs/shared/src/components/tags/TagHelper.ts","file:///app/packages/libs/shared/src/components/tags/TagItem.tsx","file:///app/packages/libs/shared/src/components/tags/TagList.tsx","file:///app/packages/libs/shared/src/components/widgets/curated-widgets/components/header/widget-header.scss","file:///app/packages/libs/shared/src/components/widgets/curated-widgets/components/header/WidgetHeader.tsx","file:///app/packages/libs/shared/src/components/widgets/hooks/useWidgetKeyboard.ts","file:///app/packages/libs/shared/src/utils/DragHelper.ts","file:///app/packages/libs/shared/src/components/widgets/sliding-list/SlidingListContainer.tsx","file:///app/packages/libs/shared/src/components/widgets/widget-button/widget-button.scss","file:///app/packages/libs/shared/src/components/widgets/widget-button/WidgetButton.tsx","file:///app/packages/libs/shared/src/enums/CssMeasurement.ts","file:///app/packages/libs/shared/src/enums/CurriculumType.ts","file:///app/packages/libs/shared/src/enums/TagType.ts","file:///app/packages/libs/shared/src/enums/WidgetInteraction.ts","file:///app/packages/libs/shared/src/hooks/UseGetMediaQueryString.ts","file:///app/packages/projects/lite/src/shared/hooks/useVideoFeatureAccess.ts","file:///app/packages/libs/shared/src/components/video-guidance/classroom-guide/popup/VideoGuidanceClassroomGuidePopup.tsx","file:///app/packages/projects/lite/src/shared/views/video-guidance-classroom-guide/VideoGuidanceClassroomGuideView.tsx","file:///app/node_modules/copy-to-clipboard/index.js","file:///app/packages/libs/shared/src/components/curriculum-links/curriculum-links.scss","file:///app/packages/libs/shared/src/components/play-page-v2/glance/video-at-a-glance.scss","file:///app/packages/libs/shared/src/components/tags/tags.scss","file:///app/node_modules/react-copy-to-clipboard/lib/Component.js","file:///app/node_modules/react-copy-to-clipboard/lib/index.js","file:///app/node_modules/toggle-selection/index.js"],"sourcesContent":["import { useEffect } from 'react';\n\nimport { EventsService } from 'libs/common/react/services/EventsService';\n\n/**\n * \n * @param event the event to subscribe to\n * @param callback the callback function\n * @param once whether to subscribe once\n * @param shouldSubscribe conditionally determine whether to subscribe to events\n * @returns unsubscribe function\n */\nexport function useEventsServiceSubscribe(\n event: string,\n callback: (...args: any[]) => void,\n once?: boolean,\n shouldSubscribe?: boolean\n): () => void {\n const unsubscribe = () => {\n EventsService.unsubscribe(event, callback);\n };\n\n useEffect(() => {\n if (!shouldSubscribe)\n return;\n\n once ? EventsService.subscribeOnce(event, callback) : EventsService.subscribe(event, callback);\n\n return () => {\n unsubscribe();\n };\n }, []);\n\n return unsubscribe;\n}","type EventCallback = (...args: any[]) => void;\n\ninterface EventListener {\n callback: EventCallback,\n executionLimit?: number;\n executionCount?: number;\n}\n\ninterface EventsListenerHash {\n [event: string]: EventListener[];\n}\n\nexport class StaticEventsService {\n public subscribe(event: string, callback: EventCallback): void {\n this.registerListener(event, callback);\n }\n\n public subscribeOnce(event: string, callback: EventCallback): void {\n this.registerListener(event, callback, 1);\n }\n\n public unsubscribe(event: string, callback?: EventCallback): void {\n this.deregisterListener(event, callback);\n }\n\n public trigger(event: string, ...args: any[]): void {\n this.triggerCallbacks(event, args);\n }\n\n /**\n * Private functions/members below\n */\n\n private listeners: EventsListenerHash = {};\n\n private registerListener(event: string, callback: EventCallback, executionLimit?: number) {\n if (typeof event !== 'string')\n throw new Error('Event name must be a string');\n\n if (typeof callback !== 'function')\n throw new Error('Event callback must be a function');\n\n if (!!executionLimit && typeof executionLimit !== 'number')\n throw new Error('Execution limit must be a number or undefined');\n\n this.listeners[event] = this.listeners[event] ?? [];\n this.listeners[event].push({ callback, executionLimit });\n }\n\n private deregisterListener(event: string, callback?: EventCallback): void {\n if (typeof event !== 'string')\n throw new Error('Event name must be a string');\n\n if (!!callback && typeof callback !== 'function')\n throw new Error('Event callback must be a function');\n \n if (!callback) {\n this.listeners[event] = [];\n return;\n }\n\n const idxToRemove = this.listeners[event]?.findIndex(e => e.callback === callback);\n\n if (typeof idxToRemove !== 'number' || idxToRemove === -1)\n return;\n\n this.listeners[event].splice(idxToRemove, 1);\n\n if (this.listeners[event].length === 0)\n delete this.listeners[event];\n }\n\n private triggerCallbacks(event: string, ...args: any[]): void {\n if (!this.listeners[event])\n return;\n\n const callbacksToRemove: EventCallback[] = [];\n\n this.listeners[event].forEach(listener => {\n if (typeof listener.executionLimit === 'number') {\n listener.executionCount = listener.executionCount ?? 0;\n listener.executionCount++;\n\n if (listener.executionCount === listener.executionLimit)\n callbacksToRemove.push(listener.callback);\n }\n\n listener.callback.apply(null, ...args);\n });\n\n if (!callbacksToRemove.length)\n return;\n\n callbacksToRemove.forEach(callback => this.deregisterListener(event, callback));\n }\n}\n\nexport const EventsService = new StaticEventsService();","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { Presentation } from 'libs/shared/interfaces';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\n\nimport styles from './curriculum-links.scss';\n\nconst namespace = 'shared.curriculumLinks';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface CurriculumLinkItemProps {\n data: Presentation;\n onChangeCurriculum: (id: string) => any;\n selected: boolean;\n}\n\nexport function CurriculumLinkItem(props: CurriculumLinkItemProps): JSX.Element {\n const { data: curriculumTag } = props;\n\n return (\n <DivButton\n key={curriculumTag.id}\n className={`p-1 pe-2 rounded-pill d-inline-flex align-items-center cursor-pointer ${styles.tag} ${props.selected ? styles.selected : ''}`}\n onClick={() => props.onChangeCurriculum(curriculumTag.id.toString())}\n aria-label={`${getPhrase('ariaFilter')} ${curriculumTag.name}`}\n >\n <div className={`bg-white ${styles.cover} rounded-circle border`}>\n <img\n src={ImageHelper.createUrl(curriculumTag.cover.url, { size: ImageSize.Small })}\n alt={curriculumTag.name}\n className='rounded-circle'\n />\n </div>\n <div className='ms-2'>\n {curriculumTag.name}\n </div>\n </DivButton>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'shared.curriculumLinks';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface CurriculumLinksEmptyStateProps {\n emptyStateUrl: string;\n}\n\nexport function CurriculumLinksEmptyState(props: CurriculumLinksEmptyStateProps): JSX.Element {\n return (\n <EmptyState className='pt-3'>\n <EmptyState.Image src={props.emptyStateUrl} altText={getPhrase('emptyInfo')} size='small'/>\n <EmptyState.Heading>\n <Text namespace={namespace} phrase='emptyHeading' />\n </EmptyState.Heading>\n <EmptyState.Info>\n <Text namespace={namespace} phrase='emptyInfo' />\n </EmptyState.Info>\n </EmptyState>\n );\n}","import React from 'react';\n\nimport styles from './partial-curriculum-links.scss';\n\nconst PartialCurriculumLinkSection = () => (\n <>\n <div className={`partial-loading-background rounded-pill py-1 px-2 d-inline-block me-1 mb-2 ${styles.audience}`} />\n <div>\n <div className={`partial-loading-background mb-1 ${styles.area}`} />\n\n <div className='mb-2 d-flex'>\n <div className={`me-1 align-self-start ${styles.code}`}>\n <div className={`partial-loading-background rounded-pill py-1 px-2 d-inline-block w-100 h-100`} />\n </div>\n \n <div className={`partial-loading-background ${styles.description}`} />\n </div>\n </div>\n </>\n);\n\nexport function PartialCurriculumLinks(): JSX.Element {\n return (\n <div>\n <div className='mb-3'>\n <PartialCurriculumLinkSection />\n </div>\n\n <div className='mb-3'>\n <PartialCurriculumLinkSection />\n </div>\n\n <div>\n <PartialCurriculumLinkSection />\n </div>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"audience\":\"vDcrq\",\"area\":\"GXhoW\",\"code\":\"goKaS\",\"description\":\"vFew6\"};","// extracted by mini-css-extract-plugin\nexport default {\"curriculumSubject\":\"i4D3h\",\"curriculumSet\":\"WCdf9\",\"areaLeafSet\":\"o8H8s\",\"closeButton\":\"McsPs\",\"leafDescriptionOnly\":\"xmEEo\"};","import React from 'react';\n\nimport { CurriculumLinksEmptyState } from 'libs/shared/components/curriculum-links/CurriculumLinksEmptyState';\nimport { PartialCurriculumLinks } from 'libs/shared/components/curriculum-links/partial-loading/PartialCurriculumLinks';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { CurriculumType } from 'libs/shared/enums/CurriculumType';\nimport { Curriculum } from 'libs/shared/interfaces';\n\nimport styles from './curriculum-links.scss';\n\nconst BRACKET_SEGMENT_REGEX = /(.*)\\s\\((.*)?\\)/i;\n\nconst namespace = 'shared.curriculumLinks';\n\nconst BASE_PILL_CLASS = 'text-nowrap font-size-normal rounded-pill py-1 px-2 my-0 d-inline-block fw-semibold';\n\ninterface CurriculumStructure {\n [CurriculumType.Subject]: Curriculum<CurriculumType.Subject>;\n [CurriculumType.Audience]: Curriculum<CurriculumType.Audience>;\n areasAndLeaves: Array<{\n [CurriculumType.Area]: Curriculum<CurriculumType.Area>[];\n [CurriculumType.Leaf]: Curriculum<CurriculumType.Leaf>[];\n }>;\n}\n\ninterface CurriculumLeafProps {\n leaf: Curriculum<CurriculumType.Leaf>;\n codeWidth: number;\n trySetMaxCodeWidth: React.Dispatch<React.SetStateAction<number>>;\n uiContainsCodes: boolean;\n}\n\nfunction CurriculumLeaf(props: CurriculumLeafProps): JSX.Element {\n function getCurriculumCodeClass(): string {\n const baseClass = BASE_PILL_CLASS + ' bg-white border';\n\n // If a leaf has no code but the rest of the UI has leaf nodes w/ codes, we show a special \"No code\" pill\n if (!props.leaf.name && props.uiContainsCodes)\n return baseClass + ' border-secondary text-secondary';\n\n return baseClass + ' border-dark';\n }\n\n const codeRef = React.useRef<HTMLDivElement>();\n\n React.useEffect(() => {\n if (!codeRef.current)\n return;\n\n const { width } = codeRef.current.getBoundingClientRect();\n\n props.trySetMaxCodeWidth(width);\n }, [codeRef.current]);\n\n return (\n <div className='d-flex'>\n {(() => {\n if (!props.leaf.description)\n return <p className='m-0' dangerouslySetInnerHTML={{ __html: props.leaf.name }} />;\n\n /**\n * If a leaf has no code but the rest of the UI has leaf nodes\n * with codes, we show a special \"No code\" pill. Example: https://imgur.com/3L1Ela3\n */\n if (!props.leaf.name && props.uiContainsCodes) {\n return (\n <>\n <div\n className='me-1 align-self-start'\n style={{ minWidth: props.codeWidth ? `${props.codeWidth}px` : 'auto' }}\n >\n <h5 ref={codeRef} className={getCurriculumCodeClass()}>\n <Text namespace={namespace} phrase='noCode' />\n </h5>\n </div>\n <p className='m-0 align-self-center' dangerouslySetInnerHTML={{ __html: props.leaf.description }} />\n </>\n );\n }\n\n /**\n * If a leaf has no code and the rest of the UI leaf nodes have no code, we just\n * display the description with a bullet point. Example: https://imgur.com/jzJvmWs\n */\n if (!props.leaf.name && !props.uiContainsCodes)\n return <p className='m-0' dangerouslySetInnerHTML={{ __html: props.leaf.description }} />;\n\n return (\n <>\n <div\n className='me-1 align-self-start'\n style={{ minWidth: props.codeWidth ? `${props.codeWidth}px` : 'auto' }}\n >\n <h5 ref={codeRef} className={getCurriculumCodeClass()}>{props.leaf.name}</h5>\n </div>\n <p className='m-0 align-self-center' dangerouslySetInnerHTML={{ __html: props.leaf.description }} />\n </>\n );\n })()}\n </div>\n );\n}\n\ninterface CurriculumSubjectProps {\n linkSet: CurriculumStructure;\n codeWidth: number;\n trySetMaxCodeWidth: React.Dispatch<React.SetStateAction<number>>;\n}\n\nfunction CurriculumSubject(props: CurriculumSubjectProps): JSX.Element {\n const areaAndLeafSets: { [areaText: string]: Curriculum<CurriculumType.Leaf>[]; } = {};\n\n let uiContainsCodes = false;\n\n props.linkSet.areasAndLeaves.forEach(areaAndLeafSet => {\n const areaText = areaAndLeafSet[CurriculumType.Area].map(ca => ca.name).join(' - ');\n\n if (areaAndLeafSets[areaText]) {\n areaAndLeafSet[CurriculumType.Leaf].forEach(leaf => {\n areaAndLeafSets[areaText].push(leaf);\n\n // We need the info on if _any_ leaf node has a code in it. See why in the comments in `<CurriculumLeaf />`\n if (leaf.name)\n uiContainsCodes = true;\n });\n\n return;\n }\n\n areaAndLeafSets[areaText] = areaAndLeafSet[CurriculumType.Leaf];\n });\n\n function getAudienceText(): string {\n const audienceSegment = props.linkSet[CurriculumType.Audience].name;\n const subjectSegment = props.linkSet[CurriculumType.Subject].name;\n\n /**\n * In some curriculums, such as the UK curriculum, the audience string may contain a year group\n * in brackets. For example, it may be \"Lower Key Stage 2 (Year 4)\".\n * This regex will pull that segment out if it exists.\n */\n const audienceBracketSegments = audienceSegment.match(BRACKET_SEGMENT_REGEX);\n\n if (audienceBracketSegments)\n return `${audienceBracketSegments[1]} • ${audienceBracketSegments[2]} • ${subjectSegment}`;\n\n return `${audienceSegment} • ${subjectSegment}`;\n }\n\n function getLeafStyleClass(leaf: Curriculum<CurriculumType.Leaf>): string {\n const className = 'mb-2';\n\n if (!leaf.name && !uiContainsCodes)\n return className + ' ms-4 ' + styles.leafDescriptionOnly;\n\n return className;\n }\n\n return (\n <>\n <h3 className={`${BASE_PILL_CLASS} text-white bg-dark-blue fw-normal me-1 mb-2`}>\n {getAudienceText()}\n </h3>\n\n <div className={`me-2 ${styles.curriculumSubject}`}>\n {Object.keys(areaAndLeafSets).map((areaText, i) => {\n return (\n <div key={i} className={styles.areaLeafSet} >\n {areaText && <h4 className='mb-1 font-size-normal'>{areaText}</h4>}\n <ul className='list-unstyled'>\n {areaAndLeafSets[areaText].map(leaf => (\n <li key={leaf.id} className={getLeafStyleClass(leaf)}>\n <CurriculumLeaf\n leaf={leaf}\n codeWidth={props.codeWidth}\n trySetMaxCodeWidth={props.trySetMaxCodeWidth}\n uiContainsCodes={uiContainsCodes}\n />\n </li>\n ))}\n </ul>\n </div>\n );\n })}\n </div>\n </>\n );\n}\n\ninterface CurriculumLinksSet {\n [subjectAndAudienceIdKey: string]: CurriculumStructure\n}\n\ninterface CurriculumLinksV2Props {\n curriculumLinks?: Curriculum[][];\n emptyStateUrl: string;\n}\n\nexport function CurriculumLinksV2(props: CurriculumLinksV2Props): JSX.Element {\n const [ codeWidth, setCodeWidth ] = React.useState(0);\n\n function trySetMaxCodeWidth(width: number): void {\n /**\n * The width of the curriculum code column should be identical for each leaf node, meaning\n * the leaf description text will be perfectly vertically aligned all the way down.\n * See here for example: https://imgur.com/MbganZf\n * \n * This is achieved by us setting the state for the maximum code width, and forcing all\n * smaller codes to abide by that max width.\n * \n * This value is used in the `<CurriculumLeaf />` component.\n */\n setCodeWidth(currentVal => {\n if (currentVal >= width)\n return currentVal;\n\n return width;\n });\n }\n\n /**\n * Here, we're taking the structure of links from the backend, and restructuring it in a way\n * that resembles the structure of our UI more closely. The general idea is:\n * \n * CurriculumAudience - CurriculumSubject\n * CurriculumAreas\n * CurriculumLeaves\n */\n const curriculumLinkSets = React.useMemo(() => {\n const newSet: CurriculumLinksSet = {};\n\n props.curriculumLinks.forEach(linkSet => {\n let subject: Curriculum<CurriculumType.Subject> = null;\n let audience: Curriculum<CurriculumType.Audience> = null;\n const areas: Curriculum<CurriculumType.Area>[] = [];\n const leaves: Curriculum<CurriculumType.Leaf>[] = [];\n \n linkSet.forEach(curriculumObj => {\n switch (curriculumObj.type) {\n case CurriculumType.Subject:\n subject = curriculumObj as Curriculum<CurriculumType.Subject>;\n break;\n case CurriculumType.Audience:\n audience = curriculumObj as Curriculum<CurriculumType.Audience>;\n break;\n case CurriculumType.Area:\n areas.push(curriculumObj as Curriculum<CurriculumType.Area>);\n break;\n case CurriculumType.Leaf:\n leaves.push(curriculumObj as Curriculum<CurriculumType.Leaf>);\n break;\n default:\n break;\n }\n });\n \n const key = `${subject.id}:${audience.id}`;\n \n if (newSet[key]) {\n newSet[key].areasAndLeaves.push({\n [CurriculumType.Area]: areas,\n [CurriculumType.Leaf]: leaves\n });\n \n return;\n }\n \n newSet[key] = {\n [CurriculumType.Subject]: subject,\n [CurriculumType.Audience]: audience,\n areasAndLeaves: [{\n [CurriculumType.Area]: areas,\n [CurriculumType.Leaf]: leaves\n }]\n };\n });\n\n return newSet;\n }, [props.curriculumLinks]);\n\n if (!props.curriculumLinks)\n return <PartialCurriculumLinks />;\n\n if (!props.curriculumLinks?.length) {\n return <CurriculumLinksEmptyState emptyStateUrl={props.emptyStateUrl} />;\n }\n\n return (\n <ul className='list-unstyled m-0'>\n {Object.keys(curriculumLinkSets).map((linkSetKey, i) => (\n <li key={`linkset-${i}`} className={styles.curriculumSet}>\n <CurriculumSubject\n linkSet={curriculumLinkSets[linkSetKey]}\n trySetMaxCodeWidth={trySetMaxCodeWidth}\n codeWidth={codeWidth}\n />\n </li>\n ))}\n </ul>\n );\n}","import React from 'react';\n\nimport { CurriculumLinkItem } from 'libs/shared/components/curriculum-links/CurriculumLinkItem';\nimport { PartialTagItem } from 'libs/shared/components/tags/PartialTagItem';\nimport { DynamicWidget } from 'libs/shared/components/widgets/dynamic-widget';\nimport { CurriculumData, Presentation } from 'libs/shared/interfaces';\n\ninterface CurriculumsWidgetProps {\n curriculums: CurriculumData;\n selectedCurriculum: Presentation;\n onChangeCurriculum: (curriculumId: string) => void;\n noNegativePadding?: boolean;\n}\n\nexport function CurriculumsWidget(props: CurriculumsWidgetProps): JSX.Element {\n return (\n <DynamicWidget\n collection={props.selectedCurriculum?.id ? props.curriculums.nonEmptyCurriculums : null}\n childClassName='flex-shrink-0'\n childComponent={_props => {\n return (\n <CurriculumLinkItem\n {..._props}\n selected={props.selectedCurriculum?.id?.toString() === _props.data.id.toString()}\n onChangeCurriculum={props.onChangeCurriculum}\n />\n );\n }}\n partialLoadingComponent={() => <PartialTagItem />}\n widgetDataDeps={[ props.selectedCurriculum?.id?.toString(), props.onChangeCurriculum ]}\n noNegativePadding={props.noNegativePadding}\n />\n );\n}","import { MutableRefObject, useEffect, useRef, useState } from 'react';\nimport * as marked from 'marked';\n\nimport { useEventsServiceSubscribe } from 'libs/common/react/hooks/UseEventsServiceSubscribe';\nimport { EventsService } from 'libs/common/react/services/EventsService';\n\nimport { Clip, Glance, PointOfInterest, Video } from 'libs/shared/interfaces';\n\nimport styles from './video-at-a-glance.scss';\n\nconst POI_LINK_LINE = /\\[\\]\\(cv:\\/\\/poi\\?id=\\d+\\)\\n*/g;\n\nfunction stripPoisFromGlanceContent(glanceContent: string): string {\n return glanceContent.replace(POI_LINK_LINE, '');\n}\n\nfunction getLearningIntentionHTML(glance: Glance): string {\n const learningIntention = stripPoisFromGlanceContent(glance.content);\n\n return marked(learningIntention);\n}\n\nexport function useLearningIntentionMarkdown(\n video: Video,\n hasGlanceData?: boolean\n): string {\n const [ markdownHTML, setMarkdownHTML ] = useState('');\n\n useEffect(() => {\n if (!hasGlanceData)\n return;\n\n const content = getLearningIntentionHTML(video.glance);\n\n setMarkdownHTML(content);\n }, [ video.glance?.content, hasGlanceData ]);\n\n return markdownHTML;\n}\n\nexport function hasGlanceData(video: Video | Clip): boolean {\n return video.glance?.content && video.glance?.format === 'text/markdown';\n}\n\nexport function useHighlightPointOfInterest(\n pointOfInterest: PointOfInterest,\n shouldHighlight: boolean\n): MutableRefObject<HTMLDivElement> {\n const ref = useRef<HTMLDivElement>();\n\n useEventsServiceSubscribe('player:poi:mouseover', onPlayerPoiMouseOver, null, shouldHighlight);\n useEventsServiceSubscribe('player:poi:mouseleave', onPlayerPoiMouseLeave, null, shouldHighlight);\n\n useEffect(() => {\n if (!ref.current || !shouldHighlight)\n return;\n\n ref.current?.addEventListener('mouseover', onGlancePoiMouseOver);\n ref.current?.addEventListener('mouseleave', onGlancePoiMouseLeave);\n\n return () => {\n ref.current?.removeEventListener('mouseover', onGlancePoiMouseOver);\n ref.current?.removeEventListener('mouseleave', onGlancePoiMouseLeave);\n };\n }, [ref.current]);\n\n function onPlayerPoiMouseOver(hoveredPoi: PointOfInterest): void {\n if (!hoveredPoi?.id || pointOfInterest?.id?.toString() !== hoveredPoi?.id?.toString())\n return;\n\n ref.current?.classList.add(styles.highlightPoi);\n }\n\n function onPlayerPoiMouseLeave(): void {\n ref.current?.classList.remove(styles.highlightPoi);\n }\n\n /**\n * `this` will be the element to which the eventListener is bound.\n */\n function onGlancePoiMouseOver(): void {\n if (pointOfInterest)\n EventsService.trigger('glance:poi:mouseover', pointOfInterest);\n }\n\n function onGlancePoiMouseLeave(): void {\n EventsService.trigger('glance:poi:mouseleave');\n }\n\n return ref;\n}","// extracted by mini-css-extract-plugin\nexport default {\"poiEntry\":\"vr6R9\",\"poiText\":\"znHZF\",\"public\":\"v0BZ9\",\"poiTimeStamp\":\"AdKwe\",\"wideBadge\":\"YR2Hh\"};","import React from 'react';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PointOfInterest } from 'libs/shared/interfaces';\nimport { DurationHelper } from 'libs/shared/utils/DurationHelper';\n\nimport { useHighlightPointOfInterest } from '../VideoAtAGlanceUtilsV2';\n\nimport styles from './points-of-interest-list.scss';\n\ninterface PointOfInterestProps {\n poi: PointOfInterest;\n suppressInteractivity?: boolean;\n onClickPoiItem: (time: number) => void;\n wideBadge?: boolean;\n}\n\nfunction PointOfInterest(props: PointOfInterestProps): JSX.Element {\n const timeStamp = DurationHelper.ToDisplayDuration(props.poi.startTime * 1000);\n\n const ref = useHighlightPointOfInterest(props.poi, !props.suppressInteractivity);\n\n if (props.suppressInteractivity) {\n return (\n <div className={`d-flex ${styles.poiEntry} mb-2`}>\n <span className={`d-flex rounded-pill justify-content-center align-items-center fw-semibold text-info bg-light-blue ${styles.poiTimeStamp} ${props.wideBadge ? styles.wideBadge : ''}`}>{timeStamp}</span>\n <div className={`${styles.public} ms-2`}>{props.poi.description}</div>\n </div>\n );\n }\n\n return (\n <DivButton\n key={props.poi.startTime}\n className={`d-flex ${styles.poiEntry} mb-2 cursor-pointer`}\n onClick={() => props.onClickPoiItem(props.poi.startTime)}\n ref={ref}\n >\n <div className={`d-flex rounded-pill justify-content-center align-items-center fw-semibold text-info bg-light-blue ${styles.poiTimeStamp} ${props.wideBadge ? styles.wideBadge : ''}`}>{timeStamp}</div>\n <div className={`ms-2 ${styles.poiText}`}>{props.poi.description}</div>\n </DivButton>\n );\n}\n\ninterface PointOfInterestListProps{\n pointsOfInterest: PointOfInterest[];\n suppressInteractivity?: boolean;\n onClickPoiItem: (time: number) => void\n}\n\nconst namespace = 'shared.pointsOfInterestList';\n\nexport function PointOfInterestList(props: PointOfInterestListProps) {\n const sortedPointsOfInterest = props.pointsOfInterest.sort((a, b) => a.startTime - b.startTime);\n const hasTimePointOverHours = sortedPointsOfInterest.some(poi => poi.startTime >= 3600);\n\n return (\n <div>\n <h2 className='h6 my-2'><Text namespace={namespace} phrase='heading' /></h2>\n\n <div>\n {sortedPointsOfInterest.map(poi => {\n return (\n <PointOfInterest\n key={poi.startTime}\n poi={poi}\n suppressInteractivity={props.suppressInteractivity}\n onClickPoiItem={props.onClickPoiItem}\n wideBadge={hasTimePointOverHours}\n />\n );\n })}\n\n </div>\n </div>\n );\n}","import * as React from 'react';\nimport CopyToClipboard from 'react-copy-to-clipboard';\nimport Scrollbars from 'react-custom-scrollbars-2';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { PointOfInterestList } from 'libs/shared/components/play-page-v2/glance/points-of-interest-list/PointsOfInterestList';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { TagHelper } from 'libs/shared/components/tags/TagHelper';\nimport { TagList } from 'libs/shared/components/tags/TagList';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { TagType } from 'libs/shared/enums/TagType';\nimport { PointOfInterest, Tag, Video } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { useLearningIntentionMarkdown } from './VideoAtAGlanceUtilsV2';\n\nimport styles from './video-at-a-glance.scss';\n\nconst namespace = 'shared.videoAtAGlanceV2';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst SCROLL_HEIGHT_MAX = 350; // in px\n\ninterface ScrollbarWrapperProps {\n hideScrollbar?: boolean;\n}\n\nfunction ScrollbarWrapper(props: React.PropsWithChildren<ScrollbarWrapperProps>): JSX.Element {\n if (props.hideScrollbar)\n return <>{props.children}</>;\n\n return (\n <div className='rounded border mb-4 bg-white'>\n <Scrollbars\n autoHeight\n autoHeightMax={SCROLL_HEIGHT_MAX}\n >\n <div className='px-3 px-3 pt-3 pb-2'>\n {props.children}\n </div>\n </Scrollbars>\n </div>\n );\n}\n\ninterface VideoAtAGlanceV2Props {\n video: Video;\n pointsOfInterest?: PointOfInterest[];\n suppressInteractivity?: boolean;\n setStartTime?: (time: number) => void;\n getTagAppLink?: (tag: Tag) => Core.AppLink;\n onClickTag?: () => void;\n hideScrollbar?: boolean;\n canViewGlance: boolean;\n}\n\nexport function VideoAtAGlanceV2(props: VideoAtAGlanceV2Props): JSX.Element {\n const learningIntentionMarkdownHTML = useLearningIntentionMarkdown(props.video, props.canViewGlance);\n const [ textToCopy, setTextToCopy ] = React.useState('');\n\n function logUserAction(): void {\n const analyticsData = {\n id: props.video.glance.id,\n videoId: props.video.id,\n videoName: props.video.name,\n learningIntention: textToCopy\n };\n\n const analyticsOptions = {\n actionType: UserAction.Copy,\n entity: EntityType.Glance,\n location: LocationContext.PlayPage\n };\n AnalyticsHelper.logUserAction(analyticsData, analyticsOptions);\n }\n\n function getTags(): Tag[] {\n if (VideoHelper.isInteractive(props.video) || !props.video.tags?.data?.length)\n return null;\n\n return props.video.tags?.data?.filter(tag => tag.tagType === TagType.Pedagogy || tag.tagType === TagType.Skill);\n }\n const tags = getTags();\n\n const ref = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n if (ref.current?.innerText)\n setTextToCopy(ref.current.innerText);\n }, [ref.current?.innerText]);\n\n if (!props.canViewGlance)\n return <></>;\n\n function onClickPoiItem(time: number) {\n props.setStartTime(time);\n }\n\n return (\n <section className='play-page-section'>\n <ScrollbarWrapper hideScrollbar={props.hideScrollbar}>\n <h2 className='h6 mb-2'><Text namespace={namespace} phrase='learningIntention' /></h2>\n \n <div className={`mb-3 ${styles.learningIntention}`}>\n <Tooltip title={getPhrase('copy')} spanHack spanHackClassName={styles.icon}>\n <CopyToClipboard text={textToCopy}>\n <SvgContainer\n className='svg-container me-1 cursor-pointer'\n svgName={cvSvgLibrary.Copy}\n size={SvgContainerSize.Small}\n onClick={logUserAction}\n />\n </CopyToClipboard>\n </Tooltip>\n \n <div\n dangerouslySetInnerHTML={{ __html: learningIntentionMarkdownHTML }}\n className='d-inline'\n ref={ref}\n >\n </div>\n </div>\n\n {!!tags?.length && (\n <div className='mb-1'>\n <TagList\n tags={tags}\n {...TagHelper.getTagActionProps(props.getTagAppLink, props.onClickTag, props.suppressInteractivity)}\n className='mt-2'\n />\n </div>\n )}\n\n {!!props.pointsOfInterest.length && (\n <PointOfInterestList\n pointsOfInterest={props.pointsOfInterest}\n suppressInteractivity={props.suppressInteractivity}\n onClickPoiItem={onClickPoiItem}\n />\n )}\n </ScrollbarWrapper>\n </section>\n );\n}","import React from 'react';\n\nimport styles from './tags.scss';\n\ninterface PartialTagItemProps {\n tagClass?: string;\n}\n\nexport const PartialTagItem = React.memo(function({ tagClass = '' }: PartialTagItemProps): JSX.Element {\n const classNames = `partial-loading-background d-inline-block rounded-pill py-1 px-2 mb-1 me-1 text-nowrap ${tagClass} ${styles.partialTag}`;\n\n return (\n <div className='mt-1'>\n <span className={classNames}> </span>\n </div>\n );\n});","import { Core } from 'libs/common/core';\n\nimport { Tag } from 'libs/shared/interfaces';\n\nexport const TagHelper = {\n /**\n * This helper allows tag appLinks to be triggered manually for use in a public context.\n * \n * For public pages, all anchors will be crawled by bots. Given then number of tags we have\n * this will chew through crawl budget unnecessarily. \n * \n * The consuming project can opt-in for this behaviour. By default, tags will always be rendered\n * as anchors.\n */\n getTagActionProps: (\n getTagAppLink: (tag: Tag) => Core.AppLink,\n onClick: () => void,\n renderAsSpan?: boolean\n ) => {\n if (renderAsSpan) {\n return {\n onClick: (tag: Tag) => {\n if (onClick)\n onClick();\n\n const appLink = getTagAppLink ? getTagAppLink(tag) : null;\n\n if (!appLink)\n return;\n\n return Core.AppLinkHelper.trigger(appLink);\n }\n };\n }\n\n return {\n getAppLink: (tag: Tag) => {\n return getTagAppLink\n ? getTagAppLink(tag)\n : null;\n },\n onClick\n };\n }\n};","import 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 { TagType } from 'libs/shared/enums/TagType';\nimport { Tag, ThemeColours } from 'libs/shared/interfaces';\n\nimport styles from './tags.scss';\n\nconst namespace = 'shared.tags';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface TagItemProps {\n tag: Tag;\n themeColours?: ThemeColours;\n appLink?: Core.AppLink;\n onClick?: () => void;\n onRemove?: () => void;\n disabled?: boolean;\n tagClass?: string;\n}\n\nfunction getTagTypeClass(tagType: TagType, hasThemeColour: boolean): string {\n switch (tagType) {\n case TagType.Pedagogy:\n case TagType.Skill:\n return 'pedagogy-tag text-white';\n\n case TagType.Hidden:\n return 'hidden-tag fw-normal';\n\n case TagType.Normal:\n if (!hasThemeColour)\n return 'bg-gray-100 fw-normal';\n return '';\n\n default:\n return '';\n }\n}\n\nexport function TagItem(props: TagItemProps): JSX.Element {\n const { tag, appLink, onClick, disabled, tagClass = 'tag' } = props;\n\n const name = tag.name.toLowerCase();\n const tagType = tag.tagType?.toLowerCase() as TagType;\n\n const hasThemeColour = (tagType === TagType.Normal && props.themeColours) && !!props.themeColours?.secondary;\n let classNames = `rounded-pill py-1 px-2 my-1 me-1 ${tagClass} ${getTagTypeClass(tagType, hasThemeColour)}`;\n\n if (hasThemeColour)\n classNames += ' text-white';\n\n if ((appLink || onClick) && !disabled)\n classNames += ' cursor-pointer';\n\n if (disabled)\n classNames += ' ' + styles.disabled;\n\n if (props.onRemove)\n classNames += ' ' + styles.badge;\n\n if (!appLink)\n classNames += ' d-inline-block';\n\n const style: React.CSSProperties = hasThemeColour\n ? { backgroundColor: props.themeColours.secondary }\n : {};\n\n if (appLink) {\n return (\n <AppLink\n onClick={onClick}\n appLink={appLink}\n className={classNames}\n title={name}\n style={style}\n >\n <span className='text-truncate text-nowrap'>{name}</span>\n </AppLink>\n );\n }\n\n return (\n <button\n onClick={onClick}\n className={classNames}\n title={name}\n style={style}\n aria-label={`${getPhrase('ariaFilter')} ${name}`}\n >\n <span className='text-truncate text-nowrap'>\n {name}\n {props.onRemove &&\n <button\n onClick={props.onRemove}\n className={`${styles.close} btn-close font-size-normal`}\n role='button'\n aria-label='Close'\n />\n }\n </span>\n </button>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { TagItem } from 'libs/shared/components/tags/TagItem';\nimport { TagType } from 'libs/shared/enums/TagType';\nimport { Tag, ThemeColours } from 'libs/shared/interfaces';\n\nimport styles from './tags.scss';\n\n/**\n * TODO: this will eventually handle ClickView and Customer tag types.\n */\nfunction getTagSortValue(tag: Tag): number {\n switch (tag.tagType?.toLowerCase()) {\n case TagType.Pedagogy:\n return 0;\n\n case TagType.Skill:\n return 1;\n\n default:\n return 2;\n }\n}\n\ninterface TagListProps {\n tags: Tag[];\n themeColours?: ThemeColours;\n onClick?: (tag: Tag) => void;\n onRemove?: (tag: Tag) => void;\n getAppLink?: (tag: Tag) => Core.AppLink;\n className?: string;\n}\n\nexport function TagList(props: TagListProps): JSX.Element {\n if (!props.tags)\n return <></>;\n\n const sortedTags = [...props.tags].sort((a, b) => getTagSortValue(a) - getTagSortValue(b));\n\n return (\n <div className={`${styles.tagList} ${props.className}`}>\n {sortedTags.map((tag: Tag) => {\n const appLink = typeof props.getAppLink === 'function'\n ? props.getAppLink(tag)\n : null;\n\n const onRemove = typeof props.onRemove === 'function'\n ? () => props.onRemove(tag)\n : null;\n\n const onClick = typeof props.onClick === 'function'\n ? () => props.onClick(tag)\n : null;\n\n return (\n <TagItem\n key={tag.id || tag.name}\n tag={tag}\n appLink={appLink}\n themeColours={props.themeColours}\n onRemove={onRemove}\n onClick={onClick}\n />\n );\n })}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"seeMore\":\"yv0FS\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\n\nimport styles from './widget-header.scss';\n\nconst namespace = 'shared.widgetHeader';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface WidgetHeaderProps {\n name: string;\n description: string;\n\n appLink?: Core.AppLink;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n showSeeMoreLink?: boolean;\n onClick?: () => void;\n}\n\nfunction SeeMore(props: WidgetHeaderProps) {\n return (\n <div className={`ms-3 ${styles.seeMore}`}>\n <AppLink\n appLink={props.appLink}\n analyticsData={props.analyticsData }\n analyticsOptions={{ ...props.analyticsOptions, descriptor: ClickDescriptor.SeeMore }}\n className={`text-decoration-none ${props.appLink ? 'curated-widget-link' : ''}`}\n >\n <p className='hover-text-underline text-dark curated-widget-heading'>{getPhrase('seeMore')}</p>\n </AppLink>\n </div>\n );\n}\n\nexport function WidgetHeader(props: WidgetHeaderProps): JSX.Element {\n const hasDescription = !!props.description;\n\n if (!props.name && !props.description)\n return <></>;\n\n return (\n <div className='curated-widget-header'>\n <div className='d-flex justify-content-between'>\n {!!props.name && (\n <div className={styles.title}>\n <AppLink\n appLink={props.appLink}\n analyticsOptions={props.analyticsOptions}\n analyticsData={props.analyticsData}\n className={`text-decoration-none ${props.appLink ? 'curated-widget-link' : ''}`}\n onClick={props.onClick}\n >\n <h2 className='h4 curated-widget-heading'>\n {props.name}\n </h2>\n </AppLink>\n </div>\n )}\n {!!props.appLink && !hasDescription && !!props.showSeeMoreLink && <SeeMore {...props}/>}\n </div>\n \n {hasDescription && (\n <div className='d-flex justify-content-between align-items-end'>\n <p className={`description curated-widget-description ${styles.description}`}>\n <span>{props.description}</span>\n </p>\n {!!props.appLink && !!props.showSeeMoreLink && <SeeMore {...props}/> }\n </div>\n )}\n </div>\n );\n}","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { DynamicWidgetState } from 'libs/shared/components/widgets/dynamic-widget';\nimport { FixedWidgetState } from 'libs/shared/components/widgets/fixed-widget';\n\n// Sync with transition time in SlidingListContainer.tsx\nconst SLIDER_ANIMATION_TIME = 400;\n\ntype FixedWidgetKeyboardOptions = {\n type: 'fixed',\n state: FixedWidgetState,\n containerRef: React.MutableRefObject<HTMLElement>\n mediaQuery?: never;\n}\n\ntype DynamicWidgetKeyboardOptions = {\n type: 'dynamic',\n state: DynamicWidgetState,\n containerRef: React.MutableRefObject<HTMLElement>\n mediaQuery: string\n}\n\ntype UseWidgetKeyboard = FixedWidgetKeyboardOptions | DynamicWidgetKeyboardOptions\n\nexport function useWidgetKeyboard(options: UseWidgetKeyboard) {\n const { type, state, containerRef, mediaQuery } = options;\n\n const [ isTabbing, setIsTabbing ] = React.useState(false);\n const [ dynamicAttributes, setDynamicAttributes ] = React.useState<HashObject>({});\n const [ focusedWidgetIndex, setFocusedWidgetIndex ] = React.useState(null);\n \n /**\n * Get accessibility attributes for dynamic widget items\n * */\n React.useEffect(() => {\n if (type !== 'dynamic' || !containerRef.current || !(state as DynamicWidgetState).containerLeftPosition) return;\n \n setTimeout(() => getDynamicAttributes(), SLIDER_ANIMATION_TIME + 50);\n }, [\n containerRef.current,\n mediaQuery,\n (state as DynamicWidgetState).offset,\n (state as DynamicWidgetState).containerLeftPosition\n ]);\n\n function getDynamicAttributes() {\n const dynamicWidgetState = state as DynamicWidgetState;\n \n const focusableItems = Array.from(containerRef.current.children).reduce((acc, item) => {\n const rect = item?.getBoundingClientRect();\n\n /**\n * When any part of the widget item is visible it should be focusable,\n * otherwise prevent interaction and the slider should be the next focusable element\n * */\n const isItemVisable =\n rect.left < dynamicWidgetState.containerRightPosition &&\n rect.right > dynamicWidgetState.containerLeftPosition;\n\n return {\n ...acc,\n [item.id]: isItemVisable\n ? {\n 'aria-hidden': false\n } : {\n 'aria-hidden': true,\n 'inert': 'true'\n }\n };\n }, {});\n\n setDynamicAttributes(focusableItems);\n }\n\n /**\n * Get accessibility attributes for fixed widget items\n * */\n function getFixedAttributes(index?: number) {\n const fixedWidgetState = state as FixedWidgetState;\n\n const isItemVisible =\n index >= (fixedWidgetState.offset - fixedWidgetState.viewableItems) &&\n index < fixedWidgetState.offset;\n if (isItemVisible) {\n return {\n 'aria-hidden': false\n };\n }\n\n return {\n 'inert': 'true',\n 'aria-hidden': true\n };\n }\n\n /**\n * When the user is not signed in, there may be videos which are not focusable.\n * setTimeout is required because the transition time is 400ms\n */\n function focusNext() {\n setTimeout(() => {\n const items = containerRef.current.querySelectorAll('li[aria-hidden]');\n\n let nextFocusableElement: HTMLElement = null;\n\n for (let i = (focusedWidgetIndex + 1); i < items.length; i++) {\n if (nextFocusableElement)\n break;\n \n nextFocusableElement = items[i].querySelector('a[tabindex=\"0\"]');\n }\n\n if (nextFocusableElement)\n nextFocusableElement.focus();\n }, SLIDER_ANIMATION_TIME + 100);\n }\n\n function focusPrev() {\n setTimeout(() => {\n const items = containerRef.current.querySelectorAll('li[aria-hidden]');\n\n let prevFocusableElement: HTMLElement = null;\n for (let i = focusedWidgetIndex - 1; i >= 0; i--) {\n if (prevFocusableElement) break;\n \n const item = items[i];\n prevFocusableElement = item.querySelector('a[tabindex=\"0\"]');\n }\n \n if (prevFocusableElement)\n prevFocusableElement.focus();\n }, SLIDER_ANIMATION_TIME + 100);\n }\n\n function onFocusWidget(index: number) {\n if (document.querySelector('.user-is-tabbing')) {\n setIsTabbing(true);\n setFocusedWidgetIndex(index);\n }\n }\n\n function onBlurWidget() {\n if (!document.querySelector('.user-is-tabbing')) {\n setIsTabbing(false);\n setFocusedWidgetIndex(null);\n }\n }\n\n return {\n isTabbing,\n onFocusWidget,\n onBlurWidget,\n getFixedAttributes,\n dynamicAttributes,\n focusNext,\n focusPrev\n };\n}","import { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst blankImage = new Image();\nblankImage.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs=';\n\nexport const DragHelper = {\n // This removes the image that appears when you drag a draggable HTML element\n hideDragImage(event: React.DragEvent<HTMLElement>): void {\n if (!event.dataTransfer.setDragImage || !FunctionHelper.isFunction(event.dataTransfer.setDragImage))\n return;\n\n event.dataTransfer.setDragImage(blankImage, 0, 0);\n }\n};","import * as React from 'react';\n\nimport { UserAgentHelper } from 'libs/common/backbone/utils/UserAgentHelper';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { CssMeasurement } from 'libs/shared/enums/CssMeasurement';\nimport { DragHelper } from 'libs/shared/utils/DragHelper';\n\nconst isTouchScreen = UserAgentHelper.isTouchScreen();\n\nconst getPositionStyling = (xPosition: number, measurement: CssMeasurement, dragPercentage?: number) => {\n // Used in situations where a touch screen user is dragging the `<FixedWidget />`\n if (measurement === CssMeasurement.Percentage && dragPercentage)\n xPosition = xPosition - dragPercentage;\n \n return {\n transform: `translate3d(${xPosition}${measurement}, 0px, 0px)`,\n // Sync with transition time in useWidgetKeyboard.ts\n transition: 'transform .4s ease-in-out'\n };\n};\n\ninterface SlidingListContainerProps extends React.PropsWithChildren<unknown> {\n position: number;\n positionType: CssMeasurement;\n\n onDrag?: (event: React.DragEvent<HTMLUListElement>) => void;\n onDragEnd?: () => void;\n\n onTouchMove?: (event: React.TouchEvent<HTMLUListElement>) => void;\n onTouchEnd?: () => void;\n\n percentageDragged?: number;\n}\n\nexport const SlidingListContainer = React.forwardRef((\n props: SlidingListContainerProps,\n ref: React.MutableRefObject<HTMLUListElement>\n): JSX.Element => {\n const { children, positionType, onDrag, onDragEnd, onTouchMove, onTouchEnd, percentageDragged, position = 0 } = props;\n\n function getEventListeners(): HashObject {\n const listenerProps: HashObject = {};\n\n if (onDrag && onDragEnd) {\n listenerProps.draggable = true;\n listenerProps.onDragEnd = onDragEnd;\n listenerProps.onDragStart = DragHelper.hideDragImage;\n listenerProps.onDragOver = onDrag;\n }\n\n if (onTouchMove && onTouchEnd && isTouchScreen) {\n listenerProps.onTouchMoveCapture = onTouchMove;\n listenerProps.onTouchEndCapture = onTouchEnd;\n }\n\n return listenerProps;\n }\n\n return (\n <ul\n className='list-unstyled d-flex flex-nowrap position-relative w-100'\n style={getPositionStyling(position, positionType, percentageDragged)}\n ref={ref}\n {...getEventListeners()}\n >\n {children}\n </ul>\n );\n});","// extracted by mini-css-extract-plugin\nexport default {\"buttonContainer\":\"_ejId\",\"left\":\"VSAPU\",\"right\":\"kgeXh\",\"button\":\"gAsE9\",\"hoverText\":\"APA36\",\"buttonHover\":\"cqD75\",\"chevron\":\"Ev4hr\",\"extendedClickableArea\":\"AtsWP\",\"gradientRight\":\"ZuAif\",\"gradientLeft\":\"Pt3nx\",\"topPos\":\"BVcIS\"};","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { FixedWidgetState } from 'libs/shared/components/widgets/fixed-widget';\nimport { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './widget-button.scss';\n\nconst namespace = 'shared.widgetButton';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport enum WidgetButtonDirection {\n Left,\n Right\n}\n\ninterface WidgetButtonProps {\n onClick: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;\n direction: WidgetButtonDirection;\n hide: boolean;\n contents?: WidgetContents;\n useGradientBackdrop?: boolean;\n className?: string;\n hoverText?: string;\n hideExtendedClickableArea?: boolean;\n state?: FixedWidgetState;\n\n leftButtonClassName?: string;\n rightButtonClassName?: string;\n leftGradientClassName?: string;\n rightGradientClassName?: string;\n}\n\nexport const WidgetButton = React.memo(function(props: WidgetButtonProps): JSX.Element {\n const isLeft = props.direction === WidgetButtonDirection.Left;\n\n const arrowSvg = isLeft ? cvSvgLibrary.ChevronLeft : cvSvgLibrary.ChevronRight;\n\n function getPositionClass(): string {\n let className = styles.topPos;\n \n // Left / Right\n if (isLeft)\n className += ` ${styles.left} ${props.leftButtonClassName}`;\n else\n className += ` ${styles.right} ${props.rightButtonClassName}`;\n \n return className;\n }\n\n function getStyle(): React.CSSProperties {\n if (props.state?.contents === 'videos')\n return { paddingBottom: (56.25 / props.state?.viewableItems) + '%' };\n\n return { height: '100%' };\n }\n\n if (props.hide)\n return <></>;\n\n return (\n <div className={styles.buttonContainer} style={getStyle()}>\n {props.useGradientBackdrop &&\n <div className={isLeft ? `${styles.gradientLeft} ${props.leftGradientClassName}` : `${styles.gradientRight} ${props.rightGradientClassName}`} />\n }\n\n {!props.hideExtendedClickableArea && (\n <button\n onClick={props.onClick}\n className={`${styles.extendedClickableArea} ${isLeft ? styles.left : styles.right}`}\n tabIndex={-1}\n />\n )}\n\n <button\n className={`${getPositionClass()} ${styles.button} ${props.className || ''}`}\n onClick={props.onClick}\n aria-label={isLeft ? getPhrase('previous') : getPhrase('next')}\n >\n {props.hoverText && (\n <span className={`ps-3 pe-2 ${styles.hoverText}`}>{props.hoverText}</span>\n )}\n <SvgContainer\n svgName={arrowSvg}\n size={SvgContainerSize.Medium}\n className={`svg-container d-inline-block ${styles.chevron}`}\n />\n </button>\n </div>\n );\n});","export enum CssMeasurement {\n Percentage = '%',\n Pixels = 'px'\n}","export enum CurriculumType {\n Subject = 'CurriculumSubject',\n Audience = 'CurriculumAudience',\n Area = 'CurriculumArea',\n Leaf = 'CurriculumLeaf'\n}","export enum TagType {\n Normal = 'normal',\n Pedagogy = 'pedagogy',\n Hidden = 'hidden',\n Skill = 'skill',\n Curation = 'curation'\n}\n\n/**\n * This should **only** be used to create new tags in master (as it only accepts enum values).\n * Use the string enum above for all other cases.\n */\nexport enum TagTypeNumber {\n Normal = 0,\n Pedagogy = 1,\n Hidden = 2,\n Skill = 3,\n Curation = 4\n}","export enum WidgetInteraction {\n Init = 'init',\n Next = 'next',\n Previous = 'previous',\n Resize = 'resize',\n Drag = 'drag',\n Update = 'update',\n JumpToIndex = 'jump-to-index'\n}","import { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\n\nimport { useMediaQuery } from './UseMediaQuery';\n\n/**\n * @deprecated Please use useBreakpoints() instead\n */\nexport function useGetMediaQueryString(): MediaQueryStrings {\n const isXS = useMediaQuery(MediaQueryStrings.XS);\n const isSM = useMediaQuery(MediaQueryStrings.SM);\n const isMD = useMediaQuery(MediaQueryStrings.MD);\n const isLG = useMediaQuery(MediaQueryStrings.LG);\n const isXL = useMediaQuery(MediaQueryStrings.XL);\n const isXXL = useMediaQuery(MediaQueryStrings.XXL);\n\n let currentString = MediaQueryStrings.LG; // default\n if (isXS) currentString = MediaQueryStrings.XS;\n if (isSM) currentString = MediaQueryStrings.SM;\n if (isMD) currentString = MediaQueryStrings.MD;\n if (isLG) currentString = MediaQueryStrings.LG;\n if (isXL) currentString = MediaQueryStrings.XL;\n if (isXXL) currentString = MediaQueryStrings.XXL;\n\n return currentString;\n}","import { LocalPermissionName, PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\n\nimport { LiteRouteHelper } from 'shared/utils/LiteRouteHelper';\n\nexport interface VideoFeaturesHash {\n canViewGlance: boolean;\n canViewResources: boolean;\n canViewInteractives: boolean;\n canViewClips: boolean;\n canUseActions: boolean;\n canViewPublicLayout: boolean;\n canNavigate: boolean;\n canViewCurriculumLinks: boolean;\n canViewResourceItems: boolean;\n}\n\nexport function useVideoFeatureAccess() {\n const { hasPermissions, hasLocalPermissions } = usePermissions();\n const { hasProduct } = useProducts();\n\n const hasNP = hasProduct(ProductId.Primary);\n\n function showPublicLayout(): boolean {\n /**\n * Authenticated users should never see the placeholder\n */\n if (hasLocalPermissions(LocalPermissionName.WatchVideos))\n return false;\n\n /**\n * Accessing a play page unathenticated will have different contextual behabviours:\n * - For a share page, the user should see the video and never the placeholder\n * - For a public browsing page (ie. using a route-prefix) they should see the placeholder\n */\n return LiteRouteHelper.hasRegionPrefix();\n }\n\n return {\n canViewGlance: hasPermissions(PermissionName.ViewVideoGlance),\n canViewResources: true,\n canViewInteractives: hasNP && hasPermissions(PermissionName.ViewVideoInteractives),\n canViewClips: hasNP && hasPermissions(PermissionName.ViewVideoClips),\n canViewCurriculumLinks: hasPermissions(PermissionName.ViewCurriculums),\n canUseActions: hasLocalPermissions(LocalPermissionName.UseVideoActions),\n canViewPublicLayout: showPublicLayout(),\n canViewResourceItems: hasLocalPermissions(LocalPermissionName.ViewVideoResourceItems),\n canNavigate: hasNP\n };\n}","import React from 'react';\nimport Scrollbars from 'react-custom-scrollbars-2';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, PresentationDescriptor, UserAction } from 'libs/analytics/interfaces';\n\nimport { PartialCurriculumLinks } from 'libs/shared/components/curriculum-links/partial-loading/PartialCurriculumLinks';\nimport { CurriculumLinksV2 } from 'libs/shared/components/play-page-v2/curriculum-links/CurriculumLinksV2';\nimport { CurriculumsWidget } from 'libs/shared/components/play-page-v2/curriculum-links/CurriculumsWidget';\nimport { VideoAtAGlanceV2 } from 'libs/shared/components/play-page-v2/glance/VideoAtAGlanceV2';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { Clip, CurriculumData, PointOfInterest, PopupViewProps, Presentation, Tag, Video } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\n\nconst namespace = 'shared.videoGuidanceClassroomGuidePopup';\n\nconst MIN_MAX_HEIGHT = 350;\n\ninterface VideoGuidanceClassroomGuidePopupProps extends PopupViewProps {\n isLoading: boolean;\n video: Video | Clip;\n onClickClose: () => void;\n onClickViewVideo: () => void;\n pointsOfInterest: PointOfInterest[];\n curriculums: CurriculumData;\n curriculumLinksEmptyStateUrl: string;\n\n getTagAppLink?: (tag: Tag) => Core.AppLink;\n getVideoAppLink: (video: Video | Clip, opts: GetVideoAppLinkOptions) => Core.AppLink;\n\n canViewPublicLayout: boolean;\n canViewCurriculumLinks: boolean;\n canViewGlance: boolean;\n}\n\nexport function VideoGuidanceClassroomGuidePopup(props: VideoGuidanceClassroomGuidePopupProps): JSX.Element {\n const [ selectedCurriculum, setSelectedCurriculum ] = React.useState<Presentation>();\n\n const alerts = useAlerts();\n\n React.useEffect(() => {\n if (props.isLoading || !props.curriculums)\n return;\n\n if (!selectedCurriculum) {\n const currentCurriculum = props.curriculums.activeCurriculum\n ? props.curriculums.activeCurriculum\n : ArrayHelper.first(props.curriculums.availableCurriculums);\n setSelectedCurriculum(currentCurriculum);\n }\n }, [ props.isLoading, props.curriculums?.activeCurriculum?.id ]);\n\n async function onChangeCurriculum(curriculumId: string): Promise<boolean> {\n const newCurriculum = props.curriculums.availableCurriculums.find(c => c.id.toString() === curriculumId);\n\n if (!newCurriculum?.id)\n return false;\n\n if (props.curriculums.activeCurriculum?.id?.toString() === newCurriculum?.id?.toString())\n return false;\n\n setSelectedCurriculum(newCurriculum);\n\n try {\n await props.curriculums.updateCurriculum(newCurriculum);\n\n AnalyticsHelper.logUserAction({\n id: newCurriculum.id,\n name: newCurriculum.id,\n description: newCurriculum.description,\n videoId: props.video.id,\n videoName: props.video.name\n }, {\n entity: EntityType.Presentation,\n actionType: UserAction.Select,\n descriptor: PresentationDescriptor.Curriculum,\n location: LocationContext.ClassroomGuidancePopup\n });\n } catch {\n setSelectedCurriculum(selectedCurriculum);\n alerts.error(LanguageService.getPhrase(namespace, 'updateCurriculumFailed'));\n }\n }\n\n const hasCurriculumLinks = props.canViewCurriculumLinks && props.curriculums?.customerHasCurriculumLinks;\n\n return (\n <Popup\n closePopup={props.onClickClose}\n showLoadingSpinner={props.isLoading}\n title={LanguageService.getPhrase(namespace, 'classroomGuide')}\n size='lg'\n >\n {!props.isLoading && (\n <>\n <Scrollbars\n autoHeightMax={MIN_MAX_HEIGHT}\n autoHeightMin={MIN_MAX_HEIGHT}\n autoHeight\n className='pb-3'\n // move vertical scrollbar to the top\n renderThumbVertical={({ style, ...props }) => <div {...props} style={{ ...style, borderRadius: 'inherit', backgroundColor: 'rgba(0, 0, 0, 0.2)', zIndex: 5 }} className='thumb-vertical'/>}\n >\n <div className={hasCurriculumLinks ? 'mb-4' : ''}>\n <VideoAtAGlanceV2\n video={props.video}\n pointsOfInterest={props.pointsOfInterest}\n setStartTime={startTime => {\n Core.AppLinkHelper.trigger(props.getVideoAppLink(props.video, { t: startTime }));\n props.closePopup();\n }}\n getTagAppLink={props.getTagAppLink}\n suppressInteractivity={props.canViewPublicLayout}\n onClickTag={props.closePopup}\n canViewGlance={props.canViewGlance}\n hideScrollbar\n />\n </div>\n\n {hasCurriculumLinks && (\n <>\n <h2 className='h6'>\n <Text namespace={namespace} phrase='curriculumLinks' />\n </h2>\n \n <div className='mb-2'>\n <CurriculumsWidget\n curriculums={props.curriculums}\n selectedCurriculum={selectedCurriculum}\n onChangeCurriculum={onChangeCurriculum}\n noNegativePadding\n />\n </div>\n \n {!props.curriculums?.hasLoaded\n ? <PartialCurriculumLinks />\n : (\n <CurriculumLinksV2\n curriculumLinks={props.curriculums?.curriculumLinks}\n emptyStateUrl={props.curriculumLinksEmptyStateUrl}\n />\n )}\n </>\n )}\n </Scrollbars>\n\n <PopupButtons>\n <PopupButtons.Cancel\n onClick={props.onClickClose}\n text={LanguageService.getPhrase(namespace, 'close')}\n />\n <PopupButtons.Submit\n text={LanguageService.getPhrase(namespace, 'viewVideo')}\n variant='dark'\n onClick={props.onClickViewVideo}\n />\n </PopupButtons>\n </>\n )}\n </Popup>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { Flight } from 'libs/common/react/index';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction, VideoGuidanceDescriptor } from 'libs/analytics/interfaces';\n\nimport { VideoGuidanceClassroomGuidePopup } from 'libs/shared/components/video-guidance/classroom-guide/popup/VideoGuidanceClassroomGuidePopup';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ClipRequests } from 'libs/shared/flight-requests/ClipRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { Clip, PopupViewProps, Video } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { useCurriculums } from 'shared/hooks/useCurriculums';\nimport { useFetchPointsOfInterest } from 'shared/hooks/useFetchPointsOfInterest';\nimport { useVideoFeatureAccess } from 'shared/hooks/useVideoFeatureAccess';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\ninterface VideoGuidanceClassroomGuideViewProps extends PopupViewProps {\n id: string;\n type: MasterType;\n}\n\nexport function VideoGuidanceClassroomGuideView(props: VideoGuidanceClassroomGuideViewProps): JSX.Element {\n function getRequest(): Flight.Request {\n return props.type === MasterType.Video\n ? VideoRequests.video(props.id)\n : ClipRequests.clip(props.id);\n }\n\n const video = Flight.useBasicFetch<Clip | Video>(getRequest());\n const pointsOfInterest = useFetchPointsOfInterest(props.id, true);\n const curriculums = useCurriculums(props.id, true);\n const featureAccess = useVideoFeatureAccess();\n\n function onClickClose(): void {\n AnalyticsHelper.logUserAction({\n id: video.data.id,\n name: video.data.name\n }, {\n entity: VideoHelper.isVideo(video.data)\n ? EntityType.Video\n : EntityType.Clip,\n location: LocationContext.ClassroomGuidancePopup,\n actionType: UserAction.Click,\n descriptor: VideoGuidanceDescriptor.Close\n });\n\n props.closePopup();\n }\n\n function onClickViewVideo(): void {\n AnalyticsHelper.logUserAction({\n id: video.data.id,\n name: video.data.name\n }, {\n entity: VideoHelper.isVideo(video.data)\n ? EntityType.Video\n : EntityType.Clip,\n location: LocationContext.ClassroomGuidancePopup,\n actionType: UserAction.Click,\n descriptor: VideoGuidanceDescriptor.ViewVideo\n });\n\n if (VideoHelper.isVideo(video.data)) {\n Core.AppLinkHelper.trigger({\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PLAY_VIDEO,\n args: [ video.data.id, TextHelper.slugify(video.data.name) ]\n });\n\n props.closePopup();\n\n return;\n }\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.CLIPS,\n action: Actions.Clips.PLAY_CLIP,\n args: [ video.data.id, TextHelper.slugify(video.data.name) ]\n });\n\n props.closePopup();\n }\n\n return (\n <VideoGuidanceClassroomGuidePopup\n isLoading={!video.hasCompleted || !pointsOfInterest.hasCompleted}\n video={video.data}\n pointsOfInterest={pointsOfInterest.items}\n curriculums={curriculums}\n onClickClose={onClickClose}\n onClickViewVideo={onClickViewVideo}\n curriculumLinksEmptyStateUrl={ImageUrls.EmptyStates.CURRICULUM_LINKS}\n getVideoAppLink={VideoAppLinkHelper.getAppLink}\n getTagAppLink={tag => ({\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n params: { tagOrClassification: tag.name }\n })}\n canViewCurriculumLinks={featureAccess.canViewCurriculumLinks}\n canViewPublicLayout={featureAccess.canViewPublicLayout}\n canViewGlance={featureAccess.canViewGlance}\n closePopup={props.closePopup}\n />\n );\n}","\"use strict\";\n\nvar deselectCurrent = require(\"toggle-selection\");\n\nvar clipboardToIE11Formatting = {\n \"text/plain\": \"Text\",\n \"text/html\": \"Url\",\n \"default\": \"Text\"\n}\n\nvar defaultMessage = \"Copy to clipboard: #{key}, Enter\";\n\nfunction format(message) {\n var copyKey = (/mac os x/i.test(navigator.userAgent) ? \"⌘\" : \"Ctrl\") + \"+C\";\n return message.replace(/#{\\s*key\\s*}/g, copyKey);\n}\n\nfunction copy(text, options) {\n var debug,\n message,\n reselectPrevious,\n range,\n selection,\n mark,\n success = false;\n if (!options) {\n options = {};\n }\n debug = options.debug || false;\n try {\n reselectPrevious = deselectCurrent();\n\n range = document.createRange();\n selection = document.getSelection();\n\n mark = document.createElement(\"span\");\n mark.textContent = text;\n // avoid screen readers from reading out loud the text\n mark.ariaHidden = \"true\"\n // reset user styles for span element\n mark.style.all = \"unset\";\n // prevents scrolling to the end of the page\n mark.style.position = \"fixed\";\n mark.style.top = 0;\n mark.style.clip = \"rect(0, 0, 0, 0)\";\n // used to preserve spaces and line breaks\n mark.style.whiteSpace = \"pre\";\n // do not inherit user-select (it may be `none`)\n mark.style.webkitUserSelect = \"text\";\n mark.style.MozUserSelect = \"text\";\n mark.style.msUserSelect = \"text\";\n mark.style.userSelect = \"text\";\n mark.addEventListener(\"copy\", function(e) {\n e.stopPropagation();\n if (options.format) {\n e.preventDefault();\n if (typeof e.clipboardData === \"undefined\") { // IE 11\n debug && console.warn(\"unable to use e.clipboardData\");\n debug && console.warn(\"trying IE specific stuff\");\n window.clipboardData.clearData();\n var format = clipboardToIE11Formatting[options.format] || clipboardToIE11Formatting[\"default\"]\n window.clipboardData.setData(format, text);\n } else { // all other browsers\n e.clipboardData.clearData();\n e.clipboardData.setData(options.format, text);\n }\n }\n if (options.onCopy) {\n e.preventDefault();\n options.onCopy(e.clipboardData);\n }\n });\n\n document.body.appendChild(mark);\n\n range.selectNodeContents(mark);\n selection.addRange(range);\n\n var successful = document.execCommand(\"copy\");\n if (!successful) {\n throw new Error(\"copy command was unsuccessful\");\n }\n success = true;\n } catch (err) {\n debug && console.error(\"unable to copy using execCommand: \", err);\n debug && console.warn(\"trying IE specific stuff\");\n try {\n window.clipboardData.setData(options.format || \"text\", text);\n options.onCopy && options.onCopy(window.clipboardData);\n success = true;\n } catch (err) {\n debug && console.error(\"unable to copy using clipboardData: \", err);\n debug && console.error(\"falling back to prompt\");\n message = format(\"message\" in options ? options.message : defaultMessage);\n window.prompt(message, text);\n }\n } finally {\n if (selection) {\n if (typeof selection.removeRange == \"function\") {\n selection.removeRange(range);\n } else {\n selection.removeAllRanges();\n }\n }\n\n if (mark) {\n document.body.removeChild(mark);\n }\n reselectPrevious();\n }\n\n return success;\n}\n\nmodule.exports = copy;\n","// extracted by mini-css-extract-plugin\nexport default {\"curriculumSubject\":\"GvGYH\",\"curriculumSet\":\"d7RK0\",\"areaLeafSet\":\"XRTAe\",\"closeButton\":\"N3l5Q\",\"heading\":\"hAxR4\",\"leafDescriptionOnly\":\"h66ke\",\"dropdown\":\"CsG6G\",\"tag\":\"rdLqY\",\"cover\":\"etwaD\",\"active\":\"aDLMe\",\"selected\":\"BMrSd\"};","// extracted by mini-css-extract-plugin\nexport default {\"learningIntention\":\"MHM6O\",\"highlightPoi\":\"U7Q6x\",\"icon\":\"H1xbT\"};","// extracted by mini-css-extract-plugin\nexport default {\"tagList\":\"Zw6d9\",\"disabled\":\"jlL1c\",\"partialTag\":\"too_N\",\"badge\":\"OjtN8\",\"close\":\"X9joI\"};","\"use strict\";\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.CopyToClipboard = void 0;\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _copyToClipboard = _interopRequireDefault(require(\"copy-to-clipboard\"));\n\nvar _excluded = [\"text\", \"onCopy\", \"options\", \"children\"];\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar CopyToClipboard = /*#__PURE__*/function (_React$PureComponent) {\n _inherits(CopyToClipboard, _React$PureComponent);\n\n var _super = _createSuper(CopyToClipboard);\n\n function CopyToClipboard() {\n var _this;\n\n _classCallCheck(this, CopyToClipboard);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _super.call.apply(_super, [this].concat(args));\n\n _defineProperty(_assertThisInitialized(_this), \"onClick\", function (event) {\n var _this$props = _this.props,\n text = _this$props.text,\n onCopy = _this$props.onCopy,\n children = _this$props.children,\n options = _this$props.options;\n\n var elem = _react[\"default\"].Children.only(children);\n\n var result = (0, _copyToClipboard[\"default\"])(text, options);\n\n if (onCopy) {\n onCopy(text, result);\n } // Bypass onClick if it was present\n\n\n if (elem && elem.props && typeof elem.props.onClick === 'function') {\n elem.props.onClick(event);\n }\n });\n\n return _this;\n }\n\n _createClass(CopyToClipboard, [{\n key: \"render\",\n value: function render() {\n var _this$props2 = this.props,\n _text = _this$props2.text,\n _onCopy = _this$props2.onCopy,\n _options = _this$props2.options,\n children = _this$props2.children,\n props = _objectWithoutProperties(_this$props2, _excluded);\n\n var elem = _react[\"default\"].Children.only(children);\n\n return /*#__PURE__*/_react[\"default\"].cloneElement(elem, _objectSpread(_objectSpread({}, props), {}, {\n onClick: this.onClick\n }));\n }\n }]);\n\n return CopyToClipboard;\n}(_react[\"default\"].PureComponent);\n\nexports.CopyToClipboard = CopyToClipboard;\n\n_defineProperty(CopyToClipboard, \"defaultProps\", {\n onCopy: undefined,\n options: undefined\n});","\"use strict\";\n\nvar _require = require('./Component'),\n CopyToClipboard = _require.CopyToClipboard;\n\nCopyToClipboard.CopyToClipboard = CopyToClipboard;\nmodule.exports = CopyToClipboard;","\nmodule.exports = function () {\n var selection = document.getSelection();\n if (!selection.rangeCount) {\n return function () {};\n }\n var active = document.activeElement;\n\n var ranges = [];\n for (var i = 0; i < selection.rangeCount; i++) {\n ranges.push(selection.getRangeAt(i));\n }\n\n switch (active.tagName.toUpperCase()) { // .toUpperCase handles XHTML\n case 'INPUT':\n case 'TEXTAREA':\n active.blur();\n break;\n\n default:\n active = null;\n break;\n }\n\n selection.removeAllRanges();\n return function () {\n selection.type === 'Caret' &&\n selection.removeAllRanges();\n\n if (!selection.rangeCount) {\n ranges.forEach(function(range) {\n selection.addRange(range);\n });\n }\n\n active &&\n active.focus();\n };\n};\n"],"names":["useEventsServiceSubscribe","event","callback","once","shouldSubscribe","unsubscribe","useEffect","EventsService","listeners","this","registerListener","deregisterListener","args","triggerCallbacks","executionLimit","Error","push","idxToRemove","findIndex","e","splice","length","callbacksToRemove","forEach","listener","executionCount","apply","getPhrase","CurriculumLinkItem","props","curriculumTag","data","key","id","className","selected","onClick","onChangeCurriculum","toString","name","src","cover","url","size","alt","namespace","CurriculumLinksEmptyState","emptyStateUrl","altText","phrase","PartialCurriculumLinkSection","PartialCurriculumLinks","BRACKET_SEGMENT_REGEX","BASE_PILL_CLASS","CurriculumLeaf","getCurriculumCodeClass","baseClass","leaf","uiContainsCodes","codeRef","current","width","getBoundingClientRect","trySetMaxCodeWidth","description","style","minWidth","codeWidth","ref","Text","dangerouslySetInnerHTML","__html","CurriculumSubject","audienceSegment","subjectSegment","audienceBracketSegments","areaAndLeafSets","getLeafStyleClass","linkSet","areasAndLeaves","areaAndLeafSet","areaText","CurriculumType","map","ca","join","match","Object","keys","i","CurriculumLinksV2","setCodeWidth","currentVal","curriculumLinkSets","newSet","curriculumLinks","subject","audience","areas","leaves","curriculumObj","type","linkSetKey","CurriculumsWidget","collection","selectedCurriculum","curriculums","nonEmptyCurriculums","childClassName","childComponent","_props","partialLoadingComponent","widgetDataDeps","noNegativePadding","POI_LINK_LINE","useLearningIntentionMarkdown","video","hasGlanceData","useState","markdownHTML","setMarkdownHTML","content","glance","learningIntention","replace","format","useHighlightPointOfInterest","pointOfInterest","shouldHighlight","useRef","onGlancePoiMouseOver","onGlancePoiMouseLeave","hoveredPoi","classList","add","remove","addEventListener","removeEventListener","PointOfInterest","timeStamp","DurationHelper","poi","startTime","suppressInteractivity","wideBadge","DivButton","onClickPoiItem","PointOfInterestList","sortedPointsOfInterest","pointsOfInterest","sort","a","b","hasTimePointOverHours","some","LanguageService","SCROLL_HEIGHT_MAX","ScrollbarWrapper","hideScrollbar","children","autoHeight","autoHeightMax","VideoAtAGlanceV2","learningIntentionMarkdownHTML","canViewGlance","textToCopy","setTextToCopy","tags","VideoHelper","filter","tag","tagType","TagType","getTags","innerText","Tooltip","title","spanHack","spanHackClassName","text","SvgContainer","svgName","S","analyticsData","videoId","videoName","analyticsOptions","actionType","entity","location","AnalyticsHelper","TagList","TagHelper","getTagAppLink","onClickTag","time","setStartTime","PartialTagItem","tagClass","classNames","getTagActionProps","renderAsSpan","appLink","getAppLink","TagItem","disabled","toLowerCase","hasThemeColour","themeColours","secondary","getTagTypeClass","onRemove","backgroundColor","role","getTagSortValue","sortedTags","SeeMore","AppLink","descriptor","WidgetHeader","hasDescription","showSeeMoreLink","SLIDER_ANIMATION_TIME","useWidgetKeyboard","options","state","containerRef","mediaQuery","isTabbing","setIsTabbing","dynamicAttributes","setDynamicAttributes","focusedWidgetIndex","setFocusedWidgetIndex","containerLeftPosition","setTimeout","dynamicWidgetState","focusableItems","Array","from","reduce","acc","item","rect","isItemVisable","left","containerRightPosition","right","offset","onFocusWidget","index","document","querySelector","onBlurWidget","getFixedAttributes","fixedWidgetState","viewableItems","focusNext","items","querySelectorAll","nextFocusableElement","focus","focusPrev","prevFocusableElement","blankImage","Image","DragHelper","dataTransfer","setDragImage","FunctionHelper","isTouchScreen","UserAgentHelper","SlidingListContainer","listenerProps","xPosition","measurement","dragPercentage","positionType","onDrag","onDragEnd","onTouchMove","onTouchEnd","percentageDragged","position","CssMeasurement","C","transform","transition","draggable","onDragStart","onDragOver","onTouchMoveCapture","onTouchEndCapture","WidgetButtonDirection","WidgetButton","isLeft","direction","Left","arrowSvg","hide","contents","paddingBottom","height","useGradientBackdrop","leftGradientClassName","rightGradientClassName","hideExtendedClickableArea","tabIndex","leftButtonClassName","rightButtonClassName","hoverText","TagTypeNumber","WidgetInteraction","useGetMediaQueryString","isXS","isSM","isMD","isLG","isXL","isXXL","currentString","useVideoFeatureAccess","hasPermissions","hasLocalPermissions","hasNP","hasProduct","canViewResources","canViewInteractives","canViewClips","canViewCurriculumLinks","canUseActions","canViewPublicLayout","canViewResourceItems","canNavigate","MIN_MAX_HEIGHT","VideoGuidanceClassroomGuidePopup","setSelectedCurriculum","alerts","isLoading","currentCurriculum","activeCurriculum","ArrayHelper","availableCurriculums","hasCurriculumLinks","customerHasCurriculumLinks","Popup","closePopup","onClickClose","showLoadingSpinner","autoHeightMin","renderThumbVertical","borderRadius","zIndex","getVideoAppLink","t","curriculumId","newCurriculum","find","c","updateCurriculum","error","hasLoaded","curriculumLinksEmptyStateUrl","PopupButtons","variant","onClickViewVideo","VideoGuidanceClassroomGuideView","MasterType","VideoRequests","ClipRequests","useFetchPointsOfInterest","useCurriculums","featureAccess","hasCompleted","application","action","TextHelper","ImageUrls","VideoAppLinkHelper","params","tagOrClassification","deselectCurrent","clipboardToIE11Formatting","module","exports","debug","message","reselectPrevious","range","selection","mark","success","createRange","getSelection","createElement","textContent","ariaHidden","all","top","clip","whiteSpace","webkitUserSelect","MozUserSelect","msUserSelect","userSelect","stopPropagation","preventDefault","clipboardData","console","warn","window","clearData","setData","onCopy","body","appendChild","selectNodeContents","addRange","execCommand","err","copyKey","test","navigator","userAgent","prompt","removeRange","removeAllRanges","removeChild","_typeof","obj","Symbol","iterator","constructor","prototype","defineProperty","value","CopyToClipboard","_react","_interopRequireDefault","_copyToClipboard","_excluded","__esModule","ownKeys","object","enumerableOnly","getOwnPropertySymbols","symbols","sym","getOwnPropertyDescriptor","enumerable","_objectSpread","target","arguments","source","_defineProperty","getOwnPropertyDescriptors","defineProperties","_defineProperties","configurable","writable","_setPrototypeOf","o","p","setPrototypeOf","__proto__","_assertThisInitialized","self","ReferenceError","_getPrototypeOf","getPrototypeOf","_React$PureComponent","subClass","superClass","TypeError","create","_inherits","Constructor","protoProps","Derived","hasNativeReflectConstruct","_super","Reflect","construct","sham","Proxy","Boolean","valueOf","call","_isNativeReflectConstruct","result","Super","NewTarget","_possibleConstructorReturn","_this","instance","_classCallCheck","_len","_key","concat","_this$props","elem","Children","only","_this$props2","excluded","sourceKeys","indexOf","_objectWithoutPropertiesLoose","sourceSymbolKeys","propertyIsEnumerable","_objectWithoutProperties","cloneElement","PureComponent","undefined","rangeCount","active","activeElement","ranges","getRangeAt","tagName","toUpperCase","blur"],"sourceRoot":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[5549],{94644:(e,t,a)=>{a.d(t,{r:()=>l});var i=a(50242),n=a(81886),r=a(67058),o=a(14553),c=a(49267),s=a(49075),d={notFound:r.d,forbidden:{rating:o.q,yearLevel:o.q,region:c.a,privacy:o.q},badRequest:s._};function l(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e){var r;r="number"==typeof e?e:e.status;var o=Object.assign(Object.assign({},d),t);r&&n.Q.Ry.isStatusCodeError(r)&&(r!==i.o.NotFound?r!==i.o.Forbidden?a.badRequest||n.Q.Ry.throw(new o.badRequest):a.forbidden||n.Q.Ry.throw(new o.forbidden.privacy):a.notFound||n.Q.Ry.throw(new o.notFound))}}},91286:(e,t,a)=>{a.d(t,{v:()=>o});var i=a(32735),n=a(94644);function r(e){return e.map((function(e){return e.statusCode})).join(":")}function o(e,t,a){var o=Array.isArray(e)?e:[e];(0,i.useEffect)((function(){o.forEach((function(e){(0,n.r)(e.statusCode,t,a)}))}),[r(o),t,a])}},63719:(e,t,a)=>{a.d(t,{h:()=>c});var i=a(32735),n=a(77316);function r(e,t){if(e){if("string"==typeof e)return o(e,t);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?o(e,t):void 0}}function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,i=Array(t);a<t;a++)i[a]=e[a];return i}function c(e){var t,a,c=(t=i.useMemo((function(){return n.p.getBuilder()}),[]),a=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var i,n,r,o,c=[],s=!0,d=!1;try{if(r=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;s=!1}else for(;!(s=(i=r.call(a)).done)&&(c.push(i.value),c.length!==t);s=!0);}catch(e){d=!0,n=e}finally{try{if(!s&&null!=a.return&&(o=a.return(),Object(o)!==o))return}finally{if(d)throw n}}return c}}(t,a)||r(t,a)||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=c[0],d=(0,c[1])(s);return d&&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)||r(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.")}()}(d),[Object.assign(Object.assign({},e),{active:!0})]):d}},5859:(e,t,a)=>{function i(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,i=Array(t);a<t;a++)i[a]=e[a];return i}a.d(t,{u:()=>r});var n={numItems:5,minWidth:50,maxWidth:100},r={getPartialLoadingItems:function(){var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},a=Object.assign(Object.assign({},n),t);return(e=Array(a.numItems),function(e){if(Array.isArray(e))return i(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return i(e,t);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?i(e,t):void 0}}(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.")}()).map((function(){return{width:"".concat(Math.max(Math.floor(Math.random()*a.maxWidth),a.minWidth),"px")}}))}}},44110:(e,t,a)=>{a.d(t,{i:()=>o});var i=a(20354),n=a(89454),r=a(86698),o=function(){var e=(0,r.y)({redirectOnError:!0}),t=e.activePresentation,a=e.getFallbackPresentation,o=t||a();return i.a.useBasicFetch(!!o&&n.O.presentationAudiences(o.id))}},36073:(e,t,a)=>{a.r(t),a.d(t,{PlayClipViewV2:()=>j});var i=a(32735),n=a(50242),r=a(23481),o=a(20354),c=a(65858),s=a(78417),d=a(16714),l=a(67058),u=a(33803),p=a(43012),v=a(39151),m=a(1666),f=a(20768),y=a(31949),g=a(1575),h=a(63719),I=a(26304),b=a(91286),A=a(22902),P=a(15311),C=a(79612),E=a(76753),O=a(51855),V=a(7179),F=a(49948),S=a(36873),R=a(27638),x=a(44110),w=a(35014),L=a(97816),G=a(81812),T=a(14085),k=r.T.encloseNamespace("shared.playClipV2"),q={notFound:l.d,forbidden:{privacy:u.G}};function j(e){var t,a,r,l,u,j,N=e.queryParams,M=N.context,U=N.contextId,_=N.mtv,B=(0,P.r)().hasProduct,W=(0,R.u)(c.LZ.PlayClip),D=W.setFavourite,H=W.canFavourite,Q=(0,A.T)().hasPermissions,K=(0,O.G)().isPlugin,Y=o.a.useBasicFetch(y.N.currentUser()),Z=o.a.useBasicFetch(v.L.config()),$=o.a.useBasicFetch(p.e.clip(e.id)),J=o.a.useBasicFetch(f.b.videoInteractives(e.id)),z=o.a.useBasicFetch(!!(null===(t=$.data)||void 0===t?void 0:t._parentVideo)&&g.R.video($.data._parentVideo.id));(0,L.V)([z.data]);var X=o.a.useBasicFetch(!!(null===(a=$.data)||void 0===a?void 0:a._parentVideo)&&p.e.videoClips($.data._parentVideo.id)),ee=o.a.useBasicFetch($.statusCode===n.o.Forbidden&&p.e.clip(e.id,s.r.StripMetadata)),te=(0,S.k)({video:z.data,context:M,contextId:U,moviesAndTv:_,currentUser:Y.data}),ae=(0,x.i)(),ie=o.a.useBasicFetch((null===(r=Y.data)||void 0===r?void 0:r.isAuthenticated)&&m.h.yearGroups(Y.data.customerId)),ne=(0,G.a)(),re=(0,F.l)(e.id,!0),oe=(0,w.I)(),ce=(0,h.h)({name:null===(l=$.data)||void 0===l?void 0:l.name});return(0,C.M)(E.CG.getClipMetadata({content:$.data,phraseContext:{phraseHandler:k,titlePhrase:"pageTitle",descriptionPhrase:"pageDescription"}})),(0,b.v)($,q,{forbidden:!0}),(0,L.V)(null!==(u=te.videos)&&void 0!==u?u:[]),(0,I.b)(ee),(0,V.P)({id:e.id,app:"clips"}),$.data&&Y.hasCompleted&&Z.hasCompleted&&re.hasCompleted?i.createElement(T.S,{clip:$.data,clips:X.data,interactives:J.data,originalVideo:z.data,currentUser:Y.data,yearGroups:ie.data,relatedVideos:"playlist"===M?te:Object.assign(Object.assign({},te),{videos:[]}),canFavourite:H,setFavourite:D,hasProduct:B,queryParams:e.queryParams,audiences:ae.data,imageCdnUrl:Z.data.imageCdnUrl,canManageVideoAccess:Q(d.C.ManageVideoAccess),pointsOfInterest:re.items,featureAccess:oe,tableOfContentsId:null===(j=e.queryParams)||void 0===j?void 0:j.tocId,shouldShowSideTableOfContents:ne,isPlugin:K,breadcrumbs:ce}):i.createElement(i.Fragment,null)}j.defaultProps={queryParams:{}}},14085:(e,t,a)=>{a.d(t,{S:()=>H});var i=a(32735),n=a(28400),r=a(49935),o=a(5640),c=a(12059),s=a(51184),d=a(64921),l=a(95812),u=a(53709),p=a(71063),v=a(10439),m=a(35429),f=a(4594),y=a(16714),g=a(12754),h=a(22902),I=a(65332),b=a(76196),A=a(59598),P=a(31908),C=a(26492),E=a(9465),O=a(91479),V=a(47938),F=a(81024),S=a(78166),R=a(99742),x=a(14070),w=a(97291),L=a(22490),G=a(63010),T=a(14476),k=a(53256),q=a(83345),j=a(13231),N=a(51365),M=a(10671),U=a(10741),_="shared.playClipV2";function B(e){var t=(0,h.T)().hasPermissions,a=(0,M._)({location:M.i.VideoItem});return i.createElement("section",{className:"play-page-section",id:A.K.ClippedFrom,ref:function(t){var a;t&&(null===(a=e.headingRef)||void 0===a?void 0:a.current)&&e.headingRef.current.set(A.K.ClippedFrom,t)}},i.createElement("h2",{className:"h4 mb-0"},i.createElement(q.x,{namespace:_,phrase:"clippedFrom"})),i.createElement(N.M.Provider,{value:a},i.createElement(j.E4,{videos:[e.originalVideo],yearGroups:e.yearGroups,setFavourite:e.setFavourite,canFavourite:e.canFavourite,getVideoAppLink:function(t,a){return L.W.getAppLink(t,Object.assign(Object.assign({},a),{context:e.queryParams.context,contextId:e.queryParams.contextId,playNext:e.queryParams.playNext,shareId:e.shareId,moviesAndTv:e.queryParams.mtv}))},hasPermissions:t,presentationAudiences:e.audiences,getPreviewQuestionsAppLink:function(e){return U.j.getPreviewQuestionsAppLink(e)},isPlugin:e.isPlugin,getClassroomGuideAppLink:e.getClassroomGuideAppLink,getInteractiveGuidanceAppLink:e.getInteractiveGuidanceAppLink,getResourceGuidanceAppLink:e.getResourceGuidanceAppLink})))}const W={main:"iQ0Ie",expandedToc:"sIoV8"};var D=function(e,t,a){return function(i){return a?{application:w.O.VIDEOS,action:x.e.Videos.PREVIEW_PDF,args:[i.id],params:{videoId:e,shareId:t}}:{application:w.O.SIGN_UP,action:x.e.SignUp.SIGN_UP}}};function H(e){var t,a,q,j,N,M,U,_,H,Q,K=(0,m.g)(),Y=(0,h.T)().hasPermissions,Z=P.M.getCanBeConsumed(e.clip).canConsume,$=(0,G.Q)(e.tableOfContentsId),J=$.tableOfContentsActiveId,z=$.setTableOfContentsActiveId,X=$.controlledId,ee=$.setControlledId,te=$.tableOfContentsExpanded,ae=$.onToggleTableOfContents,ie=(0,s.Wp)(e.clip)&&e.featureAccess.canViewGlance,ne=(0,T.i)(ie),re=ne.headingRef,oe=ne.headingElements,ce=oe.map((function(t){var a;return{id:t.id,name:k.d.getSectionHeading(t.id,{clips:e.clips,interactives:e.interactives,resources:null===(a=e.clip.resources)||void 0===a?void 0:a.data,isPlayClipPage:!0})}}));(0,I.D)({setActiveId:z,headingElements:oe,controlledId:X,setControlledId:ee}),(0,b.P)(oe,e.tableOfContentsId);var se=P.M.isVideoTypeArchived(e.clip),de=Y(y.C.StudentExperience),le=i.useRef(!1);function ue(){var e,t,a,i;le.current=!(null===(t=null===(e=null==K?void 0:K.playerRef)||void 0===e?void 0:e.current)||void 0===t?void 0:t.isPaused()),null===(i=null===(a=null==K?void 0:K.playerRef)||void 0===a?void 0:a.current)||void 0===i||i.pause()}function pe(){var e,t;le.current&&(null===(t=null===(e=null==K?void 0:K.playerRef)||void 0===e?void 0:e.current)||void 0===t||t.play())}function ve(){var t,a;return!(!e.originalVideo||!(null===(t=e.clip._canBeConsumed)||void 0===t?void 0:t.value)||!(null===(a=e.currentUser)||void 0===a?void 0:a.isAuthenticated)||!e.hasProduct(g.x.Primary)||de)}var me="picture-in-picture"===K.mode||e.featureAccess.canViewPublicLayout,fe=null!==(a=null===(t=e.clips)||void 0===t?void 0:t.filter((function(t){return t.id.toString()!==e.clip.id.toString()})))&&void 0!==a?a:[];return i.createElement("div",{className:"px-4 play-page-sections-container"},i.createElement("main",{className:"".concat(W.main," ").concat(e.shouldShowSideTableOfContents&&te?W.expandedToc:e.shouldShowSideTableOfContents&&!te?"pe-4":void 0)},!!(null===(q=e.breadcrumbs)||void 0===q?void 0:q.length)&&i.createElement("div",{className:"mb-2"},i.createElement(r.Oo,{breadcrumbs:e.breadcrumbs})),i.createElement(V.W,{restrictions:e.clip._restrictions,yearGroups:e.yearGroups,objectId:e.clip.id,objectTypeId:f.E.Clip,canManageVideoAccess:e.canManageVideoAccess}),se&&i.createElement(C.T,{typeId:e.clip.typeId,hasStudentExperience:de}),i.createElement("section",{id:A.K.Video,className:"mb-2 ".concat(p.M.GLOBAL_PLAYER_SELECTOR),ref:function(e){e&&(null==re?void 0:re.current)&&re.current.set(A.K.Video,e)}},Z&&i.createElement(v.r,{key:e.clip.id,objectId:e.clip.id,objectTypeId:e.clip.typeId,shareId:e.shareId,context:null===(j=e.queryParams)||void 0===j?void 0:j.context,contextId:null===(N=e.queryParams)||void 0===N?void 0:N.contextId,moviesAndTv:null===(M=e.queryParams)||void 0===M?void 0:M.mtv,playNext:null===(U=e.queryParams)||void 0===U?void 0:U.playNext,startTime:null!==(H=null===(_=e.queryParams)||void 0===_?void 0:_.t)&&void 0!==H?H:null===(Q=e.queryParams)||void 0===Q?void 0:Q.startTime,mode:"default",location:"play-page"}),i.createElement("div",{className:me?"":"d-none"},i.createElement(F.S,{video:e.clip,type:"pip"}))),i.createElement(O.v,{media:e.clip,yearGroups:e.yearGroups,audiences:e.audiences,originalVideoAppLink:ve()?{application:w.O.VIDEOS,action:x.e.Videos.PLAY_VIDEO,args:[e.originalVideo.id,n.m.slugify(e.originalVideo.name)]}:null,featureAccess:e.featureAccess,shareId:e.shareId}),ie?i.createElement(d.j,{video:e.clip,pointsOfInterest:e.pointsOfInterest,setStartTime:function(e){var t;return null===(t=K.playerRef.current)||void 0===t?void 0:t.currentTime(e)},getTagAppLink:function(e){return{application:w.O.SEARCH,action:x.e.Search.HOME,params:{tagOrClassification:e.name}}},suppressInteractivity:e.featureAccess.canViewPublicLayout,canViewGlance:ie}):i.createElement(c.a,{video:e.clip,onLaunchImmersiveReader:ue,onExitImmersiveReader:pe,getTagAppLink:function(e){return{application:w.O.SEARCH,action:x.e.Search.HOME,params:{tagOrClassification:e.name}}},headingRef:re,suppressInteractivity:e.featureAccess.canViewPublicLayout}),i.createElement(u.M,{video:e.clip,canViewResources:e.featureAccess.canViewResourceItems,imageCdnUrl:e.imageCdnUrl,getAppLink:D(e.clip.id,e.shareId,e.featureAccess.canViewResourceItems),analyticsData:{clipId:e.clip.id,clipName:e.clip.name},resourceThumbnailFallbackUrl:R.W.Fallbacks.RESOURCE_THUMBNAIL,headingRef:re}),i.createElement(l.J,{video:e.clip,interactives:e.interactives,imageCdnUrl:e.imageCdnUrl,analyticsData:{clipId:e.clip.id,clipName:e.clip.name},canViewInteractives:e.featureAccess.canViewInteractives,headingRef:re,yearGroups:e.yearGroups,setFavourite:e.setFavourite,canFavourite:e.canFavourite,isPlugin:e.isPlugin}),i.createElement(o.O,{clips:fe||[],video:e.clip,canViewClips:e.featureAccess.canViewClips,yearGroups:e.yearGroups,audiences:e.audiences,imageCdnUrl:e.imageCdnUrl,setFavourite:e.setFavourite,canFavourite:e.canFavourite,headingRef:re,analyticsData:{clipId:e.clip.id,clipName:e.clip.name},isPlugin:e.isPlugin}),ie&&i.createElement(c.a,{video:e.clip,onLaunchImmersiveReader:ue,onExitImmersiveReader:pe,getTagAppLink:function(e){return{application:w.O.SEARCH,action:x.e.Search.HOME,params:{tagOrClassification:e.name}}},headingRef:re,suppressInteractivity:e.featureAccess.canViewPublicLayout}),!!ve()&&i.createElement(B,{originalVideo:e.originalVideo,setFavourite:e.setFavourite,canFavourite:e.canFavourite,yearGroups:e.yearGroups,shareId:e.shareId,queryParams:e.queryParams,audiences:e.audiences,headingRef:re,isPlugin:e.isPlugin,getClassroomGuideAppLink:L.W.getClassroomGuideAppLink,getInteractiveGuidanceAppLink:L.W.getInteractiveGuidanceAppLink,getResourceGuidanceAppLink:L.W.getResourceGuidanceAppLink}),i.createElement(S.Z,{currentVideo:e.clip,yearGroups:e.yearGroups,relatedVideos:e.relatedVideos,setFavourite:e.setFavourite,canFavourite:e.canFavourite,currentUser:e.currentUser,audiences:e.audiences,getVideoAppLink:function(t,a){return L.W.getAppLink(t,Object.assign(Object.assign({},a),{context:e.queryParams.context,contextId:e.queryParams.contextId,playNext:e.queryParams.playNext,shareId:e.shareId,moviesAndTv:e.queryParams.mtv}))},moviesAndTv:e.queryParams.mtv,isPlugin:e.isPlugin})),i.createElement(E.h,{isExpanded:te,setIsExpanded:ae,items:ce,activeId:J,setControlledId:ee,analyticsData:{clipId:e.clip.id,clipName:e.clip.name},showInSide:e.shouldShowSideTableOfContents}))}}}]);
|
|
2
|
-
//# sourceMappingURL=5549-
|
|
2
|
+
//# sourceMappingURL=5549-e0ed88aaa1-lite.chunk.js.map
|
package/dist/scripts/{5549-ae40aeb0f8-lite.chunk.js.map → 5549-e0ed88aaa1-lite.chunk.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/5549-ae40aeb0f8-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/hooks/UseHandleObjectError.ts","file:///app/packages/libs/shared/src/hooks/useBreadcrumbs.ts","file:///app/packages/libs/shared/src/utils/PartialLoadingHelper.ts","file:///app/packages/projects/lite/src/shared/hooks/usePresentationAudiences.ts","file:///app/packages/projects/lite/src/shared/views/play-clip/v2/PlayClipViewV2.tsx","file:///app/packages/projects/lite/src/shared/views/play-clip/v2/components/clipped-from/ClippedFrom.tsx","file:///app/packages/projects/lite/src/shared/views/play-clip/v2/components/play-clip/play-clip-v2.scss","file:///app/packages/projects/lite/src/shared/views/play-clip/v2/components/play-clip/PlayClipV2.tsx"],"sourcesContent":["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}\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};\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.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 { 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 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","const DEFAULT_PARTIAL_LOADING_OPTIONS: PartialLoadingOptions = {\n numItems: 5,\n minWidth: 50, // px\n maxWidth: 100 // px\n};\n\nexport interface PartialLoadingOptions {\n numItems?: number;\n minWidth?: number;\n maxWidth?: number;\n}\n\ninterface PartialLoadingItem {\n width: string;\n}\n\nexport const PartialLoadingHelper = {\n getPartialLoadingItems(options: PartialLoadingOptions = {}): PartialLoadingItem[] {\n const opts = {\n ...DEFAULT_PARTIAL_LOADING_OPTIONS,\n ...options\n };\n\n const getRandomFilterWidth = () => Math.max(Math.floor(Math.random() * opts.maxWidth), opts.minWidth);\n\n return [...Array(opts.numItems)].map(() => ({ width: `${getRandomFilterWidth()}px` }));\n }\n};","import { Flight } from 'libs/common/react/index';\n\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\nimport { usePresentation } from 'shared/hooks/usePresentation';\n\nexport const usePresentationAudiences = () => {\n const { activePresentation, getFallbackPresentation } = usePresentation({ redirectOnError: true });\n\n const presentation = activePresentation || getFallbackPresentation();\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n !!presentation &&\n AudienceRequests.presentationAudiences(presentation.id)\n );\n\n return audiences;\n};","import * as React from 'react';\n\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { PermissionFilterOption } from 'libs/shared/enums/PermissionFilterOption';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { VideoPrivateError } from 'libs/shared/errors/videos/video-private/VideoPrivateError';\nimport { ClipRequests } from 'libs/shared/flight-requests/ClipRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useBreadcrumbs } from 'libs/shared/hooks/useBreadcrumbs';\nimport { useCannotConsumeError } from 'libs/shared/hooks/useCannotConsumeError';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Clip, Config, CurrentUser, InteractiveMetadata, Video, YearGroup } from 'libs/shared/interfaces';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { usePluginHelper } from 'shared/hooks/use-plugin-helper/usePluginHelper';\nimport { useDeepLinks } from 'shared/hooks/useDeepLinks';\nimport { useFetchPointsOfInterest } from 'shared/hooks/useFetchPointsOfInterest';\nimport { useGetRelatedVideos } from 'shared/hooks/useGetRelatedVideos';\nimport { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\nimport { usePresentationAudiences } from 'shared/hooks/usePresentationAudiences';\nimport { useVideoFeatureAccess } from 'shared/hooks/useVideoFeatureAccess';\nimport { useVideoMixin } from 'shared/hooks/useVideoMixin';\nimport { useShouldShowSideTableOfContents } from 'shared/views/play/v2/hooks/useShouldShowTableOfContents';\n\nimport { PlayViewProps } from '../PlayClipViewContainer';\n\nimport { PlayClipV2 } from './components/play-clip/PlayClipV2';\n\nconst namespace = 'shared.playClipV2';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst clipErrors = {\n notFound: NotFoundError,\n forbidden: {\n privacy: VideoPrivateError\n }\n};\n\nPlayClipViewV2.defaultProps = {\n queryParams: {}\n};\n\nexport function PlayClipViewV2(props: PlayViewProps): JSX.Element {\n const { context, contextId, mtv } = props.queryParams;\n\n const { hasProduct } = useProducts();\n const { setFavourite, canFavourite } = useLiteFavourites(LocationContext.PlayClip);\n const { hasPermissions } = usePermissions();\n\n const { isPlugin } = usePluginHelper();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const clip = Flight.useBasicFetch<Clip>(ClipRequests.clip(props.id));\n\n const interactives = Flight.useBasicFetch<InteractiveMetadata[]>(InteractiveRequests.videoInteractives(props.id));\n const video = Flight.useBasicFetch<Video>(\n !!clip.data?._parentVideo && VideoRequests.video(clip.data._parentVideo.id)\n );\n useVideoMixin([video.data]);\n\n const childClips = Flight.useBasicFetch<Clip[]>(\n !!clip.data?._parentVideo && ClipRequests.videoClips(clip.data._parentVideo.id)\n );\n\n const strippedClip = Flight.useBasicFetch<Clip>(clip.statusCode === HttpStatus.Forbidden &&\n ClipRequests.clip(props.id, PermissionFilterOption.StripMetadata));\n const relatedVideos = useGetRelatedVideos({\n video: video.data,\n context,\n contextId,\n moviesAndTv: mtv,\n currentUser: currentUser.data\n });\n const audiences = usePresentationAudiences();\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const shouldShowSideTableOfContents = useShouldShowSideTableOfContents();\n\n const pointsOfInterest = useFetchPointsOfInterest(props.id, true);\n \n const featureAccess = useVideoFeatureAccess();\n\n const breadcrumbs = useBreadcrumbs({ name: clip.data?.name });\n\n useSetPageMetadata(PageMetadataHelper.getClipMetadata({\n content: clip.data,\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n }\n }));\n\n useHandleObjectError(clip, clipErrors, { forbidden: true });\n useVideoMixin(relatedVideos.videos ?? []);\n useCannotConsumeError(strippedClip);\n useDeepLinks({ id: props.id, app: 'clips' });\n\n const hasLoaded = (\n clip.data &&\n currentUser.hasCompleted &&\n config.hasCompleted &&\n pointsOfInterest.hasCompleted\n );\n\n if (!hasLoaded)\n return <></>;\n\n return (\n <PlayClipV2\n clip={clip.data}\n clips={childClips.data}\n interactives={interactives.data}\n originalVideo={video.data}\n currentUser={currentUser.data}\n yearGroups={yearGroups.data}\n // we only show up next videos for clips in a playlist\n relatedVideos={context === 'playlist' ? relatedVideos : { ...relatedVideos, videos: []}}\n canFavourite={canFavourite}\n setFavourite={setFavourite}\n hasProduct={hasProduct}\n queryParams={props.queryParams}\n audiences={audiences.data}\n imageCdnUrl={config.data.imageCdnUrl}\n canManageVideoAccess={hasPermissions(PermissionName.ManageVideoAccess)}\n pointsOfInterest={pointsOfInterest.items}\n featureAccess={featureAccess}\n tableOfContentsId={props.queryParams?.tocId}\n shouldShowSideTableOfContents={shouldShowSideTableOfContents}\n isPlugin={isPlugin}\n breadcrumbs={breadcrumbs}\n />\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoList } from 'libs/shared/components/video-list/VideoList';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { CanFavouriteFunc, FavouriteFunc, PresentationAudience, VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { PlayViewQueryParams } from 'libs/shared/interfaces/query-params/PlayViewQueryParams';\n\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { InteractiveHelpers } from 'shared/utils/InteractiveHelper';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nconst namespace = 'shared.playClipV2';\n\ninterface ClippedFromProps {\n originalVideo: VideoTypes;\n yearGroups: YearGroup[];\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n queryParams: PlayViewQueryParams;\n audiences: PresentationAudience[];\n shareId?: string;\n headingRef: React.MutableRefObject<Map<PlayPageAnchor, HTMLElement>>;\n isPlugin: boolean;\n getInteractiveGuidanceAppLink: (id: string, type: MasterType) => Core.AppLink;\n getResourceGuidanceAppLink: (id: string, type: MasterType) => Core.AppLink;\n getClassroomGuideAppLink: (id: string, type: MasterType) => Core.AppLink;\n}\n\nexport function ClippedFrom(props: ClippedFromProps) {\n const { hasPermissions } = usePermissions();\n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem });\n\n return (\n <section\n className='play-page-section'\n id={PlayPageAnchor.ClippedFrom}\n ref={el => {\n (el && props.headingRef?.current) && props.headingRef.current.set(PlayPageAnchor.ClippedFrom, el);\n }}\n >\n <h2 className='h4 mb-0'><Text namespace={namespace} phrase='clippedFrom' /></h2>\n <VideoActionsContext.Provider value={videoActions}>\n <VideoList\n videos={[props.originalVideo]}\n yearGroups={props.yearGroups}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n getVideoAppLink={(v, opts) => VideoAppLinkHelper.getAppLink(v, {\n ...opts,\n context: props.queryParams.context,\n contextId: props.queryParams.contextId,\n playNext: props.queryParams.playNext,\n shareId: props.shareId,\n moviesAndTv: props.queryParams.mtv\n })}\n hasPermissions={hasPermissions}\n presentationAudiences={props.audiences}\n getPreviewQuestionsAppLink={interactive => InteractiveHelpers.getPreviewQuestionsAppLink(interactive)}\n isPlugin={props.isPlugin}\n getClassroomGuideAppLink={props.getClassroomGuideAppLink}\n getInteractiveGuidanceAppLink={props.getInteractiveGuidanceAppLink}\n getResourceGuidanceAppLink={props.getResourceGuidanceAppLink}\n />\n </VideoActionsContext.Provider>\n </section>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"main\":\"iQ0Ie\",\"expandedToc\":\"sIoV8\"};","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { Breadcrumb, Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { PlayPageClips } from 'libs/shared/components/play-page-v2/clips-widget/PlayPageClips';\nimport { VideoDetailsWithScrollbarV2 } from 'libs/shared/components/play-page-v2/details/VideoDetailsV2';\nimport { hasGlanceData } from 'libs/shared/components/play-page-v2/glance/VideoAtAGlanceUtilsV2';\nimport { VideoAtAGlanceV2 } from 'libs/shared/components/play-page-v2/glance/VideoAtAGlanceV2';\nimport { PlayPageInteractives } from 'libs/shared/components/play-page-v2/interactives-widget/PlayPageInteractives';\nimport { PlayPageResources } from 'libs/shared/components/play-page-v2/resources-widget/PlayPageResources';\nimport { SeoConstants } from 'libs/shared/constants/SeoConstants';\nimport { GlobalPlayerConsumer } from 'libs/shared/context/player-context/components/GlobalPlayerConsumer';\nimport { usePlayerContext } from 'libs/shared/context/player-context/PlayerContext';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { HasProductFunc } from 'libs/shared/hooks/UseProducts';\nimport { useTableOfContentsActiveHeading } from 'libs/shared/hooks/useTableOfContentsActiveHeading';\nimport { useTableOfContentsScroll } from 'libs/shared/hooks/useTableOfContentsScroll';\nimport { CanFavouriteFunc, Clip, CurrentUser, FavouriteFunc, InteractiveMetadata, Link, PointOfInterest, PresentationAudience, Resource, Video, YearGroup } from 'libs/shared/interfaces';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { PlayViewQueryParams } from 'libs/shared/interfaces/query-params/PlayViewQueryParams';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { ArchivedBanner } from 'shared/components/play-page/ArchivedBanner';\nimport { TableOfContentsContainer } from 'shared/components/play-page/components/table-of-contents/TableOfContents';\nimport { PlayPageTitleAndActions } from 'shared/components/play-page/components/title-and-actions/PlayPageTitleAndActions';\nimport { RestrictionBanner } from 'shared/components/play-page/RestrictionBanner';\nimport { PlayerPlaceholder } from 'shared/components/player-placeholder/PlayerPlaceholder';\nimport { RelatedVideos } from 'shared/components/related-videos/RelatedVideos';\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { RelatedVideosHash } from 'shared/hooks/useGetRelatedVideos';\nimport { VideoFeaturesHash } from 'shared/hooks/useVideoFeatureAccess';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\nimport { usePlayPageTableOfContent } from 'shared/views/play/v2/hooks/usePlayPageTableOfContent';\nimport { useSectionHeadings } from 'shared/views/play/v2/hooks/useSectionHeadings';\nimport { PlayPageUtils } from 'shared/views/play/v2/PlayPageUtilV2';\nimport { ClippedFrom } from 'shared/views/play-clip/v2/components/clipped-from/ClippedFrom';\n\nimport styles from './play-clip-v2.scss';\n\nconst getResourceAppLink = (videoId: string, shareId: string, canViewResource: boolean) =>\n (resource: Resource | Link) => {\n if (!canViewResource) {\n return {\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.SIGN_UP\n };\n }\n\n return {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PREVIEW_PDF,\n args: [resource.id],\n params: {\n videoId: videoId,\n shareId: shareId\n }\n };\n };\n\n\ninterface PlayClipV2Props {\n clip: Clip;\n clips: Clip[];\n interactives: InteractiveMetadata[];\n originalVideo: Video;\n currentUser: CurrentUser;\n yearGroups: YearGroup[];\n relatedVideos: RelatedVideosHash;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n queryParams: PlayViewQueryParams;\n hasProduct: HasProductFunc;\n audiences: PresentationAudience[];\n imageCdnUrl: string;\n shareId?: string;\n canManageVideoAccess: boolean;\n pointsOfInterest?: PointOfInterest[];\n featureAccess: VideoFeaturesHash;\n tableOfContentsId: string;\n shouldShowSideTableOfContents: boolean;\n isPlugin: boolean;\n breadcrumbs?: Breadcrumb[];\n}\n\nexport function PlayClipV2(props: PlayClipV2Props): JSX.Element {\n const playerContext = usePlayerContext();\n\n const { hasPermissions } = usePermissions();\n const { canConsume } = VideoHelper.getCanBeConsumed(props.clip);\n \n const {\n tableOfContentsActiveId,\n setTableOfContentsActiveId,\n controlledId,\n setControlledId,\n tableOfContentsExpanded,\n onToggleTableOfContents\n } = usePlayPageTableOfContent(props.tableOfContentsId);\n\n const hasGlance = hasGlanceData(props.clip) && props.featureAccess.canViewGlance;\n\n const { headingRef, headingElements } = useSectionHeadings(hasGlance);\n const items = headingElements.map(ele => {\n return {\n id: ele.id as PlayPageAnchor,\n name: PlayPageUtils.getSectionHeading(\n ele.id as PlayPageAnchor,\n {\n clips: props.clips,\n interactives: props.interactives,\n resources: props.clip.resources?.data,\n isPlayClipPage: true\n }\n )\n };\n });\n\n useTableOfContentsActiveHeading({\n setActiveId: setTableOfContentsActiveId,\n headingElements,\n controlledId,\n setControlledId\n });\n\n useTableOfContentsScroll(headingElements, props.tableOfContentsId);\n\n const isArchived = VideoHelper.isVideoTypeArchived(props.clip);\n const hasStudentExperience = hasPermissions(PermissionName.StudentExperience);\n /**\n * Need to use a ref because if we use state, onExitImmersiveReader will have a stale\n * reference of the state. This is because the state is changed in onLaunchImmersiveReader\n * which is passed in at the same time as onExitImmersiveReader\n */\n const shouldPlayOnExitImmersiveReader = React.useRef(false);\n\n function onLaunchImmersiveReader(): void {\n shouldPlayOnExitImmersiveReader.current = !playerContext?.playerRef?.current?.isPaused();\n playerContext?.playerRef?.current?.pause();\n }\n\n function onExitImmersiveReader(): void {\n if (!shouldPlayOnExitImmersiveReader.current)\n return;\n\n playerContext?.playerRef?.current?.play();\n }\n\n function canAccessOriginal(): boolean {\n if (!props.originalVideo || !props.clip._canBeConsumed?.value)\n return false;\n\n if (!props.currentUser?.isAuthenticated)\n return false;\n\n if (!props.hasProduct(ProductId.Primary))\n return false;\n\n if (hasStudentExperience)\n return false;\n\n return true;\n }\n\n function getOriginalVideoAppLink(): Core.AppLink {\n if (!canAccessOriginal())\n return null;\n \n return {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PLAY_VIDEO,\n args: [ props.originalVideo.id, TextHelper.slugify(props.originalVideo.name) ]\n };\n }\n\n const showPlayerPlaceholder = playerContext.mode === 'picture-in-picture' || props.featureAccess.canViewPublicLayout;\n\n const otherClips = props.clips?.filter(c => c.id.toString() !== props.clip.id.toString()) ?? [];\n\n function getMainClassName() {\n if (props.shouldShowSideTableOfContents && tableOfContentsExpanded) {\n return styles.expandedToc;\n }\n if (props.shouldShowSideTableOfContents && !tableOfContentsExpanded)\n return 'pe-4';\n }\n\n return (\n <div className='px-4 play-page-sections-container'>\n <main className={`${styles.main} ${getMainClassName()}`}>\n {!!props.breadcrumbs?.length &&\n <div className='mb-2'>\n <Breadcrumbs breadcrumbs={props.breadcrumbs} />\n </div>\n }\n\n\n <RestrictionBanner\n restrictions={props.clip._restrictions}\n yearGroups={props.yearGroups}\n objectId={props.clip.id}\n objectTypeId={MasterType.Clip}\n canManageVideoAccess={props.canManageVideoAccess}\n />\n\n {isArchived && (\n <ArchivedBanner\n typeId={props.clip.typeId}\n hasStudentExperience={hasStudentExperience}\n />\n )}\n\n <section\n id={PlayPageAnchor.Video}\n className={`mb-2 ${SeoConstants.GLOBAL_PLAYER_SELECTOR}`}\n ref={el => { (el && headingRef?.current) && headingRef.current.set(PlayPageAnchor.Video, el); }}\n >\n {canConsume && (\n <GlobalPlayerConsumer\n key={props.clip.id}\n objectId={props.clip.id}\n objectTypeId={props.clip.typeId}\n shareId={props.shareId}\n context={props.queryParams?.context}\n contextId={props.queryParams?.contextId}\n moviesAndTv={props.queryParams?.mtv}\n playNext={props.queryParams?.playNext}\n startTime={props.queryParams?.t ?? props.queryParams?.startTime}\n mode='default'\n location='play-page'\n />\n )}\n <div className={showPlayerPlaceholder ? '' : 'd-none'}>\n <PlayerPlaceholder\n video={props.clip}\n type='pip'\n />\n </div>\n </section>\n\n <PlayPageTitleAndActions\n media={props.clip}\n yearGroups={props.yearGroups}\n audiences={props.audiences}\n originalVideoAppLink={getOriginalVideoAppLink()}\n featureAccess={props.featureAccess}\n shareId={props.shareId}\n />\n\n {/* if no glance render video details here */}\n {hasGlance ? (\n <VideoAtAGlanceV2\n video={props.clip}\n pointsOfInterest={props.pointsOfInterest}\n setStartTime={(time: number) => playerContext.playerRef.current?.currentTime(time)}\n getTagAppLink={tag => ({\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n params: { tagOrClassification: tag.name }\n })}\n suppressInteractivity={props.featureAccess.canViewPublicLayout}\n canViewGlance={hasGlance}\n />\n ) : (\n <VideoDetailsWithScrollbarV2\n video={props.clip}\n onLaunchImmersiveReader={onLaunchImmersiveReader}\n onExitImmersiveReader={onExitImmersiveReader}\n getTagAppLink={tag => ({\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n params: { tagOrClassification: tag.name }\n })}\n headingRef={headingRef}\n suppressInteractivity={props.featureAccess.canViewPublicLayout}\n />\n )}\n\n <PlayPageResources\n video={props.clip}\n canViewResources={props.featureAccess.canViewResourceItems}\n imageCdnUrl={props.imageCdnUrl}\n getAppLink={\n getResourceAppLink(props.clip.id, props.shareId, props.featureAccess.canViewResourceItems)\n }\n analyticsData={{ clipId: props.clip.id, clipName: props.clip.name }}\n resourceThumbnailFallbackUrl={ImageUrls.Fallbacks.RESOURCE_THUMBNAIL}\n headingRef={headingRef}\n />\n\n <PlayPageInteractives\n video={props.clip}\n interactives={props.interactives}\n imageCdnUrl={props.imageCdnUrl}\n analyticsData={{ clipId: props.clip.id, clipName: props.clip.name }}\n canViewInteractives={props.featureAccess.canViewInteractives}\n headingRef={headingRef}\n yearGroups={props.yearGroups}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n isPlugin={props.isPlugin}\n />\n\n <PlayPageClips\n clips={otherClips || []}\n video={props.clip}\n canViewClips={props.featureAccess.canViewClips}\n yearGroups={props.yearGroups}\n audiences={props.audiences}\n imageCdnUrl={props.imageCdnUrl}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n headingRef={headingRef}\n analyticsData={{ clipId: props.clip.id, clipName: props.clip.name }}\n isPlugin={props.isPlugin}\n />\n\n {/* if has glance, render video details here */}\n {hasGlance && (\n <VideoDetailsWithScrollbarV2\n video={props.clip}\n onLaunchImmersiveReader={onLaunchImmersiveReader}\n onExitImmersiveReader={onExitImmersiveReader}\n getTagAppLink={tag => ({\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n params: { tagOrClassification: tag.name }\n })}\n headingRef={headingRef}\n suppressInteractivity={props.featureAccess.canViewPublicLayout}\n />\n )}\n \n {!!canAccessOriginal() && (\n <ClippedFrom\n originalVideo={props.originalVideo}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n yearGroups={props.yearGroups}\n shareId={props.shareId}\n queryParams={props.queryParams}\n audiences={props.audiences}\n headingRef={headingRef}\n isPlugin={props.isPlugin}\n getClassroomGuideAppLink={VideoAppLinkHelper.getClassroomGuideAppLink}\n getInteractiveGuidanceAppLink={VideoAppLinkHelper.getInteractiveGuidanceAppLink}\n getResourceGuidanceAppLink={VideoAppLinkHelper.getResourceGuidanceAppLink}\n />\n )}\n\n <RelatedVideos\n currentVideo={props.clip}\n yearGroups={props.yearGroups}\n relatedVideos={props.relatedVideos}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n currentUser={props.currentUser}\n audiences={props.audiences}\n getVideoAppLink={(v, opts) => VideoAppLinkHelper.getAppLink(v, {\n ...opts,\n context: props.queryParams.context,\n contextId: props.queryParams.contextId,\n playNext: props.queryParams.playNext,\n shareId: props.shareId,\n moviesAndTv: props.queryParams.mtv\n })}\n moviesAndTv={props.queryParams.mtv}\n isPlugin={props.isPlugin}\n />\n\n </main>\n\n <TableOfContentsContainer\n isExpanded={tableOfContentsExpanded}\n setIsExpanded={onToggleTableOfContents}\n items={items}\n activeId={tableOfContentsActiveId}\n setControlledId={setControlledId}\n analyticsData={{ clipId: props.clip.id, clipName: props.clip.name }}\n showInSide={props.shouldShowSideTableOfContents}\n />\n \n </div>\n );\n}"],"names":["defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","generateCacheKey","flightObjs","map","obj","join","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","Array","isArray","useEffect","forEach","useBreadcrumbs","current","match","breadcrumbs","useBuilder","active","DEFAULT_PARTIAL_LOADING_OPTIONS","numItems","minWidth","maxWidth","PartialLoadingHelper","getPartialLoadingItems","options","opts","width","Math","max","floor","random","usePresentationAudiences","redirectOnError","activePresentation","getFallbackPresentation","presentation","id","getPhrase","clipErrors","PlayClipViewV2","props","queryParams","context","contextId","mtv","hasProduct","u","setFavourite","canFavourite","hasPermissions","isPlugin","currentUser","config","clip","interactives","video","data","_parentVideo","childClips","strippedClip","relatedVideos","moviesAndTv","audiences","yearGroups","isAuthenticated","customerId","shouldShowSideTableOfContents","pointsOfInterest","featureAccess","name","content","phraseContext","phraseHandler","titlePhrase","descriptionPhrase","videos","app","hasCompleted","clips","originalVideo","imageCdnUrl","canManageVideoAccess","items","tableOfContentsId","tocId","defaultProps","namespace","ClippedFrom","usePermissions","videoActions","useVideoActions","location","className","PlayPageAnchor","ref","el","headingRef","set","Text","phrase","VideoActionsContext","value","VideoList","getVideoAppLink","v","VideoAppLinkHelper","playNext","shareId","presentationAudiences","getPreviewQuestionsAppLink","interactive","InteractiveHelper","getClassroomGuideAppLink","getInteractiveGuidanceAppLink","getResourceGuidanceAppLink","getResourceAppLink","videoId","canViewResource","resource","application","action","args","params","PlayClipV2","playerContext","canConsume","VideoHelper","usePlayPageTableOfContent","tableOfContentsActiveId","setTableOfContentsActiveId","controlledId","setControlledId","tableOfContentsExpanded","onToggleTableOfContents","hasGlance","canViewGlance","useSectionHeadings","headingElements","ele","resources","isPlayClipPage","useTableOfContentsActiveHeading","setActiveId","useTableOfContentsScroll","isArchived","hasStudentExperience","PermissionName","shouldPlayOnExitImmersiveReader","onLaunchImmersiveReader","playerRef","isPaused","pause","onExitImmersiveReader","play","canAccessOriginal","_canBeConsumed","ProductId","showPlayerPlaceholder","mode","canViewPublicLayout","otherClips","filter","c","toString","length","Breadcrumbs","RestrictionBanner","restrictions","_restrictions","objectId","objectTypeId","MasterType","ArchivedBanner","typeId","SeoConstants","GlobalPlayerConsumer","key","startTime","t","PlayerPlaceholder","type","PlayPageTitleAndActions","media","originalVideoAppLink","TextHelper","VideoAtAGlanceV2","setStartTime","time","currentTime","getTagAppLink","tag","tagOrClassification","suppressInteractivity","PlayPageResources","canViewResources","canViewResourceItems","getAppLink","analyticsData","clipId","clipName","resourceThumbnailFallbackUrl","ImageUrls","PlayPageInteractives","canViewInteractives","PlayPageClips","canViewClips","RelatedVideos","currentVideo","TableOfContents","isExpanded","setIsExpanded","activeId","showInSide"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"scripts/5549-e0ed88aaa1-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/hooks/UseHandleObjectError.ts","file:///app/packages/libs/shared/src/hooks/useBreadcrumbs.ts","file:///app/packages/libs/shared/src/utils/PartialLoadingHelper.ts","file:///app/packages/projects/lite/src/shared/hooks/usePresentationAudiences.ts","file:///app/packages/projects/lite/src/shared/views/play-clip/v2/PlayClipViewV2.tsx","file:///app/packages/projects/lite/src/shared/views/play-clip/v2/components/clipped-from/ClippedFrom.tsx","file:///app/packages/projects/lite/src/shared/views/play-clip/v2/components/play-clip/play-clip-v2.scss","file:///app/packages/projects/lite/src/shared/views/play-clip/v2/components/play-clip/PlayClipV2.tsx"],"sourcesContent":["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}\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};\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.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 { 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 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","const DEFAULT_PARTIAL_LOADING_OPTIONS: PartialLoadingOptions = {\n numItems: 5,\n minWidth: 50, // px\n maxWidth: 100 // px\n};\n\nexport interface PartialLoadingOptions {\n numItems?: number;\n minWidth?: number;\n maxWidth?: number;\n}\n\ninterface PartialLoadingItem {\n width: string;\n}\n\nexport const PartialLoadingHelper = {\n getPartialLoadingItems(options: PartialLoadingOptions = {}): PartialLoadingItem[] {\n const opts = {\n ...DEFAULT_PARTIAL_LOADING_OPTIONS,\n ...options\n };\n\n const getRandomFilterWidth = () => Math.max(Math.floor(Math.random() * opts.maxWidth), opts.minWidth);\n\n return [...Array(opts.numItems)].map(() => ({ width: `${getRandomFilterWidth()}px` }));\n }\n};","import { Flight } from 'libs/common/react/index';\n\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\nimport { usePresentation } from 'shared/hooks/usePresentation';\n\nexport const usePresentationAudiences = () => {\n const { activePresentation, getFallbackPresentation } = usePresentation({ redirectOnError: true });\n\n const presentation = activePresentation || getFallbackPresentation();\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n !!presentation &&\n AudienceRequests.presentationAudiences(presentation.id)\n );\n\n return audiences;\n};","import * as React from 'react';\n\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { PermissionFilterOption } from 'libs/shared/enums/PermissionFilterOption';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { VideoPrivateError } from 'libs/shared/errors/videos/video-private/VideoPrivateError';\nimport { ClipRequests } from 'libs/shared/flight-requests/ClipRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useBreadcrumbs } from 'libs/shared/hooks/useBreadcrumbs';\nimport { useCannotConsumeError } from 'libs/shared/hooks/useCannotConsumeError';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Clip, Config, CurrentUser, InteractiveMetadata, Video, YearGroup } from 'libs/shared/interfaces';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { usePluginHelper } from 'shared/hooks/use-plugin-helper/usePluginHelper';\nimport { useDeepLinks } from 'shared/hooks/useDeepLinks';\nimport { useFetchPointsOfInterest } from 'shared/hooks/useFetchPointsOfInterest';\nimport { useGetRelatedVideos } from 'shared/hooks/useGetRelatedVideos';\nimport { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\nimport { usePresentationAudiences } from 'shared/hooks/usePresentationAudiences';\nimport { useVideoFeatureAccess } from 'shared/hooks/useVideoFeatureAccess';\nimport { useVideoMixin } from 'shared/hooks/useVideoMixin';\nimport { useShouldShowSideTableOfContents } from 'shared/views/play/v2/hooks/useShouldShowTableOfContents';\n\nimport { PlayViewProps } from '../PlayClipViewContainer';\n\nimport { PlayClipV2 } from './components/play-clip/PlayClipV2';\n\nconst namespace = 'shared.playClipV2';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst clipErrors = {\n notFound: NotFoundError,\n forbidden: {\n privacy: VideoPrivateError\n }\n};\n\nPlayClipViewV2.defaultProps = {\n queryParams: {}\n};\n\nexport function PlayClipViewV2(props: PlayViewProps): JSX.Element {\n const { context, contextId, mtv } = props.queryParams;\n\n const { hasProduct } = useProducts();\n const { setFavourite, canFavourite } = useLiteFavourites(LocationContext.PlayClip);\n const { hasPermissions } = usePermissions();\n\n const { isPlugin } = usePluginHelper();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const clip = Flight.useBasicFetch<Clip>(ClipRequests.clip(props.id));\n\n const interactives = Flight.useBasicFetch<InteractiveMetadata[]>(InteractiveRequests.videoInteractives(props.id));\n const video = Flight.useBasicFetch<Video>(\n !!clip.data?._parentVideo && VideoRequests.video(clip.data._parentVideo.id)\n );\n useVideoMixin([video.data]);\n\n const childClips = Flight.useBasicFetch<Clip[]>(\n !!clip.data?._parentVideo && ClipRequests.videoClips(clip.data._parentVideo.id)\n );\n\n const strippedClip = Flight.useBasicFetch<Clip>(clip.statusCode === HttpStatus.Forbidden &&\n ClipRequests.clip(props.id, PermissionFilterOption.StripMetadata));\n const relatedVideos = useGetRelatedVideos({\n video: video.data,\n context,\n contextId,\n moviesAndTv: mtv,\n currentUser: currentUser.data\n });\n const audiences = usePresentationAudiences();\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const shouldShowSideTableOfContents = useShouldShowSideTableOfContents();\n\n const pointsOfInterest = useFetchPointsOfInterest(props.id, true);\n \n const featureAccess = useVideoFeatureAccess();\n\n const breadcrumbs = useBreadcrumbs({ name: clip.data?.name });\n\n useSetPageMetadata(PageMetadataHelper.getClipMetadata({\n content: clip.data,\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n }\n }));\n\n useHandleObjectError(clip, clipErrors, { forbidden: true });\n useVideoMixin(relatedVideos.videos ?? []);\n useCannotConsumeError(strippedClip);\n useDeepLinks({ id: props.id, app: 'clips' });\n\n const hasLoaded = (\n clip.data &&\n currentUser.hasCompleted &&\n config.hasCompleted &&\n pointsOfInterest.hasCompleted\n );\n\n if (!hasLoaded)\n return <></>;\n\n return (\n <PlayClipV2\n clip={clip.data}\n clips={childClips.data}\n interactives={interactives.data}\n originalVideo={video.data}\n currentUser={currentUser.data}\n yearGroups={yearGroups.data}\n // we only show up next videos for clips in a playlist\n relatedVideos={context === 'playlist' ? relatedVideos : { ...relatedVideos, videos: []}}\n canFavourite={canFavourite}\n setFavourite={setFavourite}\n hasProduct={hasProduct}\n queryParams={props.queryParams}\n audiences={audiences.data}\n imageCdnUrl={config.data.imageCdnUrl}\n canManageVideoAccess={hasPermissions(PermissionName.ManageVideoAccess)}\n pointsOfInterest={pointsOfInterest.items}\n featureAccess={featureAccess}\n tableOfContentsId={props.queryParams?.tocId}\n shouldShowSideTableOfContents={shouldShowSideTableOfContents}\n isPlugin={isPlugin}\n breadcrumbs={breadcrumbs}\n />\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoList } from 'libs/shared/components/video-list/VideoList';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { CanFavouriteFunc, FavouriteFunc, PresentationAudience, VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { PlayViewQueryParams } from 'libs/shared/interfaces/query-params/PlayViewQueryParams';\n\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { InteractiveHelpers } from 'shared/utils/InteractiveHelper';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nconst namespace = 'shared.playClipV2';\n\ninterface ClippedFromProps {\n originalVideo: VideoTypes;\n yearGroups: YearGroup[];\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n queryParams: PlayViewQueryParams;\n audiences: PresentationAudience[];\n shareId?: string;\n headingRef: React.MutableRefObject<Map<PlayPageAnchor, HTMLElement>>;\n isPlugin: boolean;\n getInteractiveGuidanceAppLink: (id: string, type: MasterType) => Core.AppLink;\n getResourceGuidanceAppLink: (id: string, type: MasterType) => Core.AppLink;\n getClassroomGuideAppLink: (id: string, type: MasterType) => Core.AppLink;\n}\n\nexport function ClippedFrom(props: ClippedFromProps) {\n const { hasPermissions } = usePermissions();\n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem });\n\n return (\n <section\n className='play-page-section'\n id={PlayPageAnchor.ClippedFrom}\n ref={el => {\n (el && props.headingRef?.current) && props.headingRef.current.set(PlayPageAnchor.ClippedFrom, el);\n }}\n >\n <h2 className='h4 mb-0'><Text namespace={namespace} phrase='clippedFrom' /></h2>\n <VideoActionsContext.Provider value={videoActions}>\n <VideoList\n videos={[props.originalVideo]}\n yearGroups={props.yearGroups}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n getVideoAppLink={(v, opts) => VideoAppLinkHelper.getAppLink(v, {\n ...opts,\n context: props.queryParams.context,\n contextId: props.queryParams.contextId,\n playNext: props.queryParams.playNext,\n shareId: props.shareId,\n moviesAndTv: props.queryParams.mtv\n })}\n hasPermissions={hasPermissions}\n presentationAudiences={props.audiences}\n getPreviewQuestionsAppLink={interactive => InteractiveHelpers.getPreviewQuestionsAppLink(interactive)}\n isPlugin={props.isPlugin}\n getClassroomGuideAppLink={props.getClassroomGuideAppLink}\n getInteractiveGuidanceAppLink={props.getInteractiveGuidanceAppLink}\n getResourceGuidanceAppLink={props.getResourceGuidanceAppLink}\n />\n </VideoActionsContext.Provider>\n </section>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"main\":\"iQ0Ie\",\"expandedToc\":\"sIoV8\"};","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { Breadcrumb, Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { PlayPageClips } from 'libs/shared/components/play-page-v2/clips-widget/PlayPageClips';\nimport { VideoDetailsWithScrollbarV2 } from 'libs/shared/components/play-page-v2/details/VideoDetailsV2';\nimport { hasGlanceData } from 'libs/shared/components/play-page-v2/glance/VideoAtAGlanceUtilsV2';\nimport { VideoAtAGlanceV2 } from 'libs/shared/components/play-page-v2/glance/VideoAtAGlanceV2';\nimport { PlayPageInteractives } from 'libs/shared/components/play-page-v2/interactives-widget/PlayPageInteractives';\nimport { PlayPageResources } from 'libs/shared/components/play-page-v2/resources-widget/PlayPageResources';\nimport { SeoConstants } from 'libs/shared/constants/SeoConstants';\nimport { GlobalPlayerConsumer } from 'libs/shared/context/player-context/components/GlobalPlayerConsumer';\nimport { usePlayerContext } from 'libs/shared/context/player-context/PlayerContext';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { HasProductFunc } from 'libs/shared/hooks/UseProducts';\nimport { useTableOfContentsActiveHeading } from 'libs/shared/hooks/useTableOfContentsActiveHeading';\nimport { useTableOfContentsScroll } from 'libs/shared/hooks/useTableOfContentsScroll';\nimport { CanFavouriteFunc, Clip, CurrentUser, FavouriteFunc, InteractiveMetadata, Link, PointOfInterest, PresentationAudience, Resource, Video, YearGroup } from 'libs/shared/interfaces';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { PlayViewQueryParams } from 'libs/shared/interfaces/query-params/PlayViewQueryParams';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { ArchivedBanner } from 'shared/components/play-page/ArchivedBanner';\nimport { TableOfContentsContainer } from 'shared/components/play-page/components/table-of-contents/TableOfContents';\nimport { PlayPageTitleAndActions } from 'shared/components/play-page/components/title-and-actions/PlayPageTitleAndActions';\nimport { RestrictionBanner } from 'shared/components/play-page/RestrictionBanner';\nimport { PlayerPlaceholder } from 'shared/components/player-placeholder/PlayerPlaceholder';\nimport { RelatedVideos } from 'shared/components/related-videos/RelatedVideos';\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { RelatedVideosHash } from 'shared/hooks/useGetRelatedVideos';\nimport { VideoFeaturesHash } from 'shared/hooks/useVideoFeatureAccess';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\nimport { usePlayPageTableOfContent } from 'shared/views/play/v2/hooks/usePlayPageTableOfContent';\nimport { useSectionHeadings } from 'shared/views/play/v2/hooks/useSectionHeadings';\nimport { PlayPageUtils } from 'shared/views/play/v2/PlayPageUtilV2';\nimport { ClippedFrom } from 'shared/views/play-clip/v2/components/clipped-from/ClippedFrom';\n\nimport styles from './play-clip-v2.scss';\n\nconst getResourceAppLink = (videoId: string, shareId: string, canViewResource: boolean) =>\n (resource: Resource | Link) => {\n if (!canViewResource) {\n return {\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.SIGN_UP\n };\n }\n\n return {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PREVIEW_PDF,\n args: [resource.id],\n params: {\n videoId: videoId,\n shareId: shareId\n }\n };\n };\n\n\ninterface PlayClipV2Props {\n clip: Clip;\n clips: Clip[];\n interactives: InteractiveMetadata[];\n originalVideo: Video;\n currentUser: CurrentUser;\n yearGroups: YearGroup[];\n relatedVideos: RelatedVideosHash;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n queryParams: PlayViewQueryParams;\n hasProduct: HasProductFunc;\n audiences: PresentationAudience[];\n imageCdnUrl: string;\n shareId?: string;\n canManageVideoAccess: boolean;\n pointsOfInterest?: PointOfInterest[];\n featureAccess: VideoFeaturesHash;\n tableOfContentsId: string;\n shouldShowSideTableOfContents: boolean;\n isPlugin: boolean;\n breadcrumbs?: Breadcrumb[];\n}\n\nexport function PlayClipV2(props: PlayClipV2Props): JSX.Element {\n const playerContext = usePlayerContext();\n\n const { hasPermissions } = usePermissions();\n const { canConsume } = VideoHelper.getCanBeConsumed(props.clip);\n \n const {\n tableOfContentsActiveId,\n setTableOfContentsActiveId,\n controlledId,\n setControlledId,\n tableOfContentsExpanded,\n onToggleTableOfContents\n } = usePlayPageTableOfContent(props.tableOfContentsId);\n\n const hasGlance = hasGlanceData(props.clip) && props.featureAccess.canViewGlance;\n\n const { headingRef, headingElements } = useSectionHeadings(hasGlance);\n const items = headingElements.map(ele => {\n return {\n id: ele.id as PlayPageAnchor,\n name: PlayPageUtils.getSectionHeading(\n ele.id as PlayPageAnchor,\n {\n clips: props.clips,\n interactives: props.interactives,\n resources: props.clip.resources?.data,\n isPlayClipPage: true\n }\n )\n };\n });\n\n useTableOfContentsActiveHeading({\n setActiveId: setTableOfContentsActiveId,\n headingElements,\n controlledId,\n setControlledId\n });\n\n useTableOfContentsScroll(headingElements, props.tableOfContentsId);\n\n const isArchived = VideoHelper.isVideoTypeArchived(props.clip);\n const hasStudentExperience = hasPermissions(PermissionName.StudentExperience);\n /**\n * Need to use a ref because if we use state, onExitImmersiveReader will have a stale\n * reference of the state. This is because the state is changed in onLaunchImmersiveReader\n * which is passed in at the same time as onExitImmersiveReader\n */\n const shouldPlayOnExitImmersiveReader = React.useRef(false);\n\n function onLaunchImmersiveReader(): void {\n shouldPlayOnExitImmersiveReader.current = !playerContext?.playerRef?.current?.isPaused();\n playerContext?.playerRef?.current?.pause();\n }\n\n function onExitImmersiveReader(): void {\n if (!shouldPlayOnExitImmersiveReader.current)\n return;\n\n playerContext?.playerRef?.current?.play();\n }\n\n function canAccessOriginal(): boolean {\n if (!props.originalVideo || !props.clip._canBeConsumed?.value)\n return false;\n\n if (!props.currentUser?.isAuthenticated)\n return false;\n\n if (!props.hasProduct(ProductId.Primary))\n return false;\n\n if (hasStudentExperience)\n return false;\n\n return true;\n }\n\n function getOriginalVideoAppLink(): Core.AppLink {\n if (!canAccessOriginal())\n return null;\n \n return {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PLAY_VIDEO,\n args: [ props.originalVideo.id, TextHelper.slugify(props.originalVideo.name) ]\n };\n }\n\n const showPlayerPlaceholder = playerContext.mode === 'picture-in-picture' || props.featureAccess.canViewPublicLayout;\n\n const otherClips = props.clips?.filter(c => c.id.toString() !== props.clip.id.toString()) ?? [];\n\n function getMainClassName() {\n if (props.shouldShowSideTableOfContents && tableOfContentsExpanded) {\n return styles.expandedToc;\n }\n if (props.shouldShowSideTableOfContents && !tableOfContentsExpanded)\n return 'pe-4';\n }\n\n return (\n <div className='px-4 play-page-sections-container'>\n <main className={`${styles.main} ${getMainClassName()}`}>\n {!!props.breadcrumbs?.length &&\n <div className='mb-2'>\n <Breadcrumbs breadcrumbs={props.breadcrumbs} />\n </div>\n }\n\n\n <RestrictionBanner\n restrictions={props.clip._restrictions}\n yearGroups={props.yearGroups}\n objectId={props.clip.id}\n objectTypeId={MasterType.Clip}\n canManageVideoAccess={props.canManageVideoAccess}\n />\n\n {isArchived && (\n <ArchivedBanner\n typeId={props.clip.typeId}\n hasStudentExperience={hasStudentExperience}\n />\n )}\n\n <section\n id={PlayPageAnchor.Video}\n className={`mb-2 ${SeoConstants.GLOBAL_PLAYER_SELECTOR}`}\n ref={el => { (el && headingRef?.current) && headingRef.current.set(PlayPageAnchor.Video, el); }}\n >\n {canConsume && (\n <GlobalPlayerConsumer\n key={props.clip.id}\n objectId={props.clip.id}\n objectTypeId={props.clip.typeId}\n shareId={props.shareId}\n context={props.queryParams?.context}\n contextId={props.queryParams?.contextId}\n moviesAndTv={props.queryParams?.mtv}\n playNext={props.queryParams?.playNext}\n startTime={props.queryParams?.t ?? props.queryParams?.startTime}\n mode='default'\n location='play-page'\n />\n )}\n <div className={showPlayerPlaceholder ? '' : 'd-none'}>\n <PlayerPlaceholder\n video={props.clip}\n type='pip'\n />\n </div>\n </section>\n\n <PlayPageTitleAndActions\n media={props.clip}\n yearGroups={props.yearGroups}\n audiences={props.audiences}\n originalVideoAppLink={getOriginalVideoAppLink()}\n featureAccess={props.featureAccess}\n shareId={props.shareId}\n />\n\n {/* if no glance render video details here */}\n {hasGlance ? (\n <VideoAtAGlanceV2\n video={props.clip}\n pointsOfInterest={props.pointsOfInterest}\n setStartTime={(time: number) => playerContext.playerRef.current?.currentTime(time)}\n getTagAppLink={tag => ({\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n params: { tagOrClassification: tag.name }\n })}\n suppressInteractivity={props.featureAccess.canViewPublicLayout}\n canViewGlance={hasGlance}\n />\n ) : (\n <VideoDetailsWithScrollbarV2\n video={props.clip}\n onLaunchImmersiveReader={onLaunchImmersiveReader}\n onExitImmersiveReader={onExitImmersiveReader}\n getTagAppLink={tag => ({\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n params: { tagOrClassification: tag.name }\n })}\n headingRef={headingRef}\n suppressInteractivity={props.featureAccess.canViewPublicLayout}\n />\n )}\n\n <PlayPageResources\n video={props.clip}\n canViewResources={props.featureAccess.canViewResourceItems}\n imageCdnUrl={props.imageCdnUrl}\n getAppLink={\n getResourceAppLink(props.clip.id, props.shareId, props.featureAccess.canViewResourceItems)\n }\n analyticsData={{ clipId: props.clip.id, clipName: props.clip.name }}\n resourceThumbnailFallbackUrl={ImageUrls.Fallbacks.RESOURCE_THUMBNAIL}\n headingRef={headingRef}\n />\n\n <PlayPageInteractives\n video={props.clip}\n interactives={props.interactives}\n imageCdnUrl={props.imageCdnUrl}\n analyticsData={{ clipId: props.clip.id, clipName: props.clip.name }}\n canViewInteractives={props.featureAccess.canViewInteractives}\n headingRef={headingRef}\n yearGroups={props.yearGroups}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n isPlugin={props.isPlugin}\n />\n\n <PlayPageClips\n clips={otherClips || []}\n video={props.clip}\n canViewClips={props.featureAccess.canViewClips}\n yearGroups={props.yearGroups}\n audiences={props.audiences}\n imageCdnUrl={props.imageCdnUrl}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n headingRef={headingRef}\n analyticsData={{ clipId: props.clip.id, clipName: props.clip.name }}\n isPlugin={props.isPlugin}\n />\n\n {/* if has glance, render video details here */}\n {hasGlance && (\n <VideoDetailsWithScrollbarV2\n video={props.clip}\n onLaunchImmersiveReader={onLaunchImmersiveReader}\n onExitImmersiveReader={onExitImmersiveReader}\n getTagAppLink={tag => ({\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n params: { tagOrClassification: tag.name }\n })}\n headingRef={headingRef}\n suppressInteractivity={props.featureAccess.canViewPublicLayout}\n />\n )}\n \n {!!canAccessOriginal() && (\n <ClippedFrom\n originalVideo={props.originalVideo}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n yearGroups={props.yearGroups}\n shareId={props.shareId}\n queryParams={props.queryParams}\n audiences={props.audiences}\n headingRef={headingRef}\n isPlugin={props.isPlugin}\n getClassroomGuideAppLink={VideoAppLinkHelper.getClassroomGuideAppLink}\n getInteractiveGuidanceAppLink={VideoAppLinkHelper.getInteractiveGuidanceAppLink}\n getResourceGuidanceAppLink={VideoAppLinkHelper.getResourceGuidanceAppLink}\n />\n )}\n\n <RelatedVideos\n currentVideo={props.clip}\n yearGroups={props.yearGroups}\n relatedVideos={props.relatedVideos}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n currentUser={props.currentUser}\n audiences={props.audiences}\n getVideoAppLink={(v, opts) => VideoAppLinkHelper.getAppLink(v, {\n ...opts,\n context: props.queryParams.context,\n contextId: props.queryParams.contextId,\n playNext: props.queryParams.playNext,\n shareId: props.shareId,\n moviesAndTv: props.queryParams.mtv\n })}\n moviesAndTv={props.queryParams.mtv}\n isPlugin={props.isPlugin}\n />\n\n </main>\n\n <TableOfContentsContainer\n isExpanded={tableOfContentsExpanded}\n setIsExpanded={onToggleTableOfContents}\n items={items}\n activeId={tableOfContentsActiveId}\n setControlledId={setControlledId}\n analyticsData={{ clipId: props.clip.id, clipName: props.clip.name }}\n showInSide={props.shouldShowSideTableOfContents}\n />\n \n </div>\n );\n}"],"names":["defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","generateCacheKey","flightObjs","map","obj","join","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","Array","isArray","useEffect","forEach","useBreadcrumbs","current","match","breadcrumbs","useBuilder","active","DEFAULT_PARTIAL_LOADING_OPTIONS","numItems","minWidth","maxWidth","PartialLoadingHelper","getPartialLoadingItems","options","opts","width","Math","max","floor","random","usePresentationAudiences","redirectOnError","activePresentation","getFallbackPresentation","presentation","id","getPhrase","clipErrors","PlayClipViewV2","props","queryParams","context","contextId","mtv","hasProduct","u","setFavourite","canFavourite","hasPermissions","isPlugin","currentUser","config","clip","interactives","video","data","_parentVideo","childClips","strippedClip","relatedVideos","moviesAndTv","audiences","yearGroups","isAuthenticated","customerId","shouldShowSideTableOfContents","pointsOfInterest","featureAccess","name","content","phraseContext","phraseHandler","titlePhrase","descriptionPhrase","videos","app","hasCompleted","clips","originalVideo","imageCdnUrl","canManageVideoAccess","items","tableOfContentsId","tocId","defaultProps","namespace","ClippedFrom","usePermissions","videoActions","useVideoActions","location","className","PlayPageAnchor","ref","el","headingRef","set","Text","phrase","VideoActionsContext","value","VideoList","getVideoAppLink","v","VideoAppLinkHelper","playNext","shareId","presentationAudiences","getPreviewQuestionsAppLink","interactive","InteractiveHelper","getClassroomGuideAppLink","getInteractiveGuidanceAppLink","getResourceGuidanceAppLink","getResourceAppLink","videoId","canViewResource","resource","application","action","args","params","PlayClipV2","playerContext","canConsume","VideoHelper","usePlayPageTableOfContent","tableOfContentsActiveId","setTableOfContentsActiveId","controlledId","setControlledId","tableOfContentsExpanded","onToggleTableOfContents","hasGlance","canViewGlance","useSectionHeadings","headingElements","ele","resources","isPlayClipPage","useTableOfContentsActiveHeading","setActiveId","useTableOfContentsScroll","isArchived","hasStudentExperience","PermissionName","shouldPlayOnExitImmersiveReader","onLaunchImmersiveReader","playerRef","isPaused","pause","onExitImmersiveReader","play","canAccessOriginal","_canBeConsumed","ProductId","showPlayerPlaceholder","mode","canViewPublicLayout","otherClips","filter","c","toString","length","Breadcrumbs","RestrictionBanner","restrictions","_restrictions","objectId","objectTypeId","MasterType","ArchivedBanner","typeId","SeoConstants","GlobalPlayerConsumer","key","startTime","t","PlayerPlaceholder","type","PlayPageTitleAndActions","media","originalVideoAppLink","TextHelper","VideoAtAGlanceV2","setStartTime","time","currentTime","getTagAppLink","tag","tagOrClassification","suppressInteractivity","PlayPageResources","canViewResources","canViewResourceItems","getAppLink","analyticsData","clipId","clipName","resourceThumbnailFallbackUrl","ImageUrls","PlayPageInteractives","canViewInteractives","PlayPageClips","canViewClips","RelatedVideos","currentVideo","TableOfContents","isExpanded","setIsExpanded","activeId","showInSide"],"sourceRoot":""}
|