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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/bundles.json +1 -1
  2. package/dist/css/4291-lite-69960aaab9.chunk.css +23 -0
  3. package/dist/css/6723-lite-69960aaab9.chunk.css +23 -0
  4. package/dist/css/9437-lite-69960aaab9.chunk.css +23 -0
  5. package/dist/languages/en.json +1 -1
  6. package/dist/scripts/1539-10d3590409-lite.chunk.js +2 -0
  7. package/dist/scripts/1539-10d3590409-lite.chunk.js.map +1 -0
  8. package/dist/scripts/194-d192c1e455-lite.chunk.js +2 -0
  9. package/dist/scripts/194-d192c1e455-lite.chunk.js.map +1 -0
  10. package/dist/scripts/2265-b6e093cf57-lite.chunk.js +2 -0
  11. package/dist/scripts/2265-b6e093cf57-lite.chunk.js.map +1 -0
  12. package/dist/scripts/{3042-d531f193aa-lite.chunk.js → 3042-f9d67ac0a3-lite.chunk.js} +2 -2
  13. package/dist/scripts/3042-f9d67ac0a3-lite.chunk.js.map +1 -0
  14. package/dist/scripts/32-2abdd88255-lite.chunk.js +2 -0
  15. package/dist/scripts/32-2abdd88255-lite.chunk.js.map +1 -0
  16. package/dist/scripts/{3854-6b20ca6c3b-lite.chunk.js → 3854-49852130b4-lite.chunk.js} +2 -2
  17. package/dist/scripts/3854-49852130b4-lite.chunk.js.map +1 -0
  18. package/dist/scripts/{4060-77244f1012-lite.chunk.js → 4060-4ab06f9f5e-lite.chunk.js} +2 -2
  19. package/dist/scripts/4060-4ab06f9f5e-lite.chunk.js.map +1 -0
  20. package/dist/scripts/4113-81b4e4a350-lite.chunk.js +2 -0
  21. package/dist/scripts/4113-81b4e4a350-lite.chunk.js.map +1 -0
  22. package/dist/scripts/{6375-f6cac7d19c-lite.chunk.js → 4291-72cf3ca37d-lite.chunk.js} +2 -2
  23. package/dist/scripts/4291-72cf3ca37d-lite.chunk.js.map +1 -0
  24. package/dist/scripts/6723-b34bba9ac1-lite.chunk.js +2 -0
  25. package/dist/scripts/6723-b34bba9ac1-lite.chunk.js.map +1 -0
  26. package/dist/scripts/7268-42c8c2cdb5-lite.chunk.js +2 -0
  27. package/dist/scripts/7268-42c8c2cdb5-lite.chunk.js.map +1 -0
  28. package/dist/scripts/{9087-48c8bfbc09-lite.chunk.js → 9087-55e2aad6ad-lite.chunk.js} +2 -2
  29. package/dist/scripts/{9087-48c8bfbc09-lite.chunk.js.map → 9087-55e2aad6ad-lite.chunk.js.map} +1 -1
  30. package/dist/scripts/9437-2bb4c632ca-lite.chunk.js +2 -0
  31. package/dist/scripts/9437-2bb4c632ca-lite.chunk.js.map +1 -0
  32. package/dist/scripts/{bundle-858fa3479f.min.js → bundle-854cdefb2d.min.js} +3 -3
  33. package/dist/scripts/bundle-854cdefb2d.min.js.map +1 -0
  34. package/package.json +1 -1
  35. package/dist/scripts/194-6131a555c8-lite.chunk.js +0 -2
  36. package/dist/scripts/194-6131a555c8-lite.chunk.js.map +0 -1
  37. package/dist/scripts/2265-0174bf9c8c-lite.chunk.js +0 -2
  38. package/dist/scripts/2265-0174bf9c8c-lite.chunk.js.map +0 -1
  39. package/dist/scripts/3042-d531f193aa-lite.chunk.js.map +0 -1
  40. package/dist/scripts/32-5739e73587-lite.chunk.js +0 -2
  41. package/dist/scripts/32-5739e73587-lite.chunk.js.map +0 -1
  42. package/dist/scripts/3854-6b20ca6c3b-lite.chunk.js.map +0 -1
  43. package/dist/scripts/4060-77244f1012-lite.chunk.js.map +0 -1
  44. package/dist/scripts/4113-c75e9be23a-lite.chunk.js +0 -2
  45. package/dist/scripts/4113-c75e9be23a-lite.chunk.js.map +0 -1
  46. package/dist/scripts/6375-f6cac7d19c-lite.chunk.js.map +0 -1
  47. package/dist/scripts/7268-d9bf6e2c2a-lite.chunk.js +0 -2
  48. package/dist/scripts/7268-d9bf6e2c2a-lite.chunk.js.map +0 -1
  49. package/dist/scripts/bundle-858fa3479f.min.js.map +0 -1
  50. /package/dist/css/{6375-lite-69960aaab9.chunk.css → 1539-lite-69960aaab9.chunk.css} +0 -0
  51. /package/dist/scripts/{bundle-858fa3479f.min.js.LICENSE.txt → bundle-854cdefb2d.min.js.LICENSE.txt} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clickview/lite",
3
- "version": "0.49.0-rc.3",
3
+ "version": "0.49.0-rc.5",
4
4
  "description": "ClickView Lite",
5
5
  "main": "dist/scripts/bundle.js",
6
6
  "types": "dist/projects/lite/src/index.d.ts",
@@ -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),o=t(89454),c=t(39151),r=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,U=(0,V.u)(s.LZ.VideoThumbnail),G=U.setFavourite,N=U.canFavourite,_=(0,h.T)().hasPermissions,E=(0,b.y)().activePresentation,O=i.a.useBasicFetch(u.N.currentUser()),S=i.a.useBasicFetch((null===(a=O.data)||void 0===a?void 0:a.id)&&v.R.sharedVideo(e.objectId,e.shareId,O.data.id)),R=i.a.useBasicFetch(c.L.config()),Z=(0,F.k)({video:S.data,context:e.queryParams.context,contextId:e.queryParams.contextId,moviesAndTv:e.queryParams.mtv,currentUser:O.data}),z=(0,P.l)(e.objectId),D=i.a.useBasicFetch((null===(B=null===(t=S.data)||void 0===t?void 0:t.glance)||void 0===B?void 0:B.theme)?l.r.themeImages(S.data.glance.theme,S.data.glance.type):null),H=i.a.useBasicFetch(!!E&&o.O.audiencesByPresentationId(E.id)),J=i.a.useBasicFetch((null===(q=O.data)||void 0===q?void 0:q.isAuthenticated)&&r.h.yearGroups(O.data.customerId)),K=_(n.C.ViewVideoGlance)&&(null===(A=null===(j=S.data)||void 0===j?void 0:j.glance)||void 0===A?void 0:A.theme);(0,p.M)(I.CG.getVideoMetadata({content:S.data,canonicalLink:x.f.getCanonicalLink({stripPresentationSlug:!0}),allowIndexing:!1})),(0,f.V)(null!==(L=Z.videos)&&void 0!==L?L:[]),(0,m.b)(S,{private:w.m}),(0,C.P)({id:e.objectId,app:"videos",shareId:e.shareId});var Q=(0,y.M)(e.objectId),W=S.data&&O.hasCompleted&&R.hasCompleted&&z.hasCompleted,X=(0,k.I)();return W?d.createElement("div",{className:"px-3"},d.createElement(g.j,{video:S.data,yearGroups:J.data,curriculums:Q,imageCdnUrl:R.data.imageCdnUrl,relatedVideos:Z,currentUser:O.data,setFavourite:G,canFavourite:N,pointsOfInterest:null==z?void 0:z.items,playNext:null===(M=e.queryParams)||void 0===M?void 0:M.playNext,shareId:e.shareId,glanceTheme:D.data,glanceLoaded:!K||D.hasCompleted,featureAccess:X,audiences:H.data,params:e.queryParams,canManageVideoAccess:_(n.C.ManageVideoAccess),tableOfContentsId:null===(T=e.queryParams)||void 0===T?void 0:T.scrollTo})):d.createElement(d.Fragment,null)}}}]);
2
- //# sourceMappingURL=194-6131a555c8-lite.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/194-6131a555c8-lite.chunk.js","mappings":"+aAiCM,SAAUA,EAAoBC,G,sBAClC,GAAuC,IAAAC,GAAkB,qBAAjDC,EAAY,EAAZA,aAAcC,EAAY,EAAZA,aAEdC,GAAmB,SAAnBA,eAGNC,GACE,SADFA,mBAIIC,EAAc,kBAAkC,mBAChDC,EAAQ,mBACI,QAAhB,EAAAD,EAAYE,YAAI,eAAEC,KAAM,gBAA0BT,EAAMU,SAAUV,EAAMW,QAASL,EAAYE,KAAKC,KAE9FG,EAAS,kBAA6B,cACtCC,GAAgB,OAAoB,CACxCN,MAAOA,EAAMC,KACbM,QAASd,EAAMe,YAAYD,QAC3BE,UAAWhB,EAAMe,YAAYC,UAC7BC,YAAajB,EAAMe,YAAYG,IAC/BZ,YAAaA,EAAYE,OAErBW,GAAmB,OAAyBnB,EAAMU,UAClDU,EAAc,mBAA8C,QAAlB,EAAU,QAAV,EAAAb,EAAMC,YAAI,eAAEa,cAAM,eAAEC,OAChE,gBAA0Bf,EAAMC,KAAKa,OAAOC,MAAOf,EAAMC,KAAKa,OAAOE,MAAQ,MAC3EC,EAAY,oBACdnB,GACF,8BAA2CA,EAAmBI,KAE1DgB,EAAa,mBACD,QAAhB,EAAAnB,EAAYE,YAAI,eAAEkB,kBAAmB,eAA4BpB,EAAYE,KAAKmB,aAG9EC,EAAmBxB,EAAe,uBACpB,QAAlB,EAAU,QAAV,EAAAG,EAAMC,YAAI,eAAEa,cAAM,eAAEC,QAEtB,OAAmB,sBAAoC,CACrDO,QAAStB,EAAMC,KACfsB,cAAe,qBAA2B,CAAEC,uBAAuB,IACnEC,eAAe,MAGjB,OAAkC,QAApB,EAAAnB,EAAcoB,cAAM,QAAI,KACtC,OAAsB1B,EAAO,CAAE2B,QAAS,OACxC,OAAa,CAAEzB,GAAIT,EAAMU,SAAUyB,IAAK,SAAUxB,QAASX,EAAMW,UAEjE,IAAMyB,GAAc,OAAepC,EAAMU,UAEnC2B,EACJ9B,EAAMC,MACNF,EAAYgC,cACZ1B,EAAO0B,cACPnB,EAAiBmB,aAGbC,GAAgB,SAEtB,OAAKF,EAIH,uBAAKG,UAAU,QACb,gBAAC,IAAQ,CACPjC,MAAOA,EAAMC,KACbiB,WAAYA,EAAWjB,KACvB4B,YAAaA,EACbK,YAAa7B,EAAOJ,KAAKiC,YACzB5B,cAAeA,EACfP,YAAaA,EAAYE,KACzBN,aAAcA,EACdC,aAAcA,EACdgB,iBAAkBA,aAAgB,EAAhBA,EAAkBuB,MACpCC,SAA2B,QAAjB,EAAA3C,EAAMe,mBAAW,eAAE4B,SAC7BhC,QAASX,EAAMW,QACfS,YAAaA,EAAYZ,KACzBoC,cAAehB,GAAoBR,EAAYkB,aAC/CC,cAAeA,EACff,UAAWA,EAAUhB,KACrBqC,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\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const video = Flight.useBasicFetch<Video>(\n currentUser.data?.id && 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","data","id","objectId","shareId","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-d531f193aa-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}>&nbsp;</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-3 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),r=t(67058),n=t(14553),o=t(49267),s=t(49075),c={notFound:r.d,forbidden:{rating:n.q,yearLevel:n.q,region:o.a,privacy:n.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 r;r="number"==typeof e?e:e.status;var n=Object.assign(Object.assign({},c),a);r&&d.Q.Ry.isStatusCodeError(r)&&(r!==i.o.NotFound?r!==i.o.Forbidden?t.badRequest||d.Q.Ry.throw(new n.badRequest):t.forbidden||d.Q.Ry.throw(new n.forbidden.privacy):t.notFound||d.Q.Ry.throw(new n.notFound))}}},91286:(e,a,t)=>{t.d(a,{v:()=>n});var i=t(32735),d=t(94644);function r(e){return e.map((function(e){return e.statusCode})).join(":")}function n(e,a,t){var n=Array.isArray(e)?e:[e];(0,i.useEffect)((function(){n.forEach((function(e){(0,d.r)(e.statusCode,a,t)}))}),[r(n),a,t])}},27478:(e,a,t)=>{t.r(a),t.d(a,{PlayClipView:()=>j});var i=t(32735),d=t(50242),r=t(23481),n=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=r.T.encloseNamespace("shared.playClip"),T={notFound:u.d,forbidden:{privacy:l.G}};function j(e){var a,t,r,u,l,j,x=e.queryParams,E=x.context,G=x.contextId,M=x.mtv,U=(0,F.r)().hasProduct,L=(0,A.u)(o.LZ.PlayClip),N=L.setFavourite,Q=L.canFavourite,S=(0,b.T)().hasPermissions,D=n.a.useBasicFetch(f.N.currentUser()),H=n.a.useBasicFetch(p.L.config()),Z=n.a.useBasicFetch(v.e.clip(e.id)),z=n.a.useBasicFetch(!!(null===(a=Z.data)||void 0===a?void 0:a._parentVideo)&&g.R.video(Z.data._parentVideo.id)),J=n.a.useBasicFetch(Z.statusCode===d.o.Forbidden&&v.e.clip(e.id,s.r.StripMetadata)),K=(0,k.k)({video:z.data,context:E,contextId:G,moviesAndTv:M,currentUser:D.data}),W=(0,B.i)(),X=n.a.useBasicFetch((null===(t=D.data)||void 0===t?void 0:t.isAuthenticated)&&h.h.yearGroups(D.data.customerId)),Y=S(c.C.ViewVideoGlance)&&(null===(u=null===(r=Z.data)||void 0===r?void 0:r.glance)||void 0===u?void 0:u.theme),$=n.a.useBasicFetch(Y&&m.r.themeImages(Z.data.glance.theme,Z.data.glance.type)),ee=(0,R.l)(e.id,!0),ae=(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!==(l=K.videos)&&void 0!==l?l:[]),(0,y.b)(J),(0,V.P)({id:e.id,app:"clips"}),Z.data&&D.hasCompleted&&H.hasCompleted&&ee.hasCompleted?i.createElement(q.N,{clip:Z.data,originalVideo:z.data,currentUser:D.data,yearGroups:X.data,relatedVideos:"playlist"===E?K:Object.assign(Object.assign({},K),{videos:[]}),canFavourite:Q,setFavourite:N,hasProduct:U,queryParams:e.queryParams,audiences:W.data,imageCdnUrl:H.data.imageCdnUrl,canManageVideoAccess:S(c.C.ManageVideoAccess),pointsOfInterest:ee.items,glanceTheme:$.data,glanceLoaded:!Y||$.hasCompleted,featureAccess:ae,tableOfContentsId:null===(j=e.queryParams)||void 0===j?void 0:j.scrollTo}):i.createElement(i.Fragment,null)}j.defaultProps={queryParams:{}}}}]);
2
- //# sourceMappingURL=32-5739e73587-lite.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/32-5739e73587-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-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));\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":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/3854-6b20ca6c3b-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/infinite-scroll-footer/infinite-scroll-footer.scss","file:///app/packages/libs/shared/src/components/infinite-scroll-footer/InfiniteScrollFooter.tsx","file:///app/packages/libs/shared/src/components/play-page/resources/PlayPageResources.tsx","file:///app/packages/libs/shared/src/components/points-of-interest-list/points-of-interest-list.scss","file:///app/packages/libs/shared/src/components/points-of-interest-list/PointsOfInterestList.tsx","file:///app/packages/libs/shared/src/components/video-at-a-glance/video-at-a-glance.scss","file:///app/packages/libs/shared/src/components/video-at-a-glance/VideoAtAGlance.tsx","file:///app/packages/libs/shared/src/components/video-at-a-glance/VideoAtAGlanceUtils.ts","file:///app/packages/libs/shared/src/components/video-details/VideoDetailsPartial.tsx","file:///app/packages/libs/shared/src/components/video-list/partial-loading/partial-video-list.scss","file:///app/packages/libs/shared/src/components/video-list/partial-loading/PartialVideoList.tsx","file:///app/packages/libs/shared/src/components/widgets/items/interactive-widget-item/InteractiveWidgetItem.tsx","file:///app/packages/libs/shared/src/components/widgets/items/interactive-widget-item/interactive-widget-item.scss","file:///app/packages/libs/shared/src/components/resource-thumbnail/resource-thumbnail.scss","file:///app/packages/libs/shared/src/components/resource-thumbnail/ResourceThumbnail.tsx","file:///app/packages/libs/shared/src/utils/ResourceHelper.ts","file:///app/packages/libs/shared/src/components/widgets/items/resource-widget-item/resource-widget-item.scss","file:///app/packages/libs/shared/src/components/widgets/items/resource-widget-item/ResourceWidgetItem.tsx","file:///app/packages/libs/shared/src/flight-requests/ThemeRequests.ts","file:///app/packages/libs/shared/src/hooks/usePrevious.ts","file:///app/packages/libs/shared/src/hooks/useTableOfContentsScroll.tsx","file:///app/packages/libs/shared/src/utils/DownloadHelper.ts","file:///app/packages/projects/lite/src/shared/components/play-page/ArchivedBanner.tsx","file:///app/packages/projects/lite/src/shared/components/play-page/RestrictionBanner.tsx","file:///app/packages/libs/shared/src/components/widgets/items/clip-widget-item/ClipWidgetItem.tsx","file:///app/packages/libs/shared/src/components/widgets/items/clip-widget-item/clip-widget-item.scss","file:///app/packages/projects/lite/src/shared/components/play-page/components/clips/PlayPageClips.tsx","file:///app/packages/projects/lite/src/shared/components/play-page/components/interactives/PlayPageInteractives.tsx","file:///app/packages/projects/lite/src/shared/components/play-page/components/title-and-actions/title-and-actions.scss","file:///app/packages/projects/lite/src/shared/components/play-page/components/title-and-actions/PlayPageTitleAndActions.tsx","file:///app/packages/projects/lite/src/shared/components/player-placeholder/player-placeholder.scss","file:///app/packages/projects/lite/src/shared/components/player-placeholder/PlayerPlaceholder.tsx","file:///app/packages/projects/lite/src/shared/components/related-videos/RelatedVideos.tsx","file:///app/packages/projects/lite/src/shared/hooks/useVideoFeatureAccess.ts","file:///app/packages/projects/lite/src/shared/hooks/useVideoMixin.ts"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"container\":\"VwD1b\",\"spinner\":\"eJ85e\"};","import * as React from 'react';\nimport { Spinner } from 'react-bootstrap';\nimport { useInView } from 'react-intersection-observer';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './infinite-scroll-footer.scss';\n\ninterface InfiniteScrollFooterProps {\n isFetching: boolean;\n fetchNext?: (nextCursor: string) => void;\n nextCursor?: string;\n fetchOnScroll?: boolean;\n}\n\nInfiniteScrollFooter.defaultProps = {\n fetchOnScroll: false\n};\n\nexport function InfiniteScrollFooter(props: InfiniteScrollFooterProps): React.ReactElement {\n const [ ref, inView ] = useInView();\n\n React.useEffect(() => {\n if (!props.fetchOnScroll)\n return;\n\n if (!inView || props.isFetching)\n return;\n\n props.fetchNext?.(props.nextCursor);\n }, [ inView, props.isFetching ]);\n\n return (\n <div className={`p-3 text-center ${styles.container}`} ref={ref}>\n {props.isFetching\n ? <Spinner as='span' animation='border' role='status' className={styles.spinner} />\n : (\n <SvgContainer\n svgName={cvSvgLibrary.ChevronDown}\n className='svg-container cursor-pointer'\n size={SvgContainerSize.Large}\n onClick={() => props.fetchNext?.(props.nextCursor)}\n />\n )\n }\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { EntityType, LocationContext, SignUpDescriptors, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { FixedWidget } from 'libs/shared/components/widgets/fixed-widget';\nimport { ResourceWidgetItem, ResourceWidgetItemProps } from 'libs/shared/components/widgets/items/resource-widget-item/ResourceWidgetItem';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { Clip, Link, Resource, Video } from 'libs/shared/interfaces';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { DownloadHelper } from 'libs/shared/utils/DownloadHelper';\n\nconst namespace = 'shared.playPageResources';\n\nfunction getResources(\n video: Video,\n isLearner: boolean\n): Array<Resource | Link> {\n const resources = video.resources?.data ?? [];\n const links = video.links?.data ?? [];\n\n if (!isLearner)\n return [ ...resources, ...links ];\n\n const filteredResources = resources.filter(r => {\n return [ 'additional-materials', 'student-activity' ].includes(r.metadata?.resourceType);\n });\n\n return [ ...filteredResources, ...links ];\n}\n\ninterface PlayPageResourcesProps {\n video: Video | Clip;\n imageCdnUrl: string;\n canViewResources: boolean;\n getAppLink: (resource: Resource) => Core.AppLink;\n analyticsData: HashObject;\n resourceThumbnailFallbackUrl: string;\n containerRef?: React.RefObject<HTMLDivElement>;\n}\n\nexport function PlayPageResources(props: PlayPageResourcesProps): JSX.Element {\n const { hasPermissions } = usePermissions();\n\n function onClickDownload(resource: Resource): void {\n DownloadHelper.downloadResource(\n resource,\n props.analyticsData,\n { location: LocationContext.PlayPage, actionType: UserAction.Download, entity: EntityType.Resource }\n );\n }\n\n const resources = getResources(props.video, hasPermissions(PermissionName.StudentExperience));\n\n if (!resources.length)\n return <></>;\n\n return (\n <section id={PlayPageAnchor.Resources} className='pb-3' ref={props.containerRef}>\n <FixedWidget<ResourceWidgetItemProps>\n name={LanguageService.getPhrase(namespace, 'resources', { count: resources.length })}\n contents={WidgetContents.PlayPageResources}\n collection={resources}\n prefetched\n childComponent={ResourceWidgetItem}\n extraChildComponentProps={{\n imageCdnUrl: props.imageCdnUrl,\n imageErrorFallbackUrl: props.resourceThumbnailFallbackUrl,\n actionBehaviour: props.canViewResources ? 'normal' : 'public',\n location: 'play-page',\n titlePosition: 'below',\n onClickDownload: props.canViewResources ? onClickDownload : null\n }}\n getChildAppLink={props.getAppLink}\n analyticsOptions={(() => {\n if (props.canViewResources)\n return {};\n \n return {\n workflowPhase: WorkflowPhase.Start,\n descriptor: SignUpDescriptors.SignUp\n };\n })()}\n analyticsData={props.analyticsData}\n />\n </section>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"poiEntry\":\"Nmm9o\",\"poiText\":\"c75aW\",\"public\":\"R689i\",\"poiTimeStamp\":\"Wad94\"};","import React from 'react';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PointOfInterest } from 'libs/shared/interfaces';\nimport { DurationHelper } from 'libs/shared/utils/DurationHelper';\n\nimport styles from './points-of-interest-list.scss';\n\ninterface PointOfInterestListProps{\n pointsOfInterest: PointOfInterest[];\n suppressInteractivity?: boolean;\n onClickPoiItem: (time: number) => void\n}\n\nconst namespace = 'shared.pointsOfInterestList';\n\nexport function PointOfInterestList(props: PointOfInterestListProps) {\n return (\n <div>\n <h2 className='h6 my-2'><Text namespace={namespace} phrase='heading' /></h2>\n\n <div>\n {props.pointsOfInterest.map(poi => {\n const timeStamp = DurationHelper.ToDisplayDuration(poi.startTime * 1000);\n if (props.suppressInteractivity)\n return (\n <div key={poi.startTime} className={`d-flex ${styles.poiEntry} mb-2`}>\n <span className={`d-flex rounded-pill justify-content-center align-items-center fw-semibold ${styles.poiTimeStamp}`}>{timeStamp}</span>\n <div className={`${styles.public}`}>{poi.description}</div>\n </div>\n );\n\n return (\n <DivButton\n key={poi.startTime}\n className={`d-flex ${styles.poiEntry} mb-2 cursor-pointer`}\n onClick={() => props.onClickPoiItem(poi.startTime)}\n >\n <div className={`d-flex rounded-pill justify-content-center align-items-center fw-semibold ${styles.poiTimeStamp}`}>{timeStamp}</div>\n <div className={`ms-2 ${styles.poiText}`}>{poi.description}</div>\n </DivButton>\n );\n })}\n\n </div>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"learningIntention\":\"T2LIU\"};","import * as React from 'react';\nimport Scrollbars from 'react-custom-scrollbars-2';\n\nimport { Core } from 'libs/common/core';\n\nimport { PointOfInterestList } from 'libs/shared/components/points-of-interest-list/PointsOfInterestList';\nimport { TagHelper } from 'libs/shared/components/tags/TagHelper';\nimport { TagList } from 'libs/shared/components/tags/TagList';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { TagType } from 'libs/shared/enums/TagType';\nimport { PointOfInterest, Tag, Video } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { hasGlanceData, useLearningIntentionMarkdown } from './VideoAtAGlanceUtils';\n\nimport styles from './video-at-a-glance.scss';\n\nconst namespace = 'shared.videoAtAGlance';\n\nconst SCROLL_HEIGHT_MAX = 350; // in px\n\ninterface VideoAtAGlanceProps {\n video: Video;\n pointsOfInterest?: PointOfInterest[];\n suppressInteractivity?: boolean;\n setStartTime?: (time: number) => void;\n getTagAppLink?: (tag: Tag) => Core.AppLink;\n height?: number;\n}\n\nexport function VideoAtAGlance(props: VideoAtAGlanceProps): JSX.Element {\n const canViewGlance = hasGlanceData(props.video);\n\n const learningIntentionMarkdownHTML = useLearningIntentionMarkdown(props.video, canViewGlance);\n \n function getTags(): Tag[] {\n if (VideoHelper.isInteractive(props.video) || !props.video.tags?.data?.length)\n return null;\n\n return props.video.tags?.data?.filter(tag => tag.tagType === TagType.Pedagogy || tag.tagType === TagType.Skill);\n }\n const tags = getTags();\n\n if (!canViewGlance)\n return <></>;\n\n function onClickPoiItem(time: number) {\n props.setStartTime(time);\n }\n\n return (\n <div className='rounded border mb-3 bg-white'>\n <Scrollbars autoHeight autoHeightMax={props.height ?? SCROLL_HEIGHT_MAX} >\n <div className='px-3 px-3 pt-3 pb-2'>\n\n <h2 className='h6 mb-2'><Text namespace={namespace} phrase='learningIntention' /></h2>\n <div className={`${styles.learningIntention} mb-3`}>\n <div dangerouslySetInnerHTML={{ __html: learningIntentionMarkdownHTML }}/>\n </div>\n\n {!!tags?.length && (\n <div className='mb-1'>\n <TagList\n tags={tags}\n {...TagHelper.getTagActionProps(props.getTagAppLink, props.suppressInteractivity)}\n className='mt-2'\n />\n </div>\n )}\n\n {!!props.pointsOfInterest.length && (\n <PointOfInterestList\n pointsOfInterest={props.pointsOfInterest}\n suppressInteractivity={props.suppressInteractivity}\n onClickPoiItem={onClickPoiItem}\n />\n )}\n </div>\n </Scrollbars>\n </div>\n );\n}","import { useEffect, useState } from 'react';\nimport * as marked from 'marked';\n\nimport { Clip, Glance, Video } from 'libs/shared/interfaces';\n\nconst POI_LINK_LINE = /\\[\\]\\(cv:\\/\\/poi\\?id=\\d+\\)\\n*/g;\n\nfunction stripPoisFromGlanceContent(glanceContent: string): string {\n return glanceContent.replace(POI_LINK_LINE, '');\n}\n\nfunction getLearningIntentionHTML(glance: Glance): string {\n const learningIntention = stripPoisFromGlanceContent(glance.content);\n\n return marked(learningIntention);\n}\n\nexport function useLearningIntentionMarkdown(\n video: Video,\n hasGlanceData?: boolean\n): string {\n const [ markdownHTML, setMarkdownHTML ] = useState('');\n\n useEffect(() => {\n if (!hasGlanceData)\n return;\n\n const content = getLearningIntentionHTML(video.glance);\n\n setMarkdownHTML(content);\n }, [ video.glance?.content, hasGlanceData ]);\n\n return markdownHTML;\n}\n\nexport function hasGlanceData(video: Video | Clip): boolean {\n return video.glance?.content && video.glance?.format === 'text/markdown';\n}","import React from 'react';\n\nexport function VideoDetailsPartial(): JSX.Element {\n return (\n <div className='p-3 mb-3 border rounded'>\n <div className='row'>\n <div className='pe-3 col-md-7 border-right'>\n <div className='partial-loading-background mb-2' style={{ height: '1.5rem', width: '12rem' }}></div>\n <div className='partial-loading-background mb-2' style={{ height: '4.5rem' }}></div>\n <div className='partial-loading-background' style={{ height: '1.5rem', width: '15rem' }}></div>\n </div>\n <div className='col-md-5 ps-md-3 pt-3 pt-md-0'>\n <div className='partial-loading-background mb-2' style={{ height: '1.5rem', width: '7rem' }}></div>\n <div className='partial-loading-background mb-2' style={{ height: '1.5rem', width: '10rem' }}></div>\n <div className='partial-loading-background mb-2' style={{ height: '1.5rem', width: '12rem' }}></div>\n <div className='partial-loading-background mb-2 me-2 d-inline-block' style={{ height: '1.5rem', width: '3rem' }}></div>\n <div className='partial-loading-background mb-2 me-2 d-inline-block' style={{ height: '1.5rem', width: '4rem' }}></div>\n <div className='partial-loading-background mb-2 me-2 d-inline-block' style={{ height: '1.5rem', width: '3.5rem' }}></div>\n <div className='partial-loading-background mb-2 me-2 d-inline-block' style={{ height: '1.5rem', width: '4.5rem' }}></div>\n </div>\n </div>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialOptions\":\"Gufgq\",\"partialName\":\"SicQQ\",\"partialDescription\":\"dPGMq\",\"partialThumbnail\":\"vZrnb\",\"partialDragHandle\":\"iq73R\"};","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { VideoListHelper } from 'libs/shared/components/video-list/VideoListHelper';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\n\nimport styles from './partial-video-list.scss';\n\ninterface PartialVideoListProps {\n withReordering?: boolean;\n numVideos?: number;\n allowBulkActions?: boolean;\n}\n\nPartialVideoList.defaultProps = {\n numVideos: 15\n};\n\nexport function PartialVideoList(props: PartialVideoListProps): JSX.Element {\n return (\n <div className='mx-2'>\n {Array(props.numVideos).fill(null).map((_, i) => (\n <div className='d-flex' key={i}>\n {props.allowBulkActions && <div className='form-check pe-3 pe-sm-2 mx-0 mx-md-2' />}\n <PartialVideoItem {...props} />\n </div>\n ))}\n </div>\n );\n}\n\nexport function PartialVideoItem(props: PartialVideoListProps): JSX.Element {\n const breakpoints = useBreakpoints();\n\n const size = VideoListHelper.getSize(breakpoints, 'md');\n const isSmall = size === 'sm';\n\n const withDragHandle = props.withReordering && !breakpoints.xs;\n\n return (\n <Row className={`${isSmall ? '' : 'py-2'} flex-grow-1`}>\n <Col {...VideoListHelper.getThumbnailColumns()} className={`flex-column align-items-flex-start ${isSmall ? `pb-2 pe-1` : 'mb-1 pe-3 pe-md-2'}`}>\n <Row>\n {!!withDragHandle && (\n <div className='d-flex align-items-center justify-content-center col-2'>\n <div className={`partial-loading-background ${styles.partialDragHandle}`} />\n </div>\n )}\n <Col xs={VideoListHelper.getThumbnailColSize(withDragHandle)}>\n <div className={`partial-loading-background ${isSmall ? 'rounded' : 'rounded-3'} ${styles.partialThumbnail}`} />\n </Col>\n </Row>\n </Col>\n <Col {...VideoListHelper.getDetailsColumns()} className={isSmall ? 'pb-2' : 'px-2'}>\n <div className={`partial-loading-background mb-1 ${styles.partialName}`} />\n <div className={`partial-loading-background ${styles.partialDescription}`} />\n </Col>\n </Row>\n );\n}\n\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ThumbnailText } from 'libs/shared/components/thumbnails/thumbnail-text/ThumbnailText';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { FixedWidgetItemProps } from 'libs/shared/components/widgets/items/FixedWidgetItemProps';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { CanFavouriteFunc, FavouriteFunc, InteractiveMetadata, YearGroup } from 'libs/shared/interfaces';\n\nimport styles from './interactive-widget-item.scss';\n\nconst namespace = 'shared.interactiveWidgetItem';\n\nexport interface InteractiveWidgetItemProps extends FixedWidgetItemProps<InteractiveMetadata> {\n imageCdnUrl: string;\n questionsAppLink: Core.AppLink;\n setFavourite?: FavouriteFunc;\n canFavourite?: CanFavouriteFunc;\n yearGroups: YearGroup[];\n}\n\nexport const InteractiveWidgetItem = React.memo(function(props: InteractiveWidgetItemProps): JSX.Element {\n const { data: interactive, thumbnailSize, preloadImage } = props;\n\n const questionsAppLink: Core.AppLink = {\n ...props.questionsAppLink,\n args: [props.data.id]\n };\n\n const questionsNumber = interactive._timepoints?.value?.length;\n\n return (\n <div className={`flex-shrink-0 px-1 ${styles.item}`}>\n <VideoThumbnail\n type='cosmetic'\n textPosition={ThumbnailTextPosition.Independent}\n video={interactive}\n appLink={props.getAppLink(interactive)}\n imageOptions={{ size: thumbnailSize }}\n preload={preloadImage}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n hideDuration={false}\n imageCdnUrl={props.imageCdnUrl}\n />\n\n <div className='mt-2'>\n <ThumbnailText\n {...props}\n video={interactive}\n appLink={props.getAppLink(interactive)}\n />\n </div>\n\n <div className='mt-1'>\n <AppLink appLink={questionsAppLink} className='cursor-pointer'>\n <Text namespace={namespace} phrase='previewQuestions' options={{ count: questionsNumber, smartCount: questionsNumber }}/>\n </AppLink>\n </div>\n\n </div>\n );\n});\n","// extracted by mini-css-extract-plugin\nexport default {\"item\":\"rXatl\",\"thumbnail\":\"WHqSi\",\"smallItemIconWidth\":\"Pq45z\",\"smallItemInfoWidth\":\"rjvTM\",\"smallProgressBarContainer\":\"W_aym\"};","// extracted by mini-css-extract-plugin\nexport default {\"imageStyle\":\"FFgf3\",\"imageTypeResource\":\"z4O5p\",\"fallBackImage\":\"Xy4zX\"};","import React from 'react';\n\nimport { UrlHelper } from 'libs/analytics/utils/UrlHelper';\n\nimport { ImageSize, ImageType, ResizeType } from 'libs/shared/enums/Images';\nimport { ResourceFileType } from 'libs/shared/enums/ResourceFileType';\nimport { Link, Resource } from 'libs/shared/interfaces';\nimport { ImageHelper, ImageOptions } from 'libs/shared/utils/ImageHelper';\nimport { MasterTypeHelper } from 'libs/shared/utils/MasterTypeHelper';\n\nimport { BaseImage } from '../image/BaseImage';\n\nimport styles from './resource-thumbnail.scss';\n\n// Used for both PDFs and Links where we don't know the image ratio\nconst DYNAMIC_RATIO_IMAGE_OPTIONS: ImageOptions = {\n width: 200,\n resizeType: ResizeType.Cover\n};\n\nfunction getThumbnailUrl(imageCdnUrl: string, resource: Resource | Link): string {\n const imageType = getImageType(resource);\n\n // Use the thumbnail if defined\n if ('thumbnail' in resource && resource.thumbnail?.url)\n return ImageHelper.createUrl(resource.thumbnail?.url, { ...DYNAMIC_RATIO_IMAGE_OPTIONS });\n \n const previewUrl = UrlHelper.safeUrlConcat(imageCdnUrl, '/v1/previews');\n\n if (!MasterTypeHelper.isResource(resource))\n return ImageHelper.createResourceImage(previewUrl, resource.url, { ...DYNAMIC_RATIO_IMAGE_OPTIONS });\n\n if (imageType === ImageType.Pdf) {\n return resource.metadata.type === ResourceFileType.Pdf\n ? ImageHelper.createResourceImage(previewUrl, resource.url, { ...DYNAMIC_RATIO_IMAGE_OPTIONS })\n : ImageHelper.createResourceImage(previewUrl, resource.pdf?.url, { ...DYNAMIC_RATIO_IMAGE_OPTIONS });\n }\n\n if (resource.metadata.type !== ResourceFileType.Zip)\n return ImageHelper.createUrl(resource.url, { size: ImageSize.Medium, resizeType: ResizeType.Cover });\n\n return '/images/zip-resource.png';\n}\n\nfunction getImageType(resource: Resource | Link): ImageType {\n if (!MasterTypeHelper.isResource(resource))\n return ImageType.Link;\n\n if (resource.metadata.type === ResourceFileType.Pdf || resource.pdf?.url)\n return ImageType.Pdf;\n\n return ImageType.Thumbnails;\n}\n\ninterface ResourceThumbnailProps {\n imageCdnUrl: string;\n resource: Resource | Link;\n imageErrorFallbackUrl: string;\n preloadImage: boolean;\n}\n\nexport function ResourceThumbnail(props: ResourceThumbnailProps): JSX.Element {\n let metadata = null;\n let rotation = 0;\n\n if (MasterTypeHelper.isResource(props.resource)) {\n metadata = props.resource.metadata;\n rotation = props.resource.thumbnail?.metadata?.rotation ?? 0;\n }\n\n const thumbnailUrl = getThumbnailUrl(props.imageCdnUrl, props.resource);\n\n return (\n <BaseImage\n data={thumbnailUrl}\n imageType={getImageType(props.resource)}\n imageStyle={{ transform: `rotate(${rotation}deg)` }}\n alt={props.resource.name}\n errorFallbackImageSrc={props.imageErrorFallbackUrl}\n errorFallbackImageClassName={styles.fallBackImage}\n imageClassName={metadata?.type === ResourceFileType.Image ? `${styles.imageTypeResource} ${styles.imageStyle}` : ''}\n preload={props.preloadImage}\n preventLoad={!props.preloadImage}\n >\n </BaseImage>\n );\n}","import { ResourceType } from 'libs/shared/interfaces';\n\nexport const ResourceHelper = {\n getResourceTypeName(resourceType: ResourceType): string {\n switch (resourceType) {\n case 'additional-materials':\n return 'Additional Materials';\n\n case 'atom-guide':\n return 'ATOM Guide';\n\n case 'teacher-pack':\n return 'Teacher Pack';\n\n case 'student-activity':\n return 'Student Activity';\n\n default:\n return 'N/A';\n }\n }\n};","// extracted by mini-css-extract-plugin\nexport default {\"imageStyle\":\"I9E5O\",\"item\":\"tqUFn\",\"dashboard\":\"o7j7p\",\"playPage\":\"V2RwX\",\"aspectRatio\":\"OnJDH\",\"outerContainer\":\"CIFy7\",\"innerContainer\":\"oUZPD\",\"actions\":\"jzGAm\",\"titleBelow\":\"Cpjs3\",\"thumbnailContainer\":\"EDiGi\",\"titleAbove\":\"e9ejn\",\"teacherPack\":\"_tdVE\",\"text\":\"g5NWS\",\"hoverState\":\"xRYhX\",\"atomGuide\":\"X39wU\",\"studentActivity\":\"X9pMl\",\"additionalMaterials\":\"qRVUo\",\"userUploaded\":\"_18JaV\",\"imageTypeResource\":\"KYtZL\",\"download\":\"fbb_e\"};","import React from 'react';\n\nimport { AppLinkHelper } from 'libs/common/backbone/core';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, EntityType, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { ResourceThumbnail } from 'libs/shared/components/resource-thumbnail/ResourceThumbnail';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { TitleSubText } from 'libs/shared/components/title-sub-text/TitleSubText';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { TypeBadge } from 'libs/shared/components/type-badge/TypeBadge';\nimport { FixedWidgetItemProps } from 'libs/shared/components/widgets/items/FixedWidgetItemProps';\nimport { SeoConstants } from 'libs/shared/constants/SeoConstants';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ResourceFileType } from 'libs/shared/enums/ResourceFileType';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Link, Resource, ResourceType } from 'libs/shared/interfaces';\nimport { MasterTypeHelper } from 'libs/shared/utils/MasterTypeHelper';\nimport { ResourceHelper } from 'libs/shared/utils/ResourceHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './resource-widget-item.scss';\n\nfunction getColour(resourceType?: ResourceType): string {\n switch (resourceType) {\n case 'atom-guide':\n return styles.atomGuide;\n case 'student-activity':\n return styles.studentActivity;\n case 'teacher-pack':\n return styles.teacherPack;\n case 'additional-materials':\n return styles.additionalMaterials;\n default:\n return styles.userUploaded;\n }\n}\n\nfunction useCanPreview(data: Resource | Link, actionBehaviour: 'normal' | 'public'): boolean {\n const breakpoints = useBreakpoints();\n\n /**\n * When viewing publicly, the resource applink will\n * prompt the user to sign-up (not preview the underlying resource)\n */\n if (actionBehaviour === 'public')\n return true;\n\n if (breakpoints.xs || breakpoints.sm)\n return false;\n\n if (data.type !== 'resource')\n return false;\n \n // Require metadata\n if (!('metadata' in data))\n return false;\n\n // We can preview images\n if (data.metadata.type === ResourceFileType.Image)\n return true;\n\n // If we are a pdf and have a url\n if (data.metadata.type === ResourceFileType.Pdf)\n return !!data.url;\n\n // If we have a pdf assoc\n return !!data.pdf?.url;\n}\n\ninterface ResourceTheme {\n containerClass?: string;\n thumbnailContainerClass?: string;\n}\n\nexport interface ResourceTileProps {\n data: Resource | Link;\n imageCdnUrl: string;\n imageErrorFallbackUrl?: string;\n theme?: ResourceTheme;\n\n titlePosition: 'above' | 'below' | 'none';\n hideTypeBadge?: boolean;\n onClickDownload?: (resource: Resource) => void;\n applyHoverState?: boolean;\n preloadImage: boolean;\n actionBehaviour?: 'normal' | 'public';\n}\n\nResourceTile.defaultProps = {\n preloadImage: true,\n actionBehaviour: 'normal'\n};\n\n/**\n * This component intentionally doesn't contain an appLink/download link\n * so that the resource download behaviour can be handled differently depending\n * on where this is rendered (e.g. primary play page vs embedded player)\n */\nexport function ResourceTile(props: ResourceTileProps): JSX.Element {\n let metadata = null;\n\n if ('metadata' in props.data) {\n metadata = props.data.metadata;\n }\n\n const isResource = MasterTypeHelper.isType<Resource>(props.data, MasterType.Resource);\n\n function getInnerContainerClass(resourceType: ResourceType): string {\n let baseClass = `\n d-flex flex-column align-items-center justify-content-end rounded-3 h-100\n position-relative ${getColour(resourceType)} ${styles.innerContainer}`;\n\n if (props.theme?.containerClass) {\n baseClass += ` ${props.theme.containerClass}`;\n } else {\n baseClass += ` pt-3 px-3`;\n }\n\n if (props.applyHoverState) {\n baseClass += ` ${styles.hoverState}`;\n }\n\n return baseClass;\n }\n\n function onDownload() {\n if (!MasterTypeHelper.isResource(props.data))\n return;\n\n if (typeof props.onClickDownload === 'function') {\n props.onClickDownload(props.data);\n }\n }\n\n return (\n <>\n <div className={styles.aspectRatio}>\n <div className={styles.outerContainer}>\n <div className={getInnerContainerClass(metadata?.resourceType)}>\n {props.titlePosition === 'above' && (\n <Tooltip title={props.data.name}>\n <h3 className={`text-center text-break h5 mb-3 ${styles.text}`}>\n <span className='clamp-1'>{props.data.name}</span>\n </h3>\n </Tooltip>\n )}\n\n <div className={`\n ${props.theme?.thumbnailContainerClass ?? ''} w-75 overflow-hidden \n ${styles.thumbnailContainer} ${props.titlePosition === 'above' ? styles.titleAbove : ''} \n ${styles.imageStyle}\n `}>\n <ResourceThumbnail\n resource={props.data}\n imageCdnUrl={props.imageCdnUrl}\n imageErrorFallbackUrl={props.imageErrorFallbackUrl}\n preloadImage={props.preloadImage}\n />\n </div>\n\n {isResource && props.onClickDownload && props.actionBehaviour === 'normal' && (\n <div className={styles.actions}>\n <DivButton\n onClick={e => {\n e.preventDefault();\n e.stopPropagation();\n onDownload();\n }}\n className={`${styles.download} d-flex align-items-center justify-content-center`}\n >\n <SvgContainer svgName={cvSvgLibrary.Download} />\n </DivButton>\n </div>\n )}\n\n {!props.hideTypeBadge && isResource && (\n <TypeBadge typeId={MasterType.Resource} />\n )}\n </div>\n </div>\n </div>\n {props.titlePosition === 'below' && MasterTypeHelper.isType<Resource>(props.data, MasterType.Resource) && (\n <div className={`mt-1 ${styles.titleBelow}`}>\n {!!props.data?.metadata?.resourceType && (\n <TitleSubText>\n {ResourceHelper.getResourceTypeName(props.data.metadata.resourceType)}\n </TitleSubText>\n )}\n <h3 className='h6 clamp-2'>\n {props.data.name}\n </h3>\n </div>\n )}\n </>\n );\n}\n\nexport interface ResourceWidgetItemProps extends ResourceTileProps, FixedWidgetItemProps<Resource | Link> {\n location: 'play-page' | 'dashboard';\n}\n\nexport const ResourceWidgetItem = React.memo(function(props: ResourceWidgetItemProps): JSX.Element {\n // Mobile is not allowed to preview\n const canPreview = useCanPreview(props.data, props.actionBehaviour);\n\n function getLocationClass(): string {\n if (props.location === 'play-page')\n return styles.playPage;\n\n return styles.dashboard;\n }\n\n const analyticsData = { ...props.analyticsData, ...props.data };\n\n const analyticsOptions: AnalyticsOptions = {\n ...props.analyticsOptions,\n actionType: UserAction.Click,\n entity: props.data.typeId === MasterType.Resource ? EntityType.Resource : EntityType.Link\n };\n\n function logAction(): void {\n AnalyticsHelper.logUserAction(analyticsData, analyticsOptions);\n }\n\n const tileProps: ResourceTileProps = {\n ...props,\n // Apply the hover state if we have a url or the resource can be previewed\n applyHoverState: canPreview || !!props.data.url\n };\n\n return (\n <div className={`px-1 flex-shrink-0 ${styles.item} ${getLocationClass()} ${SeoConstants.RESOURCE_ITEM_SELECTOR}`}>\n {(() => {\n const className = `d-block ${props.titlePosition === 'above' ? 'no-decoration' : ''}`;\n\n // Handle resource links\n if (props.data.type === 'link') {\n return (\n <a href={props.data.url} target='_blank' className={className} onClick={logAction}>\n <ResourceTile {...tileProps} />\n </a>\n );\n }\n\n if (canPreview) {\n /**\n * Previewing resources in a public context will always display the sign-up popup, so there \n * will never be a full URL. For SEO purposes, we deliberately use a span over an anchor\n * to ensure we're not creating self-referencing elements that will burn crawl budget.\n */\n if (props.actionBehaviour === 'public') {\n return (\n <div className={`${className} cursor-pointer d-inline`} onClick={() => {\n logAction();\n AppLinkHelper.trigger(props.getAppLink(props.data));\n }}>\n <ResourceTile {...tileProps} />\n </div>\n );\n }\n\n return (\n <AppLink\n appLink={props.getAppLink(props.data)}\n className={className}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n >\n <ResourceTile {...tileProps} />\n </AppLink>\n );\n }\n\n // URLs cannot be previewed\n if (props.data.url) {\n return (\n <a href={props.data.url} className={className} onClick={logAction}>\n <ResourceTile {...tileProps} />\n </a>\n );\n }\n\n // Theres no url, so don't render an <a>\n return (\n <div className={className}>\n <ResourceTile {...tileProps} />\n </div>\n );\n })()}\n </div>\n );\n});","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { Theme } from 'libs/shared/interfaces';\n\nimport { ThemeType } from '../enums/ThemeType';\n\nexport const ThemeRequests = {\n theme(id: string): Flight.Request {\n return {\n url: `/api/domain/v1/themes/${id}`,\n key: `themes:${id}`\n };\n },\n\n themeImages(name: string, type: ThemeType): Flight.Request {\n return {\n url: UrlHelper.urlBuilder('/api/domain/v1/themes', { name, type }),\n key: `themes:${name}:${type}`\n };\n },\n\n themes(type?: string): Flight.Request {\n let url = '/api/domain/v1/themes';\n let key = 'themes';\n\n if (type) {\n url += `?type=${type}`;\n key += `:type:${type}`;\n }\n\n return {\n url,\n key,\n formatData: (themes: Theme[]) => {\n return themes.sort((a, b) => a.name.localeCompare(b.name));\n }\n };\n },\n\n createTheme(\n data: Theme,\n success?: (data: HashObject) => void,\n error?: (xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: '/api/domain/v1/themes',\n key: 'theme',\n data,\n type: HttpVerbs.POST,\n invalidationKeys: 'themes',\n success,\n error,\n always\n };\n },\n\n updateTheme(\n id: string,\n data: Theme,\n success?: (data: HashObject) => void,\n error?: (xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: `/api/domain/v1/themes/${id}`,\n key: `update:theme:${id}`,\n data,\n type: HttpVerbs.PUT,\n success,\n error,\n always\n };\n },\n\n deleteTheme(\n id: string,\n success?: (data: HashObject) => void,\n error?: (xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: `/api/domain/v1/themes/${id}`,\n key: `delete:theme:${id}`,\n type: HttpVerbs.DELETE,\n invalidationKeys: 'themes',\n success,\n error,\n always\n };\n }\n};","import React from 'react';\n\n// https://reactjs.org/docs/hooks-faq.html#how-to-get-the-previous-props-or-state\nexport function usePrevious<T>(value: T): T {\n const ref = React.useRef<T>();\n React.useEffect(() => {\n ref.current = value;\n });\n return ref.current;\n}","import React from 'react';\n\nimport { usePrevious } from './usePrevious';\n\nconst HEADER_OFFSET = 80; // Size of header + some extra spacing\n\nexport const useTableOfContentsScroll = (elements: Element[], activeId: string) => {\n const [ hasDoneInitialScroll, setHasDoneInitialScroll ] = React.useState(false);\n\n const previousId = usePrevious(activeId);\n const currentId = activeId;\n\n React.useLayoutEffect(() => {\n if (!hasDoneInitialScroll || previousId !== currentId) {\n const target = elements.find(heading => heading && (heading?.id === currentId));\n\n if (target) {\n const rec = target.getBoundingClientRect();\n\n window.scrollBy({\n top: rec.top - HEADER_OFFSET,\n behavior: 'smooth'\n });\n \n if (!hasDoneInitialScroll)\n setHasDoneInitialScroll(true);\n }\n }\n }, [ elements, previousId, currentId, hasDoneInitialScroll ]);\n};","import { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, EntityType, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { Resource } from '../interfaces';\n\nlet downloadRef: HTMLIFrameElement = null;\n\nexport const DownloadHelper = {\n getVideoDownloadUrl(downloadProxyUrl: string, token: string): string {\n return UrlHelper.safeUrlConcat(UrlHelper.makeHttps(downloadProxyUrl), `/download?token=${token}`);\n },\n\n downloadResource(\n resource: Resource,\n analyticsData: HashObject,\n analyticsOptions: AnalyticsOptions\n ): void {\n let iframe = downloadRef;\n\n if (!downloadRef) {\n iframe = downloadRef = document.createElement('iframe');\n document.body.appendChild(iframe);\n\n iframe.style.display = 'none';\n }\n\n iframe.src = resource.url;\n\n AnalyticsHelper.logUserAction({\n id: resource?.id,\n name: resource?.name,\n resourceType: resource?.metadata?.resourceType,\n ...analyticsData\n }, {\n actionType: UserAction.Download,\n entity: EntityType.Resource,\n workflowPhase: WorkflowPhase.Complete,\n ...analyticsOptions\n });\n }\n};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType } from 'libs/analytics/interfaces';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.playPage';\n\ninterface ArchivedBannerProps {\n typeId: MasterType;\n hasStudentExperience: boolean;\n}\n\nfunction mapTypeId(typeId: MasterType): string {\n switch (typeId) {\n case MasterType.Video:\n return 'video';\n case MasterType.Clip:\n return 'clip';\n case MasterType.Interactive:\n return 'interactive';\n default:\n return '';\n }\n}\n\nexport function ArchivedBanner(props: ArchivedBannerProps): JSX.Element {\n const getPhrase = LanguageService.encloseNamespace(namespace);\n const type = mapTypeId(props.typeId);\n\n return (\n <div className='alert bg-light-blue p-3 rounded-3 d-flex justify-content-between align-items-center'>\n <SvgContainer\n svgName={cvSvgLibrary.Archive}\n size={SvgContainerSize.Standard}\n className='me-2 svg-container'\n />\n \n <div className='w-100'>\n <p className='fw-semibold mb-0'>{getPhrase('archivedInfoTitle', { type })}</p>\n {(!props.hasStudentExperience || type === EntityType.Video) && (\n <p className='mb-1'>{getPhrase('archivedInfo', { type: `${type}s` })}</p>\n )}\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { RestrictionType } from 'libs/shared/enums/RestrictionType';\nimport { Restrictions, YearGroup } from 'libs/shared/interfaces';\nimport { RestrictionHelper } from 'libs/shared/utils/RestrictionHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'shared.playPage';\n\ninterface RestrictionBannerProps {\n restrictions: Restrictions;\n yearGroups: YearGroup[];\n objectId: string;\n objectTypeId: MasterType;\n canManageVideoAccess: boolean;\n}\n\nexport function RestrictionBanner(props: RestrictionBannerProps): JSX.Element {\n if (!props.restrictions?.value?.length || !props.yearGroups || !props.canManageVideoAccess)\n return <></>;\n\n const restriction = RestrictionHelper.getWeightedRestriction(props.restrictions.value);\n\n if (restriction.type !== RestrictionType.Custom)\n return <></>;\n\n const baseClassName = RestrictionHelper.mapRestrictionToClass(props.restrictions);\n const className = `${baseClassName} fw-semibold p-2 rounded mb-3 d-flex justify-content-between align-items-center`;\n\n return (\n <div className={className}>\n <div className='d-flex align-items-center'>\n <SvgContainer\n svgName={RestrictionHelper.mapRestrictionToSvg(props.restrictions)}\n size={SvgContainerSize.Large}\n />\n <span className='ps-1'>\n {RestrictionHelper.mapRestrictionToText(props.restrictions, props.yearGroups)}\n </span>\n </div>\n \n <AppLink\n appLink={{\n application: AppChannels.DEFAULT,\n action: Actions.Default.APPROVE_VIDEO,\n params: {\n objectId: props.objectId,\n objectTypeId: props.objectTypeId\n }\n }}\n className='btn btn-outline-dark'\n >\n <Text namespace={namespace} phrase='approve' />\n </AppLink>\n </div>\n );\n}","import React from 'react';\n\nimport { ThumbnailText } from 'libs/shared/components/thumbnails/thumbnail-text/ThumbnailText';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { FixedWidgetItemProps } from 'libs/shared/components/widgets/items/FixedWidgetItemProps';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { CanFavouriteFunc, Clip, FavouriteFunc, YearGroup } from 'libs/shared/interfaces';\n\nimport styles from './clip-widget-item.scss';\n\nexport interface ClipWidgetItemProps extends FixedWidgetItemProps<Clip> {\n imageCdnUrl: string;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n yearGroups: YearGroup[];\n}\n\nexport const ClipWidgetItem = React.memo(function(props: ClipWidgetItemProps): JSX.Element {\n const { data: clip, thumbnailSize, preloadImage, getAppLink } = props;\n\n return (\n <div className={`flex-shrink-0 px-1 ${styles.item}`}>\n <VideoThumbnail\n type='cosmetic'\n textPosition={ThumbnailTextPosition.Independent}\n video={clip}\n appLink={getAppLink(clip)}\n imageOptions={{ size: thumbnailSize }}\n preload={preloadImage}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n imageCdnUrl={props.imageCdnUrl}\n hideDuration={false}\n />\n\n <div className='mt-2'>\n <ThumbnailText\n {...props}\n video={clip}\n appLink={props.getAppLink(clip)}\n />\n </div>\n </div>\n );\n});","// extracted by mini-css-extract-plugin\nexport default {\"item\":\"hzP5u\",\"thumbnail\":\"z2JjL\",\"smallItemIconWidth\":\"PfCrs\",\"smallItemInfoWidth\":\"AHFZu\",\"smallProgressBarContainer\":\"WfOtB\",\"smallItemNameWidth\":\"Rq6Cd\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { FixedWidget } from 'libs/shared/components/widgets/fixed-widget';\nimport { ClipWidgetItem, ClipWidgetItemProps } from 'libs/shared/components/widgets/items/clip-widget-item/ClipWidgetItem';\nimport { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { CanFavouriteFunc, Clip, FavouriteFunc, Video, YearGroup } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'shared.playPageClips';\n\ninterface PlayPageClipsProps {\n video: Video | Clip;\n clips: Clip[];\n canViewClips: boolean;\n yearGroups: YearGroup[];\n imageCdnUrl: string;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n analyticsData: HashObject;\n}\n\nexport function PlayPageClips(props: PlayPageClipsProps): JSX.Element {\n if (!props.canViewClips || !props.clips?.length)\n return <></>;\n\n return (\n <section className='pb-3'>\n <FixedWidget<ClipWidgetItemProps>\n name={LanguageService.getPhrase(namespace, 'clips', { count: props.clips.length })}\n contents={WidgetContents.Clips}\n collection={props.clips}\n prefetched\n getChildAppLink={(clip: Clip) => {\n return {\n application: AppChannels.CLIPS,\n action: Actions.Clips.PLAY_CLIP,\n args: [ clip.id, TextHelper.slugify(clip.name) ]\n };\n }}\n appLink={{\n action: Actions.Videos.VIDEO_CLIPS,\n application: AppChannels.VIDEOS,\n args: [props.video.id],\n params: {\n parentType: VideoHelper.isClip(props.video) ? 'clip' : 'video'\n }\n }}\n childComponent={ClipWidgetItem}\n extraChildComponentProps={{\n yearGroups: props.yearGroups,\n imageCdnUrl: props.imageCdnUrl,\n setFavourite: props.setFavourite,\n canFavourite: props.canFavourite\n }}\n analyticsData={props.analyticsData}\n />\n </section>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { FixedWidget } from 'libs/shared/components/widgets/fixed-widget';\nimport { InteractiveWidgetItem, InteractiveWidgetItemProps } from 'libs/shared/components/widgets/items/interactive-widget-item/InteractiveWidgetItem';\nimport { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { CanFavouriteFunc, Clip, FavouriteFunc, Interactive, Video, YearGroup } from 'libs/shared/interfaces';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'shared.playPageInteractives';\n\ninterface PlayPageInteractivesProps {\n canViewInteractives: boolean;\n video: Video | Clip;\n imageCdnUrl: string;\n analyticsData: HashObject;\n containerRef: React.RefObject<HTMLDivElement>;\n yearGroups: YearGroup[];\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n}\n\nexport function PlayPageInteractives(props: PlayPageInteractivesProps): JSX.Element {\n if (!props.canViewInteractives || !props.video.interactives?.data?.length)\n return <></>;\n\n return (\n <section className='pb-3' ref={props.containerRef} id={PlayPageAnchor.Interactives}>\n <FixedWidget<InteractiveWidgetItemProps>\n name={LanguageService.getPhrase(namespace, 'interactives', { count: props.video.interactives.data.length })}\n contents={WidgetContents.Interactives}\n collection={props.video.interactives.data}\n prefetched\n getChildAppLink={(interactive: Interactive) => {\n return {\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.VIEW_INTERACTIVE,\n args: [ interactive.id, TextHelper.slugify(interactive.name) ]\n };\n }}\n appLink={{\n action: Actions.Videos.VIDEO_INTERACTIVES,\n application: AppChannels.VIDEOS,\n args: [props.video.id],\n params: {\n parentType: VideoHelper.isClip(props.video) ? 'clip' : 'video'\n }\n }}\n childComponent={InteractiveWidgetItem}\n extraChildComponentProps={{\n yearGroups: props.yearGroups,\n setFavourite: props.setFavourite,\n canFavourite: props.canFavourite,\n imageCdnUrl: props.imageCdnUrl,\n questionsAppLink: {\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.PREVIEW_QUESTIONS\n }\n }}\n analyticsData={props.analyticsData}\n />\n </section>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"series\":\"wTlJJ\",\"badgeListContainer\":\"Vaout\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { Actions } from 'libs/shared/components/actions/Actions';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { AudienceLabel } from 'libs/shared/components/audience-label/AudienceLabel';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BadgeListContainer } from 'libs/shared/components/badges/BadgeListContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { RestrictionPadlock } from 'libs/shared/components/video-list/components/restriction-padlock/RestrictionPadlock';\nimport { VideoSubText } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { Clip, PresentationAudience, Series, Video, YearGroup } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { VideoFeaturesHash } from 'shared/hooks/useVideoFeatureAccess';\n\nimport styles from './title-and-actions.scss';\n\nconst namespace = 'shared.playPage';\n\ninterface PlayPageTitleAndActionsProps {\n media: Clip | Video;\n yearGroups: YearGroup[];\n audiences: PresentationAudience[];\n featureAccess: VideoFeaturesHash;\n getSeriesAppLink?: (series: Series) => Core.AppLink;\n originalVideoAppLink?: Core.AppLink;\n shareId: string;\n}\n\nexport function PlayPageTitleAndActions(props: PlayPageTitleAndActionsProps): JSX.Element {\n const mergedAudience = useMergeAudiences(props.media.subjectPresentationAudiences?.data, props.audiences);\n\n const containerRef = React.useRef<HTMLDivElement>(null);\n const titleContainerRef = React.useRef<HTMLDivElement>(null);\n\n const hasBadges = (\n (VideoHelper.isVideo(props.media) && !!props.media.rating?.value) ||\n (VideoHelper.isVideo(props.media) && !!props.media.productionYear) ||\n !!props.media.subjectPresentationAudiences?.data?.length\n );\n\n const videoActions = useVideoActions({\n location: VideoActionsLocation.PlayPage,\n shareId: props.shareId\n });\n\n const canViewOriginal = !!props.originalVideoAppLink &&\n VideoHelper.isClip(props.media) &&\n VideoHelper.canViewOriginalVideo(props.media);\n\n return (\n <section className='mb-3 position-relative' ref={containerRef}>\n <div className='d-inline-block w-100' ref={titleContainerRef}>\n {props.featureAccess.canNavigate &&\n <div className='ms-2 float-end'>\n <Actions\n actions={videoActions.getVideoActions(props.media)}\n actionsDropdownClassName='btn btn-outline-dark'\n fetchMore={() => videoActions.fetchMoreActions(props.media)}\n />\n </div>\n }\n\n {!!VideoHelper.isVideo(props.media) && (\n <VideoSubText\n type='series'\n video={props.media}\n appLink={props.getSeriesAppLink?.(props.media.series)}\n className={`${styles.series} text-truncate mw-100`}\n analyticsOptions={{ location: LocationContext.PlayPage }}\n />\n )}\n <h1 className='h4 mb-2 mw-100'>\n <span className='align-self-center'>{props.media.name}</span>\n <RestrictionPadlock\n tooltipPlacement='right'\n className='d-inline-block ps-1'\n video={props.media}\n yearGroups={props.yearGroups}\n />\n </h1>\n\n {hasBadges && (\n <BadgeListContainer className={styles.badgeListContainer}>\n <AudienceLabel\n audience={mergedAudience}\n className='bg-white text-dark'\n border='dark'\n />\n {VideoHelper.isVideo(props.media) && (\n <Badge type={BadgeType.Rating} data={props.media.rating} />\n )}\n {VideoHelper.isVideo(props.media) && (\n <Badge type={BadgeType.ProductionYear} data={props.media.productionYear} />\n )}\n </BadgeListContainer>\n )}\n </div>\n\n {VideoHelper.isClip(props.media) && canViewOriginal && (\n <p className='clamp-1'>\n <Text namespace={namespace} phrase='viewOriginal' />\n &nbsp;\n <AppLink className='info-link' appLink={props.originalVideoAppLink}>\n {props.media._parentVideo?.name}\n </AppLink>\n </p>\n )}\n </section>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"mask\":\"LL7My\",\"centeredIcon\":\"x_1f6\",\"bgImage\":\"QoLgZ\",\"centeredOverlay\":\"BcnSH\"};","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { EntityType, LocationContext, SignUpDescriptors, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './player-placeholder.scss';\n\nconst namespace = 'shared.playerPlaceholder';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface PlayerPlaceholderProps {\n video: VideoTypes;\n type: 'pip' | 'public';\n appLink?: Core.AppLink;\n}\n\nexport function PlayerPlaceholder(props: PlayerPlaceholderProps): JSX.Element {\n switch (props.type) {\n case 'pip':\n return <PipPlaceholder {...props} />;\n case 'public':\n return <PublicPlaceholder {...props} />;\n default:\n return <></>;\n }\n}\n\nconst PipPlaceholder = (props: PlayerPlaceholderProps) => (\n <div\n className={`position-relative responsive-img ${styles.bgImage}`}\n style={{ backgroundImage: `url('${VideoHelper.getThumbnail(props.video)?.url ?? ''}')` }}\n >\n <p className={`m-0 text-white h3 ${styles.centeredOverlay}`}>{getPhrase('playingPiP')}</p>\n <div className={styles.mask} />\n </div>\n);\n\nconst PublicPlaceholder = (props: PlayerPlaceholderProps) => {\n const thumbnailUrl = ImageHelper.createUrl(VideoHelper.getThumbnail(props.video)?.url ?? '', {\n size: ImageSize.Large\n });\n\n return (\n <div\n className={`position-relative responsive-img ${styles.bgImage}`}\n style={{ backgroundImage: `url('${thumbnailUrl}')` }}\n >\n <AppLink\n appLink={props.appLink}\n analyticsOptions={{\n actionType: UserAction.Click,\n location: LocationContext.PlayPage,\n entity: EntityType.AppLink,\n workflowPhase: WorkflowPhase.Start,\n descriptor: SignUpDescriptors.SignUp\n }}\n analyticsData={{}}\n >\n <SvgContainer\n svgName={cvSvgLibrary.PlayCircle}\n className={styles.centeredIcon}\n />\n <div className={styles.mask} />\n </AppLink>\n </div>\n );\n};","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PartialVideoList } from 'libs/shared/components/video-list/partial-loading/PartialVideoList';\nimport { VideoList } from 'libs/shared/components/video-list/VideoList';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { CanFavouriteFunc, CurrentUser, FavouriteFunc, PresentationAudience, VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { RelatedVideosHash } from 'shared/hooks/useGetRelatedVideos';\nimport { InteractiveHelpers } from 'shared/utils/InteractiveHelper';\n\nimport { SeriesAppLinkHelper } from 'apps/series/SeriesAppLinkHelper';\n\nconst namespace = 'shared.relatedVideos';\n\ninterface RelatedVideosProps {\n currentVideo: VideoTypes;\n yearGroups: YearGroup[];\n relatedVideos: RelatedVideosHash;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n currentUser: CurrentUser;\n audiences: PresentationAudience[];\n getVideoAppLink: (video: VideoTypes, opts: GetVideoAppLinkOptions) => Core.AppLink;\n moviesAndTv: boolean;\n}\n\nexport function RelatedVideos(props: RelatedVideosProps): JSX.Element {\n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem });\n const { hasPermissions } = usePermissions();\n\n if (!props.currentUser?.isAuthenticated) // Don't render if user is unauthenticated\n return <></>;\n\n if (props.relatedVideos.hasError) // Don't render if request has errored\n return <></>;\n\n if (props.relatedVideos.hasCompleted && !props.relatedVideos.videos?.length) // Don't render if response is empty\n return <></>;\n\n if (!props.relatedVideos.isFetching && !props.relatedVideos.hasCompleted) // Don't render if request is never made\n return <></>;\n\n // We don't support autoplaying from interactives. This means the related videos heading won't say \"Up next\"\n const canAutoplay = !VideoHelper.isInteractive(props.currentVideo);\n\n return (\n <VideoActionsContext.Provider value={videoActions}>\n <h2 className='h4 mb-0'>\n <Text namespace={namespace} phrase={canAutoplay ? 'upNext' : 'relatedVideos'} />\n </h2>\n {props.relatedVideos.hasCompleted\n ? (\n <VideoList\n videos={props.relatedVideos.videos}\n yearGroups={props.yearGroups}\n getSubTextAppLink={video => {\n return SeriesAppLinkHelper.getSeriesAppLink(video.series, props.moviesAndTv ? { mtv: true } : null);\n }}\n getVideoAppLink={props.getVideoAppLink}\n hasPermissions={hasPermissions}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n presentationAudiences={props.audiences}\n getPreviewQuestionsAppLink={interactive => InteractiveHelpers.getPreviewQuestionsAppLink(interactive)}\n />\n ) : <PartialVideoList />\n }\n {props.relatedVideos.hasMore &&\n <InfiniteScrollFooter\n isFetching={props.relatedVideos.isFetching}\n fetchNext={props.relatedVideos.fetchNext}\n />\n }\n </VideoActionsContext.Provider>\n );\n}","import { Flight } from 'libs/common/react/index';\n\nimport { LocalPermissionName, PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { Config } from 'libs/shared/interfaces/models/Config';\n\nimport { LiteRouteHelper } from 'shared/utils/LiteRouteHelper';\n\nexport interface VideoFeaturesHash {\n canViewGlance: boolean;\n canViewResources: boolean;\n canViewInteractives: boolean;\n canViewClips: boolean;\n canUseActions: boolean;\n canViewPublicLayout: boolean;\n canNavigate: boolean;\n canViewCurriculumLinks: boolean;\n canViewResourceItems: boolean;\n canWatchPublicly: (videoId: string) => boolean;\n}\n\nexport function useVideoFeatureAccess() {\n const { hasPermissions, hasLocalPermissions } = usePermissions();\n const { hasProduct } = useProducts();\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const hasNP = hasProduct(ProductId.Primary);\n\n function showPublicLayout(): boolean {\n /**\n * Authenticated users should never see the placeholder\n */\n if (hasLocalPermissions(LocalPermissionName.WatchVideos))\n return false;\n\n /**\n * Accessing a play page unathenticated will have different contextual behabviours:\n * - For a share page, the user should see the video and never the placeholder\n * - For a public browsing page (ie. using a route-prefix) they should see the placeholder\n */\n return LiteRouteHelper.hasRegionPrefix();\n }\n\n /**\n * Publicly available video ids are maintained on the backend config. \n */\n function canWatchPublicly(videoId: string): boolean {\n if (!videoId)\n return false;\n\n return !!config.data?.allowedPublicVideos?.[videoId];\n }\n\n return {\n canWatchPublicly,\n canViewGlance: hasPermissions(PermissionName.ViewVideoGlance),\n canViewResources: true,\n canViewInteractives: hasNP && hasPermissions(PermissionName.ViewVideoInteractives),\n canViewClips: hasNP && hasPermissions(PermissionName.ViewVideoClips),\n canViewCurriculumLinks: hasPermissions(PermissionName.ViewCurriculums),\n canUseActions: hasLocalPermissions(LocalPermissionName.UseVideoActions),\n canViewPublicLayout: showPublicLayout(),\n canViewResourceItems: hasLocalPermissions(LocalPermissionName.ViewVideoResourceItems),\n canNavigate: hasNP\n };\n}","import React from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { CurrentUser, Video, VideoCollection } from 'libs/shared/interfaces';\n\ninterface VideoMixinOptions {\n /**\n * If the videos that are having new data mixed into are sitting on an explicit Flight namespace,\n * providing that namespace here is required\n */\n flightNamespace?: string;\n}\n\nexport function useVideoMixin(videos: VideoCollection | Video[], options: VideoMixinOptions = {}): void {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const hydratedVideos = React.useRef<Set<string>>(new Set<string>());\n\n const videoIds = videos && (Array.isArray(videos)\n ? videos.filter(Boolean).map(v => v.id)\n : videos.data.filter(Boolean).map(v => v.id));\n\n const [ request, setRequest ] = React.useState<Flight.Request[]>([]);\n\n React.useEffect(() => {\n if (!videoIds?.length || !currentUser.data?.isAuthenticated)\n return;\n\n const unhydratedVideos: string[] = [];\n\n videoIds.forEach(id => {\n if (!hydratedVideos.current.has(id)) {\n unhydratedVideos.push(id);\n hydratedVideos.current.add(id);\n }\n });\n \n if (!unhydratedVideos.length)\n return;\n\n setRequest(r => [\n ...r,\n ClassificationRequests.hasCurriculumLinks(unhydratedVideos, null, options.flightNamespace),\n VideoRequests.videoMixinAssocs(unhydratedVideos, options.flightNamespace)\n ]);\n }, [ videoIds?.length, currentUser.data?.isAuthenticated ]);\n\n Flight.useBasicFetchAll(request);\n}"],"names":["InfiniteScrollFooter","props","ref","inView","fetchOnScroll","isFetching","fetchNext","nextCursor","className","Spinner","as","animation","role","SvgContainer","svgName","size","S","onClick","defaultProps","namespace","PlayPageResources","hasPermissions","resources","video","isLearner","data","links","filteredResources","filter","r","includes","metadata","resourceType","getResources","length","id","containerRef","name","count","contents","collection","prefetched","childComponent","R","extraChildComponentProps","imageCdnUrl","imageErrorFallbackUrl","resourceThumbnailFallbackUrl","actionBehaviour","canViewResources","location","titlePosition","onClickDownload","resource","analyticsData","actionType","entity","getChildAppLink","getAppLink","analyticsOptions","workflowPhase","descriptor","SignUp","PointOfInterestList","Text","phrase","pointsOfInterest","map","poi","timeStamp","DurationHelper","startTime","suppressInteractivity","key","description","DivButton","onClickPoiItem","SCROLL_HEIGHT_MAX","VideoAtAGlance","canViewGlance","learningIntentionMarkdownHTML","tags","VideoHelper","tag","tagType","TagType","getTags","autoHeight","autoHeightMax","height","dangerouslySetInnerHTML","__html","TagList","TagHelper","getTagAppLink","time","setStartTime","POI_LINK_LINE","useLearningIntentionMarkdown","hasGlanceData","useState","markdownHTML","setMarkdownHTML","useEffect","content","glance","learningIntention","replace","format","VideoDetailsPartial","style","width","PartialVideoList","Array","numVideos","fill","_","i","allowBulkActions","PartialVideoItem","breakpoints","useBreakpoints","isSmall","VideoListHelper","withDragHandle","withReordering","xs","Row","Col","InteractiveWidgetItem","interactive","thumbnailSize","preloadImage","questionsAppLink","args","questionsNumber","_timepoints","value","VideoThumbnail","type","textPosition","ThumbnailTextPosition","appLink","imageOptions","preload","setFavourite","canFavourite","hideDuration","ThumbnailText","AppLink","options","smartCount","DYNAMIC_RATIO_IMAGE_OPTIONS","resizeType","getImageType","MasterTypeHelper","ResourceFileType","pdf","url","ResourceThumbnail","rotation","thumbnail","thumbnailUrl","imageType","ImageHelper","previewUrl","UrlHelper","getThumbnailUrl","BaseImage","imageStyle","transform","alt","errorFallbackImageSrc","errorFallbackImageClassName","imageClassName","preventLoad","ResourceHelper","getResourceTypeName","ResourceTile","isResource","MasterType","baseClass","getColour","theme","containerClass","applyHoverState","getInnerContainerClass","Tooltip","title","thumbnailContainerClass","e","preventDefault","stopPropagation","hideTypeBadge","TypeBadge","typeId","TitleSubText","ResourceWidgetItem","canPreview","sm","logAction","AnalyticsHelper","tileProps","SeoConstants","href","target","ThemeRequests","themeImages","themes","formatData","sort","a","b","localeCompare","createTheme","success","error","always","invalidationKeys","updateTheme","deleteTheme","usePrevious","current","useTableOfContentsScroll","elements","activeId","hasDoneInitialScroll","setHasDoneInitialScroll","previousId","currentId","find","heading","rec","getBoundingClientRect","window","scrollBy","top","behavior","downloadRef","DownloadHelper","getVideoDownloadUrl","downloadProxyUrl","token","downloadResource","iframe","document","createElement","body","appendChild","display","src","ArchivedBanner","getPhrase","mapTypeId","hasStudentExperience","RestrictionBanner","restrictions","yearGroups","canManageVideoAccess","baseClassName","application","action","params","objectId","objectTypeId","ClipWidgetItem","clip","PlayPageClips","canViewClips","clips","LanguageService","WidgetContents","TextHelper","parentType","PlayPageInteractives","canViewInteractives","interactives","PlayPageTitleAndActions","mergedAudience","media","subjectPresentationAudiences","audiences","titleContainerRef","hasBadges","rating","productionYear","videoActions","useVideoActions","shareId","canViewOriginal","originalVideoAppLink","featureAccess","canNavigate","Actions","actions","getVideoActions","actionsDropdownClassName","fetchMore","fetchMoreActions","VideoSubText","getSeriesAppLink","series","RestrictionPadlock","tooltipPlacement","BadgeListContainer","AudienceLabel","audience","border","Badge","_parentVideo","PlayerPlaceholder","PipPlaceholder","PublicPlaceholder","backgroundImage","RelatedVideos","currentUser","isAuthenticated","relatedVideos","hasError","hasCompleted","videos","canAutoplay","currentVideo","getSubTextAppLink","moviesAndTv","mtv","getVideoAppLink","presentationAudiences","getPreviewQuestionsAppLink","hasMore","useVideoFeatureAccess","hasLocalPermissions","hasProduct","config","hasNP","canWatchPublicly","videoId","allowedPublicVideos","canViewCurriculumLinks","canUseActions","canViewPublicLayout","canViewResourceItems","useVideoMixin","hydratedVideos","Set","videoIds","isArray","Boolean","v","request","setRequest","unhydratedVideos","forEach","has","push","add","flightNamespace"],"sourceRoot":""}