@clickview/lite 0.104.0-rc.7 → 0.104.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.vite/manifest.json +575 -575
- package/dist/bundles.json +1 -1
- package/dist/en.json +1 -1
- package/dist/scripts/{Dnz8CbEu.chunk.js → -QIG2ZHc.chunk.js} +3 -3
- package/dist/scripts/{Dnz8CbEu.chunk.js.map → -QIG2ZHc.chunk.js.map} +1 -1
- package/dist/scripts/{CX6c7KRp2.chunk.js → 0mx04bmJ2.chunk.js} +2 -2
- package/dist/scripts/{CX6c7KRp2.chunk.js.map → 0mx04bmJ2.chunk.js.map} +1 -1
- package/dist/scripts/{CMHxOVI7.chunk.js → 41LJfkjO.chunk.js} +2 -2
- package/dist/scripts/{CMHxOVI7.chunk.js.map → 41LJfkjO.chunk.js.map} +1 -1
- package/dist/scripts/{BBWnpWNB2.chunk.js → 7uvJMXC12.chunk.js} +2 -2
- package/dist/scripts/{BBWnpWNB2.chunk.js.map → 7uvJMXC12.chunk.js.map} +1 -1
- package/dist/scripts/{CaCm4N_d2.chunk.js → B-HfRX562.chunk.js} +2 -2
- package/dist/scripts/{CaCm4N_d2.chunk.js.map → B-HfRX562.chunk.js.map} +1 -1
- package/dist/scripts/{DSPMbDdF.chunk.js → B3_lC6bW.chunk.js} +2 -2
- package/dist/scripts/{DSPMbDdF.chunk.js.map → B3_lC6bW.chunk.js.map} +1 -1
- package/dist/scripts/{0Fek4oFk.chunk.js → BLE8DLAY.chunk.js} +2 -2
- package/dist/scripts/{0Fek4oFk.chunk.js.map → BLE8DLAY.chunk.js.map} +1 -1
- package/dist/scripts/{B338pwKt2.chunk.js → BRt-Kdnn2.chunk.js} +2 -2
- package/dist/scripts/{B338pwKt2.chunk.js.map → BRt-Kdnn2.chunk.js.map} +1 -1
- package/dist/scripts/{D3ncynN72.chunk.js → BVBpDZoT2.chunk.js} +3 -3
- package/dist/scripts/{D3ncynN72.chunk.js.map → BVBpDZoT2.chunk.js.map} +1 -1
- package/dist/scripts/{5PKjjI4Y.chunk.js → BapoiGsj.chunk.js} +2 -2
- package/dist/scripts/{5PKjjI4Y.chunk.js.map → BapoiGsj.chunk.js.map} +1 -1
- package/dist/scripts/{CNfmLVE82.chunk.js → Bc1JT5Y-2.chunk.js} +2 -2
- package/dist/scripts/{CNfmLVE82.chunk.js.map → Bc1JT5Y-2.chunk.js.map} +1 -1
- package/dist/scripts/{cDv6zuhh.chunk.js → BhE5KhcC.chunk.js} +2 -2
- package/dist/scripts/{cDv6zuhh.chunk.js.map → BhE5KhcC.chunk.js.map} +1 -1
- package/dist/scripts/{Bzk4AwVx2.chunk.js → BncgzKKQ2.chunk.js} +2 -2
- package/dist/scripts/{Bzk4AwVx2.chunk.js.map → BncgzKKQ2.chunk.js.map} +1 -1
- package/dist/scripts/BwBWuxjr2.chunk.js +2 -0
- package/dist/scripts/{B1hsuVfV2.chunk.js.map → BwBWuxjr2.chunk.js.map} +1 -1
- package/dist/scripts/{B1TqilLB.chunk.js → C6z8ii6C.chunk.js} +2 -2
- package/dist/scripts/{B1TqilLB.chunk.js.map → C6z8ii6C.chunk.js.map} +1 -1
- package/dist/scripts/{fMgBORUX.chunk.js → C8x-QH43.chunk.js} +2 -2
- package/dist/scripts/{fMgBORUX.chunk.js.map → C8x-QH43.chunk.js.map} +1 -1
- package/dist/scripts/{BiWUSyJr.chunk.js → CAkqvKfy.chunk.js} +2 -2
- package/dist/scripts/{BiWUSyJr.chunk.js.map → CAkqvKfy.chunk.js.map} +1 -1
- package/dist/scripts/{D-iyHqNw2.chunk.js → CLvImDXv2.chunk.js} +3 -3
- package/dist/scripts/{D-iyHqNw2.chunk.js.map → CLvImDXv2.chunk.js.map} +1 -1
- package/dist/scripts/{Cqq1N9xw.chunk.js → CM8248d7.chunk.js} +2 -2
- package/dist/scripts/{Cqq1N9xw.chunk.js.map → CM8248d7.chunk.js.map} +1 -1
- package/dist/scripts/{B_TE5XUR2.chunk.js → CvilnM0u2.chunk.js} +2 -2
- package/dist/scripts/{B_TE5XUR2.chunk.js.map → CvilnM0u2.chunk.js.map} +1 -1
- package/dist/scripts/{AEOAlemi.chunk.js → Cwocc8uV.chunk.js} +2 -2
- package/dist/scripts/{AEOAlemi.chunk.js.map → Cwocc8uV.chunk.js.map} +1 -1
- package/dist/scripts/{Bld7iWR52.chunk.js → D-pn0sNx2.chunk.js} +2 -2
- package/dist/scripts/{Bld7iWR52.chunk.js.map → D-pn0sNx2.chunk.js.map} +1 -1
- package/dist/scripts/{Cyit3dMk.chunk.js → D78QEASE.chunk.js} +2 -2
- package/dist/scripts/{Cyit3dMk.chunk.js.map → D78QEASE.chunk.js.map} +1 -1
- package/dist/scripts/{Dtag-27K.chunk.js → DER8311r.chunk.js} +2 -2
- package/dist/scripts/{Dtag-27K.chunk.js.map → DER8311r.chunk.js.map} +1 -1
- package/dist/scripts/{CmnbQiBA.chunk.js → DSZaceCq.chunk.js} +2 -2
- package/dist/scripts/{CmnbQiBA.chunk.js.map → DSZaceCq.chunk.js.map} +1 -1
- package/dist/scripts/{CfNYFxJl2.chunk.js → D_1m0b_a2.chunk.js} +2 -2
- package/dist/scripts/{CfNYFxJl2.chunk.js.map → D_1m0b_a2.chunk.js.map} +1 -1
- package/dist/scripts/{-KvTbeQV.chunk.js → DhcRnxkp.chunk.js} +2 -2
- package/dist/scripts/{-KvTbeQV.chunk.js.map → DhcRnxkp.chunk.js.map} +1 -1
- package/dist/scripts/{qRLSbnEr.chunk.js → DhdM2yGm.chunk.js} +2 -2
- package/dist/scripts/{qRLSbnEr.chunk.js.map → DhdM2yGm.chunk.js.map} +1 -1
- package/dist/scripts/{DKDWcWxk.chunk.js → Dqn0sInF.chunk.js} +2 -2
- package/dist/scripts/{DKDWcWxk.chunk.js.map → Dqn0sInF.chunk.js.map} +1 -1
- package/dist/scripts/{CAs2Sere2.chunk.js → MW7W80HY2.chunk.js} +2 -2
- package/dist/scripts/{CAs2Sere2.chunk.js.map → MW7W80HY2.chunk.js.map} +1 -1
- package/dist/scripts/{CwFYdvvA.chunk.js → Okf3Hn0s.chunk.js} +2 -2
- package/dist/scripts/{CwFYdvvA.chunk.js.map → Okf3Hn0s.chunk.js.map} +1 -1
- package/dist/scripts/{Dt5731Ay.chunk.js → _lqYS5Jx.chunk.js} +2 -2
- package/dist/scripts/{Dt5731Ay.chunk.js.map → _lqYS5Jx.chunk.js.map} +1 -1
- package/dist/scripts/{app-CyGIKC-k.js → app-H3wSQ-PR.js} +4 -4
- package/dist/scripts/{app-CyGIKC-k.js.map → app-H3wSQ-PR.js.map} +1 -1
- package/dist/scripts/{B3AhKFfz.chunk.js → ftYw2FVB.chunk.js} +2 -2
- package/dist/scripts/{B3AhKFfz.chunk.js.map → ftYw2FVB.chunk.js.map} +1 -1
- package/dist/scripts/{DyE6EUDb.chunk.js → kjRiUKIL.chunk.js} +2 -2
- package/dist/scripts/{DyE6EUDb.chunk.js.map → kjRiUKIL.chunk.js.map} +1 -1
- package/dist/scripts/{B3y60nT5.chunk.js → pDWQ8Uj5.chunk.js} +2 -2
- package/dist/scripts/{B3y60nT5.chunk.js.map → pDWQ8Uj5.chunk.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/B1hsuVfV2.chunk.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Bld7iWR52.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/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 { 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 \n <AppLink className='info-link' appLink={props.originalVideoAppLink}>\n {props.media._parentVideo?.name}\n </AppLink>\n \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":"D-pn0sNx2.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/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 { 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 \n <AppLink className='info-link' appLink={props.originalVideoAppLink}>\n {props.media._parentVideo?.name}\n </AppLink>\n \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,2 +1,2 @@
|
|
|
1
|
-
import"./DAXXjFlN.chunk.js";import{y as e}from"./BftnFbcr.chunk.js";import"./DFZS3Ffo.chunk.js";import{t}from"./C2w0pmFW.chunk.js";import{t as n}from"./wrLrTezN.chunk.js";import{t as r}from"./BXTI9cmX.chunk.js";import{u as i}from"./BX0wDJmp.chunk.js";import{t as a}from"./LoQS6GjP.chunk.js";import{t as o}from"./CqrjHjAN.chunk.js";import{t as s}from"./eoAypzU3.chunk.js";import{t as c}from"./D_gWf2lC.chunk.js";import{n as l,t as u}from"./C6-aC3vu.chunk.js";import{n as d,t as f}from"./BGhJ8TEx.chunk.js";import{t as p}from"./7LGxCHGV.chunk.js";import{c as m,l as h,t as g}from"./
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import"./DAXXjFlN.chunk.js";import{y as e}from"./BftnFbcr.chunk.js";import"./DFZS3Ffo.chunk.js";import{t}from"./C2w0pmFW.chunk.js";import{t as n}from"./wrLrTezN.chunk.js";import{t as r}from"./BXTI9cmX.chunk.js";import{u as i}from"./BX0wDJmp.chunk.js";import{t as a}from"./LoQS6GjP.chunk.js";import{t as o}from"./CqrjHjAN.chunk.js";import{t as s}from"./eoAypzU3.chunk.js";import{t as c}from"./D_gWf2lC.chunk.js";import{n as l,t as u}from"./C6-aC3vu.chunk.js";import{n as d,t as f}from"./BGhJ8TEx.chunk.js";import{t as p}from"./7LGxCHGV.chunk.js";import{c as m,l as h,t as g}from"./CLvImDXv2.chunk.js";import{t as _}from"./B_-pJtOI2.chunk.js";import{t as v}from"./DbyH1eEj.chunk.js";import{t as y}from"./C9XBZFiR.chunk.js";import{t as b}from"./Tp0DOKOR.chunk.js";t();var x=n();function S(t){let n=i(o.currentUser()),S=i(n.data?.isAuthenticated&&a.video(t.id)),C=i(c.config()),w=i(f.createViewKey(t.id,d.MasterObject)),T=h(n.data?.isAuthenticated&&t.id),E=m(t.id);return u(l.getVideoMetadata({content:S.data,canonicalLink:_.getCanonicalLink(),allowIndexing:!1})),p(S,{private:v}),y(S,b),n.hasCompleted&&!n.data.isAuthenticated?(e.trigger({application:r.EMBED,action:s.Embed.LCS_LOGIN,args:[t.id],params:t.queryParams}),(0,x.jsx)(x.Fragment,{})):S.data&&n.hasCompleted&&C.hasCompleted&&w.hasCompleted&&T.hasCompleted&&E.hasCompleted?(0,x.jsx)(g,{config:C.data,video:S.data,currentUser:n.data,viewKey:w.data,pointsOfInterest:T.items,presentationSlug:null,embed:!0,showResources:!0,autoplay:t.queryParams.a===`true`,startTime:t.queryParams.t??t.queryParams.startTime,endTime:t.queryParams.endTime,playerIntegrations:E.data}):(0,x.jsx)(x.Fragment,{})}export{S as EmbeddedLcsVideoView};
|
|
2
|
+
//# sourceMappingURL=D78QEASE.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"D78QEASE.chunk.js","names":[],"sources":["../../src/apps/embed/views/embedded-lcs-video/EmbeddedLcsVideoView.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { MediaIdType } from 'libs/shared/enums/MediaIdType';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { PlayerRequests } from 'libs/shared/flight-requests/PlayerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useCannotConsumeError } from 'libs/shared/hooks/useCannotConsumeError';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Config, CurrentUser, PlayerViewKey, Video } from 'libs/shared/interfaces';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { useFetchPointsOfInterest } from 'shared/hooks/useFetchPointsOfInterest';\nimport { usePlayerIntegrations } from 'shared/hooks/usePlayerIntegrations';\nimport { SeoHelper } from 'shared/utils/SeoHelper';\nimport { LitePlayerView } from 'shared/views/lite-player/LitePlayerView';\n\nimport { PrivateEmbedError } from 'apps/embed/errors/forbidden/PrivateEmbedError';\nimport { EmbeddedDefaultErrors } from 'apps/embed/utils/EmbedDefaultErrors';\n\ninterface EmbeddedLcsVideoViewProps {\n id: string;\n queryParams?: HashObject;\n}\n\n/**\n * This view has been introduced soley for the purpose of supporting RSS and Marc21 links\n * for LCSs (Library Cataloging Systems). If you're thinking about using it for anything else\n * please talk to me first - Sha\n */\nexport function EmbeddedLcsVideoView(props: EmbeddedLcsVideoViewProps): JSX.Element {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const video = Flight.useBasicFetch<Video>(currentUser.data?.isAuthenticated && VideoRequests.video(props.id));\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const viewKey = Flight.useBasicFetch<PlayerViewKey>(PlayerRequests.createViewKey(props.id, MediaIdType.MasterObject));\n const pointsOfInterest = useFetchPointsOfInterest(currentUser.data?.isAuthenticated && props.id);\n const playerIntegrations = usePlayerIntegrations(props.id);\n\n useSetPageMetadata(PageMetadataHelper.getVideoMetadata({\n content: video.data,\n canonicalLink: SeoHelper.getCanonicalLink(),\n allowIndexing: false\n }));\n useCannotConsumeError(video, { private: PrivateEmbedError });\n useHandleObjectError(video, EmbeddedDefaultErrors);\n\n if (currentUser.hasCompleted && !currentUser.data.isAuthenticated) {\n Core.AppLinkHelper.trigger({\n application: AppChannels.EMBED,\n action: Actions.Embed.LCS_LOGIN,\n args: [props.id],\n params: props.queryParams\n });\n return <></>;\n }\n\n const hasLoaded = (\n video.data &&\n currentUser.hasCompleted &&\n config.hasCompleted &&\n viewKey.hasCompleted &&\n pointsOfInterest.hasCompleted &&\n playerIntegrations.hasCompleted\n );\n\n if (!hasLoaded) {\n return <></>;\n }\n\n return (\n <LitePlayerView\n config={config.data}\n video={video.data}\n currentUser={currentUser.data}\n viewKey={viewKey.data}\n pointsOfInterest={pointsOfInterest.items}\n presentationSlug={null}\n embed\n showResources\n autoplay={props.queryParams.a === 'true'}\n startTime={props.queryParams.t ?? props.queryParams.startTime}\n endTime={props.queryParams.endTime}\n playerIntegrations={playerIntegrations.data}\n />\n );\n}\n"],"mappings":"uwBAqCA,SAAgB,EAAqB,EAA+C,CAClF,IAAM,EAAc,EAAkC,EAAa,YAAY,CAAC,EAC1E,EAAQ,EAA4B,EAAY,MAAM,iBAAmB,EAAc,MAAM,EAAM,EAAE,CAAC,EACtG,EAAS,EAA6B,EAAe,OAAO,CAAC,EAC7D,EAAU,EAAoC,EAAe,cAAc,EAAM,GAAI,EAAY,YAAY,CAAC,EAC9G,EAAmB,EAAyB,EAAY,MAAM,iBAAmB,EAAM,EAAE,EACzF,EAAqB,EAAsB,EAAM,EAAE,EAiCzD,OA/BA,EAAmB,EAAmB,iBAAiB,CACrD,QAAS,EAAM,KACf,cAAe,EAAU,iBAAiB,EAC1C,cAAe,EACjB,CAAC,CAAC,EACF,EAAsB,EAAO,CAAE,QAAS,CAAkB,CAAC,EAC3D,EAAqB,EAAO,CAAqB,EAE7C,EAAY,cAAgB,CAAC,EAAY,KAAK,iBAChD,EAAmB,QAAQ,CACzB,YAAa,EAAY,MACzB,OAAQ,EAAQ,MAAM,UACtB,KAAM,CAAC,EAAM,EAAE,EACf,OAAQ,EAAM,WAChB,CAAC,GACM,EAAA,EAAA,IAAA,CAAA,EAAA,SAAA,CAAI,CAAA,GAIX,EAAM,MACN,EAAY,cACZ,EAAO,cACP,EAAQ,cACR,EAAiB,cACjB,EAAmB,cAQnB,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,OAAQ,EAAO,KACf,MAAO,EAAM,KACb,YAAa,EAAY,KACzB,QAAS,EAAQ,KACjB,iBAAkB,EAAiB,MACnC,iBAAkB,KAClB,MAAA,GACA,cAAA,GACA,SAAU,EAAM,YAAY,IAAM,OAClC,UAAW,EAAM,YAAY,GAAK,EAAM,YAAY,UACpD,QAAS,EAAM,YAAY,QAC3B,mBAAoB,EAAmB,IACxC,CAAA,GAjBM,EAAA,EAAA,IAAA,CAAA,EAAA,SAAA,CAAI,CAAA,CAmBf"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"./DAXXjFlN.chunk.js";import{n as e,t}from"./snXCXfT6.chunk.js";import{t as n}from"./CQyJ7YGa.chunk.js";import{t as r}from"./e57H3T-k.chunk.js";import{t as i}from"./C2w0pmFW.chunk.js";import{t as a}from"./wrLrTezN.chunk.js";import{t as o}from"./BXTI9cmX.chunk.js";import{u as s}from"./BX0wDJmp.chunk.js";import{t as c}from"./CjA4Q5pm.chunk.js";import{U as l,a as u,l as d,y as f,z as p}from"./NlCAcBdo.chunk.js";import{t as m}from"./C5j5LRut2.chunk.js";import{t as h}from"./CVHQXNzi2.chunk.js";import{t as g}from"./BrbeV-Gn2.chunk.js";import{t as _}from"./DZssmXj6.chunk.js";import{t as v}from"./BC8PeYqm.chunk.js";import{t as y}from"./LoQS6GjP.chunk.js";import{t as b}from"./CqrjHjAN.chunk.js";import{t as x}from"./eoAypzU3.chunk.js";import{t as S}from"./D_gWf2lC.chunk.js";import{t as C}from"./Bbp2U9GK.chunk.js";import{t as w}from"./C6-aC3vu.chunk.js";import{n as T,t as E}from"./BGhJ8TEx.chunk.js";import{t as D}from"./
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import"./DAXXjFlN.chunk.js";import{n as e,t}from"./snXCXfT6.chunk.js";import{t as n}from"./CQyJ7YGa.chunk.js";import{t as r}from"./e57H3T-k.chunk.js";import{t as i}from"./C2w0pmFW.chunk.js";import{t as a}from"./wrLrTezN.chunk.js";import{t as o}from"./BXTI9cmX.chunk.js";import{u as s}from"./BX0wDJmp.chunk.js";import{t as c}from"./CjA4Q5pm.chunk.js";import{U as l,a as u,l as d,y as f,z as p}from"./NlCAcBdo.chunk.js";import{t as m}from"./C5j5LRut2.chunk.js";import{t as h}from"./CVHQXNzi2.chunk.js";import{t as g}from"./BrbeV-Gn2.chunk.js";import{t as _}from"./DZssmXj6.chunk.js";import{t as v}from"./BC8PeYqm.chunk.js";import{t as y}from"./LoQS6GjP.chunk.js";import{t as b}from"./CqrjHjAN.chunk.js";import{t as x}from"./eoAypzU3.chunk.js";import{t as S}from"./D_gWf2lC.chunk.js";import{t as C}from"./Bbp2U9GK.chunk.js";import{t as w}from"./C6-aC3vu.chunk.js";import{n as T,t as E}from"./BGhJ8TEx.chunk.js";import{t as D}from"./CLvImDXv2.chunk.js";import{n as O,t as k}from"./CpFtf-tI2.chunk.js";import{t as A}from"./BxYKQEUG2.chunk.js";import{t as j}from"./jAbfamoi.chunk.js";import{t as M}from"./Z4RlHaVG.chunk.js";import{t as N}from"./tnBD84bg2.chunk.js";import{t as P}from"./D1aO6GEr.chunk.js";import{t as F}from"./C9XBZFiR.chunk.js";import{t as I}from"./IqGr9V7u2.chunk.js";import{n as L,r as R,t as z}from"./DusJhHeW2.chunk.js";i();var B=j(),V={closeButton:`_closeButton_1bg8h_1`,descriptionBorder:`_descriptionBorder_1bg8h_7`},H=a(),U=`shared.videoDetails`,W=n.encloseNamespace(U);function G(e){let{label:t,items:n,className:r}=e;return n&&n.data&&n.data.length?(0,H.jsxs)(`div`,{className:r,children:[t,`: `,n.data.map(e=>e.name).join(`, `)]}):(0,H.jsx)(H.Fragment,{})}function K(e){let{video:t}=e;if(!g.isVideo(t)&&!g.isClip(t))return(0,H.jsx)(H.Fragment,{});let n=g.getParentVideo(t);return(0,H.jsxs)(`div`,{className:t.description?`col-md-5 ps-md-3 pt-3 pt-md-0`:`col-12`,children:[(0,H.jsx)(`h2`,{className:`h6 mb-1`,children:(0,H.jsx)(O,{phrase:`details`})}),!!n.productionYear&&(0,H.jsx)(`div`,{className:`mb-1`,children:(0,H.jsx)(O,{phrase:`productionYear`,options:{year:n.productionYear}})}),(0,H.jsx)(G,{label:W(`productionCompanies`,{smartCount:n.productionCompanies?.data?.length}),items:n.productionCompanies,className:`mb-1`}),(0,H.jsx)(G,{label:W(`distributors`,{smartCount:n.distributors?.data?.length}),items:n.distributors,className:`mb-1`}),(0,H.jsx)(G,{label:W(`producers`,{smartCount:n.producers?.data?.length}),items:n.producers,className:`mb-1`}),(0,H.jsx)(G,{label:W(`directors`,{smartCount:n.directors?.data?.length}),items:n.directors,className:`mb-1`}),!!n.dateBroadcast&&(0,H.jsx)(`div`,{className:`mb-1`,children:(0,H.jsx)(O,{phrase:`dateBroadcast`,options:{date:c.format(n.dateBroadcast,`DD/MM/YYYY`)}})}),!!n.channel&&(0,H.jsx)(`div`,{className:`mb-1`,children:(0,H.jsx)(O,{phrase:`channel`,options:{channel:n.channel.name}})}),g.canViewUploadDate(e.video)&&(0,H.jsx)(`div`,{className:`mb-1`,children:(0,H.jsx)(O,{phrase:`dateUploaded`,options:{date:c.format(t.dateCreated,`DD/MM/YYYY`)}})})]})}function q(e){let{video:t,maxHeight:n=368}=e,i=g.getParentVideo(t),a=!!e.video.description,o=z(e.video)||!!i.productionYear||!!i.dateBroadcast||!!i.channel||g.canViewUploadDate(e.video),s=typeof e.onClickClose==`function`,c=typeof e.onClickShowCurriculumLinks==`function`;function l(){return e.hideTags||g.isInteractive(e.video)||!e.video.tags?.data?.length?null:e.video.tags.data}return!a&&!o?(0,H.jsx)(H.Fragment,{}):(0,H.jsx)(k.Provider,{value:U,children:(0,H.jsxs)(`div`,{className:`rounded border p-3 mb-3 position-relative`,children:[(0,H.jsx)(B.Scrollbars,{autoHeight:!0,autoHeightMax:n,children:(0,H.jsxs)(`div`,{className:`row g-0`,children:[a&&(0,H.jsxs)(`div`,{className:o?`${V.descriptionBorder} pe-3 col-md-7`:`col-12`,children:[(0,H.jsxs)(`div`,{className:`d-flex align-items-center`,children:[(0,H.jsx)(`h2`,{className:`h6 mb-1`,children:(0,H.jsx)(O,{phrase:`description`})}),(0,H.jsx)(I,{text:t.description,title:t.name,className:`ps-2`,onLaunch:e.onLaunchImmersiveReader,onExit:e.onExitImmersiveReader,analyticsOptions:{location:f.PlayPage,entity:d.Video,actionType:p.Click,descriptor:u.LaunchImmersiveReader},analyticsData:{id:t.id,type:`description`}})]}),(0,H.jsx)(`p`,{className:`mb-0`,dangerouslySetInnerHTML:{__html:r.sanitize(N.linkifyText(e.video.description,{nl2br:!0}))}}),(0,H.jsx)(L,{tags:l(),...R.getTagActionProps(e.getTagAppLink,null,e.suppressInteractivity),className:`mt-1`}),c&&(0,H.jsx)(C,{onClick:e.onClickShowCurriculumLinks,className:`cursor-pointer d-inline-block fw-semibold text-info mt-2 mb-1`,children:(0,H.jsx)(O,{namespace:U,phrase:`seeCurriculumLinks`})})]}),o&&(0,H.jsx)(K,{...e})]})}),s&&(0,H.jsx)(`button`,{type:`button`,className:`btn-close ${V.closeButton}`,"aria-label":`Close`,onClick:e.onClickClose})]})})}var J=`userManager.studentsVideo`,Y=n.encloseNamespace(J);function X(e,t){return t.toString()===h.Clip.toString()?_.clip(e):t.toString()===h.Interactive.toString()?v.interactiveMetadata(e):y.video(e)}function Z(e){return e.toString()===h.Clip.toString()?`messageClip`:e.toString()===h.Interactive.toString()?`messageInteractive`:`messageVideo`}function Q(r){let i=s(P.getUser(r.userId)),a=s(X(r.id,r.typeId)),c=s(E.createViewKey(r.id,T.MasterObject)),u=s(S.config()),d=s(b.currentUser());F([i,a]),w({title:i.data?n.getPhrase(J,`pageTitle`,{name:m.getFullName(i.data)}):``});function h(){let e={entity:g.getAnalyticsEntity(a.data),location:f.ViewStudentVideos},t={id:a.data.id},n=[];return g.isVideo(a.data)&&n.push({order:1,label:Y(`download`),appLink:{application:o.VIDEOS,action:x.Videos.DOWNLOAD_VIDEO,args:[a.data.id]},analyticsOptions:{...e,actionType:p.Download,workflowPhase:l.Start},analyticsData:t}),n.push({order:2,label:Y(`delete`),appLink:{application:o.USER_MANAGER,action:x.UserManager.DELETE_STUDENTS_VIDEO,args:[r.id,a.data.id],params:{typeId:a.data.typeId}},className:`text-danger`,analyticsOptions:{...e,actionType:p.Delete,workflowPhase:l.Start},analyticsData:t}),n}return i.hasCompleted&&a.hasCompleted&&c.hasCompleted&&u.hasCompleted&&d.hasCompleted?(0,H.jsxs)(`div`,{className:`px-3`,children:[(0,H.jsx)(`div`,{className:`alert text-dark bg-light-blue px-2 rounded d-flex flex-column flex-lg-row justify-content-between mb-3 align-items-center`,role:`alert`,children:(0,H.jsxs)(`div`,{className:`d-flex align-items-center`,children:[(0,H.jsx)(t,{svg:A,size:e.Standard,className:`me-2 svg-container`}),(0,H.jsx)(`div`,{className:`w-100`,children:(0,H.jsx)(`p`,{className:`fw-semibold mb-0`,children:Y(Z(r.typeId),{name:m.getFullName(i.data),yearGroup:i.data.masterYearGroup?.name})})})]})}),(0,H.jsx)(`div`,{className:`mb-3`,children:(0,H.jsx)(D,{config:u.data,video:a.data,currentUser:d.data,viewKey:c.data,presentationSlug:null})}),(0,H.jsxs)(`div`,{className:`d-flex justify-content-between align-items-center mb-2`,children:[(0,H.jsx)(`div`,{children:(0,H.jsx)(`h1`,{className:`h3 d-inline-flex m-0 mb-2`,children:a.data.name})}),(0,H.jsx)(M,{actions:h(),actionsDropdownClassName:`btn btn-outline-dark`})]}),(0,H.jsx)(q,{video:a.data})]}):(0,H.jsx)(H.Fragment,{})}export{Q as StudentsVideoView};
|
|
2
|
+
//# sourceMappingURL=DER8311r.chunk.js.map
|