@clickview/lite 0.50.0-rc.4 → 0.50.0-rc.6
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/scripts/{1402-d327ed0365-lite.chunk.js → 1402-8c3babb6af-lite.chunk.js} +2 -2
- package/dist/scripts/1402-8c3babb6af-lite.chunk.js.map +1 -0
- package/dist/scripts/{1437-0db2164033-lite.chunk.js → 1437-2931819506-lite.chunk.js} +2 -2
- package/dist/scripts/{1437-0db2164033-lite.chunk.js.map → 1437-2931819506-lite.chunk.js.map} +1 -1
- package/dist/scripts/{1518-9961f6d99b-lite.chunk.js → 1518-e6c8ab0c89-lite.chunk.js} +2 -2
- package/dist/scripts/1518-e6c8ab0c89-lite.chunk.js.map +1 -0
- package/dist/scripts/{1820-006bcd8691-lite.chunk.js → 1820-818cf5a35d-lite.chunk.js} +2 -2
- package/dist/scripts/{1820-006bcd8691-lite.chunk.js.map → 1820-818cf5a35d-lite.chunk.js.map} +1 -1
- package/dist/scripts/{1895-933141db03-lite.chunk.js → 1895-a799be78c3-lite.chunk.js} +3 -3
- package/dist/scripts/{1895-933141db03-lite.chunk.js.map → 1895-a799be78c3-lite.chunk.js.map} +1 -1
- package/dist/scripts/{2446-c6b50a79cd-lite.chunk.js → 2446-acc94130ed-lite.chunk.js} +3 -3
- package/dist/scripts/{2446-c6b50a79cd-lite.chunk.js.map → 2446-acc94130ed-lite.chunk.js.map} +1 -1
- package/dist/scripts/{2703-430c5a5fc1-lite.chunk.js → 2703-6ae830c2e6-lite.chunk.js} +2 -2
- package/dist/scripts/2703-6ae830c2e6-lite.chunk.js.map +1 -0
- package/dist/scripts/{2724-9b1a944cfb-lite.chunk.js → 2724-ee3a51e0c9-lite.chunk.js} +2 -2
- package/dist/scripts/{2724-9b1a944cfb-lite.chunk.js.map → 2724-ee3a51e0c9-lite.chunk.js.map} +1 -1
- package/dist/scripts/{3070-4e82411f0c-lite.chunk.js → 3070-07721de8f8-lite.chunk.js} +2 -2
- package/dist/scripts/3070-07721de8f8-lite.chunk.js.map +1 -0
- package/dist/scripts/{5242-04c52713f2-lite.chunk.js → 5242-76b32478bc-lite.chunk.js} +2 -2
- package/dist/scripts/5242-76b32478bc-lite.chunk.js.map +1 -0
- package/dist/scripts/{537-92893a696e-lite.chunk.js → 537-850ad2ee25-lite.chunk.js} +3 -3
- package/dist/scripts/{537-92893a696e-lite.chunk.js.map → 537-850ad2ee25-lite.chunk.js.map} +1 -1
- package/dist/scripts/{5936-59acb26157-lite.chunk.js → 5936-7ad136f2a3-lite.chunk.js} +2 -2
- package/dist/scripts/5936-7ad136f2a3-lite.chunk.js.map +1 -0
- package/dist/scripts/6181-7a4fc8e1e1-lite.chunk.js +2 -0
- package/dist/scripts/6181-7a4fc8e1e1-lite.chunk.js.map +1 -0
- package/dist/scripts/{6263-0be2ae1ab4-lite.chunk.js → 6263-a60b811d93-lite.chunk.js} +2 -2
- package/dist/scripts/6263-a60b811d93-lite.chunk.js.map +1 -0
- package/dist/scripts/{6309-79092eb273-lite.chunk.js → 6309-dd3a8e7f21-lite.chunk.js} +3 -3
- package/dist/scripts/{6309-79092eb273-lite.chunk.js.map → 6309-dd3a8e7f21-lite.chunk.js.map} +1 -1
- package/dist/scripts/{6489-51de20f6f6-lite.chunk.js → 6489-335e4d9396-lite.chunk.js} +3 -3
- package/dist/scripts/{6489-51de20f6f6-lite.chunk.js.map → 6489-335e4d9396-lite.chunk.js.map} +1 -1
- package/dist/scripts/6531-835c743f1b-lite.chunk.js +2 -0
- package/dist/scripts/6531-835c743f1b-lite.chunk.js.map +1 -0
- package/dist/scripts/6741-e0ed9fd6f0-lite.chunk.js +3 -0
- package/dist/scripts/6741-e0ed9fd6f0-lite.chunk.js.map +1 -0
- package/dist/scripts/{6846-5ae3efe823-lite.chunk.js → 6846-08b00decd8-lite.chunk.js} +2 -2
- package/dist/scripts/{6846-5ae3efe823-lite.chunk.js.map → 6846-08b00decd8-lite.chunk.js.map} +1 -1
- package/dist/scripts/{7187-814cd6f6db-lite.chunk.js → 7187-93d4aac9eb-lite.chunk.js} +2 -2
- package/dist/scripts/{7187-814cd6f6db-lite.chunk.js.map → 7187-93d4aac9eb-lite.chunk.js.map} +1 -1
- package/dist/scripts/8055-08b92f8ed7-lite.chunk.js +3 -0
- package/dist/scripts/8055-08b92f8ed7-lite.chunk.js.map +1 -0
- package/dist/scripts/{8085-ed82fb07da-lite.chunk.js → 8085-cde67e66df-lite.chunk.js} +2 -2
- package/dist/scripts/8085-cde67e66df-lite.chunk.js.map +1 -0
- package/dist/scripts/8139-f0229a0806-lite.chunk.js +3 -0
- package/dist/scripts/8139-f0229a0806-lite.chunk.js.map +1 -0
- package/dist/scripts/{8354-a104955138-lite.chunk.js → 8354-411c0c4a3a-lite.chunk.js} +2 -2
- package/dist/scripts/8354-411c0c4a3a-lite.chunk.js.map +1 -0
- package/dist/scripts/{841-85a91a6576-lite.chunk.js → 841-a60ac16a8c-lite.chunk.js} +3 -3
- package/dist/scripts/{841-85a91a6576-lite.chunk.js.map → 841-a60ac16a8c-lite.chunk.js.map} +1 -1
- package/dist/scripts/{8987-07d38d2bab-lite.chunk.js → 8987-9fb9a632e7-lite.chunk.js} +2 -2
- package/dist/scripts/8987-9fb9a632e7-lite.chunk.js.map +1 -0
- package/dist/scripts/{9068-1c0aece2e1-lite.chunk.js → 9068-562c30f718-lite.chunk.js} +2 -2
- package/dist/scripts/9068-562c30f718-lite.chunk.js.map +1 -0
- package/dist/scripts/{9839-5347f31f8b-lite.chunk.js → 9839-d50dedfab8-lite.chunk.js} +3 -3
- package/dist/scripts/9839-d50dedfab8-lite.chunk.js.map +1 -0
- package/dist/scripts/{bundle-90f71581a8.min.js → bundle-098294f9a6.min.js} +3 -3
- package/dist/scripts/bundle-098294f9a6.min.js.map +1 -0
- package/package.json +1 -1
- package/dist/scripts/1402-d327ed0365-lite.chunk.js.map +0 -1
- package/dist/scripts/1518-9961f6d99b-lite.chunk.js.map +0 -1
- package/dist/scripts/2703-430c5a5fc1-lite.chunk.js.map +0 -1
- package/dist/scripts/3070-4e82411f0c-lite.chunk.js.map +0 -1
- package/dist/scripts/5242-04c52713f2-lite.chunk.js.map +0 -1
- package/dist/scripts/5936-59acb26157-lite.chunk.js.map +0 -1
- package/dist/scripts/6181-4944b5c6a2-lite.chunk.js +0 -2
- package/dist/scripts/6181-4944b5c6a2-lite.chunk.js.map +0 -1
- package/dist/scripts/6263-0be2ae1ab4-lite.chunk.js.map +0 -1
- package/dist/scripts/6531-d77ba2c5ce-lite.chunk.js +0 -2
- package/dist/scripts/6531-d77ba2c5ce-lite.chunk.js.map +0 -1
- package/dist/scripts/6741-6222c7b762-lite.chunk.js +0 -3
- package/dist/scripts/6741-6222c7b762-lite.chunk.js.map +0 -1
- package/dist/scripts/8055-9c259a30c4-lite.chunk.js +0 -3
- package/dist/scripts/8055-9c259a30c4-lite.chunk.js.map +0 -1
- package/dist/scripts/8085-ed82fb07da-lite.chunk.js.map +0 -1
- package/dist/scripts/8139-ec264689fd-lite.chunk.js +0 -3
- package/dist/scripts/8139-ec264689fd-lite.chunk.js.map +0 -1
- package/dist/scripts/8354-a104955138-lite.chunk.js.map +0 -1
- package/dist/scripts/8987-07d38d2bab-lite.chunk.js.map +0 -1
- package/dist/scripts/9068-1c0aece2e1-lite.chunk.js.map +0 -1
- package/dist/scripts/9839-5347f31f8b-lite.chunk.js.map +0 -1
- package/dist/scripts/bundle-90f71581a8.min.js.map +0 -1
- /package/dist/scripts/{1895-933141db03-lite.chunk.js.LICENSE.txt → 1895-a799be78c3-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{2446-c6b50a79cd-lite.chunk.js.LICENSE.txt → 2446-acc94130ed-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{537-92893a696e-lite.chunk.js.LICENSE.txt → 537-850ad2ee25-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{6309-79092eb273-lite.chunk.js.LICENSE.txt → 6309-dd3a8e7f21-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{6489-51de20f6f6-lite.chunk.js.LICENSE.txt → 6489-335e4d9396-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{6741-6222c7b762-lite.chunk.js.LICENSE.txt → 6741-e0ed9fd6f0-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{8055-9c259a30c4-lite.chunk.js.LICENSE.txt → 8055-08b92f8ed7-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{8139-ec264689fd-lite.chunk.js.LICENSE.txt → 8139-f0229a0806-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{841-85a91a6576-lite.chunk.js.LICENSE.txt → 841-a60ac16a8c-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{9839-5347f31f8b-lite.chunk.js.LICENSE.txt → 9839-d50dedfab8-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{bundle-90f71581a8.min.js.LICENSE.txt → bundle-098294f9a6.min.js.LICENSE.txt} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/5936-59acb26157-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/infinite-scroll-footer/infinite-scroll-footer.scss","file:///app/packages/libs/shared/src/components/infinite-scroll-footer/InfiniteScrollFooter.tsx","file:///app/packages/libs/shared/src/components/play-page-v2/interactives-widget/InteractiveWidgetItemV2.tsx","file:///app/packages/libs/shared/src/components/video-list/partial-loading/partial-video-list.scss","file:///app/packages/libs/shared/src/components/video-list/partial-loading/PartialVideoList.tsx","file:///app/packages/libs/shared/src/components/video-owner-text/video-owner-text.scss","file:///app/packages/libs/shared/src/components/video-owner-text/VideoOwnerText.tsx","file:///app/packages/libs/shared/src/components/widgets/items/interactive-widget-item/InteractiveWidgetItem.tsx","file:///app/packages/libs/shared/src/components/widgets/items/interactive-widget-item/interactive-widget-item.scss","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/interfaces/PlayPageAnchor.ts","file:///app/packages/projects/lite/src/apps/interactives/components/play-interactive/PlayInteractive.tsx","file:///app/packages/projects/lite/src/apps/interactives/components/preview-interactive/InteractiveAlertBanner.tsx","file:///app/packages/projects/lite/src/apps/interactives/components/preview-interactive/PreviewInteractive.tsx","file:///app/packages/projects/lite/src/apps/interactives/hooks/interactiveHooks.tsx","file:///app/packages/projects/lite/src/shared/components/play-page/ArchivedBanner.tsx","file:///app/packages/projects/lite/src/shared/components/play-page/RestrictionBanner.tsx","file:///app/packages/projects/lite/src/shared/components/related-videos/RelatedVideos.tsx","file:///app/packages/projects/lite/src/shared/hooks/usePresentationAudiences.ts","file:///app/packages/projects/lite/src/shared/hooks/useShouldPreviewInteractive.ts","file:///app/packages/projects/lite/src/shared/hooks/useVideoMixin.ts"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"container\":\"VwD1b\",\"spinner\":\"eJ85e\"};","import * as React from 'react';\nimport { Spinner } from 'react-bootstrap';\nimport { useInView } from 'react-intersection-observer';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './infinite-scroll-footer.scss';\n\ninterface InfiniteScrollFooterProps {\n isFetching: boolean;\n fetchNext?: (nextCursor: string) => void;\n nextCursor?: string;\n fetchOnScroll?: boolean;\n}\n\nInfiniteScrollFooter.defaultProps = {\n fetchOnScroll: false\n};\n\nexport function InfiniteScrollFooter(props: InfiniteScrollFooterProps): React.ReactElement {\n const [ ref, inView ] = useInView();\n\n React.useEffect(() => {\n if (!props.fetchOnScroll)\n return;\n\n if (!inView || props.isFetching)\n return;\n\n props.fetchNext?.(props.nextCursor);\n }, [ inView, props.isFetching ]);\n\n return (\n <div className={`p-3 text-center ${styles.container}`} ref={ref}>\n {props.isFetching\n ? <Spinner as='span' animation='border' role='status' className={styles.spinner} />\n : (\n <SvgContainer\n svgName={cvSvgLibrary.ChevronDown}\n className='svg-container cursor-pointer'\n size={SvgContainerSize.Large}\n onClick={() => props.fetchNext?.(props.nextCursor)}\n />\n )\n }\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ThumbnailText } from 'libs/shared/components/thumbnails/thumbnail-text/ThumbnailText';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { FixedWidgetItemProps } from 'libs/shared/components/widgets/items/FixedWidgetItemProps';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { CanFavouriteFunc, FavouriteFunc, InteractiveMetadata, YearGroup } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.interactiveWidgetItemV2';\n\nexport interface InteractiveWidgetItemV2Props extends FixedWidgetItemProps<InteractiveMetadata> {\n imageCdnUrl: string;\n questionsAppLink: Core.AppLink;\n setFavourite?: FavouriteFunc;\n canFavourite?: CanFavouriteFunc;\n yearGroups: YearGroup[];\n isPlugin: boolean;\n}\n\nexport const InteractiveWidgetItemV2 = React.memo(function(props: InteractiveWidgetItemV2Props): JSX.Element {\n const { data: interactive, thumbnailSize, preloadImage } = props;\n\n const questionsAppLink: Core.AppLink = {\n ...props.questionsAppLink,\n args: [props.data.id]\n };\n\n const questionsNumber = interactive._timepoints?.value?.length;\n\n return (\n <div className={`flex-shrink-0 px-1 col-6 col-sm-4`}>\n <VideoThumbnail\n type='static'\n textPosition={ThumbnailTextPosition.Independent}\n video={interactive}\n appLink={props.getAppLink(interactive)}\n imageOptions={{ size: thumbnailSize }}\n preload={preloadImage}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n hideDuration={false}\n imageCdnUrl={props.imageCdnUrl}\n isPlugin={props.isPlugin}\n />\n\n <div className='mt-2'>\n <ThumbnailText\n {...props}\n video={interactive}\n appLink={props.getAppLink(interactive)}\n />\n </div>\n\n <div className='mt-1'>\n <AppLink appLink={questionsAppLink} className='cursor-pointer'>\n <Text namespace={namespace} phrase='previewQuestions' options={{ count: questionsNumber, smartCount: questionsNumber }}/>\n </AppLink>\n </div>\n\n </div>\n );\n});\n","// extracted by mini-css-extract-plugin\nexport default {\"partialOptions\":\"Gufgq\",\"partialName\":\"SicQQ\",\"partialDescription\":\"dPGMq\",\"partialThumbnail\":\"vZrnb\",\"partialDragHandle\":\"iq73R\"};","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { VideoListHelper } from 'libs/shared/components/video-list/VideoListHelper';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\n\nimport styles from './partial-video-list.scss';\n\ninterface PartialVideoListProps {\n withReordering?: boolean;\n numVideos?: number;\n allowBulkActions?: boolean;\n}\n\nPartialVideoList.defaultProps = {\n numVideos: 15\n};\n\nexport function PartialVideoList(props: PartialVideoListProps): JSX.Element {\n return (\n <div className='mx-2'>\n {Array(props.numVideos).fill(null).map((_, i) => (\n <div className='d-flex' key={i}>\n {props.allowBulkActions && <div className='form-check pe-3 pe-sm-2 mx-0 mx-md-2' />}\n <PartialVideoItem {...props} />\n </div>\n ))}\n </div>\n );\n}\n\nexport function PartialVideoItem(props: PartialVideoListProps): JSX.Element {\n const breakpoints = useBreakpoints();\n\n const size = VideoListHelper.getSize(breakpoints, 'md');\n const isSmall = size === 'sm';\n\n const withDragHandle = props.withReordering && !breakpoints.xs;\n\n return (\n <Row className={`${isSmall ? '' : 'py-2'} flex-grow-1`}>\n <Col {...VideoListHelper.getThumbnailColumns()} className={`flex-column align-items-flex-start ${isSmall ? `pb-2 pe-1` : 'mb-1 pe-3 pe-md-2'}`}>\n <Row>\n {!!withDragHandle && (\n <div className='d-flex align-items-center justify-content-center col-2'>\n <div className={`partial-loading-background ${styles.partialDragHandle}`} />\n </div>\n )}\n <Col xs={VideoListHelper.getThumbnailColSize(withDragHandle)}>\n <div className={`partial-loading-background ${isSmall ? 'rounded' : 'rounded-3'} ${styles.partialThumbnail}`} />\n </Col>\n </Row>\n </Col>\n <Col {...VideoListHelper.getDetailsColumns()} className={isSmall ? 'pb-2' : 'px-2'}>\n <div className={`partial-loading-background mb-1 ${styles.partialName}`} />\n <div className={`partial-loading-background ${styles.partialDescription}`} />\n </Col>\n </Row>\n );\n}\n\n","// extracted by mini-css-extract-plugin\nexport default {\"avatarContainer\":\"kd18L\",\"cvIcon\":\"smUBc\"};","import React from 'react';\n\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { SvgContainer2 } from 'libs/shared/components/svg-container/SvgContainer2';\nimport { ClickViewPlayLogo } from 'libs/shared/components/svgs/clickview-logo/ClickViewLogo';\nimport { User } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from './video-owner-text.scss';\n\ninterface VideoOwnerTextProps {\n owner: User;\n isClickViewCurated: boolean;\n imageCdnUrl: string;\n}\n\nexport function VideoOwnerText(props: VideoOwnerTextProps): JSX.Element {\n if (!props.owner && !props.isClickViewCurated)\n return <></>;\n\n if (props.isClickViewCurated) {\n return (\n <div className='clamp-1 d-flex align-items-center'>\n <div className={`${styles.avatarContainer} me-1 border rounded-circle position-relative`}>\n <SvgContainer2 className={`me-1 ${styles.cvIcon}`}>\n <ClickViewPlayLogo />\n </SvgContainer2>\n </div>\n ClickView\n </div>\n );\n }\n\n const name = UserHelper.getCommunityName(props.owner);\n\n if (!name)\n return <></>;\n\n return (\n <div className='d-flex align-items-center'>\n <div className={`${styles.avatarContainer} me-1`}>\n <Avatar\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(props.owner.name, props.owner.surname)}\n imageUrl={props.owner.avatar?.url}\n />\n </div>\n <div className='clamp-1'>\n {name}\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { VideoOwnerText } from 'libs/shared/components/video-owner-text/VideoOwnerText';\nimport { FixedWidgetItemProps } from 'libs/shared/components/widgets/items/FixedWidgetItemProps';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { Clip, InteractiveMetadata, Video } from 'libs/shared/interfaces';\n\nimport styles from './interactive-widget-item.scss';\n\nconst namespace = 'shared.interactiveWidgetItem';\n\nexport interface InteractiveWidgetItemProps extends FixedWidgetItemProps<InteractiveMetadata> {\n video: Video | Clip;\n questionsAppLink: Core.AppLink;\n imageCdnUrl: string;\n}\n\nexport const InteractiveWidgetItem = React.memo(function(props: InteractiveWidgetItemProps): JSX.Element {\n const questionsAppLink: Core.AppLink = {\n ...props.questionsAppLink,\n args: [props.data.id]\n };\n\n return (\n <div className={`flex-shrink-0 px-1 ${styles.item}`}>\n <div className='row m-0 border rounded p-2 h-100'>\n <div className='col-6 p-0'>\n <VideoThumbnail\n video={props.data}\n appLink={props.getAppLink(props.data)}\n type='cosmetic'\n imageOptions={{ size: ImageSize.Small }}\n textPosition={ThumbnailTextPosition.Independent}\n preload\n analyticsOptions={{ location: LocationContext.SlidingListItem }}\n />\n </div>\n\n <div className='col-6 p-0'>\n <div className='ps-2'>\n <AppLink appLink={props.getAppLink(props.data)}>\n <h3 className='h6 mb-1'><span className='clamp-2'>{props.data.name}</span></h3>\n </AppLink>\n\n <VideoOwnerText\n owner={props.data.owner}\n isClickViewCurated={props.data._isClickViewCurated?.value}\n imageCdnUrl={props.imageCdnUrl}\n />\n\n <AppLink className='info-link' appLink={questionsAppLink}>\n <Text namespace={namespace} phrase='previewQuestions' />\n </AppLink>\n </div>\n </div>\n </div>\n </div>\n );\n});\n","// extracted by mini-css-extract-plugin\nexport default {\"item\":\"rXatl\"};","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}","export enum PlayPageAnchor {\n Resources = 'resources',\n Interactives = 'interactives',\n Video = 'video',\n Clips = 'clips',\n CurriculumLinks = 'curriculum-links',\n VideoDetails = 'video-details',\n RelatedVideos = 'related-videos',\n ClippedFrom='clipped-from'\n}","import React from 'react';\nimport { createHtmlPortalNode, OutPortal } from 'react-reverse-portal';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { CheckMarkStatus } from 'libs/shared/components/check-mark-button/CheckMarkButton';\nimport { RestrictionPadlock } from 'libs/shared/components/video-list/components/restriction-padlock/RestrictionPadlock';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { Config, CurrentUser, InteractiveMetadata, PlayerViewKey, PresentationAudience, UnionShareObject, YearGroup } from 'libs/shared/interfaces';\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 { RelatedVideos } from 'shared/components/related-videos/RelatedVideos';\nimport { RelatedVideosHash } from 'shared/hooks/useGetRelatedVideos';\nimport { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\nimport { LitePlayerView } from 'shared/views/lite-player/LitePlayerView';\n\ninterface PlayInteractiveProps {\n interactive: InteractiveMetadata;\n yearGroups: YearGroup[];\n currentUser: CurrentUser;\n config: Config;\n audiences: PresentationAudience[];\n queryParams: PlayViewQueryParams;\n viewKey: PlayerViewKey;\n startTime?: number;\n endTime?: number;\n\n // Share view only\n shareLink?: UnionShareObject;\n sharerInstanceRegion?: string;\n checkMarkStatus?: CheckMarkStatus;\n relatedVideos: RelatedVideosHash;\n isPlugin: boolean;\n}\n\nexport function PlayInteractive(props: PlayInteractiveProps): JSX.Element {\n const locationContext = props.shareLink ?\n LocationContext.PlaySharedInteractive :\n LocationContext.PlayInteractive;\n\n const [ showHeading, setShowHeading ] = React.useState(true);\n\n const isArchived = VideoHelper.isVideoTypeArchived(props.interactive);\n\n const summaryPortalNode = React.useMemo(() => createHtmlPortalNode(), []);\n\n const { setFavourite, canFavourite } = useLiteFavourites(locationContext);\n const { hasPermissions } = usePermissions();\n\n function onShowSummary(showing: boolean): void {\n setShowHeading(!showing);\n }\n\n return (\n <div className='px-3'>\n {isArchived && <ArchivedBanner typeId={props.interactive.typeId} hasStudentExperience />}\n\n <div className='mb-3'>\n <LitePlayerView\n config={props.config}\n video={props.interactive}\n currentUser={props.currentUser}\n shareLink={props.shareLink}\n viewKey={props.viewKey}\n startTime={props.startTime}\n onShowSummary={onShowSummary}\n summaryPortalNode={summaryPortalNode}\n />\n </div>\n {/* This wrapping div is here because react seems to not want to play nice\n with adding or removing a node just ahead of an OutPortal */}\n <div>\n {showHeading &&\n <h1 className='h3 d-flex'>\n {props.interactive.name}\n <RestrictionPadlock\n tooltipPlacement='right'\n className='ps-1'\n video={props.interactive}\n yearGroups={props.yearGroups}\n />\n </h1>\n }\n </div>\n <OutPortal node={summaryPortalNode}></OutPortal>\n\n {!hasPermissions(PermissionName.StudentExperience) && (\n <RelatedVideos\n currentVideo={props.interactive}\n yearGroups={props.yearGroups}\n currentUser={props.currentUser}\n setFavourite={setFavourite}\n canFavourite={canFavourite}\n relatedVideos={props.relatedVideos}\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.shareLink?.id,\n moviesAndTv: props.queryParams.mtv\n })}\n moviesAndTv={props.queryParams.mtv}\n isPlugin={props.isPlugin}\n />\n )}\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'interactives.previewInteractive';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InteractiveAlertBannerProps {\n isPreviewPreventScrubbingEnabled: boolean;\n isPreviewingPreventScrubbing: boolean;\n toggleStudentMode: () => void;\n isArchived: boolean;\n}\n\nexport function InteractiveAlertBanner(props: InteractiveAlertBannerProps): JSX.Element {\n return (\n <div className='alert text-dark bg-light-blue px-2 rounded d-flex flex-column flex-lg-row justify-content-between mb-3 align-items-center' role='alert'>\n {!props.isArchived ? <Text phrase='alert' /> : (\n <div className='d-flex align-items-center'>\n <SvgContainer\n svgName={cvSvgLibrary.Archive}\n size={SvgContainerSize.Standard}\n className='me-2 svg-container'\n />\n \n <div className='w-100'>\n <p className='fw-semibold mb-0'>{getPhrase('archivedInfoTitle')}</p>\n <p className='mb-1'>{getPhrase('archivedInfo')}</p>\n </div>\n </div>\n )}\n {props.isPreviewPreventScrubbingEnabled && (\n <Tooltip\n title={getPhrase('previewPreventScrubbingExplain')}\n trigger='hover'\n spanHack\n >\n <div className='d-flex mt-1 mt-lg-0'>\n <div className='me-2'><Text phrase='previewPreventScrubbing'/></div>\n <ToggleSwitch on={props.isPreviewingPreventScrubbing} onClick={props.toggleStudentMode} />\n </div>\n </Tooltip>\n )}\n </div>\n );\n}","import * as React from 'react';\nimport { createHtmlPortalNode, OutPortal } from 'react-reverse-portal';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { Actions as ActionsComponent } from 'libs/shared/components/actions/Actions';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { InteractiveWidgetItemV2, InteractiveWidgetItemV2Props } from 'libs/shared/components/play-page-v2/interactives-widget/InteractiveWidgetItemV2';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { RestrictionPadlock } from 'libs/shared/components/video-list/components/restriction-padlock/RestrictionPadlock';\nimport { FixedWidget } from 'libs/shared/components/widgets/fixed-widget';\nimport { InteractiveWidgetItem, InteractiveWidgetItemProps } from 'libs/shared/components/widgets/items/interactive-widget-item/InteractiveWidgetItem';\nimport { GlobalPlayerConsumer } from 'libs/shared/context/player-context/components/GlobalPlayerConsumer';\nimport { usePlayerContext } from 'libs/shared/context/player-context/PlayerContext';\nimport { CurationStatus } from 'libs/shared/enums/CurationStatus';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Clip, Config, CurrentUser, Interactive, InteractiveMetadata, PresentationAudience, Video, YearGroup } from 'libs/shared/interfaces';\nimport { PlayViewQueryParams } from 'libs/shared/interfaces/query-params/PlayViewQueryParams';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { RestrictionBanner } from 'shared/components/play-page/RestrictionBanner';\nimport { RelatedVideos } from 'shared/components/related-videos/RelatedVideos';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { RelatedVideosHash } from 'shared/hooks/useGetRelatedVideos';\nimport { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { InteractiveAlertBanner } from 'apps/interactives/components/preview-interactive/InteractiveAlertBanner';\nimport { usePreviewPreventInteractive } from 'apps/interactives/hooks/interactiveHooks';\n\nconst namespace = 'interactives.previewInteractive';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getSourceVideo(interactive: InteractiveMetadata): Clip | Video {\n return interactive._parentClip || interactive._parentVideo;\n}\n\ninterface PreviewInteractiveProps {\n interactive: InteractiveMetadata;\n yearGroups: YearGroup[];\n config: Config;\n currentUser: CurrentUser;\n queryParams: PlayViewQueryParams;\n audiences: PresentationAudience[];\n isPreviewPreventScrubbingEnabled: boolean;\n relatedVideos: RelatedVideosHash;\n canManageVideoAccess: boolean;\n isPlugin: boolean;\n\n // Share view only\n shareId?: string;\n}\n\nexport function PreviewInteractive(props: PreviewInteractiveProps): JSX.Element {\n const locationContext = props.shareId ? LocationContext.PreviewSharedInteractive : LocationContext.PreviewInteractive;\n\n const playerContext = usePlayerContext();\n\n const [ isPreviewingPreventScrubbing, setIsPreviewingPreventScrubbing ] = React.useState(false);\n\n const { canConsume } = VideoHelper.getCanBeConsumed(props.interactive);\n\n const questionListPortalNode = React.useMemo(() => createHtmlPortalNode(), []);\n \n const videoActions = useVideoActions({\n location: VideoActionsLocation.PlayPage,\n shareId: props.shareId\n });\n\n const { setFavourite, canFavourite } = useLiteFavourites(locationContext);\n const { hasPlayPageV2 } = useSettings(null);\n\n usePreviewPreventInteractive(isPreviewingPreventScrubbing, togglePreviewPreventScrubbing);\n\n function togglePreviewPreventScrubbing() {\n playerContext.playerRef?.current?.togglePreviewPreventScrubbing?.();\n }\n\n function toggleStudentMode() {\n setIsPreviewingPreventScrubbing(!isPreviewingPreventScrubbing);\n }\n\n const sourceVideo = getSourceVideo(props.interactive);\n\n let otherInteractives: InteractiveMetadata[];\n let backToName: string;\n let backAppLink: Core.AppLink;\n\n if (VideoHelper.isClip(sourceVideo)) {\n otherInteractives = sourceVideo.interactives?.data?.filter(i => {\n return i.id.toString() !== props.interactive.id.toString();\n });\n backToName = sourceVideo.name;\n backAppLink = {\n application: AppChannels.CLIPS,\n action: Actions.Clips.PLAY_CLIP,\n args: [ sourceVideo.id, TextHelper.slugify(sourceVideo.name) ]\n };\n } else {\n otherInteractives = sourceVideo.interactives?.data?.filter(i => {\n return i.id.toString() !== props.interactive.id.toString();\n });\n backToName = sourceVideo.name;\n backAppLink = {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PLAY_VIDEO,\n args: [ sourceVideo.id, TextHelper.slugify(sourceVideo.name) ]\n };\n }\n\n const isDraft = props.interactive.status === CurationStatus.Draft;\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <div className='px-4'>\n\n <RestrictionBanner\n restrictions={props.interactive._restrictions}\n yearGroups={props.yearGroups}\n objectId={props.interactive.id}\n objectTypeId={MasterType.Interactive}\n canManageVideoAccess={props.canManageVideoAccess}\n />\n\n <InteractiveAlertBanner\n isPreviewPreventScrubbingEnabled={props.isPreviewPreventScrubbingEnabled}\n isPreviewingPreventScrubbing={isPreviewingPreventScrubbing}\n toggleStudentMode={toggleStudentMode}\n isArchived={VideoHelper.isVideoTypeArchived(props.interactive)}\n />\n\n <div className='mb-3'>\n {canConsume &&\n <GlobalPlayerConsumer\n key={props.interactive.id}\n objectId={props.interactive.id}\n objectTypeId={props.interactive.typeId}\n shareId={props.shareId}\n startTime={props.queryParams.t ?? props.queryParams.startTime}\n mode='default'\n location='play-page'\n />\n }\n </div>\n <div className='d-flex justify-content-between align-items-center'>\n <div className='inline-block w-100'>\n <div className='ms-2 float-end'>\n <ActionsComponent\n actions={videoActions.getVideoActions(props.interactive)}\n actionsDropdownClassName='btn btn-outline-dark'\n fetchMore={() => videoActions.fetchMoreActions(props.interactive)}\n />\n </div>\n\n <h1 className='h3 mb-2'>\n {isDraft && (\n <div className={`badge draft-badge me-2 align-bottom flex-shrink-0 h-auto lh-base`}>\n <Text phrase='draft' />\n </div>\n )}\n {props.interactive.name}\n <RestrictionPadlock\n tooltipPlacement='right'\n className='ps-1'\n video={props.interactive}\n yearGroups={props.yearGroups}\n />\n </h1>\n {VideoHelper.canViewOriginalVideo(props.interactive) &&\n <div className='mb-1 me-3 clamp-1'>\n <Text phrase='viewOriginal' /> <AppLink appLink={backAppLink} className='text-info'>{backToName}</AppLink>\n </div>\n }\n </div>\n </div>\n\n {props.interactive.description &&\n <p>{props.interactive.description}</p>\n }\n\n <div className='mb-3'>\n <OutPortal node={questionListPortalNode}></OutPortal>\n </div>\n\n {!!otherInteractives?.length && (\n <div className='pb-3'>\n {!hasPlayPageV2 ? (\n <FixedWidget<InteractiveWidgetItemProps>\n name={getPhrase('otherInteractives', { count: otherInteractives.length })}\n contents={WidgetContents.Interactives}\n collection={otherInteractives}\n prefetched\n getChildAppLink={(interactive: Interactive) => {\n return {\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.VIEW_INTERACTIVE,\n args: [ interactive.id, TextHelper.slugify(interactive.name) ]\n };\n }}\n childComponent={InteractiveWidgetItem}\n extraChildComponentProps={{\n video: sourceVideo,\n questionsAppLink: {\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.PREVIEW_QUESTIONS\n },\n imageCdnUrl: props.config.imageCdnUrl\n }}\n analyticsData={{ widgetId: 'interactives' }}\n />\n ) : (\n <FixedWidget<InteractiveWidgetItemV2Props>\n name={getPhrase('otherInteractives', { count: otherInteractives.length })}\n contents={WidgetContents.Interactives}\n collection={otherInteractives}\n prefetched\n getChildAppLink={(interactive: Interactive) => {\n return {\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.VIEW_INTERACTIVE,\n args: [ interactive.id, TextHelper.slugify(interactive.name) ]\n };\n }}\n childComponent={InteractiveWidgetItemV2}\n extraChildComponentProps={{\n yearGroups: props.yearGroups,\n questionsAppLink: {\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.PREVIEW_QUESTIONS\n },\n imageCdnUrl: props.config.imageCdnUrl,\n isPlugin: props.isPlugin\n }}\n analyticsData={{ widgetId: 'interactives' }}\n />\n )}\n </div>\n )}\n\n <RelatedVideos\n currentVideo={props.interactive}\n yearGroups={props.yearGroups}\n setFavourite={setFavourite}\n canFavourite={canFavourite}\n currentUser={props.currentUser}\n audiences={props.audiences}\n relatedVideos={props.relatedVideos}\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 </div>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\n\nexport function usePreviewPreventInteractive(\n previewPreventInteractive: boolean,\n togglePreviewPreventInteractive: () => void\n): void {\n React.useEffect(() => {\n togglePreviewPreventInteractive();\n }, [previewPreventInteractive]);\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType } from 'libs/analytics/interfaces';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.playPage';\n\ninterface ArchivedBannerProps {\n typeId: MasterType;\n hasStudentExperience: boolean;\n}\n\nfunction mapTypeId(typeId: MasterType): string {\n switch (typeId) {\n case MasterType.Video:\n return 'video';\n case MasterType.Clip:\n return 'clip';\n case MasterType.Interactive:\n return 'interactive';\n default:\n return '';\n }\n}\n\nexport function ArchivedBanner(props: ArchivedBannerProps): JSX.Element {\n const getPhrase = LanguageService.encloseNamespace(namespace);\n const type = mapTypeId(props.typeId);\n\n return (\n <div className='alert bg-light-blue p-3 rounded-3 d-flex justify-content-between align-items-center'>\n <SvgContainer\n svgName={cvSvgLibrary.Archive}\n size={SvgContainerSize.Standard}\n className='me-2 svg-container'\n />\n \n <div className='w-100'>\n <p className='fw-semibold mb-0'>{getPhrase('archivedInfoTitle', { type })}</p>\n {(!props.hasStudentExperience || type === EntityType.Video) && (\n <p className='mb-1'>{getPhrase('archivedInfo', { type: `${type}s` })}</p>\n )}\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { RestrictionType } from 'libs/shared/enums/RestrictionType';\nimport { Restrictions, YearGroup } from 'libs/shared/interfaces';\nimport { RestrictionHelper } from 'libs/shared/utils/RestrictionHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'shared.playPage';\n\ninterface RestrictionBannerProps {\n restrictions: Restrictions;\n yearGroups: YearGroup[];\n objectId: string;\n objectTypeId: MasterType;\n canManageVideoAccess: boolean;\n}\n\nexport function RestrictionBanner(props: RestrictionBannerProps): JSX.Element {\n if (!props.restrictions?.value?.length || !props.yearGroups || !props.canManageVideoAccess)\n return <></>;\n\n const restriction = RestrictionHelper.getWeightedRestriction(props.restrictions.value);\n\n if (restriction.type !== RestrictionType.Custom)\n return <></>;\n\n const baseClassName = RestrictionHelper.mapRestrictionToClass(props.restrictions);\n const className = `${baseClassName} fw-semibold p-2 rounded mb-3 d-flex justify-content-between align-items-center`;\n\n return (\n <div className={className}>\n <div className='d-flex align-items-center'>\n <SvgContainer\n svgName={RestrictionHelper.mapRestrictionToSvg(props.restrictions)}\n size={SvgContainerSize.Large}\n />\n <span className='ps-1'>\n {RestrictionHelper.mapRestrictionToText(props.restrictions, props.yearGroups)}\n </span>\n </div>\n \n <AppLink\n appLink={{\n application: AppChannels.DEFAULT,\n action: Actions.Default.APPROVE_VIDEO,\n params: {\n objectId: props.objectId,\n objectTypeId: props.objectTypeId\n }\n }}\n className='btn btn-outline-dark'\n >\n <Text namespace={namespace} phrase='approve' />\n </AppLink>\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PartialVideoList } from 'libs/shared/components/video-list/partial-loading/PartialVideoList';\nimport { VideoList } from 'libs/shared/components/video-list/VideoList';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { CanFavouriteFunc, CurrentUser, FavouriteFunc, PresentationAudience, VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { RelatedVideosHash } from 'shared/hooks/useGetRelatedVideos';\nimport { InteractiveHelpers } from 'shared/utils/InteractiveHelper';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { SeriesAppLinkHelper } from 'apps/series/SeriesAppLinkHelper';\n\nconst namespace = 'shared.relatedVideos';\n\ninterface RelatedVideosProps {\n currentVideo: VideoTypes;\n yearGroups: YearGroup[];\n relatedVideos: RelatedVideosHash;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n currentUser: CurrentUser;\n audiences: PresentationAudience[];\n getVideoAppLink: (video: VideoTypes, opts: GetVideoAppLinkOptions) => Core.AppLink;\n moviesAndTv: boolean;\n isPlugin: boolean;\n headingRef?: React.MutableRefObject<Map<PlayPageAnchor, HTMLElement>>;\n}\n\nexport function RelatedVideos(props: RelatedVideosProps): JSX.Element {\n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem });\n const { hasPermissions } = usePermissions();\n\n if (!props.currentUser?.isAuthenticated) // Don't render if user is unauthenticated\n return <></>;\n\n if (props.relatedVideos.hasError) // Don't render if request has errored\n return <></>;\n\n if (props.relatedVideos.hasCompleted && !props.relatedVideos.videos?.length) // Don't render if response is empty\n return <></>;\n\n if (!props.relatedVideos.isFetching && !props.relatedVideos.hasCompleted) // Don't render if request is never made\n return <></>;\n\n // We don't support autoplaying from interactives. This means the related videos heading won't say \"Up next\"\n const canAutoplay = !VideoHelper.isInteractive(props.currentVideo);\n\n return (\n <section\n id={PlayPageAnchor.RelatedVideos}\n ref={el => {\n (el && props.headingRef?.current\n && !!props.relatedVideos.videos?.length)\n && props.headingRef.current.set(PlayPageAnchor.RelatedVideos, el);\n }}\n >\n <VideoActionsContext.Provider value={videoActions}>\n <h2 className='h4 mb-0'>\n <Text namespace={namespace} phrase={canAutoplay ? 'upNext' : 'relatedVideos'} />\n </h2>\n {props.relatedVideos.hasCompleted ? (\n <VideoList\n videos={props.relatedVideos.videos}\n yearGroups={props.yearGroups}\n getSubTextAppLink={video => {\n return SeriesAppLinkHelper.getSeriesAppLink(video.series, props.moviesAndTv ? { mtv: true } : null);\n }}\n getVideoAppLink={props.getVideoAppLink}\n hasPermissions={hasPermissions}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n presentationAudiences={props.audiences}\n getPreviewQuestionsAppLink={interactive => InteractiveHelpers.getPreviewQuestionsAppLink(interactive)}\n isPlugin={props.isPlugin}\n getClassroomGuideAppLink={VideoAppLinkHelper.getClassroomGuideAppLink}\n getInteractiveGuidanceAppLink={VideoAppLinkHelper.getInteractiveGuidanceAppLink}\n getResourceGuidanceAppLink={VideoAppLinkHelper.getResourceGuidanceAppLink}\n />\n ) : <PartialVideoList />\n }\n {props.relatedVideos.hasMore && (\n <InfiniteScrollFooter\n isFetching={props.relatedVideos.isFetching}\n fetchNext={props.relatedVideos.fetchNext}\n />\n )}\n </VideoActionsContext.Provider>\n </section>\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 { Flight } from 'libs/common/flight';\n\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { CurrentUser } from 'libs/shared/interfaces';\n\nexport function useShouldPreviewInteractive() {\n const { hasPermissions } = usePermissions();\n const { hasProduct } = useProducts();\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n return !hasPermissions(PermissionName.StudentExperience) &&\n hasProduct(ProductId.Primary) &&\n currentUser.data.isAuthenticated;\n}","import React from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { CurrentUser, Video, VideoCollection } from 'libs/shared/interfaces';\n\ninterface VideoMixinOptions {\n /**\n * If the videos that are having new data mixed into are sitting on an explicit Flight namespace,\n * providing that namespace here is required\n */\n flightNamespace?: string;\n}\n\nexport function useVideoMixin(videos: VideoCollection | Video[], options: VideoMixinOptions = {}): void {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const hydratedVideos = React.useRef<Set<string>>(new Set<string>());\n\n const videoIds = videos && (Array.isArray(videos)\n ? videos.filter(Boolean).map(v => v.id)\n : videos.data.filter(Boolean).map(v => v.id));\n\n const [ request, setRequest ] = React.useState<Flight.Request[]>([]);\n\n React.useEffect(() => {\n if (!videoIds?.length || !currentUser.hasCompleted)\n return;\n\n const unhydratedVideos: string[] = [];\n\n videoIds.forEach(id => {\n if (!hydratedVideos.current.has(id)) {\n unhydratedVideos.push(id);\n hydratedVideos.current.add(id);\n }\n });\n \n if (!unhydratedVideos.length)\n return;\n\n setRequest(r => {\n const newRequests = [\n ...r,\n VideoRequests.videoMixinAssocs(unhydratedVideos, options.flightNamespace)\n ];\n\n if (currentUser.data?.isAuthenticated)\n newRequests.push(ClassificationRequests.hasCurriculumLinks(unhydratedVideos, null, options.flightNamespace));\n\n return newRequests;\n });\n }, [ videoIds?.length, currentUser.hasCompleted ]);\n\n Flight.useBasicFetchAll(request);\n}"],"names":["InfiniteScrollFooter","props","ref","inView","fetchOnScroll","isFetching","fetchNext","nextCursor","className","Spinner","as","animation","role","SvgContainer","svgName","size","S","onClick","defaultProps","InteractiveWidgetItemV2","interactive","data","thumbnailSize","preloadImage","questionsAppLink","args","id","questionsNumber","_timepoints","value","length","type","textPosition","video","appLink","getAppLink","imageOptions","preload","analyticsData","analyticsOptions","setFavourite","canFavourite","hideDuration","imageCdnUrl","isPlugin","namespace","phrase","options","count","smartCount","PartialVideoList","Array","numVideos","fill","map","_","i","key","allowBulkActions","PartialVideoItem","breakpoints","useBreakpoints","isSmall","VideoListHelper","withDragHandle","withReordering","xs","Row","Col","VideoOwnerText","owner","isClickViewCurated","SvgContainer2","name","UserHelper","Avatar","initials","surname","imageUrl","avatar","url","InteractiveWidgetItem","VideoThumbnail","ThumbnailTextPosition","location","AppLink","_isClickViewCurated","Text","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","generateCacheKey","flightObjs","obj","join","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","isArray","useEffect","forEach","PlayPageAnchor","PlayInteractive","locationContext","shareLink","showHeading","setShowHeading","isArchived","summaryPortalNode","u","hasPermissions","typeId","hasStudentExperience","config","currentUser","viewKey","startTime","onShowSummary","showing","tooltipPlacement","yearGroups","node","currentVideo","relatedVideos","audiences","getVideoAppLink","v","opts","context","queryParams","contextId","playNext","shareId","moviesAndTv","mtv","getPhrase","LanguageService","InteractiveAlertBanner","isPreviewPreventScrubbingEnabled","Tooltip","title","trigger","spanHack","ToggleSwitch","on","isPreviewingPreventScrubbing","toggleStudentMode","PreviewInteractive","previewPreventInteractive","togglePreviewPreventInteractive","playerContext","setIsPreviewingPreventScrubbing","canConsume","VideoHelper","questionListPortalNode","videoActions","useVideoActions","useLiteFavourites","hasPlayPageV2","useSettings","playerRef","current","togglePreviewPreventScrubbing","otherInteractives","backToName","backAppLink","sourceVideo","_parentClip","_parentVideo","interactives","filter","toString","application","action","TextHelper","isDraft","CurationStatus","RestrictionBanner","restrictions","_restrictions","objectId","objectTypeId","MasterType","canManageVideoAccess","GlobalPlayerConsumer","t","mode","Actions","actions","getVideoActions","actionsDropdownClassName","fetchMore","fetchMoreActions","RestrictionPadlock","description","contents","WidgetContents","collection","prefetched","getChildAppLink","childComponent","extraChildComponentProps","widgetId","RelatedVideos","VideoAppLinkHelper","ArchivedBanner","mapTypeId","baseClassName","params","isAuthenticated","hasError","hasCompleted","videos","canAutoplay","el","headingRef","set","getSubTextAppLink","series","presentationAudiences","getPreviewQuestionsAppLink","getClassroomGuideAppLink","getInteractiveGuidanceAppLink","getResourceGuidanceAppLink","hasMore","usePresentationAudiences","redirectOnError","activePresentation","getFallbackPresentation","presentation","useShouldPreviewInteractive","hasProduct","useVideoMixin","hydratedVideos","Set","videoIds","Boolean","request","setRequest","unhydratedVideos","has","push","add","r","newRequests","flightNamespace"],"sourceRoot":""}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[6181],{26512:(e,t,n)=>{n.r(t),n.d(t,{MyVideosView:()=>z});var a=n(32735),i=n(70680),r=n(23481),l=n(20354),o=n(28400),c=n(65858),s=n(43500),u=n(73518),d=n(83834),p=n(65403),m=n(10874),v=n(37395),f=n(4201),h=n(83345),g=n(74696),y=n(30254),E=n(13231),k=n(51365),A=n(16714),b=n(39151),V=n(1666),w=n(31949),L=n(299),F=n(91286),C=n(22902),S=n(79612),x=n(35223),M=n(31908),N=n(35949),B=n(73417),O=n(14070),I=n(97291),D=n(51855),T=n(27638),P=n(44110),_=n(97816),R=n(10741),j=n(22490),G=n(98860),U=n(12617),H=n(45967),W=n(65202),Y=n(74796),Q=n(14305),X=n(61970),Z=n(82431),$=n(26859),q=n(18097);const J={uploadingList:"wg7hV"};var K="default.myVideos";function z(e){var t,n,z,ee,te,ne,ae,ie,re,le;(0,S.M)({title:r.T.getPhrase(K,"pageTitle")});var oe=(0,i.I0)(),ce=(0,T.u)(c.LZ.VideoThumbnail),se=ce.setFavourite,ue=ce.canFavourite,de=(0,C.T)(),pe=de.hasPermissions,me=de.hasLocalPermissions,ve=(0,H.q)().handleDragEnd,fe=(0,D.G)().isPlugin,he=(0,f.of)().focusSearchBar,ge=l.a.useBasicFetch(w.N.currentUser()),ye=l.a.useBasicFetch((null===(t=ge.data)||void 0===t?void 0:t.isAuthenticated)&&V.h.yearGroups(ge.data.customerId)),Ee=l.a.useBasicFetch(b.L.config()),ke=l.a.useBasicFetch((null===(n=ge.data)||void 0===n?void 0:n.isAuthenticated)&&w.N.workspace()),Ae=null===(ee=null===(z=ke.data)||void 0===z?void 0:z.categoryTree)||void 0===ee?void 0:ee.id,be=(0,G.P)(Ae),Ve=(0,X.y)(),we=(0,X.W)(null===(te=ke.data)||void 0===te?void 0:te.id,null===(ne=ke.data)||void 0===ne?void 0:ne.categoryTree.id),Le=(0,P.i)(),Fe=(0,Y.f)(),Ce=function(e,t){return ke.data?U.E.videos(Ae,e,t):null},Se=!me(A.E.ViewMyVideosLanding)&&ge.hasCompleted,xe=l.a.useBasicFetch(Se&&Ce(e.cursor,e.typeFilter));(0,F.v)(xe);var Me=(0,W.J)({onRemove:function(e,t){return l.a.getFetch(oe)(Ce(e,t))}}),Ne=Me.uploadingVideos,Be=Me.onClickAlternate,Oe=Me.onClickDelete,Ie=Me.processingIds,De=null===(ie=null===(ae=xe.data)||void 0===ae?void 0:ae.data)||void 0===ie?void 0:ie.filter((function(e){return!Ie[e.id]}));(0,_.V)(null==De?void 0:De.filter(M.M.isVideo));var Te=(0,L.X)(De);if(me(A.E.ViewMyVideosLanding))return a.createElement(Q.V,null);function Pe(){return{action:O.e.MyVideos.MY_VIDEOS,application:I.O.MY_VIDEOS,params:{cursor:e.cursor,previous:e.previous,type:e.typeFilter}}}return a.createElement(k.M.Provider,{value:Ve},a.createElement("div",{className:"px-3"},a.createElement(B.T,null),a.createElement("div",{className:"d-flex justify-content-between"},a.createElement("h1",{className:"h2 mb-0"},a.createElement(h.x,{namespace:K,phrase:"header"})),a.createElement("div",null,a.createElement("div",{className:"d-sm-none"},a.createElement($.c,{canUpload:pe(A.C.UploadVideo)})),a.createElement("div",{className:"ms-2 d-sm-inline-block d-none"},a.createElement(m.h,{svgName:x.vn.Search,appLink:{application:I.O.SEARCH,action:O.e.Search.HOME,params:{source:s.fi.MyVideos}},className:"btn btn-outline-dark me-2",onClick:he,analyticsData:{},analyticsOptions:{entity:c.py.SearchResults,location:c.LZ.MyVideos,actionType:c.Vw.Click,descriptor:c.Bk.MyVideos}},a.createElement(h.x,{namespace:K,phrase:"searchMyVideos"})),a.createElement(m.h,{svgName:x.vn.Plus,appLink:{application:I.O.MY_VIDEOS,action:O.e.MyVideos.ADD_FOLDER,args:[null===(re=ke.data)||void 0===re?void 0:re.id]},className:"btn btn-outline-dark"},a.createElement(h.x,{namespace:K,phrase:"addFolder"}))))),a.createElement("hr",null),a.createElement(u.p,{handleDragEnd:ve,dragOverlayComponent:N.U,source:ke.data},a.createElement("div",null,!(null==be?void 0:be.hasCompleted)&&a.createElement(p.i,null),!!(null===(le=null==be?void 0:be.items)||void 0===le?void 0:le.length)&&a.createElement("div",{className:"mx-n2"},a.createElement(d.$,{folders:be.items,getAppLink:function(e){return{application:I.O.MY_VIDEOS,action:O.e.MyVideos.MY_VIDEOS_FOLDER,args:[e.id,o.m.slugify(e.name)]}},expandFolders:!1,getFolderActions:function(e){return Fe("folder",e)},drag:!0,drop:!0})),a.createElement(y.X,{allowBulkAction:!0,allowFilter:!0,checkboxHelper:Te,getVideosBulkAction:we,locationContext:c.LZ.MyVideos,typeFilter:e.typeFilter,getAppLink:function(){return Pe()}}),!!(null==Ne?void 0:Ne.length)&&a.createElement("div",{className:"position-relative ".concat(J.uploadingList)},Ne.map((function(e){return a.createElement(q.X,{item:e,onClickAlternate:Be,onClickDelete:Oe,key:e.id,allowBulkAction:!0})}))),function(){var t,n,i;return ge.data&&xe.data?De.length||Ne.length?a.createElement(a.Fragment,null,a.createElement(E.E4,{videos:De,yearGroups:ye.data,getVideoAppLink:j.W.getAppLink,getSubTextAppLink:function(e){return Z.j.getSeriesAppLink(e.series)},setFavourite:se,canFavourite:ue,presentationAudiences:Le.data,canRemovePrivateVideos:!0,allowBulkAction:!0,getVideosBulkAction:we,typeFilter:e.typeFilter,checkboxHelper:Te,hasPermissions:pe,drag:!0,imageCdnUrl:null===(t=Ee.data)||void 0===t?void 0:t.imageCdnUrl,getPreviewQuestionsAppLink:function(e){return R.j.getPreviewQuestionsAppLink(e)},isPlugin:fe,getClassroomGuideAppLink:j.W.getClassroomGuideAppLink,getInteractiveGuidanceAppLink:j.W.getInteractiveGuidanceAppLink,getResourceGuidanceAppLink:j.W.getResourceGuidanceAppLink}),!!(null===(i=null===(n=xe.data)||void 0===n?void 0:n.pagination)||void 0===i?void 0:i.cursors)&&a.createElement(v.t,{appLink:Pe(),cursors:{next:xe.data.pagination.cursors.next,previous:e.cursor},buttonVariant:"outline-dark",className:"py-2 float-end",scrollTop:!0,prevHack:!0})):a.createElement(Q.K,null):a.createElement("div",{className:"mx-n2"},a.createElement(g.S,{allowBulkActions:!0}))}()))))}},73417:(e,t,n)=>{n.d(t,{T:()=>u});var a=n(32735),i=n(11607),r=n(83914),l=n(83345),o=n(87348),c=n(35223),s="shared.upgradeFeedbackBanner";function u(){var e=(0,o.Q)(),t=e.showFeedbackBanner,n=e.dismissFeedbackBanner;return t?a.createElement("div",{className:"alert bg-light-blue p-2 rounded text-info fw-semibold d-flex justify-content-between align-items-center"},a.createElement(l.x,{namespace:s,phrase:"message",options:{url:"https://www.clickvieweducation.com/en-au/blog/product/exchange-tv-new-look"}}),a.createElement(i.L,{onClick:n},a.createElement(r.x,{svgName:c.vn.Close,className:"ms-2 svg-container"}))):a.createElement(a.Fragment,null)}},97816:(e,t,n)=>{n.d(t,{V:()=>u});var a=n(32735),i=n(20354),r=n(21750),l=n(31949),o=n(1575);function c(e,t){if(e){if("string"==typeof e)return s(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(e,t):void 0}}function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}function u(e){var t,n,u=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},d=i.a.useBasicFetch(l.N.currentUser()),p=a.useRef(new Set),m=e&&(Array.isArray(e)?e.filter(Boolean).map((function(e){return e.id})):e.data.filter(Boolean).map((function(e){return e.id}))),v=(t=a.useState([]),n=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,i,r,l,o=[],c=!0,s=!1;try{if(r=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(a=r.call(n)).done)&&(o.push(a.value),o.length!==t);c=!0);}catch(e){s=!0,i=e}finally{try{if(!c&&null!=n.return&&(l=n.return(),Object(l)!==l))return}finally{if(s)throw i}}return o}}(t,n)||c(t,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),f=v[0],h=v[1];a.useEffect((function(){if((null==m?void 0:m.length)&&d.hasCompleted){var e=[];m.forEach((function(t){p.current.has(t)||(e.push(t),p.current.add(t))})),e.length&&h((function(t){var n,a=[].concat(function(e){return function(e){if(Array.isArray(e))return s(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||c(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.")}()}(t),[o.R.videoMixinAssocs(e,u.flightNamespace)]);return(null===(n=d.data)||void 0===n?void 0:n.isAuthenticated)&&a.push(r.x.hasCurriculumLinks(e,null,u.flightNamespace)),a}))}}),[null==m?void 0:m.length,d.hasCompleted]),i.a.useBasicFetchAll(f)}}}]);
|
|
2
|
-
//# sourceMappingURL=6181-4944b5c6a2-lite.chunk.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/6181-4944b5c6a2-lite.chunk.js","mappings":"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","sources":["file:///app/packages/projects/lite/src/apps/my-videos/views/my-videos/my-videos.scss","file:///app/packages/projects/lite/src/apps/my-videos/views/my-videos/MyVideosView.tsx","file:///app/packages/projects/lite/src/shared/components/upgrade-feedback-banner/UpgradeFeedbackBanner.tsx","file:///app/packages/projects/lite/src/shared/hooks/useVideoMixin.ts"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"uploadingList\":\"wg7hV\"};","import * as React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { Cursors } from 'libs/common/backbone/interfaces';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { EntityType, LocationContext, SearchSourceDescriptor, UserAction } from 'libs/analytics/interfaces';\n\nimport { SearchIndices, SourceFilterOptions } from 'libs/shared/apps/search/interfaces';\nimport { DragDropMoveContext } from 'libs/shared/components/drag-drop-move/DragDropMoveContext';\nimport { FolderList } from 'libs/shared/components/folder-list/FolderList';\nimport { PartialFolderList } from 'libs/shared/components/folder-list/partial-loading/PartialFolderList';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { Pagination } from 'libs/shared/components/pagination/Pagination';\nimport { useFocusSearchBar } from 'libs/shared/components/search-bar/SearchUtils';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PartialVideoList } from 'libs/shared/components/video-list/partial-loading/PartialVideoList';\nimport { VideoListActions } from 'libs/shared/components/video-list/video-list-actions/VideoListActions';\nimport { VideoList } from 'libs/shared/components/video-list/VideoList';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { LocalPermissionName, PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { BulkCheckboxManager, useBulkCheckboxManager } from 'libs/shared/hooks/useBulkCheckboxManager';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { BasePaginatedCollection, Config, CurrentUser, Folder, Library, VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { DragDropOverlay } from 'shared/components/drag-drop-overlay/DragDropOverlay';\nimport { UpgradeFeedbackBanner } from 'shared/components/upgrade-feedback-banner/UpgradeFeedbackBanner';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { usePluginHelper } from 'shared/hooks/use-plugin-helper/usePluginHelper';\nimport { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\nimport { usePresentationAudiences } from 'shared/hooks/usePresentationAudiences';\nimport { useVideoMixin } from 'shared/hooks/useVideoMixin';\nimport { InteractiveHelpers } from 'shared/utils/InteractiveHelper';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { useFetchAllChildFolders } from 'apps/libraries/hooks/UseFetchAllChildFolders';\nimport { MyVideosRequests } from 'apps/my-videos/flight-requests/MyVideosRequests';\nimport { useDragDropMove } from 'apps/my-videos/hooks/useDragDropMove';\nimport { useUploadItems } from 'apps/my-videos/hooks/useUploadItems';\nimport { useGetFolderActions } from 'apps/my-videos/utils/getFolderActions';\nimport { MyVideosEmptyState, MyVideosPublicEmptyState } from 'apps/my-videos/views/my-videos/empty-state/MyVideosEmptyState';\nimport { useMyVideosViewActions, useMyVideosViewBulkActions } from 'apps/my-videos/views/my-videos/MyVideosViewUtils';\nimport { SeriesAppLinkHelper } from 'apps/series/SeriesAppLinkHelper';\nimport { UploadFileSelect } from 'apps/upload/components/upload-file-select/UploadFileSelect';\nimport { UploadingItem } from 'apps/upload/components/uploading-item/UploadingItem';\n\nimport styles from './my-videos.scss';\n\nconst namespace = 'default.myVideos';\n\ninterface MyVideosViewProps {\n cursor?: string;\n previous?: string;\n typeFilter?: SearchIndices[];\n}\n\nexport function MyVideosView(props: MyVideosViewProps): JSX.Element {\n useSetPageMetadata({ title: LanguageService.getPhrase(namespace, 'pageTitle') });\n\n const dispatch = useDispatch();\n const { setFavourite, canFavourite } = useLiteFavourites(LocationContext.VideoThumbnail);\n const { hasPermissions, hasLocalPermissions } = usePermissions();\n const { handleDragEnd } = useDragDropMove();\n const { isPlugin } = usePluginHelper();\n\n const { focusSearchBar } = useFocusSearchBar();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const workspace = Flight.useBasicFetch<Library>(\n currentUser.data?.isAuthenticated && UserRequests.workspace()\n );\n const folderId = workspace.data?.categoryTree?.id;\n const folders = useFetchAllChildFolders(folderId);\n \n const videoActions = useMyVideosViewActions();\n const getVideosAction = useMyVideosViewBulkActions(workspace.data?.id, workspace.data?.categoryTree.id);\n\n const audiences = usePresentationAudiences();\n const getFolderActions = useGetFolderActions();\n\n const getMyVideosRequest = (cursor?: string, typeFilter?: SearchIndices | SearchIndices[]) => {\n if (!workspace.data)\n return null;\n\n // Delete the above when master supports the new assoc types.\n return MyVideosRequests.videos(folderId, cursor, typeFilter);\n };\n\n const fetchNext = (cursor?: string, typeFilter?: SearchIndices | SearchIndices[]) => {\n return Flight.getFetch(dispatch)(getMyVideosRequest(cursor, typeFilter));\n };\n\n const shouldFetch = !hasLocalPermissions(LocalPermissionName.ViewMyVideosLanding) && currentUser.hasCompleted;\n\n const videos = Flight.useBasicFetch<BasePaginatedCollection<VideoTypes>>(\n shouldFetch && getMyVideosRequest(props.cursor, props.typeFilter)\n );\n\n useHandleObjectError(videos);\n\n const {\n uploadingVideos,\n onClickAlternate,\n onClickDelete,\n processingIds\n } = useUploadItems({ onRemove: fetchNext });\n\n const omittedVideos = videos.data?.data?.filter(v => !processingIds[v.id]);\n \n useVideoMixin(omittedVideos?.filter(VideoHelper.isVideo));\n\n const CheckboxHelper: BulkCheckboxManager = useBulkCheckboxManager(omittedVideos);\n\n if (hasLocalPermissions(LocalPermissionName.ViewMyVideosLanding))\n return <MyVideosPublicEmptyState />;\n\n function getMyVideosAppLink(): Core.AppLink {\n return {\n action: Actions.MyVideos.MY_VIDEOS,\n application: AppChannels.MY_VIDEOS,\n params: { cursor: props.cursor, previous: props.previous, type: props.typeFilter }\n };\n }\n\n function getCursors(): Cursors {\n return { next: videos.data.pagination.cursors.next, previous: props.cursor };\n }\n \n return (\n <VideoActionsContext.Provider value={videoActions}>\n <div className='px-3'>\n <UpgradeFeedbackBanner />\n <div className='d-flex justify-content-between'>\n <h1 className='h2 mb-0'><Text namespace={namespace} phrase='header' /></h1>\n <div>\n <div className='d-sm-none'>\n <UploadFileSelect canUpload={hasPermissions(PermissionName.UploadVideo)} />\n </div>\n <div className='ms-2 d-sm-inline-block d-none'>\n <IconButton\n svgName={cvSvgLibrary.Search}\n appLink={{\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n params: {\n source: SourceFilterOptions.MyVideos\n }\n }}\n className='btn btn-outline-dark me-2'\n onClick={focusSearchBar}\n analyticsData={{}}\n analyticsOptions={{\n entity: EntityType.SearchResults,\n location: LocationContext.MyVideos,\n actionType: UserAction.Click,\n descriptor: SearchSourceDescriptor.MyVideos\n }}\n >\n <Text namespace={namespace} phrase='searchMyVideos' />\n </IconButton>\n <IconButton\n svgName={cvSvgLibrary.Plus}\n appLink={{\n application: AppChannels.MY_VIDEOS,\n action: Actions.MyVideos.ADD_FOLDER,\n args: [workspace.data?.id]\n }}\n className='btn btn-outline-dark'\n >\n <Text namespace={namespace} phrase='addFolder' />\n </IconButton>\n </div>\n </div>\n </div>\n <hr />\n <DragDropMoveContext\n handleDragEnd={handleDragEnd}\n dragOverlayComponent={DragDropOverlay}\n source={workspace.data}>\n <div>\n {!folders?.hasCompleted && <PartialFolderList />}\n {!!folders?.items?.length &&\n <div className='mx-n2'>\n <FolderList\n folders={folders.items}\n getAppLink={(f: Folder) => ({\n application: AppChannels.MY_VIDEOS,\n action: Actions.MyVideos.MY_VIDEOS_FOLDER,\n args: [ f.id, TextHelper.slugify(f.name) ]\n })}\n expandFolders={false}\n getFolderActions={f => getFolderActions('folder', f)}\n drag\n drop\n />\n </div>\n }\n <VideoListActions\n allowBulkAction\n allowFilter\n checkboxHelper={CheckboxHelper}\n getVideosBulkAction={getVideosAction}\n locationContext={LocationContext.MyVideos}\n typeFilter={props.typeFilter}\n getAppLink={() => getMyVideosAppLink()}\n />\n {!!uploadingVideos?.length && (\n <div className={`position-relative ${styles.uploadingList}`}>\n {uploadingVideos.map(uploadingVideo => (\n <UploadingItem\n item={uploadingVideo}\n onClickAlternate={onClickAlternate}\n onClickDelete={onClickDelete}\n key={uploadingVideo.id}\n allowBulkAction\n />\n ))}\n </div>\n )}\n {(() => {\n if (!currentUser.data || !videos.data)\n return <div className='mx-n2'><PartialVideoList allowBulkActions /></div>;\n\n if (!omittedVideos.length && !uploadingVideos.length)\n return <MyVideosEmptyState />;\n\n return (\n <>\n <VideoList\n videos={omittedVideos}\n yearGroups={yearGroups.data}\n getVideoAppLink={VideoAppLinkHelper.getAppLink}\n getSubTextAppLink={video => SeriesAppLinkHelper.getSeriesAppLink(video.series)}\n setFavourite={setFavourite}\n canFavourite={canFavourite}\n presentationAudiences={audiences.data}\n canRemovePrivateVideos\n allowBulkAction\n getVideosBulkAction={getVideosAction}\n typeFilter={props.typeFilter}\n checkboxHelper={CheckboxHelper}\n hasPermissions={hasPermissions}\n drag\n imageCdnUrl={config.data?.imageCdnUrl}\n getPreviewQuestionsAppLink={interactive =>\n InteractiveHelpers.getPreviewQuestionsAppLink(interactive)}\n isPlugin={isPlugin}\n getClassroomGuideAppLink={VideoAppLinkHelper.getClassroomGuideAppLink}\n getInteractiveGuidanceAppLink={VideoAppLinkHelper.getInteractiveGuidanceAppLink}\n getResourceGuidanceAppLink={VideoAppLinkHelper.getResourceGuidanceAppLink}\n />\n {!!videos.data?.pagination?.cursors && (\n <Pagination\n appLink={getMyVideosAppLink()}\n cursors={getCursors()}\n buttonVariant='outline-dark'\n className='py-2 float-end'\n scrollTop\n prevHack\n />\n )}\n </>\n );\n })()}\n </div>\n </DragDropMoveContext>\n </div>\n </VideoActionsContext.Provider>\n );\n}\n","import React from 'react';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { useLiteUpgrade } from 'libs/shared/hooks/UseLiteUpgrade';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.upgradeFeedbackBanner';\n\nexport function UpgradeFeedbackBanner(): JSX.Element {\n const { showFeedbackBanner, dismissFeedbackBanner } = useLiteUpgrade();\n\n if (!showFeedbackBanner)\n return <></>;\n\n return (\n <div className='alert bg-light-blue p-2 rounded text-info fw-semibold d-flex justify-content-between align-items-center'>\n <Text\n namespace={namespace}\n phrase='message'\n options={{ url: 'https://www.clickvieweducation.com/en-au/blog/product/exchange-tv-new-look' }}\n />\n <DivButton\n onClick={dismissFeedbackBanner}\n >\n <SvgContainer\n svgName={cvSvgLibrary.Close}\n className='ms-2 svg-container'\n />\n </DivButton>\n </div>\n );\n}","import React from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { CurrentUser, Video, VideoCollection } from 'libs/shared/interfaces';\n\ninterface VideoMixinOptions {\n /**\n * If the videos that are having new data mixed into are sitting on an explicit Flight namespace,\n * providing that namespace here is required\n */\n flightNamespace?: string;\n}\n\nexport function useVideoMixin(videos: VideoCollection | Video[], options: VideoMixinOptions = {}): void {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const hydratedVideos = React.useRef<Set<string>>(new Set<string>());\n\n const videoIds = videos && (Array.isArray(videos)\n ? videos.filter(Boolean).map(v => v.id)\n : videos.data.filter(Boolean).map(v => v.id));\n\n const [ request, setRequest ] = React.useState<Flight.Request[]>([]);\n\n React.useEffect(() => {\n if (!videoIds?.length || !currentUser.hasCompleted)\n return;\n\n const unhydratedVideos: string[] = [];\n\n videoIds.forEach(id => {\n if (!hydratedVideos.current.has(id)) {\n unhydratedVideos.push(id);\n hydratedVideos.current.add(id);\n }\n });\n \n if (!unhydratedVideos.length)\n return;\n\n setRequest(r => {\n const newRequests = [\n ...r,\n VideoRequests.videoMixinAssocs(unhydratedVideos, options.flightNamespace)\n ];\n\n if (currentUser.data?.isAuthenticated)\n newRequests.push(ClassificationRequests.hasCurriculumLinks(unhydratedVideos, null, options.flightNamespace));\n\n return newRequests;\n });\n }, [ videoIds?.length, currentUser.hasCompleted ]);\n\n Flight.useBasicFetchAll(request);\n}"],"names":["namespace","MyVideosView","props","useSetPageMetadata","title","LanguageService","dispatch","useLiteFavourites","u","setFavourite","canFavourite","usePermissions","hasPermissions","hasLocalPermissions","handleDragEnd","useDragDropMove","isPlugin","usePluginHelper","focusSearchBar","currentUser","UserRequests","yearGroups","data","isAuthenticated","CustomerRequests","customerId","config","ConfigRequests","workspace","folderId","categoryTree","id","folders","videoActions","getVideosAction","audiences","usePresentationAudiences","getMyVideosRequest","cursor","typeFilter","MyVideosRequests","shouldFetch","hasCompleted","videos","useUploadItems","onRemove","uploadingVideos","onClickAlternate","onClickDelete","processingIds","omittedVideos","filter","v","useVideoMixin","VideoHelper","CheckboxHelper","useBulkCheckboxManager","getMyVideosAppLink","action","application","params","previous","type","VideoActionsContext","value","className","UpgradeFeedbackBanner","Text","phrase","UploadFileSelect","canUpload","PermissionName","IconButton","svgName","appLink","source","onClick","analyticsData","analyticsOptions","entity","location","actionType","descriptor","args","DragDropMoveContext","dragOverlayComponent","DragDropOverlay","PartialFolderList","items","length","FolderList","getAppLink","f","TextHelper","name","expandFolders","getFolderActions","drag","drop","VideoListActions","allowBulkAction","allowFilter","checkboxHelper","getVideosBulkAction","locationContext","map","uploadingVideo","UploadingItem","item","key","VideoList","getVideoAppLink","VideoAppLinkHelper","getSubTextAppLink","video","SeriesAppLinkHelper","series","presentationAudiences","canRemovePrivateVideos","imageCdnUrl","getPreviewQuestionsAppLink","interactive","InteractiveHelper","getClassroomGuideAppLink","getInteractiveGuidanceAppLink","getResourceGuidanceAppLink","pagination","cursors","Pagination","next","buttonVariant","scrollTop","prevHack","MyVideosEmptyState","PartialVideoList","allowBulkActions","showFeedbackBanner","dismissFeedbackBanner","options","url","hydratedVideos","Set","videoIds","Array","isArray","Boolean","request","setRequest","unhydratedVideos","forEach","current","has","push","add","r","newRequests","flightNamespace"],"sourceRoot":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/6263-0be2ae1ab4-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/common/src/react/utils/PortalHelper.ts","file:///app/packages/libs/shared/src/apps/calendar/components/coming-soon-tag/coming-soon-tag.scss","file:///app/packages/libs/shared/src/apps/calendar/components/coming-soon-tag/ComingSoonTag.tsx","file:///app/packages/libs/shared/src/apps/calendar/components/generic-calendar-date/generic-calendar-date.scss","file:///app/packages/libs/shared/src/apps/calendar/components/generic-calendar-date/GenericCalendarDate.tsx","file:///app/packages/libs/shared/src/components/back-button/BackButton.tsx","file:///app/packages/libs/shared/src/components/banner-header/banner-header.scss","file:///app/packages/libs/shared/src/components/banner-header/BannerHeader.tsx","file:///app/packages/libs/shared/src/components/breadcrumbs/Breadcrumbs.tsx","file:///app/packages/libs/shared/src/components/infinite-scroll-footer/infinite-scroll-footer.scss","file:///app/packages/libs/shared/src/components/infinite-scroll-footer/InfiniteScrollFooter.tsx","file:///app/packages/libs/shared/src/components/video-list/partial-loading/partial-video-list.scss","file:///app/packages/libs/shared/src/components/video-list/partial-loading/PartialVideoList.tsx","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/UseInfiniteScroll.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteList.ts","file:///app/packages/libs/shared/src/utils/PartialLoadingHelper.ts","file:///app/packages/libs/shared/src/apps/playlists/utils/PlaylistHelper.ts","file:///app/packages/libs/shared/src/apps/playlists/components/playlist-header-details/PlaylistHeaderDetails.tsx","file:///app/packages/projects/lite/src/apps/playlists/components/playlist-header/partial-loading/partial-playlist-header.scss","file:///app/packages/projects/lite/src/apps/playlists/components/playlist-header/partial-loading/PartialPlaylistHeader.tsx","file:///app/packages/projects/lite/src/apps/playlists/components/playlist-header/PlaylistHeaderUtils.ts","file:///app/packages/projects/lite/src/apps/playlists/components/playlist-header/playlist-header.scss","file:///app/packages/projects/lite/src/apps/playlists/components/playlist-header/PlaylistHeader.tsx","file:///app/packages/projects/lite/src/apps/playlists/components/video-list/SortableVideoListContainer.tsx","file:///app/packages/projects/lite/src/apps/playlists/views/playlist/empty-state/PlaylistEmptyState.tsx","file:///app/packages/projects/lite/src/apps/playlists/views/playlist/PlaylistViewUtils.ts","file:///app/packages/projects/lite/src/apps/playlists/views/playlist/PlaylistView.tsx","file:///app/packages/libs/shared/src/hooks/UseReorderedItems.ts","file:///app/packages/projects/lite/src/shared/hooks/useVideoMixin.ts"],"sourcesContent":["import React from 'react';\nimport { createPortal } from 'react-dom';\n\nexport const PortalHelper = {\n renderInPortalIfExists(component: React.ReactElement, portalContainer: Element | null): React.ReactElement {\n if (portalContainer)\n return createPortal(component, portalContainer);\n\n return component;\n }\n};","// extracted by mini-css-extract-plugin\nexport default {\"tag\":\"XRj8d\",\"tooltip\":\"X6mLk\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './coming-soon-tag.scss';\n\nconst namespace = 'specialEventCalendar.comingSoonTag';\n\ninterface ComingSoonProps {\n className?: string;\n onlyIcon?: boolean;\n}\n\nexport function ComingSoonTag(props: ComingSoonProps): JSX.Element {\n return (\n <Tooltip title={LanguageService.getPhrase(namespace, 'tooltip')} spanHackClassName={`d-block ${styles.tooltip}`} spanHack>\n <div className={`d-flex text-dark align-items-center ${styles.tag} ${props.className}`}>\n <SvgContainer svgName={cvSvgLibrary.Timer} />\n {!props.onlyIcon && LanguageService.getPhrase(namespace, 'comingSoon')}\n </div>\n </Tooltip>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"dateItem\":\"I3SBm\",\"label\":\"PRORs\",\"body\":\"RfiM_\",\"bodyDay\":\"ZOVny\",\"bodyRange\":\"vYhXN\",\"bodyMonth\":\"mYslO\",\"month\":\"EPkkQ\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { CalendarTheme } from 'libs/shared/apps/calendar/interfaces/CalendarTheme';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\n\nimport styles from './generic-calendar-date.scss';\n\nexport interface GenericCalendarDateProps {\n label?: string;\n body: {\n type: 'month' | 'range' | 'day';\n text: string;\n };\n month?: string;\n getAppLink?: () => Core.AppLink;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n className?: string;\n theme?: CalendarTheme;\n}\n\nexport function GenericCalendarDate(props: GenericCalendarDateProps): JSX.Element {\n function getBodyClass(): string {\n switch (props.body.type) {\n case 'range':\n return styles.bodyRange;\n case 'day':\n return styles.bodyDay;\n case 'month':\n return styles.bodyMonth;\n }\n }\n\n return (\n <AppLink\n appLink={props.getAppLink?.()}\n className={`text-decoration-none text-center bg-white text-dark border border-3 ${props.theme?.border} rounded-3 d-block fw-semibold ${props.className}`}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n >\n <div className={`position-relative ${styles.dateItem}`}>\n <div className={`${props.theme?.background} py-1 ${styles.label} d-flex align-items-center justify-content-center`}>\n {props.label ? props.label : <> </>}\n </div>\n <div className={`${getBodyClass()} ${styles.body} my-2`}>\n {props.body.text}\n </div>\n <div className={`mb-0 ${styles.month}`}>\n {props.month}\n </div>\n </div>\n </AppLink>\n );\n}","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.backButton';\n\ninterface BackButtonProps {\n appLink: Core.AppLink;\n backToName?: string;\n color?: 'black' | 'white';\n extraClasses?: string;\n /**\n * Whether or not the button text has a text shadow. Defaults to true\n */\n textShadow?: boolean;\n}\n\nBackButton.defaultProps = {\n color: 'black',\n extraClasses: ''\n};\n\nexport function BackButton(props: BackButtonProps): React.ReactElement {\n const { backToName, appLink, color, extraClasses, textShadow } = {\n textShadow: true,\n ...props\n };\n\n const backPhrase = backToName\n ? LanguageService.getPhrase(namespace, 'backTo', { backToName })\n : LanguageService.getPhrase(namespace, 'back');\n\n const colorClass = color === 'black' ? '' : 'text-white';\n const textShadowClass = textShadow ? 'text-shadow' : '';\n\n return (\n <AppLink\n appLink={appLink}\n className={`d-inline-flex align-items-center h5 mb-0 ${extraClasses} ${colorClass} ${textShadowClass}`}\n >\n <SvgContainer svgName={cvSvgLibrary.ChevronLeft} size={SvgContainerSize.Medium} />\n <span className='ms-1'>{backPhrase}</span>\n </AppLink>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"bannerContent\":\"sSCTB\",\"actionsContainer\":\"Z5WI2\",\"bannerContentWithLogo\":\"rgs7Q\",\"container\":\"M51HJ\",\"logoContainer\":\"vkeJk\",\"logoContainerLeft\":\"M3U9B\",\"logoHeading\":\"EtRwC\",\"specialEventContainer\":\"rOxDc\",\"headingLarge\":\"_8pnV\",\"heading\":\"JXVBH\"};","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\nimport { PortalHelper } from 'libs/common/react/utils/PortalHelper';\n\nimport { ComingSoonTag } from 'libs/shared/apps/calendar/components/coming-soon-tag/ComingSoonTag';\nimport { GenericCalendarDate } from 'libs/shared/apps/calendar/components/generic-calendar-date/GenericCalendarDate';\nimport { CalendarTheme } from 'libs/shared/apps/calendar/interfaces/CalendarTheme';\nimport { ActionOptions, Actions } from 'libs/shared/components/actions/Actions';\nimport { BackButton } from 'libs/shared/components/back-button/BackButton';\nimport { LazyImage } from 'libs/shared/components/lazy-image/LazyImage';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ImageMinDimensions } from 'libs/shared/constants/ImageSizes';\nimport { BannerPortalContext } from 'libs/shared/context/BannerPortalContext';\nimport { ImageSize, ImageType, ResizeType } from 'libs/shared/enums/Images';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Banner, CalendarEvent, Logo } from 'libs/shared/interfaces';\nimport { ImageHelper, ImageOptions } from 'libs/shared/utils/ImageHelper';\n\nimport styles from './banner-header.scss';\n\nconst RATIO = `${ImageMinDimensions[ImageType.Banners].width}:${ImageMinDimensions[ImageType.Banners].height}`;\nconst DEFAULT_WIDTH = 1200; // This is ImageSize.Large for a Banner.\nconst LARGE_SCREEN_WIDTH = 1920;\n\nfunction useGetImageWidth(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xxl)\n return LARGE_SCREEN_WIDTH;\n\n return DEFAULT_WIDTH;\n}\n\nfunction getSizeClass(heading: string): string {\n if (heading.length < 160)\n return 'h1';\n\n return styles.headingLarge;\n}\n\ninterface BannerHeaderProps {\n heading: string;\n banner?: Banner;\n bannerClassName?: string;\n imageCdnUrl?: string;\n logo?: Logo;\n actions?: ActionOptions[];\n specialEvent?: CalendarEvent;\n backButtonAppLink?: Core.AppLink;\n backButtonText?: string;\n backButtonClasses?: string;\n sortComponent?: JSX.Element;\n blockColourClass?: string;\n actionsDropdownClassName?: string;\n detailsComponent?: () => React.ReactElement;\n imageOptions?: ImageOptions;\n showComingSoon?: boolean;\n alignLogoLeft?: boolean;\n calendarTheme?: CalendarTheme;\n}\n\nconst namespace = 'shared.bannerHeader';\n\nexport const BannerHeader = React.memo(function(props: React.PropsWithChildren<BannerHeaderProps>): React.ReactElement {\n const { heading, banner, imageCdnUrl, actions, sortComponent, blockColourClass, specialEvent } = props;\n\n const portalContainerContext = React.useContext(BannerPortalContext);\n\n const imageWidth = useGetImageWidth();\n\n const specialEventIsToday = React.useMemo(() => {\n if (!specialEvent || props.showComingSoon)\n return false;\n\n const today = DateHelper.format(new Date(), 'YYYY-MM-DD');\n\n if (!specialEvent.endDate)\n return specialEvent.startDate === today;\n\n return specialEvent.startDate <= today && specialEvent.endDate >= today;\n }, [specialEvent]);\n\n const imageOptions = props.imageOptions || {\n width: imageWidth,\n ratio: RATIO,\n resizeType: ResizeType.Cover\n };\n\n const url = !!banner && !!imageCdnUrl && ImageHelper.createBannerUrl(banner, {\n fallbackBaseUrl: imageCdnUrl,\n fallbackCategoryName: heading,\n type: ImageType.Banners\n }, imageOptions);\n\n const containerProps: React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement> = {\n className: `banner banner-header ${props.bannerClassName}`,\n style: url ? { backgroundImage: `url('${url}')` } : {}\n };\n\n if (!banner && blockColourClass) {\n delete containerProps.style;\n containerProps.className += ` ${blockColourClass}`;\n }\n\n const DetailsComponent = props.detailsComponent;\n\n return PortalHelper.renderInPortalIfExists(\n // \"banner\" is used in playlists in Online. banner-header is used by all other projects\n <header {...containerProps}>\n <div className={`container ${styles.container} position-relative inner-banner`}>\n {props.backButtonAppLink && (\n <div className='pt-3'>\n <BackButton\n appLink={props.backButtonAppLink}\n backToName={props.backButtonText}\n extraClasses={props.backButtonClasses}\n color='white'\n />\n </div>\n )}\n \n <div className={`${props.alignLogoLeft ? 'position-absolute top-50 start-0 translate-middle-y w-100 ps-4' : `${styles.bannerContent} px-2 ${props.logo?.url ? styles.bannerContentWithLogo : ''}`}`}>\n {!!specialEvent && (\n <div className={`position-relative ${styles.specialEventContainer}`}>\n <GenericCalendarDate\n body={{\n type: specialEvent.endDate ? 'range' : 'day',\n text: specialEvent.endDate\n ? `${DateHelper.format(specialEvent.startDate, 'DD')}-${DateHelper.format(specialEvent.endDate, 'DD')}`\n : DateHelper.format(specialEvent.startDate, 'DD')\n }}\n month={DateHelper.format(specialEvent.startDate, 'MMMM')}\n theme={props.calendarTheme}\n />\n </div>\n )}\n <div>\n {specialEventIsToday && (\n <div className='rounded-pill py-1 px-2 my-1 me-1 fw-semibold bg-light-blue lh-1 d-inline-block'>\n <Text namespace={namespace} phrase='onToday' />\n </div>\n )}\n {props.showComingSoon && (\n <ComingSoonTag className='pe-2 fw-semibold mb-1 rounded-pill justify-content-start text-nowrap' />\n )}\n <div className='d-flex align-items-center'>\n {props.alignLogoLeft &&\n <div className={`${styles.logoContainerLeft} d-none d-md-block partial-loading-background rounded-circle overflow-hidden me-3`}>\n {props.logo?.url &&\n <LazyImage src={ImageHelper.createUrl(props.logo?.url, { size: ImageSize.Small })} />}\n </div>\n }\n <h1 className={`text-white text-shadow pe-3 ${styles.heading} ${getSizeClass(heading)} ${props.alignLogoLeft ? 'w-50' : ''}`}>\n {heading}\n {DetailsComponent && <DetailsComponent />}\n </h1>\n </div>\n </div>\n {!!actions && (\n <div className={styles.actionsContainer}>\n <Actions\n actions={actions}\n sortComponent={sortComponent}\n actionsDropdownClassName={props.actionsDropdownClassName}\n />\n </div>\n )}\n </div>\n {!props.alignLogoLeft && !!props.logo?.url &&\n <div className={styles.logoContainer}>\n <img\n src={ImageHelper.createUrl(props.logo.url, { size: ImageSize.Small })}\n className='rounded-circle'\n />\n </div>\n }\n </div>\n </header>,\n portalContainerContext?.container\n );\n}, (prevProps, nextProps): boolean => (\n prevProps.actions === nextProps.actions\n && prevProps.heading === nextProps.heading\n && prevProps.logo?.url === nextProps.logo?.url\n));\n\nexport function PartialBannerHeader(): JSX.Element {\n const portalContainerContext = React.useContext(BannerPortalContext);\n\n return PortalHelper.renderInPortalIfExists(\n <div className={`partial-banner partial-loading-background ${styles.banner}`} />,\n portalContainerContext?.container\n );\n}","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { PartialLoadingHelper } from 'libs/shared/utils/PartialLoadingHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { SvgContainer, SvgContainerSize } from '../svg-container/SvgContainer';\n\nexport interface Breadcrumb {\n name: string;\n appLink?: Core.AppLink;\n active?: boolean;\n}\n\ninterface BreadcrumbItemProps {\n breadcrumb: Breadcrumb;\n withBackIcon?: boolean;\n}\n\nexport const BreadcrumbItem = ({ breadcrumb: { name, appLink, active }, withBackIcon }: BreadcrumbItemProps) => (\n <li className={`breadcrumb-item${active ? ' active' : ''}`}>\n {active\n ? <strong>{name}</strong>\n : <AppLink appLink={appLink}>\n {withBackIcon && <SvgContainer svgName={cvSvgLibrary.ChevronLeft} size={SvgContainerSize.Small} />}\n <span className={withBackIcon ? 'ms-2' : ''}>{name}</span>\n </AppLink>\n }\n </li>\n);\n\ninterface BreadcrumbsProps {\n breadcrumbs: Breadcrumb[];\n}\n\nexport const Breadcrumbs = ({ breadcrumbs }: BreadcrumbsProps) => {\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n\n const length = breadcrumbs?.length;\n\n if (!length || (isMobile && length < 2))\n return <></>;\n\n if (isMobile)\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n <BreadcrumbItem breadcrumb={breadcrumbs[length - 2]} withBackIcon />\n </ol>\n </nav>\n );\n\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n {breadcrumbs.map((b, idx) => <BreadcrumbItem key={idx} breadcrumb={b} />)}\n </ol>\n </nav>\n );\n};\n\nexport const PartialBreadcrumbs = React.memo(function({ numItems = 3 }: { numItems?: number; }) {\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n\n if (isMobile) {\n return (\n <div className='partial-loading-background' style={{ height: '1.3125rem', width: '6rem' }} />\n );\n }\n\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n {PartialLoadingHelper.getPartialLoadingItems({ numItems }).map(({ width }, idx) => (\n <li key={idx} className='breadcrumb-item'>\n <span className='d-inline-block partial-loading-background' style={{ width }} dangerouslySetInnerHTML={{ __html: ' ' }} />\n </li>\n ))}\n </ol>\n </nav>\n );\n});","// extracted by mini-css-extract-plugin\nexport default {\"container\":\"VwD1b\",\"spinner\":\"eJ85e\"};","import * as React from 'react';\nimport { Spinner } from 'react-bootstrap';\nimport { useInView } from 'react-intersection-observer';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './infinite-scroll-footer.scss';\n\ninterface InfiniteScrollFooterProps {\n isFetching: boolean;\n fetchNext?: (nextCursor: string) => void;\n nextCursor?: string;\n fetchOnScroll?: boolean;\n}\n\nInfiniteScrollFooter.defaultProps = {\n fetchOnScroll: false\n};\n\nexport function InfiniteScrollFooter(props: InfiniteScrollFooterProps): React.ReactElement {\n const [ ref, inView ] = useInView();\n\n React.useEffect(() => {\n if (!props.fetchOnScroll)\n return;\n\n if (!inView || props.isFetching)\n return;\n\n props.fetchNext?.(props.nextCursor);\n }, [ inView, props.isFetching ]);\n\n return (\n <div className={`p-3 text-center ${styles.container}`} ref={ref}>\n {props.isFetching\n ? <Spinner as='span' animation='border' role='status' className={styles.spinner} />\n : (\n <SvgContainer\n svgName={cvSvgLibrary.ChevronDown}\n className='svg-container cursor-pointer'\n size={SvgContainerSize.Large}\n onClick={() => props.fetchNext?.(props.nextCursor)}\n />\n )\n }\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialOptions\":\"Gufgq\",\"partialName\":\"SicQQ\",\"partialDescription\":\"dPGMq\",\"partialThumbnail\":\"vZrnb\",\"partialDragHandle\":\"iq73R\"};","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { VideoListHelper } from 'libs/shared/components/video-list/VideoListHelper';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\n\nimport styles from './partial-video-list.scss';\n\ninterface PartialVideoListProps {\n withReordering?: boolean;\n numVideos?: number;\n allowBulkActions?: boolean;\n}\n\nPartialVideoList.defaultProps = {\n numVideos: 15\n};\n\nexport function PartialVideoList(props: PartialVideoListProps): JSX.Element {\n return (\n <div className='mx-2'>\n {Array(props.numVideos).fill(null).map((_, i) => (\n <div className='d-flex' key={i}>\n {props.allowBulkActions && <div className='form-check pe-3 pe-sm-2 mx-0 mx-md-2' />}\n <PartialVideoItem {...props} />\n </div>\n ))}\n </div>\n );\n}\n\nexport function PartialVideoItem(props: PartialVideoListProps): JSX.Element {\n const breakpoints = useBreakpoints();\n\n const size = VideoListHelper.getSize(breakpoints, 'md');\n const isSmall = size === 'sm';\n\n const withDragHandle = props.withReordering && !breakpoints.xs;\n\n return (\n <Row className={`${isSmall ? '' : 'py-2'} flex-grow-1`}>\n <Col {...VideoListHelper.getThumbnailColumns()} className={`flex-column align-items-flex-start ${isSmall ? `pb-2 pe-1` : 'mb-1 pe-3 pe-md-2'}`}>\n <Row>\n {!!withDragHandle && (\n <div className='d-flex align-items-center justify-content-center col-2'>\n <div className={`partial-loading-background ${styles.partialDragHandle}`} />\n </div>\n )}\n <Col xs={VideoListHelper.getThumbnailColSize(withDragHandle)}>\n <div className={`partial-loading-background ${isSmall ? 'rounded' : 'rounded-3'} ${styles.partialThumbnail}`} />\n </Col>\n </Row>\n </Col>\n <Col {...VideoListHelper.getDetailsColumns()} className={isSmall ? 'pb-2' : 'px-2'}>\n <div className={`partial-loading-background mb-1 ${styles.partialName}`} />\n <div className={`partial-loading-background ${styles.partialDescription}`} />\n </Col>\n </Row>\n );\n}\n\n","import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n}\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 { useEffect } from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst SCROLL_TOLERANCE = 400; // value in px\n\ninterface UseInfiniteScrollOptions {\n fetchNextPage: () => void;\n hasMore: boolean;\n isFetching: boolean;\n scrollContainer?: HTMLElement;\n}\n\nexport function useInfiniteScroll(options: UseInfiniteScrollOptions): void {\n const handleScroll = (): void => {\n if (options.isFetching)\n return;\n\n if (!options.scrollContainer) {\n const currentScrollHeight = window.innerHeight + document.documentElement.scrollTop;\n \n const totalHeight = document.documentElement.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n } else {\n const { scrollContainer } = options;\n const currentScrollHeight = scrollContainer.getBoundingClientRect().height + scrollContainer.scrollTop;\n \n const totalHeight = scrollContainer.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n }\n\n options.fetchNextPage();\n };\n\n useEffect(() => {\n const onScroll = FunctionHelper.throttle(handleScroll, 200);\n\n const scrollContainer = options.scrollContainer || window;\n\n if (options.hasMore)\n scrollContainer.addEventListener('scroll', onScroll);\n\n return () => scrollContainer.removeEventListener('scroll', onScroll);\n }, [ options.hasMore, options.fetchNextPage, options.scrollContainer ]);\n}","import { useEffect, useState } from 'react';\n\nimport { HttpStatus, HttpStatusClass } from 'libs/common/backbone/enums/HttpStatus';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { BaseObject, BasePaginatedCollection } from 'libs/shared/interfaces';\n\nimport { useInfiniteScroll } from './UseInfiniteScroll';\nimport { useSelectAllPages } from './UseSelectAllPages';\n\nexport interface UseInfiniteListResult<T extends BaseObject> {\n items: T[];\n hasMore: boolean;\n isFetching: boolean;\n nextCursor: string;\n totalItems?: number;\n hasFirstPageCompleted: boolean;\n}\n\n/**\n * Hook to extract an infinite list from the application state,\n * save it locally in state and only update when new data\n * is fetched.\n * \n * @param getRequest - callback function to get the request for each page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n * \n * @param fetchNext - callback function to fetch a page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n */\nexport function useInfiniteList<TObject = BaseObject, TResponse = BasePaginatedCollection<TObject>>(\n getRequest: ((cursor?: string) => Flight.Request) | false,\n fetchNext: ((cursor?: string) => void) | false,\n onError?: (pageNumber: number, statusCode: HttpStatus) => void,\n getItems?: (responseData: TResponse) => TObject[],\n getCursor?: (responseData: TResponse) => string,\n scrollContainer?: HTMLElement\n): UseInfiniteListResult<TObject> {\n const [ pagesFetched, setPagesFetched ] = useState(0);\n\n const fetchNextFn = fetchNext as (cursor?: string) => void;\n\n function getKey(cursor?: string): string {\n if (!getRequest)\n return null;\n\n const request = getRequest(cursor);\n\n if (!request)\n return null;\n\n return request.key;\n }\n\n const response = useSelectAllPages<TObject, TResponse>(\n getKey,\n getItems,\n getCursor\n );\n\n function fetchNextPage(): void {\n if (!fetchNext || !getRequest || !response)\n return;\n\n setPagesFetched(currentVal => currentVal + 1);\n return fetchNextFn(response.nextCursor);\n }\n\n useInfiniteScroll({\n fetchNextPage,\n hasMore: !!response?.nextCursor,\n isFetching: response?.isFetching,\n scrollContainer\n });\n\n useEffect(() => {\n if (!response)\n return;\n\n if (response.shouldInitialFetch && fetchNext) {\n fetchNextFn();\n setPagesFetched(currentVal => currentVal + 1);\n }\n }, [ response?.shouldInitialFetch, fetchNext ]);\n\n useEffect(() => {\n if (!response?.statusCode || !FunctionHelper.isFunction(onError))\n return;\n\n const httpStatusClass: HttpStatusClass = +(response.statusCode?.toString()?.substr(0, 1));\n\n if (httpStatusClass !== HttpStatusClass.ClientError && httpStatusClass !== HttpStatusClass.ServerError)\n return;\n\n onError(pagesFetched, response.statusCode);\n }, [response?.statusCode]);\n\n return {\n items: response?.items,\n hasMore: !!response?.nextCursor,\n nextCursor: response?.nextCursor,\n isFetching: response?.isFetching,\n totalItems: response?.totalItems,\n hasFirstPageCompleted: response?.hasFirstPageCompleted\n };\n}","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 { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { BaseObject, CurrentUser, Playlist } from 'libs/shared/interfaces';\n\nexport const PlaylistHelper = {\n isPlaylist(obj: BaseObject): obj is Playlist {\n return obj?.typeId === MasterType.Playlist;\n },\n\n isOwner(playlist: Playlist, currentUser: CurrentUser): boolean {\n if (!currentUser || !playlist || ObjectHelper.isEmpty(playlist._liteOwner))\n return false;\n\n return playlist._liteOwner.id.toString() === currentUser.id?.toString();\n },\n\n getVideoCount(playlist: Playlist): number {\n if (!playlist)\n return;\n\n let count = 0;\n\n if (playlist.videos?.count)\n count += playlist.videos.count;\n\n if (playlist.clips?.count)\n count += playlist.clips.count;\n\n if (playlist.interactives?.count)\n count += playlist.interactives.count;\n\n return count;\n }\n};","import React from 'react';\n\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { PlaylistHelper } from 'libs/shared/apps/playlists/utils/PlaylistHelper';\nimport { ClickViewAvatar } from 'libs/shared/components/clickview-avatar/ClickViewAvatar';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { CurrentUser, Playlist } from 'libs/shared/interfaces';\n\nconst namespace = 'playlists.playlistHeaderDetails';\n\nconst Separator = ({ className }: { className: string }) =>\n <span className={className}>•</span>;\n\nfunction getPlaylistOwnerName(playlist: Playlist): string {\n const { _liteOwner } = playlist;\n\n if (!_liteOwner)\n return;\n\n if (_liteOwner.name && _liteOwner.surname)\n return TextHelper.toTitleCase(_liteOwner.name + ' ' + _liteOwner.surname.substring(0, 1));\n\n if (_liteOwner.name)\n return _liteOwner.name.split(' ')[0];\n}\n\nfunction getLastUpdated(playlist: Playlist): string {\n if (!playlist.contentModifiedDate)\n return '';\n\n const now = new Date();\n const lastUpdated = DateHelper.convertUTCToLocal(playlist.contentModifiedDate);\n\n // Don't show if last updated over a month ago\n if (DateHelper.isBefore(lastUpdated, DateHelper.subtract(now, 1, 'month')))\n return '';\n\n return DateHelper.fromNow(lastUpdated);\n}\n\ninterface PlaylistHeaderDetailsProps {\n playlist: Playlist;\n currentUser: CurrentUser;\n totalVideos: number;\n \n hideOwnerName?: boolean;\n\n // Custom classes for everything as online and lite use different styles\n detailsClassName: string;\n clickViewAvatarClassName: string;\n separatorClassName: string;\n}\n\nexport function PlaylistHeaderDetails(props: PlaylistHeaderDetailsProps): React.ReactElement {\n const currentUserIsOwner = PlaylistHelper.isOwner(props.playlist, props.currentUser);\n\n const followerCount = props.playlist.followers?.count;\n\n const lastUpdated = getLastUpdated(props.playlist);\n\n return (\n <div className={props.detailsClassName}>\n {/* Owner name */}\n {(!props.hideOwnerName && !currentUserIsOwner) && (\n <>\n {props.playlist._isClickViewCurated?.value ? (\n <>\n <div className={props.clickViewAvatarClassName}>\n <ClickViewAvatar />\n </div>\n <span>ClickView</span>\n </>\n ) : (\n <Text namespace={namespace} phrase='createdBy' options={{ user: getPlaylistOwnerName(props.playlist) }} />\n )}\n\n <Separator className={props.separatorClassName} />\n </>\n )}\n\n {/* Video count */}\n {typeof props.totalVideos === 'number' && (\n <Text namespace={namespace} phrase='videos' options={{ smartCount: props.totalVideos }} />\n )}\n\n {/* Follower count */}\n {followerCount > 0 && (\n <>\n <Separator className={props.separatorClassName} />\n <Text namespace={namespace} phrase='followers' options={{ smartCount: followerCount }} />\n </>\n )}\n\n {/* Last updated */}\n {!!lastUpdated && (\n <>\n <Separator className={props.separatorClassName} />\n <Text namespace={namespace} phrase='lastUpdated' options={{ timeAgo: lastUpdated }} />\n </>\n )}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialDescription\":\"vDX0m\"};","import React from 'react';\n\nimport { PartialBannerHeader } from 'libs/shared/components/banner-header/BannerHeader';\n\nimport styles from './partial-playlist-header.scss';\n\nexport function PartialPlaylistHeader(): JSX.Element {\n return (\n <>\n <PartialBannerHeader />\n <div className='mb-2'>\n <div className={`partial-loading-background my-2 border-bottom ${styles.partialDescription}`} />\n </div>\n </>\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, EntityType, EventVersion, LocationContext, ToggleDescriptor, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { PlaylistHelper } from 'libs/shared/apps/playlists/utils/PlaylistHelper';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { getOpenInCurationStudioLabel } from 'libs/shared/hooks/useCurationStudio';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { PlaylistHeaderProps } from './PlaylistHeader';\n\nconst namespace = 'playlists.playlistHeader';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface GetPlaylistActionsArgs {\n isAuthenticated: boolean;\n isPlugin: boolean;\n isMobile: boolean;\n setIsFollowing: (val: boolean) => void;\n isFollowing: boolean;\n setShowFollowSpinner: (val: boolean) => void;\n showFollowSpinner: boolean;\n isUserCurator: boolean;\n openInCuratorLink: string;\n}\n\nexport const PlaylistHeaderUtils = {\n getPlaylistActions(headerProps: PlaylistHeaderProps, args: GetPlaylistActionsArgs): ActionOptions[] {\n const {\n isAuthenticated,\n isPlugin,\n isMobile,\n setIsFollowing,\n isFollowing,\n setShowFollowSpinner,\n showFollowSpinner,\n isUserCurator,\n openInCuratorLink\n } = args;\n\n const analyticsData = {\n id: headerProps.playlist.id,\n name: headerProps.playlist.name,\n followerCount: headerProps.playlist.followers?.count,\n videoCount: headerProps.playlist.videos?.count,\n interactiveCount: headerProps.playlist.interactives?.count,\n clipCount: headerProps.playlist.clips?.count,\n isClickViewPlaylist: headerProps.playlist._isClickViewCurated?.value\n };\n\n const analyticsOptions: AnalyticsOptions = {\n location: LocationContext.Banner,\n entity: EntityType.Playlist,\n workflowPhase: WorkflowPhase.Start\n };\n\n const actions: ActionOptions[] = [];\n\n if (!isAuthenticated)\n return actions;\n\n const isOwner = PlaylistHelper.isOwner(headerProps.playlist, headerProps.currentUser);\n\n if (!isPlugin) {\n if (headerProps.playAllAppLink) {\n actions.push({\n label: getPhrase('playAll'),\n appLink: headerProps.playAllAppLink,\n svgName: cvSvgLibrary.Play,\n className: !isMobile ? 'btn btn-outline-dark me-2' : '',\n button: !isMobile,\n analyticsData,\n analyticsOptions: {\n ...analyticsOptions,\n actionType: UserAction.Play\n }\n });\n }\n\n if (isUserCurator)\n actions.push({\n label: getOpenInCurationStudioLabel(),\n href: openInCuratorLink,\n openInNewTab: true\n });\n\n actions.push({\n label: getPhrase('share'),\n appLink: {\n application: AppChannels.DEFAULT,\n action: Actions.Default.SHARE,\n args: [headerProps.playlist.id],\n params: { entityType: 'playlist' }\n },\n svgName: cvSvgLibrary.Share2,\n className: !isMobile ? 'btn btn-outline-dark me-2' : '',\n button: !isMobile,\n analyticsData,\n analyticsOptions: {\n ...analyticsOptions,\n actionType: UserAction.Share,\n eventVersion: EventVersion.V3\n }\n });\n }\n\n if (!isOwner) {\n actions.push({\n label: getPhrase(isFollowing ? 'unfollow' : 'follow'),\n onClick: () => {\n setIsFollowing(!isFollowing);\n setShowFollowSpinner(true);\n headerProps.follow(\n !isFollowing,\n () => {\n setShowFollowSpinner(false);\n AnalyticsHelper.logUserAction(analyticsData, {\n ...analyticsOptions,\n actionType: UserAction.Follow,\n descriptor: isFollowing ? ToggleDescriptor.Off : ToggleDescriptor.On,\n workflowPhase: WorkflowPhase.Complete\n });\n },\n () => {\n setShowFollowSpinner(false);\n setIsFollowing(isFollowing);\n }\n );\n },\n svgName: isFollowing ? cvSvgLibrary.Check : cvSvgLibrary.Bell,\n className: !isMobile\n ? `btn follow-btn btn-${isFollowing ? 'outline-dark' : 'dark'} me-2`\n : '',\n button: !isMobile,\n showSpinner: showFollowSpinner\n });\n }\n\n if (isOwner) {\n actions.push({\n label: getPhrase('edit'),\n appLink: {\n application: AppChannels.PLAYLISTS,\n action: Actions.Playlists.EDIT_PLAYLIST,\n args: [headerProps.playlist.id]\n },\n svgName: cvSvgLibrary.Edit,\n button: false,\n analyticsData,\n analyticsOptions: {\n ...analyticsOptions,\n actionType: UserAction.Edit\n }\n });\n\n actions.push({\n label: getPhrase('delete'),\n appLink: {\n application: AppChannels.PLAYLISTS,\n action: Actions.Playlists.DELETE_PLAYLIST,\n args: [headerProps.playlist.id]\n },\n svgName: cvSvgLibrary.Delete,\n className: 'text-danger',\n button: false,\n analyticsData,\n analyticsOptions: {\n ...analyticsOptions,\n actionType: UserAction.Delete\n }\n });\n }\n\n if (headerProps.playlist._isClickViewCurated?.value) {\n actions.push({\n label: getPhrase('copy'),\n appLink: {\n application: AppChannels.PLAYLISTS,\n action: Actions.Playlists.COPY_PLAYLIST,\n args: [headerProps.playlist.id]\n },\n button: false,\n analyticsData,\n analyticsOptions: {\n ...analyticsOptions,\n actionType: UserAction.Copy\n }\n });\n }\n\n return actions;\n }\n};","// extracted by mini-css-extract-plugin\nexport default {\"clickViewAvatar\":\"PHe9c\"};","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { PlaylistHeaderDetails } from 'libs/shared/apps/playlists/components/playlist-header-details/PlaylistHeaderDetails';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { BannerHeader } from 'libs/shared/components/banner-header/BannerHeader';\nimport { Breadcrumb, Breadcrumbs, PartialBreadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { Classification, CurrentUser, Playlist } from 'libs/shared/interfaces';\nimport { getBgColorClass } from 'libs/shared/utils/getBgColorClass';\n\nimport { usePluginHelper } from 'shared/hooks/use-plugin-helper/usePluginHelper';\n\nimport { PartialPlaylistHeader } from './partial-loading/PartialPlaylistHeader';\nimport { PlaylistHeaderUtils } from './PlaylistHeaderUtils';\n\nimport styles from './playlist-header.scss';\n\nexport interface PlaylistHeaderProps {\n playlist: Playlist;\n currentUser: CurrentUser;\n isFollowing: boolean;\n follow: (shouldFollow: boolean, onSuccess: () => void, onError: () => void) => void;\n imageCdnUrl: string;\n showPartialLoading: boolean;\n playAllAppLink: Core.AppLink;\n isUserCurator: boolean;\n openInCuratorLink: string;\n\n // For breadcrumbs\n getBreadcrumbs: () => Breadcrumb[];\n topicPath: Classification[];\n moviesAndTv: boolean;\n classificationId: string;\n totalVideos: number;\n}\n\nexport function PlaylistHeader(props: PlaylistHeaderProps): JSX.Element {\n const { isPlugin } = usePluginHelper();\n\n // Store isFollowing in local state so that it updates immediately.\n const [ isFollowing, setIsFollowing ] = React.useState(props.isFollowing);\n const [ showFollowSpinner, setShowFollowSpinner ] = React.useState(false);\n\n React.useEffect(() => setIsFollowing(props.isFollowing), [props.isFollowing]);\n\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n\n if (props.showPartialLoading)\n return <PartialPlaylistHeader />;\n\n const description = props.playlist.description;\n\n const actions: ActionOptions[] = PlaylistHeaderUtils.getPlaylistActions(props, {\n isAuthenticated: props.currentUser.isAuthenticated,\n isPlugin,\n isMobile,\n setIsFollowing,\n isFollowing,\n setShowFollowSpinner,\n showFollowSpinner,\n isUserCurator: props.isUserCurator,\n openInCuratorLink: props.openInCuratorLink\n });\n\n return (\n <>\n <BannerHeader\n heading={props.playlist.name}\n banner={props.playlist.banner}\n imageCdnUrl={props.imageCdnUrl}\n actions={actions.length && actions}\n actionsDropdownClassName='btn btn-outline-dark'\n blockColourClass={getBgColorClass(props.playlist.name, BG_COLOUR_CLASS_NAMES)}\n detailsComponent={() => (\n <PlaylistHeaderDetails\n playlist={props.playlist}\n currentUser={props.currentUser}\n detailsClassName='mb-n1 font-size-normal fw-normal mt-1'\n clickViewAvatarClassName={styles.clickViewAvatar}\n separatorClassName='mx-1'\n totalVideos={props.totalVideos}\n />\n )}\n />\n {(!!description || !!props.topicPath?.length || !!props.moviesAndTv) && (\n <div className='border-bottom py-3'>\n {(() => {\n if (!props.classificationId && !props.moviesAndTv)\n return <></>;\n\n if (!props.playlist || (props.classificationId && !props.topicPath))\n return <PartialBreadcrumbs />;\n\n return (\n <div className='pb-2'>\n <Breadcrumbs breadcrumbs={props.getBreadcrumbs()} />\n </div>\n );\n })()}\n {!!description && <p className='mb-0'>{description}</p>}\n </div>\n )}\n </>\n );\n}\n","import * as React from 'react';\nimport { DragEndEvent, DragStartEvent } from '@dnd-kit/core';\n\nimport { DevError } from 'libs/common/backbone/errors/DevError';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Core } from 'libs/common/core';\n\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { PartialVideoList } from 'libs/shared/components/video-list/partial-loading/PartialVideoList';\nimport { SortableVideoList, VideoList, VideoListProps } from 'libs/shared/components/video-list/VideoList';\nimport { YearGroup } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\ninterface SortableVideoListContainerProps extends VideoListProps {\n playlistId: string;\n yearGroups: YearGroup[];\n onSortComplete: (oldIdx: number, newIdx: number) => void;\n onSortStart?: (index: number) => void;\n canEdit?: boolean;\n showPartialLoading?: boolean;\n fetchRestrictions?: () => void;\n showSignIn?: boolean;\n}\n\nexport function SortableVideoListContainer(props: SortableVideoListContainerProps): React.ReactElement {\n const { onSortComplete, onSortStart, showPartialLoading, ...videoListProps } = props;\n\n const [ currentSortingIndex, setCurrentSortingIndex ] = React.useState<number>();\n\n const onSortStartHandler = (event: DragStartEvent) => {\n const index = props.videos.findIndex(v => v.id.toString() === event.active.id.toString());\n\n setCurrentSortingIndex(index);\n\n if (FunctionHelper.isFunction(onSortStart))\n onSortStart(index);\n };\n\n const onSortEnd = (event: DragEndEvent) => {\n setCurrentSortingIndex(null);\n\n const { active, over } = event;\n \n const oldIndex = props.videos.findIndex(v => v.id.toString() === active.id.toString());\n const newIndex = props.videos.findIndex(v => v.id.toString() === over.id.toString());\n\n if (!FunctionHelper.isFunction(onSortComplete)) {\n Core.ErrorHelper.throw(new DevError('An onSortComplete callback function must be passed to SortableVideoListComponent'));\n return;\n }\n \n onSortComplete(oldIndex, newIndex);\n };\n\n if (showPartialLoading)\n return <PartialVideoList withReordering={props.canEdit || props.showIndexes} />;\n\n if (!props.canEdit)\n return <VideoList {...videoListProps} />;\n\n return (\n <SortableVideoList\n {...videoListProps}\n currentSortingIndex={currentSortingIndex}\n onSortStart={onSortStartHandler}\n onSortEnd={onSortEnd}\n dragHandleIcon={cvSvgLibrary.Hamburger}\n dragHandleIconSize={SvgContainerSize.XXL}\n presentationAudiences={props.presentationAudiences}\n />\n );\n}","import React from 'react';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nconst namespace = 'playlists.playlistEmptyState';\n\nexport function PlaylistEmptyState(): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.Playlists.PLAYLIST_VIDEOS} />\n\n <EmptyState.Heading><Text phrase='heading' /></EmptyState.Heading>\n\n <EmptyState.Info><Text phrase='info' /></EmptyState.Info>\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AssocDescriptor, EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { PlaylistHelper } from 'libs/shared/apps/playlists/utils/PlaylistHelper';\nimport { Breadcrumb } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { VideoActionsOptions } from 'libs/shared/context/VideoActionsContext';\nimport { Classification, CurrentUser, Playlist, Presentation, Video, VideoTypes } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { TopicsHelper } from 'libs/shared/utils/topics-helper/TopicsHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { PlaylistNotFoundError } from 'shared/errors/playlists/playlist-not-found/LitePlaylistNotFoundError';\nimport { PlaylistPrivateError } from 'shared/errors/playlists/playlist-private/PlaylistPrivateError';\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\n\nconst getPhrase = LanguageService.encloseNamespace('playlists.playlist');\n\nconst getClassificationAppLink = (classification: Classification, moviesAndTv?: boolean): Core.AppLink => ({\n application: AppChannels.SUBJECT,\n action: Actions.Subjects.CLASSIFICATION,\n args: [ classification.id, TextHelper.slugify(classification.name) ],\n params: { mtv: moviesAndTv ? true : undefined }\n});\n\n/**\n * NOTE:\n * This will be wrong if we increase the playlist limit from 100, or\n * stop fetching all 100 videos at once.\n */\nexport function getLastUpdatedDate(videos: Video[]): string {\n const videoLastUpdatedDates: string[] = videos && videos.length && videos.map(v => v.dateAssociated);\n\n return (videoLastUpdatedDates && videoLastUpdatedDates.length)\n ? ArrayHelper.max<string, number>(videoLastUpdatedDates, (date: string) => new Date(date).getTime())\n : null;\n}\n\nexport function usePlaylistViewVideoActions(\n playlist: Playlist,\n currentUser: CurrentUser,\n shareId: string\n) {\n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem, shareId });\n\n if (!PlaylistHelper.isOwner(playlist, currentUser))\n return videoActions;\n\n const getVideoActions = (video: VideoTypes, options?: VideoActionsOptions) => {\n const { canConsume } = VideoHelper.getCanBeConsumed(video);\n\n const removeFromPlaylistAction = {\n label: getPhrase('removeFromPlaylist'),\n button: false,\n svgName: cvSvgLibrary.Delete,\n appLink: {\n application: AppChannels.PLAYLISTS,\n action: Actions.Playlists.REMOVE_VIDEO_FROM_PLAYLIST,\n args: [ video.id, playlist.id ],\n params: { typeId: video.typeId }\n },\n className: 'text-danger',\n analyticsOptions: {\n entity: EntityType.Video,\n actionType: UserAction.Dissociate,\n location: LocationContext.VideoListItem,\n workflowPhase: WorkflowPhase.Start,\n descriptor: AssocDescriptor.Playlist\n },\n analyticsData: {\n id: video.id,\n playlistId: playlist.id\n },\n group: 'delete'\n };\n\n if (!canConsume)\n return [removeFromPlaylistAction];\n\n return [ ...videoActions.getVideoActions(video, options), removeFromPlaylistAction ];\n };\n\n return {\n ...videoActions,\n getVideoActions\n };\n}\n\nexport function logSortAction(playlistId: string, videoId: string, workflowPhase: WorkflowPhase): void {\n AnalyticsHelper.logUserAction({ id: videoId, playlistId }, {\n location: LocationContext.VideoList,\n entity: EntityType.Video,\n actionType: UserAction.Move,\n workflowPhase\n });\n}\n\nexport const playlistErrors = {\n notFound: PlaylistNotFoundError,\n forbidden: {\n privacy: PlaylistPrivateError\n }\n};\n\ninterface GetPlaylistBreadcrumbsOptions {\n moviesAndTv: boolean;\n topicPath: Classification[];\n presentation: Presentation;\n availablePresentations: Presentation[];\n playlist: Playlist;\n}\n\nexport function getPlaylistBreadcrumbs(options: GetPlaylistBreadcrumbsOptions): Breadcrumb[] {\n const { moviesAndTv, topicPath, presentation, availablePresentations, playlist } = options;\n\n if (moviesAndTv) {\n const breadcrumbs: Breadcrumb[] = [{\n name: getPhrase('moviesAndTv'),\n appLink: {\n application: AppChannels.MOVIES_AND_TV,\n action: Actions.MoviesAndTv.HOME\n }\n }];\n\n topicPath?.slice(1, topicPath.length).forEach(item => {\n breadcrumbs.push({\n name: item.name,\n appLink: getClassificationAppLink(item, true)\n });\n });\n\n breadcrumbs.push({\n name: playlist.name,\n active: true\n });\n\n return breadcrumbs;\n }\n\n const breadcrumbs: Breadcrumb[] = [{\n name: getPhrase('discover'),\n appLink: {\n application: AppChannels.DASHBOARD,\n action: Actions.Dashboard.HOME\n }\n }];\n \n if (topicPath) {\n breadcrumbs.push({\n name: TopicsHelper.getExploreAllTopicsTitle(presentation?.name, availablePresentations?.length),\n appLink: {\n application: AppChannels.SUBJECT,\n action: Actions.Subjects.CLASSIFICATION_ALL,\n params: { presentationId: presentation?.id }\n }\n });\n\n topicPath.slice(1, topicPath.length).forEach(item => {\n breadcrumbs.push({\n name: item.name,\n appLink: getClassificationAppLink(item)\n });\n });\n }\n\n breadcrumbs.push({\n name: playlist.name,\n active: true\n });\n\n return breadcrumbs;\n}","import * as React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\n\nimport { LocationContext, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { PlaylistHelper } from 'libs/shared/apps/playlists/utils/PlaylistHelper';\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { RelatedVideosContext } from 'libs/shared/enums/RelatedVideosContext';\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { PlaylistRequests } from 'libs/shared/flight-requests/PlaylistRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useCurationStudio } from 'libs/shared/hooks/useCurationStudio';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { useInfiniteList } from 'libs/shared/hooks/UseInfiniteList';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useReorderedItems } from 'libs/shared/hooks/UseReorderedItems';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Classification, Config, Following, OnlineCurrentUser, Playlist, Presentation, PresentationAudience, Series, VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\nimport { ReorderHelper } from 'libs/shared/utils/ReorderHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { usePluginHelper } from 'shared/hooks/use-plugin-helper/usePluginHelper';\nimport { useDeepLinks } from 'shared/hooks/useDeepLinks';\nimport { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\nimport { usePresentation } from 'shared/hooks/usePresentation';\nimport { useVideoMixin } from 'shared/hooks/useVideoMixin';\nimport { InteractiveHelpers } from 'shared/utils/InteractiveHelper';\nimport { SeoHelper } from 'shared/utils/SeoHelper';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { PlaylistHeader } from 'apps/playlists/components/playlist-header/PlaylistHeader';\nimport { SortableVideoListContainer } from 'apps/playlists/components/video-list/SortableVideoListContainer';\n\nimport { PlaylistEmptyState } from './empty-state/PlaylistEmptyState';\nimport { getPlaylistBreadcrumbs, logSortAction, playlistErrors, usePlaylistViewVideoActions } from './PlaylistViewUtils';\n\nconst namespace = 'playlists.playlist';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface PlaylistViewProps {\n playlistId: string;\n shareId?: string;\n classificationId?: string;\n getSeriesAppLink: (series: Series) => Core.AppLink;\n moviesAndTv?: boolean;\n}\n\nexport function PlaylistView(props: PlaylistViewProps): React.ReactElement {\n const dispatch = useDispatch();\n const alerts = useAlerts();\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const currentUser = Flight.useBasicFetch<OnlineCurrentUser>(UserRequests.currentUser());\n const { isUserCurator, getOpenInCurationStudioLink } = useCurationStudio();\n const { hasPermissions } = usePermissions();\n const { isPlugin } = usePluginHelper();\n\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const topicPath = Flight.useBasicFetch<Classification[]>(\n props.classificationId &&\n ClassificationRequests.path(props.classificationId)\n );\n\n const classification = Flight.useBasicFetch<Classification>(\n props.classificationId &&\n ClassificationRequests.classification(props.classificationId, currentUser.data?.id)\n );\n\n const classificationPresentation = Flight.useBasicFetch<Presentation>(\n classification.hasCompleted &&\n ClassificationRequests.presentationById(classification.data?.presentationId)\n );\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n (!props.classificationId || classificationPresentation.hasCompleted) &&\n AudienceRequests.presentationAudiences(classificationPresentation.data?.id)\n );\n\n const {\n activePresentation,\n availablePresentations\n } = usePresentation();\n\n const { setFavourite, canFavourite } = useLiteFavourites(LocationContext.VideoThumbnail);\n\n const playlistRequest = props.shareId\n ? PlaylistRequests.getSharedPlaylist(props.playlistId, props.shareId)\n : PlaylistRequests.getPlaylist(props.playlistId);\n\n const playlistItemCountRequest = props.shareId\n ? PlaylistRequests.getSharedPlaylistVideosCount(props.playlistId, props.shareId)\n : PlaylistRequests.getPlaylistVideosCount(props.playlistId);\n\n const playlist = Flight.useBasicFetch<Playlist>(playlistRequest);\n const playlistWithCounts = Flight.useBasicFetch<Playlist>(playlistItemCountRequest);\n\n const getVideoItemActions = usePlaylistViewVideoActions(playlist.data, currentUser.data, props.shareId);\n\n useHandleObjectError(playlist, playlistErrors);\n\n const getVideosRequest = (cursor?: string) => {\n return props.shareId\n ? PlaylistRequests.getSharedPlaylistVideos(props.playlistId, props.shareId, cursor)\n : PlaylistRequests.getPlaylistVideos(props.playlistId, cursor);\n };\n\n const following = Flight.useBasicFetch<Following>(\n currentUser.data?.id &&\n PlaylistRequests.getIsFollowingPlaylist(props.playlistId, currentUser.data?.id)\n );\n\n const fetchNext = (cursor?: string) => {\n Flight.getFetch(dispatch)(getVideosRequest(cursor));\n };\n\n const { items: videos, hasMore, isFetching } = useInfiniteList<VideoTypes>(getVideosRequest, fetchNext);\n\n useVideoMixin(videos?.filter(VideoHelper.isVideo) ?? []);\n\n // Locally stored array of videos used to immediately reflect changes in order.\n const [ reorderedVideos, setReorderedVideos ] = useReorderedItems(videos);\n\n useDeepLinks({ id: props.playlistId, app: 'playlists', shareId: props.shareId });\n useSetPageMetadata(PageMetadataHelper.getPlaylistMetadata({\n content: playlist.data,\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n },\n canonicalLink: SeoHelper.getCanonicalLink({ stripPresentationSlug: true }),\n allowIndexing: false\n }));\n\n const onSortStart = (index: number) => {\n const video = videos[index];\n\n if (video)\n logSortAction(props.playlistId, video.id, WorkflowPhase.Start);\n };\n\n const onSortComplete = (oldIdx: number, newIdx: number) => {\n if (oldIdx === newIdx)\n return;\n\n const video = videos[oldIdx];\n\n if (!video)\n return;\n\n const { reorderedItems, reorderRequest } = ReorderHelper.reorder(videos, oldIdx, newIdx);\n setReorderedVideos(reorderedItems);\n\n logSortAction(props.playlistId, video.id, WorkflowPhase.Complete);\n\n const onError = () => {\n setReorderedVideos(null);\n };\n\n Flight.fetch(dispatch, PlaylistRequests.reorderVideos(props.playlistId, reorderRequest, null, onError));\n };\n\n const follow = (shouldFollow: boolean, onSuccess: () => void, onError: () => void) => {\n const req = shouldFollow\n ? PlaylistRequests.followPlaylist\n : PlaylistRequests.unfollowPlaylist;\n\n const error = () => {\n onError();\n alerts.error(getPhrase(shouldFollow ? 'followError' : 'unfollowError'));\n };\n\n Flight.fetch(dispatch, req(props.playlistId, currentUser.data?.id, onSuccess, error));\n };\n\n const playlistIsEmpty = !!videos && videos.length === 0;\n\n const getVideoAppLink = (video: VideoTypes, playNext: boolean, options: GetVideoAppLinkOptions = {}) => {\n return VideoAppLinkHelper.getAppLink(video, {\n ...options,\n contextId: props.playlistId,\n context: RelatedVideosContext.Playlist,\n shareId: props.shareId,\n moviesAndTv: props.moviesAndTv,\n playNext\n });\n };\n\n const isFollowingComplete = !currentUser.data?.isAuthenticated || !!following.hasCompleted;\n\n // The play all applink should start from the first consumable video\n const firstPlayAllVideo = videos?.find(v => VideoHelper.getCanBeConsumed(v)?.canConsume);\n const canEdit = PlaylistHelper.isOwner(playlist.data, currentUser.data);\n\n const videoDataLoaded = (\n videos && currentUser.data && config.data\n );\n\n const getSignInAppLink = (appLink: Core.AppLink): Core.AppLink => {\n const redirectUrl = Core.AppLinkHelper.getHref(appLink);\n const params = redirectUrl !== '/' ? { redirectUrl } : {};\n \n return {\n application: AppChannels.DEFAULT,\n action: Actions.Default.LOG_IN,\n params\n };\n };\n\n return (\n <VideoActionsContext.Provider value={currentUser.data?.isAuthenticated && getVideoItemActions}>\n <div className='bg-white px-3'>\n <PlaylistHeader\n playlist={playlist.data}\n currentUser={currentUser.data}\n isFollowing={following.data?.isFollowing}\n follow={follow}\n playAllAppLink={firstPlayAllVideo && getVideoAppLink(firstPlayAllVideo, true)}\n showPartialLoading={!playlist.data || !videoDataLoaded || !isFollowingComplete}\n imageCdnUrl={!!config.data && config.data.imageCdnUrl}\n getBreadcrumbs={() => getPlaylistBreadcrumbs({\n availablePresentations,\n moviesAndTv: props.moviesAndTv,\n playlist: playlist.data,\n presentation: activePresentation,\n topicPath: topicPath.data\n })}\n topicPath={topicPath.data}\n moviesAndTv={props.moviesAndTv}\n classificationId={props.classificationId}\n isUserCurator={isUserCurator}\n openInCuratorLink={getOpenInCurationStudioLink(playlist.data?.typeId, playlist.data?.id)}\n totalVideos={PlaylistHelper.getVideoCount(playlistWithCounts.data)}\n />\n <div className='mt-2'>\n {!playlistIsEmpty\n ? (\n <SortableVideoListContainer\n videos={reorderedVideos || videos}\n yearGroups={yearGroups.data}\n playlistId={!!playlist.data && playlist.data.id}\n onSortStart={onSortStart}\n onSortComplete={onSortComplete}\n canEdit={canEdit}\n showPartialLoading={!videoDataLoaded}\n getVideoAppLink={(v, opts) => getVideoAppLink(v, false, opts)}\n getSubTextAppLink={video => props.getSeriesAppLink(video.series)}\n setFavourite={setFavourite}\n canFavourite={canFavourite}\n showSignIn={!currentUser.data?.isAuthenticated}\n getSignInAppLink={getSignInAppLink}\n canRemovePrivateVideos={canEdit}\n presentationAudiences={props.moviesAndTv ? null : audiences.data}\n showIndexes={true}\n hasPermissions={hasPermissions}\n getPreviewQuestionsAppLink={interactive => InteractiveHelpers.getPreviewQuestionsAppLink(interactive)}\n imageCdnUrl={config.data?.imageCdnUrl}\n isPlugin={isPlugin}\n getClassroomGuideAppLink={VideoAppLinkHelper.getClassroomGuideAppLink}\n getInteractiveGuidanceAppLink={VideoAppLinkHelper.getInteractiveGuidanceAppLink}\n getResourceGuidanceAppLink={VideoAppLinkHelper.getResourceGuidanceAppLink}\n />\n ) : <PlaylistEmptyState />\n }\n </div>\n {(hasMore || isFetching) && <InfiniteScrollFooter isFetching={isFetching} fetchNext={fetchNext} />}\n </div>\n </VideoActionsContext.Provider>\n );\n}\n","import { useEffect, useState } from 'react';\n\nimport { BaseObject } from 'libs/shared/interfaces';\n\nfunction isOrderEqual(arr1: BaseObject[], arr2: BaseObject[]): boolean {\n let isEqual = true;\n\n if (arr1.length !== arr2.length)\n return false;\n\n for (let i = 0; i < arr1.length; i++) {\n if (arr1[i].id !== arr2[i].id) {\n isEqual = false;\n break;\n }\n }\n\n return isEqual;\n}\n\n/**\n * This function can be used to temporarily store an array of reordered objects\n * until the array obtained from the application store updates to the new order.\n * \n * @param items array of objects from application store.\n */\nexport function useReorderedItems<T extends BaseObject>(\n items: T[]\n): [ T[], React.Dispatch<React.SetStateAction<T[]>> ] {\n const [ reorderedItems, setReorderedItems ] = useState<T[]>();\n\n useEffect(() => {\n if (!reorderedItems)\n return;\n\n if (items.length !== reorderedItems.length || isOrderEqual(items, reorderedItems))\n setReorderedItems(null);\n }, [items]);\n\n return [ reorderedItems, setReorderedItems ];\n}","import React from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { CurrentUser, Video, VideoCollection } from 'libs/shared/interfaces';\n\ninterface VideoMixinOptions {\n /**\n * If the videos that are having new data mixed into are sitting on an explicit Flight namespace,\n * providing that namespace here is required\n */\n flightNamespace?: string;\n}\n\nexport function useVideoMixin(videos: VideoCollection | Video[], options: VideoMixinOptions = {}): void {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const hydratedVideos = React.useRef<Set<string>>(new Set<string>());\n\n const videoIds = videos && (Array.isArray(videos)\n ? videos.filter(Boolean).map(v => v.id)\n : videos.data.filter(Boolean).map(v => v.id));\n\n const [ request, setRequest ] = React.useState<Flight.Request[]>([]);\n\n React.useEffect(() => {\n if (!videoIds?.length || !currentUser.hasCompleted)\n return;\n\n const unhydratedVideos: string[] = [];\n\n videoIds.forEach(id => {\n if (!hydratedVideos.current.has(id)) {\n unhydratedVideos.push(id);\n hydratedVideos.current.add(id);\n }\n });\n \n if (!unhydratedVideos.length)\n return;\n\n setRequest(r => {\n const newRequests = [\n ...r,\n VideoRequests.videoMixinAssocs(unhydratedVideos, options.flightNamespace)\n ];\n\n if (currentUser.data?.isAuthenticated)\n newRequests.push(ClassificationRequests.hasCurriculumLinks(unhydratedVideos, null, options.flightNamespace));\n\n return newRequests;\n });\n }, [ videoIds?.length, currentUser.hasCompleted ]);\n\n Flight.useBasicFetchAll(request);\n}"],"names":["PortalHelper","renderInPortalIfExists","component","portalContainer","createPortal","namespace","ComingSoonTag","props","Tooltip","title","LanguageService","spanHackClassName","spanHack","className","SvgContainer","svgName","onlyIcon","GenericCalendarDate","AppLink","appLink","getAppLink","theme","border","analyticsData","analyticsOptions","background","label","body","type","getBodyClass","text","month","BackButton","textShadow","backToName","color","extraClasses","backPhrase","colorClass","textShadowClass","size","S","defaultProps","RATIO","width","height","getSizeClass","heading","length","BannerHeader","banner","imageCdnUrl","actions","sortComponent","blockColourClass","specialEvent","portalContainerContext","BannerPortalContext","imageWidth","useBreakpoints","xxl","specialEventIsToday","showComingSoon","today","DateHelper","Date","endDate","startDate","imageOptions","ratio","resizeType","url","ImageHelper","fallbackBaseUrl","fallbackCategoryName","containerProps","bannerClassName","style","backgroundImage","DetailsComponent","detailsComponent","backButtonAppLink","backButtonText","backButtonClasses","alignLogoLeft","logo","calendarTheme","Text","phrase","LazyImage","src","Actions","actionsDropdownClassName","container","prevProps","nextProps","PartialBannerHeader","BreadcrumbItem","breadcrumb","name","active","withBackIcon","Breadcrumbs","breadcrumbs","isMobile","map","b","idx","key","PartialBreadcrumbs","numItems","dangerouslySetInnerHTML","__html","InfiniteScrollFooter","ref","inView","fetchOnScroll","isFetching","fetchNext","nextCursor","Spinner","as","animation","role","onClick","PartialVideoList","Array","numVideos","fill","_","i","allowBulkActions","PartialVideoItem","breakpoints","isSmall","VideoListHelper","withDragHandle","withReordering","xs","Row","Col","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","generateCacheKey","flightObjs","obj","join","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","isArray","useEffect","forEach","SCROLL_TOLERANCE","useInfiniteList","getRequest","onError","getItems","getCursor","scrollContainer","options","handleScroll","useState","pagesFetched","setPagesFetched","fetchNextFn","response","cursor","request","fetchNextPage","currentVal","hasMore","getBoundingClientRect","scrollTop","scrollHeight","window","innerHeight","document","documentElement","onScroll","FunctionHelper","addEventListener","removeEventListener","shouldInitialFetch","httpStatusClass","toString","substr","HttpStatus","items","totalItems","hasFirstPageCompleted","DEFAULT_PARTIAL_LOADING_OPTIONS","minWidth","maxWidth","PartialLoadingHelper","getPartialLoadingItems","opts","Math","max","floor","random","PlaylistHelper","isPlaylist","typeId","MasterType","isOwner","playlist","currentUser","ObjectHelper","_liteOwner","id","getVideoCount","count","videos","clips","interactives","Separator","getPlaylistOwnerName","surname","TextHelper","substring","split","PlaylistHeaderDetails","currentUserIsOwner","followerCount","followers","lastUpdated","contentModifiedDate","now","getLastUpdated","detailsClassName","hideOwnerName","_isClickViewCurated","value","clickViewAvatarClassName","ClickViewAvatar","user","separatorClassName","totalVideos","smartCount","timeAgo","PartialPlaylistHeader","getPhrase","PlaylistHeaderUtils","getPlaylistActions","headerProps","args","isAuthenticated","isPlugin","setIsFollowing","isFollowing","setShowFollowSpinner","showFollowSpinner","isUserCurator","openInCuratorLink","videoCount","interactiveCount","clipCount","isClickViewPlaylist","location","entity","workflowPhase","playAllAppLink","push","button","actionType","href","openInNewTab","application","action","params","entityType","eventVersion","follow","AnalyticsHelper","descriptor","showSpinner","PlaylistHeader","usePluginHelper","showPartialLoading","description","getBgColorClass","topicPath","moviesAndTv","classificationId","getBreadcrumbs","SortableVideoListContainer","onSortComplete","onSortStart","videoListProps","currentSortingIndex","setCurrentSortingIndex","canEdit","showIndexes","event","index","findIndex","v","onSortEnd","over","oldIndex","newIndex","DevError","dragHandleIcon","dragHandleIconSize","presentationAudiences","VideoList","PlaylistEmptyState","EmptyState","ImageUrls","getClassificationAppLink","classification","mtv","undefined","logSortAction","playlistId","videoId","playlistErrors","PlaylistPrivateError","PlaylistView","dispatch","alerts","config","ConfigRequests","UserRequests","useCurationStudio","getOpenInCurationStudioLink","hasPermissions","usePermissions","yearGroups","data","CustomerRequests","customerId","ClassificationRequests","classificationPresentation","hasCompleted","presentationId","audiences","AudienceRequests","usePresentation","activePresentation","availablePresentations","useLiteFavourites","u","setFavourite","canFavourite","playlistRequest","shareId","PlaylistRequests","playlistItemCountRequest","playlistWithCounts","getVideoItemActions","videoActions","useVideoActions","getVideoActions","video","canConsume","VideoHelper","removeFromPlaylistAction","group","usePlaylistViewVideoActions","getVideosRequest","following","useVideoMixin","filter","reorderedItems","setReorderedItems","arr1","arr2","isEqual","isOrderEqual","reorderedVideos","setReorderedVideos","useDeepLinks","app","useSetPageMetadata","PageMetadataHelper","content","phraseContext","phraseHandler","titlePhrase","descriptionPhrase","canonicalLink","SeoHelper","stripPresentationSlug","allowIndexing","playlistIsEmpty","playNext","VideoAppLinkHelper","contextId","context","RelatedVideosContext","isFollowingComplete","firstPlayAllVideo","find","videoDataLoaded","VideoActionsContext","shouldFollow","onSuccess","req","error","presentation","slice","item","TopicsHelper","getPlaylistBreadcrumbs","oldIdx","newIdx","ReorderHelper","reorderRequest","getVideoAppLink","getSubTextAppLink","getSeriesAppLink","series","showSignIn","getSignInAppLink","redirectUrl","canRemovePrivateVideos","getPreviewQuestionsAppLink","interactive","InteractiveHelper","getClassroomGuideAppLink","getInteractiveGuidanceAppLink","getResourceGuidanceAppLink","hydratedVideos","Set","videoIds","Boolean","setRequest","unhydratedVideos","current","has","add","r","newRequests","flightNamespace"],"sourceRoot":""}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[6531],{54644:(e,t,a)=>{a.d(t,{v:()=>r});var n=a(97395),r={getContentUpdates:function(e,t,a){return{url:n._.urlBuilder("/api/domain/v1/subjects/content-updates",{from:t,to:a,limit:6,query:"(videoCollection)"}),publicUrl:n._.urlBuilder("/api/subjects/presentations/".concat(e,"/content-updates"),{from:t,to:a,limit:6,query:"(videoCollection)"}),key:"content:updates",normalizeOptions:{namespace:"contentupdates"},formatData:function(e){return e.map((function(e){return{id:e.classificationId,videos:e.videos}}))}}},getClassifications:function(e){return{url:n._.urlBuilder("/api/domain/v1/subjects",{id:e,query:"banner"}),publicUrl:n._.urlBuilder("/api/subjects/classifications",{id:e,query:"banner"}),key:"classifications:".concat(e.join(","))}},getClassification:function(e){return{url:"/api/domain/v1/subjects/".concat(e,"?query=banner"),publicUrl:"/api/subjects/classifications/".concat(e,"?query=banner"),key:"classification:".concat(e)}},getClassificationUpdates:function(e,t,a){return{url:n._.urlBuilder("/api/domain/v1/subjects/".concat(e,"/content-updates"),{from:t,to:a,query:"(videoCollection)"}),publicUrl:n._.urlBuilder("/api/subjects/classifications/".concat(e,"/content-updates"),{from:t,to:a,query:"(videoCollection)"}),key:"classification:update:".concat(e,":").concat(t,":").concat(a)}},getContentUpdateVideos:function(e,t){return{url:n._.urlBuilder("/api/domain/v1/subjects/content-updates/videos",{from:e,to:t,query:"(videoCollection)"}),publicUrl:n._.urlBuilder("/api/subjects/content-updates/videos",{from:e,to:t,query:"(videoCollection)"}),key:"content:update:videos:".concat(e,":").concat(t)}},videos:function(e,t){return{url:"/api/domain/v1/videos?ids=".concat(e.join(","),"&with=(videoCollection)"),key:"videos:by:id:".concat(e.join(",")),success:t}}}},49935:(e,t,a)=>{a.d(t,{Oo:()=>d,b2:()=>m});var n=a(32735),r=a(36848),i=a(86764),o=a(3747),l=a(5859),c=a(35223),s=a(83914),u=function(e){var t=e.breadcrumb,a=t.name,i=t.appLink,o=t.active,l=e.withBackIcon;return n.createElement("li",{className:"breadcrumb-item".concat(o?" active":"")},o?n.createElement("strong",null,a):n.createElement(r.F,{appLink:i},l&&n.createElement(s.x,{svgName:c.vn.ChevronLeft,size:s.S.Small}),n.createElement("span",{className:l?"ms-2":""},a)))},d=function(e){var t=e.breadcrumbs,a=(0,o.a)(i.r.XS),r=null==t?void 0:t.length;return!r||a&&r<2?n.createElement(n.Fragment,null):a?n.createElement("nav",{"aria-label":"breadcrumb"},n.createElement("ol",{className:"breadcrumb m-0 p-0"},n.createElement(u,{breadcrumb:t[r-2],withBackIcon:!0}))):n.createElement("nav",{"aria-label":"breadcrumb"},n.createElement("ol",{className:"breadcrumb m-0 p-0"},t.map((function(e,t){return n.createElement(u,{key:t,breadcrumb:e})}))))},m=n.memo((function(e){var t=e.numItems,a=void 0===t?3:t;return(0,o.a)(i.r.XS)?n.createElement("div",{className:"partial-loading-background",style:{height:"1.3125rem",width:"6rem"}}):n.createElement("nav",{"aria-label":"breadcrumb"},n.createElement("ol",{className:"breadcrumb m-0 p-0"},l.u.getPartialLoadingItems({numItems:a}).map((function(e,t){var a=e.width;return n.createElement("li",{key:t,className:"breadcrumb-item"},n.createElement("span",{className:"d-inline-block partial-loading-background",style:{width:a},dangerouslySetInnerHTML:{__html:" "}}))}))))}))},74696:(e,t,a)=>{a.d(t,{S:()=>s});var n=a(32735),r=a(68050),i=a(69111),o=a(9977),l=a(79967);const c={partialOptions:"Gufgq",partialName:"SicQQ",partialDescription:"dPGMq",partialThumbnail:"vZrnb",partialDragHandle:"iq73R"};function s(e){return n.createElement("div",{className:"mx-2"},Array(e.numVideos).fill(null).map((function(t,a){return n.createElement("div",{className:"d-flex",key:a},e.allowBulkActions&&n.createElement("div",{className:"form-check pe-3 pe-sm-2 mx-0 mx-md-2"}),n.createElement(u,Object.assign({},e)))})))}function u(e){var t=(0,l.k)(),a="sm"===o.O.getSize(t,"md"),s=e.withReordering&&!t.xs;return n.createElement(r.Z,{className:"".concat(a?"":"py-2"," flex-grow-1")},n.createElement(i.Z,Object.assign({},o.O.getThumbnailColumns(),{className:"flex-column align-items-flex-start ".concat(a?"pb-2 pe-1":"mb-1 pe-3 pe-md-2")}),n.createElement(r.Z,null,!!s&&n.createElement("div",{className:"d-flex align-items-center justify-content-center col-2"},n.createElement("div",{className:"partial-loading-background ".concat(c.partialDragHandle)})),n.createElement(i.Z,{xs:o.O.getThumbnailColSize(s)},n.createElement("div",{className:"partial-loading-background ".concat(a?"rounded":"rounded-3"," ").concat(c.partialThumbnail)})))),n.createElement(i.Z,Object.assign({},o.O.getDetailsColumns(),{className:a?"pb-2":"px-2"}),n.createElement("div",{className:"partial-loading-background mb-1 ".concat(c.partialName)}),n.createElement("div",{className:"partial-loading-background ".concat(c.partialDescription)})))}s.defaultProps={numVideos:15}},5859:(e,t,a)=>{function n(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,n=Array(t);a<t;a++)n[a]=e[a];return n}a.d(t,{u:()=>i});var r={numItems:5,minWidth:50,maxWidth:100},i={getPartialLoadingItems:function(){var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},a=Object.assign(Object.assign({},r),t);return(e=Array(a.numItems),function(e){if(Array.isArray(e))return n(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 n(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)?n(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")}}))}}},37808:(e,t,a)=>{a.d(t,{aq:()=>b,YW:()=>h});var n=a(32735),r=a(36848),i=a(83345),o=a(80247),l=a(57900),c=a(2948),s=a(10874),u=a(38143),d=a(35223);const m={banner:"B7jhq"};function p(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,n=Array(t);a<t;a++)n[a]=e[a];return n}var f="contentUpdates.classificationBanner";function b(e){var t,a,b=e.classification,v=e.backgroundUrl,h=e.followed,g=e.follow,y=e.showFollowSpinner,k=(t=(0,c.D)(u.g.AUDIENCE_FILTER,void 0,{storage:l.Z1.SessionStorage}),a=1,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 n,r,i,o,l=[],c=!0,s=!1;try{if(i=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;c=!1}else for(;!(c=(n=i.call(a)).done)&&(l.push(n.value),l.length!==t);c=!0);}catch(e){s=!0,r=e}finally{try{if(!c&&null!=a.return&&(o=a.return(),Object(o)!==o))return}finally{if(s)throw r}}return l}}(t,a)||function(e,t){if(e){if("string"==typeof e)return p(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)?p(e,t):void 0}}(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.")}())[0];return n.createElement("div",{className:"banner mb-2 d-flex justify-content-between align-items-center rounded ".concat(m.banner),style:{backgroundImage:"url('".concat(v,"')")}},n.createElement(r.F,{className:"text-white text-shadow",appLink:e.getClassificationAppLink(b,k)},n.createElement("h2",{className:"h3 mb-0"},b.name)),e.canFollow&&n.createElement(s.h,{className:"btn follow-btn ".concat(h?"btn-outline-dark":"btn-dark"),svgName:h?d.vn.Check:d.vn.Bell,onClick:function(){return g(b.id,b.name,!h)}},y?n.createElement(o.Z,{as:"span",animation:"border",role:"status",size:"sm"}):n.createElement(i.x,{namespace:f,phrase:h?"unfollow":"follow"})))}var v="playlists.liteClassificationUpdateBreadcrumbs";function h(e){var t=e.classification;return n.createElement(n.Fragment,null,n.createElement("nav",{"aria-label":"breadcrumb"},n.createElement("ol",{className:"breadcrumb p-0 mb-0"},n.createElement("li",{className:"breadcrumb-item"},n.createElement(r.F,{appLink:e.dashboardAppLink},n.createElement(i.x,{namespace:v,phrase:"dashboard"}))),n.createElement("li",{className:"breadcrumb-item"},n.createElement(r.F,{appLink:e.contentUpdatesAppLink},n.createElement(i.x,{namespace:v,phrase:"whatsNew"}))),n.createElement("li",{className:"breadcrumb-item active","aria-current":"page"},t.name))))}},19595:(e,t,a)=>{a.r(t),a.d(t,{ClassificationUpdateView:()=>M});var n=a(32735),r=a(70680),i=a(23481),o=a(20354),l=a(110),c=a(65858),s=a(54644),u=a(13231),d=a(51365),m=a(16714),p=a(1666),f=a(61699),b=a(31949),v=a(69883),h=a(22902),g=a(79612),y=a(76753),k=a(51855),w=a(10671),E=a(27638),A=a(44110),S=a(97816),C=a(10741),N=a(33192),L=a(22490),j=a(37808),I=a(49935),x=a(74696);const O={partialBanner:"DKukI"};function F(){return n.createElement("div",{className:"bg-white px-3"},n.createElement("div",{className:"partial-loading-background mb-2 ".concat(O.partialBanner," rounded")}),n.createElement("div",{className:"mb-1"},n.createElement(I.b2,null)),n.createElement(x.S,null))}var U=a(49985),B="contentUpdates.classificationUpdate",T=i.T.encloseNamespace(B);function D(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,n=Array(t);a<t;a++)n[a]=e[a];return n}var P=i.T.encloseNamespace("contentUpdates.classificationUpdate");function M(e){var t,a,I,x,O,M,q,_,G,V,Z=e.classificationId,Y=(0,k.G)().isPlugin,W=(0,r.I0)(),R=(0,v.Z)(),z=(0,E.u)(c.LZ.VideoThumbnail),H=z.setFavourite,Q=z.canFavourite,$=o.a.useBasicFetch(b.N.currentUser()),X=o.a.useBasicFetch((null===(t=$.data)||void 0===t?void 0:t.isAuthenticated)&&p.h.yearGroups($.data.customerId)),K=(G=n.useState(!1),V=2,function(e){if(Array.isArray(e))return e}(G)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var n,r,i,o,l=[],c=!0,s=!1;try{if(i=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;c=!1}else for(;!(c=(n=i.call(a)).done)&&(l.push(n.value),l.length!==t);c=!0);}catch(e){s=!0,r=e}finally{try{if(!c&&null!=a.return&&(o=a.return(),Object(o)!==o))return}finally{if(s)throw r}}return l}}(G,V)||function(e,t){if(e){if("string"==typeof e)return D(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)?D(e,t):void 0}}(G,V)||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.")}()),J=K[0],ee=function(e){var t=e.dispatch,a=e.alerts,n=e.setShowFollowSpinner;return{onFollow:function(e,r,l){n(!0);var s=function(){n(!1),U.k.logUserAction({id:e,name:r},{location:c.LZ.ContentUpdatesClassificationBanner,workflowPhase:c.eu.Complete,descriptor:l?c.DL.On:c.DL.Off,actionType:c.Vw.Follow,entity:c.py.Classification}),a.success(T(l?"followed":"unfollowed",{name:r,escapeText:!0}))},u=function(){n(!1),a.error(i.T.getPhrase(B,"error"))},d=l?f.o.followSubjects([e],s,u):f.o.unfollowSubjects([e],s,u);o.a.fetch(t,d)}}}({dispatch:W,alerts:R,setShowFollowSpinner:K[1],currentUser:null==$?void 0:$.data}),te=new Date,ae=l.O.format(l.O.endOf(l.O.subtract(te,1,"year"),"day"),"YYYY-MM-DD"),ne=l.O.format(l.O.endOf(te,"day"),"YYYY-MM-DD"),re=(0,h.T)().hasPermissions,ie=re(m.C.FollowSubjects),oe=o.a.useBasicFetch(s.v.getClassification(Z)),le=o.a.useBasicFetch($.data&&s.v.getClassificationUpdates(Z,ae,ne)),ce=o.a.useBasicFetch(ie&&f.o.mySubjectPreferences()),se=(0,A.i)();(0,g.M)(y.CG.getDefaultMetadata({title:null===(a=oe.data)||void 0===a?void 0:a.name,phraseContext:{phraseHandler:P,titlePhrase:"pageTitle",descriptionPhrase:"pageDescription"},canonicalLink:N.f.getCanonicalLink(),allowIndexing:N.f.allowIndexing()}));var ue=(0,w._)({location:w.i.VideoItem});(0,S.V)(null!==(x=null===(I=le.data)||void 0===I?void 0:I.videos)&&void 0!==x?x:[]);var de=ce.hasCompleted||!ie;if(!(le.data&&oe.data&&de&&$.data))return n.createElement(F,null);var me=null!==(M=null===(O=ce.data)||void 0===O?void 0:O.map((function(e){return e.id})))&&void 0!==M?M:[];return n.createElement(d.M.Provider,{value:ue},n.createElement("div",{className:"bg-white px-3"},n.createElement(j.aq,{classification:oe.data,backgroundUrl:null!==(_=null===(q=oe.data.banner)||void 0===q?void 0:q.url)&&void 0!==_?_:"",getClassificationAppLink:e.appLinks.getClassificationAppLink,followed:!!me.find((function(e){return e.toString()===oe.data.id.toString()})),follow:ee.onFollow,showFollowSpinner:J,canFollow:ie}),n.createElement(j.YW,{classification:oe.data,dashboardAppLink:e.appLinks.dashboardAppLink,contentUpdatesAppLink:e.appLinks.whatsNewAppLink}),n.createElement(u.E4,{videos:le.data.videos,yearGroups:X.data,getVideoAppLink:e.appLinks.getVideoAppLink,getSubTextAppLink:function(t){return e.appLinks.getSeriesAppLink(t.series)},setFavourite:H,canFavourite:Q,hasPermissions:re,presentationAudiences:se.data,getPreviewQuestionsAppLink:function(e){return C.j.getPreviewQuestionsAppLink(e)},isPlugin:Y,getClassroomGuideAppLink:L.W.getClassroomGuideAppLink,getInteractiveGuidanceAppLink:L.W.getInteractiveGuidanceAppLink,getResourceGuidanceAppLink:L.W.getResourceGuidanceAppLink})))}},44110:(e,t,a)=>{a.d(t,{i:()=>o});var n=a(20354),r=a(89454),i=a(86698),o=function(){var e=(0,i.y)({redirectOnError:!0}),t=e.activePresentation,a=e.getFallbackPresentation,o=t||a();return n.a.useBasicFetch(!!o&&r.O.presentationAudiences(o.id))}},97816:(e,t,a)=>{a.d(t,{V:()=>u});var n=a(32735),r=a(20354),i=a(21750),o=a(31949),l=a(1575);function c(e,t){if(e){if("string"==typeof e)return s(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)?s(e,t):void 0}}function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,n=Array(t);a<t;a++)n[a]=e[a];return n}function u(e){var t,a,u=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},d=r.a.useBasicFetch(o.N.currentUser()),m=n.useRef(new Set),p=e&&(Array.isArray(e)?e.filter(Boolean).map((function(e){return e.id})):e.data.filter(Boolean).map((function(e){return e.id}))),f=(t=n.useState([]),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 n,r,i,o,l=[],c=!0,s=!1;try{if(i=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;c=!1}else for(;!(c=(n=i.call(a)).done)&&(l.push(n.value),l.length!==t);c=!0);}catch(e){s=!0,r=e}finally{try{if(!c&&null!=a.return&&(o=a.return(),Object(o)!==o))return}finally{if(s)throw r}}return l}}(t,a)||c(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.")}()),b=f[0],v=f[1];n.useEffect((function(){if((null==p?void 0:p.length)&&d.hasCompleted){var e=[];p.forEach((function(t){m.current.has(t)||(e.push(t),m.current.add(t))})),e.length&&v((function(t){var a,n=[].concat(function(e){return function(e){if(Array.isArray(e))return s(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||c(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.")}()}(t),[l.R.videoMixinAssocs(e,u.flightNamespace)]);return(null===(a=d.data)||void 0===a?void 0:a.isAuthenticated)&&n.push(i.x.hasCurriculumLinks(e,null,u.flightNamespace)),n}))}}),[null==p?void 0:p.length,d.hasCompleted]),r.a.useBasicFetchAll(b)}}}]);
|
|
2
|
-
//# sourceMappingURL=6531-d77ba2c5ce-lite.chunk.js.map
|