@clickview/lite 0.104.0-rc.7 → 0.104.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.vite/manifest.json +575 -575
- package/dist/bundles.json +1 -1
- package/dist/en.json +1 -1
- package/dist/scripts/{Dnz8CbEu.chunk.js → -QIG2ZHc.chunk.js} +3 -3
- package/dist/scripts/{Dnz8CbEu.chunk.js.map → -QIG2ZHc.chunk.js.map} +1 -1
- package/dist/scripts/{CX6c7KRp2.chunk.js → 0mx04bmJ2.chunk.js} +2 -2
- package/dist/scripts/{CX6c7KRp2.chunk.js.map → 0mx04bmJ2.chunk.js.map} +1 -1
- package/dist/scripts/{CMHxOVI7.chunk.js → 41LJfkjO.chunk.js} +2 -2
- package/dist/scripts/{CMHxOVI7.chunk.js.map → 41LJfkjO.chunk.js.map} +1 -1
- package/dist/scripts/{BBWnpWNB2.chunk.js → 7uvJMXC12.chunk.js} +2 -2
- package/dist/scripts/{BBWnpWNB2.chunk.js.map → 7uvJMXC12.chunk.js.map} +1 -1
- package/dist/scripts/{CaCm4N_d2.chunk.js → B-HfRX562.chunk.js} +2 -2
- package/dist/scripts/{CaCm4N_d2.chunk.js.map → B-HfRX562.chunk.js.map} +1 -1
- package/dist/scripts/{DSPMbDdF.chunk.js → B3_lC6bW.chunk.js} +2 -2
- package/dist/scripts/{DSPMbDdF.chunk.js.map → B3_lC6bW.chunk.js.map} +1 -1
- package/dist/scripts/{0Fek4oFk.chunk.js → BLE8DLAY.chunk.js} +2 -2
- package/dist/scripts/{0Fek4oFk.chunk.js.map → BLE8DLAY.chunk.js.map} +1 -1
- package/dist/scripts/{B338pwKt2.chunk.js → BRt-Kdnn2.chunk.js} +2 -2
- package/dist/scripts/{B338pwKt2.chunk.js.map → BRt-Kdnn2.chunk.js.map} +1 -1
- package/dist/scripts/{D3ncynN72.chunk.js → BVBpDZoT2.chunk.js} +3 -3
- package/dist/scripts/{D3ncynN72.chunk.js.map → BVBpDZoT2.chunk.js.map} +1 -1
- package/dist/scripts/{5PKjjI4Y.chunk.js → BapoiGsj.chunk.js} +2 -2
- package/dist/scripts/{5PKjjI4Y.chunk.js.map → BapoiGsj.chunk.js.map} +1 -1
- package/dist/scripts/{CNfmLVE82.chunk.js → Bc1JT5Y-2.chunk.js} +2 -2
- package/dist/scripts/{CNfmLVE82.chunk.js.map → Bc1JT5Y-2.chunk.js.map} +1 -1
- package/dist/scripts/{cDv6zuhh.chunk.js → BhE5KhcC.chunk.js} +2 -2
- package/dist/scripts/{cDv6zuhh.chunk.js.map → BhE5KhcC.chunk.js.map} +1 -1
- package/dist/scripts/{Bzk4AwVx2.chunk.js → BncgzKKQ2.chunk.js} +2 -2
- package/dist/scripts/{Bzk4AwVx2.chunk.js.map → BncgzKKQ2.chunk.js.map} +1 -1
- package/dist/scripts/BwBWuxjr2.chunk.js +2 -0
- package/dist/scripts/{B1hsuVfV2.chunk.js.map → BwBWuxjr2.chunk.js.map} +1 -1
- package/dist/scripts/{B1TqilLB.chunk.js → C6z8ii6C.chunk.js} +2 -2
- package/dist/scripts/{B1TqilLB.chunk.js.map → C6z8ii6C.chunk.js.map} +1 -1
- package/dist/scripts/{fMgBORUX.chunk.js → C8x-QH43.chunk.js} +2 -2
- package/dist/scripts/{fMgBORUX.chunk.js.map → C8x-QH43.chunk.js.map} +1 -1
- package/dist/scripts/{BiWUSyJr.chunk.js → CAkqvKfy.chunk.js} +2 -2
- package/dist/scripts/{BiWUSyJr.chunk.js.map → CAkqvKfy.chunk.js.map} +1 -1
- package/dist/scripts/{D-iyHqNw2.chunk.js → CLvImDXv2.chunk.js} +3 -3
- package/dist/scripts/{D-iyHqNw2.chunk.js.map → CLvImDXv2.chunk.js.map} +1 -1
- package/dist/scripts/{Cqq1N9xw.chunk.js → CM8248d7.chunk.js} +2 -2
- package/dist/scripts/{Cqq1N9xw.chunk.js.map → CM8248d7.chunk.js.map} +1 -1
- package/dist/scripts/{B_TE5XUR2.chunk.js → CvilnM0u2.chunk.js} +2 -2
- package/dist/scripts/{B_TE5XUR2.chunk.js.map → CvilnM0u2.chunk.js.map} +1 -1
- package/dist/scripts/{AEOAlemi.chunk.js → Cwocc8uV.chunk.js} +2 -2
- package/dist/scripts/{AEOAlemi.chunk.js.map → Cwocc8uV.chunk.js.map} +1 -1
- package/dist/scripts/{Bld7iWR52.chunk.js → D-pn0sNx2.chunk.js} +2 -2
- package/dist/scripts/{Bld7iWR52.chunk.js.map → D-pn0sNx2.chunk.js.map} +1 -1
- package/dist/scripts/{Cyit3dMk.chunk.js → D78QEASE.chunk.js} +2 -2
- package/dist/scripts/{Cyit3dMk.chunk.js.map → D78QEASE.chunk.js.map} +1 -1
- package/dist/scripts/{Dtag-27K.chunk.js → DER8311r.chunk.js} +2 -2
- package/dist/scripts/{Dtag-27K.chunk.js.map → DER8311r.chunk.js.map} +1 -1
- package/dist/scripts/{CmnbQiBA.chunk.js → DSZaceCq.chunk.js} +2 -2
- package/dist/scripts/{CmnbQiBA.chunk.js.map → DSZaceCq.chunk.js.map} +1 -1
- package/dist/scripts/{CfNYFxJl2.chunk.js → D_1m0b_a2.chunk.js} +2 -2
- package/dist/scripts/{CfNYFxJl2.chunk.js.map → D_1m0b_a2.chunk.js.map} +1 -1
- package/dist/scripts/{-KvTbeQV.chunk.js → DhcRnxkp.chunk.js} +2 -2
- package/dist/scripts/{-KvTbeQV.chunk.js.map → DhcRnxkp.chunk.js.map} +1 -1
- package/dist/scripts/{qRLSbnEr.chunk.js → DhdM2yGm.chunk.js} +2 -2
- package/dist/scripts/{qRLSbnEr.chunk.js.map → DhdM2yGm.chunk.js.map} +1 -1
- package/dist/scripts/{DKDWcWxk.chunk.js → Dqn0sInF.chunk.js} +2 -2
- package/dist/scripts/{DKDWcWxk.chunk.js.map → Dqn0sInF.chunk.js.map} +1 -1
- package/dist/scripts/{CAs2Sere2.chunk.js → MW7W80HY2.chunk.js} +2 -2
- package/dist/scripts/{CAs2Sere2.chunk.js.map → MW7W80HY2.chunk.js.map} +1 -1
- package/dist/scripts/{CwFYdvvA.chunk.js → Okf3Hn0s.chunk.js} +2 -2
- package/dist/scripts/{CwFYdvvA.chunk.js.map → Okf3Hn0s.chunk.js.map} +1 -1
- package/dist/scripts/{Dt5731Ay.chunk.js → _lqYS5Jx.chunk.js} +2 -2
- package/dist/scripts/{Dt5731Ay.chunk.js.map → _lqYS5Jx.chunk.js.map} +1 -1
- package/dist/scripts/{app-CyGIKC-k.js → app-H3wSQ-PR.js} +4 -4
- package/dist/scripts/{app-CyGIKC-k.js.map → app-H3wSQ-PR.js.map} +1 -1
- package/dist/scripts/{B3AhKFfz.chunk.js → ftYw2FVB.chunk.js} +2 -2
- package/dist/scripts/{B3AhKFfz.chunk.js.map → ftYw2FVB.chunk.js.map} +1 -1
- package/dist/scripts/{DyE6EUDb.chunk.js → kjRiUKIL.chunk.js} +2 -2
- package/dist/scripts/{DyE6EUDb.chunk.js.map → kjRiUKIL.chunk.js.map} +1 -1
- package/dist/scripts/{B3y60nT5.chunk.js → pDWQ8Uj5.chunk.js} +2 -2
- package/dist/scripts/{B3y60nT5.chunk.js.map → pDWQ8Uj5.chunk.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/B1hsuVfV2.chunk.js +0 -2
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["scripts/
|
|
2
|
-
import{o as e}from"./DAXXjFlN.chunk.js";import{x as t,y as n}from"./BftnFbcr.chunk.js";import"./DFZS3Ffo.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"./DGmmTRu72.chunk.js";import{t as x}from"./CVHQXNzi2.chunk.js";import{t as S}from"./BrbeV-Gn2.chunk.js";import{t as C}from"./LoQS6GjP.chunk.js";import{t as w}from"./CZgWQFsJ.chunk.js";import{t as T}from"./CqrjHjAN.chunk.js";import{t as E}from"./eoAypzU3.chunk.js";import{t as D}from"./D_gWf2lC.chunk.js";import{t as O}from"./_GCZ-60i.chunk.js";import{t as k}from"./DruDe9vI.chunk.js";import{t as A}from"./7-GJWRH82.chunk.js";import{t as j}from"./dLd5d3X22.chunk.js";import{n as M}from"./BRcHS92O2.chunk.js";import{t as ee}from"./Bs2PKr1I2.chunk.js";import{t as N}from"./QCFxJYkI2.chunk.js";import{t as te}from"./e_p5kSFR2.chunk.js";import{t as ne}from"./CduNFx13.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"./B3gsVN-_.chunk.js";import{t as oe}from"./BDif2ytg2.chunk.js";import{t as L}from"./CbzENe5-2.chunk.js";import{t as R}from"./Dfw0sxVt2.chunk.js";import{t as se}from"./rVRhgtHY2.chunk.js";import{t as ce}from"./6UdHSMo02.chunk.js";import{t as le}from"./BSYDOevb2.chunk.js";import{t as z}from"./BugRosaL2.chunk.js";import{t as ue}from"./DYDxLHiV2.chunk.js";import{n as de}from"./CpFtf-tI2.chunk.js";import{t as fe}from"./BTd65Rcb2.chunk.js";import{t as pe}from"./D6vGqwTy2.chunk.js";import{t as B}from"./DBkEQkKm2.chunk.js";import{t as me}from"./dkL70h2W2.chunk.js";import{n as he,t as ge}from"./Bmh0Fxsl2.chunk.js";import"./BUDCkU2S2.chunk.js";import{t as _e}from"./C1loT8MD2.chunk.js";var V=e(o()),H=s();function U(e,t){let n=u(),{hasPermissions:i}=I(),a=(p(T.currentUser()).data?.isAuthenticated||t)&&i(r.ViewVideoPointsOfInterest);function o(t){return C.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}=b(null),{hasProduct:o,isLoadingProducts:s}=R(),{hasPermissions:c,isLoaded:l}=I(),{fetchViviAccessToken:u,fetchAppleTvAccessToken:d}=ve(),f=p(T.currentUser()),m=p(D.config()),h=xe(c),g=f.data?.isAuthenticated??!1,_=!c(r.StudentExperience),v=!c(r.GuestExperience),y=o(N.Primary),x=g&&y&&(_||i)&&v,S=g&&y&&_&&v,C=x&&t,w=p(e&&C&&L.getViviIntegrationStatus()),E=w.data===oe.Connected,O=!C||w.hasCompleted;return{hasCompleted:!g||f.hasCompleted&&m.hasCompleted&&O&&l&&!a&&!s,data:{ctaOptions:h,canUserCastToDevices:x||S,vivi:{accountConnected:E,enabled:x&&t,apiUrl:m.data?.viviApiUrl??``,fetchAccessToken:u},appleTv:{enabled:S&&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=S.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:C.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=>S.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(T.currentUser()),l=p(t&&S.getVideoRequest(t,n,r)),u=p(r&&k.getShareObject(r)),d=U((n===x.Video||n===x.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!==x.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=S.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=S.isVideoTypeArchived(r),l=t.isAuthenticated&&S.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=S.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}=b(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:S.getRating(e.video)?.code,ratingValue:S.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},C=e.playerIntegrations?{...e.playerIntegrations,trackingCode:S.getTrackingCode(e.video)}:void 0,T=e.mode==="default"&&e.defaultDisplayMode===`theatre`,E=e.mode===`hover`,D=e.video.typeId===x.Interactive,O=le.isPublic(e.shareLink),k=o&&s&&!E&&!O,A=V.useMemo(()=>V.lazy(()=>w(()=>import(`./CAs2Sere2.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,177,178,179]))),[]),j=V.useMemo(()=>V.lazy(()=>w(()=>import(`./BiWUSyJr.chunk.js`),__vite__mapDeps([180,1,14,7,15,16,4,5,19,181,2,3,6,8,9,10,11,12,13,132,43,17,34,44,45,182,124,80,183,184,140,185,120,186,48,24,33,187,188,189,99,190,191,114,27,88,31,87,89,90,91,192,193,194,195,108,109,110,26,111,112,113,25,35,36,37,38,39,40,42,46,47,49,50,51,115,116,117,86,118,119,121,122,123,18,70,55,56,125,126,127,128,73,129,130,131,81,133,134,135,136,137,138,139,41,141,142,143,144,145,146,147,148,149,150,151,152,155,156,157,158,178,196,197,198,77,78,79,76,59,60,61,62,63,64,65,66,67,68,69,71,72,74,75,199,200,201]))),[]);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:T?`w-100 h-100`:``}return(0,H.jsx)(V.Suspense,{fallback:(0,H.jsx)(`div`,{className:`${$.placeholder} ${T?$.theatreMode:``}`}),children:(0,H.jsx)(j,{...y,devicesConfig:C,className:M(),onClickCreateClip:p,pointsOfInterest:e.pointsOfInterest,onReady:h,showResources:e.embed,onRequestPictureInPicture:i&&e.onRequestPictureInPicture,onRequestTheatreMode:e.onRequestTheatreMode,theatreMode:T,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=
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["scripts/MW7W80HY2.chunk.js","scripts/DAXXjFlN.chunk.js","scripts/snXCXfT6.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/Dr3Lux2e.chunk.js","scripts/wdQVW3s5.chunk.js","scripts/BGGL8m_U.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/DFZS3Ffo.chunk.js","scripts/C1SLt-ar.chunk.js","scripts/NlCAcBdo.chunk.js","scripts/BzfCWDOl2.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/CaHxeG5Y2.chunk.js","scripts/e_p5kSFR2.chunk.js","scripts/Byg072EM.chunk.js","scripts/DZX1tZ-D2.chunk.js","scripts/QCFxJYkI2.chunk.js","scripts/C0exjRXJ.chunk.js","scripts/Bbp2U9GK.chunk.js","scripts/CYSDN6kj.chunk.js","scripts/CVqxBe99.chunk.js","scripts/CNxJMwxC.chunk.js","scripts/CQRza4Ga.chunk.js","scripts/ByIC_M_8.chunk.js","scripts/Epqx0J1v.chunk.js","scripts/Cy6lZVxk.chunk.js","scripts/BUnh3rN0.chunk.js","scripts/_GCZ-60i.chunk.js","scripts/CduNFx13.chunk.js","css/9awfngRG.chunk.css","css/zFl67mql.chunk.css","scripts/CXnhm0VS2.chunk.js","scripts/CQyJ7YGa.chunk.js","scripts/iZ7EqNA72.chunk.js","scripts/OL3Z6Yp62.chunk.js","scripts/TTO6HcNP.chunk.js","scripts/ClVhjUGI.chunk.js","scripts/11tE0tcu.chunk.js","scripts/E5Pmu4O7.chunk.js","scripts/CKOWgMyj2.chunk.js","scripts/D5yUWL7p2.chunk.js","scripts/BScb3_Xj2.chunk.js","scripts/BxYKQEUG2.chunk.js","scripts/DaT2nTfp.chunk.js","scripts/CDeqAwMc.chunk.js","scripts/ss6ZpC3s.chunk.js","scripts/GvIHspQt.chunk.js","scripts/FFbkHQcg.chunk.js","scripts/ClpxGEGl.chunk.js","scripts/CvNHBl0q.chunk.js","scripts/C-k6FY-f.chunk.js","scripts/BLm6PYXX.chunk.js","scripts/BM2EJL9g.chunk.js","scripts/DqXpeRGy.chunk.js","scripts/CpFtf-tI2.chunk.js","scripts/CCrnRkGN2.chunk.js","scripts/CXVBjdpb.chunk.js","scripts/BruX4yYB.chunk.js","scripts/gl4k7dtw.chunk.js","scripts/CQ0MgG2c.chunk.js","scripts/Dhx_Wqdc.chunk.js","scripts/6ZXIO06e.chunk.js","scripts/DlEtkSBj2.chunk.js","scripts/CnsLb4V9.chunk.js","scripts/C7HU4huj.chunk.js","scripts/BGswYbRT.chunk.js","scripts/D0szf-0g.chunk.js","scripts/9kSpxveW.chunk.js","scripts/C-THHyTP.chunk.js","scripts/DDJBf9pK2.chunk.js","scripts/DUXPuDp72.chunk.js","scripts/BiqmNDlz2.chunk.js","scripts/Bs2PKr1I2.chunk.js","scripts/BlGyXBAH2.chunk.js","scripts/Dc1hYuQ12.chunk.js","css/CuSUr3Gp.chunk.css","scripts/Dp6QHgBL.chunk.js","scripts/ByszCPst.chunk.js","scripts/B44BW79X2.chunk.js","scripts/BU5CGdBX.chunk.js","css/BPdg7JW4.chunk.css","scripts/Z4RlHaVG.chunk.js","scripts/Dg1mFtY2.chunk.js","scripts/BBEIIgZ6.chunk.js","scripts/CHL4nrKG.chunk.js","scripts/CWMwyVGJ2.chunk.js","scripts/QVHuXdWQ2.chunk.js","scripts/Cv139qj0.chunk.js","css/D8a4tOyE.chunk.css","scripts/lPQgHDFT.chunk.js","scripts/XBYhZGTN.chunk.js","scripts/CwYrnhdi.chunk.js","scripts/Dqn0sInF.chunk.js","scripts/c7DC36s9.chunk.js","scripts/BVm7hIyo.chunk.js","scripts/FAs_d-DP.chunk.js","scripts/Bzihudtn.chunk.js","scripts/BFXddaSP.chunk.js","scripts/YjWbDb2Y.chunk.js","scripts/BJUbYu222.chunk.js","scripts/BBDxSGT52.chunk.js","scripts/jAbfamoi.chunk.js","scripts/CdYjo8_g2.chunk.js","scripts/CbOJtYeK.chunk.js","scripts/B3fF5gkg.chunk.js","scripts/CvHvrB-t.chunk.js","scripts/B6bB9two.chunk.js","scripts/BbgQJe-T.chunk.js","scripts/5ONJSThP.chunk.js","scripts/xa4cS6Fq.chunk.js","scripts/DGmmTRu72.chunk.js","scripts/B_BV48Fy.chunk.js","scripts/BX0wDJmp.chunk.js","scripts/CqrjHjAN.chunk.js","scripts/Ky1--4w3.chunk.js","scripts/CZgWQFsJ.chunk.js","scripts/CVHQXNzi2.chunk.js","scripts/B9VCwo3g2.chunk.js","scripts/DsBWAM3I2.chunk.js","scripts/_42F7SIA2.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/CunDpHqX2.chunk.js","css/0ZqRj7up.chunk.css","scripts/B5XaBzZh.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/BLE8DLAY.chunk.js","css/BL4roXAj.chunk.css","scripts/BhE5KhcC.chunk.js","scripts/CM8248d7.chunk.js","scripts/lhZ5v-iN2.chunk.js","css/BU5l8u5C.chunk.css","scripts/B2-VFQV3.chunk.js","scripts/C3q_xvci.chunk.js","scripts/C8ueKMsK2.chunk.js","scripts/D5nbPgu6.chunk.js","scripts/DhwAOJmY2.chunk.js","scripts/B1T2AAyo2.chunk.js","css/CVYThLDD.chunk.css","scripts/DhhslGq9.chunk.js","scripts/DT8J1fGP.chunk.js","scripts/mhXVBlJN2.chunk.js","scripts/DlAOGdRl.chunk.js","scripts/Dl2HqObu.chunk.js","css/FUAcQhsk.chunk.css","css/PJ3nCJ4X.chunk.css","scripts/IqGr9V7u2.chunk.js","css/ChavoTyg.chunk.css","scripts/B-W0xPTa2.chunk.js","scripts/B2JUNqnO2.chunk.js","css/C1-mauxJ.chunk.css","scripts/BiKac8UT2.chunk.js","css/1w6aF2B0.chunk.css","scripts/CAkqvKfy.chunk.js","scripts/Dyy-PWHO.chunk.js","scripts/B2INd6bh.chunk.js","scripts/BRrNQXpU2.chunk.js","css/DVhPtkT7.chunk.css","scripts/D3-wtcxf2.chunk.js","scripts/DEZqrbCm.chunk.js","scripts/Chgge8yX2.chunk.js","scripts/BteVhTv7.chunk.js","scripts/De16zmhB.chunk.js","css/BgzV9aK4.chunk.css","scripts/BicQH0Al.chunk.js","css/D5JKYURg.chunk.css","scripts/B1r_1ubU.chunk.js","scripts/C5f0lBCw2.chunk.js","css/DBshtiPC.chunk.css","scripts/Bc1JT5Y-2.chunk.js","scripts/CcI-EKxs.chunk.js","scripts/CsF4wDV1.chunk.js","scripts/_jJAx6fU.chunk.js","scripts/CLjADRa42.chunk.js","css/DVdh6HWj.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"./DFZS3Ffo.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"./DGmmTRu72.chunk.js";import{t as x}from"./CVHQXNzi2.chunk.js";import{t as S}from"./BrbeV-Gn2.chunk.js";import{t as C}from"./LoQS6GjP.chunk.js";import{t as w}from"./CZgWQFsJ.chunk.js";import{t as T}from"./CqrjHjAN.chunk.js";import{t as E}from"./eoAypzU3.chunk.js";import{t as D}from"./D_gWf2lC.chunk.js";import{t as O}from"./_GCZ-60i.chunk.js";import{t as k}from"./DruDe9vI.chunk.js";import{t as A}from"./7-GJWRH82.chunk.js";import{t as j}from"./dLd5d3X22.chunk.js";import{n as M}from"./BRcHS92O2.chunk.js";import{t as ee}from"./Bs2PKr1I2.chunk.js";import{t as N}from"./QCFxJYkI2.chunk.js";import{t as te}from"./e_p5kSFR2.chunk.js";import{t as ne}from"./CduNFx13.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"./B3gsVN-_.chunk.js";import{t as oe}from"./BDif2ytg2.chunk.js";import{t as L}from"./CbzENe5-2.chunk.js";import{t as R}from"./Dfw0sxVt2.chunk.js";import{t as se}from"./rVRhgtHY2.chunk.js";import{t as ce}from"./6UdHSMo02.chunk.js";import{t as le}from"./BSYDOevb2.chunk.js";import{t as z}from"./BugRosaL2.chunk.js";import{t as ue}from"./DYDxLHiV2.chunk.js";import{n as de}from"./CpFtf-tI2.chunk.js";import{t as fe}from"./BTd65Rcb2.chunk.js";import{t as pe}from"./D6vGqwTy2.chunk.js";import{t as B}from"./DBkEQkKm2.chunk.js";import{t as me}from"./dkL70h2W2.chunk.js";import{n as he,t as ge}from"./Bmh0Fxsl2.chunk.js";import"./BUDCkU2S2.chunk.js";import{t as _e}from"./C1loT8MD2.chunk.js";var V=e(o()),H=s();function U(e,t){let n=u(),{hasPermissions:i}=I(),a=(p(T.currentUser()).data?.isAuthenticated||t)&&i(r.ViewVideoPointsOfInterest);function o(t){return C.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}=b(null),{hasProduct:o,isLoadingProducts:s}=R(),{hasPermissions:c,isLoaded:l}=I(),{fetchViviAccessToken:u,fetchAppleTvAccessToken:d}=ve(),f=p(T.currentUser()),m=p(D.config()),h=xe(c),g=f.data?.isAuthenticated??!1,_=!c(r.StudentExperience),v=!c(r.GuestExperience),y=o(N.Primary),x=g&&y&&(_||i)&&v,S=g&&y&&_&&v,C=x&&t,w=p(e&&C&&L.getViviIntegrationStatus()),E=w.data===oe.Connected,O=!C||w.hasCompleted;return{hasCompleted:!g||f.hasCompleted&&m.hasCompleted&&O&&l&&!a&&!s,data:{ctaOptions:h,canUserCastToDevices:x||S,vivi:{accountConnected:E,enabled:x&&t,apiUrl:m.data?.viviApiUrl??``,fetchAccessToken:u},appleTv:{enabled:S&&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=S.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:C.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=>S.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(T.currentUser()),l=p(t&&S.getVideoRequest(t,n,r)),u=p(r&&k.getShareObject(r)),d=U((n===x.Video||n===x.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!==x.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=S.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=S.isVideoTypeArchived(r),l=t.isAuthenticated&&S.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=S.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}=b(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:S.getRating(e.video)?.code,ratingValue:S.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},C=e.playerIntegrations?{...e.playerIntegrations,trackingCode:S.getTrackingCode(e.video)}:void 0,T=e.mode==="default"&&e.defaultDisplayMode===`theatre`,E=e.mode===`hover`,D=e.video.typeId===x.Interactive,O=le.isPublic(e.shareLink),k=o&&s&&!E&&!O,A=V.useMemo(()=>V.lazy(()=>w(()=>import(`./MW7W80HY2.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,177,178,179]))),[]),j=V.useMemo(()=>V.lazy(()=>w(()=>import(`./CAkqvKfy.chunk.js`),__vite__mapDeps([180,1,14,7,15,16,4,5,19,181,2,3,6,8,9,10,11,12,13,132,43,17,34,44,45,182,124,80,183,184,140,185,120,186,48,24,33,187,188,189,99,190,191,114,27,88,31,87,89,90,91,192,193,194,195,108,109,110,26,111,112,113,25,35,36,37,38,39,40,42,46,47,49,50,51,115,116,117,86,118,119,121,122,123,18,70,55,56,125,126,127,128,73,129,130,131,81,133,134,135,136,137,138,139,41,141,142,143,144,145,146,147,148,149,150,151,152,155,156,157,158,178,196,197,198,77,78,79,76,59,60,61,62,63,64,65,66,67,68,69,71,72,74,75,199,200,201]))),[]);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:T?`w-100 h-100`:``}return(0,H.jsx)(V.Suspense,{fallback:(0,H.jsx)(`div`,{className:`${$.placeholder} ${T?$.theatreMode:``}`}),children:(0,H.jsx)(j,{...y,devicesConfig:C,className:M(),onClickCreateClip:p,pointsOfInterest:e.pointsOfInterest,onReady:h,showResources:e.embed,onRequestPictureInPicture:i&&e.onRequestPictureInPicture,onRequestTheatreMode:e.onRequestTheatreMode,theatreMode:T,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=CLvImDXv2.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 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":"D-iyHqNw2.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 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":"CLvImDXv2.chunk.js"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import{o as e}from"./DAXXjFlN.chunk.js";import{t}from"./C2w0pmFW.chunk.js";import{t as n}from"./wrLrTezN.chunk.js";import{t as r}from"./lhZ5v-iN2.chunk.js";import{f as i,m as a,n as o}from"./
|
|
1
|
+
import{o as e}from"./DAXXjFlN.chunk.js";import{t}from"./C2w0pmFW.chunk.js";import{t as n}from"./wrLrTezN.chunk.js";import{t as r}from"./lhZ5v-iN2.chunk.js";import{f as i,m as a,n as o}from"./Dqn0sInF.chunk.js";var s=a.getComponent(`Button`),c=class extends s{constructor(e,t){super(e,t),this.update()}update(){this.options_.activityStatus===r.Complete?this.addClass(`cv-activity-completed`):this.removeClass(`cv-activity-completed`)}handleClick(...e){this.options_.activityStatus=this.getToggledActivityStatus(),this.update(),this.options_.clickHandler&&this.options_.clickHandler.call(this,e)}buildCSSClass(){return`cv-activity-status-button`}getToggledActivityStatus(){if(this.options_.activityStatus===r.None||this.options_.activityStatus===r.Incomplete)return r.Complete;if(this.options_.activityStatus===r.Complete)return r.Incomplete}};c.prototype.controlText_=`Complete`;var l=a.getPlugin(`plugin`),u=class extends l{setActivityStatus(e,t){e!==this.activityStatus&&(this.activityStatus=e,this.onToggleStatus=t,this.player.ready(()=>{this.renderActivityStatusButton()}))}renderActivityStatusButton(){this.button&&this.player.removeChild(this.button),this.button=new c(this.player,{activityStatus:this.activityStatus,clickHandler:this.onToggleStatus}),this.player.addChild(this.button)}};a.registerPlugin(`activityStatusPlugin`,u);var d=e(t()),f=n();function p(e){let[t,n]=d.useState(5);if(d.useEffect(()=>{let e=setInterval(()=>{n(e=>e-1)},1e3);return()=>{clearInterval(e)}},[]),d.useEffect(()=>{t===0&&e.onPlayNext()},[t]),!e.nextVideo||!e.onPlayNext)return(0,f.jsx)(f.Fragment,{});let r=Math.ceil(t),i=r===1?`second`:`seconds`;return(0,f.jsx)(f.Fragment,{children:(0,f.jsxs)(`div`,{className:`cv-up-next-container`,children:[(0,f.jsx)(`div`,{className:`cv-cancel-up-next cursor-pointer`,role:`button`,onClick:e.onCancel,children:`×`}),(0,f.jsxs)(`div`,{className:`cv-up-next-heading`,children:[`Up next in `,r,` `,i,`:`]}),(0,f.jsx)(`div`,{className:`cv-up-next-image cursor-pointer`,onClick:e.onPlayNext,style:{backgroundImage:`url(${e.nextVideo?.thumbnailUrl})`}}),(0,f.jsx)(`div`,{className:`cv-up-next-title`,children:e.nextVideo.name})]})})}a.registerComponent(`UpNext`,o((e,t)=>(0,f.jsx)(p,{player:e,...t})));var m=a.getComponent(`MenuItem`),h=class extends m{constructor(e,t){super(e,t),this.bindListeners(),this.player_.nextVideoPlugin().getShouldPlayNext()&&this.toggleOn()}bindListeners(){this.onPlayNextChange=this.onPlayNextChange.bind(this),this.player_.on(`cv:playnext`,this.onPlayNextChange)}handleToggle(){let e=this.player_.nextVideoPlugin().getShouldPlayNext();this.player_.nextVideoPlugin().setShouldPlayNext(!e,!0)}onPlayNextChange(e,t){t?this.toggleOn():this.toggleOff()}toggleOn(){a.dom.addClass(this.toggleEl,`on`)}toggleOff(){a.dom.removeClass(this.toggleEl,`on`)}handleClick(e){e.stopImmediatePropagation()}createEl(e,t,n){this.handlerBound||=(this.handleToggle=this.handleToggle.bind(this),!0),this.toggleEl&&this.toggleEl.removeEventListener(`click`,this.handleToggle),this.toggleEl=a.dom.createEl(`div`,{className:`custom-toggle custom-toggle-info toggle-option float-end`,innerHTML:`<span class="handle"></span></div>`}),this.toggleEl.addEventListener(`click`,this.handleToggle);let r=super.createEl(e,{className:`vjs-menu-item cv-cog-menu-item cv-play-next-toggle`,innerHTML:`
|
|
2
2
|
<span class="vjs-menu-item-text">Play next video</span>
|
|
3
3
|
<span class="cv-toggle-container"></span>`},n);return r.children[1].appendChild(this.toggleEl),r}dispose(){this.player_.off(`cv:playnext`,this.onPlayNextChange),super.dispose()}};a.registerComponent(`NextVideoMenuItem`,h);var g=`cv-persisttest`,_=`cv-play-next-video`,v=a.getPlugin(`plugin`),y=a.getComponent(`NextVideoMenuItem`),b=class extends v{constructor(e){if(super(e),this.setShouldPlayNext=this.setShouldPlayNext.bind(this),this.getShouldPlayNext=this.getShouldPlayNext.bind(this),this.getChapterTrack=this.getChapterTrack.bind(this),this.onTimeUpdate=this.onTimeUpdate.bind(this),this.hasLocalStorage=this.testHasLocalStorage(),this.shouldPlayNextVideo=!1,this.hasLocalStorage){let e=window.localStorage.getItem(_);this.shouldPlayNextVideo=e===`true`}e.ready(()=>{this.initialize()})}initialize(){this.player.isDisposed()||this.bindListeners()}getChapterTrack(){return i.getTrack(this.player,`chapters`,null)}setNextVideo(e,t,n){this.nextVideo=e,this.callback=n,t&&this.setShouldPlayNext(!0),(this.player.getChild(`collapserator`)?.getChild(`cogButton`)).addItem({ctor:y,name:`NextVideoMenuItem`})}getShouldPlayNext(){return this.shouldPlayNextVideo}setShouldPlayNext(e,t){this.shouldPlayNextVideo=e,this.player.trigger(`cv:playnext`,e),this.hasLocalStorage&&t&&window.localStorage.setItem(_,e.toString()),e&&this.player.loopVideoPlugin().loop(!1)}bindListeners(){this.player.on(`timeupdate`,this.onTimeUpdate)}dispose(){this.player.off(`timeupdate`,this.onTimeUpdate),this.hideUpNext(),super.dispose()}onTimeUpdate(){if(!(this.player.pictureInPicture&&this.player.isInPictureInPicture())){if(!this.getShouldPlayNext()){this.hideUpNext();return}if(this.upNextRendered&&this.player.currentTime()<this.player.duration()){this.hideUpNext();return}this.player.ended()&&this.showUpNext()}}showUpNext(){this.upNextRendered||(this.upNextRendered=!0,this.player.addChild(`UpNext`,{nextVideo:this.nextVideo,onPlayNext:this.callback,onCancel:()=>{this.hideUpNext(),this.setShouldPlayNext(!1)}}))}hideUpNext(){if(!this.upNextRendered)return;this.upNextRendered=!1;let e=this.player.getChild(`UpNext`);e&&(this.player.removeChild(e),e.dispose())}testHasLocalStorage(){try{return window.localStorage.setItem(g,`persistPlayNext`),window.localStorage.removeItem(g),!0}catch{return!1}}};a.registerPlugin(`nextVideoPlugin`,b);var x=a.getComponent(`MenuItem`),S=class extends x{constructor(e,t){super(e,t),this.onLoopVideoChange=this.onLoopVideoChange.bind(this),this.player_.on(`cv:loopvideo`,this.onLoopVideoChange),this.onLoopVideoChange(null,this.player_.loopVideoPlugin().loop())}onLoopVideoChange(e,t){t?this.toggleOn():this.toggleOff()}handleToggle(){let e=this.player_.loopVideoPlugin().loop();this.player_.loopVideoPlugin().loop(!e)}toggleOn(){a.dom.addClass(this.toggleEl,`on`)}toggleOff(){a.dom.removeClass(this.toggleEl,`on`)}handleClick(e){e.stopImmediatePropagation()}createEl(e,t,n){this.handlerBound||=(this.handleToggle=this.handleToggle.bind(this),!0),this.toggleEl&&this.toggleEl.removeEventListener(`click`,this.handleToggle),this.toggleEl=a.dom.createEl(`div`,{className:`custom-toggle custom-toggle-info toggle-option float-end`,innerHTML:`<span class="handle"></span></div>`}),this.toggleEl.addEventListener(`click`,this.handleToggle);let r=super.createEl(e,{className:`vjs-menu-item cv-cog-menu-item cv-loop-video-toggle`,innerHTML:`
|
|
4
4
|
<span class="vjs-menu-item-text">Loop video</span>
|
|
5
5
|
<span class="cv-toggle-container"></span>`},n);return r.children[1].appendChild(this.toggleEl),r}dispose(){this.player_.off(`cv:loopvideo`,this.onLoopVideoChange),super.dispose()}};a.registerComponent(`LoopVideoMenuItem`,S);var C=a.getPlugin(`plugin`),w=a.getComponent(`LoopVideoMenuItem`),T=class extends C{constructor(e,t){super(e),t.allowLoop&&this.player.ready(()=>this.addButton()),this.onEnded=this.onEnded.bind(this),this.player.on(`ended`,this.onEnded)}addButton(){(this.player.getChild(`collapserator`)?.getChild(`cogButton`)).addItem({ctor:w,name:`LoopVideoMenuItem`})}onEnded(){this.player.loop()&&this.player.play()}loop(e){if(typeof e!=`boolean`)return this.player.loop();e&&this.player.nextVideoPlugin?.()?.setShouldPlayNext(!1,!1),this.player.trigger(`cv:loopvideo`,e),this.player.loop(e)}dispose(){this.player.off(`ended`,this.onEnded),super.dispose()}};a.registerPlugin(`loopVideoPlugin`,T);
|
|
6
|
-
//# sourceMappingURL=
|
|
6
|
+
//# sourceMappingURL=CM8248d7.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Cqq1N9xw.chunk.js","names":[],"sources":["../../../player/src/plugins/activity-status-plugin/components/activity-status-button.ts","../../../player/src/plugins/activity-status-plugin/activity-status-plugin.ts","../../../player/src/plugins/next-video-plugin/components/up-next/up-next.scss","../../../player/src/plugins/next-video-plugin/components/up-next/up-next.tsx","../../../player/src/components/next-video-menu-item/next-video-menu-item.ts","../../../player/src/plugins/next-video-plugin/next-video-plugin.ts","../../../player/src/plugins/loop-video-plugin/components/loop-video-menu-item.ts","../../../player/src/plugins/loop-video-plugin/loop-video-plugin.ts"],"sourcesContent":["import videojs, { VideoJsPlayer } from 'video.js';\n\nimport { ShareActivityStatus } from 'libs/shared/enums/ShareActivityStatus';\n\nconst Button = videojs.getComponent('Button');\n\nimport './activity-status-button.scss';\n\ninterface ActivityStatusButtonOptions extends videojs.ComponentOptions {\n activityStatus: ShareActivityStatus;\n clickHandler: () => void;\n}\n\nexport class ActivityStatusButton extends Button {\n public options_: ActivityStatusButtonOptions;\n public controlText_: string;\n\n constructor(player: VideoJsPlayer, options: ActivityStatusButtonOptions) {\n super(player, options);\n\n this.update();\n }\n\n public update(): void {\n if (this.options_.activityStatus === ShareActivityStatus.Complete)\n this.addClass('cv-activity-completed');\n else\n this.removeClass('cv-activity-completed');\n }\n\n public handleClick(...args: any[]) {\n this.options_.activityStatus = this.getToggledActivityStatus();\n\n this.update();\n if (this.options_.clickHandler) {\n this.options_.clickHandler.call(this, args);\n }\n }\n\n public buildCSSClass(): string {\n return 'cv-activity-status-button';\n }\n\n private getToggledActivityStatus(): ShareActivityStatus {\n if (this.options_.activityStatus === ShareActivityStatus.None\n || this.options_.activityStatus === ShareActivityStatus.Incomplete) {\n return ShareActivityStatus.Complete;\n }\n\n if (this.options_.activityStatus === ShareActivityStatus.Complete) {\n return ShareActivityStatus.Incomplete;\n }\n }\n}\n\nActivityStatusButton.prototype.controlText_ = 'Complete';\n","import videojs from 'video.js';\n\nimport { ShareActivityStatus } from 'libs/shared/enums/ShareActivityStatus';\n\nimport { ActivityStatusButton } from 'projects/player/plugins/activity-status-plugin/components/activity-status-button';\n\nconst Plugin = videojs.getPlugin('plugin');\n\nclass ActivityStatusPlugin extends Plugin {\n private activityStatus: ShareActivityStatus;\n private onToggleStatus: () => void;\n private button: ActivityStatusButton;\n\n public setActivityStatus(activityStatus: ShareActivityStatus, onToggleStatus: () => void): void {\n if (activityStatus === this.activityStatus)\n return;\n\n this.activityStatus = activityStatus;\n this.onToggleStatus = onToggleStatus;\n\n this.player.ready(() => {\n this.renderActivityStatusButton();\n });\n }\n\n // Remove old button and render new button when activity status is different from previous status\n private renderActivityStatusButton(): void {\n if (this.button) {\n this.player.removeChild(this.button);\n }\n\n this.button = new ActivityStatusButton(this.player, {\n activityStatus: this.activityStatus,\n clickHandler: this.onToggleStatus\n });\n\n this.player.addChild(this.button);\n }\n}\n\nvideojs.registerPlugin('activityStatusPlugin', ActivityStatusPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n activityStatusPlugin(): ActivityStatusPlugin;\n }\n}\n","// This file is using some horrid valuies\n// It needs to be re-written this was just quickly thrown together\n// to show something at retro - Sha\n\n.video-js {\n .cv-up-next-container {\n position: absolute;\n bottom: 1.5em;\n color: $white;\n padding: 0.8em;\n width: 19em;\n border-radius: 0.3333em;\n background: $menu-bg;\n right: 1.5em;\n font-size: 1.5em;\n z-index: 6;\n }\n\n .cv-cancel-up-next {\n position: absolute;\n top: 0;\n right: 0.4em;\n font-size: 2em;\n }\n\n .cv-up-next-image {\n padding-bottom: 56.25%;\n background-size: contain;\n border-radius: 0.3333em;\n background-color: linear-gradient(to right, $gray-300, $gray-100);\n }\n\n .cv-up-next-heading {\n color: $white;\n padding-bottom: 0.6em;\n }\n\n .cv-up-next-title {\n color: $white;\n padding-top: 0.6em;\n }\n}","import * as React from 'react';\nimport videojs, { VideoJsPlayer } from 'video.js';\n\nimport { NextVideo } from 'projects/player/interfaces/NextVideo';\nimport { getReactComponent } from 'projects/player/react/react-component';\n\nimport './up-next.scss';\n\ninterface UpNextProps {\n player: VideoJsPlayer;\n nextVideo: NextVideo;\n onPlayNext: () => void;\n onCancel: () => void;\n}\n\nfunction UpNext(props: UpNextProps): JSX.Element {\n const [ timeRemaining, setTimeRemaining ] = React.useState(5);\n\n React.useEffect(() => {\n const timer = setInterval(() => {\n setTimeRemaining(prev => prev - 1);\n }, 1000);\n\n return () => {\n clearInterval(timer);\n };\n }, []);\n\n React.useEffect(() => {\n if (timeRemaining === 0)\n props.onPlayNext();\n }, [timeRemaining]);\n\n if (!props.nextVideo || !props.onPlayNext)\n return <></>;\n\n const roundedTimeRemaining = Math.ceil(timeRemaining);\n const secondsString = roundedTimeRemaining === 1 ? 'second' : 'seconds';\n\n return (\n <>\n <div className='cv-up-next-container'>\n <div className='cv-cancel-up-next cursor-pointer' role='button' onClick={props.onCancel}>×</div>\n <div className='cv-up-next-heading'>Up next in {roundedTimeRemaining} {secondsString}:</div>\n <div\n className='cv-up-next-image cursor-pointer'\n onClick={props.onPlayNext}\n style={{\n backgroundImage: `url(${props.nextVideo?.thumbnailUrl})`\n }}\n ></div>\n <div className='cv-up-next-title'>{props.nextVideo.name}</div>\n </div>\n </>\n );\n}\n\nvideojs.registerComponent(\n 'UpNext',\n getReactComponent(\n (player: VideoJsPlayer, options: UpNextProps) => <UpNext player={player} {...options} />\n )\n);\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport './next-video-menu-item.scss';\n\nconst MenuItem = videojs.getComponent('MenuItem');\n\nclass NextVideoMenuItem extends MenuItem {\n private toggleEl: Element;\n\n /**\n * Because we want to bind our listener in createEl\n * and createEl runs in super. We store if we've bounud\n * our handler, so we only call bind once and \n * the call to removeEventListener will still work\n */\n private handlerBound: boolean;\n\n constructor(player: VideoJsPlayer, options: videojs.ComponentOptions) {\n super(player, options);\n\n this.bindListeners();\n\n if (this.player_.nextVideoPlugin().getShouldPlayNext())\n this.toggleOn();\n }\n\n private bindListeners(): void {\n this.onPlayNextChange = this.onPlayNextChange.bind(this);\n\n this.player_.on('cv:playnext', this.onPlayNextChange);\n }\n\n public handleToggle(): void {\n const shouldPlayNext = this.player_.nextVideoPlugin().getShouldPlayNext();\n\n this.player_.nextVideoPlugin().setShouldPlayNext(!shouldPlayNext, true);\n }\n\n private onPlayNextChange(_: any, enabled: boolean): void {\n enabled ? this.toggleOn() : this.toggleOff();\n }\n\n private toggleOn(): void {\n videojs.dom.addClass(this.toggleEl, 'on');\n }\n\n private toggleOff(): void {\n videojs.dom.removeClass(this.toggleEl, 'on');\n }\n\n /**\n * Because we extend MenuItem which will close the menu by default\n * we need to halt the event propogation here\n */\n public handleClick(event: videojs.EventTarget.Event): void {\n event.stopImmediatePropagation();\n }\n\n public createEl(tagName?: string, properties?: any, attributes?: any): HTMLLIElement {\n /**\n * Bind our event listener only once\n * see the comment where handlerBound is defined\n */\n if (!this.handlerBound) {\n this.handleToggle = this.handleToggle.bind(this);\n this.handlerBound = true;\n }\n\n if (this.toggleEl)\n this.toggleEl.removeEventListener('click', this.handleToggle);\n\n this.toggleEl = videojs.dom.createEl('div', {\n className: `custom-toggle custom-toggle-info toggle-option float-end`,\n innerHTML: '<span class=\"handle\"></span></div>'\n });\n this.toggleEl.addEventListener('click', this.handleToggle);\n\n const innerHTML = `\n <span class=\"vjs-menu-item-text\">Play next video</span>\n <span class=\"cv-toggle-container\"></span>`;\n\n const el = super.createEl(tagName, {\n className: 'vjs-menu-item cv-cog-menu-item cv-play-next-toggle',\n innerHTML\n }, attributes);\n\n /**\n * Indexing into the child this way is only safe to do because\n * we know that the el only has two children\n */\n el.children[1].appendChild(this.toggleEl);\n\n return el;\n }\n\n public dispose(): void {\n this.player_.off('cv:playnext', this.onPlayNextChange);\n super.dispose();\n }\n}\n\nvideojs.registerComponent('NextVideoMenuItem', NextVideoMenuItem);\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport { CogButton } from 'projects/player/components/cog-button/cog-button';\nimport { NextVideo } from 'projects/player/interfaces/NextVideo';\nimport { TrackHelper } from 'projects/player/utils/track-helper';\n\nimport 'projects/player/plugins/next-video-plugin/components/up-next/up-next';\nimport 'projects/player/components/next-video-menu-item/next-video-menu-item';\n\nconst TEST = 'cv-persisttest';\nconst PLAY_NEXT = 'cv-play-next-video';\n\nconst Plugin = videojs.getPlugin('plugin');\nconst NextVideoMenuItem = videojs.getComponent('NextVideoMenuItem') as unknown as typeof videojs.MenuItem;\n\nclass NextVideoPlugin extends Plugin {\n private shouldPlayNextVideo: boolean;\n private hasLocalStorage: boolean;\n private nextVideoMenuItem: typeof videojs.MenuItem;\n\n private upNextRendered: boolean;\n\n private nextVideo: NextVideo;\n private callback: () => void;\n \n constructor(player: VideoJsPlayer) {\n super(player);\n\n this.setShouldPlayNext = this.setShouldPlayNext.bind(this);\n this.getShouldPlayNext = this.getShouldPlayNext.bind(this);\n this.getChapterTrack = this.getChapterTrack.bind(this);\n this.onTimeUpdate = this.onTimeUpdate.bind(this);\n\n this.hasLocalStorage = this.testHasLocalStorage();\n\n this.shouldPlayNextVideo = false;\n\n if (this.hasLocalStorage) {\n const item = window.localStorage.getItem(PLAY_NEXT);\n this.shouldPlayNextVideo = item === 'true';\n }\n\n player.ready(() => {\n this.initialize();\n });\n }\n \n private initialize(): void {\n if ((this.player as any).isDisposed())\n return;\n \n this.bindListeners();\n }\n\n private getChapterTrack(): TextTrack {\n return TrackHelper.getTrack(this.player, 'chapters', null);\n }\n\n public setNextVideo(nextVideo: NextVideo, playNext: boolean, callback: () => void): void {\n this.nextVideo = nextVideo;\n this.callback = callback;\n\n if (playNext)\n this.setShouldPlayNext(true);\n\n /**\n * Check additionalItemOrder in cog-button.ts if you need to change the order. - Sha\n */\n const cogButton = this.player.getChild('collapserator')?.getChild('cogButton') as CogButton;\n cogButton.addItem({ ctor: NextVideoMenuItem, name: 'NextVideoMenuItem' });\n }\n\n public getShouldPlayNext(): boolean {\n return this.shouldPlayNextVideo;\n }\n\n public setShouldPlayNext(val: boolean, persist?: boolean): void {\n this.shouldPlayNextVideo = val;\n this.player.trigger('cv:playnext', val);\n\n if (this.hasLocalStorage && persist)\n window.localStorage.setItem(PLAY_NEXT, val.toString());\n\n if (val)\n this.player.loopVideoPlugin().loop(false);\n }\n\n private bindListeners(): void {\n this.player.on('timeupdate', this.onTimeUpdate);\n }\n\n public dispose(): void {\n this.player.off('timeupdate', this.onTimeUpdate);\n\n this.hideUpNext();\n\n super.dispose();\n }\n\n private onTimeUpdate(): void {\n /**\n * Do nothing when in picture in picture.\n * TODO: Figure out how next video should work for PiP\n */\n if (this.player.pictureInPicture && this.player.isInPictureInPicture())\n return;\n\n if (!this.getShouldPlayNext()) {\n this.hideUpNext();\n return;\n }\n\n /*\n * Always hide the up-next tile if the video is not at the end\n */\n if (this.upNextRendered && this.player.currentTime() < this.player.duration()) {\n this.hideUpNext();\n return;\n }\n\n /*\n * Show the up-next tile when the video has finished\n */\n if (this.player.ended()) {\n this.showUpNext();\n }\n }\n\n private showUpNext(): void {\n if (this.upNextRendered)\n return;\n\n this.upNextRendered = true;\n\n this.player.addChild('UpNext', {\n nextVideo: this.nextVideo,\n onPlayNext: this.callback,\n onCancel: () => {\n this.hideUpNext();\n this.setShouldPlayNext(false);\n }\n });\n }\n\n private hideUpNext(): void {\n if (!this.upNextRendered)\n return;\n\n this.upNextRendered = false;\n\n const upNext = this.player.getChild('UpNext');\n\n if (upNext) {\n this.player.removeChild(upNext);\n upNext.dispose();\n }\n }\n\n private testHasLocalStorage(): boolean {\n try {\n window.localStorage.setItem(TEST, 'persistPlayNext');\n window.localStorage.removeItem(TEST);\n return true;\n } catch {\n return false;\n }\n }\n}\n\nvideojs.registerPlugin('nextVideoPlugin', NextVideoPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n nextVideoPlugin(): NextVideoPlugin;\n }\n}\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport './loop-video-menu-item.scss';\n\nconst MenuItem = videojs.getComponent('MenuItem');\n\nexport class LoopVideoMenuItem extends MenuItem {\n private toggleEl: Element;\n\n /**\n * Because we want to bind our listener in createEl\n * and createEl runs in super. We store if we've bounud\n * our handler, so we only call bind once and \n * the call to removeEventListener will still work\n */\n private handlerBound: boolean;\n\n constructor(player: VideoJsPlayer, options: videojs.ComponentOptions) {\n super(player, options);\n\n this.onLoopVideoChange = this.onLoopVideoChange.bind(this);\n\n this.player_.on('cv:loopvideo', this.onLoopVideoChange);\n\n this.onLoopVideoChange(null, this.player_.loopVideoPlugin().loop());\n }\n\n private onLoopVideoChange(_: any, enabled: boolean): void {\n enabled ? this.toggleOn() : this.toggleOff();\n }\n\n public handleToggle(): void {\n const loop = this.player_.loopVideoPlugin().loop();\n\n this.player_.loopVideoPlugin().loop(!loop);\n }\n\n private toggleOn(): void {\n videojs.dom.addClass(this.toggleEl, 'on');\n }\n\n private toggleOff(): void {\n videojs.dom.removeClass(this.toggleEl, 'on');\n }\n\n /**\n * Because we extend MenuItem which will close the menu by default\n * we need to halt the event propogation here\n */\n public handleClick(event: videojs.EventTarget.Event): void {\n event.stopImmediatePropagation();\n }\n\n public createEl(tagName?: string, properties?: any, attributes?: any): HTMLLIElement {\n /**\n * Bind our event listener only once\n * see the comment where handlerBound is defined\n */\n if (!this.handlerBound) {\n this.handleToggle = this.handleToggle.bind(this);\n this.handlerBound = true;\n }\n\n if (this.toggleEl)\n this.toggleEl.removeEventListener('click', this.handleToggle);\n\n this.toggleEl = videojs.dom.createEl('div', {\n className: `custom-toggle custom-toggle-info toggle-option float-end`,\n innerHTML: '<span class=\"handle\"></span></div>'\n });\n this.toggleEl.addEventListener('click', this.handleToggle);\n\n const innerHTML = `\n <span class=\"vjs-menu-item-text\">Loop video</span>\n <span class=\"cv-toggle-container\"></span>`;\n\n const el = super.createEl(tagName, {\n className: 'vjs-menu-item cv-cog-menu-item cv-loop-video-toggle',\n innerHTML\n }, attributes);\n\n /**\n * Indexing into the child this way is only safe to do because\n * we know that the el only has two children\n */\n el.children[1].appendChild(this.toggleEl);\n\n return el;\n }\n\n public dispose(): void {\n this.player_.off('cv:loopvideo', this.onLoopVideoChange);\n super.dispose();\n }\n}\n\nvideojs.registerComponent('LoopVideoMenuItem', LoopVideoMenuItem);\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport { CogButton } from 'projects/player/components/cog-button/cog-button';\n\nimport 'projects/player/plugins/loop-video-plugin/components/loop-video-menu-item';\n\nconst Plugin = videojs.getPlugin('plugin');\nconst LoopVideoMenuItem = videojs.getComponent('LoopVideoMenuItem') as unknown as typeof videojs.MenuItem;\n\ninterface LoopVideoPluginOptions {\n allowLoop: boolean;\n}\n\nclass LoopVideoPlugin extends Plugin {\n constructor(player: VideoJsPlayer, options: LoopVideoPluginOptions) {\n super(player);\n\n // Button must be added after ctor finishes, otherwise subsequent calls to\n // this.player.loopVideoPlugin() will try make a new plugin - Sha\n if (options.allowLoop)\n this.player.ready(() => this.addButton());\n\n this.onEnded = this.onEnded.bind(this);\n this.player.on('ended', this.onEnded);\n }\n\n private addButton(): void {\n /**\n * Check additionalItemOrder in cog-button.ts if you need to change the order. - Sha\n */\n const cogButton = this.player.getChild('collapserator')?.getChild('cogButton') as CogButton;\n cogButton.addItem({ ctor: LoopVideoMenuItem, name: 'LoopVideoMenuItem' });\n }\n\n private onEnded(): void {\n // turns out the regular loop functionality doesn't work with clips.\n // this call will just do nothing for videos - Sha\n if (this.player.loop())\n this.player.play();\n }\n\n public loop(enabled: boolean): void;\n public loop(): boolean ;\n public loop(enabled?: boolean): any {\n if (typeof enabled !== 'boolean')\n return this.player.loop();\n\n if (enabled)\n this.player.nextVideoPlugin?.()?.setShouldPlayNext(false, false);\n\n this.player.trigger('cv:loopvideo', enabled);\n this.player.loop(enabled);\n }\n\n public dispose(): void {\n this.player.off('ended', this.onEnded);\n super.dispose();\n }\n}\n\nvideojs.registerPlugin('loopVideoPlugin', LoopVideoPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n loopVideoPlugin(options?: LoopVideoPluginOptions): LoopVideoPlugin;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CM8248d7.chunk.js","names":[],"sources":["../../../player/src/plugins/activity-status-plugin/components/activity-status-button.ts","../../../player/src/plugins/activity-status-plugin/activity-status-plugin.ts","../../../player/src/plugins/next-video-plugin/components/up-next/up-next.scss","../../../player/src/plugins/next-video-plugin/components/up-next/up-next.tsx","../../../player/src/components/next-video-menu-item/next-video-menu-item.ts","../../../player/src/plugins/next-video-plugin/next-video-plugin.ts","../../../player/src/plugins/loop-video-plugin/components/loop-video-menu-item.ts","../../../player/src/plugins/loop-video-plugin/loop-video-plugin.ts"],"sourcesContent":["import videojs, { VideoJsPlayer } from 'video.js';\n\nimport { ShareActivityStatus } from 'libs/shared/enums/ShareActivityStatus';\n\nconst Button = videojs.getComponent('Button');\n\nimport './activity-status-button.scss';\n\ninterface ActivityStatusButtonOptions extends videojs.ComponentOptions {\n activityStatus: ShareActivityStatus;\n clickHandler: () => void;\n}\n\nexport class ActivityStatusButton extends Button {\n public options_: ActivityStatusButtonOptions;\n public controlText_: string;\n\n constructor(player: VideoJsPlayer, options: ActivityStatusButtonOptions) {\n super(player, options);\n\n this.update();\n }\n\n public update(): void {\n if (this.options_.activityStatus === ShareActivityStatus.Complete)\n this.addClass('cv-activity-completed');\n else\n this.removeClass('cv-activity-completed');\n }\n\n public handleClick(...args: any[]) {\n this.options_.activityStatus = this.getToggledActivityStatus();\n\n this.update();\n if (this.options_.clickHandler) {\n this.options_.clickHandler.call(this, args);\n }\n }\n\n public buildCSSClass(): string {\n return 'cv-activity-status-button';\n }\n\n private getToggledActivityStatus(): ShareActivityStatus {\n if (this.options_.activityStatus === ShareActivityStatus.None\n || this.options_.activityStatus === ShareActivityStatus.Incomplete) {\n return ShareActivityStatus.Complete;\n }\n\n if (this.options_.activityStatus === ShareActivityStatus.Complete) {\n return ShareActivityStatus.Incomplete;\n }\n }\n}\n\nActivityStatusButton.prototype.controlText_ = 'Complete';\n","import videojs from 'video.js';\n\nimport { ShareActivityStatus } from 'libs/shared/enums/ShareActivityStatus';\n\nimport { ActivityStatusButton } from 'projects/player/plugins/activity-status-plugin/components/activity-status-button';\n\nconst Plugin = videojs.getPlugin('plugin');\n\nclass ActivityStatusPlugin extends Plugin {\n private activityStatus: ShareActivityStatus;\n private onToggleStatus: () => void;\n private button: ActivityStatusButton;\n\n public setActivityStatus(activityStatus: ShareActivityStatus, onToggleStatus: () => void): void {\n if (activityStatus === this.activityStatus)\n return;\n\n this.activityStatus = activityStatus;\n this.onToggleStatus = onToggleStatus;\n\n this.player.ready(() => {\n this.renderActivityStatusButton();\n });\n }\n\n // Remove old button and render new button when activity status is different from previous status\n private renderActivityStatusButton(): void {\n if (this.button) {\n this.player.removeChild(this.button);\n }\n\n this.button = new ActivityStatusButton(this.player, {\n activityStatus: this.activityStatus,\n clickHandler: this.onToggleStatus\n });\n\n this.player.addChild(this.button);\n }\n}\n\nvideojs.registerPlugin('activityStatusPlugin', ActivityStatusPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n activityStatusPlugin(): ActivityStatusPlugin;\n }\n}\n","// This file is using some horrid valuies\n// It needs to be re-written this was just quickly thrown together\n// to show something at retro - Sha\n\n.video-js {\n .cv-up-next-container {\n position: absolute;\n bottom: 1.5em;\n color: $white;\n padding: 0.8em;\n width: 19em;\n border-radius: 0.3333em;\n background: $menu-bg;\n right: 1.5em;\n font-size: 1.5em;\n z-index: 6;\n }\n\n .cv-cancel-up-next {\n position: absolute;\n top: 0;\n right: 0.4em;\n font-size: 2em;\n }\n\n .cv-up-next-image {\n padding-bottom: 56.25%;\n background-size: contain;\n border-radius: 0.3333em;\n background-color: linear-gradient(to right, $gray-300, $gray-100);\n }\n\n .cv-up-next-heading {\n color: $white;\n padding-bottom: 0.6em;\n }\n\n .cv-up-next-title {\n color: $white;\n padding-top: 0.6em;\n }\n}","import * as React from 'react';\nimport videojs, { VideoJsPlayer } from 'video.js';\n\nimport { NextVideo } from 'projects/player/interfaces/NextVideo';\nimport { getReactComponent } from 'projects/player/react/react-component';\n\nimport './up-next.scss';\n\ninterface UpNextProps {\n player: VideoJsPlayer;\n nextVideo: NextVideo;\n onPlayNext: () => void;\n onCancel: () => void;\n}\n\nfunction UpNext(props: UpNextProps): JSX.Element {\n const [ timeRemaining, setTimeRemaining ] = React.useState(5);\n\n React.useEffect(() => {\n const timer = setInterval(() => {\n setTimeRemaining(prev => prev - 1);\n }, 1000);\n\n return () => {\n clearInterval(timer);\n };\n }, []);\n\n React.useEffect(() => {\n if (timeRemaining === 0)\n props.onPlayNext();\n }, [timeRemaining]);\n\n if (!props.nextVideo || !props.onPlayNext)\n return <></>;\n\n const roundedTimeRemaining = Math.ceil(timeRemaining);\n const secondsString = roundedTimeRemaining === 1 ? 'second' : 'seconds';\n\n return (\n <>\n <div className='cv-up-next-container'>\n <div className='cv-cancel-up-next cursor-pointer' role='button' onClick={props.onCancel}>×</div>\n <div className='cv-up-next-heading'>Up next in {roundedTimeRemaining} {secondsString}:</div>\n <div\n className='cv-up-next-image cursor-pointer'\n onClick={props.onPlayNext}\n style={{\n backgroundImage: `url(${props.nextVideo?.thumbnailUrl})`\n }}\n ></div>\n <div className='cv-up-next-title'>{props.nextVideo.name}</div>\n </div>\n </>\n );\n}\n\nvideojs.registerComponent(\n 'UpNext',\n getReactComponent(\n (player: VideoJsPlayer, options: UpNextProps) => <UpNext player={player} {...options} />\n )\n);\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport './next-video-menu-item.scss';\n\nconst MenuItem = videojs.getComponent('MenuItem');\n\nclass NextVideoMenuItem extends MenuItem {\n private toggleEl: Element;\n\n /**\n * Because we want to bind our listener in createEl\n * and createEl runs in super. We store if we've bounud\n * our handler, so we only call bind once and \n * the call to removeEventListener will still work\n */\n private handlerBound: boolean;\n\n constructor(player: VideoJsPlayer, options: videojs.ComponentOptions) {\n super(player, options);\n\n this.bindListeners();\n\n if (this.player_.nextVideoPlugin().getShouldPlayNext())\n this.toggleOn();\n }\n\n private bindListeners(): void {\n this.onPlayNextChange = this.onPlayNextChange.bind(this);\n\n this.player_.on('cv:playnext', this.onPlayNextChange);\n }\n\n public handleToggle(): void {\n const shouldPlayNext = this.player_.nextVideoPlugin().getShouldPlayNext();\n\n this.player_.nextVideoPlugin().setShouldPlayNext(!shouldPlayNext, true);\n }\n\n private onPlayNextChange(_: any, enabled: boolean): void {\n enabled ? this.toggleOn() : this.toggleOff();\n }\n\n private toggleOn(): void {\n videojs.dom.addClass(this.toggleEl, 'on');\n }\n\n private toggleOff(): void {\n videojs.dom.removeClass(this.toggleEl, 'on');\n }\n\n /**\n * Because we extend MenuItem which will close the menu by default\n * we need to halt the event propogation here\n */\n public handleClick(event: videojs.EventTarget.Event): void {\n event.stopImmediatePropagation();\n }\n\n public createEl(tagName?: string, properties?: any, attributes?: any): HTMLLIElement {\n /**\n * Bind our event listener only once\n * see the comment where handlerBound is defined\n */\n if (!this.handlerBound) {\n this.handleToggle = this.handleToggle.bind(this);\n this.handlerBound = true;\n }\n\n if (this.toggleEl)\n this.toggleEl.removeEventListener('click', this.handleToggle);\n\n this.toggleEl = videojs.dom.createEl('div', {\n className: `custom-toggle custom-toggle-info toggle-option float-end`,\n innerHTML: '<span class=\"handle\"></span></div>'\n });\n this.toggleEl.addEventListener('click', this.handleToggle);\n\n const innerHTML = `\n <span class=\"vjs-menu-item-text\">Play next video</span>\n <span class=\"cv-toggle-container\"></span>`;\n\n const el = super.createEl(tagName, {\n className: 'vjs-menu-item cv-cog-menu-item cv-play-next-toggle',\n innerHTML\n }, attributes);\n\n /**\n * Indexing into the child this way is only safe to do because\n * we know that the el only has two children\n */\n el.children[1].appendChild(this.toggleEl);\n\n return el;\n }\n\n public dispose(): void {\n this.player_.off('cv:playnext', this.onPlayNextChange);\n super.dispose();\n }\n}\n\nvideojs.registerComponent('NextVideoMenuItem', NextVideoMenuItem);\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport { CogButton } from 'projects/player/components/cog-button/cog-button';\nimport { NextVideo } from 'projects/player/interfaces/NextVideo';\nimport { TrackHelper } from 'projects/player/utils/track-helper';\n\nimport 'projects/player/plugins/next-video-plugin/components/up-next/up-next';\nimport 'projects/player/components/next-video-menu-item/next-video-menu-item';\n\nconst TEST = 'cv-persisttest';\nconst PLAY_NEXT = 'cv-play-next-video';\n\nconst Plugin = videojs.getPlugin('plugin');\nconst NextVideoMenuItem = videojs.getComponent('NextVideoMenuItem') as unknown as typeof videojs.MenuItem;\n\nclass NextVideoPlugin extends Plugin {\n private shouldPlayNextVideo: boolean;\n private hasLocalStorage: boolean;\n private nextVideoMenuItem: typeof videojs.MenuItem;\n\n private upNextRendered: boolean;\n\n private nextVideo: NextVideo;\n private callback: () => void;\n \n constructor(player: VideoJsPlayer) {\n super(player);\n\n this.setShouldPlayNext = this.setShouldPlayNext.bind(this);\n this.getShouldPlayNext = this.getShouldPlayNext.bind(this);\n this.getChapterTrack = this.getChapterTrack.bind(this);\n this.onTimeUpdate = this.onTimeUpdate.bind(this);\n\n this.hasLocalStorage = this.testHasLocalStorage();\n\n this.shouldPlayNextVideo = false;\n\n if (this.hasLocalStorage) {\n const item = window.localStorage.getItem(PLAY_NEXT);\n this.shouldPlayNextVideo = item === 'true';\n }\n\n player.ready(() => {\n this.initialize();\n });\n }\n \n private initialize(): void {\n if ((this.player as any).isDisposed())\n return;\n \n this.bindListeners();\n }\n\n private getChapterTrack(): TextTrack {\n return TrackHelper.getTrack(this.player, 'chapters', null);\n }\n\n public setNextVideo(nextVideo: NextVideo, playNext: boolean, callback: () => void): void {\n this.nextVideo = nextVideo;\n this.callback = callback;\n\n if (playNext)\n this.setShouldPlayNext(true);\n\n /**\n * Check additionalItemOrder in cog-button.ts if you need to change the order. - Sha\n */\n const cogButton = this.player.getChild('collapserator')?.getChild('cogButton') as CogButton;\n cogButton.addItem({ ctor: NextVideoMenuItem, name: 'NextVideoMenuItem' });\n }\n\n public getShouldPlayNext(): boolean {\n return this.shouldPlayNextVideo;\n }\n\n public setShouldPlayNext(val: boolean, persist?: boolean): void {\n this.shouldPlayNextVideo = val;\n this.player.trigger('cv:playnext', val);\n\n if (this.hasLocalStorage && persist)\n window.localStorage.setItem(PLAY_NEXT, val.toString());\n\n if (val)\n this.player.loopVideoPlugin().loop(false);\n }\n\n private bindListeners(): void {\n this.player.on('timeupdate', this.onTimeUpdate);\n }\n\n public dispose(): void {\n this.player.off('timeupdate', this.onTimeUpdate);\n\n this.hideUpNext();\n\n super.dispose();\n }\n\n private onTimeUpdate(): void {\n /**\n * Do nothing when in picture in picture.\n * TODO: Figure out how next video should work for PiP\n */\n if (this.player.pictureInPicture && this.player.isInPictureInPicture())\n return;\n\n if (!this.getShouldPlayNext()) {\n this.hideUpNext();\n return;\n }\n\n /*\n * Always hide the up-next tile if the video is not at the end\n */\n if (this.upNextRendered && this.player.currentTime() < this.player.duration()) {\n this.hideUpNext();\n return;\n }\n\n /*\n * Show the up-next tile when the video has finished\n */\n if (this.player.ended()) {\n this.showUpNext();\n }\n }\n\n private showUpNext(): void {\n if (this.upNextRendered)\n return;\n\n this.upNextRendered = true;\n\n this.player.addChild('UpNext', {\n nextVideo: this.nextVideo,\n onPlayNext: this.callback,\n onCancel: () => {\n this.hideUpNext();\n this.setShouldPlayNext(false);\n }\n });\n }\n\n private hideUpNext(): void {\n if (!this.upNextRendered)\n return;\n\n this.upNextRendered = false;\n\n const upNext = this.player.getChild('UpNext');\n\n if (upNext) {\n this.player.removeChild(upNext);\n upNext.dispose();\n }\n }\n\n private testHasLocalStorage(): boolean {\n try {\n window.localStorage.setItem(TEST, 'persistPlayNext');\n window.localStorage.removeItem(TEST);\n return true;\n } catch {\n return false;\n }\n }\n}\n\nvideojs.registerPlugin('nextVideoPlugin', NextVideoPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n nextVideoPlugin(): NextVideoPlugin;\n }\n}\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport './loop-video-menu-item.scss';\n\nconst MenuItem = videojs.getComponent('MenuItem');\n\nexport class LoopVideoMenuItem extends MenuItem {\n private toggleEl: Element;\n\n /**\n * Because we want to bind our listener in createEl\n * and createEl runs in super. We store if we've bounud\n * our handler, so we only call bind once and \n * the call to removeEventListener will still work\n */\n private handlerBound: boolean;\n\n constructor(player: VideoJsPlayer, options: videojs.ComponentOptions) {\n super(player, options);\n\n this.onLoopVideoChange = this.onLoopVideoChange.bind(this);\n\n this.player_.on('cv:loopvideo', this.onLoopVideoChange);\n\n this.onLoopVideoChange(null, this.player_.loopVideoPlugin().loop());\n }\n\n private onLoopVideoChange(_: any, enabled: boolean): void {\n enabled ? this.toggleOn() : this.toggleOff();\n }\n\n public handleToggle(): void {\n const loop = this.player_.loopVideoPlugin().loop();\n\n this.player_.loopVideoPlugin().loop(!loop);\n }\n\n private toggleOn(): void {\n videojs.dom.addClass(this.toggleEl, 'on');\n }\n\n private toggleOff(): void {\n videojs.dom.removeClass(this.toggleEl, 'on');\n }\n\n /**\n * Because we extend MenuItem which will close the menu by default\n * we need to halt the event propogation here\n */\n public handleClick(event: videojs.EventTarget.Event): void {\n event.stopImmediatePropagation();\n }\n\n public createEl(tagName?: string, properties?: any, attributes?: any): HTMLLIElement {\n /**\n * Bind our event listener only once\n * see the comment where handlerBound is defined\n */\n if (!this.handlerBound) {\n this.handleToggle = this.handleToggle.bind(this);\n this.handlerBound = true;\n }\n\n if (this.toggleEl)\n this.toggleEl.removeEventListener('click', this.handleToggle);\n\n this.toggleEl = videojs.dom.createEl('div', {\n className: `custom-toggle custom-toggle-info toggle-option float-end`,\n innerHTML: '<span class=\"handle\"></span></div>'\n });\n this.toggleEl.addEventListener('click', this.handleToggle);\n\n const innerHTML = `\n <span class=\"vjs-menu-item-text\">Loop video</span>\n <span class=\"cv-toggle-container\"></span>`;\n\n const el = super.createEl(tagName, {\n className: 'vjs-menu-item cv-cog-menu-item cv-loop-video-toggle',\n innerHTML\n }, attributes);\n\n /**\n * Indexing into the child this way is only safe to do because\n * we know that the el only has two children\n */\n el.children[1].appendChild(this.toggleEl);\n\n return el;\n }\n\n public dispose(): void {\n this.player_.off('cv:loopvideo', this.onLoopVideoChange);\n super.dispose();\n }\n}\n\nvideojs.registerComponent('LoopVideoMenuItem', LoopVideoMenuItem);\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport { CogButton } from 'projects/player/components/cog-button/cog-button';\n\nimport 'projects/player/plugins/loop-video-plugin/components/loop-video-menu-item';\n\nconst Plugin = videojs.getPlugin('plugin');\nconst LoopVideoMenuItem = videojs.getComponent('LoopVideoMenuItem') as unknown as typeof videojs.MenuItem;\n\ninterface LoopVideoPluginOptions {\n allowLoop: boolean;\n}\n\nclass LoopVideoPlugin extends Plugin {\n constructor(player: VideoJsPlayer, options: LoopVideoPluginOptions) {\n super(player);\n\n // Button must be added after ctor finishes, otherwise subsequent calls to\n // this.player.loopVideoPlugin() will try make a new plugin - Sha\n if (options.allowLoop)\n this.player.ready(() => this.addButton());\n\n this.onEnded = this.onEnded.bind(this);\n this.player.on('ended', this.onEnded);\n }\n\n private addButton(): void {\n /**\n * Check additionalItemOrder in cog-button.ts if you need to change the order. - Sha\n */\n const cogButton = this.player.getChild('collapserator')?.getChild('cogButton') as CogButton;\n cogButton.addItem({ ctor: LoopVideoMenuItem, name: 'LoopVideoMenuItem' });\n }\n\n private onEnded(): void {\n // turns out the regular loop functionality doesn't work with clips.\n // this call will just do nothing for videos - Sha\n if (this.player.loop())\n this.player.play();\n }\n\n public loop(enabled: boolean): void;\n public loop(): boolean ;\n public loop(enabled?: boolean): any {\n if (typeof enabled !== 'boolean')\n return this.player.loop();\n\n if (enabled)\n this.player.nextVideoPlugin?.()?.setShouldPlayNext(false, false);\n\n this.player.trigger('cv:loopvideo', enabled);\n this.player.loop(enabled);\n }\n\n public dispose(): void {\n this.player.off('ended', this.onEnded);\n super.dispose();\n }\n}\n\nvideojs.registerPlugin('loopVideoPlugin', LoopVideoPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n loopVideoPlugin(options?: LoopVideoPluginOptions): LoopVideoPlugin;\n }\n}\n"],"mappings":"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"}
|