@clickview/lite 0.103.0-rc.0 → 0.103.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/dist/.vite/manifest.json +447 -447
  2. package/dist/bundles.json +1 -1
  3. package/dist/en.json +1 -1
  4. package/dist/scripts/{BXosUOUS.chunk.js → 14z5Gy8L.chunk.js} +2 -2
  5. package/dist/scripts/{BXosUOUS.chunk.js.map → 14z5Gy8L.chunk.js.map} +1 -1
  6. package/dist/scripts/{BqkK_0Jk2.chunk.js → B4AZn1xm2.chunk.js} +2 -2
  7. package/dist/scripts/{BqkK_0Jk2.chunk.js.map → B4AZn1xm2.chunk.js.map} +1 -1
  8. package/dist/scripts/{_wBbQ-0z2.chunk.js → BBndy2td2.chunk.js} +2 -2
  9. package/dist/scripts/{_wBbQ-0z2.chunk.js.map → BBndy2td2.chunk.js.map} +1 -1
  10. package/dist/scripts/{DBdkd4Ag2.chunk.js → BFH_tnSb2.chunk.js} +3 -3
  11. package/dist/scripts/{DBdkd4Ag2.chunk.js.map → BFH_tnSb2.chunk.js.map} +1 -1
  12. package/dist/scripts/{BhgNNQjX.chunk.js → BOQck-Qs.chunk.js} +2 -2
  13. package/dist/scripts/{BhgNNQjX.chunk.js.map → BOQck-Qs.chunk.js.map} +1 -1
  14. package/dist/scripts/{_eRiDJm1.chunk.js → Ba4uGz_V.chunk.js} +2 -2
  15. package/dist/scripts/{_eRiDJm1.chunk.js.map → Ba4uGz_V.chunk.js.map} +1 -1
  16. package/dist/scripts/{Bx6qaXLc.chunk.js → Bdbe2u0R.chunk.js} +2 -2
  17. package/dist/scripts/{Bx6qaXLc.chunk.js.map → Bdbe2u0R.chunk.js.map} +1 -1
  18. package/dist/scripts/{C4CuJJXy2.chunk.js → BeW5XQTb2.chunk.js} +2 -2
  19. package/dist/scripts/{C4CuJJXy2.chunk.js.map → BeW5XQTb2.chunk.js.map} +1 -1
  20. package/dist/scripts/{syYCrnUX.chunk.js → BgoVmaXQ.chunk.js} +2 -2
  21. package/dist/scripts/{syYCrnUX.chunk.js.map → BgoVmaXQ.chunk.js.map} +1 -1
  22. package/dist/scripts/{B5DWwtp0.chunk.js → BjA9XV5y.chunk.js} +2 -2
  23. package/dist/scripts/{B5DWwtp0.chunk.js.map → BjA9XV5y.chunk.js.map} +1 -1
  24. package/dist/scripts/{BYMMqtaN.chunk.js → BqdHoEFM.chunk.js} +2 -2
  25. package/dist/scripts/{BYMMqtaN.chunk.js.map → BqdHoEFM.chunk.js.map} +1 -1
  26. package/dist/scripts/{BIvmcqND2.chunk.js → CCUznsdX2.chunk.js} +2 -2
  27. package/dist/scripts/{BIvmcqND2.chunk.js.map → CCUznsdX2.chunk.js.map} +1 -1
  28. package/dist/scripts/{BsNCh4UD.chunk.js → CFqL2Hm5.chunk.js} +3 -3
  29. package/dist/scripts/{BsNCh4UD.chunk.js.map → CFqL2Hm5.chunk.js.map} +1 -1
  30. package/dist/scripts/{BE8Ze3Fa2.chunk.js → CHmbcl4Y2.chunk.js} +2 -2
  31. package/dist/scripts/{BE8Ze3Fa2.chunk.js.map → CHmbcl4Y2.chunk.js.map} +1 -1
  32. package/dist/scripts/{Dp8z_udC.chunk.js → CIzlhCeS.chunk.js} +2 -2
  33. package/dist/scripts/{Dp8z_udC.chunk.js.map → CIzlhCeS.chunk.js.map} +1 -1
  34. package/dist/scripts/{CO8EIpI8.chunk.js → CXUrMkZu.chunk.js} +2 -2
  35. package/dist/scripts/{CO8EIpI8.chunk.js.map → CXUrMkZu.chunk.js.map} +1 -1
  36. package/dist/scripts/{DLqG-wwP.chunk.js → CYrelpYt.chunk.js} +2 -2
  37. package/dist/scripts/{DLqG-wwP.chunk.js.map → CYrelpYt.chunk.js.map} +1 -1
  38. package/dist/scripts/{wmwWqIeA.chunk.js → CfrfHGSh.chunk.js} +2 -2
  39. package/dist/scripts/{wmwWqIeA.chunk.js.map → CfrfHGSh.chunk.js.map} +1 -1
  40. package/dist/scripts/{B5M-3wpn.chunk.js → CjwT65ug.chunk.js} +2 -2
  41. package/dist/scripts/{B5M-3wpn.chunk.js.map → CjwT65ug.chunk.js.map} +1 -1
  42. package/dist/scripts/{B-aaIChO2.chunk.js → CsCjBSq62.chunk.js} +2 -2
  43. package/dist/scripts/{B-aaIChO2.chunk.js.map → CsCjBSq62.chunk.js.map} +1 -1
  44. package/dist/scripts/{ygwO7HPs2.chunk.js → DIaT_eGy2.chunk.js} +2 -2
  45. package/dist/scripts/{ygwO7HPs2.chunk.js.map → DIaT_eGy2.chunk.js.map} +1 -1
  46. package/dist/scripts/{DXRsxBJw.chunk.js → DTliAJ8L.chunk.js} +2 -2
  47. package/dist/scripts/{DXRsxBJw.chunk.js.map → DTliAJ8L.chunk.js.map} +1 -1
  48. package/dist/scripts/{DE5jvfAx2.chunk.js → D_t70KgV2.chunk.js} +2 -2
  49. package/dist/scripts/{DE5jvfAx2.chunk.js.map → D_t70KgV2.chunk.js.map} +1 -1
  50. package/dist/scripts/{Dc01PBv1.chunk.js → Dn2EPvQj.chunk.js} +2 -2
  51. package/dist/scripts/{Dc01PBv1.chunk.js.map → Dn2EPvQj.chunk.js.map} +1 -1
  52. package/dist/scripts/{RuVwpX36.chunk.js → Drh1bb9z.chunk.js} +2 -2
  53. package/dist/scripts/{RuVwpX36.chunk.js.map → Drh1bb9z.chunk.js.map} +1 -1
  54. package/dist/scripts/{YzhKditE.chunk.js → ESLgHTNq.chunk.js} +2 -2
  55. package/dist/scripts/{YzhKditE.chunk.js.map → ESLgHTNq.chunk.js.map} +1 -1
  56. package/dist/scripts/{DfSzsD3P.chunk.js → FysETOFv.chunk.js} +2 -2
  57. package/dist/scripts/{DfSzsD3P.chunk.js.map → FysETOFv.chunk.js.map} +1 -1
  58. package/dist/scripts/QVwuOts3.chunk.js +12 -0
  59. package/dist/scripts/QVwuOts3.chunk.js.map +1 -0
  60. package/dist/scripts/{OmYpHs7g.chunk.js → _Cm5O72d.chunk.js} +3 -3
  61. package/dist/scripts/{OmYpHs7g.chunk.js.map → _Cm5O72d.chunk.js.map} +1 -1
  62. package/dist/scripts/{app-BzCWmnrr.js → app-BHlllGhO.js} +4 -4
  63. package/dist/scripts/{app-BzCWmnrr.js.map → app-BHlllGhO.js.map} +1 -1
  64. package/dist/scripts/{C46080Xd.chunk.js → dxqgnrOi.chunk.js} +2 -2
  65. package/dist/scripts/{C46080Xd.chunk.js.map → dxqgnrOi.chunk.js.map} +1 -1
  66. package/dist/scripts/{BCTM3KG42.chunk.js → kLCNzxrH2.chunk.js} +2 -2
  67. package/dist/scripts/{BCTM3KG42.chunk.js.map → kLCNzxrH2.chunk.js.map} +1 -1
  68. package/dist/scripts/{CfVIZBcI2.chunk.js → wpRpI9h02.chunk.js} +2 -2
  69. package/dist/scripts/{CfVIZBcI2.chunk.js.map → wpRpI9h02.chunk.js.map} +1 -1
  70. package/package.json +1 -1
  71. package/dist/scripts/QrUfkwZX.chunk.js +0 -12
  72. package/dist/scripts/QrUfkwZX.chunk.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"CfVIZBcI2.chunk.js","names":[],"sources":["../../src/shared/views/play/hooks/useShouldShowTableOfContents.ts","../../../../libs/shared/src/components/copyright-disclaimer/copyright-disclaimer.module.scss","../../../../libs/shared/src/components/copyright-disclaimer/CopyrightDisclaimer.tsx","../../../../libs/shared/src/components/play-page/details/video-description/VideoDescription.tsx","../../../../libs/shared/src/components/play-page/details/video-details.module.scss","../../../../libs/shared/src/components/play-page/details/VideoDetailsV2.tsx","../../../../libs/common/src/react/hooks/UseEventsServiceSubscribe.ts","../../../../libs/shared/src/components/play-page/glance/video-at-a-glance.module.scss","../../../../libs/shared/src/components/play-page/glance/VideoAtAGlanceUtilsV2.ts","../../../../libs/shared/src/components/play-page/glance/points-of-interest-list/points-of-interest-list.module.scss","../../../../libs/shared/src/components/play-page/glance/points-of-interest-list/PointsOfInterestList.tsx","../../../../libs/shared/src/components/play-page/glance/VideoAtAGlanceV2.tsx","../../../../libs/shared/src/components/play-page/resources-widget/PlayPageResources.tsx","../../../../libs/shared/src/components/play-page/clips-widget/ClipWidgetItemV2.tsx","../../src/shared/components/play-page/components/play-page-clips/PlayPageClips.tsx","../../src/shared/components/play-page/components/play-page-interactives/PlayPageInteractives.tsx","../../../../libs/shared/src/images/svg/arrows/CollapseRightSvg.tsx","../../../../libs/shared/src/images/svg/arrows/ExpandLeftSvg.tsx","../../src/shared/components/play-page/components/table-of-contents/table-of-contents.module.scss","../../src/shared/components/play-page/components/table-of-contents/TableOfContents.tsx","../../src/shared/components/play-page/components/title-and-actions/title-and-actions.module.scss","../../src/shared/components/play-page/components/title-and-actions/PlayPageTitleAndActions.tsx","../../src/shared/components/player-placeholder/player-placeholder.module.scss","../../src/shared/components/player-placeholder/PlayerPlaceholder.tsx","../../src/shared/views/play/components/play-page/hooks/useResourcePopup.ts","../../src/shared/views/play/components/play-page/play-page.module.scss","../../src/shared/views/play/components/play-page/PlayPageUtils.ts","../../src/shared/views/play/hooks/usePlayPageTableOfContent.ts","../../../../libs/shared/src/utils/ObservableTypesHelper.ts","../../src/shared/constants/PlayPageSectionsOrder.ts","../../src/shared/views/play/hooks/useSectionHeadings.ts","../../src/shared/views/play/hooks/useTheatreStyle.ts","../../src/shared/views/play/PlayPageUtil.tsx"],"sourcesContent":["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}\n",":local {\n .copyrightDisclaimer {\n color: $gray-500;\n }\n .overlayContainer {\n z-index: 1100;\n width: 31.25rem;\n }\n}","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.module.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 phraseClassName?: 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} ${props.phraseClassName ?? '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}\n","import React from 'react';\n\nimport { LinkifyHelper } from 'libs/common/react/utils/LinkifyHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { ExpandableText } from 'libs/shared/components/expandable-text/ExpandableText';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\ninterface VideoDescriptionProps {\n video: VideoTypes;\n}\n\nexport function VideoDescription(props: VideoDescriptionProps): React.ReactElement {\n return (\n <ExpandableText lines={12}>\n {() => (\n <p\n className='mb-0'\n dangerouslySetInnerHTML={{\n __html: TextHelper.sanitize(LinkifyHelper.linkifyText(props.video.description, { nl2br: true }))\n }}\n />\n )}\n </ExpandableText>\n );\n}\n",":local {\n @media (min-width: #{map-get($grid-breakpoints, md)}) {\n .descriptionBorder {\n border-right: 1px solid $gray-300;\n }\n }\n}","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 { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Breadcrumb, Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\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/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 { WidgetHeader } from 'libs/shared/components/widgets/curated-widgets/components/header/WidgetHeader';\nimport { MINIMUM_GLANCE_HEIGHT } from 'libs/shared/constants/MinimumGlanceHeight';\nimport { MasterObjectTypes } from 'libs/shared/enums/MasterObjectTypes';\nimport { TagType } from 'libs/shared/enums/TagType';\nimport { BaseObject, BasePaginatedCollection, Category, Company, CurrentUser, Library, PartnerProfile, Person, 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.module.scss';\n\nconst namespace = 'shared.videoDetailsV2';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface CommaListProps<T extends BaseObject> {\n label: string;\n items: BasePaginatedCollection<T>;\n getItemAppLink?: (item: T) => Core.AppLink;\n className?: string;\n}\n\nfunction CommaList<T extends BaseObject>(props: CommaListProps<T>): 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 if (typeof props.getItemAppLink !== 'function') {\n const commaSeperated = items.data.map(i => i.name?.trim()).join(', ');\n return (\n <div className={className}>{label}: {commaSeperated}</div>\n );\n }\n\n return (\n <div className={className}>\n <span>{label}: </span>\n {items.data.map((item, index) => (\n <React.Fragment key={item.id}>\n <AppLink key={item.id} appLink={props.getItemAppLink(item)}>\n {item.name?.trim()}\n </AppLink>\n {index < items.data.length - 1 && <span>, </span>}\n </React.Fragment>\n ))}\n </div>\n );\n}\n\ninterface LibraryCategoryPair {\n library: Library;\n category: Category;\n}\n\nfunction getCustomLibraryCategoryPairs(video: VideoTypes): LibraryCategoryPair[] {\n const categories = video.categories?.data;\n if (!categories?.length)\n return [];\n\n return categories.filter(category => category.libraries?.data?.[0]?.type === MasterObjectTypes.CustomLibrary)\n .map(category => ({ library: category.libraries?.data?.[0], category }));\n}\n\ninterface CreateLibraryBreadcrumbsOptions {\n pair: LibraryCategoryPair;\n getLibraryAppLink: (library: Library) => Core.AppLink;\n getFolderAppLink: (library: Library, folder: Category) => Core.AppLink;\n}\n\nfunction createLibraryBreadcrumbs(options: CreateLibraryBreadcrumbsOptions): Breadcrumb[] {\n const breadcrumbs: Breadcrumb[] = [\n {\n name: options.pair.library.name,\n appLink: options.getLibraryAppLink?.(options.pair.library)\n },\n { name: '...' },\n {\n name: options.pair.category.name,\n appLink: options.getFolderAppLink?.(options.pair.library, options.pair.category)\n }\n ];\n\n return breadcrumbs;\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 const parentVideo = VideoHelper.getParentVideo(video);\n const libraryPairs = getCustomLibraryCategoryPairs(video);\n\n function getPartnerProfileAppLink(company: Company) {\n if (!company.partnerProfiles || !company.partnerProfiles?.data?.length)\n return;\n\n if (company.partnerProfiles?.count > 1 && typeof props.getPartnerDashboardHubAppLink === 'function')\n return props.getPartnerDashboardHubAppLink(company);\n\n if (typeof props.getPartnerProfileAppLink === 'function')\n return props.getPartnerProfileAppLink(company.partnerProfiles?.data?.[0]);\n\n return;\n }\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<Company>\n label={getPhrase('productionCompanies', { smartCount: parentVideo.productionCompanies?.data?.length })}\n items={parentVideo.productionCompanies}\n getItemAppLink={getPartnerProfileAppLink}\n className='mb-1'\n />\n <CommaList<Company>\n label={getPhrase('distributors', { smartCount: parentVideo.distributors?.data?.length })}\n items={parentVideo.distributors}\n getItemAppLink={getPartnerProfileAppLink}\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 {VideoHelper.canViewUploadDate(props.video) && (\n <div className='mb-1'>\n <Text phrase='dateUploaded' options={{ date: DateHelper.format(video.dateCreated, 'DD/MM/YYYY') }} />\n </div>\n )}\n {!!(libraryPairs.length && props.getLibraryAppLink && props.getFolderAppLink) && (\n <div className='mb-1'>\n <div>{getPhrase('libraries', { smartCount: libraryPairs.length })}:</div>\n {libraryPairs.map((pair, index) => (\n <div key={index}>\n <Breadcrumbs\n breadcrumbs={createLibraryBreadcrumbs({\n pair,\n getLibraryAppLink: props.getLibraryAppLink,\n getFolderAppLink: props.getFolderAppLink\n })}\n linkClassName='text-info'\n />\n </div>\n ))}\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 getPartnerProfileAppLink?: (partnerProfile: PartnerProfile) => Core.AppLink;\n getPartnerDashboardHubAppLink?: (company: Company | Person) => Core.AppLink;\n getLibraryAppLink?: (library: Library) => Core.AppLink;\n getFolderAppLink?: (library: Library, folder: Category) => Core.AppLink;\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 VideoHelper.canViewUploadDate(props.video)\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 && <WidgetHeader name={getPhrase('heading')} />}\n <div className='rounded border p-3 position-relative'>\n <Scrollbars autoHeight autoHeightMax={maxHeight} hideTracksWhenNotNeeded>\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) && (\n <CopyrightDisclaimer\n placement='bottom-start'\n className='d-flex justify-content-start mt-2'\n phraseClassName='mb-0'\n overflowPlacement='top-start'\n />\n )}\n\n </Scrollbars>\n </div>\n </section>\n </LanguageNamespaceContext.Provider>\n );\n}\n","import { useEffect } from 'react';\n\nimport { EventsService } from 'libs/common/react/services/EventsService';\n\n/**\n * \n * @param event the event to subscribe to\n * @param callback the callback function\n * @param once whether to subscribe once\n * @param shouldSubscribe conditionally determine whether to subscribe to events\n * @returns unsubscribe function\n */\nexport function useEventsServiceSubscribe(\n event: string,\n callback: (...args: any[]) => void,\n once?: boolean,\n shouldSubscribe?: boolean\n): () => void {\n const unsubscribe = () => {\n EventsService.unsubscribe(event, callback);\n };\n\n useEffect(() => {\n if (!shouldSubscribe)\n return;\n\n once ? EventsService.subscribeOnce(event, callback) : EventsService.subscribe(event, callback);\n\n return () => {\n unsubscribe();\n };\n }, []);\n\n return unsubscribe;\n}\n",":local{\n .learningIntention p:last-child {\n margin-bottom: -1rem !important; //offset last p element margin \n }\n\n .learningIntention p:not(:last-child) {\n margin-bottom: 0.5rem !important; \n }\n\n .highlightPoi {\n text-decoration: underline;\n }\n\n .icon {\n float:left;\n clear:both;\n }\n}","import { MutableRefObject, useEffect, useRef, useState } from 'react';\nimport { 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.module.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, { async: false });\n}\n\nexport function useLearningIntentionMarkdown(\n video: Video,\n hasGlanceData?: boolean\n): string {\n const [ markdownHTML, setMarkdownHTML ] = useState('');\n\n useEffect(() => {\n if (!hasGlanceData || !video.glance?.content)\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>(null);\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}\n",":local {\n .poiEntry {\n flex-wrap: nowrap;\n align-items: start;\n &:hover {\n .poiText:not(.public) {\n text-decoration: underline;\n }\n } \n }\n\n .public {\n margin-top: 0.125rem;\n }\n\n .poiText {\n margin-top: 0.125rem;\n }\n\n .poiTimeStamp {\n height: 1.5rem;\n min-width: 3.5625rem;\n &.wideBadge {\n min-width: 4.375rem;\n }\n }\n}","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.module.scss';\n\ninterface PointOfInterestProps {\n poi: PointOfInterest;\n suppressInteractivity?: boolean;\n onClickPoiItem: (time: number) => void;\n wideBadge?: boolean;\n}\n\nfunction PointOfInterestItem(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 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 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 <PointOfInterestItem\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}\n","import * as React from 'react';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\n\nimport { Core } from 'libs/common/core';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { CopyContentIconButton } from 'libs/shared/components/play-page/copy-content-icon-button/CopyContentIconButton';\nimport { PointOfInterestList } from 'libs/shared/components/play-page/glance/points-of-interest-list/PointsOfInterestList';\nimport { TagHelper } from 'libs/shared/components/tags/TagHelper';\nimport { TagList } from 'libs/shared/components/tags/TagList';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { TagType } from 'libs/shared/enums/TagType';\nimport { PointOfInterest, Tag, Video } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { useLearningIntentionMarkdown } from './VideoAtAGlanceUtilsV2';\n\nimport styles from './video-at-a-glance.module.scss';\n\nconst namespace = 'shared.videoAtAGlanceV2';\n\n// Pixel value selected to try and make it so that when there are more\n// POIs below the fold, that the user can see some of the next one so\n// they know they can scroll. E.g. https://imgur.com/TQyL0Bq\nconst SCROLL_HEIGHT_MAX = 365; // 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 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 name: props.video.glance.name,\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 <CopyContentIconButton\n copyableContent={textToCopy}\n tooltipClassName={styles.icon}\n onClick={logUserAction}\n visible\n />\n <div\n dangerouslySetInnerHTML={{ __html: TextHelper.sanitize(learningIntentionMarkdownHTML) }}\n className='d-inline'\n ref={ref}\n >\n </div>\n </div>\n\n {!!tags?.length && (\n <div>\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 <div className='mt-3'>\n <PointOfInterestList\n pointsOfInterest={props.pointsOfInterest}\n suppressInteractivity={props.suppressInteractivity}\n onClickPoiItem={onClickPoiItem}\n />\n </div>\n )}\n </ScrollbarWrapper>\n </section>\n );\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 { DownloadAllResourcesButton } from 'libs/shared/components/widgets/curated-widgets/components/download-all-resources-button/DownloadAllResourcesButton';\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';\nimport { MasterTypeHelper } from 'libs/shared/utils/MasterTypeHelper';\n\nimport { ResourceWidgetItemV2 } 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 onDownloadAllClick?: (resources: Resource[], fileName: string, analyticsData?: HashObject) => void;\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 const downloadableResources = resources.filter(MasterTypeHelper.isResource);\n const showDownloadAll = props.canViewResources && downloadableResources.length > 0;\n\n return (\n <section\n id={PlayPageAnchor.Resources}\n className='play-page-section widget-hover-reveal-boundary'\n ref={el => {\n (el && props.headingRef?.current) && props.headingRef.current.set(PlayPageAnchor.Resources, el);\n }}\n >\n <FixedWidget\n name={title}\n contents={WidgetContents.PlayPageResourcesV2}\n collection={resources}\n prefetched\n childComponent={ResourceWidgetItemV2}\n headerRightComponent={showDownloadAll ? (\n <DownloadAllResourcesButton\n resources={downloadableResources}\n fileName={`${props.video.name}-resources`}\n analyticsData={props.analyticsData}\n onDownloadAllClick={props.onDownloadAllClick}\n revealOnHover\n />\n ) : undefined}\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}\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 { Clip, PresentationAudience } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\n\nexport interface ClipWidgetItemV2Props extends FixedWidgetItemProps<Clip> {\n audiences: PresentationAudience[];\n commonVideoProps: CommonVideoProps;\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 audience={mergedAudience}\n hideDuration={false}\n commonVideoProps={props.commonVideoProps}\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});\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 { ClipWidgetItemV2 } from 'libs/shared/components/play-page/clips-widget/ClipWidgetItemV2';\nimport { FixedWidget } from 'libs/shared/components/widgets/fixed-widget';\nimport { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { Clip, PresentationAudience, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'shared.playPageClips';\n\ninterface PlayPageClipsProps {\n presentationSlug: string | null;\n video: Video | Clip;\n clips: Clip[];\n canViewClips: boolean;\n audiences: PresentationAudience[];\n analyticsData: HashObject;\n headingRef?: React.MutableRefObject<Map<PlayPageAnchor, HTMLElement>>;\n commonVideoProps: CommonVideoProps;\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: [\n props.presentationSlug,\n props.video.id,\n TextHelper.slugify(props.video.name)\n ]\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\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 audiences: props.audiences,\n showOwner: true,\n commonVideoProps: props.commonVideoProps\n }}\n analyticsData={props.analyticsData}\n />\n </section>\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 { InteractiveWidgetItem } from 'libs/shared/components/play-page/interactives-widget/InteractiveWidgetItem';\nimport { FixedWidget } from 'libs/shared/components/widgets/fixed-widget';\nimport { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { Clip, Interactive, InteractiveMetadata, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'shared.playPageInteractives';\n\ninterface PlayPageInteractivesProps {\n presentationSlug: string | null;\n canViewInteractives: boolean;\n video: Video | Clip;\n interactives: InteractiveMetadata[];\n analyticsData: HashObject;\n headingRef?: React.MutableRefObject<Map<PlayPageAnchor, HTMLElement>>;\n commonVideoProps: CommonVideoProps;\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: [\n props.presentationSlug,\n props.video.id,\n TextHelper.slugify(props.video.name)\n ]\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\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={InteractiveWidgetItem}\n extraChildComponentProps={{\n questionsAppLink: {\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.PREVIEW_QUESTIONS\n },\n showOwner: true,\n commonVideoProps: props.commonVideoProps\n }}\n analyticsData={props.analyticsData}\n />\n </section>\n );\n}\n","import React from 'react';\n\nexport function CollapseRightSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n d='M5.455 12c0 .401.325.727.727.727h9.88l-3.849 3.85a.728.728 0 0 0 1.029 1.028l5.09-5.091a.73.73 0 0 0 .213-.514v7.272a.727.727 0 0 0 1.455 0V4.727a.727.727 0 0 0-1.455 0V12a.73.73 0 0 0-.213-.515l-5.09-5.09a.727.727 0 1 0-1.029 1.028l3.85 3.85H6.181a.727.727 0 0 0-.727.727'\n fill='currentColor'\n />\n </svg>\n );\n}\n","import React from 'react';\n\nexport function ExpandLeftSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n d='M20 12a.727.727 0 0 0-.727-.728h-9.88l3.848-3.849a.727.727 0 1 0-1.028-1.029l-5.091 5.091a.73.73 0 0 0-.213.514V4.727a.727.727 0 0 0-1.454 0v14.545a.727.727 0 0 0 1.454 0V12c0 .186.071.373.213.515l5.091 5.09a.727.727 0 0 0 1.029-1.028l-3.85-3.85h9.88A.727.727 0 0 0 20 12'\n fill='currentColor'\n />\n </svg>\n );\n}\n",":local{\n .showInSide {\n position: sticky;\n top: 5.4375rem;\n height: 100%;\n z-index: 80;\n }\n\n .container {\n padding-right: 0;\n height: fit-content;\n }\n\n .aside {\n .container {\n min-width: 10rem; // make enough space for the collapse icon\n }\n .collapse {\n display: none;\n right: 0;\n top: 0;\n }\n &:hover {\n .collapse {\n display: block;\n }\n }\n }\n\n .iconContainer {\n .arrowIcon {\n display: none;\n }\n .listIcon {\n display: block;\n }\n &:hover {\n .listIcon {\n display: none;\n }\n .arrowIcon {\n display: block;\n }\n }\n }\n}","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 { CollapseRightSvg } from 'libs/shared/images/svg/arrows/CollapseRightSvg';\nimport { ExpandLeftSvg } from 'libs/shared/images/svg/arrows/ExpandLeftSvg';\nimport { TableOfContentsSvg } from 'libs/shared/images/svg/objects/TableOfContentsSvg';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { ContextService } from 'libs/shared/services/ContextService';\n\nimport { PLAY_PAGE_TOC_PORTAL_ID } from 'shared/layouts/teacher-layout/TeacherLayoutComponent';\n\nimport styles from './table-of-contents.module.scss';\n\nconst namespace = 'shared.playPage';\n\nexport const TOC_IGNORE_BOUNDARY = 3;\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 toggleTheatreMode?: (value: boolean) => void;\n showInSide: boolean;\n isTheatreMode: boolean;\n hasTranscription: boolean;\n shouldShow: 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 const shouldExpand = !props.isExpanded;\n props.setIsExpanded(shouldExpand);\n\n if (shouldExpand) {\n props.toggleTheatreMode?.(false);\n // users has not transcription mode should still abel to collapse\n if (!props.toggleTheatreMode) {\n props.setIsExpanded(false);\n }\n } else {\n props.toggleTheatreMode?.(true);\n if (!props.toggleTheatreMode) {\n props.setIsExpanded(true);\n }\n }\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 svg={TableOfContentsSvg}\n onClick={onClickIcon}\n />\n \n <IconButton\n className={`btn btn-outline-dark ${styles.arrowIcon}`}\n svg={!props.isExpanded ? ExpandLeftSvg : CollapseRightSvg}\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 ms-2 ps-4 ${styles.showInSide}`}>\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}`}>\n {/* keep this for customers has no transcription turned on */}\n {props.showInSide && !props.hasTranscription && (\n <IconButton\n className={`btn position-absolute ${styles.collapse}`}\n svg={CollapseRightSvg}\n onClick={() => {\n props.setIsExpanded(false);\n props.toggleTheatreMode?.(true);\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 if (!props.shouldShow)\n return <></>;\n \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}\n",":local {\n .series {\n font-size: 0.75rem;\n font-weight: 500;\n }\n\n .badgeListContainer {\n :global(.badge) {\n height: 1.25rem;\n display: flex;\n align-items: center;\n }\n }\n\n .clipOriginInfo:not(:last-child) {\n margin-bottom: 0.5rem !important;\n }\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { Actions } from 'libs/shared/components/actions/Actions';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { AudienceLabel } from 'libs/shared/components/audience-label/AudienceLabel';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BadgeListContainer } from 'libs/shared/components/badges/BadgeListContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { RestrictionPadlock } from 'libs/shared/components/video-list/components/restriction-padlock/RestrictionPadlock';\nimport { VideoSubText, VideoSubTextType } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { Clip, PresentationAudience, Video, YearGroup } from 'libs/shared/interfaces';\nimport { DurationHelper } from 'libs/shared/utils/DurationHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { VideoFeaturesHash } from 'shared/hooks/useVideoFeatureAccess';\n\nimport styles from './title-and-actions.module.scss';\n\nconst namespace = 'shared.playPage';\n\ninterface PlayPageTitleAndActionsProps {\n presentationSlug: string | null;\n media: Clip | Video;\n yearGroups: YearGroup[];\n audiences: PresentationAudience[];\n featureAccess: VideoFeaturesHash;\n originalVideoAppLink?: Core.AppLink;\n shareId: string;\n showTitlePadlock: boolean;\n subTextType?: VideoSubTextType;\n subtextAppLink?: Core.AppLink;\n}\n\nexport function PlayPageTitleAndActions(props: PlayPageTitleAndActionsProps): JSX.Element {\n const mergedAudience = useMergeAudiences(props.media.subjectPresentationAudiences?.data, props.audiences);\n\n const containerRef = React.useRef<HTMLDivElement>(null);\n const titleContainerRef = React.useRef<HTMLDivElement>(null);\n\n const hasBadges = (\n (VideoHelper.isVideo(props.media) && !!VideoHelper.getRating(props.media)?.value) ||\n (VideoHelper.isVideo(props.media) && !!props.media.productionYear) ||\n !!props.media.subjectPresentationAudiences?.data?.length\n );\n\n const videoActions = useVideoActions({\n location: VideoActionsLocation.PlayPage,\n shareId: props.shareId,\n presentationSlug: props.presentationSlug\n });\n\n const canViewOriginal = !!props.originalVideoAppLink &&\n VideoHelper.isClip(props.media) &&\n VideoHelper.canViewOriginalVideo(props.media);\n\n return (\n <section className='mb-3 position-relative' ref={containerRef}>\n <div className='d-inline-block w-100' ref={titleContainerRef}>\n {props.featureAccess.canNavigate &&\n <div className='ms-2 float-end'>\n <Actions\n actions={videoActions.getVideoActions(props.media)}\n actionsDropdownClassName='btn btn-outline-dark'\n fetchMore={() => videoActions.fetchMoreActions(props.media)}\n />\n </div>\n }\n\n {!!VideoHelper.isVideo(props.media) && (\n <VideoSubText\n type={props.subTextType}\n video={props.media}\n appLink={props.subtextAppLink}\n className={`${styles.series} text-truncate mw-100`}\n analyticsOptions={{ location: LocationContext.PlayPage }}\n />\n )}\n <h1 className='h4 mb-2 mw-100'>\n <span className='align-self-center'>{props.media.name}</span>\n {props.showTitlePadlock && (\n <RestrictionPadlock\n tooltipPlacement='right'\n className='d-inline-block ps-1'\n video={props.media}\n yearGroups={props.yearGroups}\n />\n )}\n </h1>\n \n {VideoHelper.isClip(props.media) && canViewOriginal && (\n <p className={`clamp-1 ${styles.clipOriginInfo}`}>\n <Text namespace={namespace} phrase='viewOriginal' />\n &nbsp;\n <AppLink className='info-link' appLink={props.originalVideoAppLink}>\n {props.media._parentVideo?.name}\n </AppLink>\n &nbsp;\n <Text\n namespace={namespace}\n phrase='timestamp'\n options={{\n timeRange: `${DurationHelper.ToDisplayTimeRange(props.media.startTime * 1000, props.media.endTime * 1000)}`\n }}\n />\n </p>\n )}\n\n {hasBadges && (\n <BadgeListContainer className={styles.badgeListContainer}>\n <AudienceLabel\n audience={mergedAudience}\n className='bg-white text-dark'\n border='dark'\n />\n {VideoHelper.isVideo(props.media) && (\n <Badge type={BadgeType.Rating} data={VideoHelper.getRating(props.media)} />\n )}\n {VideoHelper.isVideo(props.media) && (\n <Badge type={BadgeType.ProductionYear} data={props.media.productionYear} />\n )}\n </BadgeListContainer>\n )}\n </div>\n </section>\n );\n}\n",":local {\n .mask {\n position: absolute;\n width: 100%;\n height: 100%;\n z-index: 5;\n background-color: $black;\n opacity: 0.5;\n transition: opacity 100ms ease-in-out;\n }\n\n .centeredIcon {\n position: absolute;\n left: 50%;\n top: 50%;\n z-index: 10;\n transform: translate(-50%, -50%);\n color: $white;\n opacity: 1;\n width: 6.25rem;\n height: 6.25rem;\n }\n\n .bgImage {\n background-size: cover;\n }\n\n .centeredOverlay {\n position: absolute;\n left: 50%;\n top: 50%;\n z-index: 10;\n transform: translate(-50%, -50%);\n color: $white;\n opacity: 1;\n }\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { EntityType, LocationContext, SignUpDescriptors, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { PlayCircleSvg } from 'libs/shared/images/svg/actions/PlayCircleSvg';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './player-placeholder.module.scss';\n\nconst namespace = 'shared.playerPlaceholder';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface PlayerPlaceholderProps {\n video: VideoTypes;\n type: 'pip' | 'public';\n appLink?: Core.AppLink;\n}\n\nexport function PlayerPlaceholder(props: PlayerPlaceholderProps): JSX.Element {\n switch (props.type) {\n case 'pip':\n return <PipPlaceholder {...props} />;\n case 'public':\n return <PublicPlaceholder {...props} />;\n default:\n return <></>;\n }\n}\n\nconst PipPlaceholder = (props: PlayerPlaceholderProps) => (\n <div\n className={`position-relative responsive-img ${styles.bgImage}`}\n style={{ backgroundImage: `url('${VideoHelper.getThumbnail(props.video)?.url ?? ''}')` }}\n >\n <p className={`m-0 text-white h3 ${styles.centeredOverlay}`}>{getPhrase('playingPiP')}</p>\n <div className={styles.mask} />\n </div>\n);\n\nconst PublicPlaceholder = (props: PlayerPlaceholderProps) => {\n const thumbnailUrl = ImageHelper.createUrl(VideoHelper.getThumbnail(props.video)?.url ?? '', {\n // IMPORTANT: This should be consistent with the size used in `PublicRegionController.cs` in the backend.\n size: ImageSize.Large\n });\n\n return (\n <div\n className={`position-relative responsive-img ${styles.bgImage}`}\n style={{ backgroundImage: `url('${thumbnailUrl}')` }}\n >\n <AppLink\n appLink={props.appLink}\n analyticsOptions={{\n actionType: UserAction.Click,\n location: LocationContext.PlayPage,\n entity: EntityType.AppLink,\n workflowPhase: WorkflowPhase.Start,\n descriptor: SignUpDescriptors.SignUp\n }}\n analyticsData={{}}\n >\n <SvgContainer\n svg={PlayCircleSvg}\n className={styles.centeredIcon}\n />\n <div className={styles.mask} />\n </AppLink>\n </div>\n );\n};\n","import React from 'react';\n\nimport { AppLink } from 'libs/common/backbone/core';\nimport { Core } from 'libs/common/backbone/index';\n\nimport { Resource } from 'libs/shared/interfaces';\n\ninterface UseResourcePopupParams {\n resourcePopupId: string | undefined;\n resources: Resource[] | undefined;\n getResourceAppLink: (resource: Resource) => AppLink;\n}\n\nexport function useResourcePopup({\n resourcePopupId,\n resources,\n getResourceAppLink\n}: UseResourcePopupParams): void {\n React.useEffect(() => {\n if (!resourcePopupId)\n return;\n\n const resource = resources?.find(\n r => r.id.toString() === resourcePopupId.toString()\n );\n\n if (!resource)\n return;\n\n Core.AppLinkHelper.trigger(getResourceAppLink(resource));\n }, [resourcePopupId]);\n}\n","@import '~styles/utils/include-media';\n:local {\n .main.expandedToc {\n width: calc(100% - 15rem); //minus sidebar toc width and margin\n }\n\n .main.theatreMode {\n width: 100% !important;\n }\n\n .theatreModeContent {\n display: flex;\n margin: auto !important;\n\n @include media('<=xl') {\n max-width: 100%;\n }\n }\n\n .theatreModePlayPageContainer {\n //override TeacherLayoutComponent container style\n @media (min-width: 1200px) {\n max-width: none !important;\n }\n }\n\n .theatreModeLeftContent {\n width: calc(100% - 15rem);\n @include media('<=lg') {\n width: 100%;\n }\n }\n}","import { PlayerContextValues } from 'libs/shared/context/player-context/PlayerContext';\n\nimport styles from './play-page.module.scss';\n\ninterface GetMainClassNameProps {\n hasTheatreMode: boolean;\n shouldShowSideTableOfContents: boolean;\n tableOfContentsExpanded: boolean;\n theatreMode: boolean;\n}\n\nexport function getMainClassName(props: GetMainClassNameProps): string {\n // TOC is floating no impact on main\n if (!props.shouldShowSideTableOfContents) {\n return '';\n }\n \n // Theatre mode takes precedence\n if (props.hasTheatreMode && props.theatreMode) {\n return styles.theatreMode;\n }\n \n // Expanded TOC case\n if (props.tableOfContentsExpanded) {\n return `${styles.expandedToc} col-9`;\n }\n \n // Collapsed TOC case\n return 'pe-4';\n}\n\nexport function getContentClassName(props: GetMainClassNameProps): string {\n if (!props.hasTheatreMode) {\n return '';\n }\n\n if (props.theatreMode || !props.shouldShowSideTableOfContents) {\n return `container ${styles.theatreModeContent}`;\n }\n\n return '';\n}\n\nexport function getIsTheatreMode(hasTheatreMode: boolean, playerContext: PlayerContextValues): boolean {\n return hasTheatreMode && playerContext.defaultDisplayMode === 'theatre' && playerContext.mode === 'default';\n}\n","import React from 'react';\n\nimport { LocalStorageHelper } from 'projects/player/utils/local-storage-helper';\n\nimport { useShouldShowSideTableOfContents } from 'shared/views/play/hooks/useShouldShowTableOfContents';\n\nconst PLAY_PAGE_TOC_EXPANDED = 'play-page-toc-expanded';\n\nexport function usePlayPageTableOfContent(tocId: string, hasTheatreMode: boolean, theatreModeOn: boolean) {\n const showInSide = useShouldShowSideTableOfContents();\n const localValue = LocalStorageHelper.get(PLAY_PAGE_TOC_EXPANDED) !== 'false';\n const tocDefaultExpanded = !hasTheatreMode ? localValue : (theatreModeOn || showInSide);\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 // Always collapse when in mobile view\n if (!showInSide) {\n setTableOfContentsExpanded(false);\n return;\n }\n\n // if has theatre mode, always expanded\n if (hasTheatreMode) {\n setTableOfContentsExpanded(true);\n return;\n }\n\n // reset to default\n setTableOfContentsExpanded(tocDefaultExpanded);\n }, [ showInSide, theatreModeOn ]);\n\n function onToggleTableOfContents() {\n if (hasTheatreMode && showInSide)\n return;\n\n setTableOfContentsExpanded(!tableOfContentsExpanded);\n LocalStorageHelper.set(PLAY_PAGE_TOC_EXPANDED, (!tableOfContentsExpanded).toString());\n }\n\n return {\n controlledId,\n setControlledId,\n tableOfContentsExpanded,\n tableOfContentsActiveId,\n setTableOfContentsActiveId,\n onToggleTableOfContents\n };\n}\n","export const ObservableTypesHelper = {\n map<K, V>(onChange: () => void): Map<K, V> {\n const map = new Map<K, V>();\n const proxy = new Proxy(map, {\n get(target: Map<K, V>, prop: string) {\n if (prop === 'set') {\n return (k: K, v: V) => {\n if (target.get(k) !== v) {\n target.set(k, v);\n onChange();\n }\n return proxy;\n };\n }\n\n const val = Reflect.get(target, prop);\n return typeof val === 'function' ? val.bind(target) : val;\n }\n });\n\n return proxy;\n }\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.Transcript,\n PlayPageAnchor.ReferenceVideo,\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.Transcript,\n PlayPageAnchor.ReferenceVideo,\n PlayPageAnchor.RelatedVideos\n];\n","import React from 'react';\n\nimport { useForceUpdate } from 'libs/shared/hooks/useForceUpdate';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { ObservableTypesHelper } from 'libs/shared/utils/ObservableTypesHelper';\n\nimport { PLAY_PAGE_SECTIONS_ORDER, PLAY_PAGE_SECTIONS_ORDER_NO_GLANCE } from 'shared/constants/PlayPageSectionsOrder';\n\nexport function useSectionHeadings(hasGlance: boolean) {\n const forceUpdate = useForceUpdate();\n\n // heading elements must be a live mapping of the elements on the DOM\n // there has to be a force update to recalculate heading element\n const headingRef = React.useRef<Map<PlayPageAnchor, HTMLElement>>(ObservableTypesHelper.map(forceUpdate));\n\n const headingElements = (hasGlance ? PLAY_PAGE_SECTIONS_ORDER : PLAY_PAGE_SECTIONS_ORDER_NO_GLANCE)\n .map(id => headingRef.current.get(id))\n .filter(Boolean) as HTMLElement[];\n\n return { headingRef, headingElements };\n}\n","import { DefaultDisplayMode } from 'libs/shared/context/player-context/interfaces/PlayerContextAction';\nimport { PlayerMode } from 'libs/shared/context/player-context/interfaces/PlayerMode';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\n\nexport function useTheatreModeStyle(\n hasTheatreMode: boolean,\n playerMode: PlayerMode,\n defaultDisplayMode: DefaultDisplayMode\n): boolean {\n const breakpoints = useBreakpoints();\n\n if (playerMode !== 'default') {\n return false;\n }\n\n const theatreModeOn = defaultDisplayMode === 'theatre';\n // on a smaller screen, override theatre mode style when theatre mode is on\n const overrideTheatreModeStyle = breakpoints.sm || breakpoints.md;\n const theatreMode = hasTheatreMode && theatreModeOn;\n const shouldUseTheatreModeStyle = !overrideTheatreModeStyle && theatreMode;\n return shouldUseTheatreModeStyle;\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 case PlayPageAnchor.ReferenceVideo:\n return getPhrase('referenceVideoHeading');\n\n case PlayPageAnchor.Transcript:\n return getPhrase('transcriptHeading');\n\n default:\n return '';\n }\n }\n\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"wpRpI9h02.chunk.js","names":[],"sources":["../../src/shared/views/play/hooks/useShouldShowTableOfContents.ts","../../../../libs/shared/src/components/copyright-disclaimer/copyright-disclaimer.module.scss","../../../../libs/shared/src/components/copyright-disclaimer/CopyrightDisclaimer.tsx","../../../../libs/shared/src/components/play-page/details/video-description/VideoDescription.tsx","../../../../libs/shared/src/components/play-page/details/video-details.module.scss","../../../../libs/shared/src/components/play-page/details/VideoDetailsV2.tsx","../../../../libs/common/src/react/hooks/UseEventsServiceSubscribe.ts","../../../../libs/shared/src/components/play-page/glance/video-at-a-glance.module.scss","../../../../libs/shared/src/components/play-page/glance/VideoAtAGlanceUtilsV2.ts","../../../../libs/shared/src/components/play-page/glance/points-of-interest-list/points-of-interest-list.module.scss","../../../../libs/shared/src/components/play-page/glance/points-of-interest-list/PointsOfInterestList.tsx","../../../../libs/shared/src/components/play-page/glance/VideoAtAGlanceV2.tsx","../../../../libs/shared/src/components/play-page/resources-widget/PlayPageResources.tsx","../../../../libs/shared/src/components/play-page/clips-widget/ClipWidgetItemV2.tsx","../../src/shared/components/play-page/components/play-page-clips/PlayPageClips.tsx","../../src/shared/components/play-page/components/play-page-interactives/PlayPageInteractives.tsx","../../../../libs/shared/src/images/svg/arrows/CollapseRightSvg.tsx","../../../../libs/shared/src/images/svg/arrows/ExpandLeftSvg.tsx","../../src/shared/components/play-page/components/table-of-contents/table-of-contents.module.scss","../../src/shared/components/play-page/components/table-of-contents/TableOfContents.tsx","../../src/shared/components/play-page/components/title-and-actions/title-and-actions.module.scss","../../src/shared/components/play-page/components/title-and-actions/PlayPageTitleAndActions.tsx","../../src/shared/components/player-placeholder/player-placeholder.module.scss","../../src/shared/components/player-placeholder/PlayerPlaceholder.tsx","../../src/shared/views/play/components/play-page/hooks/useResourcePopup.ts","../../src/shared/views/play/components/play-page/play-page.module.scss","../../src/shared/views/play/components/play-page/PlayPageUtils.ts","../../src/shared/views/play/hooks/usePlayPageTableOfContent.ts","../../../../libs/shared/src/utils/ObservableTypesHelper.ts","../../src/shared/constants/PlayPageSectionsOrder.ts","../../src/shared/views/play/hooks/useSectionHeadings.ts","../../src/shared/views/play/hooks/useTheatreStyle.ts","../../src/shared/views/play/PlayPageUtil.tsx"],"sourcesContent":["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}\n",":local {\n .copyrightDisclaimer {\n color: $gray-500;\n }\n .overlayContainer {\n z-index: 1100;\n width: 31.25rem;\n }\n}","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.module.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 phraseClassName?: 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} ${props.phraseClassName ?? '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}\n","import React from 'react';\n\nimport { LinkifyHelper } from 'libs/common/react/utils/LinkifyHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { ExpandableText } from 'libs/shared/components/expandable-text/ExpandableText';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\ninterface VideoDescriptionProps {\n video: VideoTypes;\n}\n\nexport function VideoDescription(props: VideoDescriptionProps): React.ReactElement {\n return (\n <ExpandableText lines={12}>\n {() => (\n <p\n className='mb-0'\n dangerouslySetInnerHTML={{\n __html: TextHelper.sanitize(LinkifyHelper.linkifyText(props.video.description, { nl2br: true }))\n }}\n />\n )}\n </ExpandableText>\n );\n}\n",":local {\n @media (min-width: #{map-get($grid-breakpoints, md)}) {\n .descriptionBorder {\n border-right: 1px solid $gray-300;\n }\n }\n}","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 { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Breadcrumb, Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\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/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 { WidgetHeader } from 'libs/shared/components/widgets/curated-widgets/components/header/WidgetHeader';\nimport { MINIMUM_GLANCE_HEIGHT } from 'libs/shared/constants/MinimumGlanceHeight';\nimport { MasterObjectTypes } from 'libs/shared/enums/MasterObjectTypes';\nimport { TagType } from 'libs/shared/enums/TagType';\nimport { BaseObject, BasePaginatedCollection, Category, Company, CurrentUser, Library, PartnerProfile, Person, 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.module.scss';\n\nconst namespace = 'shared.videoDetailsV2';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface CommaListProps<T extends BaseObject> {\n label: string;\n items: BasePaginatedCollection<T>;\n getItemAppLink?: (item: T) => Core.AppLink;\n className?: string;\n}\n\nfunction CommaList<T extends BaseObject>(props: CommaListProps<T>): 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 if (typeof props.getItemAppLink !== 'function') {\n const commaSeperated = items.data.map(i => i.name?.trim()).join(', ');\n return (\n <div className={className}>{label}: {commaSeperated}</div>\n );\n }\n\n return (\n <div className={className}>\n <span>{label}: </span>\n {items.data.map((item, index) => (\n <React.Fragment key={item.id}>\n <AppLink key={item.id} appLink={props.getItemAppLink(item)}>\n {item.name?.trim()}\n </AppLink>\n {index < items.data.length - 1 && <span>, </span>}\n </React.Fragment>\n ))}\n </div>\n );\n}\n\ninterface LibraryCategoryPair {\n library: Library;\n category: Category;\n}\n\nfunction getCustomLibraryCategoryPairs(video: VideoTypes): LibraryCategoryPair[] {\n const categories = video.categories?.data;\n if (!categories?.length)\n return [];\n\n return categories.filter(category => category.libraries?.data?.[0]?.type === MasterObjectTypes.CustomLibrary)\n .map(category => ({ library: category.libraries?.data?.[0], category }));\n}\n\ninterface CreateLibraryBreadcrumbsOptions {\n pair: LibraryCategoryPair;\n getLibraryAppLink: (library: Library) => Core.AppLink;\n getFolderAppLink: (library: Library, folder: Category) => Core.AppLink;\n}\n\nfunction createLibraryBreadcrumbs(options: CreateLibraryBreadcrumbsOptions): Breadcrumb[] {\n const breadcrumbs: Breadcrumb[] = [\n {\n name: options.pair.library.name,\n appLink: options.getLibraryAppLink?.(options.pair.library)\n },\n { name: '...' },\n {\n name: options.pair.category.name,\n appLink: options.getFolderAppLink?.(options.pair.library, options.pair.category)\n }\n ];\n\n return breadcrumbs;\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 const parentVideo = VideoHelper.getParentVideo(video);\n const libraryPairs = getCustomLibraryCategoryPairs(video);\n\n function getPartnerProfileAppLink(company: Company) {\n if (!company.partnerProfiles || !company.partnerProfiles?.data?.length)\n return;\n\n if (company.partnerProfiles?.count > 1 && typeof props.getPartnerDashboardHubAppLink === 'function')\n return props.getPartnerDashboardHubAppLink(company);\n\n if (typeof props.getPartnerProfileAppLink === 'function')\n return props.getPartnerProfileAppLink(company.partnerProfiles?.data?.[0]);\n\n return;\n }\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<Company>\n label={getPhrase('productionCompanies', { smartCount: parentVideo.productionCompanies?.data?.length })}\n items={parentVideo.productionCompanies}\n getItemAppLink={getPartnerProfileAppLink}\n className='mb-1'\n />\n <CommaList<Company>\n label={getPhrase('distributors', { smartCount: parentVideo.distributors?.data?.length })}\n items={parentVideo.distributors}\n getItemAppLink={getPartnerProfileAppLink}\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 {VideoHelper.canViewUploadDate(props.video) && (\n <div className='mb-1'>\n <Text phrase='dateUploaded' options={{ date: DateHelper.format(video.dateCreated, 'DD/MM/YYYY') }} />\n </div>\n )}\n {!!(libraryPairs.length && props.getLibraryAppLink && props.getFolderAppLink) && (\n <div className='mb-1'>\n <div>{getPhrase('libraries', { smartCount: libraryPairs.length })}:</div>\n {libraryPairs.map((pair, index) => (\n <div key={index}>\n <Breadcrumbs\n breadcrumbs={createLibraryBreadcrumbs({\n pair,\n getLibraryAppLink: props.getLibraryAppLink,\n getFolderAppLink: props.getFolderAppLink\n })}\n linkClassName='text-info'\n />\n </div>\n ))}\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 getPartnerProfileAppLink?: (partnerProfile: PartnerProfile) => Core.AppLink;\n getPartnerDashboardHubAppLink?: (company: Company | Person) => Core.AppLink;\n getLibraryAppLink?: (library: Library) => Core.AppLink;\n getFolderAppLink?: (library: Library, folder: Category) => Core.AppLink;\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 VideoHelper.canViewUploadDate(props.video)\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 && <WidgetHeader name={getPhrase('heading')} />}\n <div className='rounded border p-3 position-relative'>\n <Scrollbars autoHeight autoHeightMax={maxHeight} hideTracksWhenNotNeeded>\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) && (\n <CopyrightDisclaimer\n placement='bottom-start'\n className='d-flex justify-content-start mt-2'\n phraseClassName='mb-0'\n overflowPlacement='top-start'\n />\n )}\n\n </Scrollbars>\n </div>\n </section>\n </LanguageNamespaceContext.Provider>\n );\n}\n","import { useEffect } from 'react';\n\nimport { EventsService } from 'libs/common/react/services/EventsService';\n\n/**\n * \n * @param event the event to subscribe to\n * @param callback the callback function\n * @param once whether to subscribe once\n * @param shouldSubscribe conditionally determine whether to subscribe to events\n * @returns unsubscribe function\n */\nexport function useEventsServiceSubscribe(\n event: string,\n callback: (...args: any[]) => void,\n once?: boolean,\n shouldSubscribe?: boolean\n): () => void {\n const unsubscribe = () => {\n EventsService.unsubscribe(event, callback);\n };\n\n useEffect(() => {\n if (!shouldSubscribe)\n return;\n\n once ? EventsService.subscribeOnce(event, callback) : EventsService.subscribe(event, callback);\n\n return () => {\n unsubscribe();\n };\n }, []);\n\n return unsubscribe;\n}\n",":local{\n .learningIntention p:last-child {\n margin-bottom: -1rem !important; //offset last p element margin \n }\n\n .learningIntention p:not(:last-child) {\n margin-bottom: 0.5rem !important; \n }\n\n .highlightPoi {\n text-decoration: underline;\n }\n\n .icon {\n float:left;\n clear:both;\n }\n}","import { MutableRefObject, useEffect, useRef, useState } from 'react';\nimport { 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.module.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, { async: false });\n}\n\nexport function useLearningIntentionMarkdown(\n video: Video,\n hasGlanceData?: boolean\n): string {\n const [ markdownHTML, setMarkdownHTML ] = useState('');\n\n useEffect(() => {\n if (!hasGlanceData || !video.glance?.content)\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>(null);\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}\n",":local {\n .poiEntry {\n flex-wrap: nowrap;\n align-items: start;\n &:hover {\n .poiText:not(.public) {\n text-decoration: underline;\n }\n } \n }\n\n .public {\n margin-top: 0.125rem;\n }\n\n .poiText {\n margin-top: 0.125rem;\n }\n\n .poiTimeStamp {\n height: 1.5rem;\n min-width: 3.5625rem;\n &.wideBadge {\n min-width: 4.375rem;\n }\n }\n}","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.module.scss';\n\ninterface PointOfInterestProps {\n poi: PointOfInterest;\n suppressInteractivity?: boolean;\n onClickPoiItem: (time: number) => void;\n wideBadge?: boolean;\n}\n\nfunction PointOfInterestItem(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 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 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 <PointOfInterestItem\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}\n","import * as React from 'react';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\n\nimport { Core } from 'libs/common/core';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { CopyContentIconButton } from 'libs/shared/components/play-page/copy-content-icon-button/CopyContentIconButton';\nimport { PointOfInterestList } from 'libs/shared/components/play-page/glance/points-of-interest-list/PointsOfInterestList';\nimport { TagHelper } from 'libs/shared/components/tags/TagHelper';\nimport { TagList } from 'libs/shared/components/tags/TagList';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { TagType } from 'libs/shared/enums/TagType';\nimport { PointOfInterest, Tag, Video } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { useLearningIntentionMarkdown } from './VideoAtAGlanceUtilsV2';\n\nimport styles from './video-at-a-glance.module.scss';\n\nconst namespace = 'shared.videoAtAGlanceV2';\n\n// Pixel value selected to try and make it so that when there are more\n// POIs below the fold, that the user can see some of the next one so\n// they know they can scroll. E.g. https://imgur.com/TQyL0Bq\nconst SCROLL_HEIGHT_MAX = 365; // 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 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 name: props.video.glance.name,\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 <CopyContentIconButton\n copyableContent={textToCopy}\n tooltipClassName={styles.icon}\n onClick={logUserAction}\n visible\n />\n <div\n dangerouslySetInnerHTML={{ __html: TextHelper.sanitize(learningIntentionMarkdownHTML) }}\n className='d-inline'\n ref={ref}\n >\n </div>\n </div>\n\n {!!tags?.length && (\n <div>\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 <div className='mt-3'>\n <PointOfInterestList\n pointsOfInterest={props.pointsOfInterest}\n suppressInteractivity={props.suppressInteractivity}\n onClickPoiItem={onClickPoiItem}\n />\n </div>\n )}\n </ScrollbarWrapper>\n </section>\n );\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 { DownloadAllResourcesButton } from 'libs/shared/components/widgets/curated-widgets/components/download-all-resources-button/DownloadAllResourcesButton';\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';\nimport { MasterTypeHelper } from 'libs/shared/utils/MasterTypeHelper';\n\nimport { ResourceWidgetItemV2 } 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 onDownloadAllClick?: (resources: Resource[], fileName: string, analyticsData?: HashObject) => void;\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 const downloadableResources = resources.filter(MasterTypeHelper.isResource);\n const showDownloadAll = props.canViewResources && downloadableResources.length > 0;\n\n return (\n <section\n id={PlayPageAnchor.Resources}\n className='play-page-section widget-hover-reveal-boundary'\n ref={el => {\n (el && props.headingRef?.current) && props.headingRef.current.set(PlayPageAnchor.Resources, el);\n }}\n >\n <FixedWidget\n name={title}\n contents={WidgetContents.PlayPageResourcesV2}\n collection={resources}\n prefetched\n childComponent={ResourceWidgetItemV2}\n headerRightComponent={showDownloadAll ? (\n <DownloadAllResourcesButton\n resources={downloadableResources}\n fileName={`${props.video.name}-resources`}\n analyticsData={props.analyticsData}\n onDownloadAllClick={props.onDownloadAllClick}\n revealOnHover\n />\n ) : undefined}\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}\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 { Clip, PresentationAudience } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\n\nexport interface ClipWidgetItemV2Props extends FixedWidgetItemProps<Clip> {\n audiences: PresentationAudience[];\n commonVideoProps: CommonVideoProps;\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 audience={mergedAudience}\n hideDuration={false}\n commonVideoProps={props.commonVideoProps}\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});\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 { ClipWidgetItemV2 } from 'libs/shared/components/play-page/clips-widget/ClipWidgetItemV2';\nimport { FixedWidget } from 'libs/shared/components/widgets/fixed-widget';\nimport { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { Clip, PresentationAudience, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'shared.playPageClips';\n\ninterface PlayPageClipsProps {\n presentationSlug: string | null;\n video: Video | Clip;\n clips: Clip[];\n canViewClips: boolean;\n audiences: PresentationAudience[];\n analyticsData: HashObject;\n headingRef?: React.MutableRefObject<Map<PlayPageAnchor, HTMLElement>>;\n commonVideoProps: CommonVideoProps;\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: [\n props.presentationSlug,\n props.video.id,\n TextHelper.slugify(props.video.name)\n ]\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\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 audiences: props.audiences,\n showOwner: true,\n commonVideoProps: props.commonVideoProps\n }}\n analyticsData={props.analyticsData}\n />\n </section>\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 { InteractiveWidgetItem } from 'libs/shared/components/play-page/interactives-widget/InteractiveWidgetItem';\nimport { FixedWidget } from 'libs/shared/components/widgets/fixed-widget';\nimport { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { Clip, Interactive, InteractiveMetadata, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'shared.playPageInteractives';\n\ninterface PlayPageInteractivesProps {\n presentationSlug: string | null;\n canViewInteractives: boolean;\n video: Video | Clip;\n interactives: InteractiveMetadata[];\n analyticsData: HashObject;\n headingRef?: React.MutableRefObject<Map<PlayPageAnchor, HTMLElement>>;\n commonVideoProps: CommonVideoProps;\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: [\n props.presentationSlug,\n props.video.id,\n TextHelper.slugify(props.video.name)\n ]\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\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={InteractiveWidgetItem}\n extraChildComponentProps={{\n questionsAppLink: {\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.PREVIEW_QUESTIONS\n },\n showOwner: true,\n commonVideoProps: props.commonVideoProps\n }}\n analyticsData={props.analyticsData}\n />\n </section>\n );\n}\n","import React from 'react';\n\nexport function CollapseRightSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n d='M5.455 12c0 .401.325.727.727.727h9.88l-3.849 3.85a.728.728 0 0 0 1.029 1.028l5.09-5.091a.73.73 0 0 0 .213-.514v7.272a.727.727 0 0 0 1.455 0V4.727a.727.727 0 0 0-1.455 0V12a.73.73 0 0 0-.213-.515l-5.09-5.09a.727.727 0 1 0-1.029 1.028l3.85 3.85H6.181a.727.727 0 0 0-.727.727'\n fill='currentColor'\n />\n </svg>\n );\n}\n","import React from 'react';\n\nexport function ExpandLeftSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n d='M20 12a.727.727 0 0 0-.727-.728h-9.88l3.848-3.849a.727.727 0 1 0-1.028-1.029l-5.091 5.091a.73.73 0 0 0-.213.514V4.727a.727.727 0 0 0-1.454 0v14.545a.727.727 0 0 0 1.454 0V12c0 .186.071.373.213.515l5.091 5.09a.727.727 0 0 0 1.029-1.028l-3.85-3.85h9.88A.727.727 0 0 0 20 12'\n fill='currentColor'\n />\n </svg>\n );\n}\n",":local{\n .showInSide {\n position: sticky;\n top: 5.4375rem;\n height: 100%;\n z-index: 80;\n }\n\n .container {\n padding-right: 0;\n height: fit-content;\n }\n\n .aside {\n .container {\n min-width: 10rem; // make enough space for the collapse icon\n }\n .collapse {\n display: none;\n right: 0;\n top: 0;\n }\n &:hover {\n .collapse {\n display: block;\n }\n }\n }\n\n .iconContainer {\n .arrowIcon {\n display: none;\n }\n .listIcon {\n display: block;\n }\n &:hover {\n .listIcon {\n display: none;\n }\n .arrowIcon {\n display: block;\n }\n }\n }\n}","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 { CollapseRightSvg } from 'libs/shared/images/svg/arrows/CollapseRightSvg';\nimport { ExpandLeftSvg } from 'libs/shared/images/svg/arrows/ExpandLeftSvg';\nimport { TableOfContentsSvg } from 'libs/shared/images/svg/objects/TableOfContentsSvg';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { ContextService } from 'libs/shared/services/ContextService';\n\nimport { PLAY_PAGE_TOC_PORTAL_ID } from 'shared/layouts/teacher-layout/TeacherLayoutComponent';\n\nimport styles from './table-of-contents.module.scss';\n\nconst namespace = 'shared.playPage';\n\nexport const TOC_IGNORE_BOUNDARY = 3;\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 toggleTheatreMode?: (value: boolean) => void;\n showInSide: boolean;\n isTheatreMode: boolean;\n hasTranscription: boolean;\n shouldShow: 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 const shouldExpand = !props.isExpanded;\n props.setIsExpanded(shouldExpand);\n\n if (shouldExpand) {\n props.toggleTheatreMode?.(false);\n // users has not transcription mode should still abel to collapse\n if (!props.toggleTheatreMode) {\n props.setIsExpanded(false);\n }\n } else {\n props.toggleTheatreMode?.(true);\n if (!props.toggleTheatreMode) {\n props.setIsExpanded(true);\n }\n }\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 svg={TableOfContentsSvg}\n onClick={onClickIcon}\n />\n \n <IconButton\n className={`btn btn-outline-dark ${styles.arrowIcon}`}\n svg={!props.isExpanded ? ExpandLeftSvg : CollapseRightSvg}\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 ms-2 ps-4 ${styles.showInSide}`}>\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}`}>\n {/* keep this for customers has no transcription turned on */}\n {props.showInSide && !props.hasTranscription && (\n <IconButton\n className={`btn position-absolute ${styles.collapse}`}\n svg={CollapseRightSvg}\n onClick={() => {\n props.setIsExpanded(false);\n props.toggleTheatreMode?.(true);\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 if (!props.shouldShow)\n return <></>;\n \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}\n",":local {\n .series {\n font-size: 0.75rem;\n font-weight: 500;\n }\n\n .badgeListContainer {\n :global(.badge) {\n height: 1.25rem;\n display: flex;\n align-items: center;\n }\n }\n\n .clipOriginInfo:not(:last-child) {\n margin-bottom: 0.5rem !important;\n }\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { Actions } from 'libs/shared/components/actions/Actions';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { AudienceLabel } from 'libs/shared/components/audience-label/AudienceLabel';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BadgeListContainer } from 'libs/shared/components/badges/BadgeListContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { RestrictionPadlock } from 'libs/shared/components/video-list/components/restriction-padlock/RestrictionPadlock';\nimport { VideoSubText, VideoSubTextType } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { Clip, PresentationAudience, Video, YearGroup } from 'libs/shared/interfaces';\nimport { DurationHelper } from 'libs/shared/utils/DurationHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { VideoFeaturesHash } from 'shared/hooks/useVideoFeatureAccess';\n\nimport styles from './title-and-actions.module.scss';\n\nconst namespace = 'shared.playPage';\n\ninterface PlayPageTitleAndActionsProps {\n presentationSlug: string | null;\n media: Clip | Video;\n yearGroups: YearGroup[];\n audiences: PresentationAudience[];\n featureAccess: VideoFeaturesHash;\n originalVideoAppLink?: Core.AppLink;\n shareId: string;\n showTitlePadlock: boolean;\n subTextType?: VideoSubTextType;\n subtextAppLink?: Core.AppLink;\n}\n\nexport function PlayPageTitleAndActions(props: PlayPageTitleAndActionsProps): JSX.Element {\n const mergedAudience = useMergeAudiences(props.media.subjectPresentationAudiences?.data, props.audiences);\n\n const containerRef = React.useRef<HTMLDivElement>(null);\n const titleContainerRef = React.useRef<HTMLDivElement>(null);\n\n const hasBadges = (\n (VideoHelper.isVideo(props.media) && !!VideoHelper.getRating(props.media)?.value) ||\n (VideoHelper.isVideo(props.media) && !!props.media.productionYear) ||\n !!props.media.subjectPresentationAudiences?.data?.length\n );\n\n const videoActions = useVideoActions({\n location: VideoActionsLocation.PlayPage,\n shareId: props.shareId,\n presentationSlug: props.presentationSlug\n });\n\n const canViewOriginal = !!props.originalVideoAppLink &&\n VideoHelper.isClip(props.media) &&\n VideoHelper.canViewOriginalVideo(props.media);\n\n return (\n <section className='mb-3 position-relative' ref={containerRef}>\n <div className='d-inline-block w-100' ref={titleContainerRef}>\n {props.featureAccess.canNavigate &&\n <div className='ms-2 float-end'>\n <Actions\n actions={videoActions.getVideoActions(props.media)}\n actionsDropdownClassName='btn btn-outline-dark'\n fetchMore={() => videoActions.fetchMoreActions(props.media)}\n />\n </div>\n }\n\n {!!VideoHelper.isVideo(props.media) && (\n <VideoSubText\n type={props.subTextType}\n video={props.media}\n appLink={props.subtextAppLink}\n className={`${styles.series} text-truncate mw-100`}\n analyticsOptions={{ location: LocationContext.PlayPage }}\n />\n )}\n <h1 className='h4 mb-2 mw-100'>\n <span className='align-self-center'>{props.media.name}</span>\n {props.showTitlePadlock && (\n <RestrictionPadlock\n tooltipPlacement='right'\n className='d-inline-block ps-1'\n video={props.media}\n yearGroups={props.yearGroups}\n />\n )}\n </h1>\n \n {VideoHelper.isClip(props.media) && canViewOriginal && (\n <p className={`clamp-1 ${styles.clipOriginInfo}`}>\n <Text namespace={namespace} phrase='viewOriginal' />\n &nbsp;\n <AppLink className='info-link' appLink={props.originalVideoAppLink}>\n {props.media._parentVideo?.name}\n </AppLink>\n &nbsp;\n <Text\n namespace={namespace}\n phrase='timestamp'\n options={{\n timeRange: `${DurationHelper.ToDisplayTimeRange(props.media.startTime * 1000, props.media.endTime * 1000)}`\n }}\n />\n </p>\n )}\n\n {hasBadges && (\n <BadgeListContainer className={styles.badgeListContainer}>\n <AudienceLabel\n audience={mergedAudience}\n className='bg-white text-dark'\n border='dark'\n />\n {VideoHelper.isVideo(props.media) && (\n <Badge type={BadgeType.Rating} data={VideoHelper.getRating(props.media)} />\n )}\n {VideoHelper.isVideo(props.media) && (\n <Badge type={BadgeType.ProductionYear} data={props.media.productionYear} />\n )}\n </BadgeListContainer>\n )}\n </div>\n </section>\n );\n}\n",":local {\n .mask {\n position: absolute;\n width: 100%;\n height: 100%;\n z-index: 5;\n background-color: $black;\n opacity: 0.5;\n transition: opacity 100ms ease-in-out;\n }\n\n .centeredIcon {\n position: absolute;\n left: 50%;\n top: 50%;\n z-index: 10;\n transform: translate(-50%, -50%);\n color: $white;\n opacity: 1;\n width: 6.25rem;\n height: 6.25rem;\n }\n\n .bgImage {\n background-size: cover;\n }\n\n .centeredOverlay {\n position: absolute;\n left: 50%;\n top: 50%;\n z-index: 10;\n transform: translate(-50%, -50%);\n color: $white;\n opacity: 1;\n }\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { EntityType, LocationContext, SignUpDescriptors, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { PlayCircleSvg } from 'libs/shared/images/svg/actions/PlayCircleSvg';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './player-placeholder.module.scss';\n\nconst namespace = 'shared.playerPlaceholder';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface PlayerPlaceholderProps {\n video: VideoTypes;\n type: 'pip' | 'public';\n appLink?: Core.AppLink;\n}\n\nexport function PlayerPlaceholder(props: PlayerPlaceholderProps): JSX.Element {\n switch (props.type) {\n case 'pip':\n return <PipPlaceholder {...props} />;\n case 'public':\n return <PublicPlaceholder {...props} />;\n default:\n return <></>;\n }\n}\n\nconst PipPlaceholder = (props: PlayerPlaceholderProps) => (\n <div\n className={`position-relative responsive-img ${styles.bgImage}`}\n style={{ backgroundImage: `url('${VideoHelper.getThumbnail(props.video)?.url ?? ''}')` }}\n >\n <p className={`m-0 text-white h3 ${styles.centeredOverlay}`}>{getPhrase('playingPiP')}</p>\n <div className={styles.mask} />\n </div>\n);\n\nconst PublicPlaceholder = (props: PlayerPlaceholderProps) => {\n const thumbnailUrl = ImageHelper.createUrl(VideoHelper.getThumbnail(props.video)?.url ?? '', {\n // IMPORTANT: This should be consistent with the size used in `PublicRegionController.cs` in the backend.\n size: ImageSize.Large\n });\n\n return (\n <div\n className={`position-relative responsive-img ${styles.bgImage}`}\n style={{ backgroundImage: `url('${thumbnailUrl}')` }}\n >\n <AppLink\n appLink={props.appLink}\n analyticsOptions={{\n actionType: UserAction.Click,\n location: LocationContext.PlayPage,\n entity: EntityType.AppLink,\n workflowPhase: WorkflowPhase.Start,\n descriptor: SignUpDescriptors.SignUp\n }}\n analyticsData={{}}\n >\n <SvgContainer\n svg={PlayCircleSvg}\n className={styles.centeredIcon}\n />\n <div className={styles.mask} />\n </AppLink>\n </div>\n );\n};\n","import React from 'react';\n\nimport { AppLink } from 'libs/common/backbone/core';\nimport { Core } from 'libs/common/backbone/index';\n\nimport { Resource } from 'libs/shared/interfaces';\n\ninterface UseResourcePopupParams {\n resourcePopupId: string | undefined;\n resources: Resource[] | undefined;\n getResourceAppLink: (resource: Resource) => AppLink;\n}\n\nexport function useResourcePopup({\n resourcePopupId,\n resources,\n getResourceAppLink\n}: UseResourcePopupParams): void {\n React.useEffect(() => {\n if (!resourcePopupId)\n return;\n\n const resource = resources?.find(\n r => r.id.toString() === resourcePopupId.toString()\n );\n\n if (!resource)\n return;\n\n Core.AppLinkHelper.trigger(getResourceAppLink(resource));\n }, [resourcePopupId]);\n}\n","@import '~styles/utils/include-media';\n:local {\n .main.expandedToc {\n width: calc(100% - 15rem); //minus sidebar toc width and margin\n }\n\n .main.theatreMode {\n width: 100% !important;\n }\n\n .theatreModeContent {\n display: flex;\n margin: auto !important;\n\n @include media('<=xl') {\n max-width: 100%;\n }\n }\n\n .theatreModePlayPageContainer {\n //override TeacherLayoutComponent container style\n @media (min-width: 1200px) {\n max-width: none !important;\n }\n }\n\n .theatreModeLeftContent {\n width: calc(100% - 15rem);\n @include media('<=lg') {\n width: 100%;\n }\n }\n}","import { PlayerContextValues } from 'libs/shared/context/player-context/PlayerContext';\n\nimport styles from './play-page.module.scss';\n\ninterface GetMainClassNameProps {\n hasTheatreMode: boolean;\n shouldShowSideTableOfContents: boolean;\n tableOfContentsExpanded: boolean;\n theatreMode: boolean;\n}\n\nexport function getMainClassName(props: GetMainClassNameProps): string {\n // TOC is floating no impact on main\n if (!props.shouldShowSideTableOfContents) {\n return '';\n }\n \n // Theatre mode takes precedence\n if (props.hasTheatreMode && props.theatreMode) {\n return styles.theatreMode;\n }\n \n // Expanded TOC case\n if (props.tableOfContentsExpanded) {\n return `${styles.expandedToc} col-9`;\n }\n \n // Collapsed TOC case\n return 'pe-4';\n}\n\nexport function getContentClassName(props: GetMainClassNameProps): string {\n if (!props.hasTheatreMode) {\n return '';\n }\n\n if (props.theatreMode || !props.shouldShowSideTableOfContents) {\n return `container ${styles.theatreModeContent}`;\n }\n\n return '';\n}\n\nexport function getIsTheatreMode(hasTheatreMode: boolean, playerContext: PlayerContextValues): boolean {\n return hasTheatreMode && playerContext.defaultDisplayMode === 'theatre' && playerContext.mode === 'default';\n}\n","import React from 'react';\n\nimport { LocalStorageHelper } from 'projects/player/utils/local-storage-helper';\n\nimport { useShouldShowSideTableOfContents } from 'shared/views/play/hooks/useShouldShowTableOfContents';\n\nconst PLAY_PAGE_TOC_EXPANDED = 'play-page-toc-expanded';\n\nexport function usePlayPageTableOfContent(tocId: string, hasTheatreMode: boolean, theatreModeOn: boolean) {\n const showInSide = useShouldShowSideTableOfContents();\n const localValue = LocalStorageHelper.get(PLAY_PAGE_TOC_EXPANDED) !== 'false';\n const tocDefaultExpanded = !hasTheatreMode ? localValue : (theatreModeOn || showInSide);\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 // Always collapse when in mobile view\n if (!showInSide) {\n setTableOfContentsExpanded(false);\n return;\n }\n\n // if has theatre mode, always expanded\n if (hasTheatreMode) {\n setTableOfContentsExpanded(true);\n return;\n }\n\n // reset to default\n setTableOfContentsExpanded(tocDefaultExpanded);\n }, [ showInSide, theatreModeOn ]);\n\n function onToggleTableOfContents() {\n if (hasTheatreMode && showInSide)\n return;\n\n setTableOfContentsExpanded(!tableOfContentsExpanded);\n LocalStorageHelper.set(PLAY_PAGE_TOC_EXPANDED, (!tableOfContentsExpanded).toString());\n }\n\n return {\n controlledId,\n setControlledId,\n tableOfContentsExpanded,\n tableOfContentsActiveId,\n setTableOfContentsActiveId,\n onToggleTableOfContents\n };\n}\n","export const ObservableTypesHelper = {\n map<K, V>(onChange: () => void): Map<K, V> {\n const map = new Map<K, V>();\n const proxy = new Proxy(map, {\n get(target: Map<K, V>, prop: string) {\n if (prop === 'set') {\n return (k: K, v: V) => {\n if (target.get(k) !== v) {\n target.set(k, v);\n onChange();\n }\n return proxy;\n };\n }\n\n const val = Reflect.get(target, prop);\n return typeof val === 'function' ? val.bind(target) : val;\n }\n });\n\n return proxy;\n }\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.Transcript,\n PlayPageAnchor.ReferenceVideo,\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.Transcript,\n PlayPageAnchor.ReferenceVideo,\n PlayPageAnchor.RelatedVideos\n];\n","import React from 'react';\n\nimport { useForceUpdate } from 'libs/shared/hooks/useForceUpdate';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { ObservableTypesHelper } from 'libs/shared/utils/ObservableTypesHelper';\n\nimport { PLAY_PAGE_SECTIONS_ORDER, PLAY_PAGE_SECTIONS_ORDER_NO_GLANCE } from 'shared/constants/PlayPageSectionsOrder';\n\nexport function useSectionHeadings(hasGlance: boolean) {\n const forceUpdate = useForceUpdate();\n\n // heading elements must be a live mapping of the elements on the DOM\n // there has to be a force update to recalculate heading element\n const headingRef = React.useRef<Map<PlayPageAnchor, HTMLElement>>(ObservableTypesHelper.map(forceUpdate));\n\n const headingElements = (hasGlance ? PLAY_PAGE_SECTIONS_ORDER : PLAY_PAGE_SECTIONS_ORDER_NO_GLANCE)\n .map(id => headingRef.current.get(id))\n .filter(Boolean) as HTMLElement[];\n\n return { headingRef, headingElements };\n}\n","import { DefaultDisplayMode } from 'libs/shared/context/player-context/interfaces/PlayerContextAction';\nimport { PlayerMode } from 'libs/shared/context/player-context/interfaces/PlayerMode';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\n\nexport function useTheatreModeStyle(\n hasTheatreMode: boolean,\n playerMode: PlayerMode,\n defaultDisplayMode: DefaultDisplayMode\n): boolean {\n const breakpoints = useBreakpoints();\n\n if (playerMode !== 'default') {\n return false;\n }\n\n const theatreModeOn = defaultDisplayMode === 'theatre';\n // on a smaller screen, override theatre mode style when theatre mode is on\n const overrideTheatreModeStyle = breakpoints.sm || breakpoints.md;\n const theatreMode = hasTheatreMode && theatreModeOn;\n const shouldUseTheatreModeStyle = !overrideTheatreModeStyle && theatreMode;\n return shouldUseTheatreModeStyle;\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 case PlayPageAnchor.ReferenceVideo:\n return getPhrase('referenceVideoHeading');\n\n case PlayPageAnchor.Transcript:\n return getPhrase('transcriptHeading');\n\n default:\n return '';\n }\n }\n\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clickview/lite",
3
- "version": "0.103.0-rc.0",
3
+ "version": "0.103.1",
4
4
  "description": "ClickView Lite",
5
5
  "main": "dist/scripts/bundle.js",
6
6
  "types": "dist/projects/lite/src/index.d.ts",