@clickview/lite 0.103.0-rc.0 → 0.103.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/dist/.vite/manifest.json +447 -447
  2. package/dist/bundles.json +1 -1
  3. package/dist/en.json +1 -1
  4. package/dist/scripts/{BXosUOUS.chunk.js → 14z5Gy8L.chunk.js} +2 -2
  5. package/dist/scripts/{BXosUOUS.chunk.js.map → 14z5Gy8L.chunk.js.map} +1 -1
  6. package/dist/scripts/{BqkK_0Jk2.chunk.js → B4AZn1xm2.chunk.js} +2 -2
  7. package/dist/scripts/{BqkK_0Jk2.chunk.js.map → B4AZn1xm2.chunk.js.map} +1 -1
  8. package/dist/scripts/{_wBbQ-0z2.chunk.js → BBndy2td2.chunk.js} +2 -2
  9. package/dist/scripts/{_wBbQ-0z2.chunk.js.map → BBndy2td2.chunk.js.map} +1 -1
  10. package/dist/scripts/{DBdkd4Ag2.chunk.js → BFH_tnSb2.chunk.js} +3 -3
  11. package/dist/scripts/{DBdkd4Ag2.chunk.js.map → BFH_tnSb2.chunk.js.map} +1 -1
  12. package/dist/scripts/{BhgNNQjX.chunk.js → BOQck-Qs.chunk.js} +2 -2
  13. package/dist/scripts/{BhgNNQjX.chunk.js.map → BOQck-Qs.chunk.js.map} +1 -1
  14. package/dist/scripts/{_eRiDJm1.chunk.js → Ba4uGz_V.chunk.js} +2 -2
  15. package/dist/scripts/{_eRiDJm1.chunk.js.map → Ba4uGz_V.chunk.js.map} +1 -1
  16. package/dist/scripts/{Bx6qaXLc.chunk.js → Bdbe2u0R.chunk.js} +2 -2
  17. package/dist/scripts/{Bx6qaXLc.chunk.js.map → Bdbe2u0R.chunk.js.map} +1 -1
  18. package/dist/scripts/{C4CuJJXy2.chunk.js → BeW5XQTb2.chunk.js} +2 -2
  19. package/dist/scripts/{C4CuJJXy2.chunk.js.map → BeW5XQTb2.chunk.js.map} +1 -1
  20. package/dist/scripts/{syYCrnUX.chunk.js → BgoVmaXQ.chunk.js} +2 -2
  21. package/dist/scripts/{syYCrnUX.chunk.js.map → BgoVmaXQ.chunk.js.map} +1 -1
  22. package/dist/scripts/{B5DWwtp0.chunk.js → BjA9XV5y.chunk.js} +2 -2
  23. package/dist/scripts/{B5DWwtp0.chunk.js.map → BjA9XV5y.chunk.js.map} +1 -1
  24. package/dist/scripts/{BYMMqtaN.chunk.js → BqdHoEFM.chunk.js} +2 -2
  25. package/dist/scripts/{BYMMqtaN.chunk.js.map → BqdHoEFM.chunk.js.map} +1 -1
  26. package/dist/scripts/{BIvmcqND2.chunk.js → CCUznsdX2.chunk.js} +2 -2
  27. package/dist/scripts/{BIvmcqND2.chunk.js.map → CCUznsdX2.chunk.js.map} +1 -1
  28. package/dist/scripts/{BsNCh4UD.chunk.js → CFqL2Hm5.chunk.js} +3 -3
  29. package/dist/scripts/{BsNCh4UD.chunk.js.map → CFqL2Hm5.chunk.js.map} +1 -1
  30. package/dist/scripts/{BE8Ze3Fa2.chunk.js → CHmbcl4Y2.chunk.js} +2 -2
  31. package/dist/scripts/{BE8Ze3Fa2.chunk.js.map → CHmbcl4Y2.chunk.js.map} +1 -1
  32. package/dist/scripts/{Dp8z_udC.chunk.js → CIzlhCeS.chunk.js} +2 -2
  33. package/dist/scripts/{Dp8z_udC.chunk.js.map → CIzlhCeS.chunk.js.map} +1 -1
  34. package/dist/scripts/{CO8EIpI8.chunk.js → CXUrMkZu.chunk.js} +2 -2
  35. package/dist/scripts/{CO8EIpI8.chunk.js.map → CXUrMkZu.chunk.js.map} +1 -1
  36. package/dist/scripts/{DLqG-wwP.chunk.js → CYrelpYt.chunk.js} +2 -2
  37. package/dist/scripts/{DLqG-wwP.chunk.js.map → CYrelpYt.chunk.js.map} +1 -1
  38. package/dist/scripts/{wmwWqIeA.chunk.js → CfrfHGSh.chunk.js} +2 -2
  39. package/dist/scripts/{wmwWqIeA.chunk.js.map → CfrfHGSh.chunk.js.map} +1 -1
  40. package/dist/scripts/{B5M-3wpn.chunk.js → CjwT65ug.chunk.js} +2 -2
  41. package/dist/scripts/{B5M-3wpn.chunk.js.map → CjwT65ug.chunk.js.map} +1 -1
  42. package/dist/scripts/{B-aaIChO2.chunk.js → CsCjBSq62.chunk.js} +2 -2
  43. package/dist/scripts/{B-aaIChO2.chunk.js.map → CsCjBSq62.chunk.js.map} +1 -1
  44. package/dist/scripts/{ygwO7HPs2.chunk.js → DIaT_eGy2.chunk.js} +2 -2
  45. package/dist/scripts/{ygwO7HPs2.chunk.js.map → DIaT_eGy2.chunk.js.map} +1 -1
  46. package/dist/scripts/{DXRsxBJw.chunk.js → DTliAJ8L.chunk.js} +2 -2
  47. package/dist/scripts/{DXRsxBJw.chunk.js.map → DTliAJ8L.chunk.js.map} +1 -1
  48. package/dist/scripts/{DE5jvfAx2.chunk.js → D_t70KgV2.chunk.js} +2 -2
  49. package/dist/scripts/{DE5jvfAx2.chunk.js.map → D_t70KgV2.chunk.js.map} +1 -1
  50. package/dist/scripts/{Dc01PBv1.chunk.js → Dn2EPvQj.chunk.js} +2 -2
  51. package/dist/scripts/{Dc01PBv1.chunk.js.map → Dn2EPvQj.chunk.js.map} +1 -1
  52. package/dist/scripts/{RuVwpX36.chunk.js → Drh1bb9z.chunk.js} +2 -2
  53. package/dist/scripts/{RuVwpX36.chunk.js.map → Drh1bb9z.chunk.js.map} +1 -1
  54. package/dist/scripts/{YzhKditE.chunk.js → ESLgHTNq.chunk.js} +2 -2
  55. package/dist/scripts/{YzhKditE.chunk.js.map → ESLgHTNq.chunk.js.map} +1 -1
  56. package/dist/scripts/{DfSzsD3P.chunk.js → FysETOFv.chunk.js} +2 -2
  57. package/dist/scripts/{DfSzsD3P.chunk.js.map → FysETOFv.chunk.js.map} +1 -1
  58. package/dist/scripts/QVwuOts3.chunk.js +12 -0
  59. package/dist/scripts/QVwuOts3.chunk.js.map +1 -0
  60. package/dist/scripts/{OmYpHs7g.chunk.js → _Cm5O72d.chunk.js} +3 -3
  61. package/dist/scripts/{OmYpHs7g.chunk.js.map → _Cm5O72d.chunk.js.map} +1 -1
  62. package/dist/scripts/{app-BzCWmnrr.js → app-BHlllGhO.js} +4 -4
  63. package/dist/scripts/{app-BzCWmnrr.js.map → app-BHlllGhO.js.map} +1 -1
  64. package/dist/scripts/{C46080Xd.chunk.js → dxqgnrOi.chunk.js} +2 -2
  65. package/dist/scripts/{C46080Xd.chunk.js.map → dxqgnrOi.chunk.js.map} +1 -1
  66. package/dist/scripts/{BCTM3KG42.chunk.js → kLCNzxrH2.chunk.js} +2 -2
  67. package/dist/scripts/{BCTM3KG42.chunk.js.map → kLCNzxrH2.chunk.js.map} +1 -1
  68. package/dist/scripts/{CfVIZBcI2.chunk.js → wpRpI9h02.chunk.js} +2 -2
  69. package/dist/scripts/{CfVIZBcI2.chunk.js.map → wpRpI9h02.chunk.js.map} +1 -1
  70. package/package.json +1 -1
  71. package/dist/scripts/QrUfkwZX.chunk.js +0 -12
  72. package/dist/scripts/QrUfkwZX.chunk.js.map +0 -1
@@ -1,3 +1,3 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["scripts/DE5jvfAx2.chunk.js","scripts/DAXXjFlN.chunk.js","scripts/D8uRDrkd.chunk.js","scripts/e57H3T-k.chunk.js","scripts/C2w0pmFW.chunk.js","scripts/wrLrTezN.chunk.js","scripts/BVnMI-dl.chunk.js","scripts/CMDJWWg3.chunk.js","scripts/J0QUvPGS.chunk.js","scripts/wdQVW3s52.chunk.js","scripts/BGGL8m_U2.chunk.js","scripts/B_N30_Kb.chunk.js","scripts/rPN1bfU12.chunk.js","scripts/BIzu5ufQ.chunk.js","scripts/BftnFbcr.chunk.js","scripts/DPtsihFR.chunk.js","scripts/DMnm3Ewv.chunk.js","scripts/C1SLt-ar.chunk.js","scripts/NlCAcBdo.chunk.js","scripts/BzfCWDOl.chunk.js","scripts/C5j5LRut2.chunk.js","scripts/Bneb37232.chunk.js","scripts/C1PTqhPY2.chunk.js","scripts/BDwjs8qz2.chunk.js","scripts/B3TDTJSl.chunk.js","scripts/BYSskNbK.chunk.js","scripts/BRcHS92O2.chunk.js","scripts/DXeT_p8s2.chunk.js","scripts/D9a0OIfi2.chunk.js","scripts/Byg072EM.chunk.js","scripts/DZX1tZ-D2.chunk.js","scripts/QCFxJYkI2.chunk.js","scripts/Bbp2U9GK2.chunk.js","scripts/DCBtWC6W.chunk.js","scripts/9LNlP5yJ.chunk.js","scripts/CYEpX3hx.chunk.js","scripts/C0exjRXJ2.chunk.js","scripts/Ci5E3nqm2.chunk.js","css/9awfngRG.chunk.css","css/zFl67mql.chunk.css","scripts/ClVhjUGI.chunk.js","scripts/11tE0tcu.chunk.js","scripts/E5Pmu4O7.chunk.js","scripts/D5yUWL7p.chunk.js","scripts/BxYKQEUG2.chunk.js","scripts/dEqScqMh2.chunk.js","scripts/BDpRhbS0.chunk.js","scripts/CX9P14FO.chunk.js","scripts/CNxJMwxC.chunk.js","scripts/Epqx0J1v.chunk.js","scripts/DgRi9T0s.chunk.js","scripts/AEgPyCQE.chunk.js","scripts/CuVGnzB82.chunk.js","scripts/CvNHBl0q2.chunk.js","scripts/D1EthTiX.chunk.js","scripts/CIkIVGMZ.chunk.js","scripts/CQRza4Ga.chunk.js","scripts/ChPM4MoX.chunk.js","scripts/BM2EJL9g.chunk.js","scripts/CODiipiB.chunk.js","scripts/CpFtf-tI2.chunk.js","scripts/CQyJ7YGa.chunk.js","scripts/-Plmz9lO.chunk.js","scripts/CXVBjdpb.chunk.js","scripts/BruX4yYB.chunk.js","scripts/gl4k7dtw.chunk.js","scripts/CfkLy0le.chunk.js","scripts/BVk9tE02.chunk.js","scripts/bWC12YrP.chunk.js","scripts/DlEtkSBj2.chunk.js","scripts/DW-fYtM02.chunk.js","scripts/C7HU4huj.chunk.js","scripts/BGswYbRT.chunk.js","scripts/o_O53MMd.chunk.js","scripts/9kSpxveW.chunk.js","scripts/C-THHyTP.chunk.js","scripts/DDJBf9pK.chunk.js","scripts/DUXPuDp7.chunk.js","scripts/DSuhq1Rt2.chunk.js","scripts/Tr5-kahg2.chunk.js","scripts/BlGyXBAH2.chunk.js","scripts/Dc1hYuQ12.chunk.js","css/CuSUr3Gp.chunk.css","scripts/Dp6QHgBL2.chunk.js","scripts/ByszCPst2.chunk.js","scripts/B44BW79X.chunk.js","scripts/BfiSXcgz2.chunk.js","css/BPdg7JW4.chunk.css","scripts/DGA_eT2h2.chunk.js","scripts/Dg1mFtY2.chunk.js","scripts/BBEIIgZ6.chunk.js","scripts/CHL4nrKG.chunk.js","scripts/CWMwyVGJ2.chunk.js","scripts/QVHuXdWQ2.chunk.js","scripts/CfTTKh6M.chunk.js","css/D8a4tOyE.chunk.css","scripts/lPQgHDFT.chunk.js","scripts/Ib9eoq_Y.chunk.js","scripts/DXRsxBJw.chunk.js","scripts/c7DC36s9.chunk.js","scripts/cUqRbWT7.chunk.js","scripts/FAs_d-DP.chunk.js","scripts/Bzihudtn.chunk.js","scripts/BFXddaSP.chunk.js","scripts/YjWbDb2Y.chunk.js","scripts/BcPRRCy1.chunk.js","scripts/r6qFZ4E_.chunk.js","scripts/CXnhm0VS2.chunk.js","scripts/iZ7EqNA72.chunk.js","scripts/OL3Z6Yp62.chunk.js","scripts/TTO6HcNP.chunk.js","scripts/BJUbYu222.chunk.js","scripts/BBDxSGT52.chunk.js","scripts/DqM363Cd.chunk.js","scripts/CdYjo8_g.chunk.js","scripts/CbOJtYeK.chunk.js","scripts/B3fF5gkg.chunk.js","scripts/BY2ETYCl.chunk.js","scripts/B6bB9two.chunk.js","scripts/CF6KXSqn.chunk.js","scripts/CKOWgMyj.chunk.js","scripts/5ONJSThP.chunk.js","scripts/Dy3xpenS.chunk.js","scripts/CcDvlSWl2.chunk.js","scripts/Bkr6FS4c.chunk.js","scripts/BX0wDJmp.chunk.js","scripts/oPIkfKWW2.chunk.js","scripts/B785hxeE.chunk.js","scripts/Ky1--4w3.chunk.js","scripts/CZgWQFsJ.chunk.js","scripts/CVHQXNzi2.chunk.js","scripts/B9VCwo3g2.chunk.js","scripts/DsBWAM3I2.chunk.js","scripts/QDUcHuL-2.chunk.js","scripts/Cr6TXzQQ2.chunk.js","scripts/CjA4Q5pm.chunk.js","scripts/CmcCVXi32.chunk.js","scripts/BcibGFe42.chunk.js","scripts/WvK58Ge12.chunk.js","scripts/DYKH_3un.chunk.js","scripts/CunDpHqX.chunk.js","css/0ZqRj7up.chunk.css","scripts/CvLLqEKv.chunk.js","scripts/DIENjKhZ.chunk.js","css/D2t3ESms.chunk.css","scripts/B_9JhhOa.chunk.js","scripts/BPavmm8c.chunk.js","css/DnhOr8Y7.chunk.css","scripts/CnnDkGmK.chunk.js","scripts/C3Wa868y.chunk.js","css/DvO5Hl4o.chunk.css","scripts/DLqG-wwP.chunk.js","css/BL4roXAj.chunk.css","scripts/BXosUOUS.chunk.js","scripts/DfSzsD3P.chunk.js","scripts/lhZ5v-iN2.chunk.js","css/BU5l8u5C.chunk.css","scripts/D5nbPgu6.chunk.js","scripts/CsOC2WrI.chunk.js","scripts/j59ag8H4.chunk.js","scripts/C_-lTHCv.chunk.js","scripts/C3q_xvci.chunk.js","scripts/wgkIoKbA.chunk.js","css/FUAcQhsk.chunk.css","scripts/BScb3_Xj2.chunk.js","scripts/DlAOGdRl.chunk.js","scripts/DhwAOJmY.chunk.js","css/PJ3nCJ4X.chunk.css","scripts/VMYkPZfT.chunk.js","css/BEx-Os5h.chunk.css","scripts/D7hSSm4r2.chunk.js","css/ChavoTyg.chunk.css","scripts/BoTN63OZ2.chunk.js","scripts/B2JUNqnO.chunk.js","css/C1-mauxJ.chunk.css","scripts/BiKac8UT2.chunk.js","css/xCvqfIpG.chunk.css","scripts/BhgNNQjX.chunk.js","scripts/DC8Dg20g.chunk.js","scripts/B2INd6bh.chunk.js","scripts/Sd2yzkH_.chunk.js","css/DVhPtkT7.chunk.css","scripts/D3-wtcxf2.chunk.js","scripts/M7cfXU2L.chunk.js","css/BgzV9aK4.chunk.css","scripts/B5tW47L4.chunk.js","css/D5JKYURg.chunk.css","scripts/C0EHsOU6.chunk.js","css/DBshtiPC.chunk.css","scripts/CO8EIpI8.chunk.js","scripts/_OaXdAO8.chunk.js","scripts/CsF4wDV1.chunk.js","scripts/_jJAx6fU.chunk.js","scripts/CLjADRa42.chunk.js","css/U15R5cX6.chunk.css"])))=>i.map(i=>d[i]);
2
- import{o as e}from"./DAXXjFlN.chunk.js";import{x as t,y as n}from"./BftnFbcr.chunk.js";import{n as r}from"./B785hxeE.chunk.js";import{t as i}from"./CQyJ7YGa.chunk.js";import{t as a}from"./e57H3T-k.chunk.js";import{t as o}from"./C2w0pmFW.chunk.js";import{t as s}from"./wrLrTezN.chunk.js";import{t as c}from"./BXTI9cmX.chunk.js";import{i as l}from"./BYSskNbK.chunk.js";import{f as u,g as d,p as f,u as p}from"./BX0wDJmp.chunk.js";import{U as m,d as h,l as g,s as _,y as v,z as y}from"./NlCAcBdo.chunk.js";import{t as b}from"./oPIkfKWW2.chunk.js";import{t as x}from"./CcDvlSWl2.chunk.js";import{t as S}from"./CVHQXNzi2.chunk.js";import{t as C}from"./YakGe6vv2.chunk.js";import{t as w}from"./DsXWD-Sn.chunk.js";import{t as T}from"./CZgWQFsJ.chunk.js";import{t as E}from"./DdsRCMkN.chunk.js";import{t as D}from"./D_gWf2lC.chunk.js";import{t as O}from"./CYEpX3hx.chunk.js";import{t as k}from"./BXpZzabC.chunk.js";import{t as A}from"./PgzMrOyM.chunk.js";import{t as j}from"./C5rBgkQH.chunk.js";import{n as M}from"./BRcHS92O2.chunk.js";import{t as ee}from"./Tr5-kahg2.chunk.js";import{t as N}from"./QCFxJYkI2.chunk.js";import{t as te}from"./D9a0OIfi2.chunk.js";import{t as ne}from"./Ci5E3nqm2.chunk.js";import{n as P,t as F}from"./BGhJ8TEx.chunk.js";import{n as re,t as ie}from"./DWLFYiMu.chunk.js";import{t as ae}from"./DDLr4JCi.chunk.js";import{t as I}from"./BQKcAczf.chunk.js";import{t as oe}from"./BDif2ytg.chunk.js";import{t as L}from"./CbzENe5-.chunk.js";import{t as R}from"./D3WOV5RE.chunk.js";import{t as se}from"./rVRhgtHY2.chunk.js";import{t as ce}from"./CYuozvgN2.chunk.js";import{t as le}from"./BSYDOevb2.chunk.js";import{t as z}from"./CpP_XziV2.chunk.js";import{t as ue}from"./DuIIaGgk2.chunk.js";import{n as de}from"./CpFtf-tI2.chunk.js";import{t as fe}from"./BTd65Rcb2.chunk.js";import{t as pe}from"./BOhYYYQ82.chunk.js";import{t as B}from"./DW51cSV_2.chunk.js";import{t as me}from"./BrOxSpKn2.chunk.js";import{n as he,t as ge}from"./D0DHZnqb2.chunk.js";import"./_JVBGmt12.chunk.js";import{t as _e}from"./CmV-znIi2.chunk.js";var V=e(o()),H=s();function U(e,t){let n=u(),{hasPermissions:i}=I(),a=(p(b.currentUser()).data?.isAuthenticated||t)&&i(r.ViewVideoPointsOfInterest);function o(t){return w.pointsOfInterest(e,t)}function s(e){n(o(e))}a||(e=null),ae(!!e&&o,!!e&&s);let c=re(!!e&&(e=>o(e).key));return a?c:ie}function W(e){let{hasEnabledViviPlayback:t,hasEnabledAppleTvPlayback:n,hasEnabledViviStudentCasting:i,isLoadingSettings:a}=x(null),{hasProduct:o,isLoadingProducts:s}=R(),{hasPermissions:c,isLoaded:l}=I(),{fetchViviAccessToken:u,fetchAppleTvAccessToken:d}=ve(),f=p(b.currentUser()),m=p(D.config()),h=xe(c),g=f.data?.isAuthenticated??!1,_=!c(r.StudentExperience),v=!c(r.GuestExperience),y=o(N.Primary),S=g&&y&&(_||i)&&v,C=g&&y&&_&&v,w=S&&t,T=p(e&&w&&L.getViviIntegrationStatus()),E=T.data===oe.Connected,O=!w||T.hasCompleted;return{hasCompleted:!g||f.hasCompleted&&m.hasCompleted&&O&&l&&!a&&!s,data:{ctaOptions:h,canUserCastToDevices:S||C,vivi:{accountConnected:E,enabled:S&&t,apiUrl:m.data?.viviApiUrl??``,fetchAccessToken:u},appleTv:{enabled:C&&n,fetchAccessToken:d}}}}function ve(){let e=f(),t=d();return{fetchViviAccessToken:async()=>{let n=L.getViviAccessToken(),r=t(n.key),{token:i}=r.shouldFetch?await e(n):r.data;return i},fetchAppleTvAccessToken:()=>e(L.getAppleTvAccessToken())}}var ye=`https://clickv.ie/w/WVsx`,be=`https://clickv.ie/w/PVsx`;function xe(e){let[i,a]=j(`devices:cta:dismissed`,{dismissed:!1},{storage:l.LocalStorage}),o=e(r.StudentExperience),s=e(r.ManageIntegrations),u={entity:g.DevicesCta,actionType:y.Click,workflowPhase:m.Complete,location:v.Player};return{hasBeenDismissed:i.dismissed||o,canUserManageIntegrations:s,onDismiss:e=>{O.logUserAction({canUserManageIntegrations:s,context:e},{...u,descriptor:_.Dismiss,eventVersion:h.V1}),a({dismissed:!0})},onInstall:e=>{O.logUserAction({canUserManageIntegrations:s,context:e},{...u,descriptor:_.InstallIntegration,eventVersion:h.V1}),n.trigger({application:c.SETTINGS,action:E.Settings.INTEGRATIONS})},onLearnMore:e=>{O.logUserAction({canUserManageIntegrations:s,context:e},{...u,descriptor:_.LearnMore,eventVersion:h.V1}),(e===`vivi_and_apple_tv`||e===`vivi`)&&t.PageLoad(ye,!0),(e===`vivi_and_apple_tv`||e===`apple_tv`)&&t.PageLoad(be,!0)},onContactSupport:e=>{O.logUserAction({canUserManageIntegrations:s,context:e},{...u,descriptor:_.ContactSupport,eventVersion:h.V1}),t.PageLoad(te.getSupportRequestUrl(),!0)}}}var G={VIDEO_START_TIME_CUTOFF:10,PUBLIC_SEARCH_QUERY_DEBOUNCE:400,AUTHENTICATED_SEARCH_QUERY_DEBOUNCE:200},K=e=>({application:c.LIBRARIES,action:E.Libraries.LIBRARY,args:[e.id.toString(),a.slugify(e.name)]}),q=(e,t)=>({application:c.LIBRARIES,action:E.Libraries.FOLDER,args:[e.id.toString(),t.id.toString(),a.slugify(t.name)]});function Se(e){let{settings:t,presentationSlug:n}=e;return{getTagAppLink:e=>({application:c.SEARCH,action:E.Search.HOME,params:{tagOrClassification:e.name}}),getSeriesAppLink:(e,t)=>ue.getSeriesAppLink(e,t?{mtv:!0}:{},n),getResourceAppLink:(e,t,n)=>r=>!n&&!t?{application:c.SIGN_UP,action:E.SignUp.SIGN_UP}:{application:c.VIDEOS,action:E.Videos.PREVIEW_PDF,args:[r.id],params:{videoId:e,shareId:t}},getPartnerProfileAppLink:t?.hasPartnerProfiles?e=>z.getPartnerDashboardAppLink(e):null,getPartnerDashboardHubAppLink:t?.hasPartnerProfiles?e=>z.getPartnerDashboardHubAppLink(e):null,getLibraryAppLink:K,getFolderAppLink:q}}function Ce(e,t){let n=Number(e);if(!isNaN(n)&&n>=0)return n;let r=C.getVideoProgress(t);return!r||r>=t.duration/1e3-G.VIDEO_START_TIME_CUTOFF?0:r}function we(e){if(Number.isInteger(+e))return+e}var J={poster:`_poster_1ven8_1`,frost:`_frost_1ven8_5`,image:`_image_1ven8_9`},Y=`shared.streamLimitOverlay`,X=i.encloseNamespace(Y);function Te(e){let t=e.canRedeemMoreReferrals?E.SignUp.INVITE_COLLEAGUE:E.SignUp.UPGRADE,n=e.canRedeemMoreReferrals?`inviteCta`:`upgradeCta`,r=e.embed||e.hasStudentExperience,i;return i=r?`basicDescription`:e.canRedeemMoreReferrals?`referralDescription`:`upgradeDescription`,V.useEffect(()=>{e.embed&&fe.remove()},[e.embed]),(0,H.jsxs)(`div`,{className:`position-relative bg-light overflow-hidden ${e.embed?`position-fixed top-0 start-0 end-0 bottom-0`:`ratio ratio-16x9`}`,children:[e.posterUrl&&(0,H.jsx)(`img`,{className:`position-absolute top-0 start-0 w-100 h-100 object-fit-cover ${J.poster}`,src:e.posterUrl,alt:``}),(0,H.jsx)(`div`,{className:`position-absolute top-0 start-0 w-100 h-100 ${J.frost}`}),(0,H.jsxs)(`div`,{className:`position-absolute top-0 start-0 w-100 h-100 d-flex flex-column align-items-center justify-content-center text-center p-4`,children:[(0,H.jsx)(`img`,{className:`${J.image} d-none d-md-block mb-3`,src:A.SignUp.INVITE_COLLEAGUE,alt:X(`heading`)}),(0,H.jsx)(`h2`,{className:`h5 mb-2`,children:(0,H.jsx)(de,{namespace:Y,phrase:`heading`,options:{smartCount:e.totalStreamsAvailable}})}),(0,H.jsx)(`p`,{className:`text-dark mb-3`,children:X(i)}),!r&&(0,H.jsx)(ne,{className:`btn btn-dark`,appLink:{application:c.SIGN_UP,action:t},children:X(n)})]})]})}var Ee=38,De=40,Oe=()=>{function e(e){if(e.keyCode===Ee||e.keyCode===De)return e.preventDefault(),!1}V.useEffect(()=>(window.addEventListener(`keydown`,e,!1),()=>{window.removeEventListener(`keydown`,e,!1)}),[])},Z=6,ke=25;function Q(e){let{video:t,currentUser:n,moviesAndTv:r,context:i,contextId:a}=e,{canViewRelatedVideos:o}=_e(),{hasProduct:s}=R(),c=u();function l(e){return!t||!n?.isAuthenticated||!s(N.Primary)||!o||!i&&!a?null:w.relatedVideos({videoId:t.id,context:i,collectionId:a,moviesAndTv:r,limit:e})}function d(e){return e&&(h&&(e=e.slice(0,Z-1)),e.filter(e=>C.getCanBeConsumed(e)?.canNavigate))}function f(){c(l(ke))}let m=p(l(Z)),h=m.data?.length===Z;return{videos:d(m.data),hasCompleted:m.hasCompleted,isFetching:m.isFetching,hasError:m.hasError,hasMore:h,fetchNext:f}}var Ae=M.Medium;function je(e,t,n){return t?n?n.objectId===e?F.createViewKey(t,P.Share):F.createViewKey(e,P.MasterObject,t):null:F.createViewKey(e,P.MasterObject)}function Me(e){let{objectId:t,objectTypeId:n,shareId:r,context:i,contextId:a,moviesAndTv:o}=e,s=p(D.config()),c=p(b.currentUser()),l=p(t&&C.getVideoRequest(t,n,r)),u=p(r&&k.getShareObject(r)),d=U((n===S.Video||n===S.Clip)&&t),f=p(t&&je(t,r,u.data)),m=Q({video:l.data,context:i,contextId:a,moviesAndTv:o,currentUser:c.data}),h=W(t);return p(t&&c.data?.isAuthenticated&&he.isFavourited(c.data.id,[t])),{hasCompleted:l.data&&s.hasCompleted&&c.hasCompleted&&(!r||u.hasCompleted)&&(n!==S.Video||d.hasCompleted)&&f.hasCompleted&&h.hasCompleted,config:s.data,currentUser:c.data,video:l.data,shareLink:u.data,pointsOfInterest:d?.items,viewKey:f.data,relatedVideos:m.videos,playerIntegrations:h.data}}function Ne(e,t){let{setFavourite:n,canFavourite:r}=ge(v.Player),i=me.isFavouritedByCurrentUser(t),a=C.isVideoTypeArchived(t);V.useEffect(()=>{!e||!t||!r(t)||a||e.setFavourite?.(i,e=>n(t,e))},[t,e,r,a])}function Pe(e,t,r,i,a){let{hasProduct:o}=R(),s=C.isVideoTypeArchived(r),l=t.isAuthenticated&&C.isVideo(r)&&r._canCreateChild?.value&&o(N.Primary)&&!i&&a&&!s;if(!l)return;function u(){l&&n.trigger({application:c.CLIPS,action:E.Clips.CREATE_CLIP,args:[r.id],params:{startTime:e.current?.currentTime?.()??void 0}})}return u}function Fe(e,t){let{hasProduct:n}=R();return e.isAuthenticated&&n(N.Primary)&&t}function Ie(e){let{player:t,relatedVideos:r,shareId:i,context:a,contextId:o,moviesAndTv:s,playNext:c,mode:l,isAuthenticated:u,presentationSlug:d}=e,f=r?.[0];V.useEffect(()=>{if(!t?.setNextVideo||!f)return;if(l!=="default"){t.setNextVideo?.(null,!1,null);return}let e=C.getThumbnail(f)?.url,r={name:f.name,thumbnailUrl:ee.createUrl(e,{size:Ae})};t.setNextVideo?.(r,c,()=>{n.trigger(B.getAppLink(f,{shareId:i,context:a,contextId:o,playNext:c,moviesAndTv:s,includeContext:u},d))})},[t,f,i,a,o,c,l])}var $={embeddedPlayer:`_embeddedPlayer_1qmhl_1`,placeholder:`_placeholder_1qmhl_8`,theatreMode:`_theatreMode_1qmhl_12`};function Le(e){return e.shareLink?e.currentUser.isAuthenticated?!0:!!e.collectAnonResults:!1}function Re(e,t,r,i,a){if(t)return n.getHref({application:c.SHARE,action:E.Share.VIEW_SHARE_LINK,args:[t.id],params:{t:r.currentTime,a:!0}});let o=B.getAppLink(e,{includeContext:i},a);return o.params||={},o.params.t=r.currentTime,o.params.a=!0,n.getHref(o)}ze.defaultProps={allowCreateClip:!0};function ze(e){let t=V.useRef(null),n=V.useRef(null);Ne(t.current,e.video),t.current,e.video,e.shareLink,Ie({player:t.current,relatedVideos:e.relatedVideos,shareId:e.shareLink?.id,context:e.context,contextId:e.contextId,moviesAndTv:e.moviesAndTv,playNext:e.playNext,mode:e.mode,isAuthenticated:e.currentUser?.isAuthenticated,presentationSlug:e.presentationSlug}),Oe();let i=Fe(e.currentUser,e.onRequestPictureInPicture),{experimentalInteractiveQuestions:a}=x(null),{isLoaded:o,hasReachedStreamLimit:s,canRedeemMoreReferrals:c,totalStreamsAvailable:l}=pe(),{hasPermissions:u}=I(),d=u(r.GuestExperience),f=u(r.StudentExperience),p=Pe(t,e.currentUser,e.video,e.embed,!d&&e.allowCreateClip),m=se();function h(n){t.current=n,m(),e.onReady&&e.onReady(n),g(n)}function g(t){n.current=new ce({player:t,video:e.video,analyticsLocation:e.embed?v.EmbeddedPlayer:v.PlayPage,shareId:e.shareLink?.id})}let _=``;`thumbnail`in e.video&&(_=e.video.thumbnail?.url),!_&&`_parentVideo`in e.video&&(_=e.video._parentVideo?.thumbnail?.url);let y={viewKey:e.viewKey.viewKey,playerApi:new URL(e.config.playerApiUrl),imageCdnUrl:e.config.imageCdnUrl,autoplay:e.autoplay,startTime:Ce(e.startTime,e.video),endTime:we(e.endTime),embed:e.embed,showResources:e.showResources,getExternalLink:e.embed&&(t=>Re(e.video,e.shareLink,t,e.currentUser?.isAuthenticated,e.presentationSlug)),muted:e.muted,splash:e.embed?{title:e.video.name,posterUrl:_,ratingCode:C.getRating(e.video)?.code,ratingValue:C.getRating(e.video)?.value,seriesName:`series`in e.video&&e.video.series?.name,seasonNumber:`season`in e.video&&e.video.season?.number,episodeNumber:`episodeNumber`in e.video&&e.video.episodeNumber}:void 0,allowTheatreMode:e.allowTheatreMode,allowLoop:!0,hotkeyElQuerySelector:`body`,sharerInstanceRegion:e.shareLink?.ownerInstanceRegion},b=e.playerIntegrations?{...e.playerIntegrations,trackingCode:C.getTrackingCode(e.video)}:void 0,w=e.mode==="default"&&e.defaultDisplayMode===`theatre`,E=e.mode===`hover`,D=e.video.typeId===S.Interactive,O=le.isPublic(e.shareLink),k=o&&s&&!E&&!O,A=V.useMemo(()=>V.lazy(()=>T(()=>import(`./DE5jvfAx2.chunk.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176]))),[]),j=V.useMemo(()=>V.lazy(()=>T(()=>import(`./BhgNNQjX.chunk.js`),__vite__mapDeps([177,1,14,7,15,16,4,5,18,178,2,3,6,8,9,10,11,12,13,130,35,32,37,38,179,121,71,180,181,138,182,116,183,61,23,90,184,185,104,26,79,30,78,80,81,82,186,187,188,98,99,100,25,101,102,103,24,105,106,48,56,55,49,34,36,39,107,108,109,110,111,112,113,77,114,115,117,118,119,17,60,120,43,122,123,124,125,64,126,127,128,129,72,131,132,133,134,135,136,137,33,139,140,141,142,143,144,145,146,147,148,149,150,153,154,155,156,175,189,190,191,68,69,70,67,45,46,47,50,51,52,53,54,57,58,59,62,63,65,66,192,193,194]))),[]);if(k)return(0,H.jsx)(Te,{posterUrl:_,embed:e.embed,hasStudentExperience:f,canRedeemMoreReferrals:c,totalStreamsAvailable:l});if(D)return(0,H.jsx)(V.Suspense,{fallback:(0,H.jsx)(`div`,{className:$.placeholder}),children:(0,H.jsx)(A,{...y,imageApi:new URL(e.config.imageCdnUrl),currentUser:e.currentUser,collectResults:Le(e),shareId:e.shareLink?.id,enableImmersiveReader:!0,summaryPortalNode:e.summaryPortalNode,onShowSummary:e.onShowSummary,onReady:h,className:e.embed?$.embeddedPlayer:``,furthestVisitedTime:e.video._videoProgress?.furthest,questionListPortalNode:e.questionListPortalNode,authToken:e.token?.value,experimentalInteractiveQuestions:a})});function M(){return e.embed?$.embeddedPlayer:w?`w-100 h-100`:``}return(0,H.jsx)(V.Suspense,{fallback:(0,H.jsx)(`div`,{className:`${$.placeholder} ${w?$.theatreMode:``}`}),children:(0,H.jsx)(j,{...y,devicesConfig:b,className:M(),onClickCreateClip:p,pointsOfInterest:e.pointsOfInterest,onReady:h,showResources:e.embed,onRequestPictureInPicture:i&&e.onRequestPictureInPicture,onRequestTheatreMode:e.onRequestTheatreMode,theatreMode:w,nextDefaultDisplayMode:e.defaultDisplayMode,allowTranscript:e.allowTranscript})})}export{q as a,W as c,Se as i,U as l,Me as n,K as o,Q as r,G as s,ze as t};
3
- //# sourceMappingURL=OmYpHs7g.chunk.js.map
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["scripts/D_t70KgV2.chunk.js","scripts/DAXXjFlN.chunk.js","scripts/D8uRDrkd.chunk.js","scripts/e57H3T-k.chunk.js","scripts/C2w0pmFW.chunk.js","scripts/wrLrTezN.chunk.js","scripts/BVnMI-dl.chunk.js","scripts/CMDJWWg3.chunk.js","scripts/J0QUvPGS.chunk.js","scripts/wdQVW3s52.chunk.js","scripts/BGGL8m_U2.chunk.js","scripts/B_N30_Kb.chunk.js","scripts/rPN1bfU12.chunk.js","scripts/BIzu5ufQ.chunk.js","scripts/BftnFbcr.chunk.js","scripts/DPtsihFR.chunk.js","scripts/DMnm3Ewv.chunk.js","scripts/C1SLt-ar.chunk.js","scripts/NlCAcBdo.chunk.js","scripts/BzfCWDOl.chunk.js","scripts/C5j5LRut2.chunk.js","scripts/Bneb37232.chunk.js","scripts/C1PTqhPY2.chunk.js","scripts/BDwjs8qz2.chunk.js","scripts/B3TDTJSl.chunk.js","scripts/BYSskNbK.chunk.js","scripts/BRcHS92O2.chunk.js","scripts/DXeT_p8s2.chunk.js","scripts/D9a0OIfi2.chunk.js","scripts/Byg072EM.chunk.js","scripts/DZX1tZ-D2.chunk.js","scripts/QCFxJYkI2.chunk.js","scripts/Bbp2U9GK2.chunk.js","scripts/DCBtWC6W.chunk.js","scripts/9LNlP5yJ.chunk.js","scripts/CYEpX3hx.chunk.js","scripts/C0exjRXJ2.chunk.js","scripts/Ci5E3nqm2.chunk.js","css/9awfngRG.chunk.css","css/zFl67mql.chunk.css","scripts/ClVhjUGI.chunk.js","scripts/11tE0tcu.chunk.js","scripts/E5Pmu4O7.chunk.js","scripts/D5yUWL7p.chunk.js","scripts/BxYKQEUG2.chunk.js","scripts/dEqScqMh2.chunk.js","scripts/BDpRhbS0.chunk.js","scripts/CX9P14FO.chunk.js","scripts/CNxJMwxC.chunk.js","scripts/Epqx0J1v.chunk.js","scripts/DgRi9T0s.chunk.js","scripts/AEgPyCQE.chunk.js","scripts/CuVGnzB82.chunk.js","scripts/CvNHBl0q2.chunk.js","scripts/D1EthTiX.chunk.js","scripts/CIkIVGMZ.chunk.js","scripts/CQRza4Ga.chunk.js","scripts/ChPM4MoX.chunk.js","scripts/BM2EJL9g.chunk.js","scripts/CODiipiB.chunk.js","scripts/CpFtf-tI2.chunk.js","scripts/CQyJ7YGa.chunk.js","scripts/-Plmz9lO.chunk.js","scripts/CXVBjdpb.chunk.js","scripts/BruX4yYB.chunk.js","scripts/gl4k7dtw.chunk.js","scripts/CfkLy0le.chunk.js","scripts/BVk9tE02.chunk.js","scripts/bWC12YrP.chunk.js","scripts/DlEtkSBj2.chunk.js","scripts/DW-fYtM02.chunk.js","scripts/C7HU4huj.chunk.js","scripts/BGswYbRT.chunk.js","scripts/o_O53MMd.chunk.js","scripts/9kSpxveW.chunk.js","scripts/C-THHyTP.chunk.js","scripts/DDJBf9pK.chunk.js","scripts/DUXPuDp7.chunk.js","scripts/DSuhq1Rt2.chunk.js","scripts/Tr5-kahg2.chunk.js","scripts/BlGyXBAH2.chunk.js","scripts/Dc1hYuQ12.chunk.js","css/CuSUr3Gp.chunk.css","scripts/Dp6QHgBL2.chunk.js","scripts/ByszCPst2.chunk.js","scripts/B44BW79X.chunk.js","scripts/BfiSXcgz2.chunk.js","css/BPdg7JW4.chunk.css","scripts/DGA_eT2h2.chunk.js","scripts/Dg1mFtY2.chunk.js","scripts/BBEIIgZ6.chunk.js","scripts/CHL4nrKG.chunk.js","scripts/CWMwyVGJ2.chunk.js","scripts/QVHuXdWQ2.chunk.js","scripts/CfTTKh6M.chunk.js","css/D8a4tOyE.chunk.css","scripts/lPQgHDFT.chunk.js","scripts/Ib9eoq_Y.chunk.js","scripts/DTliAJ8L.chunk.js","scripts/c7DC36s9.chunk.js","scripts/cUqRbWT7.chunk.js","scripts/FAs_d-DP.chunk.js","scripts/Bzihudtn.chunk.js","scripts/BFXddaSP.chunk.js","scripts/YjWbDb2Y.chunk.js","scripts/BcPRRCy1.chunk.js","scripts/r6qFZ4E_.chunk.js","scripts/CXnhm0VS2.chunk.js","scripts/iZ7EqNA72.chunk.js","scripts/OL3Z6Yp62.chunk.js","scripts/TTO6HcNP.chunk.js","scripts/BJUbYu222.chunk.js","scripts/BBDxSGT52.chunk.js","scripts/DqM363Cd.chunk.js","scripts/CdYjo8_g.chunk.js","scripts/CbOJtYeK.chunk.js","scripts/B3fF5gkg.chunk.js","scripts/BY2ETYCl.chunk.js","scripts/B6bB9two.chunk.js","scripts/CF6KXSqn.chunk.js","scripts/CKOWgMyj.chunk.js","scripts/5ONJSThP.chunk.js","scripts/Dy3xpenS.chunk.js","scripts/CcDvlSWl2.chunk.js","scripts/Bkr6FS4c.chunk.js","scripts/BX0wDJmp.chunk.js","scripts/oPIkfKWW2.chunk.js","scripts/B785hxeE.chunk.js","scripts/Ky1--4w3.chunk.js","scripts/CZgWQFsJ.chunk.js","scripts/CVHQXNzi2.chunk.js","scripts/B9VCwo3g2.chunk.js","scripts/DsBWAM3I2.chunk.js","scripts/QDUcHuL-2.chunk.js","scripts/Cr6TXzQQ2.chunk.js","scripts/CjA4Q5pm.chunk.js","scripts/CmcCVXi32.chunk.js","scripts/BcibGFe42.chunk.js","scripts/WvK58Ge12.chunk.js","scripts/DYKH_3un.chunk.js","scripts/CunDpHqX.chunk.js","css/0ZqRj7up.chunk.css","scripts/CvLLqEKv.chunk.js","scripts/DIENjKhZ.chunk.js","css/D2t3ESms.chunk.css","scripts/B_9JhhOa.chunk.js","scripts/BPavmm8c.chunk.js","css/DnhOr8Y7.chunk.css","scripts/CnnDkGmK.chunk.js","scripts/C3Wa868y.chunk.js","css/DvO5Hl4o.chunk.css","scripts/CYrelpYt.chunk.js","css/BL4roXAj.chunk.css","scripts/14z5Gy8L.chunk.js","scripts/FysETOFv.chunk.js","scripts/lhZ5v-iN2.chunk.js","css/BU5l8u5C.chunk.css","scripts/D5nbPgu6.chunk.js","scripts/CsOC2WrI.chunk.js","scripts/j59ag8H4.chunk.js","scripts/C_-lTHCv.chunk.js","scripts/C3q_xvci.chunk.js","scripts/wgkIoKbA.chunk.js","css/FUAcQhsk.chunk.css","scripts/BScb3_Xj2.chunk.js","scripts/DlAOGdRl.chunk.js","scripts/DhwAOJmY.chunk.js","css/PJ3nCJ4X.chunk.css","scripts/VMYkPZfT.chunk.js","css/BEx-Os5h.chunk.css","scripts/D7hSSm4r2.chunk.js","css/ChavoTyg.chunk.css","scripts/BoTN63OZ2.chunk.js","scripts/B2JUNqnO.chunk.js","css/C1-mauxJ.chunk.css","scripts/BiKac8UT2.chunk.js","css/xCvqfIpG.chunk.css","scripts/BOQck-Qs.chunk.js","scripts/DC8Dg20g.chunk.js","scripts/B2INd6bh.chunk.js","scripts/Sd2yzkH_.chunk.js","css/DVhPtkT7.chunk.css","scripts/D3-wtcxf2.chunk.js","scripts/M7cfXU2L.chunk.js","css/BgzV9aK4.chunk.css","scripts/B5tW47L4.chunk.js","css/D5JKYURg.chunk.css","scripts/C0EHsOU6.chunk.js","css/DBshtiPC.chunk.css","scripts/CXUrMkZu.chunk.js","scripts/_OaXdAO8.chunk.js","scripts/CsF4wDV1.chunk.js","scripts/_jJAx6fU.chunk.js","scripts/CLjADRa42.chunk.js","css/U15R5cX6.chunk.css"])))=>i.map(i=>d[i]);
2
+ import{o as e}from"./DAXXjFlN.chunk.js";import{x as t,y as n}from"./BftnFbcr.chunk.js";import{n as r}from"./B785hxeE.chunk.js";import{t as i}from"./CQyJ7YGa.chunk.js";import{t as a}from"./e57H3T-k.chunk.js";import{t as o}from"./C2w0pmFW.chunk.js";import{t as s}from"./wrLrTezN.chunk.js";import{t as c}from"./BXTI9cmX.chunk.js";import{i as l}from"./BYSskNbK.chunk.js";import{f as u,g as d,p as f,u as p}from"./BX0wDJmp.chunk.js";import{U as m,d as h,l as g,s as _,y as v,z as y}from"./NlCAcBdo.chunk.js";import{t as b}from"./oPIkfKWW2.chunk.js";import{t as x}from"./CcDvlSWl2.chunk.js";import{t as S}from"./CVHQXNzi2.chunk.js";import{t as C}from"./YakGe6vv2.chunk.js";import{t as w}from"./DsXWD-Sn.chunk.js";import{t as T}from"./CZgWQFsJ.chunk.js";import{t as E}from"./DdsRCMkN.chunk.js";import{t as D}from"./D_gWf2lC.chunk.js";import{t as O}from"./CYEpX3hx.chunk.js";import{t as k}from"./BXpZzabC.chunk.js";import{t as A}from"./PgzMrOyM.chunk.js";import{t as j}from"./C5rBgkQH.chunk.js";import{n as M}from"./BRcHS92O2.chunk.js";import{t as ee}from"./Tr5-kahg2.chunk.js";import{t as N}from"./QCFxJYkI2.chunk.js";import{t as te}from"./D9a0OIfi2.chunk.js";import{t as ne}from"./Ci5E3nqm2.chunk.js";import{n as P,t as F}from"./BGhJ8TEx.chunk.js";import{n as re,t as ie}from"./DWLFYiMu.chunk.js";import{t as ae}from"./DDLr4JCi.chunk.js";import{t as I}from"./BQKcAczf.chunk.js";import{t as oe}from"./BDif2ytg.chunk.js";import{t as L}from"./CbzENe5-.chunk.js";import{t as R}from"./D3WOV5RE.chunk.js";import{t as se}from"./rVRhgtHY2.chunk.js";import{t as ce}from"./CYuozvgN2.chunk.js";import{t as le}from"./BSYDOevb2.chunk.js";import{t as z}from"./CpP_XziV2.chunk.js";import{t as ue}from"./DuIIaGgk2.chunk.js";import{n as de}from"./CpFtf-tI2.chunk.js";import{t as fe}from"./BTd65Rcb2.chunk.js";import{t as pe}from"./BOhYYYQ82.chunk.js";import{t as B}from"./DW51cSV_2.chunk.js";import{t as me}from"./BrOxSpKn2.chunk.js";import{n as he,t as ge}from"./D0DHZnqb2.chunk.js";import"./_JVBGmt12.chunk.js";import{t as _e}from"./CmV-znIi2.chunk.js";var V=e(o()),H=s();function U(e,t){let n=u(),{hasPermissions:i}=I(),a=(p(b.currentUser()).data?.isAuthenticated||t)&&i(r.ViewVideoPointsOfInterest);function o(t){return w.pointsOfInterest(e,t)}function s(e){n(o(e))}a||(e=null),ae(!!e&&o,!!e&&s);let c=re(!!e&&(e=>o(e).key));return a?c:ie}function W(e){let{hasEnabledViviPlayback:t,hasEnabledAppleTvPlayback:n,hasEnabledViviStudentCasting:i,isLoadingSettings:a}=x(null),{hasProduct:o,isLoadingProducts:s}=R(),{hasPermissions:c,isLoaded:l}=I(),{fetchViviAccessToken:u,fetchAppleTvAccessToken:d}=ve(),f=p(b.currentUser()),m=p(D.config()),h=xe(c),g=f.data?.isAuthenticated??!1,_=!c(r.StudentExperience),v=!c(r.GuestExperience),y=o(N.Primary),S=g&&y&&(_||i)&&v,C=g&&y&&_&&v,w=S&&t,T=p(e&&w&&L.getViviIntegrationStatus()),E=T.data===oe.Connected,O=!w||T.hasCompleted;return{hasCompleted:!g||f.hasCompleted&&m.hasCompleted&&O&&l&&!a&&!s,data:{ctaOptions:h,canUserCastToDevices:S||C,vivi:{accountConnected:E,enabled:S&&t,apiUrl:m.data?.viviApiUrl??``,fetchAccessToken:u},appleTv:{enabled:C&&n,fetchAccessToken:d}}}}function ve(){let e=f(),t=d();return{fetchViviAccessToken:async()=>{let n=L.getViviAccessToken(),r=t(n.key),{token:i}=r.shouldFetch?await e(n):r.data;return i},fetchAppleTvAccessToken:()=>e(L.getAppleTvAccessToken())}}var ye=`https://clickv.ie/w/WVsx`,be=`https://clickv.ie/w/PVsx`;function xe(e){let[i,a]=j(`devices:cta:dismissed`,{dismissed:!1},{storage:l.LocalStorage}),o=e(r.StudentExperience),s=e(r.ManageIntegrations),u={entity:g.DevicesCta,actionType:y.Click,workflowPhase:m.Complete,location:v.Player};return{hasBeenDismissed:i.dismissed||o,canUserManageIntegrations:s,onDismiss:e=>{O.logUserAction({canUserManageIntegrations:s,context:e},{...u,descriptor:_.Dismiss,eventVersion:h.V1}),a({dismissed:!0})},onInstall:e=>{O.logUserAction({canUserManageIntegrations:s,context:e},{...u,descriptor:_.InstallIntegration,eventVersion:h.V1}),n.trigger({application:c.SETTINGS,action:E.Settings.INTEGRATIONS})},onLearnMore:e=>{O.logUserAction({canUserManageIntegrations:s,context:e},{...u,descriptor:_.LearnMore,eventVersion:h.V1}),(e===`vivi_and_apple_tv`||e===`vivi`)&&t.PageLoad(ye,!0),(e===`vivi_and_apple_tv`||e===`apple_tv`)&&t.PageLoad(be,!0)},onContactSupport:e=>{O.logUserAction({canUserManageIntegrations:s,context:e},{...u,descriptor:_.ContactSupport,eventVersion:h.V1}),t.PageLoad(te.getSupportRequestUrl(),!0)}}}var G={VIDEO_START_TIME_CUTOFF:10,PUBLIC_SEARCH_QUERY_DEBOUNCE:400,AUTHENTICATED_SEARCH_QUERY_DEBOUNCE:200},K=e=>({application:c.LIBRARIES,action:E.Libraries.LIBRARY,args:[e.id.toString(),a.slugify(e.name)]}),q=(e,t)=>({application:c.LIBRARIES,action:E.Libraries.FOLDER,args:[e.id.toString(),t.id.toString(),a.slugify(t.name)]});function Se(e){let{settings:t,presentationSlug:n}=e;return{getTagAppLink:e=>({application:c.SEARCH,action:E.Search.HOME,params:{tagOrClassification:e.name}}),getSeriesAppLink:(e,t)=>ue.getSeriesAppLink(e,t?{mtv:!0}:{},n),getResourceAppLink:(e,t,n)=>r=>!n&&!t?{application:c.SIGN_UP,action:E.SignUp.SIGN_UP}:{application:c.VIDEOS,action:E.Videos.PREVIEW_PDF,args:[r.id],params:{videoId:e,shareId:t}},getPartnerProfileAppLink:t?.hasPartnerProfiles?e=>z.getPartnerDashboardAppLink(e):null,getPartnerDashboardHubAppLink:t?.hasPartnerProfiles?e=>z.getPartnerDashboardHubAppLink(e):null,getLibraryAppLink:K,getFolderAppLink:q}}function Ce(e,t){let n=Number(e);if(!isNaN(n)&&n>=0)return n;let r=C.getVideoProgress(t);return!r||r>=t.duration/1e3-G.VIDEO_START_TIME_CUTOFF?0:r}function we(e){if(Number.isInteger(+e))return+e}var J={poster:`_poster_1ven8_1`,frost:`_frost_1ven8_5`,image:`_image_1ven8_9`},Y=`shared.streamLimitOverlay`,X=i.encloseNamespace(Y);function Te(e){let t=e.canRedeemMoreReferrals?E.SignUp.INVITE_COLLEAGUE:E.SignUp.UPGRADE,n=e.canRedeemMoreReferrals?`inviteCta`:`upgradeCta`,r=e.embed||e.hasStudentExperience,i;return i=r?`basicDescription`:e.canRedeemMoreReferrals?`referralDescription`:`upgradeDescription`,V.useEffect(()=>{e.embed&&fe.remove()},[e.embed]),(0,H.jsxs)(`div`,{className:`position-relative bg-light overflow-hidden ${e.embed?`position-fixed top-0 start-0 end-0 bottom-0`:`ratio ratio-16x9`}`,children:[e.posterUrl&&(0,H.jsx)(`img`,{className:`position-absolute top-0 start-0 w-100 h-100 object-fit-cover ${J.poster}`,src:e.posterUrl,alt:``}),(0,H.jsx)(`div`,{className:`position-absolute top-0 start-0 w-100 h-100 ${J.frost}`}),(0,H.jsxs)(`div`,{className:`position-absolute top-0 start-0 w-100 h-100 d-flex flex-column align-items-center justify-content-center text-center p-4`,children:[(0,H.jsx)(`img`,{className:`${J.image} d-none d-md-block mb-3`,src:A.SignUp.INVITE_COLLEAGUE,alt:X(`heading`)}),(0,H.jsx)(`h2`,{className:`h5 mb-2`,children:(0,H.jsx)(de,{namespace:Y,phrase:`heading`,options:{smartCount:e.totalStreamsAvailable}})}),(0,H.jsx)(`p`,{className:`text-dark mb-3`,children:X(i)}),!r&&(0,H.jsx)(ne,{className:`btn btn-dark`,appLink:{application:c.SIGN_UP,action:t},children:X(n)})]})]})}var Ee=38,De=40,Oe=()=>{function e(e){if(e.keyCode===Ee||e.keyCode===De)return e.preventDefault(),!1}V.useEffect(()=>(window.addEventListener(`keydown`,e,!1),()=>{window.removeEventListener(`keydown`,e,!1)}),[])},Z=6,ke=25;function Q(e){let{video:t,currentUser:n,moviesAndTv:r,context:i,contextId:a}=e,{canViewRelatedVideos:o}=_e(),{hasProduct:s}=R(),c=u();function l(e){return!t||!n?.isAuthenticated||!s(N.Primary)||!o||!i&&!a?null:w.relatedVideos({videoId:t.id,context:i,collectionId:a,moviesAndTv:r,limit:e})}function d(e){return e&&(h&&(e=e.slice(0,Z-1)),e.filter(e=>C.getCanBeConsumed(e)?.canNavigate))}function f(){c(l(ke))}let m=p(l(Z)),h=m.data?.length===Z;return{videos:d(m.data),hasCompleted:m.hasCompleted,isFetching:m.isFetching,hasError:m.hasError,hasMore:h,fetchNext:f}}var Ae=M.Medium;function je(e,t,n){return t?n?n.objectId===e?F.createViewKey(t,P.Share):F.createViewKey(e,P.MasterObject,t):null:F.createViewKey(e,P.MasterObject)}function Me(e){let{objectId:t,objectTypeId:n,shareId:r,context:i,contextId:a,moviesAndTv:o}=e,s=p(D.config()),c=p(b.currentUser()),l=p(t&&C.getVideoRequest(t,n,r)),u=p(r&&k.getShareObject(r)),d=U((n===S.Video||n===S.Clip)&&t),f=p(t&&je(t,r,u.data)),m=Q({video:l.data,context:i,contextId:a,moviesAndTv:o,currentUser:c.data}),h=W(t);return p(t&&c.data?.isAuthenticated&&he.isFavourited(c.data.id,[t])),{hasCompleted:l.data&&s.hasCompleted&&c.hasCompleted&&(!r||u.hasCompleted)&&(n!==S.Video||d.hasCompleted)&&f.hasCompleted&&h.hasCompleted,config:s.data,currentUser:c.data,video:l.data,shareLink:u.data,pointsOfInterest:d?.items,viewKey:f.data,relatedVideos:m.videos,playerIntegrations:h.data}}function Ne(e,t){let{setFavourite:n,canFavourite:r}=ge(v.Player),i=me.isFavouritedByCurrentUser(t),a=C.isVideoTypeArchived(t);V.useEffect(()=>{!e||!t||!r(t)||a||e.setFavourite?.(i,e=>n(t,e))},[t,e,r,a])}function Pe(e,t,r,i,a){let{hasProduct:o}=R(),s=C.isVideoTypeArchived(r),l=t.isAuthenticated&&C.isVideo(r)&&r._canCreateChild?.value&&o(N.Primary)&&!i&&a&&!s;if(!l)return;function u(){l&&n.trigger({application:c.CLIPS,action:E.Clips.CREATE_CLIP,args:[r.id],params:{startTime:e.current?.currentTime?.()??void 0}})}return u}function Fe(e,t){let{hasProduct:n}=R();return e.isAuthenticated&&n(N.Primary)&&t}function Ie(e){let{player:t,relatedVideos:r,shareId:i,context:a,contextId:o,moviesAndTv:s,playNext:c,mode:l,isAuthenticated:u,presentationSlug:d}=e,f=r?.[0];V.useEffect(()=>{if(!t?.setNextVideo||!f)return;if(l!=="default"){t.setNextVideo?.(null,!1,null);return}let e=C.getThumbnail(f)?.url,r={name:f.name,thumbnailUrl:ee.createUrl(e,{size:Ae})};t.setNextVideo?.(r,c,()=>{n.trigger(B.getAppLink(f,{shareId:i,context:a,contextId:o,playNext:c,moviesAndTv:s,includeContext:u},d))})},[t,f,i,a,o,c,l])}var $={embeddedPlayer:`_embeddedPlayer_1qmhl_1`,placeholder:`_placeholder_1qmhl_8`,theatreMode:`_theatreMode_1qmhl_12`};function Le(e){return e.shareLink?e.currentUser.isAuthenticated?!0:!!e.collectAnonResults:!1}function Re(e,t,r,i,a){if(t)return n.getHref({application:c.SHARE,action:E.Share.VIEW_SHARE_LINK,args:[t.id],params:{t:r.currentTime,a:!0}});let o=B.getAppLink(e,{includeContext:i},a);return o.params||={},o.params.t=r.currentTime,o.params.a=!0,n.getHref(o)}ze.defaultProps={allowCreateClip:!0};function ze(e){let t=V.useRef(null),n=V.useRef(null);Ne(t.current,e.video),t.current,e.video,e.shareLink,Ie({player:t.current,relatedVideos:e.relatedVideos,shareId:e.shareLink?.id,context:e.context,contextId:e.contextId,moviesAndTv:e.moviesAndTv,playNext:e.playNext,mode:e.mode,isAuthenticated:e.currentUser?.isAuthenticated,presentationSlug:e.presentationSlug}),Oe();let i=Fe(e.currentUser,e.onRequestPictureInPicture),{experimentalInteractiveQuestions:a}=x(null),{isLoaded:o,hasReachedStreamLimit:s,canRedeemMoreReferrals:c,totalStreamsAvailable:l}=pe(),{hasPermissions:u}=I(),d=u(r.GuestExperience),f=u(r.StudentExperience),p=Pe(t,e.currentUser,e.video,e.embed,!d&&e.allowCreateClip),m=se();function h(n){t.current=n,m(),e.onReady&&e.onReady(n),g(n)}function g(t){n.current=new ce({player:t,video:e.video,analyticsLocation:e.embed?v.EmbeddedPlayer:v.PlayPage,shareId:e.shareLink?.id})}let _=``;`thumbnail`in e.video&&(_=e.video.thumbnail?.url),!_&&`_parentVideo`in e.video&&(_=e.video._parentVideo?.thumbnail?.url);let y={viewKey:e.viewKey.viewKey,playerApi:new URL(e.config.playerApiUrl),imageCdnUrl:e.config.imageCdnUrl,autoplay:e.autoplay,startTime:Ce(e.startTime,e.video),endTime:we(e.endTime),embed:e.embed,showResources:e.showResources,getExternalLink:e.embed&&(t=>Re(e.video,e.shareLink,t,e.currentUser?.isAuthenticated,e.presentationSlug)),muted:e.muted,splash:e.embed?{title:e.video.name,posterUrl:_,ratingCode:C.getRating(e.video)?.code,ratingValue:C.getRating(e.video)?.value,seriesName:`series`in e.video&&e.video.series?.name,seasonNumber:`season`in e.video&&e.video.season?.number,episodeNumber:`episodeNumber`in e.video&&e.video.episodeNumber}:void 0,allowTheatreMode:e.allowTheatreMode,allowLoop:!0,hotkeyElQuerySelector:`body`,sharerInstanceRegion:e.shareLink?.ownerInstanceRegion},b=e.playerIntegrations?{...e.playerIntegrations,trackingCode:C.getTrackingCode(e.video)}:void 0,w=e.mode==="default"&&e.defaultDisplayMode===`theatre`,E=e.mode===`hover`,D=e.video.typeId===S.Interactive,O=le.isPublic(e.shareLink),k=o&&s&&!E&&!O,A=V.useMemo(()=>V.lazy(()=>T(()=>import(`./D_t70KgV2.chunk.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176]))),[]),j=V.useMemo(()=>V.lazy(()=>T(()=>import(`./BOQck-Qs.chunk.js`),__vite__mapDeps([177,1,14,7,15,16,4,5,18,178,2,3,6,8,9,10,11,12,13,130,35,32,37,38,179,121,71,180,181,138,182,116,183,61,23,90,184,185,104,26,79,30,78,80,81,82,186,187,188,98,99,100,25,101,102,103,24,105,106,48,56,55,49,34,36,39,107,108,109,110,111,112,113,77,114,115,117,118,119,17,60,120,43,122,123,124,125,64,126,127,128,129,72,131,132,133,134,135,136,137,33,139,140,141,142,143,144,145,146,147,148,149,150,153,154,155,156,175,189,190,191,68,69,70,67,45,46,47,50,51,52,53,54,57,58,59,62,63,65,66,192,193,194]))),[]);if(k)return(0,H.jsx)(Te,{posterUrl:_,embed:e.embed,hasStudentExperience:f,canRedeemMoreReferrals:c,totalStreamsAvailable:l});if(D)return(0,H.jsx)(V.Suspense,{fallback:(0,H.jsx)(`div`,{className:$.placeholder}),children:(0,H.jsx)(A,{...y,imageApi:new URL(e.config.imageCdnUrl),currentUser:e.currentUser,collectResults:Le(e),shareId:e.shareLink?.id,enableImmersiveReader:!0,summaryPortalNode:e.summaryPortalNode,onShowSummary:e.onShowSummary,onReady:h,className:e.embed?$.embeddedPlayer:``,furthestVisitedTime:e.video._videoProgress?.furthest,questionListPortalNode:e.questionListPortalNode,authToken:e.token?.value,experimentalInteractiveQuestions:a})});function M(){return e.embed?$.embeddedPlayer:w?`w-100 h-100`:``}return(0,H.jsx)(V.Suspense,{fallback:(0,H.jsx)(`div`,{className:`${$.placeholder} ${w?$.theatreMode:``}`}),children:(0,H.jsx)(j,{...y,devicesConfig:b,className:M(),onClickCreateClip:p,pointsOfInterest:e.pointsOfInterest,onReady:h,showResources:e.embed,onRequestPictureInPicture:i&&e.onRequestPictureInPicture,onRequestTheatreMode:e.onRequestTheatreMode,theatreMode:w,nextDefaultDisplayMode:e.defaultDisplayMode,allowTranscript:e.allowTranscript})})}export{q as a,W as c,Se as i,U as l,Me as n,K as o,Q as r,G as s,ze as t};
3
+ //# sourceMappingURL=_Cm5O72d.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../src/shared/hooks/useFetchPointsOfInterest.ts","../../src/shared/hooks/usePlayerIntegrations.ts","../../src/shared/constants/LiteConstants.ts","../../src/shared/components/play-page/PlayPageUtils.ts","../../src/shared/components/stream-limit-overlay/StreamLimitOverlay.tsx","../../src/shared/hooks/usePreventKeyboardScroll.ts","../../src/shared/hooks/useGetRelatedVideos.ts","../../src/shared/views/lite-player/LitePlayerViewHooks.tsx","../../src/shared/views/lite-player/LitePlayerView.tsx"],"sourcesContent":["import { Flight } from 'libs/common/flight';\n\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useFetchAll } from 'libs/shared/hooks/UseFetchAll';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { EmptySelectAllPagesResult, SelectAllPagesResult, useSelectAllPages } from 'libs/shared/hooks/UseSelectAllPages';\nimport { CurrentUser, PointOfInterest } from 'libs/shared/interfaces';\n\nexport function useFetchPointsOfInterest(\n videoId?: string,\n forceFetch?: boolean\n): SelectAllPagesResult<PointOfInterest> {\n const fetch = Flight.useGetFetch();\n const { hasPermissions } = usePermissions();\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const shouldFetch = (currentUser.data?.isAuthenticated || forceFetch) &&\n hasPermissions(PermissionName.ViewVideoPointsOfInterest);\n\n function getRequest(cursor?: string): Flight.Request {\n return VideoRequests.pointsOfInterest(videoId, cursor);\n }\n \n function fetchNext(cursor?: string): void {\n fetch(getRequest(cursor));\n }\n\n /**\n * This is a big strange, but since we can't conditionally use hooks, instead\n * we null out the videoId so the points of interest never fetch for students.\n */\n if (!shouldFetch)\n videoId = null;\n\n useFetchAll(!!videoId && getRequest, !!videoId && fetchNext);\n\n const result = useSelectAllPages<PointOfInterest>(!!videoId && ((cursor?: string) => getRequest(cursor).key));\n\n /**\n * Then we return a placeholder object that lets anything consuming this behave as if\n * the Points of interest have fetched and there are one.\n */\n if (!shouldFetch)\n return EmptySelectAllPagesResult;\n\n return result;\n}\n","import { LocationUtils } from 'libs/common/backbone/core';\nimport { StorageType } from 'libs/common/backbone/utils/LocalStorageHelper';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, DevicesDescriptor, EntityType, EventVersion, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { IntegrationStatus } from 'libs/shared/enums/IntegrationStatus';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { PlayerIntegrationsRequests } from 'libs/shared/flight-requests/PlayerIntegrationsRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { HasPermissionsFunc, usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, CurrentUser } from 'libs/shared/interfaces';\nimport { CtaContext, PlayerIntegrations } from 'libs/shared/interfaces';\nimport { AppleTvAccessToken, ViviAccessToken } from 'libs/shared/interfaces';\nimport { ArticleHelper } from 'libs/shared/utils/ArticleHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\ninterface PlayerIntegrationsHash {\n hasCompleted: boolean;\n data: PlayerIntegrations;\n}\n\nexport function usePlayerIntegrations(objectId: string): PlayerIntegrationsHash {\n const {\n hasEnabledViviPlayback,\n hasEnabledAppleTvPlayback,\n hasEnabledViviStudentCasting,\n isLoadingSettings\n } = useSettings(null);\n const { hasProduct, isLoadingProducts } = useProducts();\n const { hasPermissions, isLoaded: permissionsLoaded } = usePermissions();\n const { fetchViviAccessToken, fetchAppleTvAccessToken } = useAccessTokenFetchFunctions();\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const ctaOptions = useCtaOptions(hasPermissions);\n\n // Compute derived state\n const isAuthenticated = currentUser.data?.isAuthenticated ?? false;\n const isNotStudent = !hasPermissions(PermissionName.StudentExperience);\n const isNotGuest = !hasPermissions(PermissionName.GuestExperience);\n const hasPrimaryProduct = hasProduct(ProductId.Primary);\n const canUserCastToVivi = isAuthenticated\n && hasPrimaryProduct && (isNotStudent || hasEnabledViviStudentCasting) && isNotGuest;\n const canUserCastToAppleTv = isAuthenticated && hasPrimaryProduct && isNotStudent && isNotGuest;\n const shouldCheckViviStatus = canUserCastToVivi && hasEnabledViviPlayback;\n \n // Fetch the status of the Vivi integration if necessary\n const viviStatus = Flight.useBasicFetch<IntegrationStatus>(\n objectId &&\n shouldCheckViviStatus &&\n PlayerIntegrationsRequests.getViviIntegrationStatus()\n );\n const viviAccountConnected = viviStatus.data === IntegrationStatus.Connected;\n const viviStatusCheckCompleted = shouldCheckViviStatus ? viviStatus.hasCompleted : true;\n\n // Compute the final `hasCompleted` value\n const hasCompleted = isAuthenticated ? (\n currentUser.hasCompleted &&\n config.hasCompleted &&\n viviStatusCheckCompleted &&\n permissionsLoaded &&\n !isLoadingSettings &&\n !isLoadingProducts\n ) : true;\n \n return {\n hasCompleted,\n data: {\n ctaOptions,\n canUserCastToDevices: canUserCastToVivi || canUserCastToAppleTv,\n vivi: {\n accountConnected: viviAccountConnected,\n enabled: canUserCastToVivi && hasEnabledViviPlayback,\n apiUrl: config.data?.viviApiUrl ?? '',\n fetchAccessToken: fetchViviAccessToken\n },\n appleTv: {\n enabled: canUserCastToAppleTv && hasEnabledAppleTvPlayback,\n fetchAccessToken: fetchAppleTvAccessToken\n }\n }\n };\n}\n\nfunction useAccessTokenFetchFunctions() {\n const fetchAsync = Flight.useGetFetchAsync();\n const getResponse = Flight.useGetResponseFunc();\n\n const fetchViviAccessToken = async () => {\n const request = PlayerIntegrationsRequests.getViviAccessToken();\n const tokenResponse = getResponse<ViviAccessToken>(request.key);\n const { token } = tokenResponse.shouldFetch ?\n await fetchAsync<ViviAccessToken>(request) :\n tokenResponse.data;\n \n return token;\n };\n\n const fetchAppleTvAccessToken = () => {\n return fetchAsync<AppleTvAccessToken>(\n PlayerIntegrationsRequests.getAppleTvAccessToken()\n );\n };\n\n return {\n fetchViviAccessToken,\n fetchAppleTvAccessToken\n };\n}\n\nconst VIVI_LEARN_MORE_URL = 'https://clickv.ie/w/WVsx';\nconst APPLE_TV_LEARN_MORE_URL = 'https://clickv.ie/w/PVsx';\n\nfunction useCtaOptions(hasPermissions: HasPermissionsFunc) {\n const [ dismissedModel, setDismissedModel ] = useViewModel<{ dismissed: boolean }>(\n 'devices:cta:dismissed',\n { dismissed: false },\n { storage: StorageType.LocalStorage }\n );\n const isStudent = hasPermissions(PermissionName.StudentExperience);\n const canUserManageIntegrations = hasPermissions(PermissionName.ManageIntegrations);\n const analyticsOptions: Partial<AnalyticsOptions> = {\n entity: EntityType.DevicesCta,\n actionType: UserAction.Click,\n workflowPhase: WorkflowPhase.Complete,\n location: LocationContext.Player\n };\n\n const onDismiss = (context: CtaContext) => {\n AnalyticsHelper.logUserAction({\n canUserManageIntegrations,\n context\n }, {\n ...analyticsOptions,\n descriptor: DevicesDescriptor.Dismiss,\n eventVersion: EventVersion.V1\n });\n\n setDismissedModel({ dismissed: true });\n };\n\n const onInstall = (context: CtaContext) => {\n AnalyticsHelper.logUserAction({\n canUserManageIntegrations,\n context\n }, {\n ...analyticsOptions,\n descriptor: DevicesDescriptor.InstallIntegration,\n eventVersion: EventVersion.V1\n });\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.SETTINGS,\n action: Actions.Settings.INTEGRATIONS\n });\n };\n\n const onLearnMore = (context: CtaContext) => {\n AnalyticsHelper.logUserAction({\n canUserManageIntegrations,\n context\n }, {\n ...analyticsOptions,\n descriptor: DevicesDescriptor.LearnMore,\n eventVersion: EventVersion.V1\n });\n\n if (context === 'vivi_and_apple_tv' || context === 'vivi')\n LocationUtils.PageLoad(VIVI_LEARN_MORE_URL, true);\n\n if (context === 'vivi_and_apple_tv' || context === 'apple_tv')\n LocationUtils.PageLoad(APPLE_TV_LEARN_MORE_URL, true);\n };\n\n const onContactSupport = (context: CtaContext) => {\n AnalyticsHelper.logUserAction({\n canUserManageIntegrations,\n context\n }, {\n ...analyticsOptions,\n descriptor: DevicesDescriptor.ContactSupport,\n eventVersion: EventVersion.V1\n });\n\n LocationUtils.PageLoad(ArticleHelper.getSupportRequestUrl(), true);\n };\n\n return {\n hasBeenDismissed: dismissedModel.dismissed || isStudent,\n canUserManageIntegrations,\n onDismiss,\n onInstall,\n onLearnMore,\n onContactSupport\n };\n}\n","// Misc constants\nexport const LiteConstants = {\n VIDEO_START_TIME_CUTOFF: 10, // If the video start time is in the last 10 seconds of the video duration, it's ignored\n PUBLIC_SEARCH_QUERY_DEBOUNCE: 400,\n AUTHENTICATED_SEARCH_QUERY_DEBOUNCE: 200\n};\n","import { Core } from 'libs/common/core';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { SettingsHash } from 'libs/shared/hooks/useSettings';\nimport { Category, Company, Library, Link, PartnerProfile, Person, Resource, Series, Tag, Video } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { LiteConstants } from 'shared/constants/LiteConstants';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { ContentPartnerAppLinkHelper } from 'shared/utils/ContentPartnerAppLinkHelper';\n\nimport { SeriesAppLinkHelper } from 'apps/series/SeriesAppLinkHelper';\n\nexport function 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 const filteredResources = resources.filter(r => {\n if (!isLearner)\n return true;\n\n return r.metadata?.resourceType === 'additional-materials' || r.metadata?.resourceType === 'student-activity';\n });\n\n return [ ...filteredResources, ...links ];\n}\n\nexport const getLibraryAppLink = (library: Library): Core.AppLink => {\n return {\n application: AppChannels.LIBRARIES,\n action: Actions.Libraries.LIBRARY,\n args: [ library.id.toString(), TextHelper.slugify(library.name) ]\n };\n};\n\nexport const getFolderAppLink = (library: Library, folder: Category): Core.AppLink => {\n return {\n application: AppChannels.LIBRARIES,\n action: Actions.Libraries.FOLDER,\n args: [ library.id.toString(), folder.id.toString(), TextHelper.slugify(folder.name) ]\n };\n};\n\ninterface GetAppLinksOptions {\n settings: SettingsHash;\n presentationSlug: string | null;\n}\n\nexport function getAppLinks(options: GetAppLinksOptions) {\n const { settings, presentationSlug } = options;\n\n const getTagAppLink = (tag: Tag) => {\n return {\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n params: { tagOrClassification: tag.name }\n };\n };\n\n const getSeriesAppLink = (series: Series, moviesAndTv: boolean): Core.AppLink => {\n return SeriesAppLinkHelper.getSeriesAppLink(series, moviesAndTv ? { mtv: true } : {}, presentationSlug);\n };\n\n const getResourceAppLink = (videoId: string, shareId: string, canViewResource: boolean) =>\n (resource: Resource | Link) => {\n /**\n * We check both the feature access value and the shareId. \n * Resources should always be available if we have a share id, and the backend should control\n * which specific resources are returned - Sha\n */\n if (!canViewResource && !shareId) {\n return {\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.SIGN_UP\n };\n }\n\n return {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PREVIEW_PDF,\n args: [resource.id],\n params: {\n videoId: videoId,\n shareId: shareId\n }\n };\n };\n\n const getPartnerProfileAppLink = (partnerProfile: PartnerProfile) => {\n return ContentPartnerAppLinkHelper.getPartnerDashboardAppLink(partnerProfile);\n };\n\n const getPartnerDashboardHubAppLink = (company: Company | Person) => {\n return ContentPartnerAppLinkHelper.getPartnerDashboardHubAppLink(company);\n };\n\n return {\n getTagAppLink,\n getSeriesAppLink,\n getResourceAppLink,\n getPartnerProfileAppLink: settings?.hasPartnerProfiles ? getPartnerProfileAppLink : null,\n getPartnerDashboardHubAppLink: settings?.hasPartnerProfiles ? getPartnerDashboardHubAppLink : null,\n getLibraryAppLink,\n getFolderAppLink\n };\n}\n\nexport function getStartTime(startTimeParam: string | number, video: Video): number {\n const startTime = Number(startTimeParam);\n\n if (!isNaN(startTime) && startTime >= 0)\n return startTime;\n\n const lastProgressPoint = VideoHelper.getVideoProgress(video);\n\n if (!lastProgressPoint)\n return 0;\n\n if (lastProgressPoint >= (video.duration / 1000 - LiteConstants.VIDEO_START_TIME_CUTOFF))\n return 0;\n\n return lastProgressPoint;\n}\n\nexport function getEndTime(endTimeParam: string | number): number | undefined {\n if (Number.isInteger(+endTimeParam))\n return +endTimeParam;\n\n return undefined;\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { EmbedPlaceHolderHelper } from 'apps/embed/utils/EmbedPlaceholderHelper';\n\nimport styles from './stream-limit-overlay.module.scss';\n\nconst namespace = 'shared.streamLimitOverlay';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface StreamLimitOverlayProps {\n posterUrl: string;\n embed: boolean;\n hasStudentExperience: boolean;\n canRedeemMoreReferrals: boolean;\n totalStreamsAvailable: number;\n}\n\nexport function StreamLimitOverlay(props: StreamLimitOverlayProps): JSX.Element {\n const ctaAction = props.canRedeemMoreReferrals ?\n Actions.SignUp.INVITE_COLLEAGUE :\n Actions.SignUp.UPGRADE;\n\n const ctaPhrase = props.canRedeemMoreReferrals ? 'inviteCta' : 'upgradeCta';\n const hideCta = props.embed || props.hasStudentExperience;\n\n let descriptionPhrase: string;\n\n if (hideCta)\n descriptionPhrase = 'basicDescription';\n else if (props.canRedeemMoreReferrals)\n descriptionPhrase = 'referralDescription';\n else\n descriptionPhrase = 'upgradeDescription';\n\n /**\n * Embeds render a server-side splash screen (#embed-placeholder) that covers\n * the React app until the player fires 'cv-playback-data-loaded'. Since the\n * overlay replaces the player, that event never fires — so we need to \n * remove it manually.\n */\n React.useEffect(() => {\n if (props.embed)\n EmbedPlaceHolderHelper.remove();\n }, [props.embed]);\n\n return (\n <div className={`position-relative bg-light overflow-hidden ${props.embed ? 'position-fixed top-0 start-0 end-0 bottom-0' : 'ratio ratio-16x9'}`}>\n {props.posterUrl && (\n <img className={`position-absolute top-0 start-0 w-100 h-100 object-fit-cover ${styles.poster}`} src={props.posterUrl} alt='' />\n )}\n <div className={`position-absolute top-0 start-0 w-100 h-100 ${styles.frost}`} />\n <div className='position-absolute top-0 start-0 w-100 h-100 d-flex flex-column align-items-center justify-content-center text-center p-4'>\n <img\n className={`${styles.image} d-none d-md-block mb-3`}\n src={ImageUrls.SignUp.INVITE_COLLEAGUE}\n alt={getPhrase('heading')}\n />\n <h2 className='h5 mb-2'><Text namespace={namespace} phrase='heading' options={{ smartCount: props.totalStreamsAvailable }} /></h2>\n <p className='text-dark mb-3'>{getPhrase(descriptionPhrase)}</p>\n {!hideCta && (\n <AppLink\n className='btn btn-dark'\n appLink={{ application: AppChannels.SIGN_UP, action: ctaAction }}\n >\n {getPhrase(ctaPhrase)}\n </AppLink>\n )}\n </div>\n </div>\n );\n}\n","import React from 'react';\n\nconst UP_ARROW = 38;\nconst DOWN_ARROW = 40;\n\n/**\n * When this hook is used on a page, it will prevent the page from being scrollable by using\n * the up/down arrow keys.\n * \n * This is helpful on pages with a video playing, as we want the up/down arrow keys to control the\n * player volume without scrolling.\n */\nexport const usePreventKeyboardScroll = () => {\n function preventDefaultForScrollKeys(e: KeyboardEvent): boolean {\n if (e.keyCode === UP_ARROW || e.keyCode === DOWN_ARROW) {\n e.preventDefault();\n return false;\n }\n }\n\n React.useEffect(() => {\n window.addEventListener('keydown', preventDefaultForScrollKeys, false);\n\n return () => {\n window.removeEventListener('keydown', preventDefaultForScrollKeys, false);\n };\n }, []);\n};\n","import { Flight } from 'libs/common/flight';\n\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { RelatedVideosContext } from 'libs/shared/enums/RelatedVideosContext';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { CurrentUser, VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { useVideoFeatureAccess } from './useVideoFeatureAccess';\n\n/**\n * Poor mans paging explination:\n * \n * This change was made while we were doing performance imrovements in Feb 2024.\n * Because the related videos endpoint does not have paging, we fetch 6 to display 5 videos\n * this will let us know if there is another page. When the user requests the next page\n * we just fetch 25 items.\n * \n * - sHa\n */\nconst RELATED_VIDEOS_FIRST_PAGE = 6;\nconst RELATED_VIDEOS_MAX = 25;\n\nexport interface RelatedVideosHash {\n videos: VideoTypes[];\n hasError: boolean;\n hasCompleted: boolean;\n isFetching: boolean;\n fetchNext: () => void;\n hasMore: boolean;\n}\n\ninterface RelatedVideoOptions {\n video: VideoTypes;\n currentUser: CurrentUser;\n context: RelatedVideosContext;\n contextId: string;\n moviesAndTv: boolean;\n}\n\nexport function useGetRelatedVideos(options: RelatedVideoOptions): RelatedVideosHash {\n const { video, currentUser, moviesAndTv, context, contextId } = options;\n\n const { canViewRelatedVideos } = useVideoFeatureAccess();\n\n const { hasProduct } = useProducts();\n\n const fetch = Flight.useGetFetch();\n\n function getRequest(limit: number): Flight.Request {\n if (!video || !currentUser?.isAuthenticated || !hasProduct(ProductId.Primary) || !canViewRelatedVideos)\n return null;\n\n /**\n * We are no longer fetching related videos unless we have a context\n */\n if (!context && !contextId)\n return null;\n\n return VideoRequests.relatedVideos({\n videoId: video.id,\n context,\n collectionId: contextId,\n moviesAndTv,\n limit\n });\n }\n\n function filterVideos(videos: VideoTypes[]): VideoTypes[] {\n if (!videos) // Might be undefined or null\n return videos;\n\n if (hasMore)\n videos = videos.slice(0, RELATED_VIDEOS_FIRST_PAGE - 1);\n\n return videos.filter(v => VideoHelper.getCanBeConsumed(v)?.canNavigate);\n }\n\n function fetchNext() {\n fetch(getRequest(RELATED_VIDEOS_MAX));\n }\n\n const response = Flight.useBasicFetch<VideoTypes[]>(getRequest(RELATED_VIDEOS_FIRST_PAGE));\n\n const hasMore = response.data?.length === RELATED_VIDEOS_FIRST_PAGE;\n\n return {\n videos: filterVideos(response.data),\n hasCompleted: response.hasCompleted,\n isFetching: response.isFetching,\n hasError: response.hasError,\n hasMore,\n fetchNext\n };\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { PlayerMode } from 'libs/shared/context/player-context/interfaces/PlayerMode';\nimport { PlayerReference } from 'libs/shared/context/player-context/interfaces/PlayerReference';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { MediaIdType } from 'libs/shared/enums/MediaIdType';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { RelatedVideosContext } from 'libs/shared/enums/RelatedVideosContext';\nimport { ShareActivityStatus } from 'libs/shared/enums/ShareActivityStatus';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { FavouriteRequests } from 'libs/shared/flight-requests/FavouriteRequests';\nimport { PlayerRequests } from 'libs/shared/flight-requests/PlayerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useActivityStatus } from 'libs/shared/hooks/UseActivityStatus';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { Config, CurrentUser, PlayerViewKey, ShareLink, UnionShareObject, VideoTypes } from 'libs/shared/interfaces';\nimport { FavouriteHelper } from 'libs/shared/utils/FavouriteHelpers';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { useFetchPointsOfInterest } from 'shared/hooks/useFetchPointsOfInterest';\nimport { useGetRelatedVideos } from 'shared/hooks/useGetRelatedVideos';\nimport { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\nimport { usePlayerIntegrations } from 'shared/hooks/usePlayerIntegrations';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nconst THUMBNAIL_SIZE = ImageSize.Medium;\n\nfunction createViewKeyRequest(\n objectId: string,\n shareId: string,\n shareLink: ShareLink\n): Flight.Request {\n if (!shareId)\n return PlayerRequests.createViewKey(objectId, MediaIdType.MasterObject);\n\n if (!shareLink)\n return null;\n\n /**\n * If our share link matches our object id it's just a video share\n */\n if (shareLink.objectId === objectId)\n return PlayerRequests.createViewKey(shareId, MediaIdType.Share);\n\n /**\n * Otherwise we're attempting to watch a video inside of a shared video collection (e.g. A shared playlist)\n */\n return PlayerRequests.createViewKey(objectId, MediaIdType.MasterObject, shareId);\n}\n\ninterface UseGetPlayerDataOptions {\n objectId: string;\n objectTypeId: MasterType;\n shareId: string;\n context: RelatedVideosContext;\n contextId: string;\n moviesAndTv: boolean;\n}\n\nexport function useGetPlayerData(options: UseGetPlayerDataOptions) {\n const { objectId, objectTypeId, shareId, context, contextId, moviesAndTv } = options;\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const video = Flight.useBasicFetch<VideoTypes>(\n objectId && VideoHelper.getVideoRequest(objectId, objectTypeId, shareId)\n );\n const shareLink = Flight.useBasicFetch<ShareLink>(shareId && ShareRequests.getShareObject(shareId));\n const canHavePointsOfInterest = objectTypeId === MasterType.Video || objectTypeId === MasterType.Clip;\n const pointsOfInterest = useFetchPointsOfInterest(canHavePointsOfInterest && objectId);\n const viewKey = Flight.useBasicFetch<PlayerViewKey>(\n objectId && createViewKeyRequest(objectId, shareId, shareLink.data)\n );\n const relatedVideos = useGetRelatedVideos({\n video: video.data,\n context,\n contextId,\n moviesAndTv,\n currentUser: currentUser.data\n });\n const playerIntegrations = usePlayerIntegrations(objectId);\n \n /**\n * Mix in if our video is favourited\n */\n Flight.useBasicFetch(\n objectId &&\n currentUser.data?.isAuthenticated &&\n FavouriteRequests.isFavourited(currentUser.data.id, [objectId])\n );\n\n const hasCompleted = (\n video.data &&\n config.hasCompleted &&\n currentUser.hasCompleted &&\n (!shareId || shareLink.hasCompleted) &&\n (objectTypeId !== MasterType.Video || pointsOfInterest.hasCompleted) &&\n viewKey.hasCompleted &&\n playerIntegrations.hasCompleted\n );\n\n return {\n hasCompleted,\n config: config.data,\n currentUser: currentUser.data,\n video: video.data,\n shareLink: shareLink.data,\n pointsOfInterest: pointsOfInterest?.items,\n viewKey: viewKey.data,\n relatedVideos: relatedVideos.videos,\n playerIntegrations: playerIntegrations.data\n };\n}\n\nexport function useSetFavourite(player: PlayerReference, video: VideoTypes) {\n const { setFavourite, canFavourite } = useLiteFavourites(LocationContext.Player);\n const isFavourited = FavouriteHelper.isFavouritedByCurrentUser(video);\n const isArchived = VideoHelper.isVideoTypeArchived(video);\n\n React.useEffect(() => {\n if (!player || !video || !canFavourite(video) || isArchived)\n return;\n\n player.setFavourite?.(isFavourited, (setFav: boolean) => setFavourite(video, setFav));\n }, [ video, player, canFavourite, isArchived ]);\n}\n\nexport function useSetActivityStatus(\n player: PlayerReference,\n video: VideoTypes,\n shareLink: UnionShareObject\n) {\n // Disabling activity status for performance reasons (28/2/24) - Sha\n return;\n\n const setActivityStatus = useActivityStatus(LocationContext.FloatingPlayer);\n const { hasPermissions } = usePermissions();\n\n React.useEffect(() => {\n if (!player || !video || !shareLink)\n return;\n\n if (!hasPermissions(PermissionName.StudentExperience) || !('activityStatus' in shareLink))\n return;\n\n player.setActivityStatus?.(shareLink.activityStatus, () => {\n const newStatus = shareLink.activityStatus === ShareActivityStatus.Complete ?\n ShareActivityStatus.Incomplete :\n ShareActivityStatus.Complete;\n\n setActivityStatus(shareLink.id, video, newStatus);\n });\n }, [ player, video, shareLink ]);\n}\n\nexport function useCreateClip(\n playerRef: React.MutableRefObject<PlayerReference>,\n currentUser: CurrentUser,\n video: VideoTypes,\n embed: boolean,\n allowCreateClip: boolean\n) {\n const { hasProduct } = useProducts();\n const isArchived = VideoHelper.isVideoTypeArchived(video);\n\n const canCreateClip = (\n currentUser.isAuthenticated &&\n VideoHelper.isVideo(video) &&\n video._canCreateChild?.value &&\n hasProduct(ProductId.Primary) &&\n !embed &&\n allowCreateClip &&\n !isArchived\n ) ;\n\n if (!canCreateClip)\n return undefined;\n \n function onClickCreateClip(): void {\n if (!canCreateClip)\n return;\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.CLIPS,\n action: Actions.Clips.CREATE_CLIP,\n args: [video.id],\n params: {\n startTime: playerRef.current?.currentTime?.() ?? undefined\n }\n });\n }\n\n return onClickCreateClip;\n}\n\nexport function usePip(\n currentUser: CurrentUser,\n onRequestPictureInPicture: (isPip: boolean) => void\n) {\n const { hasProduct } = useProducts();\n\n return (\n currentUser.isAuthenticated &&\n hasProduct(ProductId.Primary) &&\n onRequestPictureInPicture\n );\n}\n\ninterface UseSetNextVideoOptions {\n player: PlayerReference;\n relatedVideos: VideoTypes[];\n shareId: string;\n context: RelatedVideosContext;\n contextId: string;\n moviesAndTv: boolean;\n playNext: boolean;\n mode: PlayerMode;\n isAuthenticated: boolean;\n presentationSlug: string | null;\n}\n\nexport function useSetNextVideo(options: UseSetNextVideoOptions): void {\n const {\n player,\n relatedVideos,\n shareId,\n context,\n contextId,\n moviesAndTv,\n playNext,\n mode,\n isAuthenticated,\n presentationSlug\n } = options;\n\n const first = relatedVideos?.[0];\n\n React.useEffect(() => {\n if (!player?.setNextVideo || !first)\n return;\n\n /**\n * We only want to go to the next video if the user is on a play page.\n */\n if (mode !== 'default') {\n player.setNextVideo?.(null, false, null);\n return;\n }\n\n const rawThumbanilUrl = VideoHelper.getThumbnail(first)?.url;\n const nextVideo = {\n name: first.name,\n thumbnailUrl: ImageHelper.createUrl(rawThumbanilUrl, { size: THUMBNAIL_SIZE })\n };\n\n player.setNextVideo?.(nextVideo, playNext, () => {\n Core.AppLinkHelper.trigger(VideoAppLinkHelper.getAppLink(first, {\n shareId,\n context,\n contextId,\n playNext,\n moviesAndTv,\n includeContext: isAuthenticated\n }, presentationSlug));\n });\n }, [\n player,\n first,\n shareId,\n context,\n contextId,\n playNext,\n mode\n ]);\n}\n","import React from 'react';\nimport { HtmlPortalNode } from 'react-reverse-portal';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { DefaultDisplayMode } from 'libs/shared/context/player-context/interfaces/PlayerContextAction';\nimport { PlayerMode } from 'libs/shared/context/player-context/interfaces/PlayerMode';\nimport { PlayerReference } from 'libs/shared/context/player-context/interfaces/PlayerReference';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { RelatedVideosContext } from 'libs/shared/enums/RelatedVideosContext';\nimport { useForceUpdate } from 'libs/shared/hooks/useForceUpdate';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, CurrentUser, PlayerIntegrations, PlayerViewKey, PointOfInterest, UnionShareObject, VideoTypes } from 'libs/shared/interfaces';\nimport { AuthToken } from 'libs/shared/interfaces/models/AuthToken';\nimport { PlayerAnalyticsTracker } from 'libs/shared/utils/PlayerAnalyticsTracker';\nimport { ShareHelper } from 'libs/shared/utils/ShareHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport type { PlayerOptions } from 'projects/player/players/player';\nimport type { ExternalLinkOptions } from 'projects/player/plugins/open-externally-plugin/interfaces/ExternalLinkOptions';\n\nimport { getEndTime, getStartTime } from 'shared/components/play-page/PlayPageUtils';\nimport { StreamLimitOverlay } from 'shared/components/stream-limit-overlay/StreamLimitOverlay';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { usePreventKeyboardScroll } from 'shared/hooks/usePreventKeyboardScroll';\nimport { useStreamQuota } from 'shared/hooks/useStreamQuota';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\nimport { useCreateClip, usePip, useSetActivityStatus, useSetFavourite, useSetNextVideo } from 'shared/views/lite-player/LitePlayerViewHooks';\n\nimport styles from './lite-player.module.scss';\n\nfunction shouldCollectResults(props: LitePlayerViewProps): boolean {\n if (!props.shareLink)\n return false;\n\n if (props.currentUser.isAuthenticated)\n return true;\n\n return !!props.collectAnonResults;\n}\n\nfunction getExternalLink(\n video: VideoTypes,\n shareLink: UnionShareObject,\n options: ExternalLinkOptions,\n isAuthenticated: boolean,\n presentationSlug: string | null\n): string {\n if (shareLink) {\n return Core.AppLinkHelper.getHref({\n application: AppChannels.SHARE,\n action: Actions.Share.VIEW_SHARE_LINK,\n args: [shareLink.id],\n params: {\n t: options.currentTime,\n a: true\n }\n });\n }\n\n const appLink = VideoAppLinkHelper.getAppLink(video, { includeContext: isAuthenticated }, presentationSlug);\n if (!appLink.params)\n appLink.params = {};\n\n (appLink.params as HashObject).t = options.currentTime;\n (appLink.params as HashObject).a = true;\n return Core.AppLinkHelper.getHref(appLink);\n}\n\nexport interface LitePlayerViewProps {\n // Core data\n config: Config;\n token?: AuthToken;\n video: VideoTypes;\n currentUser: CurrentUser;\n shareLink?: UnionShareObject;\n pointsOfInterest?: PointOfInterest[];\n viewKey: PlayerViewKey;\n relatedVideos?: VideoTypes[];\n presentationSlug: string | null;\n\n // Hook options\n context?: RelatedVideosContext;\n contextId?: string;\n moviesAndTv?: boolean;\n playNext?: boolean;\n mode?: PlayerMode;\n defaultDisplayMode?: DefaultDisplayMode;\n\n allowCreateClip?: boolean;\n allowTheatreMode?: boolean;\n allowTranscript?: boolean;\n\n // Passthrough options\n autoplay?: boolean;\n startTime?: string;\n endTime?: string;\n embed?: boolean;\n showResources?: boolean;\n muted?: boolean;\n\n // Interactive\n summaryPortalNode?: HtmlPortalNode;\n questionListPortalNode?: HtmlPortalNode;\n onShowSummary?: (showing: boolean) => void;\n collectAnonResults?: boolean;\n\n // Devices\n playerIntegrations?: PlayerIntegrations;\n\n onReady?: (player: PlayerReference) => void;\n onRequestPictureInPicture?: (isPip: boolean) => void;\n onRequestTheatreMode?: (isTheatreMode: boolean) => void;\n}\n\n/**\n * Consumers of this view need to opt out of these features.\n */\nLitePlayerView.defaultProps = {\n allowCreateClip: true\n};\n\n// eslint-disable-next-line rulesdir/require-view-title\nexport function LitePlayerView(props: LitePlayerViewProps): JSX.Element {\n const playerRef = React.useRef<PlayerReference>(null);\n const analyticsTracker = React.useRef<PlayerAnalyticsTracker>(null);\n\n useSetFavourite(playerRef.current, props.video);\n useSetActivityStatus(playerRef.current, props.video, props.shareLink);\n useSetNextVideo({\n player: playerRef.current,\n relatedVideos: props.relatedVideos,\n shareId: props.shareLink?.id,\n context: props.context,\n contextId: props.contextId,\n moviesAndTv: props.moviesAndTv,\n playNext: props.playNext,\n mode: props.mode,\n isAuthenticated: props.currentUser?.isAuthenticated,\n presentationSlug: props.presentationSlug\n });\n usePreventKeyboardScroll();\n \n const allowPip = usePip(props.currentUser, props.onRequestPictureInPicture);\n\n const { experimentalInteractiveQuestions } = useSettings(null);\n const {\n isLoaded: streamQuotaLoaded,\n hasReachedStreamLimit,\n canRedeemMoreReferrals,\n totalStreamsAvailable\n } = useStreamQuota();\n\n const { hasPermissions } = usePermissions();\n\n const isGuest = hasPermissions(PermissionName.GuestExperience);\n const hasStudentExperience = hasPermissions(PermissionName.StudentExperience);\n\n const onClickCreateClip = useCreateClip(\n playerRef,\n props.currentUser,\n props.video,\n props.embed,\n isGuest ? false : props.allowCreateClip\n );\n\n const forceUpdate = useForceUpdate();\n\n function onReady(player: PlayerReference): void {\n playerRef.current = player;\n forceUpdate();\n props.onReady && props.onReady(player);\n setupAnalytics(player);\n }\n\n function setupAnalytics(player: PlayerReference): void {\n analyticsTracker.current = new PlayerAnalyticsTracker({\n player,\n video: props.video,\n analyticsLocation: props.embed ?\n LocationContext.EmbeddedPlayer :\n LocationContext.PlayPage,\n shareId: props.shareLink?.id\n });\n }\n\n let posterUrl = '';\n if ('thumbnail' in props.video)\n posterUrl = props.video.thumbnail?.url;\n if (!posterUrl && '_parentVideo' in props.video)\n posterUrl = props.video._parentVideo?.thumbnail?.url;\n\n const commonProps: PlayerOptions = {\n // Fetched\n viewKey: props.viewKey.viewKey,\n playerApi: new URL(props.config.playerApiUrl),\n imageCdnUrl: props.config.imageCdnUrl,\n\n // Options\n autoplay: props.autoplay,\n startTime: getStartTime(props.startTime, props.video),\n endTime: getEndTime(props.endTime),\n embed: props.embed,\n showResources: props.showResources,\n getExternalLink: props.embed &&\n (options => getExternalLink(\n props.video,\n props.shareLink,\n options,\n props.currentUser?.isAuthenticated,\n props.presentationSlug\n )),\n muted: props.muted,\n splash: props.embed ? {\n title: props.video.name,\n posterUrl,\n ratingCode: VideoHelper.getRating(props.video)?.code,\n ratingValue: VideoHelper.getRating(props.video)?.value,\n seriesName: 'series' in props.video && props.video.series?.name,\n seasonNumber: 'season' in props.video && props.video.season?.number,\n episodeNumber: 'episodeNumber' in props.video && props.video.episodeNumber\n } : undefined,\n // todo remove this once we ship theatre mode for everyone\n allowTheatreMode: props.allowTheatreMode,\n allowLoop: true,\n\n // Static\n hotkeyElQuerySelector: 'body',\n sharerInstanceRegion: props.shareLink?.ownerInstanceRegion\n };\n\n const devicesConfig = props.playerIntegrations ? {\n ...props.playerIntegrations,\n trackingCode: VideoHelper.getTrackingCode(props.video)\n } : undefined;\n\n const isTheatreMode = props.mode === 'default' && props.defaultDisplayMode === 'theatre';\n const isHoverMode = props.mode === 'hover';\n const isInteractive = props.video.typeId === MasterType.Interactive;\n const isPublicShare = ShareHelper.isPublic(props.shareLink);\n const showStreamLimitOverlay = streamQuotaLoaded && hasReachedStreamLimit && !isHoverMode && !isPublicShare;\n\n /**\n * We memoize two React.lazy components (interactive and standard) to avoid Suspense flicker on re-renders.\n * Hooks can't be conditional, so both lazies are created once and we choose which to render at runtime.\n * With default exports, React.lazy infers props, so no casting is required. - Sha\n */\n const InteractivePlayer = React.useMemo(() => React.lazy(() => import('projects/player/react/InteractivePlayer')), []);\n const Player = React.useMemo(() => React.lazy(() => import('projects/player/react/Player')), []);\n \n if (showStreamLimitOverlay) {\n return (\n <StreamLimitOverlay\n posterUrl={posterUrl}\n embed={props.embed}\n hasStudentExperience={hasStudentExperience}\n canRedeemMoreReferrals={canRedeemMoreReferrals}\n totalStreamsAvailable={totalStreamsAvailable}\n />\n );\n }\n\n if (isInteractive) {\n return (\n <React.Suspense fallback={<div className={styles.placeholder} />}>\n <InteractivePlayer\n {...commonProps}\n imageApi={new URL(props.config.imageCdnUrl)}\n currentUser={props.currentUser}\n collectResults={shouldCollectResults(props)}\n shareId={props.shareLink?.id}\n enableImmersiveReader\n summaryPortalNode={props.summaryPortalNode}\n onShowSummary={props.onShowSummary}\n onReady={onReady}\n className={props.embed ? styles.embeddedPlayer : ''}\n furthestVisitedTime={props.video._videoProgress?.furthest}\n questionListPortalNode={props.questionListPortalNode}\n authToken={props.token?.value}\n experimentalInteractiveQuestions={experimentalInteractiveQuestions}\n />\n </React.Suspense>\n );\n }\n\n function getClassName(): string {\n if (props.embed) {\n return styles.embeddedPlayer;\n }\n if (isTheatreMode)\n return 'w-100 h-100';\n return '';\n }\n\n return (\n <React.Suspense fallback={<div className={`${styles.placeholder} ${isTheatreMode ? styles.theatreMode : ''}`} />}>\n <Player\n {...commonProps}\n devicesConfig={devicesConfig}\n className={getClassName()}\n onClickCreateClip={onClickCreateClip}\n pointsOfInterest={props.pointsOfInterest}\n onReady={onReady}\n showResources={props.embed}\n onRequestPictureInPicture={allowPip && props.onRequestPictureInPicture}\n onRequestTheatreMode={props.onRequestTheatreMode}\n theatreMode={isTheatreMode}\n nextDefaultDisplayMode={props.defaultDisplayMode}\n allowTranscript={props.allowTranscript}\n />\n </React.Suspense>\n );\n}\n"],"file":"OmYpHs7g.chunk.js"}
1
+ {"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../src/shared/hooks/useFetchPointsOfInterest.ts","../../src/shared/hooks/usePlayerIntegrations.ts","../../src/shared/constants/LiteConstants.ts","../../src/shared/components/play-page/PlayPageUtils.ts","../../src/shared/components/stream-limit-overlay/StreamLimitOverlay.tsx","../../src/shared/hooks/usePreventKeyboardScroll.ts","../../src/shared/hooks/useGetRelatedVideos.ts","../../src/shared/views/lite-player/LitePlayerViewHooks.tsx","../../src/shared/views/lite-player/LitePlayerView.tsx"],"sourcesContent":["import { Flight } from 'libs/common/flight';\n\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useFetchAll } from 'libs/shared/hooks/UseFetchAll';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { EmptySelectAllPagesResult, SelectAllPagesResult, useSelectAllPages } from 'libs/shared/hooks/UseSelectAllPages';\nimport { CurrentUser, PointOfInterest } from 'libs/shared/interfaces';\n\nexport function useFetchPointsOfInterest(\n videoId?: string,\n forceFetch?: boolean\n): SelectAllPagesResult<PointOfInterest> {\n const fetch = Flight.useGetFetch();\n const { hasPermissions } = usePermissions();\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const shouldFetch = (currentUser.data?.isAuthenticated || forceFetch) &&\n hasPermissions(PermissionName.ViewVideoPointsOfInterest);\n\n function getRequest(cursor?: string): Flight.Request {\n return VideoRequests.pointsOfInterest(videoId, cursor);\n }\n \n function fetchNext(cursor?: string): void {\n fetch(getRequest(cursor));\n }\n\n /**\n * This is a big strange, but since we can't conditionally use hooks, instead\n * we null out the videoId so the points of interest never fetch for students.\n */\n if (!shouldFetch)\n videoId = null;\n\n useFetchAll(!!videoId && getRequest, !!videoId && fetchNext);\n\n const result = useSelectAllPages<PointOfInterest>(!!videoId && ((cursor?: string) => getRequest(cursor).key));\n\n /**\n * Then we return a placeholder object that lets anything consuming this behave as if\n * the Points of interest have fetched and there are one.\n */\n if (!shouldFetch)\n return EmptySelectAllPagesResult;\n\n return result;\n}\n","import { LocationUtils } from 'libs/common/backbone/core';\nimport { StorageType } from 'libs/common/backbone/utils/LocalStorageHelper';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, DevicesDescriptor, EntityType, EventVersion, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { IntegrationStatus } from 'libs/shared/enums/IntegrationStatus';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { PlayerIntegrationsRequests } from 'libs/shared/flight-requests/PlayerIntegrationsRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { HasPermissionsFunc, usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, CurrentUser } from 'libs/shared/interfaces';\nimport { CtaContext, PlayerIntegrations } from 'libs/shared/interfaces';\nimport { AppleTvAccessToken, ViviAccessToken } from 'libs/shared/interfaces';\nimport { ArticleHelper } from 'libs/shared/utils/ArticleHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\ninterface PlayerIntegrationsHash {\n hasCompleted: boolean;\n data: PlayerIntegrations;\n}\n\nexport function usePlayerIntegrations(objectId: string): PlayerIntegrationsHash {\n const {\n hasEnabledViviPlayback,\n hasEnabledAppleTvPlayback,\n hasEnabledViviStudentCasting,\n isLoadingSettings\n } = useSettings(null);\n const { hasProduct, isLoadingProducts } = useProducts();\n const { hasPermissions, isLoaded: permissionsLoaded } = usePermissions();\n const { fetchViviAccessToken, fetchAppleTvAccessToken } = useAccessTokenFetchFunctions();\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const ctaOptions = useCtaOptions(hasPermissions);\n\n // Compute derived state\n const isAuthenticated = currentUser.data?.isAuthenticated ?? false;\n const isNotStudent = !hasPermissions(PermissionName.StudentExperience);\n const isNotGuest = !hasPermissions(PermissionName.GuestExperience);\n const hasPrimaryProduct = hasProduct(ProductId.Primary);\n const canUserCastToVivi = isAuthenticated\n && hasPrimaryProduct && (isNotStudent || hasEnabledViviStudentCasting) && isNotGuest;\n const canUserCastToAppleTv = isAuthenticated && hasPrimaryProduct && isNotStudent && isNotGuest;\n const shouldCheckViviStatus = canUserCastToVivi && hasEnabledViviPlayback;\n \n // Fetch the status of the Vivi integration if necessary\n const viviStatus = Flight.useBasicFetch<IntegrationStatus>(\n objectId &&\n shouldCheckViviStatus &&\n PlayerIntegrationsRequests.getViviIntegrationStatus()\n );\n const viviAccountConnected = viviStatus.data === IntegrationStatus.Connected;\n const viviStatusCheckCompleted = shouldCheckViviStatus ? viviStatus.hasCompleted : true;\n\n // Compute the final `hasCompleted` value\n const hasCompleted = isAuthenticated ? (\n currentUser.hasCompleted &&\n config.hasCompleted &&\n viviStatusCheckCompleted &&\n permissionsLoaded &&\n !isLoadingSettings &&\n !isLoadingProducts\n ) : true;\n \n return {\n hasCompleted,\n data: {\n ctaOptions,\n canUserCastToDevices: canUserCastToVivi || canUserCastToAppleTv,\n vivi: {\n accountConnected: viviAccountConnected,\n enabled: canUserCastToVivi && hasEnabledViviPlayback,\n apiUrl: config.data?.viviApiUrl ?? '',\n fetchAccessToken: fetchViviAccessToken\n },\n appleTv: {\n enabled: canUserCastToAppleTv && hasEnabledAppleTvPlayback,\n fetchAccessToken: fetchAppleTvAccessToken\n }\n }\n };\n}\n\nfunction useAccessTokenFetchFunctions() {\n const fetchAsync = Flight.useGetFetchAsync();\n const getResponse = Flight.useGetResponseFunc();\n\n const fetchViviAccessToken = async () => {\n const request = PlayerIntegrationsRequests.getViviAccessToken();\n const tokenResponse = getResponse<ViviAccessToken>(request.key);\n const { token } = tokenResponse.shouldFetch ?\n await fetchAsync<ViviAccessToken>(request) :\n tokenResponse.data;\n \n return token;\n };\n\n const fetchAppleTvAccessToken = () => {\n return fetchAsync<AppleTvAccessToken>(\n PlayerIntegrationsRequests.getAppleTvAccessToken()\n );\n };\n\n return {\n fetchViviAccessToken,\n fetchAppleTvAccessToken\n };\n}\n\nconst VIVI_LEARN_MORE_URL = 'https://clickv.ie/w/WVsx';\nconst APPLE_TV_LEARN_MORE_URL = 'https://clickv.ie/w/PVsx';\n\nfunction useCtaOptions(hasPermissions: HasPermissionsFunc) {\n const [ dismissedModel, setDismissedModel ] = useViewModel<{ dismissed: boolean }>(\n 'devices:cta:dismissed',\n { dismissed: false },\n { storage: StorageType.LocalStorage }\n );\n const isStudent = hasPermissions(PermissionName.StudentExperience);\n const canUserManageIntegrations = hasPermissions(PermissionName.ManageIntegrations);\n const analyticsOptions: Partial<AnalyticsOptions> = {\n entity: EntityType.DevicesCta,\n actionType: UserAction.Click,\n workflowPhase: WorkflowPhase.Complete,\n location: LocationContext.Player\n };\n\n const onDismiss = (context: CtaContext) => {\n AnalyticsHelper.logUserAction({\n canUserManageIntegrations,\n context\n }, {\n ...analyticsOptions,\n descriptor: DevicesDescriptor.Dismiss,\n eventVersion: EventVersion.V1\n });\n\n setDismissedModel({ dismissed: true });\n };\n\n const onInstall = (context: CtaContext) => {\n AnalyticsHelper.logUserAction({\n canUserManageIntegrations,\n context\n }, {\n ...analyticsOptions,\n descriptor: DevicesDescriptor.InstallIntegration,\n eventVersion: EventVersion.V1\n });\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.SETTINGS,\n action: Actions.Settings.INTEGRATIONS\n });\n };\n\n const onLearnMore = (context: CtaContext) => {\n AnalyticsHelper.logUserAction({\n canUserManageIntegrations,\n context\n }, {\n ...analyticsOptions,\n descriptor: DevicesDescriptor.LearnMore,\n eventVersion: EventVersion.V1\n });\n\n if (context === 'vivi_and_apple_tv' || context === 'vivi')\n LocationUtils.PageLoad(VIVI_LEARN_MORE_URL, true);\n\n if (context === 'vivi_and_apple_tv' || context === 'apple_tv')\n LocationUtils.PageLoad(APPLE_TV_LEARN_MORE_URL, true);\n };\n\n const onContactSupport = (context: CtaContext) => {\n AnalyticsHelper.logUserAction({\n canUserManageIntegrations,\n context\n }, {\n ...analyticsOptions,\n descriptor: DevicesDescriptor.ContactSupport,\n eventVersion: EventVersion.V1\n });\n\n LocationUtils.PageLoad(ArticleHelper.getSupportRequestUrl(), true);\n };\n\n return {\n hasBeenDismissed: dismissedModel.dismissed || isStudent,\n canUserManageIntegrations,\n onDismiss,\n onInstall,\n onLearnMore,\n onContactSupport\n };\n}\n","// Misc constants\nexport const LiteConstants = {\n VIDEO_START_TIME_CUTOFF: 10, // If the video start time is in the last 10 seconds of the video duration, it's ignored\n PUBLIC_SEARCH_QUERY_DEBOUNCE: 400,\n AUTHENTICATED_SEARCH_QUERY_DEBOUNCE: 200\n};\n","import { Core } from 'libs/common/core';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { SettingsHash } from 'libs/shared/hooks/useSettings';\nimport { Category, Company, Library, Link, PartnerProfile, Person, Resource, Series, Tag, Video } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { LiteConstants } from 'shared/constants/LiteConstants';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { ContentPartnerAppLinkHelper } from 'shared/utils/ContentPartnerAppLinkHelper';\n\nimport { SeriesAppLinkHelper } from 'apps/series/SeriesAppLinkHelper';\n\nexport function 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 const filteredResources = resources.filter(r => {\n if (!isLearner)\n return true;\n\n return r.metadata?.resourceType === 'additional-materials' || r.metadata?.resourceType === 'student-activity';\n });\n\n return [ ...filteredResources, ...links ];\n}\n\nexport const getLibraryAppLink = (library: Library): Core.AppLink => {\n return {\n application: AppChannels.LIBRARIES,\n action: Actions.Libraries.LIBRARY,\n args: [ library.id.toString(), TextHelper.slugify(library.name) ]\n };\n};\n\nexport const getFolderAppLink = (library: Library, folder: Category): Core.AppLink => {\n return {\n application: AppChannels.LIBRARIES,\n action: Actions.Libraries.FOLDER,\n args: [ library.id.toString(), folder.id.toString(), TextHelper.slugify(folder.name) ]\n };\n};\n\ninterface GetAppLinksOptions {\n settings: SettingsHash;\n presentationSlug: string | null;\n}\n\nexport function getAppLinks(options: GetAppLinksOptions) {\n const { settings, presentationSlug } = options;\n\n const getTagAppLink = (tag: Tag) => {\n return {\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n params: { tagOrClassification: tag.name }\n };\n };\n\n const getSeriesAppLink = (series: Series, moviesAndTv: boolean): Core.AppLink => {\n return SeriesAppLinkHelper.getSeriesAppLink(series, moviesAndTv ? { mtv: true } : {}, presentationSlug);\n };\n\n const getResourceAppLink = (videoId: string, shareId: string, canViewResource: boolean) =>\n (resource: Resource | Link) => {\n /**\n * We check both the feature access value and the shareId. \n * Resources should always be available if we have a share id, and the backend should control\n * which specific resources are returned - Sha\n */\n if (!canViewResource && !shareId) {\n return {\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.SIGN_UP\n };\n }\n\n return {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PREVIEW_PDF,\n args: [resource.id],\n params: {\n videoId: videoId,\n shareId: shareId\n }\n };\n };\n\n const getPartnerProfileAppLink = (partnerProfile: PartnerProfile) => {\n return ContentPartnerAppLinkHelper.getPartnerDashboardAppLink(partnerProfile);\n };\n\n const getPartnerDashboardHubAppLink = (company: Company | Person) => {\n return ContentPartnerAppLinkHelper.getPartnerDashboardHubAppLink(company);\n };\n\n return {\n getTagAppLink,\n getSeriesAppLink,\n getResourceAppLink,\n getPartnerProfileAppLink: settings?.hasPartnerProfiles ? getPartnerProfileAppLink : null,\n getPartnerDashboardHubAppLink: settings?.hasPartnerProfiles ? getPartnerDashboardHubAppLink : null,\n getLibraryAppLink,\n getFolderAppLink\n };\n}\n\nexport function getStartTime(startTimeParam: string | number, video: Video): number {\n const startTime = Number(startTimeParam);\n\n if (!isNaN(startTime) && startTime >= 0)\n return startTime;\n\n const lastProgressPoint = VideoHelper.getVideoProgress(video);\n\n if (!lastProgressPoint)\n return 0;\n\n if (lastProgressPoint >= (video.duration / 1000 - LiteConstants.VIDEO_START_TIME_CUTOFF))\n return 0;\n\n return lastProgressPoint;\n}\n\nexport function getEndTime(endTimeParam: string | number): number | undefined {\n if (Number.isInteger(+endTimeParam))\n return +endTimeParam;\n\n return undefined;\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { EmbedPlaceHolderHelper } from 'apps/embed/utils/EmbedPlaceholderHelper';\n\nimport styles from './stream-limit-overlay.module.scss';\n\nconst namespace = 'shared.streamLimitOverlay';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface StreamLimitOverlayProps {\n posterUrl: string;\n embed: boolean;\n hasStudentExperience: boolean;\n canRedeemMoreReferrals: boolean;\n totalStreamsAvailable: number;\n}\n\nexport function StreamLimitOverlay(props: StreamLimitOverlayProps): JSX.Element {\n const ctaAction = props.canRedeemMoreReferrals ?\n Actions.SignUp.INVITE_COLLEAGUE :\n Actions.SignUp.UPGRADE;\n\n const ctaPhrase = props.canRedeemMoreReferrals ? 'inviteCta' : 'upgradeCta';\n const hideCta = props.embed || props.hasStudentExperience;\n\n let descriptionPhrase: string;\n\n if (hideCta)\n descriptionPhrase = 'basicDescription';\n else if (props.canRedeemMoreReferrals)\n descriptionPhrase = 'referralDescription';\n else\n descriptionPhrase = 'upgradeDescription';\n\n /**\n * Embeds render a server-side splash screen (#embed-placeholder) that covers\n * the React app until the player fires 'cv-playback-data-loaded'. Since the\n * overlay replaces the player, that event never fires — so we need to \n * remove it manually.\n */\n React.useEffect(() => {\n if (props.embed)\n EmbedPlaceHolderHelper.remove();\n }, [props.embed]);\n\n return (\n <div className={`position-relative bg-light overflow-hidden ${props.embed ? 'position-fixed top-0 start-0 end-0 bottom-0' : 'ratio ratio-16x9'}`}>\n {props.posterUrl && (\n <img className={`position-absolute top-0 start-0 w-100 h-100 object-fit-cover ${styles.poster}`} src={props.posterUrl} alt='' />\n )}\n <div className={`position-absolute top-0 start-0 w-100 h-100 ${styles.frost}`} />\n <div className='position-absolute top-0 start-0 w-100 h-100 d-flex flex-column align-items-center justify-content-center text-center p-4'>\n <img\n className={`${styles.image} d-none d-md-block mb-3`}\n src={ImageUrls.SignUp.INVITE_COLLEAGUE}\n alt={getPhrase('heading')}\n />\n <h2 className='h5 mb-2'><Text namespace={namespace} phrase='heading' options={{ smartCount: props.totalStreamsAvailable }} /></h2>\n <p className='text-dark mb-3'>{getPhrase(descriptionPhrase)}</p>\n {!hideCta && (\n <AppLink\n className='btn btn-dark'\n appLink={{ application: AppChannels.SIGN_UP, action: ctaAction }}\n >\n {getPhrase(ctaPhrase)}\n </AppLink>\n )}\n </div>\n </div>\n );\n}\n","import React from 'react';\n\nconst UP_ARROW = 38;\nconst DOWN_ARROW = 40;\n\n/**\n * When this hook is used on a page, it will prevent the page from being scrollable by using\n * the up/down arrow keys.\n * \n * This is helpful on pages with a video playing, as we want the up/down arrow keys to control the\n * player volume without scrolling.\n */\nexport const usePreventKeyboardScroll = () => {\n function preventDefaultForScrollKeys(e: KeyboardEvent): boolean {\n if (e.keyCode === UP_ARROW || e.keyCode === DOWN_ARROW) {\n e.preventDefault();\n return false;\n }\n }\n\n React.useEffect(() => {\n window.addEventListener('keydown', preventDefaultForScrollKeys, false);\n\n return () => {\n window.removeEventListener('keydown', preventDefaultForScrollKeys, false);\n };\n }, []);\n};\n","import { Flight } from 'libs/common/flight';\n\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { RelatedVideosContext } from 'libs/shared/enums/RelatedVideosContext';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { CurrentUser, VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { useVideoFeatureAccess } from './useVideoFeatureAccess';\n\n/**\n * Poor mans paging explination:\n * \n * This change was made while we were doing performance imrovements in Feb 2024.\n * Because the related videos endpoint does not have paging, we fetch 6 to display 5 videos\n * this will let us know if there is another page. When the user requests the next page\n * we just fetch 25 items.\n * \n * - sHa\n */\nconst RELATED_VIDEOS_FIRST_PAGE = 6;\nconst RELATED_VIDEOS_MAX = 25;\n\nexport interface RelatedVideosHash {\n videos: VideoTypes[];\n hasError: boolean;\n hasCompleted: boolean;\n isFetching: boolean;\n fetchNext: () => void;\n hasMore: boolean;\n}\n\ninterface RelatedVideoOptions {\n video: VideoTypes;\n currentUser: CurrentUser;\n context: RelatedVideosContext;\n contextId: string;\n moviesAndTv: boolean;\n}\n\nexport function useGetRelatedVideos(options: RelatedVideoOptions): RelatedVideosHash {\n const { video, currentUser, moviesAndTv, context, contextId } = options;\n\n const { canViewRelatedVideos } = useVideoFeatureAccess();\n\n const { hasProduct } = useProducts();\n\n const fetch = Flight.useGetFetch();\n\n function getRequest(limit: number): Flight.Request {\n if (!video || !currentUser?.isAuthenticated || !hasProduct(ProductId.Primary) || !canViewRelatedVideos)\n return null;\n\n /**\n * We are no longer fetching related videos unless we have a context\n */\n if (!context && !contextId)\n return null;\n\n return VideoRequests.relatedVideos({\n videoId: video.id,\n context,\n collectionId: contextId,\n moviesAndTv,\n limit\n });\n }\n\n function filterVideos(videos: VideoTypes[]): VideoTypes[] {\n if (!videos) // Might be undefined or null\n return videos;\n\n if (hasMore)\n videos = videos.slice(0, RELATED_VIDEOS_FIRST_PAGE - 1);\n\n return videos.filter(v => VideoHelper.getCanBeConsumed(v)?.canNavigate);\n }\n\n function fetchNext() {\n fetch(getRequest(RELATED_VIDEOS_MAX));\n }\n\n const response = Flight.useBasicFetch<VideoTypes[]>(getRequest(RELATED_VIDEOS_FIRST_PAGE));\n\n const hasMore = response.data?.length === RELATED_VIDEOS_FIRST_PAGE;\n\n return {\n videos: filterVideos(response.data),\n hasCompleted: response.hasCompleted,\n isFetching: response.isFetching,\n hasError: response.hasError,\n hasMore,\n fetchNext\n };\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { PlayerMode } from 'libs/shared/context/player-context/interfaces/PlayerMode';\nimport { PlayerReference } from 'libs/shared/context/player-context/interfaces/PlayerReference';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { MediaIdType } from 'libs/shared/enums/MediaIdType';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { RelatedVideosContext } from 'libs/shared/enums/RelatedVideosContext';\nimport { ShareActivityStatus } from 'libs/shared/enums/ShareActivityStatus';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { FavouriteRequests } from 'libs/shared/flight-requests/FavouriteRequests';\nimport { PlayerRequests } from 'libs/shared/flight-requests/PlayerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useActivityStatus } from 'libs/shared/hooks/UseActivityStatus';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { Config, CurrentUser, PlayerViewKey, ShareLink, UnionShareObject, VideoTypes } from 'libs/shared/interfaces';\nimport { FavouriteHelper } from 'libs/shared/utils/FavouriteHelpers';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { useFetchPointsOfInterest } from 'shared/hooks/useFetchPointsOfInterest';\nimport { useGetRelatedVideos } from 'shared/hooks/useGetRelatedVideos';\nimport { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\nimport { usePlayerIntegrations } from 'shared/hooks/usePlayerIntegrations';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nconst THUMBNAIL_SIZE = ImageSize.Medium;\n\nfunction createViewKeyRequest(\n objectId: string,\n shareId: string,\n shareLink: ShareLink\n): Flight.Request {\n if (!shareId)\n return PlayerRequests.createViewKey(objectId, MediaIdType.MasterObject);\n\n if (!shareLink)\n return null;\n\n /**\n * If our share link matches our object id it's just a video share\n */\n if (shareLink.objectId === objectId)\n return PlayerRequests.createViewKey(shareId, MediaIdType.Share);\n\n /**\n * Otherwise we're attempting to watch a video inside of a shared video collection (e.g. A shared playlist)\n */\n return PlayerRequests.createViewKey(objectId, MediaIdType.MasterObject, shareId);\n}\n\ninterface UseGetPlayerDataOptions {\n objectId: string;\n objectTypeId: MasterType;\n shareId: string;\n context: RelatedVideosContext;\n contextId: string;\n moviesAndTv: boolean;\n}\n\nexport function useGetPlayerData(options: UseGetPlayerDataOptions) {\n const { objectId, objectTypeId, shareId, context, contextId, moviesAndTv } = options;\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const video = Flight.useBasicFetch<VideoTypes>(\n objectId && VideoHelper.getVideoRequest(objectId, objectTypeId, shareId)\n );\n const shareLink = Flight.useBasicFetch<ShareLink>(shareId && ShareRequests.getShareObject(shareId));\n const canHavePointsOfInterest = objectTypeId === MasterType.Video || objectTypeId === MasterType.Clip;\n const pointsOfInterest = useFetchPointsOfInterest(canHavePointsOfInterest && objectId);\n const viewKey = Flight.useBasicFetch<PlayerViewKey>(\n objectId && createViewKeyRequest(objectId, shareId, shareLink.data)\n );\n const relatedVideos = useGetRelatedVideos({\n video: video.data,\n context,\n contextId,\n moviesAndTv,\n currentUser: currentUser.data\n });\n const playerIntegrations = usePlayerIntegrations(objectId);\n \n /**\n * Mix in if our video is favourited\n */\n Flight.useBasicFetch(\n objectId &&\n currentUser.data?.isAuthenticated &&\n FavouriteRequests.isFavourited(currentUser.data.id, [objectId])\n );\n\n const hasCompleted = (\n video.data &&\n config.hasCompleted &&\n currentUser.hasCompleted &&\n (!shareId || shareLink.hasCompleted) &&\n (objectTypeId !== MasterType.Video || pointsOfInterest.hasCompleted) &&\n viewKey.hasCompleted &&\n playerIntegrations.hasCompleted\n );\n\n return {\n hasCompleted,\n config: config.data,\n currentUser: currentUser.data,\n video: video.data,\n shareLink: shareLink.data,\n pointsOfInterest: pointsOfInterest?.items,\n viewKey: viewKey.data,\n relatedVideos: relatedVideos.videos,\n playerIntegrations: playerIntegrations.data\n };\n}\n\nexport function useSetFavourite(player: PlayerReference, video: VideoTypes) {\n const { setFavourite, canFavourite } = useLiteFavourites(LocationContext.Player);\n const isFavourited = FavouriteHelper.isFavouritedByCurrentUser(video);\n const isArchived = VideoHelper.isVideoTypeArchived(video);\n\n React.useEffect(() => {\n if (!player || !video || !canFavourite(video) || isArchived)\n return;\n\n player.setFavourite?.(isFavourited, (setFav: boolean) => setFavourite(video, setFav));\n }, [ video, player, canFavourite, isArchived ]);\n}\n\nexport function useSetActivityStatus(\n player: PlayerReference,\n video: VideoTypes,\n shareLink: UnionShareObject\n) {\n // Disabling activity status for performance reasons (28/2/24) - Sha\n return;\n\n const setActivityStatus = useActivityStatus(LocationContext.FloatingPlayer);\n const { hasPermissions } = usePermissions();\n\n React.useEffect(() => {\n if (!player || !video || !shareLink)\n return;\n\n if (!hasPermissions(PermissionName.StudentExperience) || !('activityStatus' in shareLink))\n return;\n\n player.setActivityStatus?.(shareLink.activityStatus, () => {\n const newStatus = shareLink.activityStatus === ShareActivityStatus.Complete ?\n ShareActivityStatus.Incomplete :\n ShareActivityStatus.Complete;\n\n setActivityStatus(shareLink.id, video, newStatus);\n });\n }, [ player, video, shareLink ]);\n}\n\nexport function useCreateClip(\n playerRef: React.MutableRefObject<PlayerReference>,\n currentUser: CurrentUser,\n video: VideoTypes,\n embed: boolean,\n allowCreateClip: boolean\n) {\n const { hasProduct } = useProducts();\n const isArchived = VideoHelper.isVideoTypeArchived(video);\n\n const canCreateClip = (\n currentUser.isAuthenticated &&\n VideoHelper.isVideo(video) &&\n video._canCreateChild?.value &&\n hasProduct(ProductId.Primary) &&\n !embed &&\n allowCreateClip &&\n !isArchived\n ) ;\n\n if (!canCreateClip)\n return undefined;\n \n function onClickCreateClip(): void {\n if (!canCreateClip)\n return;\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.CLIPS,\n action: Actions.Clips.CREATE_CLIP,\n args: [video.id],\n params: {\n startTime: playerRef.current?.currentTime?.() ?? undefined\n }\n });\n }\n\n return onClickCreateClip;\n}\n\nexport function usePip(\n currentUser: CurrentUser,\n onRequestPictureInPicture: (isPip: boolean) => void\n) {\n const { hasProduct } = useProducts();\n\n return (\n currentUser.isAuthenticated &&\n hasProduct(ProductId.Primary) &&\n onRequestPictureInPicture\n );\n}\n\ninterface UseSetNextVideoOptions {\n player: PlayerReference;\n relatedVideos: VideoTypes[];\n shareId: string;\n context: RelatedVideosContext;\n contextId: string;\n moviesAndTv: boolean;\n playNext: boolean;\n mode: PlayerMode;\n isAuthenticated: boolean;\n presentationSlug: string | null;\n}\n\nexport function useSetNextVideo(options: UseSetNextVideoOptions): void {\n const {\n player,\n relatedVideos,\n shareId,\n context,\n contextId,\n moviesAndTv,\n playNext,\n mode,\n isAuthenticated,\n presentationSlug\n } = options;\n\n const first = relatedVideos?.[0];\n\n React.useEffect(() => {\n if (!player?.setNextVideo || !first)\n return;\n\n /**\n * We only want to go to the next video if the user is on a play page.\n */\n if (mode !== 'default') {\n player.setNextVideo?.(null, false, null);\n return;\n }\n\n const rawThumbanilUrl = VideoHelper.getThumbnail(first)?.url;\n const nextVideo = {\n name: first.name,\n thumbnailUrl: ImageHelper.createUrl(rawThumbanilUrl, { size: THUMBNAIL_SIZE })\n };\n\n player.setNextVideo?.(nextVideo, playNext, () => {\n Core.AppLinkHelper.trigger(VideoAppLinkHelper.getAppLink(first, {\n shareId,\n context,\n contextId,\n playNext,\n moviesAndTv,\n includeContext: isAuthenticated\n }, presentationSlug));\n });\n }, [\n player,\n first,\n shareId,\n context,\n contextId,\n playNext,\n mode\n ]);\n}\n","import React from 'react';\nimport { HtmlPortalNode } from 'react-reverse-portal';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { DefaultDisplayMode } from 'libs/shared/context/player-context/interfaces/PlayerContextAction';\nimport { PlayerMode } from 'libs/shared/context/player-context/interfaces/PlayerMode';\nimport { PlayerReference } from 'libs/shared/context/player-context/interfaces/PlayerReference';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { RelatedVideosContext } from 'libs/shared/enums/RelatedVideosContext';\nimport { useForceUpdate } from 'libs/shared/hooks/useForceUpdate';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, CurrentUser, PlayerIntegrations, PlayerViewKey, PointOfInterest, UnionShareObject, VideoTypes } from 'libs/shared/interfaces';\nimport { AuthToken } from 'libs/shared/interfaces/models/AuthToken';\nimport { PlayerAnalyticsTracker } from 'libs/shared/utils/PlayerAnalyticsTracker';\nimport { ShareHelper } from 'libs/shared/utils/ShareHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport type { PlayerOptions } from 'projects/player/players/player';\nimport type { ExternalLinkOptions } from 'projects/player/plugins/open-externally-plugin/interfaces/ExternalLinkOptions';\n\nimport { getEndTime, getStartTime } from 'shared/components/play-page/PlayPageUtils';\nimport { StreamLimitOverlay } from 'shared/components/stream-limit-overlay/StreamLimitOverlay';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { usePreventKeyboardScroll } from 'shared/hooks/usePreventKeyboardScroll';\nimport { useStreamQuota } from 'shared/hooks/useStreamQuota';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\nimport { useCreateClip, usePip, useSetActivityStatus, useSetFavourite, useSetNextVideo } from 'shared/views/lite-player/LitePlayerViewHooks';\n\nimport styles from './lite-player.module.scss';\n\nfunction shouldCollectResults(props: LitePlayerViewProps): boolean {\n if (!props.shareLink)\n return false;\n\n if (props.currentUser.isAuthenticated)\n return true;\n\n return !!props.collectAnonResults;\n}\n\nfunction getExternalLink(\n video: VideoTypes,\n shareLink: UnionShareObject,\n options: ExternalLinkOptions,\n isAuthenticated: boolean,\n presentationSlug: string | null\n): string {\n if (shareLink) {\n return Core.AppLinkHelper.getHref({\n application: AppChannels.SHARE,\n action: Actions.Share.VIEW_SHARE_LINK,\n args: [shareLink.id],\n params: {\n t: options.currentTime,\n a: true\n }\n });\n }\n\n const appLink = VideoAppLinkHelper.getAppLink(video, { includeContext: isAuthenticated }, presentationSlug);\n if (!appLink.params)\n appLink.params = {};\n\n (appLink.params as HashObject).t = options.currentTime;\n (appLink.params as HashObject).a = true;\n return Core.AppLinkHelper.getHref(appLink);\n}\n\nexport interface LitePlayerViewProps {\n // Core data\n config: Config;\n token?: AuthToken;\n video: VideoTypes;\n currentUser: CurrentUser;\n shareLink?: UnionShareObject;\n pointsOfInterest?: PointOfInterest[];\n viewKey: PlayerViewKey;\n relatedVideos?: VideoTypes[];\n presentationSlug: string | null;\n\n // Hook options\n context?: RelatedVideosContext;\n contextId?: string;\n moviesAndTv?: boolean;\n playNext?: boolean;\n mode?: PlayerMode;\n defaultDisplayMode?: DefaultDisplayMode;\n\n allowCreateClip?: boolean;\n allowTheatreMode?: boolean;\n allowTranscript?: boolean;\n\n // Passthrough options\n autoplay?: boolean;\n startTime?: string;\n endTime?: string;\n embed?: boolean;\n showResources?: boolean;\n muted?: boolean;\n\n // Interactive\n summaryPortalNode?: HtmlPortalNode;\n questionListPortalNode?: HtmlPortalNode;\n onShowSummary?: (showing: boolean) => void;\n collectAnonResults?: boolean;\n\n // Devices\n playerIntegrations?: PlayerIntegrations;\n\n onReady?: (player: PlayerReference) => void;\n onRequestPictureInPicture?: (isPip: boolean) => void;\n onRequestTheatreMode?: (isTheatreMode: boolean) => void;\n}\n\n/**\n * Consumers of this view need to opt out of these features.\n */\nLitePlayerView.defaultProps = {\n allowCreateClip: true\n};\n\n// eslint-disable-next-line rulesdir/require-view-title\nexport function LitePlayerView(props: LitePlayerViewProps): JSX.Element {\n const playerRef = React.useRef<PlayerReference>(null);\n const analyticsTracker = React.useRef<PlayerAnalyticsTracker>(null);\n\n useSetFavourite(playerRef.current, props.video);\n useSetActivityStatus(playerRef.current, props.video, props.shareLink);\n useSetNextVideo({\n player: playerRef.current,\n relatedVideos: props.relatedVideos,\n shareId: props.shareLink?.id,\n context: props.context,\n contextId: props.contextId,\n moviesAndTv: props.moviesAndTv,\n playNext: props.playNext,\n mode: props.mode,\n isAuthenticated: props.currentUser?.isAuthenticated,\n presentationSlug: props.presentationSlug\n });\n usePreventKeyboardScroll();\n \n const allowPip = usePip(props.currentUser, props.onRequestPictureInPicture);\n\n const { experimentalInteractiveQuestions } = useSettings(null);\n const {\n isLoaded: streamQuotaLoaded,\n hasReachedStreamLimit,\n canRedeemMoreReferrals,\n totalStreamsAvailable\n } = useStreamQuota();\n\n const { hasPermissions } = usePermissions();\n\n const isGuest = hasPermissions(PermissionName.GuestExperience);\n const hasStudentExperience = hasPermissions(PermissionName.StudentExperience);\n\n const onClickCreateClip = useCreateClip(\n playerRef,\n props.currentUser,\n props.video,\n props.embed,\n isGuest ? false : props.allowCreateClip\n );\n\n const forceUpdate = useForceUpdate();\n\n function onReady(player: PlayerReference): void {\n playerRef.current = player;\n forceUpdate();\n props.onReady && props.onReady(player);\n setupAnalytics(player);\n }\n\n function setupAnalytics(player: PlayerReference): void {\n analyticsTracker.current = new PlayerAnalyticsTracker({\n player,\n video: props.video,\n analyticsLocation: props.embed ?\n LocationContext.EmbeddedPlayer :\n LocationContext.PlayPage,\n shareId: props.shareLink?.id\n });\n }\n\n let posterUrl = '';\n if ('thumbnail' in props.video)\n posterUrl = props.video.thumbnail?.url;\n if (!posterUrl && '_parentVideo' in props.video)\n posterUrl = props.video._parentVideo?.thumbnail?.url;\n\n const commonProps: PlayerOptions = {\n // Fetched\n viewKey: props.viewKey.viewKey,\n playerApi: new URL(props.config.playerApiUrl),\n imageCdnUrl: props.config.imageCdnUrl,\n\n // Options\n autoplay: props.autoplay,\n startTime: getStartTime(props.startTime, props.video),\n endTime: getEndTime(props.endTime),\n embed: props.embed,\n showResources: props.showResources,\n getExternalLink: props.embed &&\n (options => getExternalLink(\n props.video,\n props.shareLink,\n options,\n props.currentUser?.isAuthenticated,\n props.presentationSlug\n )),\n muted: props.muted,\n splash: props.embed ? {\n title: props.video.name,\n posterUrl,\n ratingCode: VideoHelper.getRating(props.video)?.code,\n ratingValue: VideoHelper.getRating(props.video)?.value,\n seriesName: 'series' in props.video && props.video.series?.name,\n seasonNumber: 'season' in props.video && props.video.season?.number,\n episodeNumber: 'episodeNumber' in props.video && props.video.episodeNumber\n } : undefined,\n // todo remove this once we ship theatre mode for everyone\n allowTheatreMode: props.allowTheatreMode,\n allowLoop: true,\n\n // Static\n hotkeyElQuerySelector: 'body',\n sharerInstanceRegion: props.shareLink?.ownerInstanceRegion\n };\n\n const devicesConfig = props.playerIntegrations ? {\n ...props.playerIntegrations,\n trackingCode: VideoHelper.getTrackingCode(props.video)\n } : undefined;\n\n const isTheatreMode = props.mode === 'default' && props.defaultDisplayMode === 'theatre';\n const isHoverMode = props.mode === 'hover';\n const isInteractive = props.video.typeId === MasterType.Interactive;\n const isPublicShare = ShareHelper.isPublic(props.shareLink);\n const showStreamLimitOverlay = streamQuotaLoaded && hasReachedStreamLimit && !isHoverMode && !isPublicShare;\n\n /**\n * We memoize two React.lazy components (interactive and standard) to avoid Suspense flicker on re-renders.\n * Hooks can't be conditional, so both lazies are created once and we choose which to render at runtime.\n * With default exports, React.lazy infers props, so no casting is required. - Sha\n */\n const InteractivePlayer = React.useMemo(() => React.lazy(() => import('projects/player/react/InteractivePlayer')), []);\n const Player = React.useMemo(() => React.lazy(() => import('projects/player/react/Player')), []);\n \n if (showStreamLimitOverlay) {\n return (\n <StreamLimitOverlay\n posterUrl={posterUrl}\n embed={props.embed}\n hasStudentExperience={hasStudentExperience}\n canRedeemMoreReferrals={canRedeemMoreReferrals}\n totalStreamsAvailable={totalStreamsAvailable}\n />\n );\n }\n\n if (isInteractive) {\n return (\n <React.Suspense fallback={<div className={styles.placeholder} />}>\n <InteractivePlayer\n {...commonProps}\n imageApi={new URL(props.config.imageCdnUrl)}\n currentUser={props.currentUser}\n collectResults={shouldCollectResults(props)}\n shareId={props.shareLink?.id}\n enableImmersiveReader\n summaryPortalNode={props.summaryPortalNode}\n onShowSummary={props.onShowSummary}\n onReady={onReady}\n className={props.embed ? styles.embeddedPlayer : ''}\n furthestVisitedTime={props.video._videoProgress?.furthest}\n questionListPortalNode={props.questionListPortalNode}\n authToken={props.token?.value}\n experimentalInteractiveQuestions={experimentalInteractiveQuestions}\n />\n </React.Suspense>\n );\n }\n\n function getClassName(): string {\n if (props.embed) {\n return styles.embeddedPlayer;\n }\n if (isTheatreMode)\n return 'w-100 h-100';\n return '';\n }\n\n return (\n <React.Suspense fallback={<div className={`${styles.placeholder} ${isTheatreMode ? styles.theatreMode : ''}`} />}>\n <Player\n {...commonProps}\n devicesConfig={devicesConfig}\n className={getClassName()}\n onClickCreateClip={onClickCreateClip}\n pointsOfInterest={props.pointsOfInterest}\n onReady={onReady}\n showResources={props.embed}\n onRequestPictureInPicture={allowPip && props.onRequestPictureInPicture}\n onRequestTheatreMode={props.onRequestTheatreMode}\n theatreMode={isTheatreMode}\n nextDefaultDisplayMode={props.defaultDisplayMode}\n allowTranscript={props.allowTranscript}\n />\n </React.Suspense>\n );\n}\n"],"file":"_Cm5O72d.chunk.js"}