@clickview/lite 0.49.0-rc.4 → 0.49.0-rc.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundles.json +1 -1
- package/dist/languages/en.json +1 -1
- package/dist/scripts/1539-10d3590409-lite.chunk.js +2 -0
- package/dist/scripts/1539-10d3590409-lite.chunk.js.map +1 -0
- package/dist/scripts/194-d192c1e455-lite.chunk.js +2 -0
- package/dist/scripts/194-d192c1e455-lite.chunk.js.map +1 -0
- package/dist/scripts/2265-b6e093cf57-lite.chunk.js +2 -0
- package/dist/scripts/2265-b6e093cf57-lite.chunk.js.map +1 -0
- package/dist/scripts/{3042-32e303014a-lite.chunk.js → 3042-f9d67ac0a3-lite.chunk.js} +2 -2
- package/dist/scripts/3042-f9d67ac0a3-lite.chunk.js.map +1 -0
- package/dist/scripts/32-2abdd88255-lite.chunk.js +2 -0
- package/dist/scripts/32-2abdd88255-lite.chunk.js.map +1 -0
- package/dist/scripts/{3854-9e1422da99-lite.chunk.js → 3854-49852130b4-lite.chunk.js} +2 -2
- package/dist/scripts/3854-49852130b4-lite.chunk.js.map +1 -0
- package/dist/scripts/{4060-77244f1012-lite.chunk.js → 4060-4ab06f9f5e-lite.chunk.js} +2 -2
- package/dist/scripts/4060-4ab06f9f5e-lite.chunk.js.map +1 -0
- package/dist/scripts/4113-81b4e4a350-lite.chunk.js +2 -0
- package/dist/scripts/4113-81b4e4a350-lite.chunk.js.map +1 -0
- package/dist/scripts/{4291-4ea61b3610-lite.chunk.js → 4291-72cf3ca37d-lite.chunk.js} +2 -2
- package/dist/scripts/4291-72cf3ca37d-lite.chunk.js.map +1 -0
- package/dist/scripts/{1539-df427c5b98-lite.chunk.js → 6723-b34bba9ac1-lite.chunk.js} +2 -2
- package/dist/scripts/6723-b34bba9ac1-lite.chunk.js.map +1 -0
- package/dist/scripts/7268-42c8c2cdb5-lite.chunk.js +2 -0
- package/dist/scripts/7268-42c8c2cdb5-lite.chunk.js.map +1 -0
- package/dist/scripts/{9437-d9c671743c-lite.chunk.js → 9437-2bb4c632ca-lite.chunk.js} +2 -2
- package/dist/scripts/9437-2bb4c632ca-lite.chunk.js.map +1 -0
- package/dist/scripts/{bundle-0f5cfcd378.min.js → bundle-854cdefb2d.min.js} +3 -3
- package/dist/scripts/bundle-854cdefb2d.min.js.map +1 -0
- package/package.json +1 -1
- package/dist/scripts/1539-df427c5b98-lite.chunk.js.map +0 -1
- package/dist/scripts/194-918a27a783-lite.chunk.js +0 -2
- package/dist/scripts/194-918a27a783-lite.chunk.js.map +0 -1
- package/dist/scripts/2265-0174bf9c8c-lite.chunk.js +0 -2
- package/dist/scripts/2265-0174bf9c8c-lite.chunk.js.map +0 -1
- package/dist/scripts/3042-32e303014a-lite.chunk.js.map +0 -1
- package/dist/scripts/32-cf9b8ba599-lite.chunk.js +0 -2
- package/dist/scripts/32-cf9b8ba599-lite.chunk.js.map +0 -1
- package/dist/scripts/3854-9e1422da99-lite.chunk.js.map +0 -1
- package/dist/scripts/4060-77244f1012-lite.chunk.js.map +0 -1
- package/dist/scripts/4113-c75e9be23a-lite.chunk.js +0 -2
- package/dist/scripts/4113-c75e9be23a-lite.chunk.js.map +0 -1
- package/dist/scripts/4291-4ea61b3610-lite.chunk.js.map +0 -1
- package/dist/scripts/6723-ece2125bab-lite.chunk.js +0 -2
- package/dist/scripts/6723-ece2125bab-lite.chunk.js.map +0 -1
- package/dist/scripts/7268-a8484f7697-lite.chunk.js +0 -2
- package/dist/scripts/7268-a8484f7697-lite.chunk.js.map +0 -1
- package/dist/scripts/9437-d9c671743c-lite.chunk.js.map +0 -1
- package/dist/scripts/bundle-0f5cfcd378.min.js.map +0 -1
- /package/dist/scripts/{bundle-0f5cfcd378.min.js.LICENSE.txt → bundle-854cdefb2d.min.js.LICENSE.txt} +0 -0
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/1539-df427c5b98-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/breadcrumbs/Breadcrumbs.tsx","file:///app/packages/libs/shared/src/components/video-list/partial-loading/partial-video-list.scss","file:///app/packages/libs/shared/src/components/video-list/partial-loading/PartialVideoList.tsx","file:///app/packages/libs/shared/src/utils/PartialLoadingHelper.ts","file:///app/packages/projects/lite/src/shared/hooks/usePresentationAudiences.ts","file:///app/packages/projects/lite/src/shared/hooks/useVideoFeatureAccess.ts","file:///app/packages/projects/lite/src/shared/views/video-media/VideoInteractivesView.tsx","file:///app/packages/projects/lite/src/shared/views/video-media/VideoMediaAppLinks.ts","file:///app/packages/projects/lite/src/shared/views/video-media/partial-loading/partial-video-media-view.scss","file:///app/packages/projects/lite/src/shared/views/video-media/partial-loading/PartialVideoMediaView.tsx","file:///app/node_modules/react-bootstrap/esm/Row.js"],"sourcesContent":["import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { PartialLoadingHelper } from 'libs/shared/utils/PartialLoadingHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { SvgContainer, SvgContainerSize } from '../svg-container/SvgContainer';\n\nexport interface Breadcrumb {\n name: string;\n appLink?: Core.AppLink;\n active?: boolean;\n}\n\ninterface BreadcrumbItemProps {\n breadcrumb: Breadcrumb;\n withBackIcon?: boolean;\n}\n\nexport const BreadcrumbItem = ({ breadcrumb: { name, appLink, active }, withBackIcon }: BreadcrumbItemProps) => (\n <li className={`breadcrumb-item${active ? ' active' : ''}`}>\n {active\n ? <strong>{name}</strong>\n : <AppLink appLink={appLink}>\n {withBackIcon && <SvgContainer svgName={cvSvgLibrary.ChevronLeft} size={SvgContainerSize.Small} />}\n <span className={withBackIcon ? 'ms-2' : ''}>{name}</span>\n </AppLink>\n }\n </li>\n);\n\ninterface BreadcrumbsProps {\n breadcrumbs: Breadcrumb[];\n}\n\nexport const Breadcrumbs = ({ breadcrumbs }: BreadcrumbsProps) => {\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n\n const length = breadcrumbs?.length;\n\n if (!length || (isMobile && length < 2))\n return <></>;\n\n if (isMobile)\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n <BreadcrumbItem breadcrumb={breadcrumbs[length - 2]} withBackIcon />\n </ol>\n </nav>\n );\n\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n {breadcrumbs.map((b, idx) => <BreadcrumbItem key={idx} breadcrumb={b} />)}\n </ol>\n </nav>\n );\n};\n\nexport const PartialBreadcrumbs = React.memo(function({ numItems = 3 }: { numItems?: number; }) {\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n\n if (isMobile) {\n return (\n <div className='partial-loading-background' style={{ height: '1.3125rem', width: '6rem' }} />\n );\n }\n\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n {PartialLoadingHelper.getPartialLoadingItems({ numItems }).map(({ width }, idx) => (\n <li key={idx} className='breadcrumb-item'>\n <span className='d-inline-block partial-loading-background' style={{ width }} dangerouslySetInnerHTML={{ __html: ' ' }} />\n </li>\n ))}\n </ol>\n </nav>\n );\n});","// extracted by mini-css-extract-plugin\nexport default {\"partialOptions\":\"Gufgq\",\"partialName\":\"SicQQ\",\"partialDescription\":\"dPGMq\",\"partialThumbnail\":\"vZrnb\",\"partialDragHandle\":\"iq73R\"};","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { VideoListHelper } from 'libs/shared/components/video-list/VideoListHelper';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\n\nimport styles from './partial-video-list.scss';\n\ninterface PartialVideoListProps {\n withReordering?: boolean;\n numVideos?: number;\n allowBulkActions?: boolean;\n}\n\nPartialVideoList.defaultProps = {\n numVideos: 15\n};\n\nexport function PartialVideoList(props: PartialVideoListProps): JSX.Element {\n return (\n <div className='mx-2'>\n {Array(props.numVideos).fill(null).map((_, i) => (\n <div className='d-flex' key={i}>\n {props.allowBulkActions && <div className='form-check pe-3 pe-sm-2 mx-0 mx-md-2' />}\n <PartialVideoItem {...props} />\n </div>\n ))}\n </div>\n );\n}\n\nexport function PartialVideoItem(props: PartialVideoListProps): JSX.Element {\n const breakpoints = useBreakpoints();\n\n const size = VideoListHelper.getSize(breakpoints, 'md');\n const isSmall = size === 'sm';\n\n const withDragHandle = props.withReordering && !breakpoints.xs;\n\n return (\n <Row className={`${isSmall ? '' : 'py-2'} flex-grow-1`}>\n <Col {...VideoListHelper.getThumbnailColumns()} className={`flex-column align-items-flex-start ${isSmall ? `pb-2 pe-1` : 'mb-1 pe-3 pe-md-2'}`}>\n <Row>\n {!!withDragHandle && (\n <div className='d-flex align-items-center justify-content-center col-2'>\n <div className={`partial-loading-background ${styles.partialDragHandle}`} />\n </div>\n )}\n <Col xs={VideoListHelper.getThumbnailColSize(withDragHandle)}>\n <div className={`partial-loading-background ${isSmall ? 'rounded' : 'rounded-3'} ${styles.partialThumbnail}`} />\n </Col>\n </Row>\n </Col>\n <Col {...VideoListHelper.getDetailsColumns()} className={isSmall ? 'pb-2' : 'px-2'}>\n <div className={`partial-loading-background mb-1 ${styles.partialName}`} />\n <div className={`partial-loading-background ${styles.partialDescription}`} />\n </Col>\n </Row>\n );\n}\n\n","const DEFAULT_PARTIAL_LOADING_OPTIONS: PartialLoadingOptions = {\n numItems: 5,\n minWidth: 50, // px\n maxWidth: 100 // px\n};\n\nexport interface PartialLoadingOptions {\n numItems?: number;\n minWidth?: number;\n maxWidth?: number;\n}\n\ninterface PartialLoadingItem {\n width: string;\n}\n\nexport const PartialLoadingHelper = {\n getPartialLoadingItems(options: PartialLoadingOptions = {}): PartialLoadingItem[] {\n const opts = {\n ...DEFAULT_PARTIAL_LOADING_OPTIONS,\n ...options\n };\n\n const getRandomFilterWidth = () => Math.max(Math.floor(Math.random() * opts.maxWidth), opts.minWidth);\n\n return [...Array(opts.numItems)].map(() => ({ width: `${getRandomFilterWidth()}px` }));\n }\n};","import { Flight } from 'libs/common/react/index';\n\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\nimport { usePresentation } from 'shared/hooks/usePresentation';\n\nexport const usePresentationAudiences = () => {\n const { activePresentation, getFallbackPresentation } = usePresentation({ redirectOnError: true });\n\n const presentation = activePresentation || getFallbackPresentation();\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n !!presentation &&\n AudienceRequests.presentationAudiences(presentation.id)\n );\n\n return audiences;\n};","import { Flight } from 'libs/common/react/index';\n\nimport { LocalPermissionName, PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { Config } from 'libs/shared/interfaces/models/Config';\n\nimport { LiteRouteHelper } from 'shared/utils/LiteRouteHelper';\n\nexport interface VideoFeaturesHash {\n canViewGlance: boolean;\n canViewResources: boolean;\n canViewInteractives: boolean;\n canViewClips: boolean;\n canUseActions: boolean;\n canViewPublicLayout: boolean;\n canNavigate: boolean;\n canViewCurriculumLinks: boolean;\n canViewResourceItems: boolean;\n canWatchPublicly: (videoId: string) => boolean;\n}\n\nexport function useVideoFeatureAccess() {\n const { hasPermissions, hasLocalPermissions } = usePermissions();\n const { hasProduct } = useProducts();\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const hasNP = hasProduct(ProductId.Primary);\n\n function showPublicLayout(): boolean {\n /**\n * Authenticated users should never see the placeholder\n */\n if (hasLocalPermissions(LocalPermissionName.WatchVideos))\n return false;\n\n /**\n * Accessing a play page unathenticated will have different contextual behabviours:\n * - For a share page, the user should see the video and never the placeholder\n * - For a public browsing page (ie. using a route-prefix) they should see the placeholder\n */\n return LiteRouteHelper.hasRegionPrefix();\n }\n\n /**\n * Publicly available video ids are maintained on the backend config. \n */\n function canWatchPublicly(videoId: string): boolean {\n if (!videoId)\n return false;\n\n return !!config.data?.allowedPublicVideos?.[videoId];\n }\n\n return {\n canWatchPublicly,\n canViewGlance: hasPermissions(PermissionName.ViewVideoGlance),\n canViewResources: true,\n canViewInteractives: hasNP && hasPermissions(PermissionName.ViewVideoInteractives),\n canViewClips: hasNP && hasPermissions(PermissionName.ViewVideoClips),\n canViewCurriculumLinks: hasPermissions(PermissionName.ViewCurriculums),\n canUseActions: hasLocalPermissions(LocalPermissionName.UseVideoActions),\n canViewPublicLayout: showPublicLayout(),\n canViewResourceItems: hasLocalPermissions(LocalPermissionName.ViewVideoResourceItems),\n canNavigate: hasNP\n };\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { Breadcrumb, Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { VideoList } from 'libs/shared/components/video-list/VideoList';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { RelatedVideosContext } from 'libs/shared/enums/RelatedVideosContext';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { Config, CurrentUser, Video, YearGroup } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\nimport { usePresentationAudiences } from 'shared/hooks/usePresentationAudiences';\nimport { useVideoFeatureAccess } from 'shared/hooks/useVideoFeatureAccess';\nimport { InteractiveHelpers } from 'shared/utils/InteractiveHelper';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\nimport { PartialVideoMediaView } from 'shared/views/video-media/partial-loading/PartialVideoMediaView';\nimport { VideoMediaAppLinks } from 'shared/views/video-media/VideoMediaAppLinks';\n\nimport { SeriesAppLinkHelper } from 'apps/series/SeriesAppLinkHelper';\n\nconst namespace = 'shared.videoMedia';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface VideoInteractivesViewProps {\n videoId: string;\n}\n\nexport function VideoInteractivesView(props: VideoInteractivesViewProps): JSX.Element {\n const { videoId } = props;\n const { setFavourite, canFavourite } = useLiteFavourites(LocationContext.VideoThumbnail);\n \n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem });\n const featureAccess = useVideoFeatureAccess();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const video = Flight.useBasicFetch<Video>(\n VideoRequests.video(videoId, null, currentUser.data.id)\n );\n const content = video.data?.interactives?.data;\n const count = content?.length || 0;\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const title = `${getPhrase('interactivesHeading')} (${count || ''})`;\n\n const audiences = usePresentationAudiences();\n const { hasPermissions } = usePermissions();\n\n const breadcrumbs: Breadcrumb[] = [{\n name: video.data?.name,\n appLink: {\n ...VideoMediaAppLinks.playVideo,\n args: [ videoId, TextHelper.slugify(video.data?.name) ]\n }\n }, {\n name: title,\n appLink: {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.VIDEO_INTERACTIVES,\n args: [videoId]\n },\n active: true\n }];\n\n function redirectToPlaypage(): void {\n Core.AppLinkHelper.trigger({\n ...VideoMediaAppLinks.playVideo,\n args: [ videoId, TextHelper.slugify(video.data?.name) ]\n }, { replace: true });\n }\n\n React.useEffect(() => {\n if (!featureAccess.canViewInteractives) {\n redirectToPlaypage();\n }\n }, [featureAccess.canViewInteractives]);\n\n if (!video.data || !content?.length || !config.hasCompleted)\n return <PartialVideoMediaView />;\n\n return (\n <VideoActionsContext.Provider value={videoActions}>\n <div className='px-3'>\n <h1 className='h2 mb-2'>{title}</h1>\n \n <div className='mb-2'>\n <Breadcrumbs breadcrumbs={breadcrumbs}/>\n </div>\n\n <VideoList\n videos={content}\n yearGroups={yearGroups.data}\n getVideoAppLink={(video, opts) => VideoAppLinkHelper.getAppLink(video, {\n ...opts,\n context: RelatedVideosContext.Widget,\n contextId: props.videoId\n })}\n hasPermissions={hasPermissions}\n getSubTextAppLink={video => SeriesAppLinkHelper.getSeriesAppLink(video.series)}\n setFavourite={setFavourite}\n canFavourite={canFavourite}\n presentationAudiences={audiences.data}\n getPreviewQuestionsAppLink={interactive => InteractiveHelpers.getPreviewQuestionsAppLink(interactive)}\n imageCdnUrl={config.data?.imageCdnUrl}\n />\n </div>\n </VideoActionsContext.Provider>\n );\n}","\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nexport const VideoMediaAppLinks = {\n playVideo: {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PLAY_VIDEO\n },\n playClip: {\n application: AppChannels.CLIPS,\n action: Actions.Clips.PLAY_CLIP\n }\n};","// extracted by mini-css-extract-plugin\nexport default {\"partialHeading\":\"okxfx\"};","import React from 'react';\n\nimport { PartialBreadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { PartialVideoList } from 'libs/shared/components/video-list/partial-loading/PartialVideoList';\n\nimport styles from './partial-video-media-view.scss';\n\nexport function PartialVideoMediaView(): JSX.Element {\n return (\n <div className='px-3'>\n <div className={`partial-loading-background mb-2 ${styles.partialHeading}`} />\n <div className='mb-2'>\n <PartialBreadcrumbs/>\n </div>\n <PartialVideoList />\n </div>\n );\n}","\"use client\";\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { useBootstrapPrefix, useBootstrapBreakpoints, useBootstrapMinBreakpoint } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst Row = /*#__PURE__*/React.forwardRef(({\n bsPrefix,\n className,\n // Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n as: Component = 'div',\n ...props\n}, ref) => {\n const decoratedBsPrefix = useBootstrapPrefix(bsPrefix, 'row');\n const breakpoints = useBootstrapBreakpoints();\n const minBreakpoint = useBootstrapMinBreakpoint();\n const sizePrefix = `${decoratedBsPrefix}-cols`;\n const classes = [];\n breakpoints.forEach(brkPoint => {\n const propValue = props[brkPoint];\n delete props[brkPoint];\n let cols;\n if (propValue != null && typeof propValue === 'object') {\n ({\n cols\n } = propValue);\n } else {\n cols = propValue;\n }\n const infix = brkPoint !== minBreakpoint ? `-${brkPoint}` : '';\n if (cols != null) classes.push(`${sizePrefix}${infix}-${cols}`);\n });\n return /*#__PURE__*/_jsx(Component, {\n ref: ref,\n ...props,\n className: classNames(className, decoratedBsPrefix, ...classes)\n });\n});\nRow.displayName = 'Row';\nexport default Row;"],"names":["BreadcrumbItem","breadcrumb","name","appLink","active","withBackIcon","className","svgName","size","S","Breadcrumbs","breadcrumbs","isMobile","length","map","b","idx","key","PartialBreadcrumbs","numItems","style","height","width","dangerouslySetInnerHTML","__html","PartialVideoList","props","Array","numVideos","fill","_","i","allowBulkActions","PartialVideoItem","breakpoints","useBreakpoints","isSmall","VideoListHelper","withDragHandle","withReordering","xs","Row","Col","defaultProps","DEFAULT_PARTIAL_LOADING_OPTIONS","minWidth","maxWidth","PartialLoadingHelper","getPartialLoadingItems","options","opts","Math","max","floor","random","usePresentationAudiences","redirectOnError","activePresentation","getFallbackPresentation","presentation","id","useVideoFeatureAccess","hasPermissions","hasLocalPermissions","hasProduct","config","hasNP","canWatchPublicly","videoId","data","allowedPublicVideos","canViewGlance","canViewResources","canViewInteractives","canViewClips","canViewCurriculumLinks","canUseActions","canViewPublicLayout","canViewResourceItems","canNavigate","getPhrase","VideoInteractivesView","u","setFavourite","canFavourite","videoActions","location","featureAccess","currentUser","yearGroups","isAuthenticated","customerId","video","content","interactives","count","title","audiences","args","application","action","replace","redirectToPlaypage","hasCompleted","value","videos","getVideoAppLink","context","contextId","getSubTextAppLink","series","presentationAudiences","getPreviewQuestionsAppLink","interactive","imageCdnUrl","VideoMediaAppLinks","playVideo","playClip","PartialVideoMediaView","bsPrefix","as","Component","ref","decoratedBsPrefix","minBreakpoint","sizePrefix","classes","forEach","brkPoint","propValue","cols","infix","push","displayName"],"sourceRoot":""}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[194],{93978:(e,a,t)=>{t.r(a),t.d(a,{PlaySharedVideoView:()=>B});var d=t(32735),i=t(20354),s=t(65858),n=t(16714),c=t(89454),r=t(39151),o=t(1666),l=t(28907),u=t(31949),v=t(1575),m=t(27995),h=t(22902),p=t(79612),I=t(76753),g=t(3042),y=t(82817),C=t(7179),P=t(49948),F=t(36873),V=t(27638),b=t(86698),k=t(35014),f=t(97816),x=t(33192),w=t(16857);function B(e){var a,t,B,q,j,A,L,M,T=(0,V.u)(s.LZ.VideoThumbnail),U=T.setFavourite,G=T.canFavourite,N=(0,h.T)().hasPermissions,_=(0,b.y)().activePresentation,E=i.a.useBasicFetch(u.N.currentUser()),O=i.a.useBasicFetch(v.R.sharedVideo(e.objectId,e.shareId,E.data.id)),S=i.a.useBasicFetch(r.L.config()),R=(0,F.k)({video:O.data,context:e.queryParams.context,contextId:e.queryParams.contextId,moviesAndTv:e.queryParams.mtv,currentUser:E.data}),Z=(0,P.l)(e.objectId),z=i.a.useBasicFetch((null===(t=null===(a=O.data)||void 0===a?void 0:a.glance)||void 0===t?void 0:t.theme)?l.r.themeImages(O.data.glance.theme,O.data.glance.type):null),D=i.a.useBasicFetch(!!_&&c.O.audiencesByPresentationId(_.id)),H=i.a.useBasicFetch((null===(B=E.data)||void 0===B?void 0:B.isAuthenticated)&&o.h.yearGroups(E.data.customerId)),J=N(n.C.ViewVideoGlance)&&(null===(j=null===(q=O.data)||void 0===q?void 0:q.glance)||void 0===j?void 0:j.theme);(0,p.M)(I.CG.getVideoMetadata({content:O.data,canonicalLink:x.f.getCanonicalLink({stripPresentationSlug:!0}),allowIndexing:!1})),(0,f.V)(null!==(A=R.videos)&&void 0!==A?A:[]),(0,m.b)(O,{private:w.m}),(0,C.P)({id:e.objectId,app:"videos",shareId:e.shareId});var K=(0,y.M)(e.objectId),Q=O.data&&E.hasCompleted&&S.hasCompleted&&Z.hasCompleted,W=(0,k.I)();return Q?d.createElement("div",{className:"px-3"},d.createElement(g.j,{video:O.data,yearGroups:H.data,curriculums:K,imageCdnUrl:S.data.imageCdnUrl,relatedVideos:R,currentUser:E.data,setFavourite:U,canFavourite:G,pointsOfInterest:null==Z?void 0:Z.items,playNext:null===(L=e.queryParams)||void 0===L?void 0:L.playNext,shareId:e.shareId,glanceTheme:z.data,glanceLoaded:!J||z.hasCompleted,featureAccess:W,audiences:D.data,params:e.queryParams,canManageVideoAccess:N(n.C.ManageVideoAccess),tableOfContentsId:null===(M=e.queryParams)||void 0===M?void 0:M.scrollTo})):d.createElement(d.Fragment,null)}}}]);
|
|
2
|
-
//# sourceMappingURL=194-918a27a783-lite.chunk.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/194-918a27a783-lite.chunk.js","mappings":"+aAiCM,SAAUA,EAAoBC,G,oBAClC,GAAuC,IAAAC,GAAkB,qBAAjDC,EAAY,EAAZA,aAAcC,EAAY,EAAZA,aAEdC,GAAmB,SAAnBA,eAGNC,GACE,SADFA,mBAGIC,EAAc,kBAAkC,mBAChDC,EAAQ,kBACZ,gBAA0BP,EAAMQ,SAAUR,EAAMS,QAASH,EAAYI,KAAKC,KAEtEC,EAAS,kBAA6B,cACtCC,GAAgB,OAAoB,CACxCN,MAAOA,EAAMG,KACbI,QAASd,EAAMe,YAAYD,QAC3BE,UAAWhB,EAAMe,YAAYC,UAC7BC,YAAajB,EAAMe,YAAYG,IAC/BZ,YAAaA,EAAYI,OAErBS,GAAmB,OAAyBnB,EAAMQ,UAClDY,EAAc,mBAA8C,QAAlB,EAAU,QAAV,EAAAb,EAAMG,YAAI,eAAEW,cAAM,eAAEC,OAChE,gBAA0Bf,EAAMG,KAAKW,OAAOC,MAAOf,EAAMG,KAAKW,OAAOE,MAAQ,MAC3EC,EAAY,oBACdnB,GACF,8BAA2CA,EAAmBM,KAE1Dc,EAAa,mBACD,QAAhB,EAAAnB,EAAYI,YAAI,eAAEgB,kBAAmB,eAA4BpB,EAAYI,KAAKiB,aAG9EC,EAAmBxB,EAAe,uBACpB,QAAlB,EAAU,QAAV,EAAAG,EAAMG,YAAI,eAAEW,cAAM,eAAEC,QAEtB,OAAmB,sBAAoC,CACrDO,QAAStB,EAAMG,KACfoB,cAAe,qBAA2B,CAAEC,uBAAuB,IACnEC,eAAe,MAGjB,OAAkC,QAApB,EAAAnB,EAAcoB,cAAM,QAAI,KACtC,OAAsB1B,EAAO,CAAE2B,QAAS,OACxC,OAAa,CAAEvB,GAAIX,EAAMQ,SAAU2B,IAAK,SAAU1B,QAAST,EAAMS,UAEjE,IAAM2B,GAAc,OAAepC,EAAMQ,UAEnC6B,EACJ9B,EAAMG,MACNJ,EAAYgC,cACZ1B,EAAO0B,cACPnB,EAAiBmB,aAGbC,GAAgB,SAEtB,OAAKF,EAIH,uBAAKG,UAAU,QACb,gBAAC,IAAQ,CACPjC,MAAOA,EAAMG,KACbe,WAAYA,EAAWf,KACvB0B,YAAaA,EACbK,YAAa7B,EAAOF,KAAK+B,YACzB5B,cAAeA,EACfP,YAAaA,EAAYI,KACzBR,aAAcA,EACdC,aAAcA,EACdgB,iBAAkBA,aAAgB,EAAhBA,EAAkBuB,MACpCC,SAA2B,QAAjB,EAAA3C,EAAMe,mBAAW,eAAE4B,SAC7BlC,QAAST,EAAMS,QACfW,YAAaA,EAAYV,KACzBkC,cAAehB,GAAoBR,EAAYkB,aAC/CC,cAAeA,EACff,UAAWA,EAAUd,KACrBmC,OAAQ7C,EAAMe,YACd+B,qBAAsB1C,EAAe,uBACrC2C,kBAAoC,QAAjB,EAAA/C,EAAMe,mBAAW,eAAEiC,YAtBnC,gCA0BX,C","sources":["file:///app/packages/projects/lite/src/apps/share/views/play-shared-video/PlaySharedVideoView.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { ThemeRequests } from 'libs/shared/flight-requests/ThemeRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useCannotConsumeError } from 'libs/shared/hooks/useCannotConsumeError';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Config, CurrentUser, PresentationAudience, Theme, Video, YearGroup } from 'libs/shared/interfaces';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { PlayPage } from 'shared/components/play-page/PlayPage';\nimport { useCurriculums } from 'shared/hooks/useCurriculums';\nimport { useDeepLinks } from 'shared/hooks/useDeepLinks';\nimport { useFetchPointsOfInterest } from 'shared/hooks/useFetchPointsOfInterest';\nimport { useGetRelatedVideos } from 'shared/hooks/useGetRelatedVideos';\nimport { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\nimport { usePresentation } from 'shared/hooks/usePresentation';\nimport { useVideoFeatureAccess } from 'shared/hooks/useVideoFeatureAccess';\nimport { useVideoMixin } from 'shared/hooks/useVideoMixin';\nimport { SeoHelper } from 'shared/utils/SeoHelper';\n\nimport { ShareLinkPrivateError } from 'apps/share/errors/share-link-private/ShareLinkPrivateError';\nimport { ShareLinkViewProps } from 'apps/share/interfaces/ShareLinkViewProps';\n\nexport function PlaySharedVideoView(props: ShareLinkViewProps): React.ReactElement {\n const { setFavourite, canFavourite } = useLiteFavourites(LocationContext.VideoThumbnail);\n\n const { hasPermissions } = usePermissions();\n\n const {\n activePresentation\n } = usePresentation();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const video = Flight.useBasicFetch<Video>(\n VideoRequests.sharedVideo(props.objectId, props.shareId, currentUser.data.id)\n );\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const relatedVideos = useGetRelatedVideos({\n video: video.data,\n context: props.queryParams.context,\n contextId: props.queryParams.contextId,\n moviesAndTv: props.queryParams.mtv,\n currentUser: currentUser.data\n });\n const pointsOfInterest = useFetchPointsOfInterest(props.objectId);\n const glanceTheme = Flight.useBasicFetch<Theme>(video.data?.glance?.theme\n ? ThemeRequests.themeImages(video.data.glance.theme, video.data.glance.type) : null);\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n !!activePresentation &&\n AudienceRequests.audiencesByPresentationId(activePresentation.id)\n );\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const shouldFetchTheme = hasPermissions(PermissionName.ViewVideoGlance) &&\n video.data?.glance?.theme;\n\n useSetPageMetadata(PageMetadataHelper.getVideoMetadata({\n content: video.data,\n canonicalLink: SeoHelper.getCanonicalLink({ stripPresentationSlug: true }),\n allowIndexing: false\n }));\n\n useVideoMixin(relatedVideos.videos ?? []);\n useCannotConsumeError(video, { private: ShareLinkPrivateError });\n useDeepLinks({ id: props.objectId, app: 'videos', shareId: props.shareId });\n\n const curriculums = useCurriculums(props.objectId);\n\n const dataLoaded = (\n video.data &&\n currentUser.hasCompleted &&\n config.hasCompleted &&\n pointsOfInterest.hasCompleted\n );\n\n const featureAccess = useVideoFeatureAccess();\n\n if (!dataLoaded)\n return <></>;\n\n return (\n <div className='px-3'>\n <PlayPage\n video={video.data}\n yearGroups={yearGroups.data}\n curriculums={curriculums}\n imageCdnUrl={config.data.imageCdnUrl}\n relatedVideos={relatedVideos}\n currentUser={currentUser.data}\n setFavourite={setFavourite}\n canFavourite={canFavourite}\n pointsOfInterest={pointsOfInterest?.items}\n playNext={props.queryParams?.playNext}\n shareId={props.shareId}\n glanceTheme={glanceTheme.data}\n glanceLoaded={!shouldFetchTheme || glanceTheme.hasCompleted}\n featureAccess={featureAccess}\n audiences={audiences.data}\n params={props.queryParams}\n canManageVideoAccess={hasPermissions(PermissionName.ManageVideoAccess)}\n tableOfContentsId={props.queryParams?.scrollTo}\n />\n </div>\n );\n}"],"names":["PlaySharedVideoView","props","u","setFavourite","canFavourite","hasPermissions","activePresentation","currentUser","video","objectId","shareId","data","id","config","relatedVideos","context","queryParams","contextId","moviesAndTv","mtv","pointsOfInterest","glanceTheme","glance","theme","type","audiences","yearGroups","isAuthenticated","customerId","shouldFetchTheme","content","canonicalLink","stripPresentationSlug","allowIndexing","videos","private","app","curriculums","dataLoaded","hasCompleted","featureAccess","className","imageCdnUrl","items","playNext","glanceLoaded","params","canManageVideoAccess","tableOfContentsId","scrollTo"],"sourceRoot":""}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[2265],{94644:(e,a,t)=>{t.d(a,{r:()=>u});var n=t(50242),i=t(81886),d=t(67058),r=t(14553),o=t(49267),s=t(49075),c={notFound:d.d,forbidden:{rating:r.q,yearLevel:r.q,region:o.a,privacy:r.q},badRequest:s._};function u(e){var a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e){var d;d="number"==typeof e?e:e.status;var r=Object.assign(Object.assign({},c),a);d&&i.Q.Ry.isStatusCodeError(d)&&(d!==n.o.NotFound?d!==n.o.Forbidden?t.badRequest||i.Q.Ry.throw(new r.badRequest):t.forbidden||i.Q.Ry.throw(new r.forbidden.privacy):t.notFound||i.Q.Ry.throw(new r.notFound))}}},91286:(e,a,t)=>{t.d(a,{v:()=>r});var n=t(32735),i=t(94644);function d(e){return e.map((function(e){return e.statusCode})).join(":")}function r(e,a,t){var r=Array.isArray(e)?e:[e];(0,n.useEffect)((function(){r.forEach((function(e){(0,i.r)(e.statusCode,a,t)}))}),[d(r),a,t])}},69630:(e,a,t)=>{t.r(a),t.d(a,{PlayView:()=>Q});var n=t(32735),i=t(50242),d=t(81886),r=t(23481),o=t(20354),s=t(28400),c=t(65858),u=t(78417),l=t(16714),v=t(67058),h=t(61990),p=t(33803),f=t(89454),g=t(39151),m=t(1666),y=t(98064),C=t(28907),F=t(31949),b=t(1575),w=t(27995),P=t(91286),I=t(22902),R=t(79612),V=t(76753),q=t(3042),x=t(14070),A=t(97291),B=t(82817),L=t(7179),k=t(49948),E=t(36873),O=t(27638),M=t(86698),N=t(35014),T=t(97816),_=t(33192),j=r.T.encloseNamespace("shared.play"),G={notFound:h.l,forbidden:{privacy:p.G}};function Q(e){var a,t,r,h,p,Q,U=e.queryParams,D=U.context,S=U.contextId,H=U.playNext,Y=U.mtv,Z=(0,O.u)(c.LZ.PlayPage),z=Z.setFavourite,J=Z.canFavourite,K=(0,I.T)().hasPermissions,W=(0,M.y)().activePresentation,X=(0,N.I)(),$=o.a.useBasicFetch(y.D.streamableLearning()),ee=o.a.useBasicFetch(F.N.currentUser()),ae=o.a.useBasicFetch(b.R.video(e.id,null,null===(a=ee.data)||void 0===a?void 0:a.id)),te=o.a.useBasicFetch(g.L.config()),ne=o.a.useBasicFetch((null===(t=ee.data)||void 0===t?void 0:t.isAuthenticated)&&m.h.yearGroups(ee.data.customerId)),ie=o.a.useBasicFetch(W&&f.O.audiencesByPresentationId(W.id)),de=K(l.C.ViewVideoGlance)&&(null===(h=null===(r=ae.data)||void 0===r?void 0:r.glance)||void 0===h?void 0:h.theme),re=o.a.useBasicFetch(de&&C.r.themeImages(ae.data.glance.theme,ae.data.glance.type)),oe=o.a.useBasicFetch(ae.statusCode===i.o.Forbidden&&b.R.video(e.id,u.r.StripMetadata)),se=(0,B.M)(e.id,!0),ce=(0,E.k)({video:ae.data,context:D,contextId:S,moviesAndTv:Y,currentUser:ee.data}),ue=(0,k.l)(e.id,!0),le=o.a.useBasicFetch(b.R.regionAlternatives(e.id));return(0,R.M)(V.CG.getVideoMetadata({content:ae.data,regionAlternatives:le.data,phraseContext:{phraseHandler:j,titlePhrase:"pageTitle",descriptionPhrase:"pageDescription"},canonicalLink:_.f.getCanonicalLink({stripPresentationSlug:!0}),allowIndexing:_.f.allowIndexing(),hrefLang:_.f.getContentHrefLang(le.data,(function(e,a){return{application:A.O.VIDEOS,action:x.e.Videos.PLAY_VIDEO,args:[e,s.m.slugify(a)]}}))})),(0,P.v)(ae,G,{forbidden:!0}),(0,T.V)(null!==(p=ce.videos)&&void 0!==p?p:[]),(0,L.P)({id:e.id,app:"videos"}),(0,w.b)(oe),n.useEffect((function(){var e;ae.data&&$.data&&(null===(e=ae.data.libraries)||void 0===e?void 0:e.data.find((function(e){return e.id===$.data.objectId})))&&d.Q.Ry.throw(new v.d)}),[ae.hasCompleted,$.hasCompleted]),ae.data&&ee.hasCompleted&&te.hasCompleted&&ue.hasCompleted?n.createElement("div",{className:"px-4"},n.createElement(q.j,{video:ae.data,yearGroups:ne.data,curriculums:se,glanceTheme:re.data,glanceLoaded:!de||re.hasCompleted,relatedVideos:ce,setFavourite:z,canFavourite:J,imageCdnUrl:te.data.imageCdnUrl,currentUser:ee.data,pointsOfInterest:ue.items,playNext:H,featureAccess:X,audiences:ie.data,params:e.queryParams,canManageVideoAccess:K(l.C.ManageVideoAccess),tableOfContentsId:null===(Q=e.queryParams)||void 0===Q?void 0:Q.scrollTo})):n.createElement(n.Fragment,null)}Q.defaultProps={queryParams:{}}}}]);
|
|
2
|
-
//# sourceMappingURL=2265-0174bf9c8c-lite.chunk.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/2265-0174bf9c8c-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/hooks/UseHandleObjectError.ts","file:///app/packages/projects/lite/src/shared/views/play/PlayView.tsx"],"sourcesContent":["import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import { useEffect } from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { handleHttpError, HttpErrorMap, IgnoreHttpErrorMap } from 'libs/shared/errors/handlers/HttpErrorHandlers';\n\nfunction generateCacheKey(flightObjs: Array<Flight.Response<any>>): string {\n return flightObjs.map(obj => obj.statusCode).join(':');\n}\n\n// TODO: Change this to just `useHandleHttpError` and only accept a status code.\nexport function useHandleObjectError(\n _flightObjs: Flight.Response<any> | Array<Flight.Response<any>>,\n customErrors?: HttpErrorMap,\n ignoreErrors?: IgnoreHttpErrorMap\n): void {\n const flightObjs = Array.isArray(_flightObjs) ? _flightObjs : [_flightObjs];\n\n useEffect(() => {\n flightObjs.forEach(obj => {\n handleHttpError(obj.statusCode, customErrors, ignoreErrors);\n });\n }, [ generateCacheKey(flightObjs), customErrors, ignoreErrors ]);\n}","import * as React from 'react';\n\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { PermissionFilterOption } from 'libs/shared/enums/PermissionFilterOption';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { VideoNotFoundError } from 'libs/shared/errors/videos/video-not-found/VideoNotFoundError';\nimport { VideoPrivateError } from 'libs/shared/errors/videos/video-private/VideoPrivateError';\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { LibraryRequests } from 'libs/shared/flight-requests/LibraryRequests';\nimport { ThemeRequests } from 'libs/shared/flight-requests/ThemeRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useCannotConsumeError } from 'libs/shared/hooks/useCannotConsumeError';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Config, CurrentUser, PresentationAudience, RegionAlternative, Theme, Video, YearGroup } from 'libs/shared/interfaces';\nimport { PlayViewQueryParams } from 'libs/shared/interfaces/query-params/PlayViewQueryParams';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { PlayPage } from 'shared/components/play-page/PlayPage';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { useCurriculums } from 'shared/hooks/useCurriculums';\nimport { useDeepLinks } from 'shared/hooks/useDeepLinks';\nimport { useFetchPointsOfInterest } from 'shared/hooks/useFetchPointsOfInterest';\nimport { useGetRelatedVideos } from 'shared/hooks/useGetRelatedVideos';\nimport { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\nimport { usePresentation } from 'shared/hooks/usePresentation';\nimport { useVideoFeatureAccess } from 'shared/hooks/useVideoFeatureAccess';\nimport { useVideoMixin } from 'shared/hooks/useVideoMixin';\nimport { SeoHelper } from 'shared/utils/SeoHelper';\n\nconst namespace = 'shared.play';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst videoErrors = {\n notFound: VideoNotFoundError,\n forbidden: {\n privacy: VideoPrivateError\n }\n};\n\ninterface PlayViewProps {\n id: string;\n queryParams?: PlayViewQueryParams;\n}\n\nPlayView.defaultProps = {\n queryParams: {}\n};\n\nexport function PlayView(props: PlayViewProps): React.ReactElement {\n const { context, contextId, playNext, mtv } = props.queryParams;\n\n const { setFavourite, canFavourite } = useLiteFavourites(LocationContext.PlayPage);\n\n const { hasPermissions } = usePermissions();\n\n const { activePresentation } = usePresentation();\n\n const featureAccess = useVideoFeatureAccess();\n\n const streamableLibrary = Flight.useBasicFetch<HashObject>(LibraryRequests.streamableLearning());\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const video = Flight.useBasicFetch<Video>(\n VideoRequests.video(props.id, null, currentUser.data?.id)\n );\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n \n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n activePresentation &&\n AudienceRequests.audiencesByPresentationId(activePresentation.id)\n );\n\n const shouldFetchTheme = hasPermissions(PermissionName.ViewVideoGlance) &&\n video.data?.glance?.theme;\n \n const glanceTheme = Flight.useBasicFetch<Theme>(\n shouldFetchTheme &&\n ThemeRequests.themeImages(video.data.glance.theme, video.data.glance.type)\n );\n\n const strippedVideo = Flight.useBasicFetch<Video>(video.statusCode === HttpStatus.Forbidden &&\n VideoRequests.video(props.id, PermissionFilterOption.StripMetadata));\n\n const curriculums = useCurriculums(props.id, true);\n\n const relatedVideos = useGetRelatedVideos({\n video: video.data,\n context,\n contextId,\n moviesAndTv: mtv,\n currentUser: currentUser.data\n });\n const pointsOfInterest = useFetchPointsOfInterest(props.id, true);\n\n const regionAlternatives = Flight.useBasicFetch<RegionAlternative[]>(\n VideoRequests.regionAlternatives(props.id)\n );\n\n useSetPageMetadata(PageMetadataHelper.getVideoMetadata({\n content: video.data,\n regionAlternatives: regionAlternatives.data,\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n },\n canonicalLink: SeoHelper.getCanonicalLink({ stripPresentationSlug: true }),\n allowIndexing: SeoHelper.allowIndexing(),\n hrefLang: SeoHelper.getContentHrefLang(regionAlternatives.data, (id: string, name: string) => ({\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PLAY_VIDEO,\n args: [ id, TextHelper.slugify(name) ]\n }))\n }));\n\n useHandleObjectError(video, videoErrors, { forbidden: true });\n useVideoMixin(relatedVideos.videos ?? []);\n useDeepLinks({ id: props.id, app: 'videos' });\n useCannotConsumeError(strippedVideo);\n\n React.useEffect(() => {\n if (!video.data || !streamableLibrary.data)\n return;\n\n if (video.data.libraries?.data.find(library => library.id === streamableLibrary.data.objectId))\n Core.ErrorHelper.throw(new NotFoundError());\n }, [ video.hasCompleted, streamableLibrary.hasCompleted ]);\n\n const dataLoaded = (\n video.data &&\n currentUser.hasCompleted &&\n config.hasCompleted &&\n pointsOfInterest.hasCompleted\n );\n\n if (!dataLoaded)\n return <></>;\n\n return (\n <div className='px-4'>\n <PlayPage\n video={video.data}\n yearGroups={yearGroups.data}\n curriculums={curriculums}\n glanceTheme={glanceTheme.data}\n glanceLoaded={!shouldFetchTheme || glanceTheme.hasCompleted}\n relatedVideos={relatedVideos}\n setFavourite={setFavourite}\n canFavourite={canFavourite}\n imageCdnUrl={config.data.imageCdnUrl}\n currentUser={currentUser.data}\n pointsOfInterest={pointsOfInterest.items}\n playNext={playNext}\n featureAccess={featureAccess}\n audiences={audiences.data}\n params={props.queryParams}\n canManageVideoAccess={hasPermissions(PermissionName.ManageVideoAccess)}\n tableOfContentsId={props.queryParams?.scrollTo}\n />\n </div>\n );\n}"],"names":["defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","generateCacheKey","flightObjs","map","obj","join","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","Array","isArray","useEffect","forEach","getPhrase","videoErrors","PlayView","props","queryParams","context","contextId","playNext","mtv","u","setFavourite","canFavourite","hasPermissions","activePresentation","featureAccess","streamableLibrary","currentUser","video","id","data","config","yearGroups","isAuthenticated","customerId","audiences","shouldFetchTheme","glance","theme","glanceTheme","type","strippedVideo","curriculums","relatedVideos","moviesAndTv","pointsOfInterest","regionAlternatives","content","phraseContext","phraseHandler","titlePhrase","descriptionPhrase","canonicalLink","stripPresentationSlug","allowIndexing","hrefLang","name","application","action","args","videos","app","libraries","find","library","objectId","hasCompleted","className","glanceLoaded","imageCdnUrl","items","params","canManageVideoAccess","tableOfContentsId","scrollTo","defaultProps"],"sourceRoot":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/3042-32e303014a-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/curriculum-links/CurriculumLinkItem.tsx","file:///app/packages/libs/shared/src/enums/CurriculumType.ts","file:///app/packages/libs/shared/src/components/curriculum-links/CurriculumLinksEmptyState.tsx","file:///app/packages/libs/shared/src/components/curriculum-links/CurriculumLinks.tsx","file:///app/packages/libs/shared/src/components/curriculum-links/partial-loading/PartialCurriculumLinks.tsx","file:///app/packages/libs/shared/src/components/curriculum-links/partial-loading/partial-curriculum-links.scss","file:///app/packages/libs/shared/src/components/tags/PartialTagItem.tsx","file:///app/packages/libs/shared/src/components/copyright-disclaimer/copyright-disclaimer.scss","file:///app/packages/libs/shared/src/components/copyright-disclaimer/CopyrightDisclaimer.tsx","file:///app/packages/libs/shared/src/components/curriculum-links/CurriculumLinksWithScrollbar.tsx","file:///app/packages/projects/lite/src/shared/components/play-page/PlayPage.tsx","file:///app/packages/libs/shared/src/components/curriculum-links/curriculum-links.scss"],"sourcesContent":["import React from 'react';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { Presentation } from 'libs/shared/interfaces';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\n\nimport styles from './curriculum-links.scss';\n\ninterface CurriculumLinkItemProps {\n data: Presentation;\n onChangeCurriculum: (id: string) => any;\n selected: boolean;\n}\n\nexport function CurriculumLinkItem(props: CurriculumLinkItemProps): JSX.Element {\n const { data: curriculumTag } = props;\n\n return (\n <DivButton\n key={curriculumTag.id}\n className={`p-1 pe-2 rounded-pill d-inline-flex align-items-center cursor-pointer ${styles.tag} ${props.selected ? styles.selected : ''}`}\n onClick={() => props.onChangeCurriculum(curriculumTag.id.toString())}\n >\n <div className={`bg-white ${styles.cover} rounded-circle border`}>\n <img\n src={ImageHelper.createUrl(curriculumTag.cover.url, { size: ImageSize.Small })}\n alt={curriculumTag.name}\n className='rounded-circle'\n />\n </div>\n <div className='ms-2'>\n {curriculumTag.name}\n </div>\n </DivButton>\n );\n}","export enum CurriculumType {\n Subject = 'CurriculumSubject',\n Audience = 'CurriculumAudience',\n Area = 'CurriculumArea',\n Leaf = 'CurriculumLeaf'\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'shared.curriculumLinks';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface CurriculumLinksEmptyStateProps {\n emptyStateUrl: string;\n}\n\nexport function CurriculumLinksEmptyState(props: CurriculumLinksEmptyStateProps): JSX.Element {\n return (\n <EmptyState className='pt-3'>\n <EmptyState.Image src={props.emptyStateUrl} altText={getPhrase('emptyInfo')} size='small'/>\n <EmptyState.Heading>\n <Text namespace={namespace} phrase='emptyHeading' />\n </EmptyState.Heading>\n <EmptyState.Info>\n <Text namespace={namespace} phrase='emptyInfo' />\n </EmptyState.Info>\n </EmptyState>\n );\n}","import React from 'react';\n\nimport { PartialCurriculumLinks } from 'libs/shared/components/curriculum-links/partial-loading/PartialCurriculumLinks';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { CurriculumType } from 'libs/shared/enums/CurriculumType';\nimport { Curriculum } from 'libs/shared/interfaces';\n\nimport { CurriculumLinksEmptyState } from './CurriculumLinksEmptyState';\n\nimport styles from './curriculum-links.scss';\n\nconst BRACKET_SEGMENT_REGEX = /(.*)\\s\\((.*)?\\)/i;\n\nconst namespace = 'shared.curriculumLinks';\n\nconst BASE_PILL_CLASS = 'text-nowrap font-size-normal rounded-pill py-1 px-2 my-0 d-inline-block';\n\ninterface CurriculumStructure {\n [CurriculumType.Subject]: Curriculum<CurriculumType.Subject>;\n [CurriculumType.Audience]: Curriculum<CurriculumType.Audience>;\n areasAndLeaves: Array<{\n [CurriculumType.Area]: Curriculum<CurriculumType.Area>[];\n [CurriculumType.Leaf]: Curriculum<CurriculumType.Leaf>[];\n }>;\n}\n\ninterface CurriculumLeafProps {\n leaf: Curriculum<CurriculumType.Leaf>;\n codeWidth: number;\n trySetMaxCodeWidth: React.Dispatch<React.SetStateAction<number>>;\n uiContainsCodes: boolean;\n}\n\nfunction CurriculumLeaf(props: CurriculumLeafProps): JSX.Element {\n function getCurriculumCodeClass(): string {\n const baseClass = BASE_PILL_CLASS + ' bg-white border';\n\n // If a leaf has no code but the rest of the UI has leaf nodes w/ codes, we show a special \"No code\" pill\n if (!props.leaf.name && props.uiContainsCodes)\n return baseClass + ' border-secondary text-secondary';\n\n return baseClass + ' border-dark';\n }\n\n const codeRef = React.useRef<HTMLDivElement>();\n\n React.useEffect(() => {\n if (!codeRef.current)\n return;\n\n const { width } = codeRef.current.getBoundingClientRect();\n\n props.trySetMaxCodeWidth(width);\n }, [codeRef.current]);\n\n return (\n <div className='d-flex'>\n {(() => {\n if (!props.leaf.description)\n return <p className='m-0' dangerouslySetInnerHTML={{ __html: props.leaf.name }} />;\n\n /**\n * If a leaf has no code but the rest of the UI has leaf nodes\n * with codes, we show a special \"No code\" pill. Example: https://imgur.com/3L1Ela3\n */\n if (!props.leaf.name && props.uiContainsCodes) {\n return (\n <>\n <div\n className='me-1 align-self-start'\n style={{ minWidth: props.codeWidth ? `${props.codeWidth}px` : 'auto' }}\n >\n <h5 ref={codeRef} className={getCurriculumCodeClass()}>\n <Text namespace={namespace} phrase='noCode' />\n </h5>\n </div>\n <p className='m-0 align-self-center' dangerouslySetInnerHTML={{ __html: props.leaf.description }} />\n </>\n );\n }\n\n /**\n * If a leaf has no code and the rest of the UI leaf nodes have no code, we just\n * display the description with a bullet point. Example: https://imgur.com/jzJvmWs\n */\n if (!props.leaf.name && !props.uiContainsCodes)\n return <p className='m-0' dangerouslySetInnerHTML={{ __html: props.leaf.description }} />;\n\n return (\n <>\n <div\n className='me-1 align-self-start'\n style={{ minWidth: props.codeWidth ? `${props.codeWidth}px` : 'auto' }}\n >\n <h5 ref={codeRef} className={getCurriculumCodeClass()}>{props.leaf.name}</h5>\n </div>\n <p className='m-0 align-self-center' dangerouslySetInnerHTML={{ __html: props.leaf.description }} />\n </>\n );\n })()}\n </div>\n );\n}\n\ninterface CurriculumSubjectProps {\n linkSet: CurriculumStructure;\n codeWidth: number;\n trySetMaxCodeWidth: React.Dispatch<React.SetStateAction<number>>;\n}\n\nfunction CurriculumSubject(props: CurriculumSubjectProps): JSX.Element {\n const areaAndLeafSets: { [areaText: string]: Curriculum<CurriculumType.Leaf>[]; } = {};\n\n let uiContainsCodes = false;\n\n props.linkSet.areasAndLeaves.forEach(areaAndLeafSet => {\n const areaText = areaAndLeafSet[CurriculumType.Area].map(ca => ca.name).join(' - ');\n\n if (areaAndLeafSets[areaText]) {\n areaAndLeafSet[CurriculumType.Leaf].forEach(leaf => {\n areaAndLeafSets[areaText].push(leaf);\n\n // We need the info on if _any_ leaf node has a code in it. See why in the comments in `<CurriculumLeaf />`\n if (leaf.name)\n uiContainsCodes = true;\n });\n\n return;\n }\n\n areaAndLeafSets[areaText] = areaAndLeafSet[CurriculumType.Leaf];\n });\n\n function getAudienceText(): string {\n const audienceSegment = props.linkSet[CurriculumType.Audience].name;\n const subjectSegment = props.linkSet[CurriculumType.Subject].name;\n\n /**\n * In some curriculums, such as the UK curriculum, the audience string may contain a year group\n * in brackets. For example, it may be \"Lower Key Stage 2 (Year 4)\".\n * This regex will pull that segment out if it exists.\n */\n const audienceBracketSegments = audienceSegment.match(BRACKET_SEGMENT_REGEX);\n\n if (audienceBracketSegments)\n return `${audienceBracketSegments[1]} • ${audienceBracketSegments[2]} • ${subjectSegment}`;\n\n return `${audienceSegment} • ${subjectSegment}`;\n }\n\n function getLeafStyleClass(leaf: Curriculum<CurriculumType.Leaf>): string {\n const className = 'mb-2';\n\n if (!leaf.name && !uiContainsCodes)\n return className + ' ms-4 ' + styles.leafDescriptionOnly;\n\n return className;\n }\n\n return (\n <>\n <h3 className={`${BASE_PILL_CLASS} text-white bg-dark-blue fw-normal me-1 mb-2`}>\n {getAudienceText()}\n </h3>\n\n <div className={`me-2 ${styles.curriculumSubject}`}>\n {Object.keys(areaAndLeafSets).map((areaText, i) => {\n return (\n <div key={i} className={styles.areaLeafSet} >\n {areaText && <h4 className='mb-1 font-size-normal'>{areaText}</h4>}\n <ul className='list-unstyled'>\n {areaAndLeafSets[areaText].map(leaf => (\n <li key={leaf.id} className={getLeafStyleClass(leaf)}>\n <CurriculumLeaf\n leaf={leaf}\n codeWidth={props.codeWidth}\n trySetMaxCodeWidth={props.trySetMaxCodeWidth}\n uiContainsCodes={uiContainsCodes}\n />\n </li>\n ))}\n </ul>\n </div>\n );\n })}\n </div>\n </>\n );\n}\n\ninterface CurriculumLinksProps {\n curriculumLinks?: Curriculum[][];\n emptyStateUrl: string;\n onChangeCurriculum?: (id: string) => void;\n}\n\nexport function CurriculumLinks(props: CurriculumLinksProps): JSX.Element {\n const [ codeWidth, setCodeWidth ] = React.useState(0);\n\n function trySetMaxCodeWidth(width: number): void {\n /**\n * The width of the curriculum code column should be identical for each leaf node, meaning\n * the leaf description text will be perfectly vertically aligned all the way down.\n * See here for example: https://imgur.com/MbganZf\n * \n * This is achieved by us setting the state for the maximum code width, and forcing all\n * smaller codes to abide by that max width.\n * \n * This value is used in the `<CurriculumLeaf />` component.\n */\n setCodeWidth(currentVal => {\n if (currentVal >= width)\n return currentVal;\n\n return width;\n });\n }\n\n /**\n * Here, we're taking the structure of links from the backend, and restructuring it in a way\n * that resembles the structure of our UI more closely. The general idea is:\n * \n * CurriculumAudience - CurriculumSubject\n * CurriculumAreas\n * CurriculumLeaves\n */\n const curriculumLinkSets: { [subjectAndAudienceIdKey: string]: CurriculumStructure } = {};\n\n props.curriculumLinks?.forEach(linkSet => {\n let subject: Curriculum<CurriculumType.Subject> = null;\n let audience: Curriculum<CurriculumType.Audience> = null;\n const areas: Curriculum<CurriculumType.Area>[] = [];\n const leaves: Curriculum<CurriculumType.Leaf>[] = [];\n\n linkSet.forEach(curriculumObj => {\n switch (curriculumObj.type) {\n case CurriculumType.Subject:\n subject = curriculumObj as Curriculum<CurriculumType.Subject>;\n break;\n case CurriculumType.Audience:\n audience = curriculumObj as Curriculum<CurriculumType.Audience>;\n break;\n case CurriculumType.Area:\n areas.push(curriculumObj as Curriculum<CurriculumType.Area>);\n break;\n case CurriculumType.Leaf:\n leaves.push(curriculumObj as Curriculum<CurriculumType.Leaf>);\n break;\n default:\n break;\n }\n });\n\n const key = `${subject.id}:${audience.id}`;\n\n if (curriculumLinkSets[key]) {\n curriculumLinkSets[key].areasAndLeaves.push({\n [CurriculumType.Area]: areas,\n [CurriculumType.Leaf]: leaves\n });\n\n return;\n }\n\n curriculumLinkSets[key] = {\n [CurriculumType.Subject]: subject,\n [CurriculumType.Audience]: audience,\n areasAndLeaves: [{\n [CurriculumType.Area]: areas,\n [CurriculumType.Leaf]: leaves\n }]\n };\n });\n\n if (!props.curriculumLinks)\n return <PartialCurriculumLinks />;\n\n if (!props.curriculumLinks?.length) {\n return <CurriculumLinksEmptyState emptyStateUrl={props.emptyStateUrl} />;\n }\n\n return (\n <ul className='list-unstyled m-0'>\n {Object.keys(curriculumLinkSets).map((linkSetKey, i) => (\n <li key={`linkset-${i}`} className={styles.curriculumSet}>\n <CurriculumSubject\n linkSet={curriculumLinkSets[linkSetKey]}\n trySetMaxCodeWidth={trySetMaxCodeWidth}\n codeWidth={codeWidth}\n />\n </li>\n ))}\n </ul>\n );\n}","import React from 'react';\n\nimport styles from './partial-curriculum-links.scss';\n\nconst PartialCurriculumLinkSection = () => (\n <>\n <div className={`partial-loading-background rounded-pill py-1 px-2 d-inline-block me-1 mb-2 ${styles.audience}`} />\n <div>\n <div className={`partial-loading-background mb-1 ${styles.area}`} />\n\n <div className='mb-2 d-flex'>\n <div className={`me-1 align-self-start ${styles.code}`}>\n <div className={`partial-loading-background rounded-pill py-1 px-2 d-inline-block w-100 h-100`} />\n </div>\n \n <div className={`partial-loading-background ${styles.description}`} />\n </div>\n </div>\n </>\n);\n\nexport function PartialCurriculumLinks(): JSX.Element {\n return (\n <div>\n <div className='mb-3'>\n <PartialCurriculumLinkSection />\n </div>\n\n <div className='mb-3'>\n <PartialCurriculumLinkSection />\n </div>\n\n <div>\n <PartialCurriculumLinkSection />\n </div>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"audience\":\"vDcrq\",\"area\":\"GXhoW\",\"code\":\"goKaS\",\"description\":\"vFew6\"};","import React from 'react';\n\nimport styles from './tags.scss';\n\ninterface PartialTagItemProps {\n tagClass?: string;\n}\n\nexport const PartialTagItem = React.memo(function({ tagClass = '' }: PartialTagItemProps): JSX.Element {\n const classNames = `partial-loading-background d-inline-block rounded-pill py-1 px-2 mb-1 me-1 text-nowrap ${tagClass} ${styles.partialTag}`;\n\n return (\n <div className='mt-1'>\n <span className={classNames}> </span>\n </div>\n );\n});","// extracted by mini-css-extract-plugin\nexport default {\"copyrightDisclaimer\":\"z8YoI\",\"overlayContainer\":\"eJDbJ\"};","import React from 'react';\nimport { Overlay } from 'react-bootstrap';\nimport { Placement } from 'react-bootstrap/esm/types';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { useHoverIntent } from 'libs/shared/hooks/UseHover';\n\nimport styles from './copyright-disclaimer.scss';\n\nconst namespace = 'shared.copyrightDisclaimer';\n\nconst CONTAINER_HEIGHT = 150; // px\n\ninterface CopyrightDisclaimerProps {\n placement: Placement;\n overflowPlacement?: Placement;\n className?: string;\n}\n\nexport function CopyrightDisclaimer(props: CopyrightDisclaimerProps) {\n const [ ref, isHovering ] = useHoverIntent<HTMLDivElement>({});\n\n function preventOverflow() {\n const spaceBelow = document.documentElement.clientHeight - ref.current?.getBoundingClientRect().bottom;\n\n return spaceBelow < CONTAINER_HEIGHT;\n }\n\n return (\n <div ref={ref} className={props.className}>\n <p className={`${styles.copyrightDisclaimer} mb-1`}><Text namespace={namespace} phrase='copyrightDisclaimer' /></p>\n <Overlay\n target={ref.current}\n show={isHovering}\n placement={props.overflowPlacement && preventOverflow() ? props.overflowPlacement : props.placement}\n >\n <div className={`${styles.overlayContainer} mw-100 bg-white border rounded-3 p-2`}>\n <p><Text namespace={namespace} phrase='warning' /></p>\n <p className='fw-semibold mb-0'><Text namespace={namespace} phrase='sharing' /></p>\n </div>\n </Overlay>\n </div>\n );\n}","import React from 'react';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, PresentationDescriptor, UserAction } from 'libs/analytics/interfaces';\n\nimport { CurriculumLinkItem } from 'libs/shared/components/curriculum-links/CurriculumLinkItem';\nimport { PartialTagItem } from 'libs/shared/components/tags/PartialTagItem';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { DynamicWidget } from 'libs/shared/components/widgets/dynamic-widget';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { CurriculumData, Presentation, Video } from 'libs/shared/interfaces';\n\nimport { PartialCurriculumLinks } from './partial-loading/PartialCurriculumLinks';\nimport { CurriculumLinks } from './CurriculumLinks';\n\nconst namespace = 'shared.curriculumLinks';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface CurriculumLinksWithScrollbarProps {\n video: Video;\n curriculums: CurriculumData;\n emptyStateUrl: string;\n height?: number;\n}\n\nexport function CurriculumLinksWithScrollbar(props: CurriculumLinksWithScrollbarProps): JSX.Element {\n const {\n hasLoaded,\n activeCurriculum,\n availableCurriculums,\n curriculumLinks,\n updateCurriculum\n } = props.curriculums;\n\n const [ selectedCurriculum, setSelectedCurriculum ] = React.useState<Presentation>();\n\n const alerts = useAlerts();\n\n React.useEffect(() => {\n if (!hasLoaded)\n return;\n\n if (!selectedCurriculum)\n setSelectedCurriculum(activeCurriculum ?? ArrayHelper.first(availableCurriculums));\n }, [ activeCurriculum?.id, hasLoaded ]);\n\n function onChangeCurriculum(curriculumId: string): void {\n const newCurriculum = availableCurriculums.find(c => c.id.toString() === curriculumId);\n\n if (!newCurriculum?.id)\n return;\n\n if (selectedCurriculum?.id?.toString() === newCurriculum?.id?.toString())\n return;\n\n setSelectedCurriculum(newCurriculum);\n\n const onError = () => {\n // If the request to change curriculum fails, we reset the select state and alert the user\n setSelectedCurriculum(selectedCurriculum);\n alerts.error(getPhrase('updateFailed'));\n };\n\n const onSuccess = () => {\n AnalyticsHelper.logUserAction({\n id: newCurriculum.id,\n name: newCurriculum.id,\n description: newCurriculum.description,\n videoId: props.video.id,\n videoName: props.video.name\n }, {\n entity: EntityType.Presentation,\n actionType: UserAction.Select,\n descriptor: PresentationDescriptor.Curriculum,\n location: LocationContext.PlayPage\n });\n };\n\n updateCurriculum(newCurriculum, onSuccess, onError);\n }\n\n return (\n <>\n <h2 className='h5 me-2 h-100'>\n <Text namespace={namespace} phrase='heading' />\n </h2>\n <div className='mb-2'>\n <DynamicWidget\n collection={selectedCurriculum?.id ? props.curriculums.nonEmptyCurriculums : null}\n childClassName='flex-shrink-0'\n childComponent={props => {\n return (\n <CurriculumLinkItem\n {...props}\n selected={selectedCurriculum?.id?.toString() === props.data.id.toString()}\n onChangeCurriculum={onChangeCurriculum}\n />\n );\n }}\n partialLoadingComponent={() => <PartialTagItem />}\n widgetDataDeps={[selectedCurriculum?.id?.toString()]}\n />\n </div>\n\n <div className='rounded border mb-4 position-relative'>\n <Scrollbars autoHeight autoHeightMax={props.height}>\n <div className='p-3'>\n {!hasLoaded\n ? <PartialCurriculumLinks />\n : (\n <CurriculumLinks\n curriculumLinks={curriculumLinks}\n emptyStateUrl={props.emptyStateUrl}\n onChangeCurriculum={onChangeCurriculum}\n />\n )}\n </div>\n </Scrollbars>\n </div>\n </>\n );\n}","import React from 'react';\n\nimport { CopyrightDisclaimer } from 'libs/shared/components/copyright-disclaimer/CopyrightDisclaimer';\nimport { CurriculumLinksWithScrollbar } from 'libs/shared/components/curriculum-links/CurriculumLinksWithScrollbar';\nimport { PlayPageResources } from 'libs/shared/components/play-page/resources/PlayPageResources';\nimport { LanguageNamespaceContext } from 'libs/shared/components/text/Text';\nimport { VideoAtAGlance } from 'libs/shared/components/video-at-a-glance/VideoAtAGlance';\nimport { hasGlanceData } from 'libs/shared/components/video-at-a-glance/VideoAtAGlanceUtils';\nimport { VideoDetailsWithScrollbar } from 'libs/shared/components/video-details/VideoDetails';\nimport { VideoDetailsPartial } from 'libs/shared/components/video-details/VideoDetailsPartial';\nimport { MINIMUM_GLANCE_HEIGHT } from 'libs/shared/constants/MinimumGlanceHeight';\nimport { SeoConstants } from 'libs/shared/constants/SeoConstants';\nimport { GlobalPlayerConsumer } from 'libs/shared/context/player-context/components/GlobalPlayerConsumer';\nimport { usePlayerContext } from 'libs/shared/context/player-context/PlayerContext';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useTableOfContentsScroll } from 'libs/shared/hooks/useTableOfContentsScroll';\nimport { CanFavouriteFunc, CurrentUser, CurriculumData, FavouriteFunc, PointOfInterest, PresentationAudience, Theme, Video, YearGroup } from 'libs/shared/interfaces';\nimport { PlayViewQueryParams } from 'libs/shared/interfaces/query-params/PlayViewQueryParams';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { ArchivedBanner } from 'shared/components/play-page/ArchivedBanner';\nimport { PlayPageTitleAndActions } from 'shared/components/play-page/components/title-and-actions/PlayPageTitleAndActions';\nimport { RestrictionBanner } from 'shared/components/play-page/RestrictionBanner';\nimport { PlayerPlaceholder } from 'shared/components/player-placeholder/PlayerPlaceholder';\nimport { RelatedVideos } from 'shared/components/related-videos/RelatedVideos';\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { RelatedVideosHash } from 'shared/hooks/useGetRelatedVideos';\nimport { VideoFeaturesHash } from 'shared/hooks/useVideoFeatureAccess';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { PlayPageClips } from './components/clips/PlayPageClips';\nimport { PlayPageInteractives } from './components/interactives/PlayPageInteractives';\nimport { getAppLinks } from './PlayPageUtils';\n\nconst namespace = 'shared.playPage';\n\ninterface PlayPageProps {\n video: Video;\n yearGroups: YearGroup[];\n imageCdnUrl: string;\n relatedVideos: RelatedVideosHash;\n audiences: PresentationAudience[];\n setFavourite?: FavouriteFunc;\n canFavourite?: CanFavouriteFunc;\n glanceTheme?: Theme;\n glanceLoaded: boolean;\n currentUser: CurrentUser;\n pointsOfInterest?: PointOfInterest[];\n playNext: boolean;\n shareId?: string;\n curriculums: CurriculumData;\n featureAccess: VideoFeaturesHash;\n params?: PlayViewQueryParams;\n canManageVideoAccess: boolean;\n tableOfContentsId: string;\n}\n\nexport function PlayPage(props: PlayPageProps): JSX.Element {\n const playerContext = usePlayerContext();\n\n const { hasPermissions } = usePermissions();\n const { canConsume } = VideoHelper.getCanBeConsumed(props.video);\n const canViewPublicly = props.featureAccess.canWatchPublicly(props.video.id);\n\n const isArchived = VideoHelper.isVideoTypeArchived(props.video);\n const hasStudentExperience = hasPermissions(PermissionName.StudentExperience);\n\n const resourcesRef = React.useRef<HTMLDivElement>(null);\n const interactivesRef = React.useRef<HTMLDivElement>(null);\n\n useTableOfContentsScroll([\n resourcesRef.current,\n interactivesRef.current\n ], props.tableOfContentsId);\n\n /**\n * Need to use a ref because if we use state, onExitImmersiveReader will have a stale\n * reference of the state. This is because the state is changed in onLaunchImmersiveReader\n * which is passed in at the same time as onExitImmersiveReader\n */\n const shouldPlayOnExitImmersiveReader = React.useRef(false);\n\n const hasGlance = hasGlanceData(props.video) && props.featureAccess.canViewGlance;\n\n const appLinkFns = getAppLinks();\n\n function onLaunchImmersiveReader(): void {\n shouldPlayOnExitImmersiveReader.current = !playerContext?.playerRef?.current?.isPaused();\n playerContext?.playerRef?.current?.pause();\n }\n\n function onExitImmersiveReader(): void {\n if (!shouldPlayOnExitImmersiveReader.current)\n return;\n\n playerContext?.playerRef?.current?.play();\n }\n\n const showPlayerPlaceholder = playerContext.mode === 'picture-in-picture' || (!canViewPublicly && props.featureAccess.canViewPublicLayout);\n\n const hasCurriculumLinks = !!(props.featureAccess.canViewCurriculumLinks &&\n props.curriculums.customerHasCurriculumLinks);\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <RestrictionBanner\n restrictions={props.video._restrictions}\n yearGroups={props.yearGroups}\n objectId={props.video.id}\n objectTypeId={MasterType.Video}\n canManageVideoAccess={props.canManageVideoAccess}\n />\n \n {isArchived && <ArchivedBanner typeId={props.video.typeId} hasStudentExperience={hasStudentExperience}/>}\n \n <section className={`mb-2 ${SeoConstants.GLOBAL_PLAYER_SELECTOR}`}>\n {(canConsume || canViewPublicly) &&\n <GlobalPlayerConsumer\n key={props.video.id}\n objectId={props.video.id}\n objectTypeId={props.video.typeId}\n shareId={props.shareId}\n context={props.params?.context}\n contextId={props.params?.contextId}\n playNext={props.params?.playNext}\n moviesAndTv={props.params?.mtv}\n startTime={props.params?.t ?? props.params?.startTime}\n endTime={props.params?.endTime}\n mode='default'\n location='play-page'\n />\n }\n <div className={showPlayerPlaceholder ? '' : 'd-none'}>\n <PlayerPlaceholder\n video={props.video}\n appLink={{\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.SIGN_UP\n }}\n type={playerContext.mode === 'picture-in-picture' ? 'pip' : 'public'}\n />\n </div>\n </section>\n\n <PlayPageTitleAndActions\n media={props.video}\n yearGroups={props.yearGroups}\n audiences={props.audiences}\n getSeriesAppLink={series => appLinkFns.getSeriesAppLink(series, props.params.mtv)}\n featureAccess={props.featureAccess}\n shareId={props.shareId}\n />\n \n {hasGlance && (\n <section>\n <VideoAtAGlance\n video={props.video}\n pointsOfInterest={props.pointsOfInterest}\n setStartTime={(time: number) => playerContext.playerRef.current?.currentTime(time)}\n getTagAppLink={appLinkFns.getTagAppLink}\n suppressInteractivity={props.featureAccess.canViewPublicLayout}\n />\n </section>\n )}\n\n <PlayPageResources\n containerRef={resourcesRef}\n video={props.video}\n canViewResources={props.featureAccess.canViewResources}\n imageCdnUrl={props.imageCdnUrl}\n getAppLink={\n appLinkFns.getResourceAppLink(props.video.id, props.shareId, props.featureAccess.canViewResources)\n }\n analyticsData={{ videoId: props.video.id, videoName: props.video.name }}\n resourceThumbnailFallbackUrl={ImageUrls.Fallbacks.RESOURCE_THUMBNAIL}\n />\n\n <PlayPageInteractives\n video={props.video}\n imageCdnUrl={props.imageCdnUrl}\n analyticsData={{ videoId: props.video.id, videoName: props.video.name }}\n canViewInteractives={props.featureAccess.canViewInteractives}\n containerRef={interactivesRef}\n yearGroups={props.yearGroups}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n />\n\n {hasCurriculumLinks && (\n <section>\n <CurriculumLinksWithScrollbar\n video={props.video}\n height={MINIMUM_GLANCE_HEIGHT}\n curriculums={props.curriculums}\n emptyStateUrl={ImageUrls.EmptyStates.CURRICULUM_LINKS}\n />\n </section>\n )}\n\n {props.glanceLoaded ? (\n <section>\n <VideoDetailsWithScrollbar\n video={props.video}\n onLaunchImmersiveReader={onLaunchImmersiveReader}\n onExitImmersiveReader={onExitImmersiveReader}\n getTagAppLink={appLinkFns.getTagAppLink}\n suppressInteractivity={props.featureAccess.canViewPublicLayout}\n theme={props.glanceTheme}\n />\n </section>\n ) : (\n <VideoDetailsPartial />\n )}\n\n {VideoHelper.isBroadcast(props.video) && <CopyrightDisclaimer placement='bottom-end' className='d-flex justify-content-end mt-n2' />}\n\n <PlayPageClips\n video={props.video}\n clips={props.video.clips?.data ?? []}\n canViewClips={props.featureAccess.canViewClips}\n yearGroups={props.yearGroups}\n imageCdnUrl={props.imageCdnUrl}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n analyticsData={{ videoId: props.video.id, videoName: props.video.name }}\n />\n\n <section>\n <RelatedVideos\n currentVideo={props.video}\n yearGroups={props.yearGroups}\n relatedVideos={props.relatedVideos}\n currentUser={props.currentUser}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n getVideoAppLink={(v, opts) => VideoAppLinkHelper.getAppLink(v, {\n ...opts,\n context: props.params.context,\n contextId: props.params.contextId,\n playNext: props.params.playNext,\n shareId: props.shareId,\n moviesAndTv: props.params.mtv\n })}\n audiences={props.audiences}\n moviesAndTv={props.params.mtv}\n />\n </section>\n </LanguageNamespaceContext.Provider>\n );\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"curriculumSubject\":\"GvGYH\",\"curriculumSet\":\"d7RK0\",\"areaLeafSet\":\"XRTAe\",\"closeButton\":\"N3l5Q\",\"heading\":\"hAxR4\",\"leafDescriptionOnly\":\"h66ke\",\"dropdown\":\"CsG6G\",\"tag\":\"rdLqY\",\"cover\":\"etwaD\",\"active\":\"aDLMe\",\"selected\":\"BMrSd\"};"],"names":["CurriculumLinkItem","props","curriculumTag","data","key","id","className","selected","onClick","onChangeCurriculum","toString","src","cover","url","size","alt","name","CurriculumType","namespace","getPhrase","LanguageService","CurriculumLinksEmptyState","EmptyState","emptyStateUrl","altText","Text","phrase","BRACKET_SEGMENT_REGEX","BASE_PILL_CLASS","CurriculumLeaf","getCurriculumCodeClass","baseClass","leaf","uiContainsCodes","codeRef","current","width","getBoundingClientRect","trySetMaxCodeWidth","description","style","minWidth","codeWidth","ref","dangerouslySetInnerHTML","__html","CurriculumSubject","audienceSegment","subjectSegment","audienceBracketSegments","areaAndLeafSets","getLeafStyleClass","linkSet","areasAndLeaves","forEach","areaAndLeafSet","areaText","Area","map","ca","join","Leaf","push","Audience","Subject","match","Object","keys","i","CurriculumLinks","setCodeWidth","currentVal","curriculumLinkSets","curriculumLinks","subject","audience","areas","leaves","curriculumObj","type","length","linkSetKey","PartialCurriculumLinks","PartialCurriculumLinkSection","PartialTagItem","tagClass","classNames","CONTAINER_HEIGHT","CopyrightDisclaimer","isHovering","Overlay","target","show","placement","overflowPlacement","document","documentElement","clientHeight","bottom","CurriculumLinksWithScrollbar","curriculums","hasLoaded","activeCurriculum","availableCurriculums","updateCurriculum","selectedCurriculum","setSelectedCurriculum","alerts","curriculumId","newCurriculum","find","c","AnalyticsHelper","videoId","video","videoName","entity","actionType","descriptor","location","error","ArrayHelper","collection","nonEmptyCurriculums","childClassName","childComponent","partialLoadingComponent","widgetDataDeps","autoHeight","autoHeightMax","height","PlayPage","playerContext","hasPermissions","usePermissions","canConsume","VideoHelper","canViewPublicly","featureAccess","canWatchPublicly","isArchived","hasStudentExperience","PermissionName","resourcesRef","interactivesRef","useTableOfContentsScroll","tableOfContentsId","shouldPlayOnExitImmersiveReader","hasGlance","canViewGlance","appLinkFns","showPlayerPlaceholder","mode","canViewPublicLayout","hasCurriculumLinks","canViewCurriculumLinks","customerHasCurriculumLinks","value","RestrictionBanner","restrictions","_restrictions","yearGroups","objectId","objectTypeId","MasterType","canManageVideoAccess","ArchivedBanner","typeId","SeoConstants","GlobalPlayerConsumer","shareId","context","params","contextId","playNext","moviesAndTv","mtv","startTime","t","endTime","PlayerPlaceholder","appLink","application","action","PlayPageTitleAndActions","media","audiences","getSeriesAppLink","series","VideoAtAGlance","pointsOfInterest","setStartTime","time","playerRef","currentTime","getTagAppLink","suppressInteractivity","PlayPageResources","containerRef","canViewResources","imageCdnUrl","getAppLink","getResourceAppLink","analyticsData","resourceThumbnailFallbackUrl","ImageUrls","PlayPageInteractives","canViewInteractives","setFavourite","canFavourite","glanceLoaded","VideoDetails","onLaunchImmersiveReader","isPaused","pause","onExitImmersiveReader","play","theme","glanceTheme","VideoDetailsPartial","PlayPageClips","clips","canViewClips","RelatedVideos","currentVideo","relatedVideos","currentUser","getVideoAppLink","v","opts","VideoAppLinkHelper"],"sourceRoot":""}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[32],{94644:(e,a,t)=>{t.d(a,{r:()=>u});var i=t(50242),d=t(81886),n=t(67058),r=t(14553),o=t(49267),s=t(49075),c={notFound:n.d,forbidden:{rating:r.q,yearLevel:r.q,region:o.a,privacy:r.q},badRequest:s._};function u(e){var a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e){var n;n="number"==typeof e?e:e.status;var r=Object.assign(Object.assign({},c),a);n&&d.Q.Ry.isStatusCodeError(n)&&(n!==i.o.NotFound?n!==i.o.Forbidden?t.badRequest||d.Q.Ry.throw(new r.badRequest):t.forbidden||d.Q.Ry.throw(new r.forbidden.privacy):t.notFound||d.Q.Ry.throw(new r.notFound))}}},91286:(e,a,t)=>{t.d(a,{v:()=>r});var i=t(32735),d=t(94644);function n(e){return e.map((function(e){return e.statusCode})).join(":")}function r(e,a,t){var r=Array.isArray(e)?e:[e];(0,i.useEffect)((function(){r.forEach((function(e){(0,d.r)(e.statusCode,a,t)}))}),[n(r),a,t])}},27478:(e,a,t)=>{t.r(a),t.d(a,{PlayClipView:()=>j});var i=t(32735),d=t(50242),n=t(23481),r=t(20354),o=t(65858),s=t(78417),c=t(16714),u=t(67058),l=t(33803),v=t(43012),p=t(39151),h=t(1666),m=t(28907),f=t(31949),g=t(1575),y=t(27995),C=t(91286),b=t(22902),F=t(15311),P=t(79612),w=t(76753),q=t(56871),V=t(7179),R=t(49948),k=t(36873),A=t(27638),B=t(44110),I=t(35014),_=t(97816),O=n.T.encloseNamespace("shared.playClip"),T={notFound:u.d,forbidden:{privacy:l.G}};function j(e){var a,t,n,u,l,j,x,E=e.queryParams,G=E.context,M=E.contextId,U=E.mtv,L=(0,F.r)().hasProduct,N=(0,A.u)(o.LZ.PlayClip),Q=N.setFavourite,S=N.canFavourite,D=(0,b.T)().hasPermissions,H=r.a.useBasicFetch(f.N.currentUser()),Z=r.a.useBasicFetch(p.L.config()),z=r.a.useBasicFetch(v.e.clip(e.id)),J=r.a.useBasicFetch(!!(null===(a=z.data)||void 0===a?void 0:a._parentVideo)&&g.R.video(z.data._parentVideo.id,null,null===(t=H.data)||void 0===t?void 0:t.id)),K=r.a.useBasicFetch(z.statusCode===d.o.Forbidden&&v.e.clip(e.id,s.r.StripMetadata)),W=(0,k.k)({video:J.data,context:G,contextId:M,moviesAndTv:U,currentUser:H.data}),X=(0,B.i)(),Y=r.a.useBasicFetch((null===(n=H.data)||void 0===n?void 0:n.isAuthenticated)&&h.h.yearGroups(H.data.customerId)),$=D(c.C.ViewVideoGlance)&&(null===(l=null===(u=z.data)||void 0===u?void 0:u.glance)||void 0===l?void 0:l.theme),ee=r.a.useBasicFetch($&&m.r.themeImages(z.data.glance.theme,z.data.glance.type)),ae=(0,R.l)(e.id,!0),te=(0,I.I)();return(0,P.M)(w.CG.getClipMetadata({content:z.data,phraseContext:{phraseHandler:O,titlePhrase:"pageTitle",descriptionPhrase:"pageDescription"}})),(0,C.v)(z,T,{forbidden:!0}),(0,_.V)(null!==(j=W.videos)&&void 0!==j?j:[]),(0,y.b)(K),(0,V.P)({id:e.id,app:"clips"}),z.data&&H.hasCompleted&&Z.hasCompleted&&ae.hasCompleted?i.createElement(q.N,{clip:z.data,originalVideo:J.data,currentUser:H.data,yearGroups:Y.data,relatedVideos:"playlist"===G?W:Object.assign(Object.assign({},W),{videos:[]}),canFavourite:S,setFavourite:Q,hasProduct:L,queryParams:e.queryParams,audiences:X.data,imageCdnUrl:Z.data.imageCdnUrl,canManageVideoAccess:D(c.C.ManageVideoAccess),pointsOfInterest:ae.items,glanceTheme:ee.data,glanceLoaded:!$||ee.hasCompleted,featureAccess:te,tableOfContentsId:null===(x=e.queryParams)||void 0===x?void 0:x.scrollTo}):i.createElement(i.Fragment,null)}j.defaultProps={queryParams:{}}}}]);
|
|
2
|
-
//# sourceMappingURL=32-cf9b8ba599-lite.chunk.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/32-cf9b8ba599-lite.chunk.js","mappings":"wMA0BMA,EAA8B,CAClCC,SAAU,IACVC,UAAW,CACTC,OAAQ,IACRC,UAAW,IACXC,OAAQ,IACRC,QAAS,KAEXC,WAAY,KAGR,SAAUC,EACdC,GAMkC,IALlCC,EAAA,uDAA+B,CAAC,EAKhCC,EAAA,uDAAgC,CAAC,EAEjC,GAAKF,EAAL,CAGA,IAAIG,EAGFA,EADmB,iBAAVH,EACIA,EAEAA,EAAKI,OAGpB,IAAMC,EAAW,OAAH,wBACTd,GACAU,GAGAE,GAGA,yBAAmCA,KAGpCA,IAAe,aAMfA,IAAe,cAUdD,EAAUJ,YACb,aAAuB,IAAIO,EAASP,YAN/BI,EAAUT,WACb,aAAuB,IAAIY,EAASZ,UAAUI,SAX3CK,EAAUV,UACb,aAAuB,IAAIa,EAASb,UAvBhC,CAuCV,C,6DChFA,SAASc,EAAiBC,GACxB,OAAOA,EAAWC,KAAI,SAAAC,GAAG,OAAIA,EAAIN,UAAU,IAAEO,KAAK,IACpD,CAGM,SAAUC,EACdC,EACAC,EACAC,GAEA,IAAMP,EAAaQ,MAAMC,QAAQJ,GAAeA,EAAc,CAACA,IAE/D,IAAAK,YAAU,WACRV,EAAWW,SAAQ,SAAAT,IACjB,OAAgBA,EAAIN,WAAYU,EAAcC,EAChD,GACF,GAAG,CAAER,EAAiBC,GAAaM,EAAcC,GACnD,C,qXCcMK,EAAY,qBADA,mBAGZC,EAAa,CACjB5B,SAAU,IACVC,UAAW,CACTI,QAAS,MAaP,SAAUwB,EAAaC,G,kBAC3B,EAAoCA,EAAMC,YAAlCC,EAAO,EAAPA,QAASC,EAAS,EAATA,UAAWC,EAAG,EAAHA,IAEpBC,GAAe,SAAfA,WACR,GAAuC,IAAAC,GAAkB,eAAjDC,EAAY,EAAZA,aAAcC,EAAY,EAAZA,aACdC,GAAmB,SAAnBA,eAEFC,EAAc,kBAAkC,mBAChDC,EAAS,kBAA6B,cACtCC,EAAO,kBAA2B,SAAkBZ,EAAMa,KAC1DC,EAAQ,qBAAuC,QAAT,EAAAF,EAAKG,YAAI,eAAEC,eACrD,UAAoBJ,EAAKG,KAAKC,aAAaH,GAAI,KAAsB,QAAhB,EAAAH,EAAYK,YAAI,eAAEF,KACnEI,EAAe,kBAA2BL,EAAK/B,aAAe,eAClE,SAAkBmB,EAAMa,GAAI,oBACxBK,GAAgB,OAAoB,CACxCJ,MAAOA,EAAMC,KACbb,QAAAA,EACAC,UAAAA,EACAgB,YAAaf,EACbM,YAAaA,EAAYK,OAErBK,GAAY,SACZC,EAAa,mBACD,QAAhB,EAAAX,EAAYK,YAAI,eAAEO,kBAAmB,eAA4BZ,EAAYK,KAAKQ,aAG9EC,EAAmBf,EAAe,uBACvB,QAAjB,EAAS,QAAT,EAAAG,EAAKG,YAAI,eAAEU,cAAM,eAAEC,OAEbC,GAAc,kBAClBH,GACA,gBAA0BZ,EAAKG,KAAKU,OAAOC,MAAOd,EAAKG,KAAKU,OAAOG,OAE/DC,IAAmB,OAAyB7B,EAAMa,IAAI,GAEtDiB,IAAgB,SAuBtB,OArBA,OAAmB,qBAAmC,CACpDC,QAASnB,EAAKG,KACdiB,cAAe,CACbC,cAAepC,EACfqC,YAAa,YACbC,kBAAmB,uBAIvB,OAAqBvB,EAAMd,EAAY,CAAE3B,WAAW,KACpD,OAAkC,QAApB,EAAA+C,EAAckB,cAAM,QAAI,KACtC,OAAsBnB,IACtB,OAAa,CAAEJ,GAAIb,EAAMa,GAAIwB,IAAK,UAGhCzB,EAAKG,MACLL,EAAY4B,cACZ3B,EAAO2B,cACPT,GAAiBS,aAOjB,gBAAC,IAAQ,CACP1B,KAAMA,EAAKG,KACXwB,cAAezB,EAAMC,KACrBL,YAAaA,EAAYK,KACzBM,WAAYA,EAAWN,KAEvBG,cAA2B,aAAZhB,EAAyBgB,EAAe,+BAAMA,GAAa,CAAEkB,OAAQ,KACpF5B,aAAcA,EACdD,aAAcA,EACdF,WAAYA,EACZJ,YAAaD,EAAMC,YACnBmB,UAAWA,EAAUL,KACrByB,YAAa7B,EAAOI,KAAKyB,YACzBC,qBAAsBhC,EAAe,uBACrCoB,iBAAkBA,GAAiBa,MACnCf,YAAaA,GAAYZ,KACzB4B,cAAenB,GAAoBG,GAAYW,aAC/CR,cAAeA,GACfc,kBAAoC,QAAjB,EAAA5C,EAAMC,mBAAW,eAAE4C,WArBjC,gCAwBX,CAvFA9C,EAAa+C,aAAe,CAC1B7C,YAAa,CAAC,E","sources":["file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/hooks/UseHandleObjectError.ts","file:///app/packages/projects/lite/src/shared/views/play-clip/PlayClipView.tsx"],"sourcesContent":["import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import { useEffect } from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { handleHttpError, HttpErrorMap, IgnoreHttpErrorMap } from 'libs/shared/errors/handlers/HttpErrorHandlers';\n\nfunction generateCacheKey(flightObjs: Array<Flight.Response<any>>): string {\n return flightObjs.map(obj => obj.statusCode).join(':');\n}\n\n// TODO: Change this to just `useHandleHttpError` and only accept a status code.\nexport function useHandleObjectError(\n _flightObjs: Flight.Response<any> | Array<Flight.Response<any>>,\n customErrors?: HttpErrorMap,\n ignoreErrors?: IgnoreHttpErrorMap\n): void {\n const flightObjs = Array.isArray(_flightObjs) ? _flightObjs : [_flightObjs];\n\n useEffect(() => {\n flightObjs.forEach(obj => {\n handleHttpError(obj.statusCode, customErrors, ignoreErrors);\n });\n }, [ generateCacheKey(flightObjs), customErrors, ignoreErrors ]);\n}","import * as React from 'react';\n\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { PermissionFilterOption } from 'libs/shared/enums/PermissionFilterOption';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { VideoPrivateError } from 'libs/shared/errors/videos/video-private/VideoPrivateError';\nimport { ClipRequests } from 'libs/shared/flight-requests/ClipRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { ThemeRequests } from 'libs/shared/flight-requests/ThemeRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useCannotConsumeError } from 'libs/shared/hooks/useCannotConsumeError';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Clip, Config, CurrentUser, Theme, Video, YearGroup } from 'libs/shared/interfaces';\nimport { PlayViewQueryParams } from 'libs/shared/interfaces/query-params/PlayViewQueryParams';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { PlayClip } from 'shared/components/play-clip/PlayClip';\nimport { useDeepLinks } from 'shared/hooks/useDeepLinks';\nimport { useFetchPointsOfInterest } from 'shared/hooks/useFetchPointsOfInterest';\nimport { useGetRelatedVideos } from 'shared/hooks/useGetRelatedVideos';\nimport { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\nimport { usePresentationAudiences } from 'shared/hooks/usePresentationAudiences';\nimport { useVideoFeatureAccess } from 'shared/hooks/useVideoFeatureAccess';\nimport { useVideoMixin } from 'shared/hooks/useVideoMixin';\n\nconst namespace = 'shared.playClip';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst clipErrors = {\n notFound: NotFoundError,\n forbidden: {\n privacy: VideoPrivateError\n }\n};\n\ninterface PlayClipViewProps {\n id: string;\n queryParams: PlayViewQueryParams;\n}\n\nPlayClipView.defaultProps = {\n queryParams: {}\n};\n\nexport function PlayClipView(props: PlayClipViewProps): JSX.Element {\n const { context, contextId, mtv } = props.queryParams;\n\n const { hasProduct } = useProducts();\n const { setFavourite, canFavourite } = useLiteFavourites(LocationContext.PlayClip);\n const { hasPermissions } = usePermissions();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const clip = Flight.useBasicFetch<Clip>(ClipRequests.clip(props.id));\n const video = Flight.useBasicFetch<Video>(!!clip.data?._parentVideo &&\n VideoRequests.video(clip.data._parentVideo.id, null, currentUser.data?.id));\n const strippedClip = Flight.useBasicFetch<Clip>(clip.statusCode === HttpStatus.Forbidden &&\n ClipRequests.clip(props.id, PermissionFilterOption.StripMetadata));\n const relatedVideos = useGetRelatedVideos({\n video: video.data,\n context,\n contextId,\n moviesAndTv: mtv,\n currentUser: currentUser.data\n });\n const audiences = usePresentationAudiences();\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const shouldFetchTheme = hasPermissions(PermissionName.ViewVideoGlance) &&\n clip.data?.glance?.theme;\n \n const glanceTheme = Flight.useBasicFetch<Theme>(\n shouldFetchTheme &&\n ThemeRequests.themeImages(clip.data.glance.theme, clip.data.glance.type)\n );\n const pointsOfInterest = useFetchPointsOfInterest(props.id, true);\n \n const featureAccess = useVideoFeatureAccess();\n\n useSetPageMetadata(PageMetadataHelper.getClipMetadata({\n content: clip.data,\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n }\n }));\n\n useHandleObjectError(clip, clipErrors, { forbidden: true });\n useVideoMixin(relatedVideos.videos ?? []);\n useCannotConsumeError(strippedClip);\n useDeepLinks({ id: props.id, app: 'clips' });\n\n const hasLoaded = (\n clip.data &&\n currentUser.hasCompleted &&\n config.hasCompleted &&\n pointsOfInterest.hasCompleted\n );\n\n if (!hasLoaded)\n return <></>;\n\n return (\n <PlayClip\n clip={clip.data}\n originalVideo={video.data}\n currentUser={currentUser.data}\n yearGroups={yearGroups.data}\n // we only show up next videos for clips in a playlist\n relatedVideos={context === 'playlist' ? relatedVideos : { ...relatedVideos, videos: []}}\n canFavourite={canFavourite}\n setFavourite={setFavourite}\n hasProduct={hasProduct}\n queryParams={props.queryParams}\n audiences={audiences.data}\n imageCdnUrl={config.data.imageCdnUrl}\n canManageVideoAccess={hasPermissions(PermissionName.ManageVideoAccess)}\n pointsOfInterest={pointsOfInterest.items}\n glanceTheme={glanceTheme.data}\n glanceLoaded={!shouldFetchTheme || glanceTheme.hasCompleted}\n featureAccess={featureAccess}\n tableOfContentsId={props.queryParams?.scrollTo}\n />\n );\n}"],"names":["defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","generateCacheKey","flightObjs","map","obj","join","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","Array","isArray","useEffect","forEach","getPhrase","clipErrors","PlayClipView","props","queryParams","context","contextId","mtv","hasProduct","u","setFavourite","canFavourite","hasPermissions","currentUser","config","clip","id","video","data","_parentVideo","strippedClip","relatedVideos","moviesAndTv","audiences","yearGroups","isAuthenticated","customerId","shouldFetchTheme","glance","theme","glanceTheme","type","pointsOfInterest","featureAccess","content","phraseContext","phraseHandler","titlePhrase","descriptionPhrase","videos","app","hasCompleted","originalVideo","imageCdnUrl","canManageVideoAccess","items","glanceLoaded","tableOfContentsId","scrollTo","defaultProps"],"sourceRoot":""}
|