@clickview/lite 0.49.0-rc.4 → 0.49.0-rc.5

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.
Files changed (49) hide show
  1. package/dist/bundles.json +1 -1
  2. package/dist/languages/en.json +1 -1
  3. package/dist/scripts/1539-10d3590409-lite.chunk.js +2 -0
  4. package/dist/scripts/1539-10d3590409-lite.chunk.js.map +1 -0
  5. package/dist/scripts/194-d192c1e455-lite.chunk.js +2 -0
  6. package/dist/scripts/194-d192c1e455-lite.chunk.js.map +1 -0
  7. package/dist/scripts/2265-b6e093cf57-lite.chunk.js +2 -0
  8. package/dist/scripts/2265-b6e093cf57-lite.chunk.js.map +1 -0
  9. package/dist/scripts/{3042-32e303014a-lite.chunk.js → 3042-f9d67ac0a3-lite.chunk.js} +2 -2
  10. package/dist/scripts/3042-f9d67ac0a3-lite.chunk.js.map +1 -0
  11. package/dist/scripts/32-2abdd88255-lite.chunk.js +2 -0
  12. package/dist/scripts/32-2abdd88255-lite.chunk.js.map +1 -0
  13. package/dist/scripts/{3854-9e1422da99-lite.chunk.js → 3854-49852130b4-lite.chunk.js} +2 -2
  14. package/dist/scripts/3854-49852130b4-lite.chunk.js.map +1 -0
  15. package/dist/scripts/{4060-77244f1012-lite.chunk.js → 4060-4ab06f9f5e-lite.chunk.js} +2 -2
  16. package/dist/scripts/4060-4ab06f9f5e-lite.chunk.js.map +1 -0
  17. package/dist/scripts/4113-81b4e4a350-lite.chunk.js +2 -0
  18. package/dist/scripts/4113-81b4e4a350-lite.chunk.js.map +1 -0
  19. package/dist/scripts/{4291-4ea61b3610-lite.chunk.js → 4291-72cf3ca37d-lite.chunk.js} +2 -2
  20. package/dist/scripts/4291-72cf3ca37d-lite.chunk.js.map +1 -0
  21. package/dist/scripts/{1539-df427c5b98-lite.chunk.js → 6723-b34bba9ac1-lite.chunk.js} +2 -2
  22. package/dist/scripts/6723-b34bba9ac1-lite.chunk.js.map +1 -0
  23. package/dist/scripts/7268-42c8c2cdb5-lite.chunk.js +2 -0
  24. package/dist/scripts/7268-42c8c2cdb5-lite.chunk.js.map +1 -0
  25. package/dist/scripts/{9437-d9c671743c-lite.chunk.js → 9437-2bb4c632ca-lite.chunk.js} +2 -2
  26. package/dist/scripts/9437-2bb4c632ca-lite.chunk.js.map +1 -0
  27. package/dist/scripts/{bundle-0f5cfcd378.min.js → bundle-854cdefb2d.min.js} +3 -3
  28. package/dist/scripts/bundle-854cdefb2d.min.js.map +1 -0
  29. package/package.json +1 -1
  30. package/dist/scripts/1539-df427c5b98-lite.chunk.js.map +0 -1
  31. package/dist/scripts/194-918a27a783-lite.chunk.js +0 -2
  32. package/dist/scripts/194-918a27a783-lite.chunk.js.map +0 -1
  33. package/dist/scripts/2265-0174bf9c8c-lite.chunk.js +0 -2
  34. package/dist/scripts/2265-0174bf9c8c-lite.chunk.js.map +0 -1
  35. package/dist/scripts/3042-32e303014a-lite.chunk.js.map +0 -1
  36. package/dist/scripts/32-cf9b8ba599-lite.chunk.js +0 -2
  37. package/dist/scripts/32-cf9b8ba599-lite.chunk.js.map +0 -1
  38. package/dist/scripts/3854-9e1422da99-lite.chunk.js.map +0 -1
  39. package/dist/scripts/4060-77244f1012-lite.chunk.js.map +0 -1
  40. package/dist/scripts/4113-c75e9be23a-lite.chunk.js +0 -2
  41. package/dist/scripts/4113-c75e9be23a-lite.chunk.js.map +0 -1
  42. package/dist/scripts/4291-4ea61b3610-lite.chunk.js.map +0 -1
  43. package/dist/scripts/6723-ece2125bab-lite.chunk.js +0 -2
  44. package/dist/scripts/6723-ece2125bab-lite.chunk.js.map +0 -1
  45. package/dist/scripts/7268-a8484f7697-lite.chunk.js +0 -2
  46. package/dist/scripts/7268-a8484f7697-lite.chunk.js.map +0 -1
  47. package/dist/scripts/9437-d9c671743c-lite.chunk.js.map +0 -1
  48. package/dist/scripts/bundle-0f5cfcd378.min.js.map +0 -1
  49. /package/dist/scripts/{bundle-0f5cfcd378.min.js.LICENSE.txt → bundle-854cdefb2d.min.js.LICENSE.txt} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/3854-9e1422da99-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/resources/PlayPageResources.tsx","file:///app/packages/libs/shared/src/components/points-of-interest-list/points-of-interest-list.scss","file:///app/packages/libs/shared/src/components/points-of-interest-list/PointsOfInterestList.tsx","file:///app/packages/libs/shared/src/components/video-at-a-glance/video-at-a-glance.scss","file:///app/packages/libs/shared/src/components/video-at-a-glance/VideoAtAGlance.tsx","file:///app/packages/libs/shared/src/components/video-at-a-glance/VideoAtAGlanceUtils.ts","file:///app/packages/libs/shared/src/components/video-details/VideoDetailsPartial.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/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/components/resource-thumbnail/resource-thumbnail.scss","file:///app/packages/libs/shared/src/components/resource-thumbnail/ResourceThumbnail.tsx","file:///app/packages/libs/shared/src/utils/ResourceHelper.ts","file:///app/packages/libs/shared/src/components/widgets/items/resource-widget-item/resource-widget-item.scss","file:///app/packages/libs/shared/src/components/widgets/items/resource-widget-item/ResourceWidgetItem.tsx","file:///app/packages/libs/shared/src/flight-requests/ThemeRequests.ts","file:///app/packages/libs/shared/src/hooks/usePrevious.ts","file:///app/packages/libs/shared/src/hooks/useTableOfContentsScroll.tsx","file:///app/packages/libs/shared/src/utils/DownloadHelper.ts","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/libs/shared/src/components/widgets/items/clip-widget-item/ClipWidgetItem.tsx","file:///app/packages/libs/shared/src/components/widgets/items/clip-widget-item/clip-widget-item.scss","file:///app/packages/projects/lite/src/shared/components/play-page/components/clips/PlayPageClips.tsx","file:///app/packages/projects/lite/src/shared/components/play-page/components/interactives/PlayPageInteractives.tsx","file:///app/packages/projects/lite/src/shared/components/play-page/components/title-and-actions/title-and-actions.scss","file:///app/packages/projects/lite/src/shared/components/play-page/components/title-and-actions/PlayPageTitleAndActions.tsx","file:///app/packages/projects/lite/src/shared/components/player-placeholder/player-placeholder.scss","file:///app/packages/projects/lite/src/shared/components/player-placeholder/PlayerPlaceholder.tsx","file:///app/packages/projects/lite/src/shared/components/related-videos/RelatedVideos.tsx","file:///app/packages/projects/lite/src/shared/hooks/useVideoFeatureAccess.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';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { EntityType, LocationContext, SignUpDescriptors, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { FixedWidget } from 'libs/shared/components/widgets/fixed-widget';\nimport { ResourceWidgetItem, ResourceWidgetItemProps } from 'libs/shared/components/widgets/items/resource-widget-item/ResourceWidgetItem';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { Clip, Link, Resource, Video } from 'libs/shared/interfaces';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { DownloadHelper } from 'libs/shared/utils/DownloadHelper';\n\nconst namespace = 'shared.playPageResources';\n\nfunction getResources(\n video: Video,\n isLearner: boolean\n): Array<Resource | Link> {\n const resources = video.resources?.data ?? [];\n const links = video.links?.data ?? [];\n\n if (!isLearner)\n return [ ...resources, ...links ];\n\n const filteredResources = resources.filter(r => {\n return [ 'additional-materials', 'student-activity' ].includes(r.metadata?.resourceType);\n });\n\n return [ ...filteredResources, ...links ];\n}\n\ninterface PlayPageResourcesProps {\n video: Video | Clip;\n imageCdnUrl: string;\n canViewResources: boolean;\n getAppLink: (resource: Resource) => Core.AppLink;\n analyticsData: HashObject;\n resourceThumbnailFallbackUrl: string;\n containerRef?: React.RefObject<HTMLDivElement>;\n}\n\nexport function PlayPageResources(props: PlayPageResourcesProps): JSX.Element {\n const { hasPermissions } = usePermissions();\n\n function onClickDownload(resource: Resource): void {\n DownloadHelper.downloadResource(\n resource,\n props.analyticsData,\n { location: LocationContext.PlayPage, actionType: UserAction.Download, entity: EntityType.Resource }\n );\n }\n\n const resources = getResources(props.video, hasPermissions(PermissionName.StudentExperience));\n\n if (!resources.length)\n return <></>;\n\n return (\n <section id={PlayPageAnchor.Resources} className='pb-4' ref={props.containerRef}>\n <FixedWidget<ResourceWidgetItemProps>\n name={LanguageService.getPhrase(namespace, 'resources', { count: resources.length })}\n contents={WidgetContents.PlayPageResources}\n collection={resources}\n prefetched\n childComponent={ResourceWidgetItem}\n extraChildComponentProps={{\n imageCdnUrl: props.imageCdnUrl,\n imageErrorFallbackUrl: props.resourceThumbnailFallbackUrl,\n actionBehaviour: props.canViewResources ? 'normal' : 'public',\n location: 'play-page',\n titlePosition: 'below',\n onClickDownload: props.canViewResources ? onClickDownload : null\n }}\n getChildAppLink={props.getAppLink}\n analyticsOptions={(() => {\n if (props.canViewResources)\n return {};\n \n return {\n workflowPhase: WorkflowPhase.Start,\n descriptor: SignUpDescriptors.SignUp\n };\n })()}\n analyticsData={props.analyticsData}\n />\n </section>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"poiEntry\":\"Nmm9o\",\"poiText\":\"c75aW\",\"public\":\"R689i\",\"poiTimeStamp\":\"Wad94\"};","import React from 'react';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PointOfInterest } from 'libs/shared/interfaces';\nimport { DurationHelper } from 'libs/shared/utils/DurationHelper';\n\nimport styles from './points-of-interest-list.scss';\n\ninterface PointOfInterestListProps{\n pointsOfInterest: PointOfInterest[];\n suppressInteractivity?: boolean;\n onClickPoiItem: (time: number) => void\n}\n\nconst namespace = 'shared.pointsOfInterestList';\n\nexport function PointOfInterestList(props: PointOfInterestListProps) {\n return (\n <div>\n <h2 className='h6 my-2'><Text namespace={namespace} phrase='heading' /></h2>\n\n <div>\n {props.pointsOfInterest.map(poi => {\n const timeStamp = DurationHelper.ToDisplayDuration(poi.startTime * 1000);\n if (props.suppressInteractivity)\n return (\n <div key={poi.startTime} className={`d-flex ${styles.poiEntry} mb-2`}>\n <span className={`d-flex rounded-pill justify-content-center align-items-center fw-semibold ${styles.poiTimeStamp}`}>{timeStamp}</span>\n <div className={`${styles.public}`}>{poi.description}</div>\n </div>\n );\n\n return (\n <DivButton\n key={poi.startTime}\n className={`d-flex ${styles.poiEntry} mb-2 cursor-pointer`}\n onClick={() => props.onClickPoiItem(poi.startTime)}\n >\n <div className={`d-flex rounded-pill justify-content-center align-items-center fw-semibold ${styles.poiTimeStamp}`}>{timeStamp}</div>\n <div className={`ms-2 ${styles.poiText}`}>{poi.description}</div>\n </DivButton>\n );\n })}\n\n </div>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"learningIntention\":\"T2LIU\"};","import * as React from 'react';\nimport Scrollbars from 'react-custom-scrollbars-2';\n\nimport { Core } from 'libs/common/core';\n\nimport { PointOfInterestList } from 'libs/shared/components/points-of-interest-list/PointsOfInterestList';\nimport { TagHelper } from 'libs/shared/components/tags/TagHelper';\nimport { TagList } from 'libs/shared/components/tags/TagList';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { TagType } from 'libs/shared/enums/TagType';\nimport { PointOfInterest, Tag, Video } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { hasGlanceData, useLearningIntentionMarkdown } from './VideoAtAGlanceUtils';\n\nimport styles from './video-at-a-glance.scss';\n\nconst namespace = 'shared.videoAtAGlance';\n\nconst SCROLL_HEIGHT_MAX = 350; // in px\n\ninterface VideoAtAGlanceProps {\n video: Video;\n pointsOfInterest?: PointOfInterest[];\n suppressInteractivity?: boolean;\n setStartTime?: (time: number) => void;\n getTagAppLink?: (tag: Tag) => Core.AppLink;\n height?: number;\n}\n\nexport function VideoAtAGlance(props: VideoAtAGlanceProps): JSX.Element {\n const canViewGlance = hasGlanceData(props.video);\n\n const learningIntentionMarkdownHTML = useLearningIntentionMarkdown(props.video, canViewGlance);\n \n function getTags(): Tag[] {\n if (VideoHelper.isInteractive(props.video) || !props.video.tags?.data?.length)\n return null;\n\n return props.video.tags?.data?.filter(tag => tag.tagType === TagType.Pedagogy || tag.tagType === TagType.Skill);\n }\n const tags = getTags();\n\n if (!canViewGlance)\n return <></>;\n\n function onClickPoiItem(time: number) {\n props.setStartTime(time);\n }\n\n return (\n <div className='rounded border mb-4 bg-white'>\n <Scrollbars autoHeight autoHeightMax={props.height ?? SCROLL_HEIGHT_MAX} >\n <div className='px-3 px-3 pt-3 pb-2'>\n\n <h2 className='h6 mb-2'><Text namespace={namespace} phrase='learningIntention' /></h2>\n <div className={`${styles.learningIntention} mb-3`}>\n <div dangerouslySetInnerHTML={{ __html: learningIntentionMarkdownHTML }}/>\n </div>\n\n {!!tags?.length && (\n <div className='mb-1'>\n <TagList\n tags={tags}\n {...TagHelper.getTagActionProps(props.getTagAppLink, props.suppressInteractivity)}\n className='mt-2'\n />\n </div>\n )}\n\n {!!props.pointsOfInterest.length && (\n <PointOfInterestList\n pointsOfInterest={props.pointsOfInterest}\n suppressInteractivity={props.suppressInteractivity}\n onClickPoiItem={onClickPoiItem}\n />\n )}\n </div>\n </Scrollbars>\n </div>\n );\n}","import { useEffect, useState } from 'react';\nimport * as marked from 'marked';\n\nimport { Clip, Glance, Video } from 'libs/shared/interfaces';\n\nconst POI_LINK_LINE = /\\[\\]\\(cv:\\/\\/poi\\?id=\\d+\\)\\n*/g;\n\nfunction stripPoisFromGlanceContent(glanceContent: string): string {\n return glanceContent.replace(POI_LINK_LINE, '');\n}\n\nfunction getLearningIntentionHTML(glance: Glance): string {\n const learningIntention = stripPoisFromGlanceContent(glance.content);\n\n return marked(learningIntention);\n}\n\nexport function useLearningIntentionMarkdown(\n video: Video,\n hasGlanceData?: boolean\n): string {\n const [ markdownHTML, setMarkdownHTML ] = useState('');\n\n useEffect(() => {\n if (!hasGlanceData)\n return;\n\n const content = getLearningIntentionHTML(video.glance);\n\n setMarkdownHTML(content);\n }, [ video.glance?.content, hasGlanceData ]);\n\n return markdownHTML;\n}\n\nexport function hasGlanceData(video: Video | Clip): boolean {\n return video.glance?.content && video.glance?.format === 'text/markdown';\n}","import React from 'react';\n\nexport function VideoDetailsPartial(): JSX.Element {\n return (\n <div className='p-3 mb-3 border rounded'>\n <div className='row'>\n <div className='pe-3 col-md-7 border-right'>\n <div className='partial-loading-background mb-2' style={{ height: '1.5rem', width: '12rem' }}></div>\n <div className='partial-loading-background mb-2' style={{ height: '4.5rem' }}></div>\n <div className='partial-loading-background' style={{ height: '1.5rem', width: '15rem' }}></div>\n </div>\n <div className='col-md-5 ps-md-3 pt-3 pt-md-0'>\n <div className='partial-loading-background mb-2' style={{ height: '1.5rem', width: '7rem' }}></div>\n <div className='partial-loading-background mb-2' style={{ height: '1.5rem', width: '10rem' }}></div>\n <div className='partial-loading-background mb-2' style={{ height: '1.5rem', width: '12rem' }}></div>\n <div className='partial-loading-background mb-2 me-2 d-inline-block' style={{ height: '1.5rem', width: '3rem' }}></div>\n <div className='partial-loading-background mb-2 me-2 d-inline-block' style={{ height: '1.5rem', width: '4rem' }}></div>\n <div className='partial-loading-background mb-2 me-2 d-inline-block' style={{ height: '1.5rem', width: '3.5rem' }}></div>\n <div className='partial-loading-background mb-2 me-2 d-inline-block' style={{ height: '1.5rem', width: '4.5rem' }}></div>\n </div>\n </div>\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 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\nimport styles from './interactive-widget-item.scss';\n\nconst namespace = 'shared.interactiveWidgetItem';\n\nexport interface InteractiveWidgetItemProps extends FixedWidgetItemProps<InteractiveMetadata> {\n imageCdnUrl: string;\n questionsAppLink: Core.AppLink;\n setFavourite?: FavouriteFunc;\n canFavourite?: CanFavouriteFunc;\n yearGroups: YearGroup[];\n}\n\nexport const InteractiveWidgetItem = React.memo(function(props: InteractiveWidgetItemProps): 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 ${styles.item}`}>\n <VideoThumbnail\n type='cosmetic'\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 />\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 {\"item\":\"rXatl\",\"thumbnail\":\"WHqSi\",\"smallItemIconWidth\":\"Pq45z\",\"smallItemInfoWidth\":\"rjvTM\",\"smallProgressBarContainer\":\"W_aym\"};","// extracted by mini-css-extract-plugin\nexport default {\"imageStyle\":\"FFgf3\",\"imageTypeResource\":\"z4O5p\",\"fallBackImage\":\"Xy4zX\"};","import React from 'react';\n\nimport { UrlHelper } from 'libs/analytics/utils/UrlHelper';\n\nimport { ImageSize, ImageType, ResizeType } from 'libs/shared/enums/Images';\nimport { ResourceFileType } from 'libs/shared/enums/ResourceFileType';\nimport { Link, Resource } from 'libs/shared/interfaces';\nimport { ImageHelper, ImageOptions } from 'libs/shared/utils/ImageHelper';\nimport { MasterTypeHelper } from 'libs/shared/utils/MasterTypeHelper';\n\nimport { BaseImage } from '../image/BaseImage';\n\nimport styles from './resource-thumbnail.scss';\n\n// Used for both PDFs and Links where we don't know the image ratio\nconst DYNAMIC_RATIO_IMAGE_OPTIONS: ImageOptions = {\n width: 200,\n resizeType: ResizeType.Cover\n};\n\nfunction getThumbnailUrl(imageCdnUrl: string, resource: Resource | Link): string {\n const imageType = getImageType(resource);\n\n // Use the thumbnail if defined\n if ('thumbnail' in resource && resource.thumbnail?.url)\n return ImageHelper.createUrl(resource.thumbnail?.url, { ...DYNAMIC_RATIO_IMAGE_OPTIONS });\n \n const previewUrl = UrlHelper.safeUrlConcat(imageCdnUrl, '/v1/previews');\n\n if (!MasterTypeHelper.isResource(resource))\n return ImageHelper.createResourceImage(previewUrl, resource.url, { ...DYNAMIC_RATIO_IMAGE_OPTIONS });\n\n if (imageType === ImageType.Pdf) {\n return resource.metadata.type === ResourceFileType.Pdf\n ? ImageHelper.createResourceImage(previewUrl, resource.url, { ...DYNAMIC_RATIO_IMAGE_OPTIONS })\n : ImageHelper.createResourceImage(previewUrl, resource.pdf?.url, { ...DYNAMIC_RATIO_IMAGE_OPTIONS });\n }\n\n if (resource.metadata.type !== ResourceFileType.Zip)\n return ImageHelper.createUrl(resource.url, { size: ImageSize.Medium, resizeType: ResizeType.Cover });\n\n return '/images/zip-resource.png';\n}\n\nfunction getImageType(resource: Resource | Link): ImageType {\n if (!MasterTypeHelper.isResource(resource))\n return ImageType.Link;\n\n if (resource.metadata.type === ResourceFileType.Pdf || resource.pdf?.url)\n return ImageType.Pdf;\n\n return ImageType.Thumbnails;\n}\n\ninterface ResourceThumbnailProps {\n imageCdnUrl: string;\n resource: Resource | Link;\n imageErrorFallbackUrl: string;\n preloadImage: boolean;\n}\n\nexport function ResourceThumbnail(props: ResourceThumbnailProps): JSX.Element {\n let metadata = null;\n let rotation = 0;\n\n if (MasterTypeHelper.isResource(props.resource)) {\n metadata = props.resource.metadata;\n rotation = props.resource.thumbnail?.metadata?.rotation ?? 0;\n }\n\n const thumbnailUrl = getThumbnailUrl(props.imageCdnUrl, props.resource);\n\n return (\n <BaseImage\n data={thumbnailUrl}\n imageType={getImageType(props.resource)}\n imageStyle={{ transform: `rotate(${rotation}deg)` }}\n alt={props.resource.name}\n errorFallbackImageSrc={props.imageErrorFallbackUrl}\n errorFallbackImageClassName={styles.fallBackImage}\n imageClassName={metadata?.type === ResourceFileType.Image ? `${styles.imageTypeResource} ${styles.imageStyle}` : ''}\n preload={props.preloadImage}\n preventLoad={!props.preloadImage}\n >\n </BaseImage>\n );\n}","import { ResourceType } from 'libs/shared/interfaces';\n\nexport const ResourceHelper = {\n getResourceTypeName(resourceType: ResourceType): string {\n switch (resourceType) {\n case 'additional-materials':\n return 'Additional Materials';\n\n case 'atom-guide':\n return 'ATOM Guide';\n\n case 'teacher-pack':\n return 'Teacher Pack';\n\n case 'student-activity':\n return 'Student Activity';\n\n default:\n return 'N/A';\n }\n }\n};","// extracted by mini-css-extract-plugin\nexport default {\"imageStyle\":\"I9E5O\",\"item\":\"tqUFn\",\"dashboard\":\"o7j7p\",\"playPage\":\"V2RwX\",\"aspectRatio\":\"OnJDH\",\"outerContainer\":\"CIFy7\",\"innerContainer\":\"oUZPD\",\"actions\":\"jzGAm\",\"titleBelow\":\"Cpjs3\",\"thumbnailContainer\":\"EDiGi\",\"titleAbove\":\"e9ejn\",\"teacherPack\":\"_tdVE\",\"text\":\"g5NWS\",\"hoverState\":\"xRYhX\",\"atomGuide\":\"X39wU\",\"studentActivity\":\"X9pMl\",\"additionalMaterials\":\"qRVUo\",\"userUploaded\":\"_18JaV\",\"imageTypeResource\":\"KYtZL\",\"download\":\"fbb_e\"};","import React from 'react';\n\nimport { AppLinkHelper } from 'libs/common/backbone/core';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, EntityType, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { ResourceThumbnail } from 'libs/shared/components/resource-thumbnail/ResourceThumbnail';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { TitleSubText } from 'libs/shared/components/title-sub-text/TitleSubText';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { TypeBadge } from 'libs/shared/components/type-badge/TypeBadge';\nimport { FixedWidgetItemProps } from 'libs/shared/components/widgets/items/FixedWidgetItemProps';\nimport { SeoConstants } from 'libs/shared/constants/SeoConstants';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ResourceFileType } from 'libs/shared/enums/ResourceFileType';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Link, Resource, ResourceType } from 'libs/shared/interfaces';\nimport { MasterTypeHelper } from 'libs/shared/utils/MasterTypeHelper';\nimport { ResourceHelper } from 'libs/shared/utils/ResourceHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './resource-widget-item.scss';\n\nfunction getColour(resourceType?: ResourceType): string {\n switch (resourceType) {\n case 'atom-guide':\n return styles.atomGuide;\n case 'student-activity':\n return styles.studentActivity;\n case 'teacher-pack':\n return styles.teacherPack;\n case 'additional-materials':\n return styles.additionalMaterials;\n default:\n return styles.userUploaded;\n }\n}\n\nfunction useCanPreview(data: Resource | Link, actionBehaviour: 'normal' | 'public'): boolean {\n const breakpoints = useBreakpoints();\n\n /**\n * When viewing publicly, the resource applink will\n * prompt the user to sign-up (not preview the underlying resource)\n */\n if (actionBehaviour === 'public')\n return true;\n\n if (breakpoints.xs || breakpoints.sm)\n return false;\n\n if (data.type !== 'resource')\n return false;\n \n // Require metadata\n if (!('metadata' in data))\n return false;\n\n // We can preview images\n if (data.metadata.type === ResourceFileType.Image)\n return true;\n\n // If we are a pdf and have a url\n if (data.metadata.type === ResourceFileType.Pdf)\n return !!data.url;\n\n // If we have a pdf assoc\n return !!data.pdf?.url;\n}\n\ninterface ResourceTheme {\n containerClass?: string;\n thumbnailContainerClass?: string;\n}\n\nexport interface ResourceTileProps {\n data: Resource | Link;\n imageCdnUrl: string;\n imageErrorFallbackUrl?: string;\n theme?: ResourceTheme;\n\n titlePosition: 'above' | 'below' | 'none';\n hideTypeBadge?: boolean;\n onClickDownload?: (resource: Resource) => void;\n applyHoverState?: boolean;\n preloadImage: boolean;\n actionBehaviour?: 'normal' | 'public';\n}\n\nResourceTile.defaultProps = {\n preloadImage: true,\n actionBehaviour: 'normal'\n};\n\n/**\n * This component intentionally doesn't contain an appLink/download link\n * so that the resource download behaviour can be handled differently depending\n * on where this is rendered (e.g. primary play page vs embedded player)\n */\nexport function ResourceTile(props: ResourceTileProps): JSX.Element {\n let metadata = null;\n\n if ('metadata' in props.data) {\n metadata = props.data.metadata;\n }\n\n const isResource = MasterTypeHelper.isType<Resource>(props.data, MasterType.Resource);\n\n function getInnerContainerClass(resourceType: ResourceType): string {\n let baseClass = `\n d-flex flex-column align-items-center justify-content-end rounded-3 h-100\n position-relative ${getColour(resourceType)} ${styles.innerContainer}`;\n\n if (props.theme?.containerClass) {\n baseClass += ` ${props.theme.containerClass}`;\n } else {\n baseClass += ` pt-3 px-3`;\n }\n\n if (props.applyHoverState) {\n baseClass += ` ${styles.hoverState}`;\n }\n\n return baseClass;\n }\n\n function onDownload() {\n if (!MasterTypeHelper.isResource(props.data))\n return;\n\n if (typeof props.onClickDownload === 'function') {\n props.onClickDownload(props.data);\n }\n }\n\n return (\n <>\n <div className={styles.aspectRatio}>\n <div className={styles.outerContainer}>\n <div className={getInnerContainerClass(metadata?.resourceType)}>\n {props.titlePosition === 'above' && (\n <Tooltip title={props.data.name}>\n <h3 className={`text-center text-break h5 mb-3 ${styles.text}`}>\n <span className='clamp-1'>{props.data.name}</span>\n </h3>\n </Tooltip>\n )}\n\n <div className={`\n ${props.theme?.thumbnailContainerClass ?? ''} w-75 overflow-hidden \n ${styles.thumbnailContainer} ${props.titlePosition === 'above' ? styles.titleAbove : ''} \n ${styles.imageStyle}\n `}>\n <ResourceThumbnail\n resource={props.data}\n imageCdnUrl={props.imageCdnUrl}\n imageErrorFallbackUrl={props.imageErrorFallbackUrl}\n preloadImage={props.preloadImage}\n />\n </div>\n\n {isResource && props.onClickDownload && props.actionBehaviour === 'normal' && (\n <div className={styles.actions}>\n <DivButton\n onClick={e => {\n e.preventDefault();\n e.stopPropagation();\n onDownload();\n }}\n className={`${styles.download} d-flex align-items-center justify-content-center`}\n >\n <SvgContainer svgName={cvSvgLibrary.Download} />\n </DivButton>\n </div>\n )}\n\n {!props.hideTypeBadge && isResource && (\n <TypeBadge typeId={MasterType.Resource} />\n )}\n </div>\n </div>\n </div>\n {props.titlePosition === 'below' && MasterTypeHelper.isType<Resource>(props.data, MasterType.Resource) && (\n <div className={`mt-1 ${styles.titleBelow}`}>\n {!!props.data?.metadata?.resourceType && (\n <TitleSubText>\n {ResourceHelper.getResourceTypeName(props.data.metadata.resourceType)}\n </TitleSubText>\n )}\n <h3 className='h6 clamp-2'>\n {props.data.name}\n </h3>\n </div>\n )}\n </>\n );\n}\n\nexport interface ResourceWidgetItemProps extends ResourceTileProps, FixedWidgetItemProps<Resource | Link> {\n location: 'play-page' | 'dashboard';\n}\n\nexport const ResourceWidgetItem = React.memo(function(props: ResourceWidgetItemProps): JSX.Element {\n // Mobile is not allowed to preview\n const canPreview = useCanPreview(props.data, props.actionBehaviour);\n\n function getLocationClass(): string {\n if (props.location === 'play-page')\n return styles.playPage;\n\n return styles.dashboard;\n }\n\n const analyticsData = { ...props.analyticsData, ...props.data };\n\n const analyticsOptions: AnalyticsOptions = {\n ...props.analyticsOptions,\n actionType: UserAction.Click,\n entity: props.data.typeId === MasterType.Resource ? EntityType.Resource : EntityType.Link\n };\n\n function logAction(): void {\n AnalyticsHelper.logUserAction(analyticsData, analyticsOptions);\n }\n\n const tileProps: ResourceTileProps = {\n ...props,\n // Apply the hover state if we have a url or the resource can be previewed\n applyHoverState: canPreview || !!props.data.url\n };\n\n return (\n <div className={`px-1 flex-shrink-0 ${styles.item} ${getLocationClass()} ${SeoConstants.RESOURCE_ITEM_SELECTOR}`}>\n {(() => {\n const className = `d-block ${props.titlePosition === 'above' ? 'no-decoration' : ''}`;\n\n // Handle resource links\n if (props.data.type === 'link') {\n return (\n <a href={props.data.url} target='_blank' className={className} onClick={logAction}>\n <ResourceTile {...tileProps} />\n </a>\n );\n }\n\n if (canPreview) {\n /**\n * Previewing resources in a public context will always display the sign-up popup, so there \n * will never be a full URL. For SEO purposes, we deliberately use a span over an anchor\n * to ensure we're not creating self-referencing elements that will burn crawl budget.\n */\n if (props.actionBehaviour === 'public') {\n return (\n <div className={`${className} cursor-pointer d-inline`} onClick={() => {\n logAction();\n AppLinkHelper.trigger(props.getAppLink(props.data));\n }}>\n <ResourceTile {...tileProps} />\n </div>\n );\n }\n\n return (\n <AppLink\n appLink={props.getAppLink(props.data)}\n className={className}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n >\n <ResourceTile {...tileProps} />\n </AppLink>\n );\n }\n\n // URLs cannot be previewed\n if (props.data.url) {\n return (\n <a href={props.data.url} className={className} onClick={logAction}>\n <ResourceTile {...tileProps} />\n </a>\n );\n }\n\n // Theres no url, so don't render an <a>\n return (\n <div className={className}>\n <ResourceTile {...tileProps} />\n </div>\n );\n })()}\n </div>\n );\n});","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { Theme } from 'libs/shared/interfaces';\n\nimport { ThemeType } from '../enums/ThemeType';\n\nexport const ThemeRequests = {\n theme(id: string): Flight.Request {\n return {\n url: `/api/domain/v1/themes/${id}`,\n key: `themes:${id}`\n };\n },\n\n themeImages(name: string, type: ThemeType): Flight.Request {\n return {\n url: UrlHelper.urlBuilder('/api/domain/v1/themes', { name, type }),\n key: `themes:${name}:${type}`\n };\n },\n\n themes(type?: string): Flight.Request {\n let url = '/api/domain/v1/themes';\n let key = 'themes';\n\n if (type) {\n url += `?type=${type}`;\n key += `:type:${type}`;\n }\n\n return {\n url,\n key,\n formatData: (themes: Theme[]) => {\n return themes.sort((a, b) => a.name.localeCompare(b.name));\n }\n };\n },\n\n createTheme(\n data: Theme,\n success?: (data: HashObject) => void,\n error?: (xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: '/api/domain/v1/themes',\n key: 'theme',\n data,\n type: HttpVerbs.POST,\n invalidationKeys: 'themes',\n success,\n error,\n always\n };\n },\n\n updateTheme(\n id: string,\n data: Theme,\n success?: (data: HashObject) => void,\n error?: (xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: `/api/domain/v1/themes/${id}`,\n key: `update:theme:${id}`,\n data,\n type: HttpVerbs.PUT,\n success,\n error,\n always\n };\n },\n\n deleteTheme(\n id: string,\n success?: (data: HashObject) => void,\n error?: (xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: `/api/domain/v1/themes/${id}`,\n key: `delete:theme:${id}`,\n type: HttpVerbs.DELETE,\n invalidationKeys: 'themes',\n success,\n error,\n always\n };\n }\n};","import React from 'react';\n\n// https://reactjs.org/docs/hooks-faq.html#how-to-get-the-previous-props-or-state\nexport function usePrevious<T>(value: T): T {\n const ref = React.useRef<T>();\n React.useEffect(() => {\n ref.current = value;\n });\n return ref.current;\n}","import React from 'react';\n\nimport { usePrevious } from './usePrevious';\n\nconst HEADER_OFFSET = 80; // Size of header + some extra spacing\n\nexport const useTableOfContentsScroll = (elements: Element[], activeId: string) => {\n const [ hasDoneInitialScroll, setHasDoneInitialScroll ] = React.useState(false);\n\n const previousId = usePrevious(activeId);\n const currentId = activeId;\n\n React.useLayoutEffect(() => {\n if (!hasDoneInitialScroll || previousId !== currentId) {\n const target = elements.find(heading => heading && (heading?.id === currentId));\n\n if (target) {\n const rec = target.getBoundingClientRect();\n\n window.scrollBy({\n top: rec.top - HEADER_OFFSET,\n behavior: 'smooth'\n });\n \n if (!hasDoneInitialScroll)\n setHasDoneInitialScroll(true);\n }\n }\n }, [ elements, previousId, currentId, hasDoneInitialScroll ]);\n};","import { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, EntityType, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { Resource } from '../interfaces';\n\nlet downloadRef: HTMLIFrameElement = null;\n\nexport const DownloadHelper = {\n getVideoDownloadUrl(downloadProxyUrl: string, token: string): string {\n return UrlHelper.safeUrlConcat(UrlHelper.makeHttps(downloadProxyUrl), `/download?token=${token}`);\n },\n\n downloadResource(\n resource: Resource,\n analyticsData: HashObject,\n analyticsOptions: AnalyticsOptions\n ): void {\n let iframe = downloadRef;\n\n if (!downloadRef) {\n iframe = downloadRef = document.createElement('iframe');\n document.body.appendChild(iframe);\n\n iframe.style.display = 'none';\n }\n\n iframe.src = resource.url;\n\n AnalyticsHelper.logUserAction({\n id: resource?.id,\n name: resource?.name,\n resourceType: resource?.metadata?.resourceType,\n ...analyticsData\n }, {\n actionType: UserAction.Download,\n entity: EntityType.Resource,\n workflowPhase: WorkflowPhase.Complete,\n ...analyticsOptions\n });\n }\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 { 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, Clip, FavouriteFunc, YearGroup } from 'libs/shared/interfaces';\n\nimport styles from './clip-widget-item.scss';\n\nexport interface ClipWidgetItemProps extends FixedWidgetItemProps<Clip> {\n imageCdnUrl: string;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n yearGroups: YearGroup[];\n}\n\nexport const ClipWidgetItem = React.memo(function(props: ClipWidgetItemProps): JSX.Element {\n const { data: clip, thumbnailSize, preloadImage, getAppLink } = props;\n\n return (\n <div className={`flex-shrink-0 px-1 ${styles.item}`}>\n <VideoThumbnail\n type='cosmetic'\n textPosition={ThumbnailTextPosition.Independent}\n video={clip}\n appLink={getAppLink(clip)}\n imageOptions={{ size: thumbnailSize }}\n preload={preloadImage}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n imageCdnUrl={props.imageCdnUrl}\n hideDuration={false}\n />\n\n <div className='mt-2'>\n <ThumbnailText\n {...props}\n video={clip}\n appLink={props.getAppLink(clip)}\n />\n </div>\n </div>\n );\n});","// extracted by mini-css-extract-plugin\nexport default {\"item\":\"hzP5u\",\"thumbnail\":\"z2JjL\",\"smallItemIconWidth\":\"PfCrs\",\"smallItemInfoWidth\":\"AHFZu\",\"smallProgressBarContainer\":\"WfOtB\",\"smallItemNameWidth\":\"Rq6Cd\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { FixedWidget } from 'libs/shared/components/widgets/fixed-widget';\nimport { ClipWidgetItem, ClipWidgetItemProps } from 'libs/shared/components/widgets/items/clip-widget-item/ClipWidgetItem';\nimport { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { CanFavouriteFunc, Clip, FavouriteFunc, Video, YearGroup } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'shared.playPageClips';\n\ninterface PlayPageClipsProps {\n video: Video | Clip;\n clips: Clip[];\n canViewClips: boolean;\n yearGroups: YearGroup[];\n imageCdnUrl: string;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n analyticsData: HashObject;\n}\n\nexport function PlayPageClips(props: PlayPageClipsProps): JSX.Element {\n if (!props.canViewClips || !props.clips?.length)\n return <></>;\n\n const parentIsVideo = VideoHelper.isVideo(props.video);\n\n function getAppLink() {\n if (VideoHelper.isVideo(props.video)) {\n return {\n action: Actions.Videos.VIDEO_CLIPS,\n application: AppChannels.VIDEOS,\n args: [props.video.id]\n };\n }\n return {\n action: Actions.Clips.CLIP_CLIPS,\n application: AppChannels.CLIPS,\n args: [props.video.id]\n };\n }\n\n return (\n <section className='pb-4'>\n <FixedWidget<ClipWidgetItemProps>\n name={LanguageService.getPhrase(\n namespace,\n parentIsVideo ? 'clips' : 'otherClips',\n { count: props.clips.length }\n )}\n contents={WidgetContents.Clips}\n collection={props.clips}\n prefetched\n getChildAppLink={(clip: Clip) => {\n return {\n application: AppChannels.CLIPS,\n action: Actions.Clips.PLAY_CLIP,\n args: [ clip.id, TextHelper.slugify(clip.name) ]\n };\n }}\n appLink={getAppLink()}\n childComponent={ClipWidgetItem}\n extraChildComponentProps={{\n yearGroups: props.yearGroups,\n imageCdnUrl: props.imageCdnUrl,\n setFavourite: props.setFavourite,\n canFavourite: props.canFavourite\n }}\n analyticsData={props.analyticsData}\n />\n </section>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { FixedWidget } from 'libs/shared/components/widgets/fixed-widget';\nimport { InteractiveWidgetItem, InteractiveWidgetItemProps } from 'libs/shared/components/widgets/items/interactive-widget-item/InteractiveWidgetItem';\nimport { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { CanFavouriteFunc, Clip, FavouriteFunc, Interactive, Video, YearGroup } from 'libs/shared/interfaces';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'shared.playPageInteractives';\n\ninterface PlayPageInteractivesProps {\n canViewInteractives: boolean;\n video: Video | Clip;\n imageCdnUrl: string;\n analyticsData: HashObject;\n containerRef: React.RefObject<HTMLDivElement>;\n yearGroups: YearGroup[];\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n}\n\nexport function PlayPageInteractives(props: PlayPageInteractivesProps): JSX.Element {\n if (!props.canViewInteractives || !props.video.interactives?.data?.length)\n return <></>;\n\n function getAppLink() {\n if (VideoHelper.isVideo(props.video))\n return {\n action: Actions.Videos.VIDEO_INTERACTIVES,\n application: AppChannels.VIDEOS,\n args: [props.video.id]\n };\n\n return {\n action: Actions.Clips.CLIP_INTERACTIVES,\n application: AppChannels.CLIPS,\n args: [props.video.id]\n };\n }\n\n return (\n <section className='pb-4' ref={props.containerRef} id={PlayPageAnchor.Interactives}>\n <FixedWidget<InteractiveWidgetItemProps>\n name={LanguageService.getPhrase(namespace, 'interactives', { count: props.video.interactives.data.length })}\n contents={WidgetContents.Interactives}\n collection={props.video.interactives.data}\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 appLink={getAppLink()}\n childComponent={InteractiveWidgetItem}\n extraChildComponentProps={{\n yearGroups: props.yearGroups,\n setFavourite: props.setFavourite,\n canFavourite: props.canFavourite,\n imageCdnUrl: props.imageCdnUrl,\n questionsAppLink: {\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.PREVIEW_QUESTIONS\n }\n }}\n analyticsData={props.analyticsData}\n />\n </section>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"series\":\"wTlJJ\",\"badgeListContainer\":\"Vaout\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { Actions } from 'libs/shared/components/actions/Actions';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { AudienceLabel } from 'libs/shared/components/audience-label/AudienceLabel';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BadgeListContainer } from 'libs/shared/components/badges/BadgeListContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { RestrictionPadlock } from 'libs/shared/components/video-list/components/restriction-padlock/RestrictionPadlock';\nimport { VideoSubText } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { Clip, PresentationAudience, Series, Video, YearGroup } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { VideoFeaturesHash } from 'shared/hooks/useVideoFeatureAccess';\n\nimport styles from './title-and-actions.scss';\n\nconst namespace = 'shared.playPage';\n\ninterface PlayPageTitleAndActionsProps {\n media: Clip | Video;\n yearGroups: YearGroup[];\n audiences: PresentationAudience[];\n featureAccess: VideoFeaturesHash;\n getSeriesAppLink?: (series: Series) => Core.AppLink;\n originalVideoAppLink?: Core.AppLink;\n shareId: string;\n}\n\nexport function PlayPageTitleAndActions(props: PlayPageTitleAndActionsProps): JSX.Element {\n const mergedAudience = useMergeAudiences(props.media.subjectPresentationAudiences?.data, props.audiences);\n\n const containerRef = React.useRef<HTMLDivElement>(null);\n const titleContainerRef = React.useRef<HTMLDivElement>(null);\n\n const hasBadges = (\n (VideoHelper.isVideo(props.media) && !!props.media.rating?.value) ||\n (VideoHelper.isVideo(props.media) && !!props.media.productionYear) ||\n !!props.media.subjectPresentationAudiences?.data?.length\n );\n\n const videoActions = useVideoActions({\n location: VideoActionsLocation.PlayPage,\n shareId: props.shareId\n });\n\n const canViewOriginal = !!props.originalVideoAppLink &&\n VideoHelper.isClip(props.media) &&\n VideoHelper.canViewOriginalVideo(props.media);\n\n return (\n <section className='mb-3 position-relative' ref={containerRef}>\n <div className='d-inline-block w-100' ref={titleContainerRef}>\n {props.featureAccess.canNavigate &&\n <div className='ms-2 float-end'>\n <Actions\n actions={videoActions.getVideoActions(props.media)}\n actionsDropdownClassName='btn btn-outline-dark'\n fetchMore={() => videoActions.fetchMoreActions(props.media)}\n />\n </div>\n }\n\n {!!VideoHelper.isVideo(props.media) && (\n <VideoSubText\n type='series'\n video={props.media}\n appLink={props.getSeriesAppLink?.(props.media.series)}\n className={`${styles.series} text-truncate mw-100`}\n analyticsOptions={{ location: LocationContext.PlayPage }}\n />\n )}\n <h1 className='h4 mb-2 mw-100'>\n <span className='align-self-center'>{props.media.name}</span>\n <RestrictionPadlock\n tooltipPlacement='right'\n className='d-inline-block ps-1'\n video={props.media}\n yearGroups={props.yearGroups}\n />\n </h1>\n\n {hasBadges && (\n <BadgeListContainer className={styles.badgeListContainer}>\n <AudienceLabel\n audience={mergedAudience}\n className='bg-white text-dark'\n border='dark'\n />\n {VideoHelper.isVideo(props.media) && (\n <Badge type={BadgeType.Rating} data={props.media.rating} />\n )}\n {VideoHelper.isVideo(props.media) && (\n <Badge type={BadgeType.ProductionYear} data={props.media.productionYear} />\n )}\n </BadgeListContainer>\n )}\n </div>\n\n {VideoHelper.isClip(props.media) && canViewOriginal && (\n <p className='clamp-1'>\n <Text namespace={namespace} phrase='viewOriginal' />\n &nbsp;\n <AppLink className='info-link' appLink={props.originalVideoAppLink}>\n {props.media._parentVideo?.name}\n </AppLink>\n </p>\n )}\n </section>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"mask\":\"LL7My\",\"centeredIcon\":\"x_1f6\",\"bgImage\":\"QoLgZ\",\"centeredOverlay\":\"BcnSH\"};","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { EntityType, LocationContext, SignUpDescriptors, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './player-placeholder.scss';\n\nconst namespace = 'shared.playerPlaceholder';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface PlayerPlaceholderProps {\n video: VideoTypes;\n type: 'pip' | 'public';\n appLink?: Core.AppLink;\n}\n\nexport function PlayerPlaceholder(props: PlayerPlaceholderProps): JSX.Element {\n switch (props.type) {\n case 'pip':\n return <PipPlaceholder {...props} />;\n case 'public':\n return <PublicPlaceholder {...props} />;\n default:\n return <></>;\n }\n}\n\nconst PipPlaceholder = (props: PlayerPlaceholderProps) => (\n <div\n className={`position-relative responsive-img ${styles.bgImage}`}\n style={{ backgroundImage: `url('${VideoHelper.getThumbnail(props.video)?.url ?? ''}')` }}\n >\n <p className={`m-0 text-white h3 ${styles.centeredOverlay}`}>{getPhrase('playingPiP')}</p>\n <div className={styles.mask} />\n </div>\n);\n\nconst PublicPlaceholder = (props: PlayerPlaceholderProps) => {\n const thumbnailUrl = ImageHelper.createUrl(VideoHelper.getThumbnail(props.video)?.url ?? '', {\n size: ImageSize.Large\n });\n\n return (\n <div\n className={`position-relative responsive-img ${styles.bgImage}`}\n style={{ backgroundImage: `url('${thumbnailUrl}')` }}\n >\n <AppLink\n appLink={props.appLink}\n analyticsOptions={{\n actionType: UserAction.Click,\n location: LocationContext.PlayPage,\n entity: EntityType.AppLink,\n workflowPhase: WorkflowPhase.Start,\n descriptor: SignUpDescriptors.SignUp\n }}\n analyticsData={{}}\n >\n <SvgContainer\n svgName={cvSvgLibrary.PlayCircle}\n className={styles.centeredIcon}\n />\n <div className={styles.mask} />\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 { 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';\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}\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 <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 ? (\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 />\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 );\n}","import { Flight } from 'libs/common/react/index';\n\nimport { LocalPermissionName, PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { Config } from 'libs/shared/interfaces/models/Config';\n\nimport { LiteRouteHelper } from 'shared/utils/LiteRouteHelper';\n\nexport interface VideoFeaturesHash {\n canViewGlance: boolean;\n canViewResources: boolean;\n canViewInteractives: boolean;\n canViewClips: boolean;\n canUseActions: boolean;\n canViewPublicLayout: boolean;\n canNavigate: boolean;\n canViewCurriculumLinks: boolean;\n canViewResourceItems: boolean;\n canWatchPublicly: (videoId: string) => boolean;\n}\n\nexport function useVideoFeatureAccess() {\n const { hasPermissions, hasLocalPermissions } = usePermissions();\n const { hasProduct } = useProducts();\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const hasNP = hasProduct(ProductId.Primary);\n\n function showPublicLayout(): boolean {\n /**\n * Authenticated users should never see the placeholder\n */\n if (hasLocalPermissions(LocalPermissionName.WatchVideos))\n return false;\n\n /**\n * Accessing a play page unathenticated will have different contextual behabviours:\n * - For a share page, the user should see the video and never the placeholder\n * - For a public browsing page (ie. using a route-prefix) they should see the placeholder\n */\n return LiteRouteHelper.hasRegionPrefix();\n }\n\n /**\n * Publicly available video ids are maintained on the backend config. \n */\n function canWatchPublicly(videoId: string): boolean {\n if (!videoId)\n return false;\n\n return !!config.data?.allowedPublicVideos?.[videoId];\n }\n\n return {\n canWatchPublicly,\n canViewGlance: hasPermissions(PermissionName.ViewVideoGlance),\n canViewResources: true,\n canViewInteractives: hasNP && hasPermissions(PermissionName.ViewVideoInteractives),\n canViewClips: hasNP && hasPermissions(PermissionName.ViewVideoClips),\n canViewCurriculumLinks: hasPermissions(PermissionName.ViewCurriculums),\n canUseActions: hasLocalPermissions(LocalPermissionName.UseVideoActions),\n canViewPublicLayout: showPublicLayout(),\n canViewResourceItems: hasLocalPermissions(LocalPermissionName.ViewVideoResourceItems),\n canNavigate: hasNP\n };\n}","import React from 'react';\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.data?.isAuthenticated)\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 ...r,\n ClassificationRequests.hasCurriculumLinks(unhydratedVideos, null, options.flightNamespace),\n VideoRequests.videoMixinAssocs(unhydratedVideos, options.flightNamespace)\n ]);\n }, [ videoIds?.length, currentUser.data?.isAuthenticated ]);\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","namespace","PlayPageResources","hasPermissions","resources","video","isLearner","data","links","filteredResources","filter","r","includes","metadata","resourceType","getResources","length","id","containerRef","name","count","contents","collection","prefetched","childComponent","R","extraChildComponentProps","imageCdnUrl","imageErrorFallbackUrl","resourceThumbnailFallbackUrl","actionBehaviour","canViewResources","location","titlePosition","onClickDownload","resource","analyticsData","actionType","entity","getChildAppLink","getAppLink","analyticsOptions","workflowPhase","descriptor","SignUp","PointOfInterestList","Text","phrase","pointsOfInterest","map","poi","timeStamp","DurationHelper","startTime","suppressInteractivity","key","description","DivButton","onClickPoiItem","SCROLL_HEIGHT_MAX","VideoAtAGlance","canViewGlance","learningIntentionMarkdownHTML","tags","VideoHelper","tag","tagType","TagType","getTags","autoHeight","autoHeightMax","height","dangerouslySetInnerHTML","__html","TagList","TagHelper","getTagAppLink","time","setStartTime","POI_LINK_LINE","useLearningIntentionMarkdown","hasGlanceData","useState","markdownHTML","setMarkdownHTML","useEffect","content","glance","learningIntention","replace","format","VideoDetailsPartial","style","width","PartialVideoList","Array","numVideos","fill","_","i","allowBulkActions","PartialVideoItem","breakpoints","useBreakpoints","isSmall","VideoListHelper","withDragHandle","withReordering","xs","Row","Col","InteractiveWidgetItem","interactive","thumbnailSize","preloadImage","questionsAppLink","args","questionsNumber","_timepoints","value","VideoThumbnail","type","textPosition","ThumbnailTextPosition","appLink","imageOptions","preload","setFavourite","canFavourite","hideDuration","ThumbnailText","AppLink","options","smartCount","DYNAMIC_RATIO_IMAGE_OPTIONS","resizeType","getImageType","MasterTypeHelper","ResourceFileType","pdf","url","ResourceThumbnail","rotation","thumbnail","thumbnailUrl","imageType","ImageHelper","previewUrl","UrlHelper","getThumbnailUrl","BaseImage","imageStyle","transform","alt","errorFallbackImageSrc","errorFallbackImageClassName","imageClassName","preventLoad","ResourceHelper","getResourceTypeName","ResourceTile","isResource","MasterType","baseClass","getColour","theme","containerClass","applyHoverState","getInnerContainerClass","Tooltip","title","thumbnailContainerClass","e","preventDefault","stopPropagation","hideTypeBadge","TypeBadge","typeId","TitleSubText","ResourceWidgetItem","canPreview","sm","logAction","AnalyticsHelper","tileProps","SeoConstants","href","target","ThemeRequests","themeImages","themes","formatData","sort","a","b","localeCompare","createTheme","success","error","always","invalidationKeys","updateTheme","deleteTheme","usePrevious","current","useTableOfContentsScroll","elements","activeId","hasDoneInitialScroll","setHasDoneInitialScroll","previousId","currentId","find","heading","rec","getBoundingClientRect","window","scrollBy","top","behavior","downloadRef","DownloadHelper","getVideoDownloadUrl","downloadProxyUrl","token","downloadResource","iframe","document","createElement","body","appendChild","display","src","ArchivedBanner","getPhrase","mapTypeId","hasStudentExperience","RestrictionBanner","restrictions","yearGroups","canManageVideoAccess","baseClassName","application","action","params","objectId","objectTypeId","ClipWidgetItem","clip","PlayPageClips","canViewClips","clips","parentIsVideo","LanguageService","WidgetContents","TextHelper","PlayPageInteractives","canViewInteractives","interactives","PlayPageTitleAndActions","mergedAudience","media","subjectPresentationAudiences","audiences","titleContainerRef","hasBadges","rating","productionYear","videoActions","useVideoActions","shareId","canViewOriginal","originalVideoAppLink","featureAccess","canNavigate","Actions","actions","getVideoActions","actionsDropdownClassName","fetchMore","fetchMoreActions","VideoSubText","getSeriesAppLink","series","RestrictionPadlock","tooltipPlacement","BadgeListContainer","AudienceLabel","audience","border","Badge","_parentVideo","PlayerPlaceholder","PipPlaceholder","PublicPlaceholder","backgroundImage","RelatedVideos","currentUser","isAuthenticated","relatedVideos","hasError","hasCompleted","videos","canAutoplay","currentVideo","getSubTextAppLink","moviesAndTv","mtv","getVideoAppLink","presentationAudiences","getPreviewQuestionsAppLink","hasMore","useVideoFeatureAccess","hasLocalPermissions","hasProduct","config","hasNP","canWatchPublicly","videoId","allowedPublicVideos","canViewCurriculumLinks","canUseActions","canViewPublicLayout","canViewResourceItems","useVideoMixin","hydratedVideos","Set","videoIds","isArray","Boolean","v","request","setRequest","unhydratedVideos","forEach","has","push","add","flightNamespace"],"sourceRoot":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/4060-77244f1012-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/forms/form-checkbox/FormCheckbox.tsx","file:///app/packages/libs/shared/src/components/forms/form-field/CharacterCounter.tsx","file:///app/packages/libs/shared/src/components/forms/form-field/form-field.scss","file:///app/packages/libs/shared/src/components/forms/form-field/FormField.tsx","file:///app/packages/libs/shared/src/components/forms/form-wrapper/FormWrapper.tsx","file:///app/packages/libs/shared/src/utils/FormHelper.ts","file:///app/packages/projects/lite/src/apps/interactives/utils/getInteractiveAnalyticsData.ts","file:///app/packages/libs/shared/src/components/select-content-region/select-content-region.scss","file:///app/packages/libs/shared/src/components/select-content-region/SelectContentRegion.tsx","file:///app/packages/libs/shared/src/apps/interactives/components/edit-interactive-details/EditInteractiveDetails.tsx","file:///app/packages/projects/lite/src/apps/interactives/views/edit-interactive-details/EditInteractiveDetailsView.tsx","file:///app/node_modules/react-bootstrap/esm/Row.js"],"sourcesContent":["import * as React from 'react';\nimport { Form } from 'react-bootstrap';\nimport { FieldAttributes } from 'formik';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\n\nimport { FieldWrapper, FormFieldProps } from '../form-field/FormField';\n\n/**\n * Use this checkbox within Formik contexts\n */\nexport function FormCheckbox(props: FieldAttributes<FormFieldProps>): JSX.Element {\n const { label, checkboxLabelClassName, checkboxLabelFontWeight, className, ...fieldProps } = props;\n\n return (\n <Form.Group className='form-group'>\n <div className={`form-check ${className || ''}`}>\n <FieldWrapper className='form-check-input' {...fieldProps} />\n <Form.Label\n className={`form-check-label cursor-pointer ${checkboxLabelFontWeight === 'normal' ? 'fw-normal' : ''} \n ${checkboxLabelClassName}`}\n htmlFor={fieldProps.id}\n >\n {label}\n </Form.Label>\n {props.checkboxAppLink && props.checkboxAppLinkText && (\n <>\n <span>&nbsp;</span>\n <AppLink appLink={props.checkboxAppLink} className='info-link'>\n {props.checkboxAppLinkText}\n </AppLink>\n </>\n )}\n </div>\n </Form.Group>\n );\n}\n\n","import * as React from 'react';\nimport { useFormikContext } from 'formik';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\ninterface CharacterCounterProps<Values extends HashObject> {\n fieldName: keyof Values;\n limit: number;\n}\n\nexport function CharacterCounter<Values extends HashObject>(props: CharacterCounterProps<Values>): JSX.Element {\n const { values } = useFormikContext<Values>();\n\n const field = values[props.fieldName];\n\n if (typeof field !== 'string')\n return <></>;\n\n return (\n <div className='float-end text-secondary fw-normal'>\n {field.length}/{props.limit} characters\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"revealPassword\":\"jCfI0\",\"passwordInput\":\"RBJnf\",\"passwordContainer\":\"d78lK\",\"passwordContainerDisabled\":\"asbVo\",\"infoTooltip\":\"wzyOG\",\"spinner\":\"CycFx\"};","import * as React from 'react';\nimport { Form, Spinner } from 'react-bootstrap';\nimport { Placement } from 'react-bootstrap/esm/types';\nimport { ErrorMessage, Field, FieldAttributes, FieldProps, useFormikContext } from 'formik';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { FormCheckbox } from 'libs/shared/components/forms/form-checkbox/FormCheckbox';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { FormHelper } from 'libs/shared/utils/FormHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { CharacterCounter } from './CharacterCounter';\n\nimport styles from './form-field.scss';\n\nconst namespace = 'shared.formField';\n\nexport type FormSize = 'lg' | 'sm';\n\n// If checkboxLabelFontWeight is not specified, it will be bold by default\nexport type CheckboxLabelFontWeight = 'normal' | 'bold'\n\nexport interface FormFieldProps {\n /**\n * The name prop MUST be the same as the attribute\n * name of the value that the field is bound to.\n */\n name: string;\n label?: string;\n children?: any;\n showCharacterCounter?: boolean;\n showRequiredStar?: boolean;\n checkboxAppLink?: Core.AppLink;\n checkboxAppLinkText?: string;\n checkboxLabelClassName?: string;\n checkboxLabelFontWeight?: CheckboxLabelFontWeight\n infoTooltip?: string;\n infoTooltipPlacement?: Placement;\n infoText?: string;\n formSize?: FormSize;\n showOptionalLabel?: boolean;\n showLoadingSpinner?: boolean;\n}\n\nFieldWrapper.defaultProps = {\n autoComplete: 'off'\n};\n\nexport function FieldWrapper(\n props: FieldAttributes<FormFieldProps> & { className: string }\n): React.ReactElement {\n const { children, showLoadingSpinner, ...fieldProps } = props;\n\n const [ type, setType ] = React.useState(props.type);\n\n function onClickTogglePassword(): void {\n if (type === 'password')\n setType('text');\n else\n setType('password');\n }\n\n const resolvedChildren = FunctionHelper.isFunction(children)\n ? (f: FieldProps) => children(f)\n : React.Children.count(children) ? children : null;\n\n if (fieldProps.type !== 'password') {\n if (showLoadingSpinner) {\n return (\n <div className='position-relative'>\n <Field {...(ObjectHelper.omit(fieldProps, ['formSize']))}>\n {resolvedChildren}\n </Field>\n\n <div className={styles.spinner}>\n <Spinner animation='border' size='sm' />\n </div>\n </div>\n );\n }\n\n return (\n <Field {...(ObjectHelper.omit(fieldProps, ['formSize']))}>\n {resolvedChildren}\n </Field>\n );\n }\n\n let containerClassName = `position-relative ${styles.passwordContainer}`;\n\n if (fieldProps.className)\n containerClassName += ` ${fieldProps.className}`;\n\n if (fieldProps.disabled)\n containerClassName += ` ${styles.passwordContainerDisabled}`;\n\n /**\n * We need to wrap out input with a relatively positioned element in order to absolutely\n * position our visibility icon to reveal the password - Sha\n */\n return (\n <div className={containerClassName}>\n <Field\n {...(ObjectHelper.omit(fieldProps, [ 'formSize', 'type', 'className' ]))}\n type={type}\n className={`${styles.passwordInput} border-0 w-100 h-100 outline-none rounded`}\n >\n {resolvedChildren}\n </Field>\n {fieldProps.type === 'password' &&\n <SvgContainer\n svgName={type === 'password' ? cvSvgLibrary.VisibleOn : cvSvgLibrary.VisibleOff}\n className={`svg-container cursor-pointer ${styles.revealPassword}`}\n onClick={onClickTogglePassword}\n />\n }\n </div>\n );\n}\n\nFormField.defaultProps = {\n autoComplete: 'off',\n infoTooltipPlacement: 'top'\n};\n\nexport function FormField<Values extends HashObject>(props: FieldAttributes<FormFieldProps>): React.ReactElement {\n const {\n label,\n className,\n showCharacterCounter,\n showRequiredStar,\n infoTooltip,\n infoTooltipPlacement,\n infoText,\n formSize,\n showOptionalLabel,\n ...fieldProps\n } = props;\n\n const { errors, touched } = useFormikContext<Values>();\n\n // This function overwrites the default `onChange` function whenever `props.disabled` is set.\n // This prevents users from \"undisabling\" form fields via inspect element, then editing the field.\n const disabledOnChange = () => {};\n\n if (fieldProps.type === 'checkbox') {\n const _props = ObjectHelper.omit(props, [ 'formSize', 'infoTooltipPlacement' ]);\n\n if (props.disabled)\n _props.onChange = disabledOnChange;\n\n return <FormCheckbox {..._props} />;\n }\n\n const fieldWrapperProps = {\n ...fieldProps,\n className: FormHelper.getCustomFormControlClassName(\n errors,\n touched,\n fieldProps.name,\n formSize,\n className,\n typeof props.as === 'string' ? props.as : null\n )\n };\n\n if (props.disabled)\n fieldWrapperProps.onChange = disabledOnChange;\n\n return (\n <Form.Group className='form-group'>\n {!!label && (\n <Form.Label htmlFor={fieldProps.id} className='d-flex align-items-center'>\n {label}\n {showRequiredStar && <span className='text-danger'>*</span>}\n {infoTooltip && (\n <SvgContainer\n className={`svg-container text-secondary ${styles.infoTooltip}`}\n svgName={cvSvgLibrary.Info}\n title={infoTooltip}\n tooltipPlacement={infoTooltipPlacement}\n tooltipSpanHack\n />\n )}\n {showOptionalLabel && <span className='text-secondary'>&nbsp;<Text namespace={namespace} phrase='optional' /></span>}\n \n {!!showCharacterCounter && !!(fieldProps as React.HTMLProps<HTMLInputElement>).maxLength &&\n <div className='ms-auto'>\n <CharacterCounter\n fieldName={(fieldProps.name as keyof Values)}\n limit={(fieldProps as React.HTMLProps<HTMLInputElement>).maxLength}\n />\n </div>\n }\n </Form.Label>\n )}\n\n <FieldWrapper {...fieldWrapperProps} />\n\n {!!infoText &&\n <Form.Text className='text-secondary'>\n {infoText}\n </Form.Text>\n }\n\n <ErrorMessage name={fieldProps.name}>\n {(errorMessage: string) => <Form.Control.Feedback type='invalid'>{errorMessage}</Form.Control.Feedback>}\n </ErrorMessage>\n </Form.Group>\n );\n}","import * as React from 'react';\nimport { Formik, FormikConfig, FormikContextType, FormikErrors, FormikHelpers, FormikProps, FormikValues, useFormikContext } from 'formik';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\n/**\n * Note: This currently doesn't support arrays, but the need for arrays as initial\n * form data has not yet come up\n */\nfunction omitNullInitialValues<Values extends FormikValues>(initialValues: Values): Values {\n if (!initialValues)\n return {} as Values;\n\n const values = ObjectHelper.deepClone(initialValues);\n\n function omitChildValues(child: Values): void {\n Object.keys(values).forEach((key: keyof Values) => {\n if (!values.hasOwnProperty(key))\n return;\n \n if (ObjectHelper.isObject(child[key]))\n omitChildValues(child[key]);\n else if (values[key] === null)\n delete values[key];\n });\n }\n\n omitChildValues(values);\n return values;\n}\n\n// Omit attributes from FormikConfig that are defined in FormWrapperProps.\ntype ModifiedFormikConfig<Values extends FormikValues> = Omit<FormikConfig<Values>, 'initialValues' | 'onSubmit'>;\n\ninterface InitialStatus {\n allowInitialSubmit: boolean;\n}\n\nexport type FormSubmissionOptions<FormValues = FormikValues> = {\n reset?: boolean;\n errors?: FormikErrors<FormValues>;\n};\n\ninterface FormWrapperProps<FormValues extends FormikValues, ApiValues extends FormikValues> {\n initialValues: Partial<FormValues | ApiValues>;\n onSubmit: (data: FormValues, onDone: (options?: FormSubmissionOptions<FormValues>) => void) => void;\n castInitialValues?: boolean; // cast to validationSchema\n castValuesOnSubmit?: boolean; // cast to validationSchema\n allowInitialSubmit?: boolean; // if true, useCanSubmitForm will allow submit without any user changes.\n}\n\nFormWrapper.defaultProps = {\n castInitialValues: true,\n castValuesOnSubmit: true\n};\n\nexport function FormWrapper<\n FormValues extends FormikValues = FormikValues,\n ApiValues extends FormikValues = FormValues,\n ExtraProps = HashObject\n>(props: ModifiedFormikConfig<FormValues> & ExtraProps & FormWrapperProps<FormValues, ApiValues>): JSX.Element {\n const { castInitialValues, castValuesOnSubmit, initialValues, onSubmit, ...formikProps } = props;\n\n /**\n * If castInitialValues is true, cast initialValues to the validationSchema.\n * This will ensure that any data fetched from the api conforms to the expected form data shape.\n */\n const formattedInitialValues: FormValues = castInitialValues && props.validationSchema\n ? props.validationSchema.cast(omitNullInitialValues(initialValues))\n : initialValues;\n\n const onSubmitHandler = (\n values: FormValues,\n { setSubmitting, resetForm, setFieldError }: FormikHelpers<FormValues>\n ) => {\n /**\n * validationSchema.cast will coerce the values to the types defined in validationSchema.\n * This is useful for trimming inputs:\n * e.g. if a value field has type Yup.string().trim(), it will be automatically trimmed.\n */\n const formattedData = castValuesOnSubmit && props.validationSchema\n ? props.validationSchema.cast(values)\n : values;\n\n onSubmit(formattedData, (options: FormSubmissionOptions<FormValues> = {}) => {\n options.reset && resetForm();\n\n if (options.errors) {\n for (const [ key, value ] of Object.entries(options.errors)) {\n setFieldError(key, value);\n }\n }\n\n setSubmitting(false);\n });\n };\n\n const initialStatus: InitialStatus = {\n allowInitialSubmit: props.allowInitialSubmit\n };\n\n return (\n <Formik<FormValues, ExtraProps>\n enableReinitialize\n {...(formikProps as ModifiedFormikConfig<FormValues> & ExtraProps)}\n initialValues={formattedInitialValues}\n onSubmit={onSubmitHandler}\n initialStatus={initialStatus}\n >\n {FunctionHelper.isFunction(props.children)\n ? (f: FormikProps<FormValues>) => (props.children as (f: FormikProps<FormValues>) => React.ReactNode)(f)\n : React.Children.count(props.children) ? props.children : null\n }\n </Formik>\n );\n}\n\nexport function useFormikContextWrapper<T>(): FormikContextType<T> {\n return useFormikContext<T>();\n}","import { FormikErrors, FormikTouched, getIn } from 'formik';\n\nimport { FormSize } from 'libs/shared/components/forms/form-field/FormField';\n\nfunction getTypeSize(type: string, size: FormSize) {\n let className = '';\n\n switch (type) {\n case 'select':\n className = 'form-select';\n break;\n default:\n className = 'form-control';\n }\n\n if (size === 'sm')\n className += ` ${className}-sm`;\n\n if (size === 'lg')\n className += ` ${className}-lg`;\n\n return className;\n}\n\nexport const FormHelper = {\n getCustomFormControlClassName<T>(\n errors: FormikErrors<T>,\n touched: FormikTouched<T>,\n attribute: string,\n size?: FormSize,\n additionalClassName?: string,\n type?: string\n ): string {\n let className = '';\n\n className = getTypeSize(type, size);\n\n // Using getIn as it supports dot notation\n if (getIn(touched, attribute) && getIn(errors, attribute))\n className += ' is-invalid';\n\n if (additionalClassName)\n className += ` ${additionalClassName}`;\n\n return className;\n }\n};","import { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsDataPayload } from 'libs/analytics/models/AnalyticsEvent';\n\nimport { InteractiveMetadata } from 'libs/shared/interfaces';\n\nexport function getInteractiveAnalyticsData(\n interactiveMetadata: InteractiveMetadata,\n extraAnalyticsData: HashObject = {}\n): AnalyticsDataPayload {\n if (!interactiveMetadata)\n return null;\n\n const data: AnalyticsDataPayload = {\n ...extraAnalyticsData,\n id: interactiveMetadata.id,\n interactiveId: interactiveMetadata.interactiveId,\n name: interactiveMetadata.name,\n status: interactiveMetadata.status,\n originType: interactiveMetadata.originType\n };\n\n if (interactiveMetadata?._parentClip?.id)\n data.clip = { id: interactiveMetadata?._parentClip?.id };\n \n if (interactiveMetadata?._parentVideo?.id)\n data.video = { id: interactiveMetadata?._parentVideo?.id };\n \n return data;\n}","// extracted by mini-css-extract-plugin\nexport default {\"dropdownMenu\":\"eDHti\"};","import React from 'react';\nimport { Dropdown } from 'react-bootstrap';\n\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { ContentRegion } from 'libs/shared/enums/ContentRegion';\nimport { ContentRegionObject } from 'libs/shared/interfaces';\n\nimport styles from './select-content-region.scss';\n\ninterface SelectContentRegionProps {\n id: string;\n options: ContentRegionObject[];\n selectedContentRegions: ContentRegionObject[];\n onUpdateContentRegions: (contentRegions: ContentRegionObject[]) => void;\n}\n\nexport function SelectContentRegion(props: SelectContentRegionProps): JSX.Element {\n function onToggleContentRegion(option: ContentRegionObject, isCurrentlyChecked: boolean): void {\n if (isCurrentlyChecked) {\n props.onUpdateContentRegions(props.selectedContentRegions.filter(c => c.id.toString() !== option.id.toString()));\n return;\n }\n\n props.onUpdateContentRegions(props.selectedContentRegions.concat(option));\n }\n\n function onToggleGlobalContentRegion(globalContentRegion: ContentRegionObject, isCurrentlyChecked: boolean) {\n if (isCurrentlyChecked) {\n props.onUpdateContentRegions([]);\n return;\n }\n\n props.onUpdateContentRegions([globalContentRegion]);\n }\n\n function getLabel(): string {\n if (props.selectedContentRegions?.length) {\n if (props.selectedContentRegions.length > 1)\n return `${props.selectedContentRegions.length} content regions`;\n \n return props.selectedContentRegions[0].name;\n }\n \n return 'None';\n }\n\n function isChecked(contentRegion: ContentRegionObject): boolean {\n return props.selectedContentRegions.some(cr => {\n return cr.id.toString() === contentRegion.id.toString();\n });\n }\n\n const globalContentRegion = props.options.find(c => c.systemName === ContentRegion.GLOBAL);\n const isGlobalChecked = isChecked(globalContentRegion);\n\n const nonGlobalContentRegions = props.options.filter(c => c.systemName !== ContentRegion.GLOBAL);\n\n return (\n <Dropdown>\n <Dropdown.Toggle\n id={props.id}\n variant='outline-dark'\n >\n {getLabel()}\n </Dropdown.Toggle>\n\n <Dropdown.Menu className={`${styles.dropdownMenu} px-2`}>\n <Checkbox\n key={globalContentRegion.id}\n label={globalContentRegion.name}\n name={globalContentRegion.id}\n id={globalContentRegion.id}\n onChange={() => onToggleGlobalContentRegion(globalContentRegion, isGlobalChecked)}\n checked={isGlobalChecked}\n className='my-1'\n />\n\n <Dropdown.Divider />\n\n {nonGlobalContentRegions.map((contentRegion: ContentRegionObject) => {\n return (\n <Checkbox\n key={contentRegion.id}\n label={contentRegion.name}\n name={contentRegion.id}\n id={contentRegion.id}\n onChange={() => onToggleContentRegion(contentRegion, isChecked(contentRegion))}\n checked={isChecked(contentRegion)}\n className={`my-1 ${isGlobalChecked ? 'disabled' : ''}`}\n disabled={isGlobalChecked}\n />\n );\n })}\n </Dropdown.Menu>\n </Dropdown>\n );\n}","import React from 'react';\nimport { Col, Form, Row } from 'react-bootstrap';\nimport { Form as FormikForm } from 'formik';\nimport * as Yup from 'yup';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { FieldWrapper, FormField } from 'libs/shared/components/forms/form-field/FormField';\nimport { FormWrapper, useFormikContextWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { SelectContentRegion } from 'libs/shared/components/select-content-region/SelectContentRegion';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { ContentRegionObject, EditDetailsRequest, Interactive, InteractiveMetadata } from 'libs/shared/interfaces';\n\nconst namespace = 'interactives.editInteractiveDetails';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getValidationSchema(requireContentRegion: boolean) {\n const schema: Yup.ObjectSchemaDefinition<EditDetailsRequest> = {\n name: Yup.string()\n .trim()\n .max(255, () => getPhrase('titleTooLong'))\n .required(() => getPhrase('titleRequired'))\n .default(''),\n\n description: Yup.string()\n .max(16000, () => getPhrase('descriptionTooLong'))\n .default('')\n };\n\n if (requireContentRegion) {\n schema.contentRegions = Yup.array<ContentRegionObject>()\n .min(1, 'Resources must have a content region')\n .default([]);\n }\n\n return Yup.object().shape<EditDetailsRequest>(schema);\n}\n\ninterface EditInteractiveDetailsFormProps {\n interactiveMetadata: InteractiveMetadata;\n onClickCancel: () => void;\n publish: boolean;\n\n // This should only be used by Curator\n contentRegions?: ContentRegionObject[];\n}\n\nfunction EditInteractiveDetailsForm(props: EditInteractiveDetailsFormProps): React.ReactElement {\n const { interactiveMetadata, onClickCancel } = props;\n\n const formikProps = useFormikContextWrapper<EditDetailsRequest>();\n\n return (\n <FormikForm>\n <div className='row form-group'>\n <div className='col-5'>\n <VideoThumbnail\n video={interactiveMetadata}\n type='cosmetic'\n imageOptions={{ size: ImageSize.Small }}\n textPosition={ThumbnailTextPosition.Independent}\n preload\n />\n </div>\n <div className='col-7'>\n <h2 className='h6'>{formikProps.values.name}</h2>\n </div>\n </div>\n <FormField\n label={getPhrase('nameLabel')}\n type='text'\n name='name'\n id='name'\n placeholder={getPhrase('namePlaceholder')}\n autoFocus\n value={formikProps.values.name}\n />\n <FormField\n label={getPhrase('descriptionLabel')}\n component='textarea'\n name='description'\n id='description'\n placeholder={getPhrase('descriptionPlaceholder')}\n value={formikProps.values.description}\n />\n\n {/* content regions */}\n {!!props.contentRegions?.length && (\n <div className='pb-2'>\n <FormField\n label={getPhrase('contentRegions')}\n name='contentRegions'\n id='contentRegions'\n value={formikProps.values.contentRegions}\n >\n {() => (\n <div className='w-50'>\n <SelectContentRegion\n id={props.interactiveMetadata.id}\n options={props.contentRegions}\n selectedContentRegions={formikProps.values.contentRegions}\n onUpdateContentRegions={contentRegions => formikProps.setFieldValue('contentRegions', contentRegions)}\n />\n </div>\n )}\n </FormField>\n <Form.Control.Feedback className='d-block mt-n2' type='invalid'>\n {formikProps.errors.contentRegions as string}\n </Form.Control.Feedback>\n </div>\n )}\n\n {/* interactive features */}\n <Form.Label>\n <Text namespace={namespace} phrase={'interactiveFeatures'} />\n </Form.Label>\n <Row>\n <Col>\n <Form.Group className='form-group'>\n <div className='form-check'>\n <FieldWrapper\n className='form-check-input'\n label={getPhrase('preventScrubbingLabel')}\n name='preventScrubbing'\n id='preventScrubbing'\n type='checkbox'\n checked={formikProps.values.preventScrubbing}\n />\n <Form.Label className='form-check-label' htmlFor='preventScrubbing'>\n <Text namespace={namespace} phrase={'preventScrubbingLabel'} />\n &nbsp;\n </Form.Label>\n <div className='text-secondary'>\n <Text namespace={namespace} phrase={'preventScrubbingExplain'} />\n </div>\n </div>\n </Form.Group>\n </Col>\n <Col>\n <Form.Group className='form-group'>\n <div className='form-check'>\n <FieldWrapper\n className='form-check-input'\n label={getPhrase('immediateFeedbackLabel')}\n name='immediateFeedback'\n id='immediateFeedback'\n type='checkbox'\n checked={formikProps.values.immediateFeedback}\n />\n <Form.Label className='form-check-label' htmlFor='immediateFeedback'>\n <Text namespace={namespace} phrase={'immediateFeedbackLabel'} />\n &nbsp;\n </Form.Label>\n <div className='text-secondary'>\n <Text namespace={namespace} phrase={'immediateFeedbackExplain'} />\n </div>\n </div>\n </Form.Group>\n </Col>\n </Row>\n <PopupButtons>\n <PopupButtons.Cancel onClick={onClickCancel} />\n <PopupButtons.Submit variant='dark' text={props.publish ? getPhrase('publish') : getPhrase('save')} />\n </PopupButtons>\n </FormikForm>\n );\n}\n\ninterface EditInteractiveDetailsProps {\n interactive: Interactive;\n interactiveMetadata: InteractiveMetadata;\n onSubmit: (data: EditDetailsRequest) => void;\n onClickCancel: () => void;\n publish: boolean;\n\n // This should only be used by Curator\n contentRegions?: ContentRegionObject[];\n}\n\nexport function EditInteractiveDetails(props: EditInteractiveDetailsProps): React.ReactElement {\n const {\n interactive,\n interactiveMetadata,\n onSubmit,\n onClickCancel,\n publish\n } = props;\n\n const initialValues: EditDetailsRequest = {\n name: interactiveMetadata.name || '',\n description: interactiveMetadata.description,\n immediateFeedback: interactive.immediateFeedback,\n preventScrubbing: interactive.preventScrubbing\n };\n\n if (props.contentRegions?.length) {\n initialValues.contentRegions = Array.isArray(interactiveMetadata.contentRegions)\n ? interactiveMetadata.contentRegions\n : interactiveMetadata.contentRegions.data;\n }\n\n return (\n <FormWrapper<EditDetailsRequest>\n initialValues={initialValues}\n validationSchema={getValidationSchema(!!props.contentRegions?.length)}\n allowInitialSubmit\n onSubmit={onSubmit}\n >\n <EditInteractiveDetailsForm\n interactiveMetadata={interactiveMetadata}\n onClickCancel={onClickCancel}\n publish={publish}\n contentRegions={props.contentRegions}\n />\n </FormWrapper>\n );\n}\n","import * as React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, PublishDescriptor, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { EditInteractiveDetails } from 'libs/shared/apps/interactives/components/edit-interactive-details/EditInteractiveDetails';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { CurationStatus } from 'libs/shared/enums/CurationStatus';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { EditDetailsRequest, EditInteractiveMetadataRequest, EditInteractiveRequest, Interactive, InteractiveMetadata, PopupViewProps } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { getInteractiveAnalyticsData } from 'apps/interactives/utils/getInteractiveAnalyticsData';\n\nconst namespace = 'interactives.editInteractiveDetailsView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface EditInteractiveDetailsProps extends PopupViewProps {\n interactiveMetadataId: string;\n publish: boolean;\n}\n\nexport function EditInteractiveDetailsView(props: EditInteractiveDetailsProps): React.ReactElement {\n const { interactiveMetadataId, publish, closePopup } = props;\n\n const dispatch = useDispatch();\n const alerts = useAlerts();\n\n const { hasPermissions } = usePermissions();\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n InteractiveRequests.interactiveMetadata(interactiveMetadataId)\n );\n\n const interactive = Flight.useBasicFetch<Interactive>(interactiveMetadata.data ?\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId) : null);\n\n function onError(): void {\n alerts.error(getPhrase('error'));\n closePopup();\n }\n\n function onSuccess(name: string): void {\n closePopup();\n alerts.success(getPhrase('success', { name, escapeText: true }));\n\n const analyticsData = getInteractiveAnalyticsData(interactiveMetadata.data);\n\n AnalyticsHelper.logUserAction(analyticsData, {\n actionType: publish ? UserAction.Publish : UserAction.Edit,\n entity: EntityType.Interactive,\n location: LocationContext.EditInteractiveDetails,\n workflowPhase: publish ? WorkflowPhase.Complete : WorkflowPhase.Save,\n descriptor: publish ? PublishDescriptor.Publish : undefined\n });\n\n if (!publish) return;\n\n if (hasPermissions(PermissionName.StudentExperience)) {\n Core.AppLinkHelper.trigger({\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.VIEW_INTERACTIVE,\n args: [ props.interactiveMetadataId, TextHelper.slugify(interactiveMetadata.data.name) ]\n });\n return;\n }\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.CONTRIBUTE_INTERACTIVE,\n args: [interactiveMetadataId]\n });\n }\n\n function onCancel(): void {\n const analyticsData = getInteractiveAnalyticsData(interactiveMetadata.data);\n AnalyticsHelper.logUserAction(analyticsData, {\n actionType: publish ? UserAction.Publish : UserAction.Edit,\n entity: EntityType.Interactive,\n location: LocationContext.EditInteractiveDetails,\n workflowPhase: WorkflowPhase.Discard,\n descriptor: publish ? PublishDescriptor.Publish : undefined\n });\n closePopup();\n }\n\n function onSubmit(data: EditDetailsRequest): void {\n const interactiveData: EditInteractiveRequest = {\n id: interactive.data.id,\n name: data.name,\n duration: VideoHelper.getDuration(interactiveMetadata.data),\n immediateFeedback: !!data.immediateFeedback,\n preventScrubbing: !!data.preventScrubbing\n };\n\n const interactiveMetadataData: EditInteractiveMetadataRequest = {\n name: data.name,\n description: data.description,\n status: publish ? CurationStatus.Published : interactiveMetadata.data.status\n };\n\n let count = 0;\n const success = () => {\n if (count < 1) {\n count++;\n return;\n }\n\n onSuccess(data.name);\n };\n\n Flight.fetch(\n dispatch,\n InteractiveRequests.updateInteractive(\n interactive.data.id,\n interactiveData,\n success,\n onError\n )\n );\n\n Flight.fetch(\n dispatch,\n InteractiveRequests.updateInteractiveMetadata(\n interactiveMetadata.data.id,\n interactiveMetadataData,\n success,\n onError\n )\n );\n }\n\n const dataLoaded = !!interactiveMetadata.data && !!interactive.data;\n\n return (\n <Popup\n title={publish ? getPhrase('publishHeader') : getPhrase('editHeader')}\n closePopup={onCancel}\n showLoadingSpinner={!dataLoaded}\n >\n <EditInteractiveDetails\n interactive={interactive.data}\n interactiveMetadata={interactiveMetadata.data}\n onClickCancel={onCancel}\n onSubmit={onSubmit}\n publish={publish}\n />\n </Popup>\n );\n}\n","\"use client\";\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { useBootstrapPrefix, useBootstrapBreakpoints, useBootstrapMinBreakpoint } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst Row = /*#__PURE__*/React.forwardRef(({\n bsPrefix,\n className,\n // Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n as: Component = 'div',\n ...props\n}, ref) => {\n const decoratedBsPrefix = useBootstrapPrefix(bsPrefix, 'row');\n const breakpoints = useBootstrapBreakpoints();\n const minBreakpoint = useBootstrapMinBreakpoint();\n const sizePrefix = `${decoratedBsPrefix}-cols`;\n const classes = [];\n breakpoints.forEach(brkPoint => {\n const propValue = props[brkPoint];\n delete props[brkPoint];\n let cols;\n if (propValue != null && typeof propValue === 'object') {\n ({\n cols\n } = propValue);\n } else {\n cols = propValue;\n }\n const infix = brkPoint !== minBreakpoint ? `-${brkPoint}` : '';\n if (cols != null) classes.push(`${sizePrefix}${infix}-${cols}`);\n });\n return /*#__PURE__*/_jsx(Component, {\n ref: ref,\n ...props,\n className: classNames(className, decoratedBsPrefix, ...classes)\n });\n});\nRow.displayName = 'Row';\nexport default Row;"],"names":["FormCheckbox","props","label","checkboxLabelClassName","checkboxLabelFontWeight","className","fieldProps","Form","FieldWrapper","htmlFor","id","checkboxAppLink","checkboxAppLinkText","AppLink","appLink","CharacterCounter","field","values","fieldName","length","limit","namespace","children","showLoadingSpinner","type","setType","resolvedChildren","FunctionHelper","f","ObjectHelper","Spinner","animation","size","containerClassName","disabled","SvgContainer","svgName","onClick","FormField","showCharacterCounter","showRequiredStar","infoTooltip","infoTooltipPlacement","infoText","formSize","showOptionalLabel","errors","touched","disabledOnChange","_props","onChange","fieldWrapperProps","FormHelper","name","as","title","tooltipPlacement","tooltipSpanHack","Text","phrase","maxLength","errorMessage","defaultProps","autoComplete","FormWrapper","castInitialValues","castValuesOnSubmit","initialValues","onSubmit","formikProps","formattedInitialValues","validationSchema","cast","omitChildValues","child","Object","keys","forEach","key","hasOwnProperty","omitNullInitialValues","initialStatus","allowInitialSubmit","enableReinitialize","setSubmitting","resetForm","setFieldError","formattedData","options","reset","entries","value","useFormikContextWrapper","getCustomFormControlClassName","attribute","additionalClassName","getTypeSize","getInteractiveAnalyticsData","interactiveMetadata","extraAnalyticsData","data","interactiveId","status","originType","_parentClip","clip","_parentVideo","video","SelectContentRegion","isChecked","contentRegion","selectedContentRegions","some","cr","toString","globalContentRegion","find","c","systemName","ContentRegion","isGlobalChecked","nonGlobalContentRegions","filter","Dropdown","variant","Checkbox","isCurrentlyChecked","onUpdateContentRegions","onToggleGlobalContentRegion","checked","map","option","concat","getPhrase","LanguageService","EditInteractiveDetailsForm","onClickCancel","VideoThumbnail","imageOptions","textPosition","ThumbnailTextPosition","preload","placeholder","autoFocus","component","description","contentRegions","setFieldValue","Row","Col","preventScrubbing","immediateFeedback","PopupButtons","text","publish","EditInteractiveDetails","requireContentRegion","schema","interactive","Array","isArray","trim","max","required","min","shape","EditInteractiveDetailsView","interactiveMetadataId","closePopup","dispatch","alerts","hasPermissions","usePermissions","InteractiveRequests","onError","error","onCancel","analyticsData","AnalyticsHelper","actionType","entity","location","workflowPhase","descriptor","Publish","undefined","dataLoaded","Popup","interactiveData","duration","VideoHelper","interactiveMetadataData","CurationStatus","count","success","escapeText","PermissionName","application","action","args","TextHelper","onSuccess","bsPrefix","Component","ref","decoratedBsPrefix","breakpoints","minBreakpoint","sizePrefix","classes","brkPoint","propValue","cols","infix","push","displayName"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[4113],{41021:(e,a,t)=>{t.r(a),t.d(a,{PlaySharedClipView:()=>q});var d=t(32735),i=t(20354),s=t(65858),r=t(16714),c=t(43012),o=t(39151),l=t(1666),n=t(28907),u=t(31949),h=t(1575),v=t(27995),m=t(22902),p=t(15311),g=t(79612),C=t(76753),I=t(56871),F=t(7179),P=t(49948),V=t(36873),y=t(27638),b=t(44110),f=t(35014),k=t(97816);function q(e){var a,t,q,w,B,_,A,T,U=(0,p.r)().hasProduct,x=(0,y.u)(s.LZ.VideoThumbnail),G=x.setFavourite,M=x.canFavourite,j=(0,m.T)().hasPermissions,L=i.a.useBasicFetch(u.N.currentUser()),E=i.a.useBasicFetch(o.L.config()),N=i.a.useBasicFetch(c.e.sharedClip(e.objectId,e.shareId)),O=i.a.useBasicFetch(!!(null===(a=N.data)||void 0===a?void 0:a._parentVideo)&&h.R.video(N.data._parentVideo.id)),R=(0,V.k)({video:O.data,context:e.queryParams.context,contextId:e.queryParams.contextId,moviesAndTv:e.queryParams.mtv,currentUser:L.data}),S=(0,b.i)(),Z=i.a.useBasicFetch((null===(t=L.data)||void 0===t?void 0:t.isAuthenticated)&&l.h.yearGroups(L.data.customerId)),z=(0,P.l)(e.objectId),D=i.a.useBasicFetch((null===(w=null===(q=N.data)||void 0===q?void 0:q.glance)||void 0===w?void 0:w.theme)?n.r.themeImages(N.data.glance.theme,N.data.glance.type):null),H=j(r.C.ViewVideoGlance)&&(null===(_=null===(B=N.data)||void 0===B?void 0:B.glance)||void 0===_?void 0:_.theme),J=(0,f.I)();return(0,g.M)(C.CG.getClipMetadata({content:N.data})),(0,k.V)(null!==(A=R.videos)&&void 0!==A?A:[]),(0,v.b)(N),(0,F.P)({id:e.objectId,app:"clips",shareId:e.shareId}),N.data&&L.hasCompleted&&E.hasCompleted&&z.hasCompleted?d.createElement(I.N,{shareId:e.shareId,clip:N.data,originalVideo:O.data,currentUser:L.data,yearGroups:Z.data,relatedVideos:R,canFavourite:M,setFavourite:G,hasProduct:U,queryParams:e.queryParams,audiences:S.data,imageCdnUrl:E.data.imageCdnUrl,canManageVideoAccess:j(r.C.ManageVideoAccess),glanceTheme:D.data,glanceLoaded:!H||D.hasCompleted,pointsOfInterest:null==z?void 0:z.items,featureAccess:J,tableOfContentsId:null===(T=e.queryParams)||void 0===T?void 0:T.scrollTo}):d.createElement(d.Fragment,null)}}}]);
2
- //# sourceMappingURL=4113-c75e9be23a-lite.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/4113-c75e9be23a-lite.chunk.js","mappings":"0ZA+BM,SAAUA,EAAmBC,G,oBACzBC,GAAe,SAAfA,WACR,GAAuC,IAAAC,GAAkB,qBAAjDC,EAAY,EAAZA,aAAcC,EAAY,EAAZA,aACdC,GAAmB,SAAnBA,eAEFC,EAAc,kBAAkC,mBAChDC,EAAS,kBAA6B,cACtCC,EAAO,kBAA2B,eAAwBR,EAAMS,SAAUT,EAAMU,UAChFC,EAAQ,qBAAuC,QAAT,EAAAH,EAAKI,YAAI,eAAEC,eACrD,UAAoBL,EAAKI,KAAKC,aAAaC,KACvCC,GAAgB,OAAoB,CACxCJ,MAAOA,EAAMC,KACbI,QAAShB,EAAMiB,YAAYD,QAC3BE,UAAWlB,EAAMiB,YAAYC,UAC7BC,YAAanB,EAAMiB,YAAYG,IAC/Bd,YAAaA,EAAYM,OAErBS,GAAY,SACZC,EAAa,mBACD,QAAhB,EAAAhB,EAAYM,YAAI,eAAEW,kBAAmB,eAA4BjB,EAAYM,KAAKY,aAE9EC,GAAmB,OAAyBzB,EAAMS,UAClDiB,EAAc,mBAA6C,QAAjB,EAAS,QAAT,EAAAlB,EAAKI,YAAI,eAAEe,cAAM,eAAEC,OAC/D,gBAA0BpB,EAAKI,KAAKe,OAAOC,MAAOpB,EAAKI,KAAKe,OAAOE,MAAQ,MAEzEC,EAAmBzB,EAAe,uBACrB,QAAjB,EAAS,QAAT,EAAAG,EAAKI,YAAI,eAAEe,cAAM,eAAEC,OAEfG,GAAgB,SAetB,OAbA,OAAmB,qBAAmC,CAAEC,QAASxB,EAAKI,SAEtE,OAAkC,QAApB,EAAAG,EAAckB,cAAM,QAAI,KACtC,OAAsBzB,IACtB,OAAa,CAAEM,GAAId,EAAMS,SAAUyB,IAAK,QAASxB,QAASV,EAAMU,UAG9DF,EAAKI,MACLN,EAAY6B,cACZ5B,EAAO4B,cACPV,EAAiBU,aAOjB,gBAAC,IAAQ,CACPzB,QAASV,EAAMU,QACfF,KAAMA,EAAKI,KACXwB,cAAezB,EAAMC,KACrBN,YAAaA,EAAYM,KACzBU,WAAYA,EAAWV,KACvBG,cAAeA,EACfX,aAAcA,EACdD,aAAcA,EACdF,WAAYA,EACZgB,YAAajB,EAAMiB,YACnBI,UAAWA,EAAUT,KACrByB,YAAa9B,EAAOK,KAAKyB,YACzBC,qBAAsBjC,EAAe,uBACrCqB,YAAaA,EAAYd,KACzB2B,cAAeT,GAAoBJ,EAAYS,aAC/CV,iBAAkBA,aAAgB,EAAhBA,EAAkBe,MACpCT,cAAeA,EACfU,kBAAoC,QAAjB,EAAAzC,EAAMiB,mBAAW,eAAEyB,WArBjC,gCAwBX,C","sources":["file:///app/packages/projects/lite/src/apps/share/views/play-shared-clip/PlaySharedClipView.tsx"],"sourcesContent":["import React from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ClipRequests } from 'libs/shared/flight-requests/ClipRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { ThemeRequests } from 'libs/shared/flight-requests/ThemeRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useCannotConsumeError } from 'libs/shared/hooks/useCannotConsumeError';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Clip, Config, CurrentUser, Theme, Video, YearGroup } from 'libs/shared/interfaces';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { PlayClip } from 'shared/components/play-clip/PlayClip';\nimport { useDeepLinks } from 'shared/hooks/useDeepLinks';\nimport { useFetchPointsOfInterest } from 'shared/hooks/useFetchPointsOfInterest';\nimport { useGetRelatedVideos } from 'shared/hooks/useGetRelatedVideos';\nimport { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\nimport { usePresentationAudiences } from 'shared/hooks/usePresentationAudiences';\nimport { useVideoFeatureAccess } from 'shared/hooks/useVideoFeatureAccess';\nimport { useVideoMixin } from 'shared/hooks/useVideoMixin';\n\nimport { ShareLinkViewProps } from 'apps/share/interfaces/ShareLinkViewProps';\n\nexport function PlaySharedClipView(props: ShareLinkViewProps): React.ReactElement {\n const { hasProduct } = useProducts();\n const { setFavourite, canFavourite } = useLiteFavourites(LocationContext.VideoThumbnail);\n const { hasPermissions } = usePermissions();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const clip = Flight.useBasicFetch<Clip>(ClipRequests.sharedClip(props.objectId, props.shareId));\n const video = Flight.useBasicFetch<Video>(!!clip.data?._parentVideo &&\n VideoRequests.video(clip.data._parentVideo.id));\n const relatedVideos = useGetRelatedVideos({\n video: video.data,\n context: props.queryParams.context,\n contextId: props.queryParams.contextId,\n moviesAndTv: props.queryParams.mtv,\n currentUser: currentUser.data\n });\n const audiences = usePresentationAudiences();\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n const pointsOfInterest = useFetchPointsOfInterest(props.objectId);\n const glanceTheme = Flight.useBasicFetch<Theme>(clip.data?.glance?.theme\n ? ThemeRequests.themeImages(clip.data.glance.theme, clip.data.glance.type) : null);\n\n const shouldFetchTheme = hasPermissions(PermissionName.ViewVideoGlance) &&\n clip.data?.glance?.theme;\n\n const featureAccess = useVideoFeatureAccess();\n\n useSetPageMetadata(PageMetadataHelper.getClipMetadata({ content: clip.data }));\n\n useVideoMixin(relatedVideos.videos ?? []);\n useCannotConsumeError(clip);\n useDeepLinks({ id: props.objectId, app: 'clips', shareId: props.shareId });\n\n const hasLoaded = (\n clip.data &&\n currentUser.hasCompleted &&\n config.hasCompleted &&\n pointsOfInterest.hasCompleted\n );\n\n if (!hasLoaded)\n return <></>;\n\n return (\n <PlayClip\n shareId={props.shareId}\n clip={clip.data}\n originalVideo={video.data}\n currentUser={currentUser.data}\n yearGroups={yearGroups.data}\n relatedVideos={relatedVideos}\n canFavourite={canFavourite}\n setFavourite={setFavourite}\n hasProduct={hasProduct}\n queryParams={props.queryParams}\n audiences={audiences.data}\n imageCdnUrl={config.data.imageCdnUrl}\n canManageVideoAccess={hasPermissions(PermissionName.ManageVideoAccess)}\n glanceTheme={glanceTheme.data}\n glanceLoaded={!shouldFetchTheme || glanceTheme.hasCompleted}\n pointsOfInterest={pointsOfInterest?.items}\n featureAccess={featureAccess}\n tableOfContentsId={props.queryParams?.scrollTo}\n />\n );\n}"],"names":["PlaySharedClipView","props","hasProduct","u","setFavourite","canFavourite","hasPermissions","currentUser","config","clip","objectId","shareId","video","data","_parentVideo","id","relatedVideos","context","queryParams","contextId","moviesAndTv","mtv","audiences","yearGroups","isAuthenticated","customerId","pointsOfInterest","glanceTheme","glance","theme","type","shouldFetchTheme","featureAccess","content","videos","app","hasCompleted","originalVideo","imageCdnUrl","canManageVideoAccess","glanceLoaded","items","tableOfContentsId","scrollTo"],"sourceRoot":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/4291-4ea61b3610-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/breadcrumbs/Breadcrumbs.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/utils/PartialLoadingHelper.ts","file:///app/packages/projects/lite/src/shared/hooks/usePresentationAudiences.ts","file:///app/packages/projects/lite/src/shared/hooks/useVideoFeatureAccess.ts","file:///app/packages/projects/lite/src/shared/views/video-media/VideoClipsView.tsx","file:///app/packages/projects/lite/src/shared/views/video-media/VideoMediaAppLinks.ts","file:///app/packages/projects/lite/src/shared/views/video-media/partial-loading/partial-video-media-view.scss","file:///app/packages/projects/lite/src/shared/views/video-media/partial-loading/PartialVideoMediaView.tsx","file:///app/node_modules/react-bootstrap/esm/Row.js"],"sourcesContent":["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: '&nbsp' }} />\n </li>\n ))}\n </ol>\n </nav>\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","const DEFAULT_PARTIAL_LOADING_OPTIONS: PartialLoadingOptions = {\n numItems: 5,\n minWidth: 50, // px\n maxWidth: 100 // px\n};\n\nexport interface PartialLoadingOptions {\n numItems?: number;\n minWidth?: number;\n maxWidth?: number;\n}\n\ninterface PartialLoadingItem {\n width: string;\n}\n\nexport const PartialLoadingHelper = {\n getPartialLoadingItems(options: PartialLoadingOptions = {}): PartialLoadingItem[] {\n const opts = {\n ...DEFAULT_PARTIAL_LOADING_OPTIONS,\n ...options\n };\n\n const getRandomFilterWidth = () => Math.max(Math.floor(Math.random() * opts.maxWidth), opts.minWidth);\n\n return [...Array(opts.numItems)].map(() => ({ width: `${getRandomFilterWidth()}px` }));\n }\n};","import { Flight } from 'libs/common/react/index';\n\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\nimport { usePresentation } from 'shared/hooks/usePresentation';\n\nexport const usePresentationAudiences = () => {\n const { activePresentation, getFallbackPresentation } = usePresentation({ redirectOnError: true });\n\n const presentation = activePresentation || getFallbackPresentation();\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n !!presentation &&\n AudienceRequests.presentationAudiences(presentation.id)\n );\n\n return audiences;\n};","import { Flight } from 'libs/common/react/index';\n\nimport { LocalPermissionName, PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { Config } from 'libs/shared/interfaces/models/Config';\n\nimport { LiteRouteHelper } from 'shared/utils/LiteRouteHelper';\n\nexport interface VideoFeaturesHash {\n canViewGlance: boolean;\n canViewResources: boolean;\n canViewInteractives: boolean;\n canViewClips: boolean;\n canUseActions: boolean;\n canViewPublicLayout: boolean;\n canNavigate: boolean;\n canViewCurriculumLinks: boolean;\n canViewResourceItems: boolean;\n canWatchPublicly: (videoId: string) => boolean;\n}\n\nexport function useVideoFeatureAccess() {\n const { hasPermissions, hasLocalPermissions } = usePermissions();\n const { hasProduct } = useProducts();\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const hasNP = hasProduct(ProductId.Primary);\n\n function showPublicLayout(): boolean {\n /**\n * Authenticated users should never see the placeholder\n */\n if (hasLocalPermissions(LocalPermissionName.WatchVideos))\n return false;\n\n /**\n * Accessing a play page unathenticated will have different contextual behabviours:\n * - For a share page, the user should see the video and never the placeholder\n * - For a public browsing page (ie. using a route-prefix) they should see the placeholder\n */\n return LiteRouteHelper.hasRegionPrefix();\n }\n\n /**\n * Publicly available video ids are maintained on the backend config. \n */\n function canWatchPublicly(videoId: string): boolean {\n if (!videoId)\n return false;\n\n return !!config.data?.allowedPublicVideos?.[videoId];\n }\n\n return {\n canWatchPublicly,\n canViewGlance: hasPermissions(PermissionName.ViewVideoGlance),\n canViewResources: true,\n canViewInteractives: hasNP && hasPermissions(PermissionName.ViewVideoInteractives),\n canViewClips: hasNP && hasPermissions(PermissionName.ViewVideoClips),\n canViewCurriculumLinks: hasPermissions(PermissionName.ViewCurriculums),\n canUseActions: hasLocalPermissions(LocalPermissionName.UseVideoActions),\n canViewPublicLayout: showPublicLayout(),\n canViewResourceItems: hasLocalPermissions(LocalPermissionName.ViewVideoResourceItems),\n canNavigate: hasNP\n };\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { Breadcrumb, Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { VideoList } from 'libs/shared/components/video-list/VideoList';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { RelatedVideosContext } from 'libs/shared/enums/RelatedVideosContext';\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 { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { Config, CurrentUser, Video, YearGroup } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\nimport { usePresentationAudiences } from 'shared/hooks/usePresentationAudiences';\nimport { useVideoFeatureAccess } from 'shared/hooks/useVideoFeatureAccess';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\nimport { PartialVideoMediaView } from 'shared/views/video-media/partial-loading/PartialVideoMediaView';\nimport { VideoMediaAppLinks } from 'shared/views/video-media/VideoMediaAppLinks';\n\nimport { SeriesAppLinkHelper } from 'apps/series/SeriesAppLinkHelper';\n\nconst namespace = 'shared.videoMedia';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface VideoMediaViewProps {\n videoId: string;\n}\n\nexport function VideoClipsView(props: VideoMediaViewProps): JSX.Element {\n const { videoId } = props;\n const { setFavourite, canFavourite } = useLiteFavourites(LocationContext.VideoThumbnail);\n \n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem });\n const featureAccess = useVideoFeatureAccess();\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\n const video = Flight.useBasicFetch<Video>(\n VideoRequests.video(videoId, null, currentUser.data.id)\n );\n\n const content = video.data?.clips?.data;\n const count = content?.length || 0;\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const title = `${getPhrase('clipHeading')} (${count || ''})`;\n\n const audiences = usePresentationAudiences();\n const { hasPermissions } = usePermissions();\n\n const breadcrumbs: Breadcrumb[] = [{\n name: video.data?.name,\n appLink: {\n ...VideoMediaAppLinks.playVideo,\n args: [ videoId, TextHelper.slugify(video.data?.name) ]\n }\n }, {\n name: title,\n appLink: {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.VIDEO_CLIPS,\n args: [videoId]\n },\n active: true\n }];\n\n function redirectToPlaypage(): void {\n Core.AppLinkHelper.trigger({\n ...VideoMediaAppLinks.playVideo,\n args: [ videoId, TextHelper.slugify(video.data?.name) ]\n }, { replace: true });\n }\n\n React.useEffect(() => {\n if (!featureAccess.canViewClips) {\n redirectToPlaypage();\n }\n }, [featureAccess.canViewClips]);\n\n if (!video.data || !content?.length || !config.hasCompleted)\n return <PartialVideoMediaView />;\n\n return (\n <VideoActionsContext.Provider value={videoActions}>\n <div className='px-3'>\n <h1 className='h2 mb-2'>{title}</h1>\n \n <div className='mb-2'>\n <Breadcrumbs breadcrumbs={breadcrumbs}/>\n </div>\n\n <VideoList\n videos={content}\n yearGroups={yearGroups.data}\n getVideoAppLink={(video, opts) => VideoAppLinkHelper.getAppLink(video, {\n ...opts,\n context: RelatedVideosContext.Widget,\n contextId: props.videoId\n })}\n hasPermissions={hasPermissions}\n getSubTextAppLink={video => SeriesAppLinkHelper.getSeriesAppLink(video.series)}\n setFavourite={setFavourite}\n canFavourite={canFavourite}\n presentationAudiences={audiences.data}\n imageCdnUrl={config.data?.imageCdnUrl}\n />\n </div>\n </VideoActionsContext.Provider>\n );\n}","\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nexport const VideoMediaAppLinks = {\n playVideo: {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PLAY_VIDEO\n },\n playClip: {\n application: AppChannels.CLIPS,\n action: Actions.Clips.PLAY_CLIP\n }\n};","// extracted by mini-css-extract-plugin\nexport default {\"partialHeading\":\"okxfx\"};","import React from 'react';\n\nimport { PartialBreadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { PartialVideoList } from 'libs/shared/components/video-list/partial-loading/PartialVideoList';\n\nimport styles from './partial-video-media-view.scss';\n\nexport function PartialVideoMediaView(): JSX.Element {\n return (\n <div className='px-3'>\n <div className={`partial-loading-background mb-2 ${styles.partialHeading}`} />\n <div className='mb-2'>\n <PartialBreadcrumbs/>\n </div>\n <PartialVideoList />\n </div>\n );\n}","\"use client\";\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { useBootstrapPrefix, useBootstrapBreakpoints, useBootstrapMinBreakpoint } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst Row = /*#__PURE__*/React.forwardRef(({\n bsPrefix,\n className,\n // Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n as: Component = 'div',\n ...props\n}, ref) => {\n const decoratedBsPrefix = useBootstrapPrefix(bsPrefix, 'row');\n const breakpoints = useBootstrapBreakpoints();\n const minBreakpoint = useBootstrapMinBreakpoint();\n const sizePrefix = `${decoratedBsPrefix}-cols`;\n const classes = [];\n breakpoints.forEach(brkPoint => {\n const propValue = props[brkPoint];\n delete props[brkPoint];\n let cols;\n if (propValue != null && typeof propValue === 'object') {\n ({\n cols\n } = propValue);\n } else {\n cols = propValue;\n }\n const infix = brkPoint !== minBreakpoint ? `-${brkPoint}` : '';\n if (cols != null) classes.push(`${sizePrefix}${infix}-${cols}`);\n });\n return /*#__PURE__*/_jsx(Component, {\n ref: ref,\n ...props,\n className: classNames(className, decoratedBsPrefix, ...classes)\n });\n});\nRow.displayName = 'Row';\nexport default Row;"],"names":["BreadcrumbItem","breadcrumb","name","appLink","active","withBackIcon","className","svgName","size","S","Breadcrumbs","breadcrumbs","isMobile","length","map","b","idx","key","PartialBreadcrumbs","numItems","style","height","width","dangerouslySetInnerHTML","__html","PartialVideoList","props","Array","numVideos","fill","_","i","allowBulkActions","PartialVideoItem","breakpoints","useBreakpoints","isSmall","VideoListHelper","withDragHandle","withReordering","xs","Row","Col","defaultProps","DEFAULT_PARTIAL_LOADING_OPTIONS","minWidth","maxWidth","PartialLoadingHelper","getPartialLoadingItems","options","opts","Math","max","floor","random","usePresentationAudiences","redirectOnError","activePresentation","getFallbackPresentation","presentation","id","useVideoFeatureAccess","hasPermissions","hasLocalPermissions","hasProduct","config","hasNP","canWatchPublicly","videoId","data","allowedPublicVideos","canViewGlance","canViewResources","canViewInteractives","canViewClips","canViewCurriculumLinks","canUseActions","canViewPublicLayout","canViewResourceItems","canNavigate","getPhrase","VideoClipsView","u","setFavourite","canFavourite","videoActions","location","featureAccess","currentUser","yearGroups","isAuthenticated","customerId","video","content","clips","count","title","audiences","args","application","action","replace","redirectToPlaypage","hasCompleted","value","videos","getVideoAppLink","context","contextId","getSubTextAppLink","series","presentationAudiences","imageCdnUrl","VideoMediaAppLinks","playVideo","playClip","PartialVideoMediaView","bsPrefix","as","Component","ref","decoratedBsPrefix","minBreakpoint","sizePrefix","classes","forEach","brkPoint","propValue","cols","infix","push","displayName"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[6723],{49935:(e,a,t)=>{t.d(a,{Oo:()=>d,b2:()=>u});var n=t(32735),i=t(36848),r=t(86764),l=t(3747),c=t(5859),s=t(35223),o=t(83914),m=function(e){var a=e.breadcrumb,t=a.name,r=a.appLink,l=a.active,c=e.withBackIcon;return n.createElement("li",{className:"breadcrumb-item".concat(l?" active":"")},l?n.createElement("strong",null,t):n.createElement(i.F,{appLink:r},c&&n.createElement(o.x,{svgName:s.vn.ChevronLeft,size:o.S.Small}),n.createElement("span",{className:c?"ms-2":""},t)))},d=function(e){var a=e.breadcrumbs,t=(0,l.a)(r.r.XS),i=null==a?void 0:a.length;return!i||t&&i<2?n.createElement(n.Fragment,null):t?n.createElement("nav",{"aria-label":"breadcrumb"},n.createElement("ol",{className:"breadcrumb m-0 p-0"},n.createElement(m,{breadcrumb:a[i-2],withBackIcon:!0}))):n.createElement("nav",{"aria-label":"breadcrumb"},n.createElement("ol",{className:"breadcrumb m-0 p-0"},a.map((function(e,a){return n.createElement(m,{key:a,breadcrumb:e})}))))},u=n.memo((function(e){var a=e.numItems,t=void 0===a?3:a;return(0,l.a)(r.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"},c.u.getPartialLoadingItems({numItems:t}).map((function(e,a){var t=e.width;return n.createElement("li",{key:a,className:"breadcrumb-item"},n.createElement("span",{className:"d-inline-block partial-loading-background",style:{width:t},dangerouslySetInnerHTML:{__html:"&nbsp"}}))}))))}))},74696:(e,a,t)=>{t.d(a,{S:()=>o});var n=t(32735),i=t(68050),r=t(69111),l=t(9977),c=t(79967);const s={partialOptions:"Gufgq",partialName:"SicQQ",partialDescription:"dPGMq",partialThumbnail:"vZrnb",partialDragHandle:"iq73R"};function o(e){return n.createElement("div",{className:"mx-2"},Array(e.numVideos).fill(null).map((function(a,t){return n.createElement("div",{className:"d-flex",key:t},e.allowBulkActions&&n.createElement("div",{className:"form-check pe-3 pe-sm-2 mx-0 mx-md-2"}),n.createElement(m,Object.assign({},e)))})))}function m(e){var a=(0,c.k)(),t="sm"===l.O.getSize(a,"md"),o=e.withReordering&&!a.xs;return n.createElement(i.Z,{className:"".concat(t?"":"py-2"," flex-grow-1")},n.createElement(r.Z,Object.assign({},l.O.getThumbnailColumns(),{className:"flex-column align-items-flex-start ".concat(t?"pb-2 pe-1":"mb-1 pe-3 pe-md-2")}),n.createElement(i.Z,null,!!o&&n.createElement("div",{className:"d-flex align-items-center justify-content-center col-2"},n.createElement("div",{className:"partial-loading-background ".concat(s.partialDragHandle)})),n.createElement(r.Z,{xs:l.O.getThumbnailColSize(o)},n.createElement("div",{className:"partial-loading-background ".concat(t?"rounded":"rounded-3"," ").concat(s.partialThumbnail)})))),n.createElement(r.Z,Object.assign({},l.O.getDetailsColumns(),{className:t?"pb-2":"px-2"}),n.createElement("div",{className:"partial-loading-background mb-1 ".concat(s.partialName)}),n.createElement("div",{className:"partial-loading-background ".concat(s.partialDescription)})))}o.defaultProps={numVideos:15}},5859:(e,a,t)=>{function n(e,a){(null==a||a>e.length)&&(a=e.length);for(var t=0,n=new Array(a);t<a;t++)n[t]=e[t];return n}t.d(a,{u:()=>r});var i={numItems:5,minWidth:50,maxWidth:100},r={getPartialLoadingItems:function(){var e,a=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=Object.assign(Object.assign({},i),a);return(e=Array(t.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,a){if(e){if("string"==typeof e)return n(e,a);var t=Object.prototype.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?n(e,a):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()*t.maxWidth),t.minWidth),"px")}}))}}},44110:(e,a,t)=>{t.d(a,{i:()=>l});var n=t(20354),i=t(89454),r=t(86698),l=function(){var e=(0,r.y)({redirectOnError:!0}),a=e.activePresentation,t=e.getFallbackPresentation,l=a||t();return n.a.useBasicFetch(!!l&&i.O.presentationAudiences(l.id))}},35014:(e,a,t)=>{t.d(a,{I:()=>m});var n=t(20354),i=t(16714),r=t(12754),l=t(39151),c=t(22902),s=t(15311),o=t(11387);function m(){var e=(0,c.T)(),a=e.hasPermissions,t=e.hasLocalPermissions,m=(0,s.r)().hasProduct,d=n.a.useBasicFetch(l.L.config()),u=m(r.x.Primary);return{canWatchPublicly:function(e){var a,t;return!!e&&!!(null===(t=null===(a=d.data)||void 0===a?void 0:a.allowedPublicVideos)||void 0===t?void 0:t[e])},canViewGlance:a(i.C.ViewVideoGlance),canViewResources:!0,canViewInteractives:u&&a(i.C.ViewVideoInteractives),canViewClips:u&&a(i.C.ViewVideoClips),canViewCurriculumLinks:a(i.C.ViewCurriculums),canUseActions:t(i.E.UseVideoActions),canViewPublicLayout:!t(i.E.WatchVideos)&&o.C.hasRegionPrefix(),canViewResourceItems:t(i.E.ViewVideoResourceItems),canNavigate:u}}},78630:(e,a,t)=>{t.r(a),t.d(a,{ClipClipsView:()=>P});var n=t(32735),i=t(81886),r=t(23481),l=t(20354),c=t(28400),s=t(65858),o=t(49935),m=t(13231),d=t(51365),u=t(183),p=t(43012),v=t(39151),b=t(1666),g=t(31949),f=t(1575),h=t(22902),E=t(14070),y=t(97291),w=t(10671),C=t(27638),N=t(44110),k=t(35014),V=t(22490),I=t(98620),x=t(82431),O=t(16747),L=r.T.encloseNamespace("shared.videoMedia");function P(e){var a,t,r,P,A,S,j,F,_,T,B=e.clipId,R=(0,C.u)(s.LZ.VideoThumbnail),M=R.setFavourite,W=R.canFavourite,Z=(0,w._)({location:w.i.VideoItem}),D=(0,k.I)(),G=l.a.useBasicFetch(g.N.currentUser()),$=l.a.useBasicFetch(G.data.isAuthenticated&&b.h.yearGroups(G.data.customerId)),H=l.a.useBasicFetch(p.e.clip(B)),U=null===(j=null===(S=null===(A=l.a.useBasicFetch((null===(t=null===(a=H.data)||void 0===a?void 0:a._parentVideo)||void 0===t?void 0:t.id)&&f.R.video(null===(P=null===(r=H.data)||void 0===r?void 0:r._parentVideo)||void 0===P?void 0:P.id,null,null==G?void 0:G.data.id)).data)||void 0===A?void 0:A.clips)||void 0===S?void 0:S.data)||void 0===j?void 0:j.filter((function(e){return e.id!==B})),Y=(null==U?void 0:U.length)||0,z=l.a.useBasicFetch(v.L.config()),Q="".concat(L("clipHeading")," (").concat(Y||"",")"),q=(0,N.i)(),X=(0,h.T)().hasPermissions,J=[{name:null===(F=H.data)||void 0===F?void 0:F.name,appLink:Object.assign(Object.assign({},I.Y.playClip),{args:[B,c.m.slugify(null===(_=H.data)||void 0===_?void 0:_.name)]})},{name:Q,appLink:{application:y.O.CLIPS,action:E.e.Clips.CLIP_CLIPS,args:[B]},active:!0}];return n.useEffect((function(){D.canViewClips||function(){var e;i.Q.C$.trigger(Object.assign(Object.assign({},I.Y.playClip),{args:[B,c.m.slugify(null===(e=H.data)||void 0===e?void 0:e.name)]}),{replace:!0})}()}),[D.canViewClips]),H.data&&(null==U?void 0:U.length)&&z.hasCompleted?n.createElement(d.M.Provider,{value:Z},n.createElement("div",{className:"px-3"},n.createElement("h1",{className:"h2 mb-2"},Q),n.createElement("div",{className:"mb-2"},n.createElement(o.Oo,{breadcrumbs:J})),n.createElement(m.E4,{videos:U,yearGroups:$.data,getVideoAppLink:function(a,t){return V.W.getAppLink(a,Object.assign(Object.assign({},t),{context:u.Q.Widget,contextId:e.clipId}))},hasPermissions:X,getSubTextAppLink:function(e){return x.j.getSeriesAppLink(e.series)},setFavourite:M,canFavourite:W,presentationAudiences:q.data,imageCdnUrl:null===(T=z.data)||void 0===T?void 0:T.imageCdnUrl}))):n.createElement(O.l,null)}},98620:(e,a,t)=>{t.d(a,{Y:()=>r});var n=t(14070),i=t(97291),r={playVideo:{application:i.O.VIDEOS,action:n.e.Videos.PLAY_VIDEO},playClip:{application:i.O.CLIPS,action:n.e.Clips.PLAY_CLIP}}},16747:(e,a,t)=>{t.d(a,{l:()=>c});var n=t(32735),i=t(49935),r=t(74696);const l={partialHeading:"okxfx"};function c(){return n.createElement("div",{className:"px-3"},n.createElement("div",{className:"partial-loading-background mb-2 ".concat(l.partialHeading)}),n.createElement("div",{className:"mb-2"},n.createElement(i.b2,null)),n.createElement(r.S,null))}},68050:(e,a,t)=>{t.d(a,{Z:()=>o});var n=t(95685),i=t.n(n),r=t(32735),l=t(46304),c=t(74512);const s=r.forwardRef((({bsPrefix:e,className:a,as:t="div",...n},r)=>{const s=(0,l.vE)(e,"row"),o=(0,l.pi)(),m=(0,l.zG)(),d=`${s}-cols`,u=[];return o.forEach((e=>{const a=n[e];let t;delete n[e],null!=a&&"object"==typeof a?({cols:t}=a):t=a;const i=e!==m?`-${e}`:"";null!=t&&u.push(`${d}${i}-${t}`)})),(0,c.jsx)(t,{ref:r,...n,className:i()(a,s,...u)})}));s.displayName="Row";const o=s}}]);
2
- //# sourceMappingURL=6723-ece2125bab-lite.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/6723-ece2125bab-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/breadcrumbs/Breadcrumbs.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/utils/PartialLoadingHelper.ts","file:///app/packages/projects/lite/src/shared/hooks/usePresentationAudiences.ts","file:///app/packages/projects/lite/src/shared/hooks/useVideoFeatureAccess.ts","file:///app/packages/projects/lite/src/shared/views/video-media/ClipClipsView.tsx","file:///app/packages/projects/lite/src/shared/views/video-media/VideoMediaAppLinks.ts","file:///app/packages/projects/lite/src/shared/views/video-media/partial-loading/partial-video-media-view.scss","file:///app/packages/projects/lite/src/shared/views/video-media/partial-loading/PartialVideoMediaView.tsx","file:///app/node_modules/react-bootstrap/esm/Row.js"],"sourcesContent":["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: '&nbsp' }} />\n </li>\n ))}\n </ol>\n </nav>\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","const DEFAULT_PARTIAL_LOADING_OPTIONS: PartialLoadingOptions = {\n numItems: 5,\n minWidth: 50, // px\n maxWidth: 100 // px\n};\n\nexport interface PartialLoadingOptions {\n numItems?: number;\n minWidth?: number;\n maxWidth?: number;\n}\n\ninterface PartialLoadingItem {\n width: string;\n}\n\nexport const PartialLoadingHelper = {\n getPartialLoadingItems(options: PartialLoadingOptions = {}): PartialLoadingItem[] {\n const opts = {\n ...DEFAULT_PARTIAL_LOADING_OPTIONS,\n ...options\n };\n\n const getRandomFilterWidth = () => Math.max(Math.floor(Math.random() * opts.maxWidth), opts.minWidth);\n\n return [...Array(opts.numItems)].map(() => ({ width: `${getRandomFilterWidth()}px` }));\n }\n};","import { Flight } from 'libs/common/react/index';\n\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\nimport { usePresentation } from 'shared/hooks/usePresentation';\n\nexport const usePresentationAudiences = () => {\n const { activePresentation, getFallbackPresentation } = usePresentation({ redirectOnError: true });\n\n const presentation = activePresentation || getFallbackPresentation();\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n !!presentation &&\n AudienceRequests.presentationAudiences(presentation.id)\n );\n\n return audiences;\n};","import { Flight } from 'libs/common/react/index';\n\nimport { LocalPermissionName, PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { Config } from 'libs/shared/interfaces/models/Config';\n\nimport { LiteRouteHelper } from 'shared/utils/LiteRouteHelper';\n\nexport interface VideoFeaturesHash {\n canViewGlance: boolean;\n canViewResources: boolean;\n canViewInteractives: boolean;\n canViewClips: boolean;\n canUseActions: boolean;\n canViewPublicLayout: boolean;\n canNavigate: boolean;\n canViewCurriculumLinks: boolean;\n canViewResourceItems: boolean;\n canWatchPublicly: (videoId: string) => boolean;\n}\n\nexport function useVideoFeatureAccess() {\n const { hasPermissions, hasLocalPermissions } = usePermissions();\n const { hasProduct } = useProducts();\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const hasNP = hasProduct(ProductId.Primary);\n\n function showPublicLayout(): boolean {\n /**\n * Authenticated users should never see the placeholder\n */\n if (hasLocalPermissions(LocalPermissionName.WatchVideos))\n return false;\n\n /**\n * Accessing a play page unathenticated will have different contextual behabviours:\n * - For a share page, the user should see the video and never the placeholder\n * - For a public browsing page (ie. using a route-prefix) they should see the placeholder\n */\n return LiteRouteHelper.hasRegionPrefix();\n }\n\n /**\n * Publicly available video ids are maintained on the backend config. \n */\n function canWatchPublicly(videoId: string): boolean {\n if (!videoId)\n return false;\n\n return !!config.data?.allowedPublicVideos?.[videoId];\n }\n\n return {\n canWatchPublicly,\n canViewGlance: hasPermissions(PermissionName.ViewVideoGlance),\n canViewResources: true,\n canViewInteractives: hasNP && hasPermissions(PermissionName.ViewVideoInteractives),\n canViewClips: hasNP && hasPermissions(PermissionName.ViewVideoClips),\n canViewCurriculumLinks: hasPermissions(PermissionName.ViewCurriculums),\n canUseActions: hasLocalPermissions(LocalPermissionName.UseVideoActions),\n canViewPublicLayout: showPublicLayout(),\n canViewResourceItems: hasLocalPermissions(LocalPermissionName.ViewVideoResourceItems),\n canNavigate: hasNP\n };\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { Breadcrumb, Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { VideoList } from 'libs/shared/components/video-list/VideoList';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { RelatedVideosContext } from 'libs/shared/enums/RelatedVideosContext';\nimport { ClipRequests } from 'libs/shared/flight-requests/ClipRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { Clip, Config, CurrentUser, Video, YearGroup } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\nimport { usePresentationAudiences } from 'shared/hooks/usePresentationAudiences';\nimport { useVideoFeatureAccess } from 'shared/hooks/useVideoFeatureAccess';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\nimport { VideoMediaAppLinks } from 'shared/views/video-media/VideoMediaAppLinks';\n\nimport { SeriesAppLinkHelper } from 'apps/series/SeriesAppLinkHelper';\n\nimport { PartialVideoMediaView } from './partial-loading/PartialVideoMediaView';\n\nconst namespace = 'shared.videoMedia';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ClipClipsViewProps {\n clipId: string;\n}\n\nexport function ClipClipsView(props: ClipClipsViewProps): JSX.Element {\n const { clipId } = props;\n const { setFavourite, canFavourite } = useLiteFavourites(LocationContext.VideoThumbnail);\n \n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem });\n const featureAccess = useVideoFeatureAccess();\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\n const clip = Flight.useBasicFetch<Clip>(ClipRequests.clip(clipId));\n\n const parentVideo = Flight.useBasicFetch<Video>(\n clip.data?._parentVideo?.id && VideoRequests.video(clip.data?._parentVideo?.id, null, currentUser?.data.id)\n );\n const content = parentVideo.data?.clips?.data?.filter(clip => clip.id !== clipId);\n const count = content?.length || 0;\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const title = `${getPhrase('clipHeading')} (${count || ''})`;\n\n const audiences = usePresentationAudiences();\n const { hasPermissions } = usePermissions();\n\n const breadcrumbs: Breadcrumb[] = [{\n name: clip.data?.name,\n appLink: {\n ...VideoMediaAppLinks.playClip,\n args: [ clipId, TextHelper.slugify(clip.data?.name) ]\n }\n }, {\n name: title,\n appLink: {\n application: AppChannels.CLIPS,\n action: Actions.Clips.CLIP_CLIPS,\n args: [clipId]\n },\n active: true\n }];\n\n function redirectToPlaypage(): void {\n Core.AppLinkHelper.trigger({\n ...VideoMediaAppLinks.playClip,\n args: [ clipId, TextHelper.slugify(clip.data?.name) ]\n }, { replace: true });\n }\n\n React.useEffect(() => {\n if (!featureAccess.canViewClips) {\n redirectToPlaypage();\n }\n }, [featureAccess.canViewClips]);\n\n if (!clip.data || !content?.length || !config.hasCompleted)\n return <PartialVideoMediaView />;\n\n return (\n <VideoActionsContext.Provider value={videoActions}>\n <div className='px-3'>\n <h1 className='h2 mb-2'>{title}</h1>\n \n <div className='mb-2'>\n <Breadcrumbs breadcrumbs={breadcrumbs}/>\n </div>\n\n <VideoList\n videos={content}\n yearGroups={yearGroups.data}\n getVideoAppLink={(video, opts) => VideoAppLinkHelper.getAppLink(video, {\n ...opts,\n context: RelatedVideosContext.Widget,\n contextId: props.clipId\n })}\n hasPermissions={hasPermissions}\n getSubTextAppLink={video => SeriesAppLinkHelper.getSeriesAppLink(video.series)}\n setFavourite={setFavourite}\n canFavourite={canFavourite}\n presentationAudiences={audiences.data}\n imageCdnUrl={config.data?.imageCdnUrl}\n />\n </div>\n </VideoActionsContext.Provider>\n );\n}","\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nexport const VideoMediaAppLinks = {\n playVideo: {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PLAY_VIDEO\n },\n playClip: {\n application: AppChannels.CLIPS,\n action: Actions.Clips.PLAY_CLIP\n }\n};","// extracted by mini-css-extract-plugin\nexport default {\"partialHeading\":\"okxfx\"};","import React from 'react';\n\nimport { PartialBreadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { PartialVideoList } from 'libs/shared/components/video-list/partial-loading/PartialVideoList';\n\nimport styles from './partial-video-media-view.scss';\n\nexport function PartialVideoMediaView(): JSX.Element {\n return (\n <div className='px-3'>\n <div className={`partial-loading-background mb-2 ${styles.partialHeading}`} />\n <div className='mb-2'>\n <PartialBreadcrumbs/>\n </div>\n <PartialVideoList />\n </div>\n );\n}","\"use client\";\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { useBootstrapPrefix, useBootstrapBreakpoints, useBootstrapMinBreakpoint } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst Row = /*#__PURE__*/React.forwardRef(({\n bsPrefix,\n className,\n // Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n as: Component = 'div',\n ...props\n}, ref) => {\n const decoratedBsPrefix = useBootstrapPrefix(bsPrefix, 'row');\n const breakpoints = useBootstrapBreakpoints();\n const minBreakpoint = useBootstrapMinBreakpoint();\n const sizePrefix = `${decoratedBsPrefix}-cols`;\n const classes = [];\n breakpoints.forEach(brkPoint => {\n const propValue = props[brkPoint];\n delete props[brkPoint];\n let cols;\n if (propValue != null && typeof propValue === 'object') {\n ({\n cols\n } = propValue);\n } else {\n cols = propValue;\n }\n const infix = brkPoint !== minBreakpoint ? `-${brkPoint}` : '';\n if (cols != null) classes.push(`${sizePrefix}${infix}-${cols}`);\n });\n return /*#__PURE__*/_jsx(Component, {\n ref: ref,\n ...props,\n className: classNames(className, decoratedBsPrefix, ...classes)\n });\n});\nRow.displayName = 'Row';\nexport default Row;"],"names":["BreadcrumbItem","breadcrumb","name","appLink","active","withBackIcon","className","svgName","size","S","Breadcrumbs","breadcrumbs","isMobile","length","map","b","idx","key","PartialBreadcrumbs","numItems","style","height","width","dangerouslySetInnerHTML","__html","PartialVideoList","props","Array","numVideos","fill","_","i","allowBulkActions","PartialVideoItem","breakpoints","useBreakpoints","isSmall","VideoListHelper","withDragHandle","withReordering","xs","Row","Col","defaultProps","DEFAULT_PARTIAL_LOADING_OPTIONS","minWidth","maxWidth","PartialLoadingHelper","getPartialLoadingItems","options","opts","Math","max","floor","random","usePresentationAudiences","redirectOnError","activePresentation","getFallbackPresentation","presentation","id","useVideoFeatureAccess","hasPermissions","hasLocalPermissions","hasProduct","config","hasNP","canWatchPublicly","videoId","data","allowedPublicVideos","canViewGlance","canViewResources","canViewInteractives","canViewClips","canViewCurriculumLinks","canUseActions","canViewPublicLayout","canViewResourceItems","canNavigate","getPhrase","ClipClipsView","clipId","u","setFavourite","canFavourite","videoActions","location","featureAccess","currentUser","yearGroups","isAuthenticated","customerId","clip","content","_parentVideo","clips","filter","count","title","audiences","args","application","action","replace","redirectToPlaypage","hasCompleted","value","videos","getVideoAppLink","video","context","contextId","getSubTextAppLink","series","presentationAudiences","imageCdnUrl","VideoMediaAppLinks","playVideo","playClip","PartialVideoMediaView","bsPrefix","as","Component","ref","decoratedBsPrefix","minBreakpoint","sizePrefix","classes","forEach","brkPoint","propValue","cols","infix","push","displayName"],"sourceRoot":""}