@clickview/lite 0.104.0-rc.0 → 0.104.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.vite/manifest.json +686 -686
- package/dist/bundles.json +1 -1
- package/dist/en.json +1 -1
- package/dist/scripts/{BYC-9gzd.chunk.js → 6BvA1WyF.chunk.js} +2 -2
- package/dist/scripts/{BYC-9gzd.chunk.js.map → 6BvA1WyF.chunk.js.map} +1 -1
- package/dist/scripts/B1hsuVfV2.chunk.js +2 -0
- package/dist/scripts/{BwBWuxjr2.chunk.js.map → B1hsuVfV2.chunk.js.map} +1 -1
- package/dist/scripts/{CFxoQ45v.chunk.js → B4GpjPP-.chunk.js} +2 -2
- package/dist/scripts/{CFxoQ45v.chunk.js.map → B4GpjPP-.chunk.js.map} +1 -1
- package/dist/scripts/{HyBCRhmv2.chunk.js → BAYtWmRb2.chunk.js} +3 -3
- package/dist/scripts/{HyBCRhmv2.chunk.js.map → BAYtWmRb2.chunk.js.map} +1 -1
- package/dist/scripts/{CVEuWE2q2.chunk.js → BBAIRd3r2.chunk.js} +2 -2
- package/dist/scripts/{CVEuWE2q2.chunk.js.map → BBAIRd3r2.chunk.js.map} +1 -1
- package/dist/scripts/{C2Hgija5.chunk.js → BGH3t983.chunk.js} +2 -2
- package/dist/scripts/{C2Hgija5.chunk.js.map → BGH3t983.chunk.js.map} +1 -1
- package/dist/scripts/{DsSd-eh2.chunk.js → BIjzNf4b.chunk.js} +2 -2
- package/dist/scripts/{DsSd-eh2.chunk.js.map → BIjzNf4b.chunk.js.map} +1 -1
- package/dist/scripts/{D20SeFH5.chunk.js → BLad2z5b.chunk.js} +2 -2
- package/dist/scripts/{D20SeFH5.chunk.js.map → BLad2z5b.chunk.js.map} +1 -1
- package/dist/scripts/{BklRyGO0.chunk.js → BMZNQKEe.chunk.js} +2 -2
- package/dist/scripts/{BklRyGO0.chunk.js.map → BMZNQKEe.chunk.js.map} +1 -1
- package/dist/scripts/{BOuzZEkK2.chunk.js → BPjqerK42.chunk.js} +2 -2
- package/dist/scripts/BPjqerK42.chunk.js.map +1 -0
- package/dist/scripts/{fjQ026Rz2.chunk.js → BQS6kDvJ2.chunk.js} +2 -2
- package/dist/scripts/{fjQ026Rz2.chunk.js.map → BQS6kDvJ2.chunk.js.map} +1 -1
- package/dist/scripts/{CnfcodVE2.chunk.js → BeOS0_E02.chunk.js} +2 -2
- package/dist/scripts/{CnfcodVE2.chunk.js.map → BeOS0_E02.chunk.js.map} +1 -1
- package/dist/scripts/{kz-JIHlB2.chunk.js → Bnyn-It62.chunk.js} +2 -2
- package/dist/scripts/{kz-JIHlB2.chunk.js.map → Bnyn-It62.chunk.js.map} +1 -1
- package/dist/scripts/{BbKY_Dwq.chunk.js → CJCh1Gq6.chunk.js} +2 -2
- package/dist/scripts/{BbKY_Dwq.chunk.js.map → CJCh1Gq6.chunk.js.map} +1 -1
- package/dist/scripts/{CoUj6M-_.chunk.js → CKGiikBV.chunk.js} +2 -2
- package/dist/scripts/{CoUj6M-_.chunk.js.map → CKGiikBV.chunk.js.map} +1 -1
- package/dist/scripts/{B8t1n8_x2.chunk.js → CL5P1KMy2.chunk.js} +2 -2
- package/dist/scripts/{B8t1n8_x2.chunk.js.map → CL5P1KMy2.chunk.js.map} +1 -1
- package/dist/scripts/{Bz-3cXSL.chunk.js → CMKTpGri.chunk.js} +2 -2
- package/dist/scripts/{Bz-3cXSL.chunk.js.map → CMKTpGri.chunk.js.map} +1 -1
- package/dist/scripts/{ByMZucv2.chunk.js → CgL1gDuH.chunk.js} +2 -2
- package/dist/scripts/{ByMZucv2.chunk.js.map → CgL1gDuH.chunk.js.map} +1 -1
- package/dist/scripts/{VDqAyMTi2.chunk.js → ClMXRZea2.chunk.js} +2 -2
- package/dist/scripts/{VDqAyMTi2.chunk.js.map → ClMXRZea2.chunk.js.map} +1 -1
- package/dist/scripts/{Bw2cauzs2.chunk.js → Cm6SLr7W2.chunk.js} +3 -3
- package/dist/scripts/{Bw2cauzs2.chunk.js.map → Cm6SLr7W2.chunk.js.map} +1 -1
- package/dist/scripts/{gF9PGTMC.chunk.js → Cmjtel65.chunk.js} +2 -2
- package/dist/scripts/{gF9PGTMC.chunk.js.map → Cmjtel65.chunk.js.map} +1 -1
- package/dist/scripts/{DwLSTi6C.chunk.js → CnYpIR5V.chunk.js} +2 -2
- package/dist/scripts/{DwLSTi6C.chunk.js.map → CnYpIR5V.chunk.js.map} +1 -1
- package/dist/scripts/{BpFyfI-52.chunk.js → D2vAOC7r2.chunk.js} +2 -2
- package/dist/scripts/{BpFyfI-52.chunk.js.map → D2vAOC7r2.chunk.js.map} +1 -1
- package/dist/scripts/{29-YRbOp.chunk.js → D4uneRs9.chunk.js} +2 -2
- package/dist/scripts/{29-YRbOp.chunk.js.map → D4uneRs9.chunk.js.map} +1 -1
- package/dist/scripts/{DbQFpTve.chunk.js → DIeIfhGe.chunk.js} +2 -2
- package/dist/scripts/{DbQFpTve.chunk.js.map → DIeIfhGe.chunk.js.map} +1 -1
- package/dist/scripts/{CrGWZr2R2.chunk.js → DRHbASmP2.chunk.js} +2 -2
- package/dist/scripts/{CrGWZr2R2.chunk.js.map → DRHbASmP2.chunk.js.map} +1 -1
- package/dist/scripts/{n4utAY5E2.chunk.js → DTnfO2MH2.chunk.js} +2 -2
- package/dist/scripts/{n4utAY5E2.chunk.js.map → DTnfO2MH2.chunk.js.map} +1 -1
- package/dist/scripts/{BcMb1XKL.chunk.js → DUJvtd00.chunk.js} +2 -2
- package/dist/scripts/{BcMb1XKL.chunk.js.map → DUJvtd00.chunk.js.map} +1 -1
- package/dist/scripts/{B0DGioRk.chunk.js → DWz2oR7C.chunk.js} +2 -2
- package/dist/scripts/{B0DGioRk.chunk.js.map → DWz2oR7C.chunk.js.map} +1 -1
- package/dist/scripts/{CTUTwtJp.chunk.js → DZD8iLCw.chunk.js} +2 -2
- package/dist/scripts/{CTUTwtJp.chunk.js.map → DZD8iLCw.chunk.js.map} +1 -1
- package/dist/scripts/{C-gsezmj.chunk.js → D_foXB2p.chunk.js} +2 -2
- package/dist/scripts/{C-gsezmj.chunk.js.map → D_foXB2p.chunk.js.map} +1 -1
- package/dist/scripts/{Br8WvETm.chunk.js → Dhv7zSEB.chunk.js} +2 -2
- package/dist/scripts/{Br8WvETm.chunk.js.map → Dhv7zSEB.chunk.js.map} +1 -1
- package/dist/scripts/{B6p7xJj9.chunk.js → DpHKtTzO.chunk.js} +2 -2
- package/dist/scripts/{B6p7xJj9.chunk.js.map → DpHKtTzO.chunk.js.map} +1 -1
- package/dist/scripts/{DynqFaq92.chunk.js → GcexF25w2.chunk.js} +2 -2
- package/dist/scripts/{DynqFaq92.chunk.js.map → GcexF25w2.chunk.js.map} +1 -1
- package/dist/scripts/{DYN56vJ6.chunk.js → _XhYAc8v.chunk.js} +2 -2
- package/dist/scripts/{DYN56vJ6.chunk.js.map → _XhYAc8v.chunk.js.map} +1 -1
- package/dist/scripts/{app-4vEzpLow.js → app-DamRTcio.js} +4 -4
- package/dist/scripts/{app-4vEzpLow.js.map → app-DamRTcio.js.map} +1 -1
- package/dist/scripts/{B2PLlkVH.chunk.js → dZhIkfV6.chunk.js} +3 -3
- package/dist/scripts/{B2PLlkVH.chunk.js.map → dZhIkfV6.chunk.js.map} +1 -1
- package/dist/scripts/{DZQhE4mm.chunk.js → eSX6I2aK.chunk.js} +2 -2
- package/dist/scripts/{DZQhE4mm.chunk.js.map → eSX6I2aK.chunk.js.map} +1 -1
- package/dist/scripts/{DnogtDGY2.chunk.js → gTfMMiRw2.chunk.js} +2 -2
- package/dist/scripts/{DnogtDGY2.chunk.js.map → gTfMMiRw2.chunk.js.map} +1 -1
- package/dist/scripts/{DYW8v4_j2.chunk.js → xUmhnDE42.chunk.js} +2 -2
- package/dist/scripts/{DYW8v4_j2.chunk.js.map → xUmhnDE42.chunk.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/BOuzZEkK2.chunk.js.map +0 -1
- package/dist/scripts/BwBWuxjr2.chunk.js +0 -2
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"./DAXXjFlN.chunk.js";import{t as e}from"./C2w0pmFW.chunk.js";import{t}from"./wrLrTezN.chunk.js";import{u as n}from"./BX0wDJmp.chunk.js";import{t as r}from"./DZssmXj6.chunk.js";import{t as i}from"./CqrjHjAN.chunk.js";import{t as a}from"./D_gWf2lC.chunk.js";import{t as o}from"./DruDe9vI.chunk.js";import{n as s,t as c}from"./C6-aC3vu.chunk.js";import{n as l,t as u}from"./BGhJ8TEx.chunk.js";import{t as d}from"./7LGxCHGV.chunk.js";import{c as f,t as p}from"./
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import"./DAXXjFlN.chunk.js";import{t as e}from"./C2w0pmFW.chunk.js";import{t}from"./wrLrTezN.chunk.js";import{u as n}from"./BX0wDJmp.chunk.js";import{t as r}from"./DZssmXj6.chunk.js";import{t as i}from"./CqrjHjAN.chunk.js";import{t as a}from"./D_gWf2lC.chunk.js";import{t as o}from"./DruDe9vI.chunk.js";import{n as s,t as c}from"./C6-aC3vu.chunk.js";import{n as l,t as u}from"./BGhJ8TEx.chunk.js";import{t as d}from"./7LGxCHGV.chunk.js";import{c as f,t as p}from"./Cm6SLr7W2.chunk.js";import{t as m}from"./BTd65Rcb2.chunk.js";import{t as h}from"./DbyH1eEj.chunk.js";e();var g=t();function _(e){let t=n(i.currentUser()),_=n(!!t.data&&r.sharedClip(e.objectId,e.shareId)),v=n(a.config()),y=n(u.createViewKey(e.shareId,l.Share)),b=n(o.getShareObject(e.shareId)),x=f(e.objectId);function S(e){e.one(`cv-playback-data-loaded`,()=>{m.remove()})}return c(s.getClipMetadata({content:_.data})),d(_,{private:h}),_.data&&t.hasCompleted&&v.hasCompleted&&y.hasCompleted&&b.hasCompleted&&x.hasCompleted?(0,g.jsx)(p,{config:v.data,video:_.data,currentUser:t.data,shareLink:b.data,viewKey:y.data,presentationSlug:null,embed:!0,showResources:!0,autoplay:e.queryParams.a===`true`,startTime:e.queryParams.t??e.queryParams.startTime,onReady:S,playerIntegrations:x.data}):(0,g.jsx)(g.Fragment,{})}export{_ as EmbeddedClipView};
|
|
2
|
+
//# sourceMappingURL=DpHKtTzO.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"DpHKtTzO.chunk.js","names":[],"sources":["../../src/apps/embed/views/embedded-clip/EmbeddedClipView.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { PlayerReference } from 'libs/shared/context/player-context/interfaces/PlayerReference';\nimport { MediaIdType } from 'libs/shared/enums/MediaIdType';\nimport { ClipRequests } from 'libs/shared/flight-requests/ClipRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { PlayerRequests } from 'libs/shared/flight-requests/PlayerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useCannotConsumeError } from 'libs/shared/hooks/useCannotConsumeError';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Clip, Config, CurrentUser, PlayerViewKey, UnionShareObject } from 'libs/shared/interfaces';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { usePlayerIntegrations } from 'shared/hooks/usePlayerIntegrations';\nimport { LitePlayerView } from 'shared/views/lite-player/LitePlayerView';\n\nimport { PrivateEmbedError } from 'apps/embed/errors/forbidden/PrivateEmbedError';\nimport { EmbedViewProps } from 'apps/embed/interfaces/EmbedViewProps';\nimport { EmbedPlaceHolderHelper } from 'apps/embed/utils/EmbedPlaceholderHelper';\n\nexport function EmbeddedClipView(props: EmbedViewProps): JSX.Element {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const clip = Flight.useBasicFetch<Clip>(!!currentUser.data &&\n ClipRequests.sharedClip(props.objectId, props.shareId));\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const viewKey = Flight.useBasicFetch<PlayerViewKey>(PlayerRequests.createViewKey(props.shareId, MediaIdType.Share));\n const shareLink = Flight.useBasicFetch<UnionShareObject>(\n ShareRequests.getShareObject(props.shareId)\n );\n const playerIntegrations = usePlayerIntegrations(props.objectId);\n\n function onReady(player: PlayerReference): void {\n player.one('cv-playback-data-loaded', () => {\n EmbedPlaceHolderHelper.remove();\n });\n }\n\n useSetPageMetadata(PageMetadataHelper.getClipMetadata({ content: clip.data }));\n useCannotConsumeError(clip, { private: PrivateEmbedError });\n\n const hasLoaded = (\n clip.data &&\n currentUser.hasCompleted &&\n config.hasCompleted &&\n viewKey.hasCompleted &&\n shareLink.hasCompleted &&\n playerIntegrations.hasCompleted\n );\n\n if (!hasLoaded)\n return <></>;\n\n return (\n <LitePlayerView\n config={config.data}\n video={clip.data}\n currentUser={currentUser.data}\n shareLink={shareLink.data}\n viewKey={viewKey.data}\n presentationSlug={null}\n embed\n showResources\n autoplay={props.queryParams.a === 'true'}\n startTime={props.queryParams.t ?? props.queryParams.startTime}\n onReady={onReady}\n playerIntegrations={playerIntegrations.data}\n />\n );\n}\n"],"mappings":"okBAuBA,SAAgB,EAAiB,EAAoC,CACnE,IAAM,EAAc,EAAkC,EAAa,YAAY,CAAC,EAC1E,EAAO,EAA2B,CAAC,CAAC,EAAY,MACpD,EAAa,WAAW,EAAM,SAAU,EAAM,OAAO,CAAC,EAClD,EAAS,EAA6B,EAAe,OAAO,CAAC,EAC7D,EAAU,EAAoC,EAAe,cAAc,EAAM,QAAS,EAAY,KAAK,CAAC,EAC5G,EAAY,EAChB,EAAc,eAAe,EAAM,OAAO,CAC5C,EACM,EAAqB,EAAsB,EAAM,QAAQ,EAE/D,SAAS,EAAQ,EAA+B,CAC9C,EAAO,IAAI,8BAAiC,CAC1C,EAAuB,OAAO,CAChC,CAAC,CACH,CAiBA,OAfA,EAAmB,EAAmB,gBAAgB,CAAE,QAAS,EAAK,IAAK,CAAC,CAAC,EAC7E,EAAsB,EAAM,CAAE,QAAS,CAAkB,CAAC,EAGxD,EAAK,MACL,EAAY,cACZ,EAAO,cACP,EAAQ,cACR,EAAU,cACV,EAAmB,cAOnB,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,OAAQ,EAAO,KACf,MAAO,EAAK,KACZ,YAAa,EAAY,KACzB,UAAW,EAAU,KACrB,QAAS,EAAQ,KACjB,iBAAkB,KAClB,MAAA,GACA,cAAA,GACA,SAAU,EAAM,YAAY,IAAM,OAClC,UAAW,EAAM,YAAY,GAAK,EAAM,YAAY,UAC3C,UACT,mBAAoB,EAAmB,IACxC,CAAA,GAhBM,EAAA,EAAA,IAAA,CAAA,EAAA,SAAA,CAAI,CAAA,CAkBf"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{o as e}from"./DAXXjFlN.chunk.js";import{t}from"./snXCXfT6.chunk.js";import{_ as n,y as r}from"./BftnFbcr.chunk.js";import"./DFZS3Ffo.chunk.js";import{n as i}from"./B785hxeE.chunk.js";import{t as a}from"./CQyJ7YGa.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{u as l}from"./BX0wDJmp.chunk.js";import{t as u}from"./C1SLt-ar.chunk.js";import{U as d,l as f,o as p,y as m,z as h}from"./NlCAcBdo.chunk.js";import{i as g,n as _,r as v,t as y}from"./Cr6TXzQQ2.chunk.js";import{n as b,t as x}from"./CmcCVXi32.chunk.js";import{t as ee}from"./DGmmTRu72.chunk.js";import{t as S}from"./DZX1tZ-D2.chunk.js";import{t as C}from"./CqrjHjAN.chunk.js";import{t as w}from"./eoAypzU3.chunk.js";import{t as T}from"./XIE88U01.chunk.js";import{t as te}from"./7-GJWRH82.chunk.js";import{t as E}from"./BJZXCSV9.chunk.js";import{n as D,t as O}from"./C6-aC3vu.chunk.js";import{t as k}from"./B3gsVN-_.chunk.js";import{t as A}from"./B_-pJtOI2.chunk.js";import{n as j}from"./CpFtf-tI2.chunk.js";import{t as M}from"./CCdnFnNP.chunk.js";import{t as N}from"./De16zmhB.chunk.js";import{t as ne}from"./DewCxv4i.chunk.js";import{t as re}from"./B8gP8YoA.chunk.js";import{t as ie}from"./IgoS6DLn2.chunk.js";import{t as P}from"./tmS8JSuZ.chunk.js";import{t as F}from"./CXqh4A92.chunk.js";import{t as I}from"./BnuuRu_J2.chunk.js";import{t as L}from"./DDiorDZl.chunk.js";import{t as R}from"./CY_30Xdt.chunk.js";import{o as z}from"./CpgHBpMp.chunk.js";import{n as B,t as V}from"./By1soXyj.chunk.js";import{t as H}from"./CC5Dr9aG.chunk.js";import{r as U}from"./yk6K0dmz.chunk.js";import{n as W,t as G}from"./2GJYUMeO2.chunk.js";import{t as K}from"./D8S2psJy2.chunk.js";import{t as q}from"./C8aOMmXJ2.chunk.js";import{t as J}from"./BS8h2yaF2.chunk.js";import{t as ae}from"./
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{o as e}from"./DAXXjFlN.chunk.js";import{t}from"./snXCXfT6.chunk.js";import{_ as n,y as r}from"./BftnFbcr.chunk.js";import"./DFZS3Ffo.chunk.js";import{n as i}from"./B785hxeE.chunk.js";import{t as a}from"./CQyJ7YGa.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{u as l}from"./BX0wDJmp.chunk.js";import{t as u}from"./C1SLt-ar.chunk.js";import{U as d,l as f,o as p,y as m,z as h}from"./NlCAcBdo.chunk.js";import{i as g,n as _,r as v,t as y}from"./Cr6TXzQQ2.chunk.js";import{n as b,t as x}from"./CmcCVXi32.chunk.js";import{t as ee}from"./DGmmTRu72.chunk.js";import{t as S}from"./DZX1tZ-D2.chunk.js";import{t as C}from"./CqrjHjAN.chunk.js";import{t as w}from"./eoAypzU3.chunk.js";import{t as T}from"./XIE88U01.chunk.js";import{t as te}from"./7-GJWRH82.chunk.js";import{t as E}from"./BJZXCSV9.chunk.js";import{n as D,t as O}from"./C6-aC3vu.chunk.js";import{t as k}from"./B3gsVN-_.chunk.js";import{t as A}from"./B_-pJtOI2.chunk.js";import{n as j}from"./CpFtf-tI2.chunk.js";import{t as M}from"./CCdnFnNP.chunk.js";import{t as N}from"./De16zmhB.chunk.js";import{t as ne}from"./DewCxv4i.chunk.js";import{t as re}from"./B8gP8YoA.chunk.js";import{t as ie}from"./IgoS6DLn2.chunk.js";import{t as P}from"./tmS8JSuZ.chunk.js";import{t as F}from"./CXqh4A92.chunk.js";import{t as I}from"./BnuuRu_J2.chunk.js";import{t as L}from"./DDiorDZl.chunk.js";import{t as R}from"./CY_30Xdt.chunk.js";import{o as z}from"./CpgHBpMp.chunk.js";import{n as B,t as V}from"./By1soXyj.chunk.js";import{t as H}from"./CC5Dr9aG.chunk.js";import{r as U}from"./yk6K0dmz.chunk.js";import{n as W,t as G}from"./2GJYUMeO2.chunk.js";import{t as K}from"./D8S2psJy2.chunk.js";import{t as q}from"./C8aOMmXJ2.chunk.js";import{t as J}from"./BS8h2yaF2.chunk.js";import{t as ae}from"./B1hsuVfV2.chunk.js";var oe=e(o()),Y=s();function se(e){let n=L.getPartnerLinkByType(e.partnerProfile?.links,`website`,L.makeUTMs({slug:e.partnerProfile._slug.value})),r=S.getHostname(n)??n;return(0,Y.jsx)(`div`,{className:`mt-3`,children:(0,Y.jsx)(q,{children:()=>(0,Y.jsxs)(`p`,{className:`mb-0`,children:[n&&(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsxs)(`a`,{href:n,target:`_blank`,rel:`noopener noreferrer`,className:`position-relative d-inline-block ps-4 mb-2 me-2`,children:[(0,Y.jsx)(t,{svg:N,className:`svg-container position-absolute top-50 start-0 translate-middle-y`}),(0,Y.jsx)(`span`,{className:`ps-1`,children:r})]}),(0,Y.jsx)(`span`,{className:`mb-2 me-2`,children:`•`})]}),e.partnerProfile.description]})})})}var X=`contentPartners.contentPartnerDashboardComingSoon`,ce=a.encloseNamespace(X);function le(e){return(0,Y.jsxs)(E,{children:[(0,Y.jsx)(E.Image,{src:e.comingSoonImageUrl,altText:ce(`description`,{partnerName:e.partnerName})}),(0,Y.jsx)(E.Heading,{children:(0,Y.jsx)(j,{namespace:X,phrase:`heading`})}),(0,Y.jsx)(E.Info,{children:(0,Y.jsx)(j,{namespace:X,phrase:`description`,options:{partnerName:e.partnerName}})})]})}var Z=`contentPartners.contentPartnerDashboardContentRegion`,Q=a.encloseNamespace(Z);function ue(e){return(0,Y.jsxs)(E,{children:[(0,Y.jsx)(E.Image,{src:e.contentRegionImageUrl,altText:Q(`imageAlt`)}),(0,Y.jsx)(E.Heading,{children:(0,Y.jsx)(j,{namespace:Z,phrase:`heading`})}),(0,Y.jsx)(E.Cta,{text:Q(`cta`),appLink:e.contentRegionButtonLink,className:`btn btn-dark`})]})}var $=`contentPartners.contentPartnerDashboardNoContent`,de=a.encloseNamespace($);function fe(e){return(0,Y.jsxs)(E,{children:[(0,Y.jsx)(E.Image,{src:e.noContentImageUrl,altText:de(`description`)}),(0,Y.jsx)(E.Heading,{children:(0,Y.jsx)(j,{namespace:$,phrase:`heading`})}),(0,Y.jsx)(E.Info,{children:(0,Y.jsx)(j,{namespace:$,phrase:`description`})})]})}var pe={"coming-soon":le,"content-region":ue,"no-content":fe};function me(e){let t=pe[e.type];return(0,Y.jsx)(t,{...e})}var he=[g.ContentPartnerVideos];function ge(e,t){let n=e[t];return n?he.includes(n.widgetId)&&t===e.length-1:!1}function _e(e){let t=u.sortBy(e.dashboard?.widgets,`index`),{emptyWidgets:n,setEmptyWidget:r}=B(t);function a(t,n,r,i){let a=v.getWidgetParams(n,r,v.getDashboardTargetType(e.dashboard));return e.getWidgetContentRequest(t,a,r,void 0,i)}function o(){if(!e.isInContentRegion)return`content-region`;if(e.isComingSoon||e.dashboard.status===x.Archived&&!e.isReadonly)return`coming-soon`;if(e.dashboard.status===x.Draft&&!e.isPreviewing)return!1;if(!t?.length)return`no-content`;let r=Object.values(n);return r.length>0&&r.every(e=>!!e)?`no-content`:!1}let s=L.getPartnerBannerInfo(e.partnerProfile),c=o(),l=(!c||c===`content-region`)&&e.partnerProfile.description;return(0,Y.jsxs)(Y.Fragment,{children:[!!t.length&&(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(R,{type:`partner-profile`,partnerBannerType:L.getPartnerBannerType(e.partnerProfile),heading:s.heading,blockColourClass:s.blockColourClass,logo:s.logo,logoBgColour:s.logoBgColour,banner:s.banner,imageCdnUrl:e.commonVideoProps.imageCdnUrl,actions:e.getBannerActions?.(),onClickSignUp:e.onClickSignUp,isAuthenticated:e.isAuthenticated,videoUrl:e.partnerProfile._videobanner?.value?.url,websiteUrl:L.getPartnerLinkByType(e.partnerProfile?.links,`website`,L.makeUTMs({slug:e.partnerProfile._slug.value})),isStudent:e.hasPermissions(i.StudentExperience),log:e.log}),(0,Y.jsxs)(`div`,{className:`py-3 mb-3 border-bottom`,children:[(0,Y.jsx)(F,{breadcrumbs:e.breadcrumbs}),l&&(0,Y.jsx)(se,{partnerProfile:e.partnerProfile})]}),(0,Y.jsx)(`div`,{className:`mt-3`,children:!c&&t.map((n,i)=>(0,Y.jsx)(K,{dashboardTarget:b.PartnerProfile,index:i,item:n,infiniteFetch:ge(t,i),getName:e=>e.name,getWidgetMetadata:e=>e.metadata,appLinks:e.widgetAppLinks,hasPermissions:e.hasPermissions,commonVideoProps:e.commonVideoProps,audiences:e.audiences,setIsEmpty:e=>r(n.id,e),getCursor:e=>e.cursor,getRequest:e=>a(n.id,n.widgetId,n.templateId,e),hasLocalPermissions:e.hasLocalPermissions,settingsHash:e.settings,getContent:e=>e.content,resultsTransformers:y.getWidgetResultsTransformers(),onClickSearchAllVideos:e.onClickSearchAllVideos,getSeeMoreAppLink:e.getSeeMoreAppLink,isEmptyPredicate:e=>Array.isArray(e)&&Array.isArray(e[0]?.content)&&!e[0]?.content?.length,getSelectedItems:null,appLinkOptions:null},n.id))})]}),c&&(0,Y.jsx)(me,{type:c,partnerName:e.partnerProfile.name,comingSoonImageUrl:e.emptyImageUrl,contentRegionImageUrl:e.emptyImageUrl,contentRegionButtonLink:e.widgetAppLinks?.partnerHome?.(),noContentImageUrl:e.emptyImageUrl})]})}function ve(){return{"click-video-banner-controls":{isValid:()=>!0,analyticsOptions:{actionType:h.Click,entity:f.PartnerProfile,descriptor:p.VideoBannerControls,location:m.ContentPartnerDashboardVideoBanner}},"click-video-banner-sign-up":{isValid:()=>!0,analyticsOptions:{actionType:h.Click,entity:f.PartnerProfile,workflowPhase:d.Start,descriptor:p.VideoBannerSignUp,location:m.ContentPartnerDashboardVideoBanner}}}}function ye(e){let{getData:t,log:n}=P({analyticsOptions:e.analyticsOptions,baseData:e.data,config:ve(),shouldLog:e.shouldLog??!0});return{log:n,getData:t}}var be=a.encloseNamespace(`contentPartners.dashboard`);function xe(e){let t=l(C.currentUser()),i=ie(e.slug),a=W({location:G.VideoItem,presentationSlug:null}),{log:o}=ye({data:{entity:{id:i.data?.id,name:i.data?.name,contentRegion:t.data?.contentRegion}},analyticsOptions:{entity:f.PartnerProfile,location:m.ContentPartnerDashboard}});ae({app:`channels`,id:i.data?.id,metadata:{conversionSuffix:i.data?.name}});let{openInCurationStudioLabel:s,isUserCurator:u,getOpenInCurationStudioLink:d}=U(),{commonVideoProps:p}=I({locationContext:m.VideoThumbnail}),{hasPermissions:h,hasLocalPermissions:g}=k(),v=ee(null),{dashboard:y,isPreviewing:x}=re({targetType:b.PartnerProfile,partnerProfileSlug:e.slug,queryParams:e.queryParams});O(D.getDefaultMetadata({title:i.data?.name,phraseContext:{phraseHandler:be,titlePhrase:`pageTitle`,descriptionPhrase:`pageDescription`},allowIndexing:!0}));let S=H({name:i.data?.name});oe.useEffect(()=>{!y.hasCompleted||y.data||n.throw(new T)},[y.data,y.hasCompleted]);let E=V(t.data,{channelId:i.data?.id,presentationSlug:null});function j(){return u?[{label:s,href:d(y.data?.typeId,y.data?.id),openInNewTab:!0}]:[]}function N(e,t,n,r,i){return ne.dashboardWidgetContent(e,t,n,r,{cursor:i})}function P(e){return _[e.widgetId]?.getCollectionAppLink?.(E,e.content)??null}function F(e){o?.({type:`click-video-banner-sign-up`,email:e}),r.trigger(M.getSignUpAppLink({email:e}))}let R=i.hasCompleted&&y.hasCompleted,B=A.isBot(),K=x?!0:L.isInContentRegion(i.data,t.data?.contentRegion,t.data?.isAuthenticated);function q(){r.trigger({application:c.SEARCH,action:w.Search.HOME,params:{scopeId:i.data?.id}})}return R?(0,Y.jsx)(`div`,{className:`bg-white px-4 position-relative`,children:(0,Y.jsxs)(z.Provider,{value:a,children:[!!(x&&y.data)&&(0,Y.jsx)(J,{status:y.data.status,type:`channel`}),(0,Y.jsx)(_e,{dashboard:y.data,partnerProfile:i.data,getWidgetContentRequest:N,commonVideoProps:p,breadcrumbs:S,getBannerActions:j,hasPermissions:h,hasLocalPermissions:g,settings:v,widgetAppLinks:E,emptyImageUrl:te.EmptyStates.WATCH_HISTORY,isBot:B,lazyLoad:!B,isAuthenticated:t.data?.isAuthenticated,isInContentRegion:K,onClickSignUp:F,isPreviewing:x,onClickSearchAllVideos:q,getSeeMoreAppLink:P,log:o})]})}):(0,Y.jsx)(Y.Fragment,{})}export{xe as ContentPartnersDashboardView};
|
|
2
|
+
//# sourceMappingURL=GcexF25w2.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DynqFaq92.chunk.js","names":[],"sources":["../../../../libs/shared/src/apps/content-partners/components/content-partner-dashboard/channel-dashboard-description/ChannelDashboardDescription.tsx","../../../../libs/shared/src/apps/content-partners/components/content-partner-dashboard/empty-state/content-partner-dashboard-coming-soon/ContentPartnerDashboardComingSoon.tsx","../../../../libs/shared/src/apps/content-partners/components/content-partner-dashboard/empty-state/content-partner-dashboard-content-region/ContentPartnerDashboardContentRegion.tsx","../../../../libs/shared/src/apps/content-partners/components/content-partner-dashboard/empty-state/content-partner-dashboard-no-content/ContentPartnerDashboardNoContent.tsx","../../../../libs/shared/src/apps/content-partners/components/content-partner-dashboard/empty-state/content-partner-empty-state/ContentPartnerEmptyState.tsx","../../../../libs/shared/src/apps/content-partners/components/content-partner-dashboard/ContentPartnerDashboard.tsx","../../../../libs/shared/src/apps/content-partners/utils/get-content-partner-event-logger/getContentPartnerEventLogger.ts","../../src/apps/content-partners/views/content-partners-dashboard/ContentPartnersDashboardView.tsx"],"sourcesContent":["import React from 'react';\n\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\n\nimport { ContentPartnersHelper } from 'libs/shared/apps/content-partners/utils/ContentPartnersHelper';\nimport { ExpandableTextInline } from 'libs/shared/components/expandable-text-inline/ExpandableTextInline';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { LinkSvg } from 'libs/shared/images/svg/objects/LinkSvg';\nimport { PartnerProfile } from 'libs/shared/interfaces';\n\ninterface ChannelDashboardDescriptionProps {\n partnerProfile: PartnerProfile;\n}\n\nexport function ChannelDashboardDescription(props: ChannelDashboardDescriptionProps): JSX.Element {\n const websiteLink = ContentPartnersHelper.getPartnerLinkByType(\n props.partnerProfile?.links,\n 'website',\n ContentPartnersHelper.makeUTMs({ slug: props.partnerProfile._slug.value })\n );\n\n const displayWebsiteLink = UrlHelper.getHostname(websiteLink) ?? websiteLink;\n\n return (\n <div className='mt-3'>\n <ExpandableTextInline>\n {() => (\n <p className='mb-0'>\n {websiteLink && (\n <>\n <a\n href={websiteLink}\n target='_blank'\n rel='noopener noreferrer'\n className='position-relative d-inline-block ps-4 mb-2 me-2'\n >\n <SvgContainer svg={LinkSvg} className='svg-container position-absolute top-50 start-0 translate-middle-y' />\n <span className='ps-1'>{displayWebsiteLink}</span>\n </a>\n <span className='mb-2 me-2'>•</span>\n </>\n )}\n {props.partnerProfile.description}\n </p>\n )}\n </ExpandableTextInline>\n </div>\n );\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'contentPartners.contentPartnerDashboardComingSoon';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface ContentPartnerDashboardComingSoonProps {\n partnerName: string;\n comingSoonImageUrl: string;\n}\n\nexport function ContentPartnerDashboardComingSoon(props: ContentPartnerDashboardComingSoonProps): JSX.Element {\n return (\n <EmptyState>\n <EmptyState.Image\n src={props.comingSoonImageUrl}\n altText={getPhrase('description', { partnerName: props.partnerName })}\n />\n <EmptyState.Heading>\n <Text namespace={namespace} phrase='heading' />\n </EmptyState.Heading>\n <EmptyState.Info>\n <Text namespace={namespace} phrase='description' options={{ partnerName: props.partnerName }} />\n </EmptyState.Info>\n </EmptyState>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'contentPartners.contentPartnerDashboardContentRegion';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface ContentPartnerDashboardContentRegionProps {\n contentRegionImageUrl: string;\n contentRegionButtonLink: Core.AppLink;\n}\n\nexport function ContentPartnerDashboardContentRegion(props: ContentPartnerDashboardContentRegionProps): JSX.Element {\n return (\n <EmptyState>\n <EmptyState.Image src={props.contentRegionImageUrl} altText={getPhrase('imageAlt')} />\n <EmptyState.Heading>\n <Text namespace={namespace} phrase='heading' />\n </EmptyState.Heading>\n <EmptyState.Cta text={getPhrase('cta')} appLink={props.contentRegionButtonLink} className='btn btn-dark' />\n </EmptyState>\n );\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'contentPartners.contentPartnerDashboardNoContent';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface ContentPartnerDashboardNoContentProps {\n noContentImageUrl: string;\n}\n\nexport function ContentPartnerDashboardNoContent(props: ContentPartnerDashboardNoContentProps): JSX.Element {\n return (\n <EmptyState>\n <EmptyState.Image\n src={props.noContentImageUrl}\n altText={getPhrase('description')}\n />\n <EmptyState.Heading>\n <Text namespace={namespace} phrase='heading' />\n </EmptyState.Heading>\n <EmptyState.Info>\n <Text namespace={namespace} phrase='description' />\n </EmptyState.Info>\n </EmptyState>\n );\n}\n","import React from 'react';\n\nimport {\n ContentPartnerDashboardComingSoon,\n ContentPartnerDashboardComingSoonProps\n} from '../content-partner-dashboard-coming-soon/ContentPartnerDashboardComingSoon';\nimport {\n ContentPartnerDashboardContentRegion,\n ContentPartnerDashboardContentRegionProps\n} from '../content-partner-dashboard-content-region/ContentPartnerDashboardContentRegion';\nimport {\n ContentPartnerDashboardNoContent,\n ContentPartnerDashboardNoContentProps\n} from '../content-partner-dashboard-no-content/ContentPartnerDashboardNoContent';\n\nexport type ContentPartnerEmptyStateType = 'coming-soon' | 'content-region' | 'no-content';\n\nconst ContentParterEmptyStateTypes: Record<ContentPartnerEmptyStateType, React.ComponentType<any>> = {\n 'coming-soon': ContentPartnerDashboardComingSoon,\n 'content-region': ContentPartnerDashboardContentRegion,\n 'no-content': ContentPartnerDashboardNoContent\n};\n\ntype EmptyStateType<TType extends ContentPartnerEmptyStateType, TProps> = TProps & {\n type: TType\n};\n\ntype ContentPartnerEmptyStateProps =\n EmptyStateType<'coming-soon', ContentPartnerDashboardComingSoonProps> |\n EmptyStateType<'content-region', ContentPartnerDashboardContentRegionProps> |\n EmptyStateType<'no-content', ContentPartnerDashboardNoContentProps>;\n\nexport function ContentPartnerEmptyState(props: ContentPartnerEmptyStateProps): JSX.Element {\n const Component = ContentParterEmptyStateTypes[props.type];\n\n return <Component {...props} />;\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { Flight } from 'libs/common/react/index';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { ContentPartnersHelper } from 'libs/shared/apps/content-partners/utils/ContentPartnersHelper';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { BannerHeader } from 'libs/shared/components/banner-header/BannerHeader';\nimport { Breadcrumb, Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { InfiniteWidgetContainerView } from 'libs/shared/components/widgets/curated-widgets/InfiniteWidgetContainerView';\nimport { AllPartnerProfileWidgetTemplates } from 'libs/shared/components/widgets/curated-widgets/WidgetProps';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { useEmptyWidgets } from 'libs/shared/hooks/useEmptyWidgets';\nimport { HasLocalPermissionsFunc, HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { CuratedDashboard, CuratedWidget, CuratedWidgetQueryParams, CurrentUser, DashboardStatus, DashboardTargetType, PartnerProfile, Presentation, PresentationAudience } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { CuratedDashboardHelper } from 'libs/shared/utils/DashboardHelper';\nimport { WidgetHelper } from 'libs/shared/utils/WidgetHelper';\n\nimport { ContentPartnerEventLoggerFn } from '../../utils/get-content-partner-event-logger/getContentPartnerEventLogger';\n\nimport { ChannelDashboardDescription } from './channel-dashboard-description/ChannelDashboardDescription';\nimport { ContentPartnerEmptyState, ContentPartnerEmptyStateType } from './empty-state/content-partner-empty-state/ContentPartnerEmptyState';\n\nconst InfiniteFetchWidgetIds: WidgetTypeId[] = [WidgetTypeId.ContentPartnerVideos];\n\nfunction shouldInfiniteFetch(widgets: CuratedWidget[], index: number): boolean {\n const currentWidget = widgets[index];\n\n if (!currentWidget) return false;\n \n return InfiniteFetchWidgetIds.includes(currentWidget.widgetId) && index === widgets.length - 1;\n}\n\nexport interface ContentPartnerDashboardProps {\n dashboard: CuratedDashboard;\n partnerProfile: PartnerProfile;\n getWidgetContentRequest: (\n id: string,\n params: CuratedWidgetQueryParams,\n widgetTemplate: WidgetTemplate,\n presentation?: Presentation,\n cursor?: string\n ) => Flight.Request;\n commonVideoProps: CommonVideoProps;\n getBannerActions?: () => ActionOptions[];\n breadcrumbs?: Breadcrumb[];\n isReadonly?: boolean;\n widgetAppLinks?: AllPartnerProfileWidgetTemplates['appLinks'];\n scrollToWidgetId?: string;\n hasPermissions: HasPermissionsFunc;\n hasLocalPermissions: HasLocalPermissionsFunc;\n settings?: AllPartnerProfileWidgetTemplates['settings'];\n audiences?: PresentationAudience[];\n currentUser?: CurrentUser;\n emptyImageUrl?: string;\n lazyLoad?: boolean;\n isBot?: boolean;\n isComingSoon?: boolean;\n isPreviewing?: boolean;\n isAuthenticated?: boolean;\n isInContentRegion: boolean;\n onClickSignUp: (email: string) => void;\n onClickSearchAllVideos?: () => void;\n getSeeMoreAppLink?: (widget: CuratedWidget) => Core.AppLink;\n log?: ContentPartnerEventLoggerFn;\n}\n\nexport function ContentPartnerDashboard(props: ContentPartnerDashboardProps): JSX.Element {\n const widgets = ArrayHelper.sortBy(props.dashboard?.widgets, 'index');\n\n const { emptyWidgets, setEmptyWidget } = useEmptyWidgets(widgets);\n\n function getWidgetContentRequest(\n id: string,\n widgetTypeId: WidgetTypeId,\n template: WidgetTemplate,\n cursor?: string\n ): Flight.Request {\n const params = CuratedDashboardHelper.getWidgetParams(\n widgetTypeId,\n template,\n CuratedDashboardHelper.getDashboardTargetType(props.dashboard)\n );\n\n return props.getWidgetContentRequest(id, params, template, undefined, cursor);\n }\n\n function getEmptyStateType(): ContentPartnerEmptyStateType | false {\n if (!props.isInContentRegion)\n return 'content-region';\n \n if (props.isComingSoon)\n return 'coming-soon';\n \n if (props.dashboard.status === DashboardStatus.Archived && !props.isReadonly)\n return 'coming-soon';\n \n if (props.dashboard.status === DashboardStatus.Draft && !props.isPreviewing)\n return false;\n\n if (!widgets?.length)\n return 'no-content';\n \n const emptyValues = Object.values(emptyWidgets);\n \n if (emptyValues.length > 0 && emptyValues.every(state => !!state))\n return 'no-content';\n\n return false;\n }\n\n const bannerInfo = ContentPartnersHelper.getPartnerBannerInfo(props.partnerProfile);\n\n const emptyState = getEmptyStateType();\n const showExpandableDescription = (!emptyState || emptyState === 'content-region') && props.partnerProfile.description;\n\n return (\n <>\n {!!widgets.length &&\n <>\n <BannerHeader\n type='partner-profile'\n partnerBannerType={ContentPartnersHelper.getPartnerBannerType(props.partnerProfile)}\n heading={bannerInfo.heading}\n blockColourClass={bannerInfo.blockColourClass}\n logo={bannerInfo.logo}\n logoBgColour={bannerInfo.logoBgColour}\n banner={bannerInfo.banner}\n imageCdnUrl={props.commonVideoProps.imageCdnUrl}\n actions={props.getBannerActions?.()}\n onClickSignUp={props.onClickSignUp}\n isAuthenticated={props.isAuthenticated}\n videoUrl={props.partnerProfile._videobanner?.value?.url}\n websiteUrl={ContentPartnersHelper.getPartnerLinkByType(\n props.partnerProfile?.links,\n 'website',\n ContentPartnersHelper.makeUTMs({ slug: props.partnerProfile._slug.value })\n )}\n isStudent={props.hasPermissions(PermissionName.StudentExperience)}\n log={props.log}\n />\n \n <div className='py-3 mb-3 border-bottom'>\n <Breadcrumbs breadcrumbs={props.breadcrumbs} />\n {showExpandableDescription && (\n <ChannelDashboardDescription partnerProfile={props.partnerProfile} />\n )}\n </div>\n\n <div className='mt-3'>\n {!emptyState && widgets.map((widget, idx) => (\n <InfiniteWidgetContainerView<CuratedWidget, CuratedWidget, AllPartnerProfileWidgetTemplates>\n dashboardTarget={DashboardTargetType.PartnerProfile}\n key={widget.id}\n index={idx}\n item={widget}\n infiniteFetch={shouldInfiniteFetch(widgets, idx)}\n getName={widget => widget.name}\n getWidgetMetadata={w => w.metadata}\n appLinks={props.widgetAppLinks}\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n audiences={props.audiences}\n setIsEmpty={isEmpty => setEmptyWidget(widget.id, isEmpty)}\n getCursor={w => w.cursor}\n getRequest={cursor => getWidgetContentRequest(widget.id, widget.widgetId, widget.templateId, cursor)}\n hasLocalPermissions={props.hasLocalPermissions}\n settingsHash={props.settings}\n getContent={w => w.content}\n resultsTransformers={WidgetHelper.getWidgetResultsTransformers()}\n onClickSearchAllVideos={props.onClickSearchAllVideos}\n getSeeMoreAppLink={props.getSeeMoreAppLink}\n isEmptyPredicate={items => (\n Array.isArray(items) && Array.isArray(items[0]?.content) && !items[0]?.content?.length\n )}\n\n getSelectedItems={null}\n appLinkOptions={null}\n />\n ))}\n </div>\n </>\n }\n\n {emptyState && <ContentPartnerEmptyState\n type={emptyState}\n // Coming soon empty state props\n partnerName={props.partnerProfile.name}\n comingSoonImageUrl={props.emptyImageUrl}\n // Content region empty state props\n contentRegionImageUrl={props.emptyImageUrl}\n contentRegionButtonLink={props.widgetAppLinks?.partnerHome?.()}\n // No content empty state props\n noContentImageUrl={props.emptyImageUrl}\n />}\n </>\n );\n}\n","import { AnalyticsOptions, ContentPartnerDescriptors, EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { EventLogConfig, getEventLogger } from 'libs/shared/utils/get-event-logger/getEventLogger';\n\nimport { BaseContentPartnerData, ContentPartnerData } from './interfaces/GetContentPartnerEventLogger';\n\ninterface ContentPartnerEventLoggerOptions {\n data: BaseContentPartnerData;\n analyticsOptions: AnalyticsOptions;\n shouldLog?: boolean;\n}\n\nexport type ContentPartnerEventLoggerFn = ReturnType<typeof getContentPartnerEventLogger>['log'];\n\nfunction getLogDataConfig(): EventLogConfig<ContentPartnerData> {\n return {\n 'click-video-banner-controls': {\n isValid: () => true,\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.PartnerProfile,\n descriptor: ContentPartnerDescriptors.VideoBannerControls,\n location: LocationContext.ContentPartnerDashboardVideoBanner\n }\n },\n 'click-video-banner-sign-up': {\n isValid: () => true,\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.PartnerProfile,\n workflowPhase: WorkflowPhase.Start,\n descriptor: ContentPartnerDescriptors.VideoBannerSignUp,\n location: LocationContext.ContentPartnerDashboardVideoBanner\n }\n }\n };\n}\n\nexport function getContentPartnerEventLogger(options: ContentPartnerEventLoggerOptions) {\n const { getData, log } = getEventLogger({\n analyticsOptions: options.analyticsOptions,\n baseData: options.data,\n config: getLogDataConfig(),\n shouldLog: options.shouldLog ?? true\n });\n\n return {\n log,\n getData\n };\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { EntityType, LocationContext } from 'libs/analytics/interfaces';\n\nimport { ContentPartnerDashboard } from 'libs/shared/apps/content-partners/components/content-partner-dashboard/ContentPartnerDashboard';\nimport { ContentPartnersHelper } from 'libs/shared/apps/content-partners/utils/ContentPartnersHelper';\nimport { getContentPartnerEventLogger } from 'libs/shared/apps/content-partners/utils/get-content-partner-event-logger/getContentPartnerEventLogger';\nimport { PreviewBanner } from 'libs/shared/apps/subjects/components/preview-banner/PreviewBanner';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { WidgetTypeIdConfig } from 'libs/shared/constants/WidgetTypeIdConfig';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { DashboardRequests } from 'libs/shared/flight-requests/DashboardRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useBreadcrumbs } from 'libs/shared/hooks/useBreadcrumbs';\nimport { useCurationStudio } from 'libs/shared/hooks/useCurationStudio';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { CuratedWidget, CuratedWidgetQueryParams, CurrentUser, DashboardTargetType, Presentation } from 'libs/shared/interfaces';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { useCommonVideoProps } from 'shared/hooks/useCommonVideoProps';\nimport { usePartnerProfile } from 'shared/hooks/usePartnerProfile';\nimport { DashboardViewQueryParams } from 'shared/interfaces/query-params/DashboardViewQueryParams';\nimport { useFetchCuratedDashboard } from 'shared/utils/DashboardHelper';\nimport { SeoHelper } from 'shared/utils/SeoHelper';\n\nimport { getContentPartnerWidgetAppLinks } from 'apps/content-partners/utils/getContentPartnerWidgetAppLinks';\nimport { useSignUpEntry } from 'apps/sign-up/hooks/useSignUpEntry';\nimport { SignUpHelper } from 'apps/sign-up/utils/SignUpHelper';\n\nconst namespace = 'contentPartners.dashboard';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ContentPartnersDashboardViewProps {\n slug: string;\n queryParams?: DashboardViewQueryParams;\n}\n\nexport function ContentPartnersDashboardView(props: ContentPartnersDashboardViewProps): JSX.Element {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const partnerProfile = usePartnerProfile(props.slug);\n const videoActions = useVideoActions({\n location: VideoActionsLocation.VideoItem,\n presentationSlug: null\n });\n\n const { log } = getContentPartnerEventLogger({\n data: {\n entity: {\n id: partnerProfile.data?.id,\n name: partnerProfile.data?.name,\n contentRegion: currentUser.data?.contentRegion\n }\n },\n analyticsOptions: {\n entity: EntityType.PartnerProfile,\n location: LocationContext.ContentPartnerDashboard\n }\n });\n\n useSignUpEntry({\n app: 'channels',\n id: partnerProfile.data?.id,\n metadata: { conversionSuffix: partnerProfile.data?.name }\n });\n\n const { openInCurationStudioLabel, isUserCurator, getOpenInCurationStudioLink } = useCurationStudio();\n\n const { commonVideoProps } = useCommonVideoProps({\n locationContext: LocationContext.VideoThumbnail\n });\n\n const { hasPermissions, hasLocalPermissions } = usePermissions();\n\n const settings = useSettings(null);\n\n const { dashboard, isPreviewing } = useFetchCuratedDashboard({\n targetType: DashboardTargetType.PartnerProfile,\n partnerProfileSlug: props.slug,\n queryParams: props.queryParams\n });\n\n useSetPageMetadata(PageMetadataHelper.getDefaultMetadata({\n title: partnerProfile.data?.name,\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n },\n allowIndexing: true\n }));\n\n const breadcrumbs = useBreadcrumbs({ name: partnerProfile.data?.name });\n\n React.useEffect(() => {\n if (!dashboard.hasCompleted || dashboard.data)\n return;\n\n Core.ErrorHelper.throw(new NotFoundError());\n }, [ dashboard.data, dashboard.hasCompleted ]);\n\n const widgetAppLinks = getContentPartnerWidgetAppLinks(\n currentUser.data,\n { channelId: partnerProfile.data?.id, presentationSlug: null }\n );\n\n function getBannerActions(): ActionOptions[] {\n if (!isUserCurator)\n return [];\n\n return [{\n label: openInCurationStudioLabel,\n href: getOpenInCurationStudioLink(dashboard.data?.typeId, dashboard.data?.id),\n openInNewTab: true\n }];\n }\n\n function getWidgetContentRequest(\n id: string,\n params: CuratedWidgetQueryParams,\n template: WidgetTemplate,\n presentation?: Presentation,\n cursor?: string\n ): Flight.Request {\n return DashboardRequests.dashboardWidgetContent(\n id,\n params,\n template,\n presentation,\n { cursor }\n );\n }\n\n function getSeeMoreAppLink(widget: CuratedWidget): Core.AppLink {\n return WidgetTypeIdConfig[widget.widgetId]\n ?.getCollectionAppLink?.(widgetAppLinks, widget.content) ?? null;\n }\n\n function onClickSignUp(email: string): void {\n log?.({\n type: 'click-video-banner-sign-up',\n email: email\n });\n Core.AppLinkHelper.trigger(\n SignUpHelper.getSignUpAppLink({\n email\n })\n );\n }\n\n const loaded = partnerProfile.hasCompleted && dashboard.hasCompleted;\n const isBot = SeoHelper.isBot();\n\n const isInContentRegion = isPreviewing ?\n true : // skip content region check if previewing\n ContentPartnersHelper.isInContentRegion(\n partnerProfile.data,\n currentUser.data?.contentRegion,\n currentUser.data?.isAuthenticated\n );\n\n function onClickSearchAllVideos() {\n Core.AppLinkHelper.trigger({\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n params: {\n scopeId: partnerProfile.data?.id\n }\n });\n }\n\n if (!loaded)\n return <></>;\n \n return (\n <div className='bg-white px-4 position-relative'>\n <VideoActionsContext.Provider value={videoActions}>\n {!!(isPreviewing && dashboard.data) && <PreviewBanner status={dashboard.data.status} type='channel' />}\n\n <ContentPartnerDashboard\n dashboard={dashboard.data}\n partnerProfile={partnerProfile.data}\n getWidgetContentRequest={getWidgetContentRequest}\n commonVideoProps={commonVideoProps}\n breadcrumbs={breadcrumbs}\n getBannerActions={getBannerActions}\n hasPermissions={hasPermissions}\n hasLocalPermissions={hasLocalPermissions}\n settings={settings}\n widgetAppLinks={widgetAppLinks}\n emptyImageUrl={ImageUrls.EmptyStates.WATCH_HISTORY}\n isBot={isBot}\n // Only lazy load if its an actual user\n lazyLoad={!isBot}\n isAuthenticated={currentUser.data?.isAuthenticated}\n isInContentRegion={isInContentRegion}\n onClickSignUp={onClickSignUp}\n isPreviewing={isPreviewing}\n onClickSearchAllVideos={onClickSearchAllVideos}\n getSeeMoreAppLink={getSeeMoreAppLink}\n log={log}\n />\n </VideoActionsContext.Provider>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"GcexF25w2.chunk.js","names":[],"sources":["../../../../libs/shared/src/apps/content-partners/components/content-partner-dashboard/channel-dashboard-description/ChannelDashboardDescription.tsx","../../../../libs/shared/src/apps/content-partners/components/content-partner-dashboard/empty-state/content-partner-dashboard-coming-soon/ContentPartnerDashboardComingSoon.tsx","../../../../libs/shared/src/apps/content-partners/components/content-partner-dashboard/empty-state/content-partner-dashboard-content-region/ContentPartnerDashboardContentRegion.tsx","../../../../libs/shared/src/apps/content-partners/components/content-partner-dashboard/empty-state/content-partner-dashboard-no-content/ContentPartnerDashboardNoContent.tsx","../../../../libs/shared/src/apps/content-partners/components/content-partner-dashboard/empty-state/content-partner-empty-state/ContentPartnerEmptyState.tsx","../../../../libs/shared/src/apps/content-partners/components/content-partner-dashboard/ContentPartnerDashboard.tsx","../../../../libs/shared/src/apps/content-partners/utils/get-content-partner-event-logger/getContentPartnerEventLogger.ts","../../src/apps/content-partners/views/content-partners-dashboard/ContentPartnersDashboardView.tsx"],"sourcesContent":["import React from 'react';\n\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\n\nimport { ContentPartnersHelper } from 'libs/shared/apps/content-partners/utils/ContentPartnersHelper';\nimport { ExpandableTextInline } from 'libs/shared/components/expandable-text-inline/ExpandableTextInline';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { LinkSvg } from 'libs/shared/images/svg/objects/LinkSvg';\nimport { PartnerProfile } from 'libs/shared/interfaces';\n\ninterface ChannelDashboardDescriptionProps {\n partnerProfile: PartnerProfile;\n}\n\nexport function ChannelDashboardDescription(props: ChannelDashboardDescriptionProps): JSX.Element {\n const websiteLink = ContentPartnersHelper.getPartnerLinkByType(\n props.partnerProfile?.links,\n 'website',\n ContentPartnersHelper.makeUTMs({ slug: props.partnerProfile._slug.value })\n );\n\n const displayWebsiteLink = UrlHelper.getHostname(websiteLink) ?? websiteLink;\n\n return (\n <div className='mt-3'>\n <ExpandableTextInline>\n {() => (\n <p className='mb-0'>\n {websiteLink && (\n <>\n <a\n href={websiteLink}\n target='_blank'\n rel='noopener noreferrer'\n className='position-relative d-inline-block ps-4 mb-2 me-2'\n >\n <SvgContainer svg={LinkSvg} className='svg-container position-absolute top-50 start-0 translate-middle-y' />\n <span className='ps-1'>{displayWebsiteLink}</span>\n </a>\n <span className='mb-2 me-2'>•</span>\n </>\n )}\n {props.partnerProfile.description}\n </p>\n )}\n </ExpandableTextInline>\n </div>\n );\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'contentPartners.contentPartnerDashboardComingSoon';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface ContentPartnerDashboardComingSoonProps {\n partnerName: string;\n comingSoonImageUrl: string;\n}\n\nexport function ContentPartnerDashboardComingSoon(props: ContentPartnerDashboardComingSoonProps): JSX.Element {\n return (\n <EmptyState>\n <EmptyState.Image\n src={props.comingSoonImageUrl}\n altText={getPhrase('description', { partnerName: props.partnerName })}\n />\n <EmptyState.Heading>\n <Text namespace={namespace} phrase='heading' />\n </EmptyState.Heading>\n <EmptyState.Info>\n <Text namespace={namespace} phrase='description' options={{ partnerName: props.partnerName }} />\n </EmptyState.Info>\n </EmptyState>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'contentPartners.contentPartnerDashboardContentRegion';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface ContentPartnerDashboardContentRegionProps {\n contentRegionImageUrl: string;\n contentRegionButtonLink: Core.AppLink;\n}\n\nexport function ContentPartnerDashboardContentRegion(props: ContentPartnerDashboardContentRegionProps): JSX.Element {\n return (\n <EmptyState>\n <EmptyState.Image src={props.contentRegionImageUrl} altText={getPhrase('imageAlt')} />\n <EmptyState.Heading>\n <Text namespace={namespace} phrase='heading' />\n </EmptyState.Heading>\n <EmptyState.Cta text={getPhrase('cta')} appLink={props.contentRegionButtonLink} className='btn btn-dark' />\n </EmptyState>\n );\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'contentPartners.contentPartnerDashboardNoContent';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface ContentPartnerDashboardNoContentProps {\n noContentImageUrl: string;\n}\n\nexport function ContentPartnerDashboardNoContent(props: ContentPartnerDashboardNoContentProps): JSX.Element {\n return (\n <EmptyState>\n <EmptyState.Image\n src={props.noContentImageUrl}\n altText={getPhrase('description')}\n />\n <EmptyState.Heading>\n <Text namespace={namespace} phrase='heading' />\n </EmptyState.Heading>\n <EmptyState.Info>\n <Text namespace={namespace} phrase='description' />\n </EmptyState.Info>\n </EmptyState>\n );\n}\n","import React from 'react';\n\nimport {\n ContentPartnerDashboardComingSoon,\n ContentPartnerDashboardComingSoonProps\n} from '../content-partner-dashboard-coming-soon/ContentPartnerDashboardComingSoon';\nimport {\n ContentPartnerDashboardContentRegion,\n ContentPartnerDashboardContentRegionProps\n} from '../content-partner-dashboard-content-region/ContentPartnerDashboardContentRegion';\nimport {\n ContentPartnerDashboardNoContent,\n ContentPartnerDashboardNoContentProps\n} from '../content-partner-dashboard-no-content/ContentPartnerDashboardNoContent';\n\nexport type ContentPartnerEmptyStateType = 'coming-soon' | 'content-region' | 'no-content';\n\nconst ContentParterEmptyStateTypes: Record<ContentPartnerEmptyStateType, React.ComponentType<any>> = {\n 'coming-soon': ContentPartnerDashboardComingSoon,\n 'content-region': ContentPartnerDashboardContentRegion,\n 'no-content': ContentPartnerDashboardNoContent\n};\n\ntype EmptyStateType<TType extends ContentPartnerEmptyStateType, TProps> = TProps & {\n type: TType\n};\n\ntype ContentPartnerEmptyStateProps =\n EmptyStateType<'coming-soon', ContentPartnerDashboardComingSoonProps> |\n EmptyStateType<'content-region', ContentPartnerDashboardContentRegionProps> |\n EmptyStateType<'no-content', ContentPartnerDashboardNoContentProps>;\n\nexport function ContentPartnerEmptyState(props: ContentPartnerEmptyStateProps): JSX.Element {\n const Component = ContentParterEmptyStateTypes[props.type];\n\n return <Component {...props} />;\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { Flight } from 'libs/common/react/index';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { ContentPartnersHelper } from 'libs/shared/apps/content-partners/utils/ContentPartnersHelper';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { BannerHeader } from 'libs/shared/components/banner-header/BannerHeader';\nimport { Breadcrumb, Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { InfiniteWidgetContainerView } from 'libs/shared/components/widgets/curated-widgets/InfiniteWidgetContainerView';\nimport { AllPartnerProfileWidgetTemplates } from 'libs/shared/components/widgets/curated-widgets/WidgetProps';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { useEmptyWidgets } from 'libs/shared/hooks/useEmptyWidgets';\nimport { HasLocalPermissionsFunc, HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { CuratedDashboard, CuratedWidget, CuratedWidgetQueryParams, CurrentUser, DashboardStatus, DashboardTargetType, PartnerProfile, Presentation, PresentationAudience } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { CuratedDashboardHelper } from 'libs/shared/utils/DashboardHelper';\nimport { WidgetHelper } from 'libs/shared/utils/WidgetHelper';\n\nimport { ContentPartnerEventLoggerFn } from '../../utils/get-content-partner-event-logger/getContentPartnerEventLogger';\n\nimport { ChannelDashboardDescription } from './channel-dashboard-description/ChannelDashboardDescription';\nimport { ContentPartnerEmptyState, ContentPartnerEmptyStateType } from './empty-state/content-partner-empty-state/ContentPartnerEmptyState';\n\nconst InfiniteFetchWidgetIds: WidgetTypeId[] = [WidgetTypeId.ContentPartnerVideos];\n\nfunction shouldInfiniteFetch(widgets: CuratedWidget[], index: number): boolean {\n const currentWidget = widgets[index];\n\n if (!currentWidget) return false;\n \n return InfiniteFetchWidgetIds.includes(currentWidget.widgetId) && index === widgets.length - 1;\n}\n\nexport interface ContentPartnerDashboardProps {\n dashboard: CuratedDashboard;\n partnerProfile: PartnerProfile;\n getWidgetContentRequest: (\n id: string,\n params: CuratedWidgetQueryParams,\n widgetTemplate: WidgetTemplate,\n presentation?: Presentation,\n cursor?: string\n ) => Flight.Request;\n commonVideoProps: CommonVideoProps;\n getBannerActions?: () => ActionOptions[];\n breadcrumbs?: Breadcrumb[];\n isReadonly?: boolean;\n widgetAppLinks?: AllPartnerProfileWidgetTemplates['appLinks'];\n scrollToWidgetId?: string;\n hasPermissions: HasPermissionsFunc;\n hasLocalPermissions: HasLocalPermissionsFunc;\n settings?: AllPartnerProfileWidgetTemplates['settings'];\n audiences?: PresentationAudience[];\n currentUser?: CurrentUser;\n emptyImageUrl?: string;\n lazyLoad?: boolean;\n isBot?: boolean;\n isComingSoon?: boolean;\n isPreviewing?: boolean;\n isAuthenticated?: boolean;\n isInContentRegion: boolean;\n onClickSignUp: (email: string) => void;\n onClickSearchAllVideos?: () => void;\n getSeeMoreAppLink?: (widget: CuratedWidget) => Core.AppLink;\n log?: ContentPartnerEventLoggerFn;\n}\n\nexport function ContentPartnerDashboard(props: ContentPartnerDashboardProps): JSX.Element {\n const widgets = ArrayHelper.sortBy(props.dashboard?.widgets, 'index');\n\n const { emptyWidgets, setEmptyWidget } = useEmptyWidgets(widgets);\n\n function getWidgetContentRequest(\n id: string,\n widgetTypeId: WidgetTypeId,\n template: WidgetTemplate,\n cursor?: string\n ): Flight.Request {\n const params = CuratedDashboardHelper.getWidgetParams(\n widgetTypeId,\n template,\n CuratedDashboardHelper.getDashboardTargetType(props.dashboard)\n );\n\n return props.getWidgetContentRequest(id, params, template, undefined, cursor);\n }\n\n function getEmptyStateType(): ContentPartnerEmptyStateType | false {\n if (!props.isInContentRegion)\n return 'content-region';\n \n if (props.isComingSoon)\n return 'coming-soon';\n \n if (props.dashboard.status === DashboardStatus.Archived && !props.isReadonly)\n return 'coming-soon';\n \n if (props.dashboard.status === DashboardStatus.Draft && !props.isPreviewing)\n return false;\n\n if (!widgets?.length)\n return 'no-content';\n \n const emptyValues = Object.values(emptyWidgets);\n \n if (emptyValues.length > 0 && emptyValues.every(state => !!state))\n return 'no-content';\n\n return false;\n }\n\n const bannerInfo = ContentPartnersHelper.getPartnerBannerInfo(props.partnerProfile);\n\n const emptyState = getEmptyStateType();\n const showExpandableDescription = (!emptyState || emptyState === 'content-region') && props.partnerProfile.description;\n\n return (\n <>\n {!!widgets.length &&\n <>\n <BannerHeader\n type='partner-profile'\n partnerBannerType={ContentPartnersHelper.getPartnerBannerType(props.partnerProfile)}\n heading={bannerInfo.heading}\n blockColourClass={bannerInfo.blockColourClass}\n logo={bannerInfo.logo}\n logoBgColour={bannerInfo.logoBgColour}\n banner={bannerInfo.banner}\n imageCdnUrl={props.commonVideoProps.imageCdnUrl}\n actions={props.getBannerActions?.()}\n onClickSignUp={props.onClickSignUp}\n isAuthenticated={props.isAuthenticated}\n videoUrl={props.partnerProfile._videobanner?.value?.url}\n websiteUrl={ContentPartnersHelper.getPartnerLinkByType(\n props.partnerProfile?.links,\n 'website',\n ContentPartnersHelper.makeUTMs({ slug: props.partnerProfile._slug.value })\n )}\n isStudent={props.hasPermissions(PermissionName.StudentExperience)}\n log={props.log}\n />\n \n <div className='py-3 mb-3 border-bottom'>\n <Breadcrumbs breadcrumbs={props.breadcrumbs} />\n {showExpandableDescription && (\n <ChannelDashboardDescription partnerProfile={props.partnerProfile} />\n )}\n </div>\n\n <div className='mt-3'>\n {!emptyState && widgets.map((widget, idx) => (\n <InfiniteWidgetContainerView<CuratedWidget, CuratedWidget, AllPartnerProfileWidgetTemplates>\n dashboardTarget={DashboardTargetType.PartnerProfile}\n key={widget.id}\n index={idx}\n item={widget}\n infiniteFetch={shouldInfiniteFetch(widgets, idx)}\n getName={widget => widget.name}\n getWidgetMetadata={w => w.metadata}\n appLinks={props.widgetAppLinks}\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n audiences={props.audiences}\n setIsEmpty={isEmpty => setEmptyWidget(widget.id, isEmpty)}\n getCursor={w => w.cursor}\n getRequest={cursor => getWidgetContentRequest(widget.id, widget.widgetId, widget.templateId, cursor)}\n hasLocalPermissions={props.hasLocalPermissions}\n settingsHash={props.settings}\n getContent={w => w.content}\n resultsTransformers={WidgetHelper.getWidgetResultsTransformers()}\n onClickSearchAllVideos={props.onClickSearchAllVideos}\n getSeeMoreAppLink={props.getSeeMoreAppLink}\n isEmptyPredicate={items => (\n Array.isArray(items) && Array.isArray(items[0]?.content) && !items[0]?.content?.length\n )}\n\n getSelectedItems={null}\n appLinkOptions={null}\n />\n ))}\n </div>\n </>\n }\n\n {emptyState && <ContentPartnerEmptyState\n type={emptyState}\n // Coming soon empty state props\n partnerName={props.partnerProfile.name}\n comingSoonImageUrl={props.emptyImageUrl}\n // Content region empty state props\n contentRegionImageUrl={props.emptyImageUrl}\n contentRegionButtonLink={props.widgetAppLinks?.partnerHome?.()}\n // No content empty state props\n noContentImageUrl={props.emptyImageUrl}\n />}\n </>\n );\n}\n","import { AnalyticsOptions, ContentPartnerDescriptors, EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { EventLogConfig, getEventLogger } from 'libs/shared/utils/get-event-logger/getEventLogger';\n\nimport { BaseContentPartnerData, ContentPartnerData } from './interfaces/GetContentPartnerEventLogger';\n\ninterface ContentPartnerEventLoggerOptions {\n data: BaseContentPartnerData;\n analyticsOptions: AnalyticsOptions;\n shouldLog?: boolean;\n}\n\nexport type ContentPartnerEventLoggerFn = ReturnType<typeof getContentPartnerEventLogger>['log'];\n\nfunction getLogDataConfig(): EventLogConfig<ContentPartnerData> {\n return {\n 'click-video-banner-controls': {\n isValid: () => true,\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.PartnerProfile,\n descriptor: ContentPartnerDescriptors.VideoBannerControls,\n location: LocationContext.ContentPartnerDashboardVideoBanner\n }\n },\n 'click-video-banner-sign-up': {\n isValid: () => true,\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.PartnerProfile,\n workflowPhase: WorkflowPhase.Start,\n descriptor: ContentPartnerDescriptors.VideoBannerSignUp,\n location: LocationContext.ContentPartnerDashboardVideoBanner\n }\n }\n };\n}\n\nexport function getContentPartnerEventLogger(options: ContentPartnerEventLoggerOptions) {\n const { getData, log } = getEventLogger({\n analyticsOptions: options.analyticsOptions,\n baseData: options.data,\n config: getLogDataConfig(),\n shouldLog: options.shouldLog ?? true\n });\n\n return {\n log,\n getData\n };\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { EntityType, LocationContext } from 'libs/analytics/interfaces';\n\nimport { ContentPartnerDashboard } from 'libs/shared/apps/content-partners/components/content-partner-dashboard/ContentPartnerDashboard';\nimport { ContentPartnersHelper } from 'libs/shared/apps/content-partners/utils/ContentPartnersHelper';\nimport { getContentPartnerEventLogger } from 'libs/shared/apps/content-partners/utils/get-content-partner-event-logger/getContentPartnerEventLogger';\nimport { PreviewBanner } from 'libs/shared/apps/subjects/components/preview-banner/PreviewBanner';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { WidgetTypeIdConfig } from 'libs/shared/constants/WidgetTypeIdConfig';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { DashboardRequests } from 'libs/shared/flight-requests/DashboardRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useBreadcrumbs } from 'libs/shared/hooks/useBreadcrumbs';\nimport { useCurationStudio } from 'libs/shared/hooks/useCurationStudio';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { CuratedWidget, CuratedWidgetQueryParams, CurrentUser, DashboardTargetType, Presentation } from 'libs/shared/interfaces';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { useCommonVideoProps } from 'shared/hooks/useCommonVideoProps';\nimport { usePartnerProfile } from 'shared/hooks/usePartnerProfile';\nimport { DashboardViewQueryParams } from 'shared/interfaces/query-params/DashboardViewQueryParams';\nimport { useFetchCuratedDashboard } from 'shared/utils/DashboardHelper';\nimport { SeoHelper } from 'shared/utils/SeoHelper';\n\nimport { getContentPartnerWidgetAppLinks } from 'apps/content-partners/utils/getContentPartnerWidgetAppLinks';\nimport { useSignUpEntry } from 'apps/sign-up/hooks/useSignUpEntry';\nimport { SignUpHelper } from 'apps/sign-up/utils/SignUpHelper';\n\nconst namespace = 'contentPartners.dashboard';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ContentPartnersDashboardViewProps {\n slug: string;\n queryParams?: DashboardViewQueryParams;\n}\n\nexport function ContentPartnersDashboardView(props: ContentPartnersDashboardViewProps): JSX.Element {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const partnerProfile = usePartnerProfile(props.slug);\n const videoActions = useVideoActions({\n location: VideoActionsLocation.VideoItem,\n presentationSlug: null\n });\n\n const { log } = getContentPartnerEventLogger({\n data: {\n entity: {\n id: partnerProfile.data?.id,\n name: partnerProfile.data?.name,\n contentRegion: currentUser.data?.contentRegion\n }\n },\n analyticsOptions: {\n entity: EntityType.PartnerProfile,\n location: LocationContext.ContentPartnerDashboard\n }\n });\n\n useSignUpEntry({\n app: 'channels',\n id: partnerProfile.data?.id,\n metadata: { conversionSuffix: partnerProfile.data?.name }\n });\n\n const { openInCurationStudioLabel, isUserCurator, getOpenInCurationStudioLink } = useCurationStudio();\n\n const { commonVideoProps } = useCommonVideoProps({\n locationContext: LocationContext.VideoThumbnail\n });\n\n const { hasPermissions, hasLocalPermissions } = usePermissions();\n\n const settings = useSettings(null);\n\n const { dashboard, isPreviewing } = useFetchCuratedDashboard({\n targetType: DashboardTargetType.PartnerProfile,\n partnerProfileSlug: props.slug,\n queryParams: props.queryParams\n });\n\n useSetPageMetadata(PageMetadataHelper.getDefaultMetadata({\n title: partnerProfile.data?.name,\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n },\n allowIndexing: true\n }));\n\n const breadcrumbs = useBreadcrumbs({ name: partnerProfile.data?.name });\n\n React.useEffect(() => {\n if (!dashboard.hasCompleted || dashboard.data)\n return;\n\n Core.ErrorHelper.throw(new NotFoundError());\n }, [ dashboard.data, dashboard.hasCompleted ]);\n\n const widgetAppLinks = getContentPartnerWidgetAppLinks(\n currentUser.data,\n { channelId: partnerProfile.data?.id, presentationSlug: null }\n );\n\n function getBannerActions(): ActionOptions[] {\n if (!isUserCurator)\n return [];\n\n return [{\n label: openInCurationStudioLabel,\n href: getOpenInCurationStudioLink(dashboard.data?.typeId, dashboard.data?.id),\n openInNewTab: true\n }];\n }\n\n function getWidgetContentRequest(\n id: string,\n params: CuratedWidgetQueryParams,\n template: WidgetTemplate,\n presentation?: Presentation,\n cursor?: string\n ): Flight.Request {\n return DashboardRequests.dashboardWidgetContent(\n id,\n params,\n template,\n presentation,\n { cursor }\n );\n }\n\n function getSeeMoreAppLink(widget: CuratedWidget): Core.AppLink {\n return WidgetTypeIdConfig[widget.widgetId]\n ?.getCollectionAppLink?.(widgetAppLinks, widget.content) ?? null;\n }\n\n function onClickSignUp(email: string): void {\n log?.({\n type: 'click-video-banner-sign-up',\n email: email\n });\n Core.AppLinkHelper.trigger(\n SignUpHelper.getSignUpAppLink({\n email\n })\n );\n }\n\n const loaded = partnerProfile.hasCompleted && dashboard.hasCompleted;\n const isBot = SeoHelper.isBot();\n\n const isInContentRegion = isPreviewing ?\n true : // skip content region check if previewing\n ContentPartnersHelper.isInContentRegion(\n partnerProfile.data,\n currentUser.data?.contentRegion,\n currentUser.data?.isAuthenticated\n );\n\n function onClickSearchAllVideos() {\n Core.AppLinkHelper.trigger({\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n params: {\n scopeId: partnerProfile.data?.id\n }\n });\n }\n\n if (!loaded)\n return <></>;\n \n return (\n <div className='bg-white px-4 position-relative'>\n <VideoActionsContext.Provider value={videoActions}>\n {!!(isPreviewing && dashboard.data) && <PreviewBanner status={dashboard.data.status} type='channel' />}\n\n <ContentPartnerDashboard\n dashboard={dashboard.data}\n partnerProfile={partnerProfile.data}\n getWidgetContentRequest={getWidgetContentRequest}\n commonVideoProps={commonVideoProps}\n breadcrumbs={breadcrumbs}\n getBannerActions={getBannerActions}\n hasPermissions={hasPermissions}\n hasLocalPermissions={hasLocalPermissions}\n settings={settings}\n widgetAppLinks={widgetAppLinks}\n emptyImageUrl={ImageUrls.EmptyStates.WATCH_HISTORY}\n isBot={isBot}\n // Only lazy load if its an actual user\n lazyLoad={!isBot}\n isAuthenticated={currentUser.data?.isAuthenticated}\n isInContentRegion={isInContentRegion}\n onClickSignUp={onClickSignUp}\n isPreviewing={isPreviewing}\n onClickSearchAllVideos={onClickSearchAllVideos}\n getSeeMoreAppLink={getSeeMoreAppLink}\n log={log}\n />\n </VideoActionsContext.Provider>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -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"./CKGiikBV.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=_XhYAc8v.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DYN56vJ6.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":"_XhYAc8v.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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"}
|