@clickview/lite 0.55.1 → 0.55.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundles.json +1 -1
- package/dist/scripts/1169-3298aa69ad-lite.chunk.js +2 -0
- package/dist/scripts/1169-3298aa69ad-lite.chunk.js.map +1 -0
- package/dist/scripts/{2142-a9328841c1-lite.chunk.js → 2142-86bcd85ffd-lite.chunk.js} +1 -1
- package/dist/scripts/{2142-a9328841c1-lite.chunk.js.map → 2142-86bcd85ffd-lite.chunk.js.map} +1 -1
- package/dist/scripts/{bundle-f45df6e07f.min.js → bundle-0093b901d1.min.js} +3 -3
- package/dist/scripts/{bundle-f45df6e07f.min.js.map → bundle-0093b901d1.min.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/1169-ab6b70717a-lite.chunk.js +0 -2
- package/dist/scripts/1169-ab6b70717a-lite.chunk.js.map +0 -1
- /package/dist/scripts/{bundle-f45df6e07f.min.js.LICENSE.txt → bundle-0093b901d1.min.js.LICENSE.txt} +0 -0
package/dist/scripts/{2142-a9328841c1-lite.chunk.js.map → 2142-86bcd85ffd-lite.chunk.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/2142-a9328841c1-lite.chunk.js","mappings":"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","sources":["file:///Users/joshua.taylor/Projects/clickview/packages/libs/common/src/react/utils/PortalHelper.ts","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/breadcrumbs/Breadcrumbs.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/copyright-disclaimer/copyright-disclaimer.scss","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/copyright-disclaimer/CopyrightDisclaimer.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/play-page-v2/clips-widget/ClipWidgetItemV2.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/play-page-v2/clips-widget/PlayPageClips.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/play-page-v2/details/video-description/video-description.scss","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/play-page-v2/details/video-description/VideoDescription.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/play-page-v2/details/video-details.scss","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/play-page-v2/details/VideoDetailsV2.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/play-page-v2/glance/VideoAtAGlanceUtilsV2.ts","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/play-page-v2/glance/points-of-interest-list/points-of-interest-list.scss","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/play-page-v2/glance/points-of-interest-list/PointsOfInterestList.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/play-page-v2/glance/VideoAtAGlanceV2.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/play-page-v2/interactives-widget/InteractiveWidgetItemV2.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/play-page-v2/interactives-widget/PlayPageInteractives.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/play-page-v2/resources-widget/PlayPageResources.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/play-page-v2/resources-widget/resource-widget-item.scss","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/play-page-v2/resources-widget/ResourceWidgetItemV2.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/table-of-contents-list/table-of-contents-list.scss","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/table-of-contents-list/TableOfContentsList.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/hooks/useExpandableTextButton.ts","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/hooks/useTableOfContentsActiveHeading.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/utils/DownloadHelper.ts","file:///Users/joshua.taylor/Projects/clickview/packages/projects/lite/src/shared/components/play-page/components/table-of-contents/table-of-contents.scss","file:///Users/joshua.taylor/Projects/clickview/packages/projects/lite/src/shared/components/play-page/components/table-of-contents/TableOfContents.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/projects/lite/src/shared/views/play/v2/PlayPageUtilV2.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/projects/lite/src/shared/views/play/v2/hooks/usePlayPageTableOfContent.ts","file:///Users/joshua.taylor/Projects/clickview/packages/projects/lite/src/shared/constants/PlayPageSectionsOrder.ts","file:///Users/joshua.taylor/Projects/clickview/packages/projects/lite/src/shared/views/play/v2/hooks/useSectionHeadings.ts","file:///Users/joshua.taylor/Projects/clickview/packages/projects/lite/src/shared/views/play/v2/hooks/useShouldShowTableOfContents.ts","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/play-page-v2/glance/video-at-a-glance.scss"],"sourcesContent":["import React from 'react';\nimport { createPortal } from 'react-dom';\n\nexport const PortalHelper = {\n renderInPortalIfExists(component: React.ReactElement, portalContainer: Element | null): React.ReactElement {\n if (portalContainer)\n return createPortal(component, portalContainer);\n\n return component;\n }\n};","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { 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\nconst namespace = 'shared.breadcrumbComponent';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst COLLAPSE_CHARACTER_COUNT = 64;\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 = React.forwardRef((\n props: BreadcrumbItemProps,\n ref: React.ForwardedRef<HTMLElement>\n) => {\n const { breadcrumb: { name, appLink, active }, withBackIcon } = props;\n return (\n <li className={`breadcrumb-item${active ? ' active' : ''}`}>\n {active\n ? <strong>{name}</strong>\n : <AppLink appLink={appLink} ref={ref}>\n {withBackIcon && <SvgContainer svgName={cvSvgLibrary.ChevronLeft} size={SvgContainerSize.Small} />}\n <span className={withBackIcon ? 'ms-2' : ''}>{name}</span>\n </AppLink>\n }\n </li>\n );\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 || 0;\n \n const [ collapse, setCollapse ] = React.useState(false);\n const [ shouldFocus, setShouldFocus ] = React.useState(false);\n const expandRef = React.useRef<HTMLElement>();\n\n React.useEffect(() => {\n const characterLength = breadcrumbs?.reduce((prev, next) => prev + next.name.length, 0) ?? 0;\n\n if (length > 4 && characterLength > COLLAPSE_CHARACTER_COUNT)\n setCollapse(true);\n }, [breadcrumbs?.length]);\n\n /**\n * Focus our first expanded item the first time it appears.\n */\n React.useLayoutEffect(() => {\n if (shouldFocus)\n expandRef.current?.focus();\n }, [ expandRef.current, shouldFocus ]);\n\n function onClickExpand() {\n setCollapse(false);\n setShouldFocus(true);\n }\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 const first = <BreadcrumbItem breadcrumb={breadcrumbs[0]} />;\n const second = length > 2 ? <BreadcrumbItem breadcrumb={breadcrumbs[1]} /> : <></>;\n const secondLast = length > 3 ? <BreadcrumbItem breadcrumb={breadcrumbs[length - 2]} /> : <></>;\n const last = length > 1 ? <BreadcrumbItem breadcrumb={breadcrumbs[length - 1]} /> : <></>;\n const rest = breadcrumbs.slice(2, length - 2);\n\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n {first}\n {second}\n {collapse ?\n <li className='breadcrumb-item'>\n <button\n className='btn-link'\n onClick={onClickExpand}\n aria-label={getPhrase('expand')}\n >\n ...\n </button>\n </li> :\n rest.map((breadcrumb, idx) => (\n <BreadcrumbItem\n key={idx}\n breadcrumb={breadcrumb}\n ref={idx === 0 ? expandRef : null}\n />\n ))\n }\n {secondLast}\n {last}\n </ol>\n </nav>\n );\n};\n\nexport const PartialBreadcrumbs = React.memo(function({ numItems = 3 }: { numItems?: number; }) {\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n\n if (isMobile) {\n return (\n <div className='partial-loading-background' style={{ height: '1.3125rem', width: '6rem' }} />\n );\n }\n\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n {PartialLoadingHelper.getPartialLoadingItems({ numItems }).map(({ width }, idx) => (\n <li key={idx} className='breadcrumb-item'>\n <span className='d-inline-block partial-loading-background' style={{ width }} dangerouslySetInnerHTML={{ __html: ' ' }} />\n </li>\n ))}\n </ol>\n </nav>\n );\n});","// extracted by mini-css-extract-plugin\nexport default {\"copyrightDisclaimer\":\"z8YoI\",\"overlayContainer\":\"eJDbJ\"};","import React from 'react';\nimport { Overlay } from 'react-bootstrap';\nimport { Placement } from 'react-bootstrap/esm/types';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { useHoverIntent } from 'libs/shared/hooks/UseHover';\n\nimport styles from './copyright-disclaimer.scss';\n\nconst namespace = 'shared.copyrightDisclaimer';\n\nconst CONTAINER_HEIGHT = 150; // px\n\ninterface CopyrightDisclaimerProps {\n placement: Placement;\n overflowPlacement?: Placement;\n className?: string;\n}\n\nexport function CopyrightDisclaimer(props: CopyrightDisclaimerProps) {\n const [ ref, isHovering ] = useHoverIntent<HTMLDivElement>({});\n\n function preventOverflow() {\n const spaceBelow = document.documentElement.clientHeight - ref.current?.getBoundingClientRect().bottom;\n\n return spaceBelow < CONTAINER_HEIGHT;\n }\n\n return (\n <div ref={ref} className={props.className}>\n <p className={`${styles.copyrightDisclaimer} mb-1`}><Text namespace={namespace} phrase='copyrightDisclaimer' /></p>\n <Overlay\n target={ref.current}\n show={isHovering}\n placement={props.overflowPlacement && preventOverflow() ? props.overflowPlacement : props.placement}\n >\n <div className={`${styles.overlayContainer} mw-100 bg-white border rounded-3 p-2`}>\n <p><Text namespace={namespace} phrase='warning' /></p>\n <p className='fw-semibold mb-0'><Text namespace={namespace} phrase='sharing' /></p>\n </div>\n </Overlay>\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 { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { CanFavouriteFunc, Clip, FavouriteFunc, PresentationAudience, YearGroup } from 'libs/shared/interfaces';\n\nexport interface ClipWidgetItemV2Props extends FixedWidgetItemProps<Clip> {\n imageCdnUrl: string;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n audiences: PresentationAudience[];\n yearGroups: YearGroup[];\n isPlugin: boolean;\n showOwner?: boolean;\n}\n\nexport const ClipWidgetItemV2 = React.memo(function(props: ClipWidgetItemV2Props): JSX.Element {\n const { data: clip, thumbnailSize, preloadImage, getAppLink } = props;\n const mergedAudience = useMergeAudiences(clip.subjectPresentationAudiences?.data, props.audiences);\n\n return (\n <div className={`flex-shrink-0 px-1 col-6 col-sm-4`}>\n <VideoThumbnail\n type='static'\n textPosition={ThumbnailTextPosition.Independent}\n video={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 audience={mergedAudience}\n hideDuration={false}\n isPlugin={props.isPlugin}\n showOwner={props.showOwner}\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});","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 { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { CanFavouriteFunc, Clip, FavouriteFunc, PresentationAudience, 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\nimport { ClipWidgetItemV2, ClipWidgetItemV2Props } from './ClipWidgetItemV2';\n\nconst namespace = 'shared.playPageClipsV2';\n\ninterface PlayPageClipsProps {\n video: Video | Clip;\n clips: Clip[];\n canViewClips: boolean;\n yearGroups: YearGroup[];\n audiences: PresentationAudience[];\n imageCdnUrl: string;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n analyticsData: HashObject;\n headingRef?: React.MutableRefObject<Map<PlayPageAnchor, HTMLElement>>;\n isPlugin: boolean;\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, TextHelper.slugify(props.video.name) ]\n };\n }\n return {\n action: Actions.Clips.CLIP_CLIPS,\n application: AppChannels.CLIPS,\n args: [ props.video.id, TextHelper.slugify(props.video.name) ]\n };\n }\n\n const title = LanguageService.getPhrase(\n namespace,\n parentIsVideo ? 'clips' : 'otherClips',\n { count: props.clips.length }\n );\n\n return (\n <section\n className='play-page-section'\n id={PlayPageAnchor.Clips}\n ref={el => {\n (el && props.headingRef?.current) && props.headingRef.current.set(PlayPageAnchor.Clips, el);\n }}\n >\n <FixedWidget<ClipWidgetItemV2Props>\n name={title}\n contents={WidgetContents.ClipsV2}\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={ClipWidgetItemV2}\n extraChildComponentProps={{\n yearGroups: props.yearGroups,\n audiences: props.audiences,\n imageCdnUrl: props.imageCdnUrl,\n setFavourite: props.setFavourite,\n canFavourite: props.canFavourite,\n isPlugin: props.isPlugin,\n showOwner: true\n }}\n analyticsData={props.analyticsData}\n />\n </section>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"container\":\"G5zMm\",\"collapsed\":\"kkd1X\",\"seeMore\":\"DS4QF\"};","import React from 'react';\n\nimport { LinkifyHelper } from 'libs/common/react/utils/LinkifyHelper';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { useExpandableTextButton } from 'libs/shared/hooks/useExpandableTextButton';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nimport styles from './video-description.scss';\n\nconst namespace = 'shared.videoDetailsV2';\n\ninterface VideoDescriptionProps {\n video: VideoTypes;\n}\n\nexport function VideoDescription(props: VideoDescriptionProps): React.ReactElement {\n const [ expanded, setExpanded ] = React.useState(false);\n const { containerRef, showButton } = useExpandableTextButton();\n\n return (\n <div className={`${styles.container} ${expanded ? '' : styles.collapsed}`} >\n {(!expanded && showButton) && (\n <DivButton\n onClick={() => setExpanded(true)}\n className={`ms-1 text-info hover-text-underline ${styles.seeMore}`}\n >\n <Text namespace={namespace} phrase='seeMore' />\n </DivButton>\n )}\n <p\n ref={containerRef}\n className={`mb-0 ${expanded ? 'd-inline' : ''}`}\n dangerouslySetInnerHTML={{\n __html: LinkifyHelper.linkifyText(props.video.description, { nl2br: true })\n }}\n />\n {expanded && (\n <DivButton\n onClick={() => setExpanded(false)}\n className={`ms-1 hover-text-underline d-inline text-info`}\n >\n <Text namespace={namespace} phrase='seeLess' />\n </DivButton>\n )}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"descriptionBorder\":\"YUC62\"};","import * as React from 'react';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { CopyrightDisclaimer } from 'libs/shared/components/copyright-disclaimer/CopyrightDisclaimer';\nimport { ImmersiveReader } from 'libs/shared/components/immersive-reader/ImmersiveReader';\nimport { VideoDescription } from 'libs/shared/components/play-page-v2/details/video-description/VideoDescription';\nimport { TagHelper } from 'libs/shared/components/tags/TagHelper';\nimport { TagList } from 'libs/shared/components/tags/TagList';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { hasPPDD } from 'libs/shared/components/video-details/VideoDetailsUtils';\nimport { MINIMUM_GLANCE_HEIGHT } from 'libs/shared/constants/MinimumGlanceHeight';\nimport { TagType } from 'libs/shared/enums/TagType';\nimport { BaseObject, BasePaginatedCollection, CurrentUser, Tag, VideoTypes } from 'libs/shared/interfaces';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './video-details.scss';\n\nconst namespace = 'shared.videoDetailsV2';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface CommaListProps {\n label: string;\n items: BasePaginatedCollection<BaseObject>;\n className?: string;\n}\n\nfunction CommaList(props: CommaListProps): React.ReactElement {\n const { label, items, className } = props;\n\n const hasItems = items && items.data && items.data.length;\n\n if (!hasItems)\n return <></>;\n\n const commaSeperated = items.data.map(i => i.name).join(', ');\n\n return (\n <div className={className}>{label}: {commaSeperated}</div>\n );\n}\n\nfunction DetailsSection(props: VideoDetailsWithScrollbarV2Props): React.ReactElement {\n const { video } = props;\n\n if (!VideoHelper.isVideo(video) && !VideoHelper.isClip(video))\n return <></>;\n\n function showDateUploaded(): boolean {\n if (!props.currentUser?.isAuthenticated)\n return false;\n\n return !!video.dateCreated && !video._isClickViewCurated?.value;\n }\n\n const parentVideo = VideoHelper.getParentVideo(video);\n\n return (\n <div className={video.description ? 'col-md-5 ps-md-3 pt-3 pt-md-0' : 'col-12'}>\n <h2 className='h6 mb-1'><Text phrase='details' /></h2>\n {!!parentVideo.productionYear && (\n <div className='mb-1'>\n <Text phrase='productionYear' options={{ year: parentVideo.productionYear }} />\n </div>\n )}\n <CommaList\n label={getPhrase('productionCompanies', { smartCount: parentVideo.productionCompanies?.data?.length })}\n items={parentVideo.productionCompanies}\n className='mb-1'\n />\n <CommaList\n label={getPhrase('distributors', { smartCount: parentVideo.distributors?.data?.length })}\n items={parentVideo.distributors}\n className='mb-1'\n />\n <CommaList\n label={getPhrase('producers', { smartCount: parentVideo.producers?.data?.length })}\n items={parentVideo.producers}\n className='mb-1'\n />\n <CommaList\n label={getPhrase('directors', { smartCount: parentVideo.directors?.data?.length })}\n items={parentVideo.directors}\n className='mb-1'\n />\n {!!parentVideo.dateBroadcast && (\n <div className='mb-1'>\n <Text phrase='dateBroadcast' options={{ date: DateHelper.format(parentVideo.dateBroadcast, 'DD/MM/YYYY') }} />\n </div>\n )}\n {!!parentVideo.channel && (\n <div className='mb-1'>\n <Text phrase='channel' options={{ channel: parentVideo.channel.name }} />\n </div>\n )}\n {showDateUploaded() && (\n <div className='mb-1'>\n <Text phrase='dateUploaded' options={{ date: DateHelper.format(video.dateCreated, 'DD/MM/YYYY') }} />\n </div>\n )}\n </div>\n );\n}\n\ninterface VideoDetailsWithScrollbarV2Props {\n video: VideoTypes;\n currentUser: CurrentUser;\n getTagAppLink?: (tag: Tag) => Core.AppLink;\n onLaunchImmersiveReader?: () => void;\n onExitImmersiveReader?: () => void;\n maxHeight?: number;\n suppressInteractivity?: boolean;\n hideTags?: boolean;\n headingRef?: React.MutableRefObject<Map<PlayPageAnchor, HTMLElement>>;\n showHeading?: boolean;\n}\n\nexport function VideoDetailsWithScrollbarV2(props: VideoDetailsWithScrollbarV2Props): React.ReactElement {\n const { video, maxHeight = MINIMUM_GLANCE_HEIGHT } = props;\n\n const parentVideo = VideoHelper.getParentVideo(video);\n\n const showDescription = !!props.video.description;\n\n const showDetails = (\n hasPPDD(props.video) ||\n !!parentVideo.productionYear ||\n !!parentVideo.dateBroadcast ||\n !!parentVideo.channel ||\n !!(video.dateCreated && !video._isClickViewCurated?.value)\n );\n\n if (!showDescription && !showDetails)\n return <></>;\n\n function getTags(): Tag[] {\n if (props.hideTags || VideoHelper.isInteractive(props.video) || !props.video.tags?.data?.length)\n return null;\n\n return props.video.tags?.data?.filter(tag => tag.tagType === TagType.Normal);\n }\n const tags = getTags();\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <section\n id={PlayPageAnchor.VideoDetails}\n ref={el => {\n (el && props.headingRef?.current) && props.headingRef.current.set(PlayPageAnchor.VideoDetails, el);\n }}\n className='play-page-section'\n >\n {props.showHeading && (\n <h2 className='h4 curated-widget-header'><Text phrase='heading' /></h2>\n )}\n <div className='rounded border p-3 position-relative'>\n <Scrollbars autoHeight autoHeightMax={maxHeight}>\n <div className='row g-0'>\n {showDescription && (\n <div className={showDetails ? `${styles.descriptionBorder} pe-3 col-md-7` : 'col-12'}>\n <div className='d-flex align-items-center'>\n <h2 className='h6 mb-1'>\n <Text phrase='description' />\n </h2>\n <ImmersiveReader\n text={video.description}\n title={video.name}\n className='ps-2'\n onLaunch={props.onLaunchImmersiveReader}\n onExit={props.onExitImmersiveReader}\n analyticsOptions={{\n location: LocationContext.PlayPage,\n entity: EntityType.Video,\n actionType: UserAction.Click,\n descriptor: ClickDescriptor.LaunchImmersiveReader\n }}\n analyticsData={{ id: video.id, type: 'description' }}\n />\n </div>\n\n <VideoDescription video={props.video} />\n </div>\n )}\n\n {showDetails && (\n <DetailsSection {...props} />\n )}\n </div>\n\n {!!tags?.length && (\n <div className='mt-3'>\n <h2 className='h6 mb-1'><Text phrase='normalTags' /></h2>\n <TagList\n tags={tags}\n {...TagHelper.getTagActionProps(props.getTagAppLink, null, props.suppressInteractivity)}\n className='mt-1'\n />\n </div>\n )}\n\n {VideoHelper.isBroadcast(props.video) && <CopyrightDisclaimer placement='bottom-start' className='d-flex justify-content-start mt-2 mb-n1' />}\n\n </Scrollbars>\n </div>\n </section>\n </LanguageNamespaceContext.Provider>\n );\n}","import { MutableRefObject, useEffect, useRef, useState } from 'react';\nimport * as marked from 'marked';\n\nimport { useEventsServiceSubscribe } from 'libs/common/react/hooks/UseEventsServiceSubscribe';\nimport { EventsService } from 'libs/common/react/services/EventsService';\n\nimport { Clip, Glance, PointOfInterest, Video } from 'libs/shared/interfaces';\n\nimport styles from './video-at-a-glance.scss';\n\nconst POI_LINK_LINE = /\\[\\]\\(cv:\\/\\/poi\\?id=\\d+\\)\\n*/g;\n\nfunction stripPoisFromGlanceContent(glanceContent: string): string {\n return glanceContent.replace(POI_LINK_LINE, '');\n}\n\nfunction getLearningIntentionHTML(glance: Glance): string {\n const learningIntention = stripPoisFromGlanceContent(glance.content);\n\n return marked(learningIntention);\n}\n\nexport function useLearningIntentionMarkdown(\n video: Video,\n hasGlanceData?: boolean\n): string {\n const [ markdownHTML, setMarkdownHTML ] = useState('');\n\n useEffect(() => {\n if (!hasGlanceData)\n return;\n\n const content = getLearningIntentionHTML(video.glance);\n\n setMarkdownHTML(content);\n }, [ video.glance?.content, hasGlanceData ]);\n\n return markdownHTML;\n}\n\nexport function hasGlanceData(video: Video | Clip): boolean {\n return video.glance?.content && video.glance?.format === 'text/markdown';\n}\n\nexport function useHighlightPointOfInterest(\n pointOfInterest: PointOfInterest,\n shouldHighlight: boolean\n): MutableRefObject<HTMLDivElement> {\n const ref = useRef<HTMLDivElement>();\n\n useEventsServiceSubscribe('player:poi:mouseover', onPlayerPoiMouseOver, null, shouldHighlight);\n useEventsServiceSubscribe('player:poi:mouseleave', onPlayerPoiMouseLeave, null, shouldHighlight);\n\n useEffect(() => {\n if (!ref.current || !shouldHighlight)\n return;\n\n ref.current?.addEventListener('mouseover', onGlancePoiMouseOver);\n ref.current?.addEventListener('mouseleave', onGlancePoiMouseLeave);\n\n return () => {\n ref.current?.removeEventListener('mouseover', onGlancePoiMouseOver);\n ref.current?.removeEventListener('mouseleave', onGlancePoiMouseLeave);\n };\n }, [ref.current]);\n\n function onPlayerPoiMouseOver(hoveredPoi: PointOfInterest): void {\n if (!hoveredPoi?.id || pointOfInterest?.id?.toString() !== hoveredPoi?.id?.toString())\n return;\n\n ref.current?.classList.add(styles.highlightPoi);\n }\n\n function onPlayerPoiMouseLeave(): void {\n ref.current?.classList.remove(styles.highlightPoi);\n }\n\n /**\n * `this` will be the element to which the eventListener is bound.\n */\n function onGlancePoiMouseOver(): void {\n if (pointOfInterest)\n EventsService.trigger('glance:poi:mouseover', pointOfInterest);\n }\n\n function onGlancePoiMouseLeave(): void {\n EventsService.trigger('glance:poi:mouseleave');\n }\n\n return ref;\n}","// extracted by mini-css-extract-plugin\nexport default {\"poiEntry\":\"vr6R9\",\"poiText\":\"znHZF\",\"public\":\"v0BZ9\",\"poiTimeStamp\":\"AdKwe\",\"wideBadge\":\"YR2Hh\"};","import React from 'react';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PointOfInterest } from 'libs/shared/interfaces';\nimport { DurationHelper } from 'libs/shared/utils/DurationHelper';\n\nimport { useHighlightPointOfInterest } from '../VideoAtAGlanceUtilsV2';\n\nimport styles from './points-of-interest-list.scss';\n\ninterface PointOfInterestProps {\n poi: PointOfInterest;\n suppressInteractivity?: boolean;\n onClickPoiItem: (time: number) => void;\n wideBadge?: boolean;\n}\n\nfunction PointOfInterest(props: PointOfInterestProps): JSX.Element {\n const timeStamp = DurationHelper.ToDisplayDuration(props.poi.startTime * 1000);\n\n const ref = useHighlightPointOfInterest(props.poi, !props.suppressInteractivity);\n\n if (props.suppressInteractivity) {\n return (\n <div className={`d-flex ${styles.poiEntry} mb-2`}>\n <span className={`d-flex rounded-pill justify-content-center align-items-center fw-semibold text-info bg-light-blue ${styles.poiTimeStamp} ${props.wideBadge ? styles.wideBadge : ''}`}>{timeStamp}</span>\n <div className={`${styles.public} ms-2`}>{props.poi.description}</div>\n </div>\n );\n }\n\n return (\n <DivButton\n key={props.poi.startTime}\n className={`d-flex ${styles.poiEntry} mb-2 cursor-pointer`}\n onClick={() => props.onClickPoiItem(props.poi.startTime)}\n ref={ref}\n >\n <div className={`d-flex rounded-pill justify-content-center align-items-center fw-semibold text-info bg-light-blue ${styles.poiTimeStamp} ${props.wideBadge ? styles.wideBadge : ''}`}>{timeStamp}</div>\n <div className={`ms-2 ${styles.poiText}`}>{props.poi.description}</div>\n </DivButton>\n );\n}\n\ninterface PointOfInterestListProps{\n pointsOfInterest: PointOfInterest[];\n suppressInteractivity?: boolean;\n onClickPoiItem: (time: number) => void\n}\n\nconst namespace = 'shared.pointsOfInterestList';\n\nexport function PointOfInterestList(props: PointOfInterestListProps) {\n const sortedPointsOfInterest = props.pointsOfInterest.sort((a, b) => a.startTime - b.startTime);\n const hasTimePointOverHours = sortedPointsOfInterest.some(poi => poi.startTime >= 3600);\n\n return (\n <div>\n <h2 className='h6 my-2'><Text namespace={namespace} phrase='heading' /></h2>\n\n <div>\n {sortedPointsOfInterest.map(poi => {\n return (\n <PointOfInterest\n key={poi.startTime}\n poi={poi}\n suppressInteractivity={props.suppressInteractivity}\n onClickPoiItem={props.onClickPoiItem}\n wideBadge={hasTimePointOverHours}\n />\n );\n })}\n\n </div>\n </div>\n );\n}","import * as React from 'react';\nimport CopyToClipboard from 'react-copy-to-clipboard';\nimport Scrollbars from 'react-custom-scrollbars-2';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { PointOfInterestList } from 'libs/shared/components/play-page-v2/glance/points-of-interest-list/PointsOfInterestList';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { TagHelper } from 'libs/shared/components/tags/TagHelper';\nimport { TagList } from 'libs/shared/components/tags/TagList';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { TagType } from 'libs/shared/enums/TagType';\nimport { PointOfInterest, Tag, Video } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { useLearningIntentionMarkdown } from './VideoAtAGlanceUtilsV2';\n\nimport styles from './video-at-a-glance.scss';\n\nconst namespace = 'shared.videoAtAGlanceV2';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst SCROLL_HEIGHT_MAX = 350; // in px\n\ninterface ScrollbarWrapperProps {\n hideScrollbar?: boolean;\n}\n\nfunction ScrollbarWrapper(props: React.PropsWithChildren<ScrollbarWrapperProps>): JSX.Element {\n if (props.hideScrollbar)\n return <>{props.children}</>;\n\n return (\n <div className='rounded border mb-4 bg-white'>\n <Scrollbars\n autoHeight\n autoHeightMax={SCROLL_HEIGHT_MAX}\n >\n <div className='px-3 px-3 pt-3 pb-2'>\n {props.children}\n </div>\n </Scrollbars>\n </div>\n );\n}\n\ninterface VideoAtAGlanceV2Props {\n video: Video;\n pointsOfInterest?: PointOfInterest[];\n suppressInteractivity?: boolean;\n setStartTime?: (time: number) => void;\n getTagAppLink?: (tag: Tag) => Core.AppLink;\n onClickTag?: () => void;\n hideScrollbar?: boolean;\n canViewGlance: boolean;\n}\n\nexport function VideoAtAGlanceV2(props: VideoAtAGlanceV2Props): JSX.Element {\n const learningIntentionMarkdownHTML = useLearningIntentionMarkdown(props.video, props.canViewGlance);\n const [ textToCopy, setTextToCopy ] = React.useState('');\n\n function logUserAction(): void {\n const analyticsData = {\n id: props.video.glance.id,\n videoId: props.video.id,\n videoName: props.video.name,\n learningIntention: textToCopy\n };\n\n const analyticsOptions = {\n actionType: UserAction.Copy,\n entity: EntityType.Glance,\n location: LocationContext.PlayPage\n };\n AnalyticsHelper.logUserAction(analyticsData, analyticsOptions);\n }\n\n function getTags(): Tag[] {\n if (VideoHelper.isInteractive(props.video) || !props.video.tags?.data?.length)\n return null;\n\n return props.video.tags?.data?.filter(tag => tag.tagType === TagType.Pedagogy || tag.tagType === TagType.Skill);\n }\n const tags = getTags();\n\n const ref = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n if (ref.current?.innerText)\n setTextToCopy(ref.current.innerText);\n }, [ref.current?.innerText]);\n\n if (!props.canViewGlance)\n return <></>;\n\n function onClickPoiItem(time: number) {\n props.setStartTime(time);\n }\n\n return (\n <section className='play-page-section'>\n <ScrollbarWrapper hideScrollbar={props.hideScrollbar}>\n <h2 className='h6 mb-2'><Text namespace={namespace} phrase='learningIntention' /></h2>\n \n <div className={`mb-3 ${styles.learningIntention}`}>\n <Tooltip title={getPhrase('copy')} spanHack spanHackClassName={styles.icon}>\n <CopyToClipboard text={textToCopy}>\n <SvgContainer\n className='svg-container me-1 cursor-pointer'\n svgName={cvSvgLibrary.Copy}\n size={SvgContainerSize.Small}\n onClick={logUserAction}\n />\n </CopyToClipboard>\n </Tooltip>\n \n <div\n dangerouslySetInnerHTML={{ __html: learningIntentionMarkdownHTML }}\n className='d-inline'\n ref={ref}\n >\n </div>\n </div>\n\n {!!tags?.length && (\n <div className='mb-1'>\n <TagList\n tags={tags}\n {...TagHelper.getTagActionProps(props.getTagAppLink, props.onClickTag, props.suppressInteractivity)}\n className='mt-2'\n />\n </div>\n )}\n\n {!!props.pointsOfInterest.length && (\n <PointOfInterestList\n pointsOfInterest={props.pointsOfInterest}\n suppressInteractivity={props.suppressInteractivity}\n onClickPoiItem={onClickPoiItem}\n />\n )}\n </ScrollbarWrapper>\n </section>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ThumbnailText } from 'libs/shared/components/thumbnails/thumbnail-text/ThumbnailText';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { FixedWidgetItemProps } from 'libs/shared/components/widgets/items/FixedWidgetItemProps';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { CanFavouriteFunc, FavouriteFunc, InteractiveMetadata, YearGroup } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.interactiveWidgetItemV2';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface InteractiveWidgetItemV2Props extends FixedWidgetItemProps<InteractiveMetadata> {\n imageCdnUrl: string;\n questionsAppLink: Core.AppLink;\n setFavourite?: FavouriteFunc;\n canFavourite?: CanFavouriteFunc;\n yearGroups: YearGroup[];\n isPlugin: boolean;\n showOwner?: boolean;\n}\n\nexport const InteractiveWidgetItemV2 = React.memo(function(props: InteractiveWidgetItemV2Props): JSX.Element {\n const { data: interactive, thumbnailSize, preloadImage } = props;\n\n const questionsAppLink: Core.AppLink = {\n ...props.questionsAppLink,\n args: [props.data.id]\n };\n\n const questionsNumber = interactive._timepoints?.value?.length;\n\n return (\n <div className={`flex-shrink-0 px-1 col-6 col-sm-4`}>\n <VideoThumbnail\n type='static'\n textPosition={ThumbnailTextPosition.Independent}\n video={interactive}\n appLink={props.getAppLink(interactive)}\n imageOptions={{ size: thumbnailSize }}\n preload={preloadImage}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n hideDuration={false}\n imageCdnUrl={props.imageCdnUrl}\n isPlugin={props.isPlugin}\n showOwner={props.showOwner}\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-n1'>\n <AppLink\n appLink={questionsAppLink}\n className='cursor-pointer'\n ariaLabel={`${getPhrase('previewQuestions', { count: questionsNumber, smartCount: questionsNumber })} ${getPhrase('ariaPreview', { name: interactive.name })}`}\n >\n <Text namespace={namespace} phrase='previewQuestions' options={{ count: questionsNumber, smartCount: questionsNumber }}/>\n </AppLink>\n </div>\n </div>\n );\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 { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { CanFavouriteFunc, Clip, FavouriteFunc, Interactive, InteractiveMetadata, 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\nimport { InteractiveWidgetItemV2, InteractiveWidgetItemV2Props } from './InteractiveWidgetItemV2';\n\nconst namespace = 'shared.playPageInteractivesV2';\n\ninterface PlayPageInteractivesProps {\n canViewInteractives: boolean;\n video: Video | Clip;\n interactives: InteractiveMetadata[];\n imageCdnUrl: string;\n analyticsData: HashObject;\n yearGroups: YearGroup[];\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n isPlugin: boolean;\n headingRef?: React.MutableRefObject<Map<PlayPageAnchor, HTMLElement>>;\n}\n\nexport function PlayPageInteractives(props: PlayPageInteractivesProps): JSX.Element {\n if (!props.canViewInteractives || !props.interactives?.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, TextHelper.slugify(props.video.name) ]\n };\n\n return {\n action: Actions.Clips.CLIP_INTERACTIVES,\n application: AppChannels.CLIPS,\n args: [ props.video.id, TextHelper.slugify(props.video.name) ]\n };\n }\n\n const title = LanguageService.getPhrase(namespace, 'interactives', { count: props.interactives.length });\n \n return (\n <section className='play-page-section'\n id={PlayPageAnchor.Interactives}\n ref={el => {\n (el && props.headingRef?.current) && props.headingRef.current.set(PlayPageAnchor.Interactives, el);\n }}\n >\n <FixedWidget<InteractiveWidgetItemV2Props>\n name={title}\n contents={WidgetContents.InteractivesV2}\n collection={props.interactives}\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={InteractiveWidgetItemV2}\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 isPlugin: props.isPlugin,\n showOwner: true\n }}\n analyticsData={props.analyticsData}\n />\n </section>\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 { 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\nimport { ResourceWidgetItemV2, ResourceWidgetItemV2Props } from './ResourceWidgetItemV2';\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 headingRef?: React.MutableRefObject<Map<PlayPageAnchor, HTMLElement>>;\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 const title = LanguageService.getPhrase(namespace, 'resources', { count: resources.length });\n\n if (!resources.length)\n return <></>;\n\n return (\n <section\n id={PlayPageAnchor.Resources}\n className='play-page-section'\n ref={el => {\n (el && props.headingRef?.current) && props.headingRef.current.set(PlayPageAnchor.Resources, el);\n }}\n >\n <FixedWidget<ResourceWidgetItemV2Props>\n name={title}\n contents={WidgetContents.PlayPageResourcesV2}\n collection={resources}\n prefetched\n childComponent={ResourceWidgetItemV2}\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 {\"imageStyle\":\"bYRn8\",\"item\":\"CjuxU\",\"dashboard\":\"IuRN0\",\"playPage\":\"VdJvp\",\"aspectRatio\":\"QK8Jh\",\"outerContainer\":\"eiC_H\",\"innerContainer\":\"huIRg\",\"actions\":\"FsIJm\",\"titleBelow\":\"DpeSr\",\"thumbnailContainer\":\"ZbalL\",\"titleAbove\":\"PwOSX\",\"teacherPack\":\"ZHAEj\",\"text\":\"k3ei6\",\"hoverState\":\"BLrWL\",\"atomGuide\":\"Qz8JE\",\"studentActivity\":\"qNspk\",\"additionalMaterials\":\"R0huw\",\"userUploaded\":\"H_zGf\",\"imageTypeResource\":\"AgeLb\",\"download\":\"DKneu\"};","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 { ImageOptions } from 'libs/shared/utils/ImageHelper';\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\nexport function useCanPreviewResource(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 dynamicRatioImageOptions?: ImageOptions;\n}\n\nResourceTileV2.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 ResourceTileV2(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 dynamicRatioImageOptions={props.dynamicRatioImageOptions}\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' && (\n <div className={`mt-1 ${styles.titleBelow}`}>\n {(\n MasterTypeHelper.isType<Resource>(props.data, MasterType.Resource) &&\n !!props.data?.metadata?.resourceType\n ) && (\n <TitleSubText>\n {ResourceHelper.getResourceTypeName(props.data.metadata.resourceType)}\n </TitleSubText>\n )}\n\n <h3 className='h6 clamp-2'>\n {props.data.name}\n </h3>\n </div>\n )}\n </>\n );\n}\n\nexport interface ResourceWidgetItemV2Props extends ResourceTileProps, FixedWidgetItemProps<Resource | Link> {\n location: 'play-page' | 'dashboard';\n}\n\nexport const ResourceWidgetItemV2 = React.memo(function(props: ResourceWidgetItemV2Props): JSX.Element {\n // Mobile is not allowed to preview\n const canPreview = useCanPreviewResource(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 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 <ResourceTileV2 {...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 <ResourceTileV2 {...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 <ResourceTileV2 {...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 <ResourceTileV2 {...tileProps} />\n </a>\n );\n }\n\n // Theres no url, so don't render an <a>\n return (\n <div className={className}>\n <ResourceTileV2 {...tileProps} />\n </div>\n );\n })()}\n </div>\n );\n});","// extracted by mini-css-extract-plugin\nexport default {\"itemsWrapper\":\"m6mGm\",\"anchorWrapper\":\"QptZj\",\"default\":\"_AZa8\",\"selectedItem\":\"Nuiel\",\"disabled\":\"WIzWJ\",\"floatIcon\":\"ARudn\",\"arrowIcon\":\"tEF5Q\",\"listIcon\":\"Ql2wi\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { ScrollHelper } from 'libs/common/backbone/utils/ScrollHelper';\n\nimport { EntityType, HashObject, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\n\nimport styles from './table-of-contents-list.scss';\n\nexport interface TableOfContentsItem<T=string> {\n name: string;\n id: T;\n tocIndentation?: number;\n}\n\ninterface TableOfContentsProps<T> {\n items: TableOfContentsItem<T>[];\n activeId: string;\n appLink?: Core.AppLink;\n analyticsData?: HashObject;\n setControlledId: (arg: string) => void;\n // set to true if the TOC is controlled by a local state rather than query params\n localState?: boolean;\n getAppLink?: (args: TableOfContentsItem<T>) => Core.AppLink;\n onItemClick?: (args: TableOfContentsItem<T>) => void;\n}\n\nexport function TableOfContentsList<T extends string>(props: TableOfContentsProps<T>): JSX.Element {\n const analyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Widget,\n location: LocationContext.TableOfContents\n };\n\n function onItemSelect(item: TableOfContentsItem<T>) {\n ScrollHelper.preventScrollTop();\n props.setControlledId(item.id);\n \n props.onItemClick?.(item);\n \n setTimeout(() => document.getElementById(item.id)?.focus());\n }\n\n return (\n <div className={`${styles.itemsWrapper}`}>\n {props.items.map((item, idx) => {\n if (props.localState) {\n return (\n <DivButton\n key={item.id}\n className={`${styles.anchorWrapper} ${props.activeId === item.id ? styles.selectedItem : ''}`}\n onClick={() => {\n onItemSelect(item);\n }}\n >\n <div className={`${!props.activeId && idx === 0 ? styles.default : ''} `}>\n {item.name}\n </div>\n </DivButton>\n );\n }\n\n return (\n <AppLink\n key={item.id}\n appLink={props.getAppLink(item)}\n appLinkOptions={{ replace: true }}\n className={`${styles.anchorWrapper} ${props.activeId === item.id ? styles.selectedItem : ''}`}\n onClick={() => {\n onItemSelect(item);\n }}\n analyticsData={{\n ...props.analyticsData,\n id: item.id,\n name: item.name\n }}\n analyticsOptions={analyticsOptions}\n >\n <div className={`${!props.activeId && idx === 0 ? styles.default : ''} ${item.tocIndentation ? 'ms-3' : ''}`}>\n {item.name}\n </div>\n </AppLink>\n );\n })}\n </div>\n );\n}","import React from 'react';\n\nimport { useResizeListener } from 'libs/shared/hooks/UseResizeListener';\n\nexport function useExpandableTextButton() {\n const containerRef = React.useRef<HTMLDivElement>(null);\n\n const memoClientHeight = React.useRef<number>(0);\n\n React.useEffect(() => {\n if (containerRef.current.clientHeight)\n // memo the initial clientHeight, cuz after expand and collapse the clientHeight will change\n memoClientHeight.current = containerRef.current.clientHeight;\n }, []);\n\n const [ showButton, setShowButton ] = React.useState(containerRef.current?.scrollHeight > memoClientHeight.current);\n\n useResizeListener(() => {\n if (containerRef.current.clientHeight) {\n // update memo value on resize\n memoClientHeight.current = containerRef.current.clientHeight;\n setShowButton(containerRef.current?.scrollHeight > memoClientHeight.current);\n }\n });\n\n React.useEffect(() => {\n if (containerRef.current?.scrollHeight) {\n setShowButton(containerRef.current?.scrollHeight > memoClientHeight.current);\n }\n }, [ containerRef.current?.scrollHeight, memoClientHeight.current ]);\n\n return { containerRef, showButton };\n}","import React from 'react';\n\ntype TableOfContentsActiveOption = {\n setActiveId: (id: string) => void;\n headingElements: Element[];\n controlledId?: string;\n setControlledId?: (arg: string) => void;\n}\n\nlet timer: number;\n\nexport const useTableOfContentsActiveHeading = (\n { setActiveId, headingElements, controlledId, setControlledId }: TableOfContentsActiveOption\n) => {\n const scrollPositionRef = React.useRef(0);\n\n React.useEffect(() => {\n const callback = (headings: IntersectionObserverEntry[]) => {\n headings.forEach(heading => {\n if (controlledId) {\n setActiveId(controlledId);\n // can use scrollEnd event when the new event type is supported\n timer = window.setTimeout(() => {\n setControlledId('');\n }, 800);\n return;\n }\n if (heading.isIntersecting) {\n setActiveId(heading.target.id);\n scrollPositionRef.current = window.scrollY;\n } else {\n const scrollDistance = scrollPositionRef.current - window.scrollY;\n const isScrollingUp = scrollDistance > 0;\n const curIndex = headingElements.findIndex(h => h.id === heading.target.id);\n const prevHeading = headingElements[curIndex - 1];\n if (isScrollingUp && prevHeading?.id) {\n setActiveId(prevHeading?.id);\n }\n }\n });\n };\n\n const observer = new IntersectionObserver(callback, {\n // rootMargin top: same as the cv-nav-height\n rootMargin: '-67px 0px -80% 0px'\n });\n\n headingElements.forEach(element => observer.observe(element));\n\n return () => {\n timer && window.clearTimeout(timer);\n observer.disconnect();\n };\n }, [ setActiveId, headingElements.length, controlledId ]);\n};\n\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};","// extracted by mini-css-extract-plugin\nexport default {\"container\":\"qA4yj\",\"showInSide\":\"kd9hB\",\"aside\":\"j28IY\",\"collapse\":\"sFoPk\",\"iconContainer\":\"PYyBV\",\"arrowIcon\":\"MTodB\",\"listIcon\":\"W76p8\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { PortalHelper } from 'libs/common/react/utils/PortalHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, HashObject, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { TableOfContentsList } from 'libs/shared/components/table-of-contents-list/TableOfContentsList';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { ContextService } from 'libs/shared/services/ContextService';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { PLAY_PAGE_TOC_PORTAL_ID } from 'shared/layouts/teacher-layout/TeacherLayoutComponent';\n\nimport styles from './table-of-contents.scss';\n\nconst namespace = 'shared.playPage';\n\nexport interface TableOfContentsItem {\n name: string;\n id: PlayPageAnchor;\n}\n\ninterface TableOfContentsProps {\n items: TableOfContentsItem[];\n activeId: string;\n appLink?: Core.AppLink;\n analyticsData?: HashObject;\n setControlledId: (arg: string) => void;\n isExpanded: boolean;\n setIsExpanded: (arg: boolean) => void;\n showInSide: boolean;\n}\n\nfunction TableOfContentsIcon(props: TableOfContentsProps) {\n function logUserAction() {\n const analyticsOptions = {\n actionType: !props.isExpanded ? UserAction.Open : UserAction.Hide,\n entity: EntityType.TableOfContents,\n location: LocationContext.PlayPage\n };\n\n AnalyticsHelper.logUserAction(props.analyticsData, analyticsOptions);\n }\n\n function onClickIcon() {\n props.setIsExpanded(!props.isExpanded);\n logUserAction();\n }\n\n return (\n <div className='d-flex justify-content-end'>\n <div className={styles.container}>\n <div className={`${styles.iconContainer}`} >\n <IconButton\n className={`btn btn-outline-dark ${styles.listIcon}`}\n svgName={cvSvgLibrary.TableOfContents}\n onClick={onClickIcon}\n />\n \n <IconButton\n className={`btn btn-outline-dark ${styles.arrowIcon}`}\n svgName={!props.isExpanded ? cvSvgLibrary.ExpandLeft : cvSvgLibrary.CollapseRight}\n onClick={onClickIcon}\n />\n </div>\n </div>\n </div>\n );\n}\n\nfunction TableOfContents(props: TableOfContentsProps) {\n function logUserAction() {\n const analyticsOptions = {\n actionType: UserAction.Hide,\n entity: EntityType.TableOfContents,\n location: LocationContext.PlayPage\n };\n\n AnalyticsHelper.logUserAction(props.analyticsData, analyticsOptions);\n }\n\n function getAppLink(item: any): Core.AppLink {\n const currentAppLink = ContextService.getCurrentRoute().appLink;\n\n const params: HashObject = currentAppLink.params\n ? { ...(currentAppLink.params as HashObject) }\n : {};\n\n params.tocId = item.id;\n\n return {\n ...currentAppLink,\n params\n };\n }\n\n function onClickTableOfContentsHeading() {\n if (!props.showInSide) {\n // in mobile version, collapse once user hit the TOC item\n props.setIsExpanded(false);\n }\n }\n\n return (\n <div className={!props.showInSide ? 'd-inline-flex gap-1' : `col col-2 ps-4`}>\n <aside className={`${styles.aside} position-relative ${!props.showInSide ? 'px-3 pt-3 pb-2 border border-dark rounded-1 bg-white' : 'pe-1 pt-1 '}`}>\n <div className={`${styles.container} ${!props.showInSide ? '' : styles.showInSide}`}>\n {props.showInSide && (\n <IconButton\n className={`btn position-absolute ${styles.collapse}`}\n svgName={cvSvgLibrary.CollapseRight}\n onClick={() => {\n props.setIsExpanded(false);\n logUserAction();\n }}\n />\n )}\n <h2 className='h5'><Text namespace={namespace} phrase='tocHeading' /></h2>\n \n <TableOfContentsList\n items={props.items}\n activeId={props.activeId}\n getAppLink={getAppLink}\n setControlledId={props.setControlledId}\n analyticsData={props.analyticsData}\n onItemClick={() => onClickTableOfContentsHeading()}\n />\n </div>\n \n </aside>\n {/* in mobile version, always show icon on the right */}\n {!props.showInSide && <TableOfContentsIcon {...props}/>}\n </div>\n );\n}\n\nexport function TableOfContentsContainer(props: TableOfContentsProps): JSX.Element {\n return (\n <>\n {/* web version show table of contents next to player */}\n {props.isExpanded && props.showInSide && <TableOfContents {...props}/>}\n \n {/* web version show icon in portal (RHS of window) */}\n {PortalHelper.renderInPortalIfExists(\n !props.isExpanded && <TableOfContentsIcon {...props}/>,\n document.getElementById(PLAY_PAGE_TOC_PORTAL_ID)\n )}\n\n {/* mobile version show in portal */}\n {PortalHelper.renderInPortalIfExists(\n !props.showInSide && props.isExpanded && <TableOfContents {...props}/>,\n document.getElementById(PLAY_PAGE_TOC_PORTAL_ID)\n )}\n </>\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Clip, InteractiveMetadata, Resource } from 'libs/shared/interfaces';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\n\ninterface SectionHeadingOptions{\n clips: Clip[];\n interactives: InteractiveMetadata[];\n resources: Resource[];\n isPlayClipPage?: boolean;\n}\n\nconst namespace = 'shared.play';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const PlayPageUtils = {\n getSectionHeading(id: PlayPageAnchor, options: SectionHeadingOptions) {\n switch (id) {\n case PlayPageAnchor.Resources:\n return getPhrase('resourcesHeading', { count: options.resources.length });\n\n case PlayPageAnchor.Clips:\n if (options.isPlayClipPage)\n return getPhrase('otherClipsHeading', { count: options.clips.length - 1 });\n return getPhrase('clipsHeading', { count: options.clips.length });\n\n case PlayPageAnchor.Interactives:\n return getPhrase('interactivesHeading', { count: options.interactives.length });\n\n case PlayPageAnchor.Video:\n return getPhrase('videoHeading');\n\n case PlayPageAnchor.VideoDetails:\n return getPhrase('videoDetailsHeading');\n\n case PlayPageAnchor.RelatedVideos:\n return getPhrase('upNextHeading');\n \n case PlayPageAnchor.CurriculumLinks:\n return getPhrase('curriculumLinksHeading');\n \n case PlayPageAnchor.ClippedFrom:\n return getPhrase('clippedFromHeading');\n\n default:\n return '';\n }\n }\n\n};","import React from 'react';\n\nimport { LocalStorageHelper } from 'libs/common/backbone/utils/LocalStorageHelper';\n\nimport { useShouldShowSideTableOfContents } from 'shared/views/play/v2/hooks/useShouldShowTableOfContents';\n\nconst PLAY_PAGE_TOC_EXPANDED = 'play-page-toc-expanded';\n\nexport function usePlayPageTableOfContent(tocId: string) {\n const showInSide = useShouldShowSideTableOfContents();\n\n const localValue = LocalStorageHelper.get(PLAY_PAGE_TOC_EXPANDED) !== false;\n const tocDefaultExpanded = !showInSide ? false : localValue;\n\n const [ controlledId, setControlledId ] = React.useState(tocId || '');\n const [ tableOfContentsActiveId, setTableOfContentsActiveId ] = React.useState<string>('');\n const [ tableOfContentsExpanded, setTableOfContentsExpanded ] = React.useState(tocDefaultExpanded);\n \n React.useEffect(() => {\n if (!showInSide) {\n // automatically collpase on mobile version\n setTableOfContentsExpanded(false);\n } else {\n setTableOfContentsExpanded(localValue);\n }\n }, [showInSide]);\n\n function onToggleTableOfContents() {\n setTableOfContentsExpanded(!tableOfContentsExpanded);\n LocalStorageHelper.set(PLAY_PAGE_TOC_EXPANDED, !tableOfContentsExpanded);\n }\n\n return {\n controlledId,\n setControlledId,\n tableOfContentsExpanded,\n tableOfContentsActiveId,\n setTableOfContentsActiveId,\n onToggleTableOfContents\n };\n}","import { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\n\nexport const PLAY_PAGE_SECTIONS_ORDER = [\n PlayPageAnchor.Video,\n PlayPageAnchor.CurriculumLinks,\n PlayPageAnchor.Resources,\n PlayPageAnchor.Interactives,\n PlayPageAnchor.Clips,\n PlayPageAnchor.VideoDetails,\n PlayPageAnchor.ClippedFrom,\n PlayPageAnchor.RelatedVideos\n];\n\nexport const PLAY_PAGE_SECTIONS_ORDER_NO_GLANCE = [\n PlayPageAnchor.Video,\n PlayPageAnchor.VideoDetails,\n PlayPageAnchor.CurriculumLinks,\n PlayPageAnchor.Resources,\n PlayPageAnchor.Interactives,\n PlayPageAnchor.Clips,\n PlayPageAnchor.ClippedFrom,\n PlayPageAnchor.RelatedVideos\n];","import React from 'react';\n\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\n\nimport { PLAY_PAGE_SECTIONS_ORDER, PLAY_PAGE_SECTIONS_ORDER_NO_GLANCE } from 'shared/constants/PlayPageSectionsOrder';\n\nexport function useSectionHeadings(hasGlance: boolean) {\n const headingRef = React.useRef<Map<PlayPageAnchor, HTMLElement>>(new Map());\n const headingElements = (hasGlance ? PLAY_PAGE_SECTIONS_ORDER : PLAY_PAGE_SECTIONS_ORDER_NO_GLANCE).map(id => {\n return headingRef.current.get(id);\n }).filter(Boolean);\n\n return { headingRef, headingElements };\n}","import { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\n\n// returns boolean value for if we should show the TOC on the side\nexport function useShouldShowSideTableOfContents(): boolean {\n const breakpoints = useBreakpoints();\n const shouldShowSideTableOfContents = breakpoints.lg || breakpoints.xl || breakpoints.xxl;\n return shouldShowSideTableOfContents;\n}","// extracted by mini-css-extract-plugin\nexport default {\"learningIntention\":\"MHM6O\",\"highlightPoi\":\"U7Q6x\",\"icon\":\"H1xbT\"};"],"names":["PortalHelper","renderInPortalIfExists","component","portalContainer","createPortal","getPhrase","BreadcrumbItem","props","ref","breadcrumb","name","appLink","active","withBackIcon","className","svgName","size","S","Breadcrumbs","breadcrumbs","isMobile","length","collapse","setCollapse","shouldFocus","setShouldFocus","expandRef","characterLength","reduce","prev","next","current","focus","first","second","secondLast","last","rest","slice","onClick","map","idx","key","PartialBreadcrumbs","numItems","style","height","width","dangerouslySetInnerHTML","__html","namespace","CONTAINER_HEIGHT","CopyrightDisclaimer","isHovering","Text","phrase","Overlay","target","show","placement","overflowPlacement","document","documentElement","clientHeight","getBoundingClientRect","bottom","ClipWidgetItemV2","clip","data","thumbnailSize","preloadImage","getAppLink","mergedAudience","subjectPresentationAudiences","audiences","VideoThumbnail","type","textPosition","ThumbnailTextPosition","video","imageOptions","preload","analyticsData","analyticsOptions","setFavourite","canFavourite","imageCdnUrl","audience","hideDuration","isPlugin","showOwner","ThumbnailText","PlayPageClips","canViewClips","clips","parentIsVideo","VideoHelper","title","LanguageService","count","id","PlayPageAnchor","el","headingRef","set","contents","WidgetContents","collection","prefetched","getChildAppLink","application","action","args","TextHelper","childComponent","extraChildComponentProps","yearGroups","VideoDescription","expanded","setExpanded","useExpandableTextButton","containerRef","showButton","DivButton","LinkifyHelper","description","nl2br","CommaList","label","items","commaSeperated","i","join","DetailsSection","parentVideo","productionYear","options","year","smartCount","productionCompanies","distributors","producers","directors","dateBroadcast","date","DateHelper","channel","currentUser","isAuthenticated","dateCreated","_isClickViewCurated","value","showDateUploaded","VideoDetailsWithScrollbarV2","maxHeight","showDescription","showDetails","tags","hideTags","filter","tag","tagType","TagType","getTags","showHeading","autoHeight","autoHeightMax","ImmersiveReader","text","onLaunch","onLaunchImmersiveReader","onExit","onExitImmersiveReader","location","entity","actionType","descriptor","TagList","TagHelper","getTagAppLink","suppressInteractivity","POI_LINK_LINE","useLearningIntentionMarkdown","hasGlanceData","useState","markdownHTML","setMarkdownHTML","useEffect","content","glance","learningIntention","replace","format","useHighlightPointOfInterest","pointOfInterest","shouldHighlight","useRef","onGlancePoiMouseOver","onGlancePoiMouseLeave","hoveredPoi","toString","classList","add","remove","addEventListener","removeEventListener","PointOfInterest","timeStamp","DurationHelper","poi","startTime","wideBadge","onClickPoiItem","PointOfInterestList","sortedPointsOfInterest","pointsOfInterest","sort","a","b","hasTimePointOverHours","some","SCROLL_HEIGHT_MAX","ScrollbarWrapper","hideScrollbar","children","VideoAtAGlanceV2","learningIntentionMarkdownHTML","canViewGlance","textToCopy","setTextToCopy","innerText","Tooltip","spanHack","spanHackClassName","SvgContainer","videoId","videoName","AnalyticsHelper","onClickTag","time","setStartTime","InteractiveWidgetItemV2","interactive","questionsAppLink","questionsNumber","_timepoints","ariaLabel","PlayPageInteractives","canViewInteractives","interactives","PlayPageResources","hasPermissions","resources","isLearner","links","filteredResources","r","includes","metadata","resourceType","getResources","imageErrorFallbackUrl","resourceThumbnailFallbackUrl","actionBehaviour","canViewResources","titlePosition","onClickDownload","resource","workflowPhase","SignUp","useCanPreviewResource","breakpoints","useBreakpoints","xs","sm","ResourceFileType","url","pdf","ResourceTileV2","isResource","MasterTypeHelper","MasterType","baseClass","getColour","theme","containerClass","applyHoverState","getInnerContainerClass","thumbnailContainerClass","ResourceThumbnail","dynamicRatioImageOptions","e","preventDefault","stopPropagation","hideTypeBadge","TypeBadge","typeId","TitleSubText","ResourceHelper","defaultProps","ResourceWidgetItemV2","canPreview","logAction","tileProps","SeoConstants","href","AppLink","TableOfContentsList","onItemSelect","item","ScrollHelper","setControlledId","onItemClick","setTimeout","getElementById","localState","activeId","appLinkOptions","tocIndentation","memoClientHeight","scrollHeight","setShowButton","timer","useTableOfContentsActiveHeading","setActiveId","headingElements","controlledId","scrollPositionRef","observer","IntersectionObserver","headings","forEach","heading","window","isIntersecting","scrollY","isScrollingUp","curIndex","findIndex","h","prevHeading","rootMargin","element","observe","clearTimeout","disconnect","downloadRef","DownloadHelper","getVideoDownloadUrl","downloadProxyUrl","token","downloadResource","iframe","createElement","body","appendChild","display","src","TableOfContentsIcon","onClickIcon","setIsExpanded","isExpanded","IconButton","TableOfContents","showInSide","currentAppLink","ContextService","params","tocId","TableOfContentsContainer","PlayPageUtils","getSectionHeading","isPlayClipPage","PLAY_PAGE_TOC_EXPANDED","usePlayPageTableOfContent","localValue","tocDefaultExpanded","tableOfContentsActiveId","setTableOfContentsActiveId","tableOfContentsExpanded","setTableOfContentsExpanded","onToggleTableOfContents","PLAY_PAGE_SECTIONS_ORDER","PLAY_PAGE_SECTIONS_ORDER_NO_GLANCE","useSectionHeadings","hasGlance","Map","get","Boolean","useShouldShowSideTableOfContents","lg","xl","xxl"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"scripts/2142-86bcd85ffd-lite.chunk.js","mappings":"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","sources":["file:///Users/joshua.taylor/Projects/clickview/packages/libs/common/src/react/utils/PortalHelper.ts","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/breadcrumbs/Breadcrumbs.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/copyright-disclaimer/copyright-disclaimer.scss","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/copyright-disclaimer/CopyrightDisclaimer.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/play-page-v2/clips-widget/ClipWidgetItemV2.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/play-page-v2/clips-widget/PlayPageClips.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/play-page-v2/details/video-description/video-description.scss","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/play-page-v2/details/video-description/VideoDescription.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/play-page-v2/details/video-details.scss","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/play-page-v2/details/VideoDetailsV2.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/play-page-v2/glance/VideoAtAGlanceUtilsV2.ts","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/play-page-v2/glance/points-of-interest-list/points-of-interest-list.scss","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/play-page-v2/glance/points-of-interest-list/PointsOfInterestList.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/play-page-v2/glance/VideoAtAGlanceV2.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/play-page-v2/interactives-widget/InteractiveWidgetItemV2.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/play-page-v2/interactives-widget/PlayPageInteractives.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/play-page-v2/resources-widget/PlayPageResources.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/play-page-v2/resources-widget/resource-widget-item.scss","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/play-page-v2/resources-widget/ResourceWidgetItemV2.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/table-of-contents-list/table-of-contents-list.scss","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/table-of-contents-list/TableOfContentsList.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/hooks/useExpandableTextButton.ts","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/hooks/useTableOfContentsActiveHeading.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/utils/DownloadHelper.ts","file:///Users/joshua.taylor/Projects/clickview/packages/projects/lite/src/shared/components/play-page/components/table-of-contents/table-of-contents.scss","file:///Users/joshua.taylor/Projects/clickview/packages/projects/lite/src/shared/components/play-page/components/table-of-contents/TableOfContents.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/projects/lite/src/shared/views/play/v2/PlayPageUtilV2.tsx","file:///Users/joshua.taylor/Projects/clickview/packages/projects/lite/src/shared/views/play/v2/hooks/usePlayPageTableOfContent.ts","file:///Users/joshua.taylor/Projects/clickview/packages/projects/lite/src/shared/constants/PlayPageSectionsOrder.ts","file:///Users/joshua.taylor/Projects/clickview/packages/projects/lite/src/shared/views/play/v2/hooks/useSectionHeadings.ts","file:///Users/joshua.taylor/Projects/clickview/packages/projects/lite/src/shared/views/play/v2/hooks/useShouldShowTableOfContents.ts","file:///Users/joshua.taylor/Projects/clickview/packages/libs/shared/src/components/play-page-v2/glance/video-at-a-glance.scss"],"sourcesContent":["import React from 'react';\nimport { createPortal } from 'react-dom';\n\nexport const PortalHelper = {\n renderInPortalIfExists(component: React.ReactElement, portalContainer: Element | null): React.ReactElement {\n if (portalContainer)\n return createPortal(component, portalContainer);\n\n return component;\n }\n};","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { 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\nconst namespace = 'shared.breadcrumbComponent';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst COLLAPSE_CHARACTER_COUNT = 64;\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 = React.forwardRef((\n props: BreadcrumbItemProps,\n ref: React.ForwardedRef<HTMLElement>\n) => {\n const { breadcrumb: { name, appLink, active }, withBackIcon } = props;\n return (\n <li className={`breadcrumb-item${active ? ' active' : ''}`}>\n {active\n ? <strong>{name}</strong>\n : <AppLink appLink={appLink} ref={ref}>\n {withBackIcon && <SvgContainer svgName={cvSvgLibrary.ChevronLeft} size={SvgContainerSize.Small} />}\n <span className={withBackIcon ? 'ms-2' : ''}>{name}</span>\n </AppLink>\n }\n </li>\n );\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 || 0;\n \n const [ collapse, setCollapse ] = React.useState(false);\n const [ shouldFocus, setShouldFocus ] = React.useState(false);\n const expandRef = React.useRef<HTMLElement>();\n\n React.useEffect(() => {\n const characterLength = breadcrumbs?.reduce((prev, next) => prev + next.name.length, 0) ?? 0;\n\n if (length > 4 && characterLength > COLLAPSE_CHARACTER_COUNT)\n setCollapse(true);\n }, [breadcrumbs?.length]);\n\n /**\n * Focus our first expanded item the first time it appears.\n */\n React.useLayoutEffect(() => {\n if (shouldFocus)\n expandRef.current?.focus();\n }, [ expandRef.current, shouldFocus ]);\n\n function onClickExpand() {\n setCollapse(false);\n setShouldFocus(true);\n }\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 const first = <BreadcrumbItem breadcrumb={breadcrumbs[0]} />;\n const second = length > 2 ? <BreadcrumbItem breadcrumb={breadcrumbs[1]} /> : <></>;\n const secondLast = length > 3 ? <BreadcrumbItem breadcrumb={breadcrumbs[length - 2]} /> : <></>;\n const last = length > 1 ? <BreadcrumbItem breadcrumb={breadcrumbs[length - 1]} /> : <></>;\n const rest = breadcrumbs.slice(2, length - 2);\n\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n {first}\n {second}\n {collapse ?\n <li className='breadcrumb-item'>\n <button\n className='btn-link'\n onClick={onClickExpand}\n aria-label={getPhrase('expand')}\n >\n ...\n </button>\n </li> :\n rest.map((breadcrumb, idx) => (\n <BreadcrumbItem\n key={idx}\n breadcrumb={breadcrumb}\n ref={idx === 0 ? expandRef : null}\n />\n ))\n }\n {secondLast}\n {last}\n </ol>\n </nav>\n );\n};\n\nexport const PartialBreadcrumbs = React.memo(function({ numItems = 3 }: { numItems?: number; }) {\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n\n if (isMobile) {\n return (\n <div className='partial-loading-background' style={{ height: '1.3125rem', width: '6rem' }} />\n );\n }\n\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n {PartialLoadingHelper.getPartialLoadingItems({ numItems }).map(({ width }, idx) => (\n <li key={idx} className='breadcrumb-item'>\n <span className='d-inline-block partial-loading-background' style={{ width }} dangerouslySetInnerHTML={{ __html: ' ' }} />\n </li>\n ))}\n </ol>\n </nav>\n );\n});","// extracted by mini-css-extract-plugin\nexport default {\"copyrightDisclaimer\":\"z8YoI\",\"overlayContainer\":\"eJDbJ\"};","import React from 'react';\nimport { Overlay } from 'react-bootstrap';\nimport { Placement } from 'react-bootstrap/esm/types';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { useHoverIntent } from 'libs/shared/hooks/UseHover';\n\nimport styles from './copyright-disclaimer.scss';\n\nconst namespace = 'shared.copyrightDisclaimer';\n\nconst CONTAINER_HEIGHT = 150; // px\n\ninterface CopyrightDisclaimerProps {\n placement: Placement;\n overflowPlacement?: Placement;\n className?: string;\n}\n\nexport function CopyrightDisclaimer(props: CopyrightDisclaimerProps) {\n const [ ref, isHovering ] = useHoverIntent<HTMLDivElement>({});\n\n function preventOverflow() {\n const spaceBelow = document.documentElement.clientHeight - ref.current?.getBoundingClientRect().bottom;\n\n return spaceBelow < CONTAINER_HEIGHT;\n }\n\n return (\n <div ref={ref} className={props.className}>\n <p className={`${styles.copyrightDisclaimer} mb-1`}><Text namespace={namespace} phrase='copyrightDisclaimer' /></p>\n <Overlay\n target={ref.current}\n show={isHovering}\n placement={props.overflowPlacement && preventOverflow() ? props.overflowPlacement : props.placement}\n >\n <div className={`${styles.overlayContainer} mw-100 bg-white border rounded-3 p-2`}>\n <p><Text namespace={namespace} phrase='warning' /></p>\n <p className='fw-semibold mb-0'><Text namespace={namespace} phrase='sharing' /></p>\n </div>\n </Overlay>\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 { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { CanFavouriteFunc, Clip, FavouriteFunc, PresentationAudience, YearGroup } from 'libs/shared/interfaces';\n\nexport interface ClipWidgetItemV2Props extends FixedWidgetItemProps<Clip> {\n imageCdnUrl: string;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n audiences: PresentationAudience[];\n yearGroups: YearGroup[];\n isPlugin: boolean;\n showOwner?: boolean;\n}\n\nexport const ClipWidgetItemV2 = React.memo(function(props: ClipWidgetItemV2Props): JSX.Element {\n const { data: clip, thumbnailSize, preloadImage, getAppLink } = props;\n const mergedAudience = useMergeAudiences(clip.subjectPresentationAudiences?.data, props.audiences);\n\n return (\n <div className={`flex-shrink-0 px-1 col-6 col-sm-4`}>\n <VideoThumbnail\n type='static'\n textPosition={ThumbnailTextPosition.Independent}\n video={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 audience={mergedAudience}\n hideDuration={false}\n isPlugin={props.isPlugin}\n showOwner={props.showOwner}\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});","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 { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { CanFavouriteFunc, Clip, FavouriteFunc, PresentationAudience, 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\nimport { ClipWidgetItemV2, ClipWidgetItemV2Props } from './ClipWidgetItemV2';\n\nconst namespace = 'shared.playPageClipsV2';\n\ninterface PlayPageClipsProps {\n video: Video | Clip;\n clips: Clip[];\n canViewClips: boolean;\n yearGroups: YearGroup[];\n audiences: PresentationAudience[];\n imageCdnUrl: string;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n analyticsData: HashObject;\n headingRef?: React.MutableRefObject<Map<PlayPageAnchor, HTMLElement>>;\n isPlugin: boolean;\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, TextHelper.slugify(props.video.name) ]\n };\n }\n return {\n action: Actions.Clips.CLIP_CLIPS,\n application: AppChannels.CLIPS,\n args: [ props.video.id, TextHelper.slugify(props.video.name) ]\n };\n }\n\n const title = LanguageService.getPhrase(\n namespace,\n parentIsVideo ? 'clips' : 'otherClips',\n { count: props.clips.length }\n );\n\n return (\n <section\n className='play-page-section'\n id={PlayPageAnchor.Clips}\n ref={el => {\n (el && props.headingRef?.current) && props.headingRef.current.set(PlayPageAnchor.Clips, el);\n }}\n >\n <FixedWidget<ClipWidgetItemV2Props>\n name={title}\n contents={WidgetContents.ClipsV2}\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={ClipWidgetItemV2}\n extraChildComponentProps={{\n yearGroups: props.yearGroups,\n audiences: props.audiences,\n imageCdnUrl: props.imageCdnUrl,\n setFavourite: props.setFavourite,\n canFavourite: props.canFavourite,\n isPlugin: props.isPlugin,\n showOwner: true\n }}\n analyticsData={props.analyticsData}\n />\n </section>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"container\":\"G5zMm\",\"collapsed\":\"kkd1X\",\"seeMore\":\"DS4QF\"};","import React from 'react';\n\nimport { LinkifyHelper } from 'libs/common/react/utils/LinkifyHelper';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { useExpandableTextButton } from 'libs/shared/hooks/useExpandableTextButton';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nimport styles from './video-description.scss';\n\nconst namespace = 'shared.videoDetailsV2';\n\ninterface VideoDescriptionProps {\n video: VideoTypes;\n}\n\nexport function VideoDescription(props: VideoDescriptionProps): React.ReactElement {\n const [ expanded, setExpanded ] = React.useState(false);\n const { containerRef, showButton } = useExpandableTextButton();\n\n return (\n <div className={`${styles.container} ${expanded ? '' : styles.collapsed}`} >\n {(!expanded && showButton) && (\n <DivButton\n onClick={() => setExpanded(true)}\n className={`ms-1 text-info hover-text-underline ${styles.seeMore}`}\n >\n <Text namespace={namespace} phrase='seeMore' />\n </DivButton>\n )}\n <p\n ref={containerRef}\n className={`mb-0 ${expanded ? 'd-inline' : ''}`}\n dangerouslySetInnerHTML={{\n __html: LinkifyHelper.linkifyText(props.video.description, { nl2br: true })\n }}\n />\n {expanded && (\n <DivButton\n onClick={() => setExpanded(false)}\n className={`ms-1 hover-text-underline d-inline text-info`}\n >\n <Text namespace={namespace} phrase='seeLess' />\n </DivButton>\n )}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"descriptionBorder\":\"YUC62\"};","import * as React from 'react';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { CopyrightDisclaimer } from 'libs/shared/components/copyright-disclaimer/CopyrightDisclaimer';\nimport { ImmersiveReader } from 'libs/shared/components/immersive-reader/ImmersiveReader';\nimport { VideoDescription } from 'libs/shared/components/play-page-v2/details/video-description/VideoDescription';\nimport { TagHelper } from 'libs/shared/components/tags/TagHelper';\nimport { TagList } from 'libs/shared/components/tags/TagList';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { hasPPDD } from 'libs/shared/components/video-details/VideoDetailsUtils';\nimport { MINIMUM_GLANCE_HEIGHT } from 'libs/shared/constants/MinimumGlanceHeight';\nimport { TagType } from 'libs/shared/enums/TagType';\nimport { BaseObject, BasePaginatedCollection, CurrentUser, Tag, VideoTypes } from 'libs/shared/interfaces';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './video-details.scss';\n\nconst namespace = 'shared.videoDetailsV2';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface CommaListProps {\n label: string;\n items: BasePaginatedCollection<BaseObject>;\n className?: string;\n}\n\nfunction CommaList(props: CommaListProps): React.ReactElement {\n const { label, items, className } = props;\n\n const hasItems = items && items.data && items.data.length;\n\n if (!hasItems)\n return <></>;\n\n const commaSeperated = items.data.map(i => i.name).join(', ');\n\n return (\n <div className={className}>{label}: {commaSeperated}</div>\n );\n}\n\nfunction DetailsSection(props: VideoDetailsWithScrollbarV2Props): React.ReactElement {\n const { video } = props;\n\n if (!VideoHelper.isVideo(video) && !VideoHelper.isClip(video))\n return <></>;\n\n function showDateUploaded(): boolean {\n if (!props.currentUser?.isAuthenticated)\n return false;\n\n return !!video.dateCreated && !video._isClickViewCurated?.value;\n }\n\n const parentVideo = VideoHelper.getParentVideo(video);\n\n return (\n <div className={video.description ? 'col-md-5 ps-md-3 pt-3 pt-md-0' : 'col-12'}>\n <h2 className='h6 mb-1'><Text phrase='details' /></h2>\n {!!parentVideo.productionYear && (\n <div className='mb-1'>\n <Text phrase='productionYear' options={{ year: parentVideo.productionYear }} />\n </div>\n )}\n <CommaList\n label={getPhrase('productionCompanies', { smartCount: parentVideo.productionCompanies?.data?.length })}\n items={parentVideo.productionCompanies}\n className='mb-1'\n />\n <CommaList\n label={getPhrase('distributors', { smartCount: parentVideo.distributors?.data?.length })}\n items={parentVideo.distributors}\n className='mb-1'\n />\n <CommaList\n label={getPhrase('producers', { smartCount: parentVideo.producers?.data?.length })}\n items={parentVideo.producers}\n className='mb-1'\n />\n <CommaList\n label={getPhrase('directors', { smartCount: parentVideo.directors?.data?.length })}\n items={parentVideo.directors}\n className='mb-1'\n />\n {!!parentVideo.dateBroadcast && (\n <div className='mb-1'>\n <Text phrase='dateBroadcast' options={{ date: DateHelper.format(parentVideo.dateBroadcast, 'DD/MM/YYYY') }} />\n </div>\n )}\n {!!parentVideo.channel && (\n <div className='mb-1'>\n <Text phrase='channel' options={{ channel: parentVideo.channel.name }} />\n </div>\n )}\n {showDateUploaded() && (\n <div className='mb-1'>\n <Text phrase='dateUploaded' options={{ date: DateHelper.format(video.dateCreated, 'DD/MM/YYYY') }} />\n </div>\n )}\n </div>\n );\n}\n\ninterface VideoDetailsWithScrollbarV2Props {\n video: VideoTypes;\n currentUser: CurrentUser;\n getTagAppLink?: (tag: Tag) => Core.AppLink;\n onLaunchImmersiveReader?: () => void;\n onExitImmersiveReader?: () => void;\n maxHeight?: number;\n suppressInteractivity?: boolean;\n hideTags?: boolean;\n headingRef?: React.MutableRefObject<Map<PlayPageAnchor, HTMLElement>>;\n showHeading?: boolean;\n}\n\nexport function VideoDetailsWithScrollbarV2(props: VideoDetailsWithScrollbarV2Props): React.ReactElement {\n const { video, maxHeight = MINIMUM_GLANCE_HEIGHT } = props;\n\n const parentVideo = VideoHelper.getParentVideo(video);\n\n const showDescription = !!props.video.description;\n\n const showDetails = (\n hasPPDD(props.video) ||\n !!parentVideo.productionYear ||\n !!parentVideo.dateBroadcast ||\n !!parentVideo.channel ||\n !!(video.dateCreated && !video._isClickViewCurated?.value)\n );\n\n if (!showDescription && !showDetails)\n return <></>;\n\n function getTags(): Tag[] {\n if (props.hideTags || VideoHelper.isInteractive(props.video) || !props.video.tags?.data?.length)\n return null;\n\n return props.video.tags?.data?.filter(tag => tag.tagType === TagType.Normal);\n }\n const tags = getTags();\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <section\n id={PlayPageAnchor.VideoDetails}\n ref={el => {\n (el && props.headingRef?.current) && props.headingRef.current.set(PlayPageAnchor.VideoDetails, el);\n }}\n className='play-page-section'\n >\n {props.showHeading && (\n <h2 className='h4 curated-widget-header'><Text phrase='heading' /></h2>\n )}\n <div className='rounded border p-3 position-relative'>\n <Scrollbars autoHeight autoHeightMax={maxHeight}>\n <div className='row g-0'>\n {showDescription && (\n <div className={showDetails ? `${styles.descriptionBorder} pe-3 col-md-7` : 'col-12'}>\n <div className='d-flex align-items-center'>\n <h2 className='h6 mb-1'>\n <Text phrase='description' />\n </h2>\n <ImmersiveReader\n text={video.description}\n title={video.name}\n className='ps-2'\n onLaunch={props.onLaunchImmersiveReader}\n onExit={props.onExitImmersiveReader}\n analyticsOptions={{\n location: LocationContext.PlayPage,\n entity: EntityType.Video,\n actionType: UserAction.Click,\n descriptor: ClickDescriptor.LaunchImmersiveReader\n }}\n analyticsData={{ id: video.id, type: 'description' }}\n />\n </div>\n\n <VideoDescription video={props.video} />\n </div>\n )}\n\n {showDetails && (\n <DetailsSection {...props} />\n )}\n </div>\n\n {!!tags?.length && (\n <div className='mt-3'>\n <h2 className='h6 mb-1'><Text phrase='normalTags' /></h2>\n <TagList\n tags={tags}\n {...TagHelper.getTagActionProps(props.getTagAppLink, null, props.suppressInteractivity)}\n className='mt-1'\n />\n </div>\n )}\n\n {VideoHelper.isBroadcast(props.video) && <CopyrightDisclaimer placement='bottom-start' className='d-flex justify-content-start mt-2 mb-n1' />}\n\n </Scrollbars>\n </div>\n </section>\n </LanguageNamespaceContext.Provider>\n );\n}","import { MutableRefObject, useEffect, useRef, useState } from 'react';\nimport * as marked from 'marked';\n\nimport { useEventsServiceSubscribe } from 'libs/common/react/hooks/UseEventsServiceSubscribe';\nimport { EventsService } from 'libs/common/react/services/EventsService';\n\nimport { Clip, Glance, PointOfInterest, Video } from 'libs/shared/interfaces';\n\nimport styles from './video-at-a-glance.scss';\n\nconst POI_LINK_LINE = /\\[\\]\\(cv:\\/\\/poi\\?id=\\d+\\)\\n*/g;\n\nfunction stripPoisFromGlanceContent(glanceContent: string): string {\n return glanceContent.replace(POI_LINK_LINE, '');\n}\n\nfunction getLearningIntentionHTML(glance: Glance): string {\n const learningIntention = stripPoisFromGlanceContent(glance.content);\n\n return marked(learningIntention);\n}\n\nexport function useLearningIntentionMarkdown(\n video: Video,\n hasGlanceData?: boolean\n): string {\n const [ markdownHTML, setMarkdownHTML ] = useState('');\n\n useEffect(() => {\n if (!hasGlanceData)\n return;\n\n const content = getLearningIntentionHTML(video.glance);\n\n setMarkdownHTML(content);\n }, [ video.glance?.content, hasGlanceData ]);\n\n return markdownHTML;\n}\n\nexport function hasGlanceData(video: Video | Clip): boolean {\n return video.glance?.content && video.glance?.format === 'text/markdown';\n}\n\nexport function useHighlightPointOfInterest(\n pointOfInterest: PointOfInterest,\n shouldHighlight: boolean\n): MutableRefObject<HTMLDivElement> {\n const ref = useRef<HTMLDivElement>();\n\n useEventsServiceSubscribe('player:poi:mouseover', onPlayerPoiMouseOver, null, shouldHighlight);\n useEventsServiceSubscribe('player:poi:mouseleave', onPlayerPoiMouseLeave, null, shouldHighlight);\n\n useEffect(() => {\n if (!ref.current || !shouldHighlight)\n return;\n\n ref.current?.addEventListener('mouseover', onGlancePoiMouseOver);\n ref.current?.addEventListener('mouseleave', onGlancePoiMouseLeave);\n\n return () => {\n ref.current?.removeEventListener('mouseover', onGlancePoiMouseOver);\n ref.current?.removeEventListener('mouseleave', onGlancePoiMouseLeave);\n };\n }, [ref.current]);\n\n function onPlayerPoiMouseOver(hoveredPoi: PointOfInterest): void {\n if (!hoveredPoi?.id || pointOfInterest?.id?.toString() !== hoveredPoi?.id?.toString())\n return;\n\n ref.current?.classList.add(styles.highlightPoi);\n }\n\n function onPlayerPoiMouseLeave(): void {\n ref.current?.classList.remove(styles.highlightPoi);\n }\n\n /**\n * `this` will be the element to which the eventListener is bound.\n */\n function onGlancePoiMouseOver(): void {\n if (pointOfInterest)\n EventsService.trigger('glance:poi:mouseover', pointOfInterest);\n }\n\n function onGlancePoiMouseLeave(): void {\n EventsService.trigger('glance:poi:mouseleave');\n }\n\n return ref;\n}","// extracted by mini-css-extract-plugin\nexport default {\"poiEntry\":\"vr6R9\",\"poiText\":\"znHZF\",\"public\":\"v0BZ9\",\"poiTimeStamp\":\"AdKwe\",\"wideBadge\":\"YR2Hh\"};","import React from 'react';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PointOfInterest } from 'libs/shared/interfaces';\nimport { DurationHelper } from 'libs/shared/utils/DurationHelper';\n\nimport { useHighlightPointOfInterest } from '../VideoAtAGlanceUtilsV2';\n\nimport styles from './points-of-interest-list.scss';\n\ninterface PointOfInterestProps {\n poi: PointOfInterest;\n suppressInteractivity?: boolean;\n onClickPoiItem: (time: number) => void;\n wideBadge?: boolean;\n}\n\nfunction PointOfInterest(props: PointOfInterestProps): JSX.Element {\n const timeStamp = DurationHelper.ToDisplayDuration(props.poi.startTime * 1000);\n\n const ref = useHighlightPointOfInterest(props.poi, !props.suppressInteractivity);\n\n if (props.suppressInteractivity) {\n return (\n <div className={`d-flex ${styles.poiEntry} mb-2`}>\n <span className={`d-flex rounded-pill justify-content-center align-items-center fw-semibold text-info bg-light-blue ${styles.poiTimeStamp} ${props.wideBadge ? styles.wideBadge : ''}`}>{timeStamp}</span>\n <div className={`${styles.public} ms-2`}>{props.poi.description}</div>\n </div>\n );\n }\n\n return (\n <DivButton\n key={props.poi.startTime}\n className={`d-flex ${styles.poiEntry} mb-2 cursor-pointer`}\n onClick={() => props.onClickPoiItem(props.poi.startTime)}\n ref={ref}\n >\n <div className={`d-flex rounded-pill justify-content-center align-items-center fw-semibold text-info bg-light-blue ${styles.poiTimeStamp} ${props.wideBadge ? styles.wideBadge : ''}`}>{timeStamp}</div>\n <div className={`ms-2 ${styles.poiText}`}>{props.poi.description}</div>\n </DivButton>\n );\n}\n\ninterface PointOfInterestListProps{\n pointsOfInterest: PointOfInterest[];\n suppressInteractivity?: boolean;\n onClickPoiItem: (time: number) => void\n}\n\nconst namespace = 'shared.pointsOfInterestList';\n\nexport function PointOfInterestList(props: PointOfInterestListProps) {\n const sortedPointsOfInterest = props.pointsOfInterest.sort((a, b) => a.startTime - b.startTime);\n const hasTimePointOverHours = sortedPointsOfInterest.some(poi => poi.startTime >= 3600);\n\n return (\n <div>\n <h2 className='h6 my-2'><Text namespace={namespace} phrase='heading' /></h2>\n\n <div>\n {sortedPointsOfInterest.map(poi => {\n return (\n <PointOfInterest\n key={poi.startTime}\n poi={poi}\n suppressInteractivity={props.suppressInteractivity}\n onClickPoiItem={props.onClickPoiItem}\n wideBadge={hasTimePointOverHours}\n />\n );\n })}\n\n </div>\n </div>\n );\n}","import * as React from 'react';\nimport CopyToClipboard from 'react-copy-to-clipboard';\nimport Scrollbars from 'react-custom-scrollbars-2';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { PointOfInterestList } from 'libs/shared/components/play-page-v2/glance/points-of-interest-list/PointsOfInterestList';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { TagHelper } from 'libs/shared/components/tags/TagHelper';\nimport { TagList } from 'libs/shared/components/tags/TagList';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { TagType } from 'libs/shared/enums/TagType';\nimport { PointOfInterest, Tag, Video } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { useLearningIntentionMarkdown } from './VideoAtAGlanceUtilsV2';\n\nimport styles from './video-at-a-glance.scss';\n\nconst namespace = 'shared.videoAtAGlanceV2';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst SCROLL_HEIGHT_MAX = 350; // in px\n\ninterface ScrollbarWrapperProps {\n hideScrollbar?: boolean;\n}\n\nfunction ScrollbarWrapper(props: React.PropsWithChildren<ScrollbarWrapperProps>): JSX.Element {\n if (props.hideScrollbar)\n return <>{props.children}</>;\n\n return (\n <div className='rounded border mb-4 bg-white'>\n <Scrollbars\n autoHeight\n autoHeightMax={SCROLL_HEIGHT_MAX}\n >\n <div className='px-3 px-3 pt-3 pb-2'>\n {props.children}\n </div>\n </Scrollbars>\n </div>\n );\n}\n\ninterface VideoAtAGlanceV2Props {\n video: Video;\n pointsOfInterest?: PointOfInterest[];\n suppressInteractivity?: boolean;\n setStartTime?: (time: number) => void;\n getTagAppLink?: (tag: Tag) => Core.AppLink;\n onClickTag?: () => void;\n hideScrollbar?: boolean;\n canViewGlance: boolean;\n}\n\nexport function VideoAtAGlanceV2(props: VideoAtAGlanceV2Props): JSX.Element {\n const learningIntentionMarkdownHTML = useLearningIntentionMarkdown(props.video, props.canViewGlance);\n const [ textToCopy, setTextToCopy ] = React.useState('');\n\n function logUserAction(): void {\n const analyticsData = {\n id: props.video.glance.id,\n videoId: props.video.id,\n videoName: props.video.name,\n learningIntention: textToCopy\n };\n\n const analyticsOptions = {\n actionType: UserAction.Copy,\n entity: EntityType.Glance,\n location: LocationContext.PlayPage\n };\n AnalyticsHelper.logUserAction(analyticsData, analyticsOptions);\n }\n\n function getTags(): Tag[] {\n if (VideoHelper.isInteractive(props.video) || !props.video.tags?.data?.length)\n return null;\n\n return props.video.tags?.data?.filter(tag => tag.tagType === TagType.Pedagogy || tag.tagType === TagType.Skill);\n }\n const tags = getTags();\n\n const ref = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n if (ref.current?.innerText)\n setTextToCopy(ref.current.innerText);\n }, [ref.current?.innerText]);\n\n if (!props.canViewGlance)\n return <></>;\n\n function onClickPoiItem(time: number) {\n props.setStartTime(time);\n }\n\n return (\n <section className='play-page-section'>\n <ScrollbarWrapper hideScrollbar={props.hideScrollbar}>\n <h2 className='h6 mb-2'><Text namespace={namespace} phrase='learningIntention' /></h2>\n \n <div className={`mb-3 ${styles.learningIntention}`}>\n <Tooltip title={getPhrase('copy')} spanHack spanHackClassName={styles.icon}>\n <CopyToClipboard text={textToCopy}>\n <SvgContainer\n className='svg-container me-1 cursor-pointer'\n svgName={cvSvgLibrary.Copy}\n size={SvgContainerSize.Small}\n onClick={logUserAction}\n />\n </CopyToClipboard>\n </Tooltip>\n \n <div\n dangerouslySetInnerHTML={{ __html: learningIntentionMarkdownHTML }}\n className='d-inline'\n ref={ref}\n >\n </div>\n </div>\n\n {!!tags?.length && (\n <div className='mb-1'>\n <TagList\n tags={tags}\n {...TagHelper.getTagActionProps(props.getTagAppLink, props.onClickTag, props.suppressInteractivity)}\n className='mt-2'\n />\n </div>\n )}\n\n {!!props.pointsOfInterest.length && (\n <PointOfInterestList\n pointsOfInterest={props.pointsOfInterest}\n suppressInteractivity={props.suppressInteractivity}\n onClickPoiItem={onClickPoiItem}\n />\n )}\n </ScrollbarWrapper>\n </section>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ThumbnailText } from 'libs/shared/components/thumbnails/thumbnail-text/ThumbnailText';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { FixedWidgetItemProps } from 'libs/shared/components/widgets/items/FixedWidgetItemProps';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { CanFavouriteFunc, FavouriteFunc, InteractiveMetadata, YearGroup } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.interactiveWidgetItemV2';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface InteractiveWidgetItemV2Props extends FixedWidgetItemProps<InteractiveMetadata> {\n imageCdnUrl: string;\n questionsAppLink: Core.AppLink;\n setFavourite?: FavouriteFunc;\n canFavourite?: CanFavouriteFunc;\n yearGroups: YearGroup[];\n isPlugin: boolean;\n showOwner?: boolean;\n}\n\nexport const InteractiveWidgetItemV2 = React.memo(function(props: InteractiveWidgetItemV2Props): JSX.Element {\n const { data: interactive, thumbnailSize, preloadImage } = props;\n\n const questionsAppLink: Core.AppLink = {\n ...props.questionsAppLink,\n args: [props.data.id]\n };\n\n const questionsNumber = interactive._timepoints?.value?.length;\n\n return (\n <div className={`flex-shrink-0 px-1 col-6 col-sm-4`}>\n <VideoThumbnail\n type='static'\n textPosition={ThumbnailTextPosition.Independent}\n video={interactive}\n appLink={props.getAppLink(interactive)}\n imageOptions={{ size: thumbnailSize }}\n preload={preloadImage}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n hideDuration={false}\n imageCdnUrl={props.imageCdnUrl}\n isPlugin={props.isPlugin}\n showOwner={props.showOwner}\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-n1'>\n <AppLink\n appLink={questionsAppLink}\n className='cursor-pointer'\n ariaLabel={`${getPhrase('previewQuestions', { count: questionsNumber, smartCount: questionsNumber })} ${getPhrase('ariaPreview', { name: interactive.name })}`}\n >\n <Text namespace={namespace} phrase='previewQuestions' options={{ count: questionsNumber, smartCount: questionsNumber }}/>\n </AppLink>\n </div>\n </div>\n );\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 { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { CanFavouriteFunc, Clip, FavouriteFunc, Interactive, InteractiveMetadata, 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\nimport { InteractiveWidgetItemV2, InteractiveWidgetItemV2Props } from './InteractiveWidgetItemV2';\n\nconst namespace = 'shared.playPageInteractivesV2';\n\ninterface PlayPageInteractivesProps {\n canViewInteractives: boolean;\n video: Video | Clip;\n interactives: InteractiveMetadata[];\n imageCdnUrl: string;\n analyticsData: HashObject;\n yearGroups: YearGroup[];\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n isPlugin: boolean;\n headingRef?: React.MutableRefObject<Map<PlayPageAnchor, HTMLElement>>;\n}\n\nexport function PlayPageInteractives(props: PlayPageInteractivesProps): JSX.Element {\n if (!props.canViewInteractives || !props.interactives?.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, TextHelper.slugify(props.video.name) ]\n };\n\n return {\n action: Actions.Clips.CLIP_INTERACTIVES,\n application: AppChannels.CLIPS,\n args: [ props.video.id, TextHelper.slugify(props.video.name) ]\n };\n }\n\n const title = LanguageService.getPhrase(namespace, 'interactives', { count: props.interactives.length });\n \n return (\n <section className='play-page-section'\n id={PlayPageAnchor.Interactives}\n ref={el => {\n (el && props.headingRef?.current) && props.headingRef.current.set(PlayPageAnchor.Interactives, el);\n }}\n >\n <FixedWidget<InteractiveWidgetItemV2Props>\n name={title}\n contents={WidgetContents.InteractivesV2}\n collection={props.interactives}\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={InteractiveWidgetItemV2}\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 isPlugin: props.isPlugin,\n showOwner: true\n }}\n analyticsData={props.analyticsData}\n />\n </section>\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 { 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\nimport { ResourceWidgetItemV2, ResourceWidgetItemV2Props } from './ResourceWidgetItemV2';\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 headingRef?: React.MutableRefObject<Map<PlayPageAnchor, HTMLElement>>;\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 const title = LanguageService.getPhrase(namespace, 'resources', { count: resources.length });\n\n if (!resources.length)\n return <></>;\n\n return (\n <section\n id={PlayPageAnchor.Resources}\n className='play-page-section'\n ref={el => {\n (el && props.headingRef?.current) && props.headingRef.current.set(PlayPageAnchor.Resources, el);\n }}\n >\n <FixedWidget<ResourceWidgetItemV2Props>\n name={title}\n contents={WidgetContents.PlayPageResourcesV2}\n collection={resources}\n prefetched\n childComponent={ResourceWidgetItemV2}\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 {\"imageStyle\":\"bYRn8\",\"item\":\"CjuxU\",\"dashboard\":\"IuRN0\",\"playPage\":\"VdJvp\",\"aspectRatio\":\"QK8Jh\",\"outerContainer\":\"eiC_H\",\"innerContainer\":\"huIRg\",\"actions\":\"FsIJm\",\"titleBelow\":\"DpeSr\",\"thumbnailContainer\":\"ZbalL\",\"titleAbove\":\"PwOSX\",\"teacherPack\":\"ZHAEj\",\"text\":\"k3ei6\",\"hoverState\":\"BLrWL\",\"atomGuide\":\"Qz8JE\",\"studentActivity\":\"qNspk\",\"additionalMaterials\":\"R0huw\",\"userUploaded\":\"H_zGf\",\"imageTypeResource\":\"AgeLb\",\"download\":\"DKneu\"};","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 { ImageOptions } from 'libs/shared/utils/ImageHelper';\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\nexport function useCanPreviewResource(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 dynamicRatioImageOptions?: ImageOptions;\n}\n\nResourceTileV2.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 ResourceTileV2(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 dynamicRatioImageOptions={props.dynamicRatioImageOptions}\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' && (\n <div className={`mt-1 ${styles.titleBelow}`}>\n {(\n MasterTypeHelper.isType<Resource>(props.data, MasterType.Resource) &&\n !!props.data?.metadata?.resourceType\n ) && (\n <TitleSubText>\n {ResourceHelper.getResourceTypeName(props.data.metadata.resourceType)}\n </TitleSubText>\n )}\n\n <h3 className='h6 clamp-2'>\n {props.data.name}\n </h3>\n </div>\n )}\n </>\n );\n}\n\nexport interface ResourceWidgetItemV2Props extends ResourceTileProps, FixedWidgetItemProps<Resource | Link> {\n location: 'play-page' | 'dashboard';\n}\n\nexport const ResourceWidgetItemV2 = React.memo(function(props: ResourceWidgetItemV2Props): JSX.Element {\n // Mobile is not allowed to preview\n const canPreview = useCanPreviewResource(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 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 <ResourceTileV2 {...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 <ResourceTileV2 {...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 <ResourceTileV2 {...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 <ResourceTileV2 {...tileProps} />\n </a>\n );\n }\n\n // Theres no url, so don't render an <a>\n return (\n <div className={className}>\n <ResourceTileV2 {...tileProps} />\n </div>\n );\n })()}\n </div>\n );\n});","// extracted by mini-css-extract-plugin\nexport default {\"itemsWrapper\":\"m6mGm\",\"anchorWrapper\":\"QptZj\",\"default\":\"_AZa8\",\"selectedItem\":\"Nuiel\",\"disabled\":\"WIzWJ\",\"floatIcon\":\"ARudn\",\"arrowIcon\":\"tEF5Q\",\"listIcon\":\"Ql2wi\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { ScrollHelper } from 'libs/common/backbone/utils/ScrollHelper';\n\nimport { EntityType, HashObject, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\n\nimport styles from './table-of-contents-list.scss';\n\nexport interface TableOfContentsItem<T=string> {\n name: string;\n id: T;\n tocIndentation?: number;\n}\n\ninterface TableOfContentsProps<T> {\n items: TableOfContentsItem<T>[];\n activeId: string;\n appLink?: Core.AppLink;\n analyticsData?: HashObject;\n setControlledId: (arg: string) => void;\n // set to true if the TOC is controlled by a local state rather than query params\n localState?: boolean;\n getAppLink?: (args: TableOfContentsItem<T>) => Core.AppLink;\n onItemClick?: (args: TableOfContentsItem<T>) => void;\n}\n\nexport function TableOfContentsList<T extends string>(props: TableOfContentsProps<T>): JSX.Element {\n const analyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Widget,\n location: LocationContext.TableOfContents\n };\n\n function onItemSelect(item: TableOfContentsItem<T>) {\n ScrollHelper.preventScrollTop();\n props.setControlledId(item.id);\n \n props.onItemClick?.(item);\n \n setTimeout(() => document.getElementById(item.id)?.focus());\n }\n\n return (\n <div className={`${styles.itemsWrapper}`}>\n {props.items.map((item, idx) => {\n if (props.localState) {\n return (\n <DivButton\n key={item.id}\n className={`${styles.anchorWrapper} ${props.activeId === item.id ? styles.selectedItem : ''}`}\n onClick={() => {\n onItemSelect(item);\n }}\n >\n <div className={`${!props.activeId && idx === 0 ? styles.default : ''} `}>\n {item.name}\n </div>\n </DivButton>\n );\n }\n\n return (\n <AppLink\n key={item.id}\n appLink={props.getAppLink(item)}\n appLinkOptions={{ replace: true }}\n className={`${styles.anchorWrapper} ${props.activeId === item.id ? styles.selectedItem : ''}`}\n onClick={() => {\n onItemSelect(item);\n }}\n analyticsData={{\n ...props.analyticsData,\n id: item.id,\n name: item.name\n }}\n analyticsOptions={analyticsOptions}\n >\n <div className={`${!props.activeId && idx === 0 ? styles.default : ''} ${item.tocIndentation ? 'ms-3' : ''}`}>\n {item.name}\n </div>\n </AppLink>\n );\n })}\n </div>\n );\n}","import React from 'react';\n\nimport { useResizeListener } from 'libs/shared/hooks/UseResizeListener';\n\nexport function useExpandableTextButton() {\n const containerRef = React.useRef<HTMLDivElement>(null);\n\n const memoClientHeight = React.useRef<number>(0);\n\n React.useEffect(() => {\n if (containerRef.current.clientHeight)\n // memo the initial clientHeight, cuz after expand and collapse the clientHeight will change\n memoClientHeight.current = containerRef.current.clientHeight;\n }, []);\n\n const [ showButton, setShowButton ] = React.useState(containerRef.current?.scrollHeight > memoClientHeight.current);\n\n useResizeListener(() => {\n if (containerRef.current.clientHeight) {\n // update memo value on resize\n memoClientHeight.current = containerRef.current.clientHeight;\n setShowButton(containerRef.current?.scrollHeight > memoClientHeight.current);\n }\n });\n\n React.useEffect(() => {\n if (containerRef.current?.scrollHeight) {\n setShowButton(containerRef.current?.scrollHeight > memoClientHeight.current);\n }\n }, [ containerRef.current?.scrollHeight, memoClientHeight.current ]);\n\n return { containerRef, showButton };\n}","import React from 'react';\n\ntype TableOfContentsActiveOption = {\n setActiveId: (id: string) => void;\n headingElements: Element[];\n controlledId?: string;\n setControlledId?: (arg: string) => void;\n}\n\nlet timer: number;\n\nexport const useTableOfContentsActiveHeading = (\n { setActiveId, headingElements, controlledId, setControlledId }: TableOfContentsActiveOption\n) => {\n const scrollPositionRef = React.useRef(0);\n\n React.useEffect(() => {\n const callback = (headings: IntersectionObserverEntry[]) => {\n headings.forEach(heading => {\n if (controlledId) {\n setActiveId(controlledId);\n // can use scrollEnd event when the new event type is supported\n timer = window.setTimeout(() => {\n setControlledId('');\n }, 800);\n return;\n }\n if (heading.isIntersecting) {\n setActiveId(heading.target.id);\n scrollPositionRef.current = window.scrollY;\n } else {\n const scrollDistance = scrollPositionRef.current - window.scrollY;\n const isScrollingUp = scrollDistance > 0;\n const curIndex = headingElements.findIndex(h => h.id === heading.target.id);\n const prevHeading = headingElements[curIndex - 1];\n if (isScrollingUp && prevHeading?.id) {\n setActiveId(prevHeading?.id);\n }\n }\n });\n };\n\n const observer = new IntersectionObserver(callback, {\n // rootMargin top: same as the cv-nav-height\n rootMargin: '-67px 0px -80% 0px'\n });\n\n headingElements.forEach(element => observer.observe(element));\n\n return () => {\n timer && window.clearTimeout(timer);\n observer.disconnect();\n };\n }, [ setActiveId, headingElements.length, controlledId ]);\n};\n\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};","// extracted by mini-css-extract-plugin\nexport default {\"container\":\"qA4yj\",\"showInSide\":\"kd9hB\",\"aside\":\"j28IY\",\"collapse\":\"sFoPk\",\"iconContainer\":\"PYyBV\",\"arrowIcon\":\"MTodB\",\"listIcon\":\"W76p8\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { PortalHelper } from 'libs/common/react/utils/PortalHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, HashObject, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { TableOfContentsList } from 'libs/shared/components/table-of-contents-list/TableOfContentsList';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { ContextService } from 'libs/shared/services/ContextService';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { PLAY_PAGE_TOC_PORTAL_ID } from 'shared/layouts/teacher-layout/TeacherLayoutComponent';\n\nimport styles from './table-of-contents.scss';\n\nconst namespace = 'shared.playPage';\n\nexport interface TableOfContentsItem {\n name: string;\n id: PlayPageAnchor;\n}\n\ninterface TableOfContentsProps {\n items: TableOfContentsItem[];\n activeId: string;\n appLink?: Core.AppLink;\n analyticsData?: HashObject;\n setControlledId: (arg: string) => void;\n isExpanded: boolean;\n setIsExpanded: (arg: boolean) => void;\n showInSide: boolean;\n}\n\nfunction TableOfContentsIcon(props: TableOfContentsProps) {\n function logUserAction() {\n const analyticsOptions = {\n actionType: !props.isExpanded ? UserAction.Open : UserAction.Hide,\n entity: EntityType.TableOfContents,\n location: LocationContext.PlayPage\n };\n\n AnalyticsHelper.logUserAction(props.analyticsData, analyticsOptions);\n }\n\n function onClickIcon() {\n props.setIsExpanded(!props.isExpanded);\n logUserAction();\n }\n\n return (\n <div className='d-flex justify-content-end'>\n <div className={styles.container}>\n <div className={`${styles.iconContainer}`} >\n <IconButton\n className={`btn btn-outline-dark ${styles.listIcon}`}\n svgName={cvSvgLibrary.TableOfContents}\n onClick={onClickIcon}\n />\n \n <IconButton\n className={`btn btn-outline-dark ${styles.arrowIcon}`}\n svgName={!props.isExpanded ? cvSvgLibrary.ExpandLeft : cvSvgLibrary.CollapseRight}\n onClick={onClickIcon}\n />\n </div>\n </div>\n </div>\n );\n}\n\nfunction TableOfContents(props: TableOfContentsProps) {\n function logUserAction() {\n const analyticsOptions = {\n actionType: UserAction.Hide,\n entity: EntityType.TableOfContents,\n location: LocationContext.PlayPage\n };\n\n AnalyticsHelper.logUserAction(props.analyticsData, analyticsOptions);\n }\n\n function getAppLink(item: any): Core.AppLink {\n const currentAppLink = ContextService.getCurrentRoute().appLink;\n\n const params: HashObject = currentAppLink.params\n ? { ...(currentAppLink.params as HashObject) }\n : {};\n\n params.tocId = item.id;\n\n return {\n ...currentAppLink,\n params\n };\n }\n\n function onClickTableOfContentsHeading() {\n if (!props.showInSide) {\n // in mobile version, collapse once user hit the TOC item\n props.setIsExpanded(false);\n }\n }\n\n return (\n <div className={!props.showInSide ? 'd-inline-flex gap-1' : `col col-2 ps-4`}>\n <aside className={`${styles.aside} position-relative ${!props.showInSide ? 'px-3 pt-3 pb-2 border border-dark rounded-1 bg-white' : 'pe-1 pt-1 '}`}>\n <div className={`${styles.container} ${!props.showInSide ? '' : styles.showInSide}`}>\n {props.showInSide && (\n <IconButton\n className={`btn position-absolute ${styles.collapse}`}\n svgName={cvSvgLibrary.CollapseRight}\n onClick={() => {\n props.setIsExpanded(false);\n logUserAction();\n }}\n />\n )}\n <h2 className='h5'><Text namespace={namespace} phrase='tocHeading' /></h2>\n \n <TableOfContentsList\n items={props.items}\n activeId={props.activeId}\n getAppLink={getAppLink}\n setControlledId={props.setControlledId}\n analyticsData={props.analyticsData}\n onItemClick={() => onClickTableOfContentsHeading()}\n />\n </div>\n \n </aside>\n {/* in mobile version, always show icon on the right */}\n {!props.showInSide && <TableOfContentsIcon {...props}/>}\n </div>\n );\n}\n\nexport function TableOfContentsContainer(props: TableOfContentsProps): JSX.Element {\n return (\n <>\n {/* web version show table of contents next to player */}\n {props.isExpanded && props.showInSide && <TableOfContents {...props}/>}\n \n {/* web version show icon in portal (RHS of window) */}\n {PortalHelper.renderInPortalIfExists(\n !props.isExpanded && <TableOfContentsIcon {...props}/>,\n document.getElementById(PLAY_PAGE_TOC_PORTAL_ID)\n )}\n\n {/* mobile version show in portal */}\n {PortalHelper.renderInPortalIfExists(\n !props.showInSide && props.isExpanded && <TableOfContents {...props}/>,\n document.getElementById(PLAY_PAGE_TOC_PORTAL_ID)\n )}\n </>\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Clip, InteractiveMetadata, Link, Resource } from 'libs/shared/interfaces';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\n\ninterface SectionHeadingOptions {\n clips: Clip[];\n interactives: InteractiveMetadata[];\n resources: Resource[] | Link[];\n isPlayClipPage?: boolean;\n}\n\nconst namespace = 'shared.play';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const PlayPageUtils = {\n getSectionHeading(id: PlayPageAnchor, options: SectionHeadingOptions) {\n switch (id) {\n case PlayPageAnchor.Resources:\n return getPhrase('resourcesHeading', { count: options.resources.length });\n\n case PlayPageAnchor.Clips:\n if (options.isPlayClipPage)\n return getPhrase('otherClipsHeading', { count: options.clips.length - 1 });\n return getPhrase('clipsHeading', { count: options.clips.length });\n\n case PlayPageAnchor.Interactives:\n return getPhrase('interactivesHeading', { count: options.interactives.length });\n\n case PlayPageAnchor.Video:\n return getPhrase('videoHeading');\n\n case PlayPageAnchor.VideoDetails:\n return getPhrase('videoDetailsHeading');\n\n case PlayPageAnchor.RelatedVideos:\n return getPhrase('upNextHeading');\n\n case PlayPageAnchor.CurriculumLinks:\n return getPhrase('curriculumLinksHeading');\n\n case PlayPageAnchor.ClippedFrom:\n return getPhrase('clippedFromHeading');\n\n default:\n return '';\n }\n }\n\n};","import React from 'react';\n\nimport { LocalStorageHelper } from 'libs/common/backbone/utils/LocalStorageHelper';\n\nimport { useShouldShowSideTableOfContents } from 'shared/views/play/v2/hooks/useShouldShowTableOfContents';\n\nconst PLAY_PAGE_TOC_EXPANDED = 'play-page-toc-expanded';\n\nexport function usePlayPageTableOfContent(tocId: string) {\n const showInSide = useShouldShowSideTableOfContents();\n\n const localValue = LocalStorageHelper.get(PLAY_PAGE_TOC_EXPANDED) !== false;\n const tocDefaultExpanded = !showInSide ? false : localValue;\n\n const [ controlledId, setControlledId ] = React.useState(tocId || '');\n const [ tableOfContentsActiveId, setTableOfContentsActiveId ] = React.useState<string>('');\n const [ tableOfContentsExpanded, setTableOfContentsExpanded ] = React.useState(tocDefaultExpanded);\n \n React.useEffect(() => {\n if (!showInSide) {\n // automatically collpase on mobile version\n setTableOfContentsExpanded(false);\n } else {\n setTableOfContentsExpanded(localValue);\n }\n }, [showInSide]);\n\n function onToggleTableOfContents() {\n setTableOfContentsExpanded(!tableOfContentsExpanded);\n LocalStorageHelper.set(PLAY_PAGE_TOC_EXPANDED, !tableOfContentsExpanded);\n }\n\n return {\n controlledId,\n setControlledId,\n tableOfContentsExpanded,\n tableOfContentsActiveId,\n setTableOfContentsActiveId,\n onToggleTableOfContents\n };\n}","import { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\n\nexport const PLAY_PAGE_SECTIONS_ORDER = [\n PlayPageAnchor.Video,\n PlayPageAnchor.CurriculumLinks,\n PlayPageAnchor.Resources,\n PlayPageAnchor.Interactives,\n PlayPageAnchor.Clips,\n PlayPageAnchor.VideoDetails,\n PlayPageAnchor.ClippedFrom,\n PlayPageAnchor.RelatedVideos\n];\n\nexport const PLAY_PAGE_SECTIONS_ORDER_NO_GLANCE = [\n PlayPageAnchor.Video,\n PlayPageAnchor.VideoDetails,\n PlayPageAnchor.CurriculumLinks,\n PlayPageAnchor.Resources,\n PlayPageAnchor.Interactives,\n PlayPageAnchor.Clips,\n PlayPageAnchor.ClippedFrom,\n PlayPageAnchor.RelatedVideos\n];","import React from 'react';\n\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\n\nimport { PLAY_PAGE_SECTIONS_ORDER, PLAY_PAGE_SECTIONS_ORDER_NO_GLANCE } from 'shared/constants/PlayPageSectionsOrder';\n\nexport function useSectionHeadings(hasGlance: boolean) {\n const headingRef = React.useRef<Map<PlayPageAnchor, HTMLElement>>(new Map());\n const headingElements = (hasGlance ? PLAY_PAGE_SECTIONS_ORDER : PLAY_PAGE_SECTIONS_ORDER_NO_GLANCE).map(id => {\n return headingRef.current.get(id);\n }).filter(Boolean);\n\n return { headingRef, headingElements };\n}","import { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\n\n// returns boolean value for if we should show the TOC on the side\nexport function useShouldShowSideTableOfContents(): boolean {\n const breakpoints = useBreakpoints();\n const shouldShowSideTableOfContents = breakpoints.lg || breakpoints.xl || breakpoints.xxl;\n return shouldShowSideTableOfContents;\n}","// extracted by mini-css-extract-plugin\nexport default {\"learningIntention\":\"MHM6O\",\"highlightPoi\":\"U7Q6x\",\"icon\":\"H1xbT\"};"],"names":["PortalHelper","renderInPortalIfExists","component","portalContainer","createPortal","getPhrase","BreadcrumbItem","props","ref","breadcrumb","name","appLink","active","withBackIcon","className","svgName","size","S","Breadcrumbs","breadcrumbs","isMobile","length","collapse","setCollapse","shouldFocus","setShouldFocus","expandRef","characterLength","reduce","prev","next","current","focus","first","second","secondLast","last","rest","slice","onClick","map","idx","key","PartialBreadcrumbs","numItems","style","height","width","dangerouslySetInnerHTML","__html","namespace","CONTAINER_HEIGHT","CopyrightDisclaimer","isHovering","Text","phrase","Overlay","target","show","placement","overflowPlacement","document","documentElement","clientHeight","getBoundingClientRect","bottom","ClipWidgetItemV2","clip","data","thumbnailSize","preloadImage","getAppLink","mergedAudience","subjectPresentationAudiences","audiences","VideoThumbnail","type","textPosition","ThumbnailTextPosition","video","imageOptions","preload","analyticsData","analyticsOptions","setFavourite","canFavourite","imageCdnUrl","audience","hideDuration","isPlugin","showOwner","ThumbnailText","PlayPageClips","canViewClips","clips","parentIsVideo","VideoHelper","title","LanguageService","count","id","PlayPageAnchor","el","headingRef","set","contents","WidgetContents","collection","prefetched","getChildAppLink","application","action","args","TextHelper","childComponent","extraChildComponentProps","yearGroups","VideoDescription","expanded","setExpanded","useExpandableTextButton","containerRef","showButton","DivButton","LinkifyHelper","description","nl2br","CommaList","label","items","commaSeperated","i","join","DetailsSection","parentVideo","productionYear","options","year","smartCount","productionCompanies","distributors","producers","directors","dateBroadcast","date","DateHelper","channel","currentUser","isAuthenticated","dateCreated","_isClickViewCurated","value","showDateUploaded","VideoDetailsWithScrollbarV2","maxHeight","showDescription","showDetails","tags","hideTags","filter","tag","tagType","TagType","getTags","showHeading","autoHeight","autoHeightMax","ImmersiveReader","text","onLaunch","onLaunchImmersiveReader","onExit","onExitImmersiveReader","location","entity","actionType","descriptor","TagList","TagHelper","getTagAppLink","suppressInteractivity","POI_LINK_LINE","useLearningIntentionMarkdown","hasGlanceData","useState","markdownHTML","setMarkdownHTML","useEffect","content","glance","learningIntention","replace","format","useHighlightPointOfInterest","pointOfInterest","shouldHighlight","useRef","onGlancePoiMouseOver","onGlancePoiMouseLeave","hoveredPoi","toString","classList","add","remove","addEventListener","removeEventListener","PointOfInterest","timeStamp","DurationHelper","poi","startTime","wideBadge","onClickPoiItem","PointOfInterestList","sortedPointsOfInterest","pointsOfInterest","sort","a","b","hasTimePointOverHours","some","SCROLL_HEIGHT_MAX","ScrollbarWrapper","hideScrollbar","children","VideoAtAGlanceV2","learningIntentionMarkdownHTML","canViewGlance","textToCopy","setTextToCopy","innerText","Tooltip","spanHack","spanHackClassName","SvgContainer","videoId","videoName","AnalyticsHelper","onClickTag","time","setStartTime","InteractiveWidgetItemV2","interactive","questionsAppLink","questionsNumber","_timepoints","ariaLabel","PlayPageInteractives","canViewInteractives","interactives","PlayPageResources","hasPermissions","resources","isLearner","links","filteredResources","r","includes","metadata","resourceType","getResources","imageErrorFallbackUrl","resourceThumbnailFallbackUrl","actionBehaviour","canViewResources","titlePosition","onClickDownload","resource","workflowPhase","SignUp","useCanPreviewResource","breakpoints","useBreakpoints","xs","sm","ResourceFileType","url","pdf","ResourceTileV2","isResource","MasterTypeHelper","MasterType","baseClass","getColour","theme","containerClass","applyHoverState","getInnerContainerClass","thumbnailContainerClass","ResourceThumbnail","dynamicRatioImageOptions","e","preventDefault","stopPropagation","hideTypeBadge","TypeBadge","typeId","TitleSubText","ResourceHelper","defaultProps","ResourceWidgetItemV2","canPreview","logAction","tileProps","SeoConstants","href","AppLink","TableOfContentsList","onItemSelect","item","ScrollHelper","setControlledId","onItemClick","setTimeout","getElementById","localState","activeId","appLinkOptions","tocIndentation","memoClientHeight","scrollHeight","setShowButton","timer","useTableOfContentsActiveHeading","setActiveId","headingElements","controlledId","scrollPositionRef","observer","IntersectionObserver","headings","forEach","heading","window","isIntersecting","scrollY","isScrollingUp","curIndex","findIndex","h","prevHeading","rootMargin","element","observe","clearTimeout","disconnect","downloadRef","DownloadHelper","getVideoDownloadUrl","downloadProxyUrl","token","downloadResource","iframe","createElement","body","appendChild","display","src","TableOfContentsIcon","onClickIcon","setIsExpanded","isExpanded","IconButton","TableOfContents","showInSide","currentAppLink","ContextService","params","tocId","TableOfContentsContainer","PlayPageUtils","getSectionHeading","isPlayClipPage","PLAY_PAGE_TOC_EXPANDED","usePlayPageTableOfContent","localValue","tocDefaultExpanded","tableOfContentsActiveId","setTableOfContentsActiveId","tableOfContentsExpanded","setTableOfContentsExpanded","onToggleTableOfContents","PLAY_PAGE_SECTIONS_ORDER","PLAY_PAGE_SECTIONS_ORDER_NO_GLANCE","useSectionHeadings","hasGlance","Map","get","Boolean","useShouldShowSideTableOfContents","lg","xl","xxl"],"sourceRoot":""}
|