@clickview/streamable-learning 0.48.0-rc.1 → 0.48.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.vite/manifest.json +605 -605
- package/dist/bundles.json +1 -1
- package/dist/en.json +1 -1
- package/dist/scripts/{CN8PeBwg.chunk.js → BIisq8ZO.chunk.js} +2 -2
- package/dist/scripts/{CN8PeBwg.chunk.js.map → BIisq8ZO.chunk.js.map} +1 -1
- package/dist/scripts/{BaMNOAYj2.chunk.js → BWU6_pPN2.chunk.js} +2 -2
- package/dist/scripts/{BaMNOAYj2.chunk.js.map → BWU6_pPN2.chunk.js.map} +1 -1
- package/dist/scripts/{BvJXPFoz2.chunk.js → BcZFo9Vw2.chunk.js} +2 -2
- package/dist/scripts/{BvJXPFoz2.chunk.js.map → BcZFo9Vw2.chunk.js.map} +1 -1
- package/dist/scripts/Bd2bbHru.chunk.js +1 -0
- package/dist/scripts/{CkYqp83j.chunk.js → BfNy0Hvk.chunk.js} +2 -2
- package/dist/scripts/{CkYqp83j.chunk.js.map → BfNy0Hvk.chunk.js.map} +1 -1
- package/dist/scripts/{D0SYGnyF.chunk.js → BivP7X20.chunk.js} +2 -2
- package/dist/scripts/{D0SYGnyF.chunk.js.map → BivP7X20.chunk.js.map} +1 -1
- package/dist/scripts/{BihZ4r0z2.chunk.js → BjbY4Fbp2.chunk.js} +3 -3
- package/dist/scripts/{BihZ4r0z2.chunk.js.map → BjbY4Fbp2.chunk.js.map} +1 -1
- package/dist/scripts/{DO8_mR5i2.chunk.js → BmxcE73n2.chunk.js} +2 -2
- package/dist/scripts/{DO8_mR5i2.chunk.js.map → BmxcE73n2.chunk.js.map} +1 -1
- package/dist/scripts/{bycmewy72.chunk.js → BnEMhkEE2.chunk.js} +2 -2
- package/dist/scripts/{bycmewy72.chunk.js.map → BnEMhkEE2.chunk.js.map} +1 -1
- package/dist/scripts/{jWpq99N3.chunk.js → Buc8GegC.chunk.js} +2 -2
- package/dist/scripts/{jWpq99N3.chunk.js.map → Buc8GegC.chunk.js.map} +1 -1
- package/dist/scripts/{CrCAJmt6.chunk.js → Byczy1lS.chunk.js} +2 -2
- package/dist/scripts/{CrCAJmt6.chunk.js.map → Byczy1lS.chunk.js.map} +1 -1
- package/dist/scripts/{BZOcEcTA2.chunk.js → C2itEpvc2.chunk.js} +2 -2
- package/dist/scripts/{BZOcEcTA2.chunk.js.map → C2itEpvc2.chunk.js.map} +1 -1
- package/dist/scripts/{smdLElLq.chunk.js → CEFKXxac.chunk.js} +2 -2
- package/dist/scripts/{smdLElLq.chunk.js.map → CEFKXxac.chunk.js.map} +1 -1
- package/dist/scripts/{B-qOny0I2.chunk.js → CEYjJAp52.chunk.js} +2 -2
- package/dist/scripts/{B-qOny0I2.chunk.js.map → CEYjJAp52.chunk.js.map} +1 -1
- package/dist/scripts/{CNJrD44-2.chunk.js → CJSc4YDq2.chunk.js} +2 -2
- package/dist/scripts/{CNJrD44-2.chunk.js.map → CJSc4YDq2.chunk.js.map} +1 -1
- package/dist/scripts/{Br0Uc4GG.chunk.js → CKUA5J3R.chunk.js} +2 -2
- package/dist/scripts/{Br0Uc4GG.chunk.js.map → CKUA5J3R.chunk.js.map} +1 -1
- package/dist/scripts/{CWFInhB82.chunk.js → CYrzupmS2.chunk.js} +2 -2
- package/dist/scripts/{CWFInhB82.chunk.js.map → CYrzupmS2.chunk.js.map} +1 -1
- package/dist/scripts/{Llxar-VU.chunk.js → CcGYZb9f.chunk.js} +2 -2
- package/dist/scripts/{Llxar-VU.chunk.js.map → CcGYZb9f.chunk.js.map} +1 -1
- package/dist/scripts/{BTYwcYPL2.chunk.js → CeQGaFi-2.chunk.js} +2 -2
- package/dist/scripts/{BTYwcYPL2.chunk.js.map → CeQGaFi-2.chunk.js.map} +1 -1
- package/dist/scripts/{D7tastET2.chunk.js → Cr3Blj6H2.chunk.js} +2 -2
- package/dist/scripts/{D7tastET2.chunk.js.map → Cr3Blj6H2.chunk.js.map} +1 -1
- package/dist/scripts/{Dr1flAez.chunk.js → CxCkwLio.chunk.js} +2 -2
- package/dist/scripts/{Dr1flAez.chunk.js.map → CxCkwLio.chunk.js.map} +1 -1
- package/dist/scripts/{DyT1OGvP2.chunk.js → Cxj75Dqe2.chunk.js} +2 -2
- package/dist/scripts/{DyT1OGvP2.chunk.js.map → Cxj75Dqe2.chunk.js.map} +1 -1
- package/dist/scripts/{CsC3VVvE2.chunk.js → D-VNmhoM2.chunk.js} +2 -2
- package/dist/scripts/{CsC3VVvE2.chunk.js.map → D-VNmhoM2.chunk.js.map} +1 -1
- package/dist/scripts/{CKdklY2o2.chunk.js → D2FqnK9m2.chunk.js} +2 -2
- package/dist/scripts/{CKdklY2o2.chunk.js.map → D2FqnK9m2.chunk.js.map} +1 -1
- package/dist/scripts/{qcrBN1zR2.chunk.js → D3sdyN2Q2.chunk.js} +2 -2
- package/dist/scripts/{qcrBN1zR2.chunk.js.map → D3sdyN2Q2.chunk.js.map} +1 -1
- package/dist/scripts/{Ce1TZZdV2.chunk.js → D6IzS-bj2.chunk.js} +2 -2
- package/dist/scripts/{Ce1TZZdV2.chunk.js.map → D6IzS-bj2.chunk.js.map} +1 -1
- package/dist/scripts/{B703cBe72.chunk.js → D8g6nOG92.chunk.js} +2 -2
- package/dist/scripts/{B703cBe72.chunk.js.map → D8g6nOG92.chunk.js.map} +1 -1
- package/dist/scripts/{CCoZQmgX.chunk.js → DCKKwz9L.chunk.js} +2 -2
- package/dist/scripts/{CCoZQmgX.chunk.js.map → DCKKwz9L.chunk.js.map} +1 -1
- package/dist/scripts/{DIavEegC.chunk.js → DL4UFxRK.chunk.js} +2 -2
- package/dist/scripts/{DIavEegC.chunk.js.map → DL4UFxRK.chunk.js.map} +1 -1
- package/dist/scripts/{C5i1HsPp2.chunk.js → DLofRa642.chunk.js} +2 -2
- package/dist/scripts/{C5i1HsPp2.chunk.js.map → DLofRa642.chunk.js.map} +1 -1
- package/dist/scripts/{B5jBIPaP.chunk.js → DMZ--ok1.chunk.js} +2 -2
- package/dist/scripts/{B5jBIPaP.chunk.js.map → DMZ--ok1.chunk.js.map} +1 -1
- package/dist/scripts/{CUUUI6pl.chunk.js → DQFcbMMk.chunk.js} +2 -2
- package/dist/scripts/{CUUUI6pl.chunk.js.map → DQFcbMMk.chunk.js.map} +1 -1
- package/dist/scripts/{Dj4AeYQQ2.chunk.js → DVeqPzBe2.chunk.js} +2 -2
- package/dist/scripts/{Dj4AeYQQ2.chunk.js.map → DVeqPzBe2.chunk.js.map} +1 -1
- package/dist/scripts/{CGxa1Jzq.chunk.js → DWerltCT.chunk.js} +2 -2
- package/dist/scripts/{CGxa1Jzq.chunk.js.map → DWerltCT.chunk.js.map} +1 -1
- package/dist/scripts/{CbLL7dIz2.chunk.js → DatscYpA2.chunk.js} +2 -2
- package/dist/scripts/{CbLL7dIz2.chunk.js.map → DatscYpA2.chunk.js.map} +1 -1
- package/dist/scripts/{DwzBzBlI2.chunk.js → DkaGC5IU2.chunk.js} +2 -2
- package/dist/scripts/{DwzBzBlI2.chunk.js.map → DkaGC5IU2.chunk.js.map} +1 -1
- package/dist/scripts/{BLrjbrp8.chunk.js → DqZWSPDJ.chunk.js} +2 -2
- package/dist/scripts/{BLrjbrp8.chunk.js.map → DqZWSPDJ.chunk.js.map} +1 -1
- package/dist/scripts/{BKnxYKDu2.chunk.js → Dql-1E6g2.chunk.js} +2 -2
- package/dist/scripts/{BKnxYKDu2.chunk.js.map → Dql-1E6g2.chunk.js.map} +1 -1
- package/dist/scripts/{B7iwtSij.chunk.js → DuBHin02.chunk.js} +2 -2
- package/dist/scripts/{B7iwtSij.chunk.js.map → DuBHin02.chunk.js.map} +1 -1
- package/dist/scripts/{BpgHKWR52.chunk.js → QMuFwiiF2.chunk.js} +2 -2
- package/dist/scripts/{BpgHKWR52.chunk.js.map → QMuFwiiF2.chunk.js.map} +1 -1
- package/dist/scripts/{Ces-KTwe.chunk.js → U_sIlzAD.chunk.js} +2 -2
- package/dist/scripts/{Ces-KTwe.chunk.js.map → U_sIlzAD.chunk.js.map} +1 -1
- package/dist/scripts/{ACTQklJQ.chunk.js → WLyOm9Lj.chunk.js} +2 -2
- package/dist/scripts/{ACTQklJQ.chunk.js.map → WLyOm9Lj.chunk.js.map} +1 -1
- package/dist/scripts/{DR80oZtZ.chunk.js → Ymq7JLkU.chunk.js} +2 -2
- package/dist/scripts/{DR80oZtZ.chunk.js.map → Ymq7JLkU.chunk.js.map} +1 -1
- package/dist/scripts/{app-BIigh9wv.js → app-gjHxcZG3.js} +4 -4
- package/dist/scripts/app-gjHxcZG3.js.map +1 -0
- package/dist/scripts/{CNmmq34f.chunk.js → djRnI462.chunk.js} +2 -2
- package/dist/scripts/{CNmmq34f.chunk.js.map → djRnI462.chunk.js.map} +1 -1
- package/dist/scripts/{oTYyWWB-.chunk.js → e2K2YU7z.chunk.js} +2 -2
- package/dist/scripts/{oTYyWWB-.chunk.js.map → e2K2YU7z.chunk.js.map} +1 -1
- package/dist/scripts/{BxypZGPK.chunk.js → fnfhCa1P.chunk.js} +2 -2
- package/dist/scripts/{BxypZGPK.chunk.js.map → fnfhCa1P.chunk.js.map} +1 -1
- package/dist/scripts/{BsAo7Lri2.chunk.js → iyIL3kim2.chunk.js} +2 -2
- package/dist/scripts/{BsAo7Lri2.chunk.js.map → iyIL3kim2.chunk.js.map} +1 -1
- package/dist/scripts/{DK3xia1t.chunk.js → kfFYr9dc.chunk.js} +2 -2
- package/dist/scripts/{DK3xia1t.chunk.js.map → kfFYr9dc.chunk.js.map} +1 -1
- package/dist/scripts/{BXJetawx2.chunk.js → kts5xiiM2.chunk.js} +2 -2
- package/dist/scripts/{BXJetawx2.chunk.js.map → kts5xiiM2.chunk.js.map} +1 -1
- package/dist/scripts/{tYi-sUb22.chunk.js → lLAYbgAy2.chunk.js} +2 -2
- package/dist/scripts/{tYi-sUb22.chunk.js.map → lLAYbgAy2.chunk.js.map} +1 -1
- package/dist/scripts/{BCBfXCYM2.chunk.js → p9ukva5a2.chunk.js} +2 -2
- package/dist/scripts/{BCBfXCYM2.chunk.js.map → p9ukva5a2.chunk.js.map} +1 -1
- package/dist/scripts/{DKnZ8BaN.chunk.js → wOeN2ls0.chunk.js} +2 -2
- package/dist/scripts/{DKnZ8BaN.chunk.js.map → wOeN2ls0.chunk.js.map} +1 -1
- package/dist/scripts/{DU1SE31v2.chunk.js → zp2BHOp82.chunk.js} +2 -2
- package/dist/scripts/{DU1SE31v2.chunk.js.map → zp2BHOp82.chunk.js.map} +1 -1
- package/dist/scripts/{DnSy_Myx.chunk.js → zyVwH8JF.chunk.js} +2 -2
- package/dist/scripts/{DnSy_Myx.chunk.js.map → zyVwH8JF.chunk.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/C4MLxDS-.chunk.js +0 -1
- package/dist/scripts/app-BIigh9wv.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{gt as e,v as t}from"./Dp9qJj1C.chunk.js";import{t as n}from"./BJvPfCvt.chunk.js";import{lt as r,n as i,ut as a}from"./Dun43GrB.chunk.js";import{n as o,t as s}from"./Ca1QPe-q2.chunk.js";import{N as c}from"./app-
|
|
1
|
+
import{gt as e,v as t}from"./Dp9qJj1C.chunk.js";import{t as n}from"./BJvPfCvt.chunk.js";import{lt as r,n as i,ut as a}from"./Dun43GrB.chunk.js";import{n as o,t as s}from"./Ca1QPe-q2.chunk.js";import{N as c}from"./app-gjHxcZG3.js";import{n as l,t as u}from"./CeyqMjfq.chunk.js";var d={pillTabSelector:`_pillTabSelector_a6f6x_1`,tab:`_tab_a6f6x_4`,minWidth:`_minWidth_a6f6x_21`,radiusSmall:`_radiusSmall_a6f6x_24`,tabLink:`_tabLink_a6f6x_35`},f=e(a()),p=r();function m(e){return(0,p.jsxs)(p.Fragment,{children:[!!e.tab.svg&&(0,p.jsx)(`div`,{className:e.tab.name?`pe-1`:``,children:(0,p.jsx)(n,{svg:e.tab.svg,size:e.tab.svgSize})}),e.formatDisplayText?.(e.tab.name)??e.tab.name,typeof e.tab.count==`number`&&(0,p.jsx)(`div`,{className:`ps-2`,children:(0,p.jsx)(u,{type:l.Count,data:e.tab.count})})]})}function h(e){let{borderRadius:n=`lg`}=e,r=c();function a(e){e.analyticsData&&e.analyticsOptions&&i.logUserAction(e.analyticsData,e.analyticsOptions)}function l(e){e.active||!e.onSelect||(e.onSelect(),a(e))}function u(n){let r=n.target.value,i=e.tabs.find(e=>e.name===r);!i||i.active||(a(i),t.trigger(i.appLink))}let h=e.tabs.find(e=>e.active),g=e.forceSmallScreenDropdown||e.enableSmallScreenSupport&&(r.sm||r.xs);return(0,p.jsxs)(`nav`,{className:e.className??``,children:[g&&(0,p.jsx)(`select`,{className:`form-select`,onChange:u,value:h?.name,style:{minWidth:`150px`},children:e.tabs.map((t,n)=>t.hide?(0,p.jsx)(f.Fragment,{},n):(0,p.jsx)(`option`,{value:t.name,children:e.formatDisplayText?.(t.name)??t.name},n))}),!g&&(0,p.jsx)(`ul`,{className:`
|
|
2
2
|
list-unstyled d-inline-block m-0 ${d.pillTabSelector}
|
|
3
3
|
${n?d.radiusSmall:``}
|
|
4
4
|
${e.listClassName}
|
|
@@ -12,4 +12,4 @@ import{gt as e,v as t}from"./Dp9qJj1C.chunk.js";import{t as n}from"./BJvPfCvt.ch
|
|
|
12
12
|
cursor-pointer d-flex align-items-center justify-content-center
|
|
13
13
|
text-decoration-none text-reset px-2 text-nowrap ${d.tabLink}
|
|
14
14
|
`,onClick:()=>l(t),children:(0,p.jsx)(m,{tab:t,formatDisplayText:e.formatDisplayText})})},n))})]})}export{h as t};
|
|
15
|
-
//# sourceMappingURL=
|
|
15
|
+
//# sourceMappingURL=DCKKwz9L.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"DCKKwz9L.chunk.js","names":[],"sources":["../../../../libs/shared/src/components/pill-tab-selector/pill-tab-selector.module.scss","../../../../libs/shared/src/components/pill-tab-selector/PillTabSelector.tsx"],"sourcesContent":[":local {\n $pill-tab-min-width: 7rem;\n\n .pillTabSelector {\n border-radius: $border-radius-lg;\n\n .tab {\n border-radius: 0;\n\n &:first-child {\n border-top-left-radius: $border-radius-lg;\n border-bottom-left-radius: $border-radius-lg;\n }\n\n &:last-child {\n border-top-right-radius: $border-radius-lg;\n border-bottom-right-radius: $border-radius-lg;\n }\n\n &:not(:first-child) {\n border-left: none;\n }\n\n &:not(:last-child) {\n border-right: none;\n }\n\n &.minWidth {\n min-width: $pill-tab-min-width;\n }\n }\n\n &.radiusSmall {\n border-radius: $border-radius;\n\n li {\n &:first-child {\n border-top-left-radius: $border-radius;\n border-bottom-left-radius: $border-radius;\n }\n \n &:last-child {\n border-top-right-radius: $border-radius;\n border-bottom-right-radius: $border-radius;\n }\n }\n }\n\n .tabLink {\n padding-top: $input-btn-padding-y;\n padding-bottom: $input-btn-padding-y;\n }\n }\n}","import React from 'react';\n\nimport { AppLinkHelper } from 'libs/common/backbone/core';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { SvgIcon } from 'libs/shared/utils/SvgHelper';\n\nimport { SvgContainer, SvgContainerSize } from '../svg-container/SvgContainer';\n\nimport styles from './pill-tab-selector.module.scss';\n\ninterface TabContentsProps {\n tab: PillTab;\n formatDisplayText?: (name: string) => string;\n}\n\nfunction TabContents(props: TabContentsProps): JSX.Element {\n return (\n <>\n {!!props.tab.svg && (\n <div className={props.tab.name ? 'pe-1' : ''}>\n <SvgContainer svg={props.tab.svg} size={props.tab.svgSize} />\n </div>\n )}\n\n {props.formatDisplayText?.(props.tab.name) ?? props.tab.name}\n\n {typeof (props.tab.count) === 'number' && (\n <div className='ps-2'>\n <Badge type={BadgeType.Count} data={props.tab.count} />\n </div>\n )}\n </>\n );\n}\n\nexport interface PillTab {\n name: string;\n active: boolean;\n svg?: SvgIcon;\n svgSize?: SvgContainerSize;\n\n className?: string;\n\n appLink?: Core.AppLink;\n onSelect?: () => void;\n\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n\n count?: number;\n\n hide?: boolean;\n}\n\ninterface PillTabSelectorProps {\n tabs: PillTab[];\n listClassName?: string;\n className?: string;\n borderRadius?: 'sm' | 'lg';\n enableSmallScreenSupport?: boolean;\n formatDisplayText?: (name: string) => string;\n forceSmallScreenDropdown?: boolean;\n}\n\nexport function PillTabSelector(props: PillTabSelectorProps): JSX.Element {\n const { borderRadius = 'lg' } = props;\n \n const breakpoints = useBreakpoints();\n \n function logAnalytics(tab: PillTab): void {\n if (tab.analyticsData && tab.analyticsOptions)\n AnalyticsHelper.logUserAction(tab.analyticsData, tab.analyticsOptions);\n }\n \n function onSelectTab(tab: PillTab): void {\n if (tab.active || !tab.onSelect)\n return;\n\n tab.onSelect();\n\n logAnalytics(tab);\n }\n\n function onChangeSelect(event: React.ChangeEvent<HTMLSelectElement>): void {\n const value = event.target.value;\n const tab = props.tabs.find(tab => tab.name === value);\n if (!tab || tab.active)\n return;\n \n logAnalytics(tab);\n AppLinkHelper.trigger(tab.appLink);\n }\n\n const selectedTab = props.tabs.find(tab => tab.active);\n const showSelectDropdown = props.forceSmallScreenDropdown\n || (props.enableSmallScreenSupport && (breakpoints.sm || breakpoints.xs));\n\n return (\n <nav className={props.className ?? ''}>\n {showSelectDropdown && (\n <select className='form-select' onChange={onChangeSelect} value={selectedTab?.name} style={{ minWidth: '150px' }}>\n {props.tabs.map((tab, index) => {\n if (tab.hide)\n return <React.Fragment key={index}/>;\n\n return (\n <option\n key={index}\n value={tab.name}>\n {props.formatDisplayText?.(tab.name) ?? tab.name}\n </option>\n );\n })}\n </select>\n )}\n \n {!showSelectDropdown && (\n <ul className={`\n list-unstyled d-inline-block m-0 ${styles.pillTabSelector}\n ${borderRadius ? styles.radiusSmall : ''}\n ${props.listClassName}\n `}>\n {props.tabs.map((tab, index) => {\n if (tab.hide)\n return <React.Fragment key={index}/>;\n \n return (\n <li\n className={`\n p-0 ${styles.tab} ${tab.active ? 'btn btn-dark' : 'btn btn-outline-dark'}\n ${tab.name ? styles.minWidth : ''} ${tab.className}\n `}\n key={index}\n >\n {tab.appLink ? (\n <AppLink\n appLink={tab.appLink}\n analyticsData={tab.analyticsData}\n analyticsOptions={tab.analyticsOptions}\n className={`\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ${styles.tabLink}\n `}\n >\n <TabContents tab={tab} formatDisplayText={props.formatDisplayText} />\n </AppLink>\n ) : (\n <DivButton\n className={`\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ${styles.tabLink}\n `}\n onClick={() => onSelectTab(tab)}\n >\n <TabContents tab={tab} formatDisplayText={props.formatDisplayText} />\n </DivButton>\n )}\n </li>\n );\n })}\n </ul>\n )}\n </nav>\n );\n}\n"],"mappings":"wcCwBA,SAAS,EAAY,EAAsC,CACzD,OACE,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,CACG,CAAC,CAAC,EAAM,IAAI,MACX,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,EAAM,IAAI,KAAO,OAAS,aACxC,EAAA,EAAA,KAAC,EAAD,CAAc,IAAK,EAAM,IAAI,IAAK,KAAM,EAAM,IAAI,QAAW,CAAA,CACzD,CAAA,CAGP,EAAM,oBAAoB,EAAM,IAAI,KAAK,EAAI,EAAM,IAAI,KAEvD,OAAQ,EAAM,IAAI,OAAW,WAC5B,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,iBACb,EAAA,EAAA,KAAC,EAAD,CAAO,KAAM,EAAU,MAAO,KAAM,EAAM,IAAI,MAAS,CAAA,CACnD,CAAA,CAEP,CAAA,CAAA,CAiCP,SAAgB,EAAgB,EAA0C,CACxE,GAAM,CAAE,eAAe,MAAS,EAE1B,EAAc,GAAgB,CAEpC,SAAS,EAAa,EAAoB,CACpC,EAAI,eAAiB,EAAI,kBAC3B,EAAgB,cAAc,EAAI,cAAe,EAAI,iBAAiB,CAG1E,SAAS,EAAY,EAAoB,CACnC,EAAI,QAAU,CAAC,EAAI,WAGvB,EAAI,UAAU,CAEd,EAAa,EAAI,EAGnB,SAAS,EAAe,EAAmD,CACzE,IAAM,EAAQ,EAAM,OAAO,MACrB,EAAM,EAAM,KAAK,KAAK,GAAO,EAAI,OAAS,EAAM,CAClD,CAAC,GAAO,EAAI,SAGhB,EAAa,EAAI,CACjB,EAAc,QAAQ,EAAI,QAAQ,EAGpC,IAAM,EAAc,EAAM,KAAK,KAAK,GAAO,EAAI,OAAO,CAChD,EAAqB,EAAM,0BAC3B,EAAM,2BAA6B,EAAY,IAAM,EAAY,IAEvE,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAW,EAAM,WAAa,YAAnC,CACG,IACC,EAAA,EAAA,KAAC,SAAD,CAAQ,UAAU,cAAc,SAAU,EAAgB,MAAO,GAAa,KAAM,MAAO,CAAE,SAAU,QAAS,UAC7G,EAAM,KAAK,KAAK,EAAK,IAChB,EAAI,MACC,EAAA,EAAA,KAAA,EAAO,SAAP,EAA6B,CAAR,EAAQ,EAGpC,EAAA,EAAA,KAAC,SAAD,CAEE,MAAO,EAAI,cACV,EAAM,oBAAoB,EAAI,KAAK,EAAI,EAAI,KACrC,CAHF,EAGE,EAGN,CAAA,CAGV,CAAC,IACA,EAAA,EAAA,KAAC,KAAD,CAAI,UAAW;6CACsB,EAAO,gBAAA;YACxC,EAAe,EAAO,YAAc,GAAA;YACpC,EAAM,cAAA;mBAEP,EAAM,KAAK,KAAK,EAAK,IAChB,EAAI,MACC,EAAA,EAAA,KAAA,EAAO,SAAP,EAA6B,CAAR,EAAQ,EAGpC,EAAA,EAAA,KAAC,KAAD,CACE,UAAW;sBACL,EAAO,IAAI,GAAG,EAAI,OAAS,eAAiB,uBAAA;kBAChD,EAAI,KAAO,EAAO,SAAW,GAAG,GAAG,EAAI,UAAA;yBAIxC,EAAI,SACH,EAAA,EAAA,KAAC,EAAD,CACE,QAAS,EAAI,QACb,cAAe,EAAI,cACnB,iBAAkB,EAAI,iBACtB,UAAW;;uEAEwC,EAAO,QAAA;8BAG1D,EAAA,EAAA,KAAC,EAAD,CAAkB,MAAK,kBAAmB,EAAM,kBAAqB,CAAA,CAC7D,CAAA,EAEV,EAAA,EAAA,KAAC,EAAD,CACE,UAAW;;uEAEwC,EAAO,QAAA;oBAE1D,YAAe,EAAY,EAAI,WAE/B,EAAA,EAAA,KAAC,EAAD,CAAkB,MAAK,kBAAmB,EAAM,kBAAqB,CAAA,CAC3D,CAAA,CAEX,CAzBE,EAyBF,EAGN,CAAA,CAAA"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{gt as e}from"./Dp9qJj1C.chunk.js";import{t}from"./ImQRQGZr.chunk.js";import{C as n,c as r,dt as i,l as a,lt as o,ut as s}from"./Dun43GrB.chunk.js";import{t as c}from"./B-OL6Vs7.chunk.js";import{l}from"./BQ5XMoHG.chunk.js";import{n as u}from"./C9ET3pjZ.chunk.js";import{t as d}from"./DeldjYRc.chunk.js";import"./CEsevkum.chunk.js";import{t as f}from"./BYYiNmLB.chunk.js";import"./BYFGYmGx2.chunk.js";import{t as p}from"./X4vTaPlk.chunk.js";import{M as m,X as h}from"./app-
|
|
1
|
+
import{gt as e}from"./Dp9qJj1C.chunk.js";import{t}from"./ImQRQGZr.chunk.js";import{C as n,c as r,dt as i,l as a,lt as o,ut as s}from"./Dun43GrB.chunk.js";import{t as c}from"./B-OL6Vs7.chunk.js";import{l}from"./BQ5XMoHG.chunk.js";import{n as u}from"./C9ET3pjZ.chunk.js";import{t as d}from"./DeldjYRc.chunk.js";import"./CEsevkum.chunk.js";import{t as f}from"./BYYiNmLB.chunk.js";import"./BYFGYmGx2.chunk.js";import{t as p}from"./X4vTaPlk.chunk.js";import{M as m,X as h}from"./app-gjHxcZG3.js";import{t as g}from"./DDKwae_D2.chunk.js";import{r as _}from"./BoeUzfPw2.chunk.js";import{t as v}from"./C9tPKnK22.chunk.js";import{i as y}from"./DobKejA8.chunk.js";var b=e(s()),x=o();function S(e){let t=`d-flex align-items-center badge-list ${_.minHeight}`;return e.className&&(t+=` ${e.className}`),(0,x.jsx)(`div`,{className:t,children:e.children})}var C={padNumber(e,t){let n=e.toString();if(n.length>=t)return n;for(t-=n.length;t>0;)n=`0`+n,t--;return n}},w={isSeries(e){return e?.typeId===p.Series},buildSeriesSeasonEpisodeText(e,t,n){if(!e)return``;if(!t||!n)return e.toUpperCase();let r=C.padNumber(t,2),i=C.padNumber(n,2);return`${e.toUpperCase()} S${r} • E${i}`},getRating(e){return e._rating?.value}},T={appLink:`_appLink_1owb0_1`,hoverUnderline:`_hoverUnderline_1owb0_4`},E=t.encloseNamespace(`shared.videoSubText`);function D(e){let{video:t}=e,{season:n}=t;if(!t.episodeNumber||!n)return(0,x.jsx)(x.Fragment,{});let r=C.padNumber(n.number,2),i=C.padNumber(t.episodeNumber,2);return(0,x.jsxs)(`span`,{className:`d-inline-block ${e.appLink?T.hoverUnderline:``}`,children:[e.withSeriesTitle&&(0,x.jsx)(x.Fragment,{children:`\xA0`}),!!r&&`S${r} \u2022 `,`E`,i]})}function O(e){let t=g.getReleaseDate(e.video);return t?g.hasSeries(e.video)?(0,x.jsx)(x.Fragment,{children:` \u2022 ${t}`}):(0,x.jsx)(x.Fragment,{children:t}):(0,x.jsx)(x.Fragment,{})}function k(e){let{appLink:t,video:o,className:s=``}=e,c=o?.series,l=g.getReleaseDate(e.video);if(!c?.id&&!l)return(0,x.jsx)(x.Fragment,{});let u=c?.id&&t&&{...t,args:t.args?t.args:[c.id,i.slugify(c.name)]},d={...e.analyticsData,id:c?.id,name:c?.name,videoId:o?.id,videoName:o?.name},f={...e.analyticsOptions,entity:a.Series,actionType:n.Click,descriptor:r.Title},p=w.buildSeriesSeasonEpisodeText(c?.name,o.season?.number,o.episodeNumber);return(0,x.jsxs)(y,{appLink:u,className:`d-block ${T.appLink} ${s}`,analyticsData:d,analyticsOptions:f,title:p,ariaLabel:`${E(`ariaSeries`)} ${p}`,children:[c?.name&&c.name,(0,x.jsx)(D,{...e,withSeriesTitle:!0}),(0,x.jsx)(O,{...e})]})}function A(e){let{appLink:t,video:o,className:s=``}=e,c=o?.productionCompanies?.data?.[0];if(!c?.id)return(0,x.jsx)(x.Fragment,{});let l=c?.id&&t&&{...t,args:t.args?t.args:[c.id,i.slugify(c.name)]},u={...e.analyticsData,id:c?.id,name:c?.name,videoId:o?.id,videoName:o?.name},d={...e.analyticsOptions,entity:a.Company,actionType:n.Click,descriptor:r.Title};return(0,x.jsx)(y,{appLink:l,className:`d-block ${T.appLink} ${s}`,analyticsData:u,analyticsOptions:d,title:c.name,ariaLabel:`${E(`ariaCompany`)} ${c.name}`,children:c.name})}function j(e){let{type:t=`series`}=e;return t===`none`?(0,x.jsx)(x.Fragment,{}):t===`series`?(0,x.jsx)(k,{...e}):(0,x.jsx)(A,{...e})}var M=b.createContext({hasProvider:!1});function N(){return b.useContext(M)}function P(e){return(0,x.jsx)(`svg`,{...e,children:(0,x.jsx)(`path`,{fillRule:`evenodd`,d:`M0 12C0 5.373 5.373 0 12 0s12 5.373 12 12-5.373 12-12 12S0 18.627 0 12m23 0c0-6.075-4.925-11-11-11S1 5.925 1 12s4.925 11 11 11 11-4.925 11-11M9 7.498c0-.551.387-.756.847-.469l7.306 4.567c.468.292.46.77 0 1.058l-7.306 4.567c-.468.292-.847.074-.847-.47z`,fill:`currentColor`})})}function F(e){return e.audience?(0,x.jsx)(`div`,{className:`audience-label border rounded-pill d-inline-block px-2 text-nowrap
|
|
2
2
|
${`border-`+e.border} ${e.className?e.className:``}`,children:e.audience.name}):(0,x.jsx)(x.Fragment,{})}function I(e,t){let n=b.useMemo(()=>!e?.length||!t||!v.shouldShowAudiences(t)?null:v.getSortedPresentationAudiences(e,t),[e]);return b.useMemo(()=>n?.length?v.getMergedPresentationAudienceString(n):null,[n])}function L(){let e=l(h.config()),{hasPermissions:t,isLoaded:n}=m();function r(e){if(!(`productionCompanies`in e))return null;let t=e.productionCompanies?.data?.[0];return t?.id?{application:c.DASHBOARD,action:d.Dashboard.COMPANY_DASHBOARD,args:[t.id,i.slugify(t.name)]}:null}function a(e){return{application:c.VIDEOS,action:d.Videos.CLASSROOM_GUIDE,args:[e]}}function o(e){return{application:c.VIDEOS,action:d.Videos.RESOURCE_GUIDANCE,args:[e]}}return{hasCommonVideoPropsCompleted:e.hasCompleted&&n,commonVideoProps:{subTextType:`productionCompany`,getSubTextAppLink:r,isPlugin:!1,canFavourite:null,setFavourite:null,imageCdnUrl:e.data?.imageCdnUrl,yearGroups:null,getInteractiveGuidanceAppLink:()=>null,getClassroomGuideAppLink:a,getResourceGuidanceAppLink:o,showNewVideoIndicator:!1,getCompanyLogoFallbackUrl:()=>f.StreamableLearning.LOGO,hasStudentExperience:t(u.StudentExperience),hasGuestExperience:!1,features:{showClassroomGuide:e=>g.canViewCurriculumLinks(t,e)}}}}export{N as a,w as c,P as i,S as l,I as n,D as o,F as r,j as s,L as t};
|
|
3
|
-
//# sourceMappingURL=
|
|
3
|
+
//# sourceMappingURL=DL4UFxRK.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DIavEegC.chunk.js","names":[],"sources":["../../../../libs/shared/src/components/badges/BadgeListContainer.tsx","../../../../libs/shared/src/utils/NumberHelper.ts","../../../../libs/shared/src/utils/SeriesHelper.ts","../../../../libs/shared/src/components/video-sub-text/video-sub-text.module.scss","../../../../libs/shared/src/components/video-sub-text/VideoSubText.tsx","../../../../libs/shared/src/context/player-context/PlayerContext.tsx","../../../../libs/shared/src/images/svg/actions/PlayCircleSvg.tsx","../../../../libs/shared/src/components/audience-label/AudienceLabel.tsx","../../../../libs/shared/src/hooks/UseMergeAudiences.ts","../../src/shared/hooks/useCommonVideoProps.ts"],"sourcesContent":["import * as React from 'react';\n\nimport styles from './badge.module.scss';\n\ninterface BadgeListContainerProps {\n className?: string;\n}\n\nexport function BadgeListContainer(props: React.PropsWithChildren<BadgeListContainerProps>): JSX.Element {\n let className = `d-flex align-items-center badge-list ${styles.minHeight}`;\n\n if (props.className)\n className += ` ${props.className}`;\n\n return (\n <div className={className}>\n {props.children}\n </div>\n );\n}\n","export const NumberHelper = {\n padNumber(num: number, padLength: number): string {\n let numberString = num.toString();\n\n if (numberString.length >= padLength)\n return numberString;\n\n padLength = padLength - numberString.length;\n\n while (padLength > 0) {\n numberString = '0' + numberString;\n padLength--;\n }\n return numberString;\n }\n};\n","import { MasterType } from 'libs/shared/enums/MasterType';\nimport { BaseObject, Rating, Series } from 'libs/shared/interfaces';\n\nimport { NumberHelper } from './NumberHelper';\n\nexport const SeriesHelper = {\n isSeries(obj: BaseObject): obj is Series {\n return obj?.typeId === MasterType.Series;\n },\n\n buildSeriesSeasonEpisodeText(seriesName: string, season?: number, episode?: number): string {\n if (!seriesName)\n return '';\n\n if (!season || !episode)\n return seriesName.toUpperCase();\n\n const seasonNum = NumberHelper.padNumber(season, 2);\n const episodeNum = NumberHelper.padNumber(episode, 2);\n\n return `${seriesName.toUpperCase()} S${seasonNum} • E${episodeNum}`;\n },\n\n getRating(series: Series): Rating {\n return series._rating?.value;\n }\n};\n",":local {\n .appLink {\n color: inherit;\n\n &:hover {\n .hoverUnderline {\n text-decoration: underline;\n }\n }\n }\n}","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, UserAction } from 'libs/analytics/interfaces/AnalyticsTypes';\n\nimport { Video } from 'libs/shared/interfaces';\nimport { NumberHelper } from 'libs/shared/utils/NumberHelper';\nimport { SeriesHelper } from 'libs/shared/utils/SeriesHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { TitleSubText } from '../title-sub-text/TitleSubText';\n\nconst namespace = 'shared.videoSubText';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nimport styles from './video-sub-text.module.scss';\n\nexport type VideoSubTextType = 'series' | 'productionCompany' | 'none';\n\ninterface SeriesLinkProps {\n video: Video;\n appLink?: Core.AppLink;\n className?: string;\n analyticsData?: HashObject;\n analyticsOptions: AnalyticsOptions; // Required as `location` needs to be supplied\n withSeriesTitle?: boolean;\n size?: 'sm' | 'lg';\n}\n\nexport function SeasonEpisode(props: Omit<SeriesLinkProps, 'analyticsOptions' | 'analyticsData'>): JSX.Element {\n const { video } = props;\n const { season } = video;\n\n if (!video.episodeNumber || !season)\n return <></>;\n\n const seasonNumber = NumberHelper.padNumber(season.number, 2);\n const episodeNumber = NumberHelper.padNumber(video.episodeNumber, 2);\n\n /* \\u2022 is the unicode number for • */\n return (\n <span className={`d-inline-block ${props.appLink ? styles.hoverUnderline : ''}`}>\n {props.withSeriesTitle && <> </>}\n {!!seasonNumber && `S${seasonNumber} \\u2022 `}\n E{episodeNumber}\n </span>\n );\n}\n\nfunction ReleaseDate(props: SeriesLinkProps): JSX.Element {\n const releaseDate = VideoHelper.getReleaseDate(props.video);\n\n if (!releaseDate)\n return <></>;\n\n if (VideoHelper.hasSeries(props.video))\n return <>{` \\u2022 ${releaseDate}`}</>;\n\n return <>{releaseDate}</>;\n}\n\nfunction SeriesLink(props: SeriesLinkProps): JSX.Element {\n const { appLink, video, className = '' } = props;\n\n const series = video?.series;\n const releaseDate = VideoHelper.getReleaseDate(props.video);\n\n if ((!series?.id) && !releaseDate)\n return <></>;\n\n const seriesAppLink: Core.AppLink = series?.id && appLink && {\n ...appLink,\n args: appLink.args ? appLink.args : [ series.id, TextHelper.slugify(series.name) ]\n };\n\n const analyticsData = { ...props.analyticsData,\n id: series?.id,\n name: series?.name,\n videoId: video?.id,\n videoName: video?.name\n };\n\n const analyticsOptions = {\n ...props.analyticsOptions,\n entity: EntityType.Series,\n actionType: UserAction.Click,\n descriptor: ClickDescriptor.Title\n };\n\n const seriesTitle = SeriesHelper.buildSeriesSeasonEpisodeText(\n series?.name,\n video.season?.number,\n video.episodeNumber\n );\n\n return (\n <TitleSubText\n appLink={seriesAppLink}\n className={`d-block ${styles.appLink} ${className}`}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n title={seriesTitle}\n ariaLabel={`${getPhrase('ariaSeries')} ${seriesTitle}`}\n >\n {series?.name && series.name}\n <SeasonEpisode {...props} withSeriesTitle />\n <ReleaseDate {...props} />\n </TitleSubText>\n );\n}\n\ninterface ProductionCompanyLinkProps {\n video: Video;\n appLink?: Core.AppLink;\n className?: string;\n analyticsData?: HashObject;\n analyticsOptions: AnalyticsOptions; // Required as `location` needs to be supplied\n size?: 'sm' | 'lg';\n}\n\nfunction ProductionCompanyLink(props: ProductionCompanyLinkProps): JSX.Element {\n const { appLink, video, className = '' } = props;\n\n const productionCompany = video?.productionCompanies?.data?.[0];\n\n if (!productionCompany?.id)\n return <></>;\n\n const companyAppLink: Core.AppLink = productionCompany?.id && appLink && {\n ...appLink,\n args: appLink.args ? appLink.args : [ productionCompany.id, TextHelper.slugify(productionCompany.name) ]\n };\n\n const analyticsData = { ...props.analyticsData,\n id: productionCompany?.id,\n name: productionCompany?.name,\n videoId: video?.id,\n videoName: video?.name\n };\n\n const analyticsOptions = {\n ...props.analyticsOptions,\n entity: EntityType.Company,\n actionType: UserAction.Click,\n descriptor: ClickDescriptor.Title\n };\n\n return (\n <TitleSubText\n appLink={companyAppLink}\n className={`d-block ${styles.appLink} ${className}`}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n title={productionCompany.name}\n ariaLabel={`${getPhrase('ariaCompany')} ${productionCompany.name}`}\n >\n {productionCompany.name}\n </TitleSubText>\n );\n}\n\ninterface VideoSubTextProps {\n type: VideoSubTextType;\n video: Video;\n appLink?: Core.AppLink;\n className?: string;\n analyticsData?: HashObject;\n analyticsOptions: AnalyticsOptions; // Required as `location` needs to be supplied\n size?: 'sm' | 'lg';\n}\n\nexport function VideoSubText(props: VideoSubTextProps): JSX.Element {\n const { type = 'series' } = props;\n\n if (type === 'none')\n return <></>;\n\n if (type === 'series')\n return <SeriesLink {...props} />;\n\n return <ProductionCompanyLink {...props} />;\n}\n\n","import React from 'react';\nimport { createHtmlPortalNode, HtmlPortalNode } from 'react-reverse-portal';\n\nimport { LocalStorageHelper } from 'libs/common/backbone/utils/LocalStorageHelper';\n\nimport { DefaultDisplayMode, PlayerInitializationData } from 'libs/shared/context/player-context/interfaces/PlayerContextAction';\nimport { PlayerContextState } from 'libs/shared/context/player-context/interfaces/PlayerContextState';\nimport { PlayerMode } from 'libs/shared/context/player-context/interfaces/PlayerMode';\nimport { PlayerReference } from 'libs/shared/context/player-context/interfaces/PlayerReference';\nimport { playerContextReducer } from 'libs/shared/context/player-context/reducer/PlayerContextReducer';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\n\nconst _THEATRE_MODE = 'play-page-theatre-mode';\n\nexport interface PlayerContextValues extends PlayerContextState {\n playerRef?: React.MutableRefObject<PlayerReference>;\n portalNode?: HtmlPortalNode;\n questionListPortalNode?: HtmlPortalNode;\n\n useInitialize?: (initializeData: PlayerInitializationData) => void;\n dispose?: () => void;\n setPlayerRef?: (player: any) => void;\n setPlayerMode?: (mode: PlayerMode) => void;\n setDefaultDisplayMode?: (displayMode: DefaultDisplayMode) => void;\n setStarted?: (started: boolean) => void;\n setPersist?: () => void;\n\n /**\n * Tells components if an instance of <PlayerContextProvider /> exists\n * above them in the tree. I.e. When this is used in curator.\n */\n hasProvider: boolean;\n}\n\nconst PlayerContext = React.createContext<PlayerContextValues>({ hasProvider: false });\n\nexport function usePlayerContext() {\n return React.useContext(PlayerContext);\n}\n\nfunction getInitialState(): PlayerContextState {\n const hasSavedTheatreMode = LocalStorageHelper.get(_THEATRE_MODE);\n\n return {\n defaultDisplayMode: hasSavedTheatreMode ? 'theatre' : 'normal'\n };\n}\n\nexport function PlayerContextProvider(props: React.PropsWithChildren) {\n const [ state, dispatch ] = React.useReducer(playerContextReducer, getInitialState());\n const { hasPreviewVideos } = useSettings(null);\n\n const playerRef = React.useRef<any>(null);\n\n const portalNode = React.useMemo(() => createHtmlPortalNode(\n { attributes: { class: 'cv-theatre-mode-video-container' } }\n ), []);\n\n const questionListPortalNode = React.useMemo(createHtmlPortalNode, []);\n\n function setPlayerRef(player: PlayerReference) {\n playerRef.current = player;\n }\n\n function useInitialize(initializeData: PlayerInitializationData) {\n const enabled = hasPreviewVideos || initializeData.mode !== 'hover';\n\n React.useEffect(() => {\n if (!enabled)\n return;\n\n /**\n * Cannot initialize a hover player if we already have a player elsewhere.\n */\n if (initializeData.mode === 'hover' && state.mode)\n return;\n\n /**\n * No hover to play on interactives. This feature is ComingSoon™️ - Sha\n */\n if (initializeData.mode === 'hover' && initializeData.objectTypeId === MasterType.Interactive)\n return;\n\n dispatch({\n type: 'initialize',\n data: initializeData\n });\n\n return disposeInternal;\n }, []);\n }\n\n function setPlayerMode(mode: PlayerMode) {\n dispatch({ type: 'mode', data: { mode } });\n }\n\n function setDefaultDisplayMode(defaultDisplayMode: DefaultDisplayMode) {\n LocalStorageHelper.set(_THEATRE_MODE, defaultDisplayMode === 'theatre');\n\n dispatch({ type: 'defaultDisplayMode', data: { defaultDisplayMode } });\n }\n\n function setStarted(): void {\n dispatch({ type: 'started' });\n }\n\n function disposeInternal(force: boolean = false): void {\n if (force) {\n playerRef.current = null;\n }\n\n dispatch({ type: 'dispose', data: { force: force } });\n }\n\n function setPersist(): void {\n dispatch({ type: 'persist' });\n }\n\n /**\n * If anything external calls dispose, we ignore the persist flag and force a disposal\n */\n function dispose(): void {\n disposeInternal(true);\n }\n\n const playerContextValues: PlayerContextValues = {\n ...state,\n playerRef,\n setPlayerRef,\n portalNode,\n questionListPortalNode,\n useInitialize,\n setPlayerMode,\n setDefaultDisplayMode,\n setStarted,\n dispose,\n setPersist,\n hasProvider: true\n };\n\n return (\n <PlayerContext.Provider value={playerContextValues}>\n {props.children}\n </PlayerContext.Provider>\n );\n}\n","import React from 'react';\n\nexport function PlayCircleSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fillRule='evenodd'\n d='M0 12C0 5.373 5.373 0 12 0s12 5.373 12 12-5.373 12-12 12S0 18.627 0 12m23 0c0-6.075-4.925-11-11-11S1 5.925 1 12s4.925 11 11 11 11-4.925 11-11M9 7.498c0-.551.387-.756.847-.469l7.306 4.567c.468.292.46.77 0 1.058l-7.306 4.567c-.468.292-.847.074-.847-.47z'\n fill='currentColor'\n />\n </svg>\n );\n}\n","import * as React from 'react';\n\nimport { Audience } from 'libs/shared/interfaces';\n\nimport styles from './audience-label.module.scss';\n\ntype AudienceBorderColour = 'dark' | 'white';\n\ninterface AudienceLabelProps {\n audience: Audience;\n border: AudienceBorderColour;\n className?: string;\n}\n\nexport function AudienceLabel(props: AudienceLabelProps): JSX.Element {\n if (!props.audience)\n return <></>;\n\n // Note: the audience-label class is applied so that parent components can override styling, and Online can style this component\n return (\n <div\n className={`audience-label border rounded-pill d-inline-block px-2 text-nowrap \n ${'border-' + props.border} ${props.className ? props.className : ''}`}\n >\n {props.audience.name}\n </div>\n );\n}\n\ninterface AudienceLabelListProps {\n audiences: Audience[];\n border: AudienceBorderColour;\n}\n\nexport function AudienceLabelList(props: AudienceLabelListProps): JSX.Element {\n if (!props.audiences || !props.audiences.length)\n return <></>;\n\n return (\n <>\n {props.audiences.map((a, idx) => (\n <span key={idx} className={styles.audienceLabelListItem}>\n <AudienceLabel audience={a} border={props.border} />\n </span>\n ))}\n </>\n );\n}\n","import React from 'react';\n\nimport { Audience, PresentationAudience } from '../interfaces';\nimport { AudienceHelper } from '../utils/audience-helper/AudienceHelper';\n\nexport function useMergeAudiences(\n audiences: Audience[],\n presentationAudiences: PresentationAudience[]\n): PresentationAudience {\n // Memoize the audience functions as they are somewhat expensive and the result shouldn't change\n const sortedAudiences = React.useMemo(() => {\n if (!audiences?.length || !presentationAudiences || !AudienceHelper.shouldShowAudiences(presentationAudiences))\n return null;\n\n return AudienceHelper.getSortedPresentationAudiences(audiences, presentationAudiences);\n }, [audiences]);\n\n const mergedAudience = React.useMemo(() => {\n if (!sortedAudiences?.length)\n return null;\n\n return AudienceHelper.getMergedPresentationAudienceString(sortedAudiences);\n }, [sortedAudiences]);\n\n return mergedAudience;\n}\n","import { Flight } from 'libs/common/react/index';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { Config, VideoTypes } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/StreamableActions';\nimport { AppChannels } from 'shared/constants/StreamableRadioChannels';\n\ninterface UseCommonVideoPropsResult {\n hasCommonVideoPropsCompleted: boolean;\n commonVideoProps: CommonVideoProps;\n}\n\nexport function useCommonVideoProps(): UseCommonVideoPropsResult {\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const { hasPermissions, isLoaded: hasLoadedPermissions } = usePermissions();\n\n function getSubTextAppLink(video: VideoTypes) {\n if (!('productionCompanies' in video))\n return null;\n\n const productionCompany = video.productionCompanies?.data?.[0];\n\n if (!productionCompany?.id)\n return null;\n\n return {\n application: AppChannels.DASHBOARD,\n action: Actions.Dashboard.COMPANY_DASHBOARD,\n args: [ productionCompany.id, TextHelper.slugify(productionCompany.name) ]\n };\n }\n\n function getClassroomGuideAppLink(id: string) {\n return {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.CLASSROOM_GUIDE,\n args: [id]\n };\n }\n\n function getResourceGuidanceAppLink(id: string) {\n return {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.RESOURCE_GUIDANCE,\n args: [id]\n };\n }\n\n const hasCommonVideoPropsCompleted = (\n config.hasCompleted &&\n hasLoadedPermissions\n );\n\n return {\n hasCommonVideoPropsCompleted,\n commonVideoProps: {\n subTextType: 'productionCompany',\n getSubTextAppLink,\n isPlugin: false,\n canFavourite: null,\n setFavourite: null,\n imageCdnUrl: config.data?.imageCdnUrl,\n yearGroups: null,\n getInteractiveGuidanceAppLink: () => null,\n getClassroomGuideAppLink,\n getResourceGuidanceAppLink,\n showNewVideoIndicator: false,\n getCompanyLogoFallbackUrl: () => ImageUrls.StreamableLearning.LOGO,\n hasStudentExperience: hasPermissions(PermissionName.StudentExperience),\n hasGuestExperience: false,\n features: {\n showClassroomGuide: (video: VideoTypes) => VideoHelper.canViewCurriculumLinks(hasPermissions, video)\n }\n }\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DL4UFxRK.chunk.js","names":[],"sources":["../../../../libs/shared/src/components/badges/BadgeListContainer.tsx","../../../../libs/shared/src/utils/NumberHelper.ts","../../../../libs/shared/src/utils/SeriesHelper.ts","../../../../libs/shared/src/components/video-sub-text/video-sub-text.module.scss","../../../../libs/shared/src/components/video-sub-text/VideoSubText.tsx","../../../../libs/shared/src/context/player-context/PlayerContext.tsx","../../../../libs/shared/src/images/svg/actions/PlayCircleSvg.tsx","../../../../libs/shared/src/components/audience-label/AudienceLabel.tsx","../../../../libs/shared/src/hooks/UseMergeAudiences.ts","../../src/shared/hooks/useCommonVideoProps.ts"],"sourcesContent":["import * as React from 'react';\n\nimport styles from './badge.module.scss';\n\ninterface BadgeListContainerProps {\n className?: string;\n}\n\nexport function BadgeListContainer(props: React.PropsWithChildren<BadgeListContainerProps>): JSX.Element {\n let className = `d-flex align-items-center badge-list ${styles.minHeight}`;\n\n if (props.className)\n className += ` ${props.className}`;\n\n return (\n <div className={className}>\n {props.children}\n </div>\n );\n}\n","export const NumberHelper = {\n padNumber(num: number, padLength: number): string {\n let numberString = num.toString();\n\n if (numberString.length >= padLength)\n return numberString;\n\n padLength = padLength - numberString.length;\n\n while (padLength > 0) {\n numberString = '0' + numberString;\n padLength--;\n }\n return numberString;\n }\n};\n","import { MasterType } from 'libs/shared/enums/MasterType';\nimport { BaseObject, Rating, Series } from 'libs/shared/interfaces';\n\nimport { NumberHelper } from './NumberHelper';\n\nexport const SeriesHelper = {\n isSeries(obj: BaseObject): obj is Series {\n return obj?.typeId === MasterType.Series;\n },\n\n buildSeriesSeasonEpisodeText(seriesName: string, season?: number, episode?: number): string {\n if (!seriesName)\n return '';\n\n if (!season || !episode)\n return seriesName.toUpperCase();\n\n const seasonNum = NumberHelper.padNumber(season, 2);\n const episodeNum = NumberHelper.padNumber(episode, 2);\n\n return `${seriesName.toUpperCase()} S${seasonNum} • E${episodeNum}`;\n },\n\n getRating(series: Series): Rating {\n return series._rating?.value;\n }\n};\n",":local {\n .appLink {\n color: inherit;\n\n &:hover {\n .hoverUnderline {\n text-decoration: underline;\n }\n }\n }\n}","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, UserAction } from 'libs/analytics/interfaces/AnalyticsTypes';\n\nimport { Video } from 'libs/shared/interfaces';\nimport { NumberHelper } from 'libs/shared/utils/NumberHelper';\nimport { SeriesHelper } from 'libs/shared/utils/SeriesHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { TitleSubText } from '../title-sub-text/TitleSubText';\n\nconst namespace = 'shared.videoSubText';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nimport styles from './video-sub-text.module.scss';\n\nexport type VideoSubTextType = 'series' | 'productionCompany' | 'none';\n\ninterface SeriesLinkProps {\n video: Video;\n appLink?: Core.AppLink;\n className?: string;\n analyticsData?: HashObject;\n analyticsOptions: AnalyticsOptions; // Required as `location` needs to be supplied\n withSeriesTitle?: boolean;\n size?: 'sm' | 'lg';\n}\n\nexport function SeasonEpisode(props: Omit<SeriesLinkProps, 'analyticsOptions' | 'analyticsData'>): JSX.Element {\n const { video } = props;\n const { season } = video;\n\n if (!video.episodeNumber || !season)\n return <></>;\n\n const seasonNumber = NumberHelper.padNumber(season.number, 2);\n const episodeNumber = NumberHelper.padNumber(video.episodeNumber, 2);\n\n /* \\u2022 is the unicode number for • */\n return (\n <span className={`d-inline-block ${props.appLink ? styles.hoverUnderline : ''}`}>\n {props.withSeriesTitle && <> </>}\n {!!seasonNumber && `S${seasonNumber} \\u2022 `}\n E{episodeNumber}\n </span>\n );\n}\n\nfunction ReleaseDate(props: SeriesLinkProps): JSX.Element {\n const releaseDate = VideoHelper.getReleaseDate(props.video);\n\n if (!releaseDate)\n return <></>;\n\n if (VideoHelper.hasSeries(props.video))\n return <>{` \\u2022 ${releaseDate}`}</>;\n\n return <>{releaseDate}</>;\n}\n\nfunction SeriesLink(props: SeriesLinkProps): JSX.Element {\n const { appLink, video, className = '' } = props;\n\n const series = video?.series;\n const releaseDate = VideoHelper.getReleaseDate(props.video);\n\n if ((!series?.id) && !releaseDate)\n return <></>;\n\n const seriesAppLink: Core.AppLink = series?.id && appLink && {\n ...appLink,\n args: appLink.args ? appLink.args : [ series.id, TextHelper.slugify(series.name) ]\n };\n\n const analyticsData = { ...props.analyticsData,\n id: series?.id,\n name: series?.name,\n videoId: video?.id,\n videoName: video?.name\n };\n\n const analyticsOptions = {\n ...props.analyticsOptions,\n entity: EntityType.Series,\n actionType: UserAction.Click,\n descriptor: ClickDescriptor.Title\n };\n\n const seriesTitle = SeriesHelper.buildSeriesSeasonEpisodeText(\n series?.name,\n video.season?.number,\n video.episodeNumber\n );\n\n return (\n <TitleSubText\n appLink={seriesAppLink}\n className={`d-block ${styles.appLink} ${className}`}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n title={seriesTitle}\n ariaLabel={`${getPhrase('ariaSeries')} ${seriesTitle}`}\n >\n {series?.name && series.name}\n <SeasonEpisode {...props} withSeriesTitle />\n <ReleaseDate {...props} />\n </TitleSubText>\n );\n}\n\ninterface ProductionCompanyLinkProps {\n video: Video;\n appLink?: Core.AppLink;\n className?: string;\n analyticsData?: HashObject;\n analyticsOptions: AnalyticsOptions; // Required as `location` needs to be supplied\n size?: 'sm' | 'lg';\n}\n\nfunction ProductionCompanyLink(props: ProductionCompanyLinkProps): JSX.Element {\n const { appLink, video, className = '' } = props;\n\n const productionCompany = video?.productionCompanies?.data?.[0];\n\n if (!productionCompany?.id)\n return <></>;\n\n const companyAppLink: Core.AppLink = productionCompany?.id && appLink && {\n ...appLink,\n args: appLink.args ? appLink.args : [ productionCompany.id, TextHelper.slugify(productionCompany.name) ]\n };\n\n const analyticsData = { ...props.analyticsData,\n id: productionCompany?.id,\n name: productionCompany?.name,\n videoId: video?.id,\n videoName: video?.name\n };\n\n const analyticsOptions = {\n ...props.analyticsOptions,\n entity: EntityType.Company,\n actionType: UserAction.Click,\n descriptor: ClickDescriptor.Title\n };\n\n return (\n <TitleSubText\n appLink={companyAppLink}\n className={`d-block ${styles.appLink} ${className}`}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n title={productionCompany.name}\n ariaLabel={`${getPhrase('ariaCompany')} ${productionCompany.name}`}\n >\n {productionCompany.name}\n </TitleSubText>\n );\n}\n\ninterface VideoSubTextProps {\n type: VideoSubTextType;\n video: Video;\n appLink?: Core.AppLink;\n className?: string;\n analyticsData?: HashObject;\n analyticsOptions: AnalyticsOptions; // Required as `location` needs to be supplied\n size?: 'sm' | 'lg';\n}\n\nexport function VideoSubText(props: VideoSubTextProps): JSX.Element {\n const { type = 'series' } = props;\n\n if (type === 'none')\n return <></>;\n\n if (type === 'series')\n return <SeriesLink {...props} />;\n\n return <ProductionCompanyLink {...props} />;\n}\n\n","import React from 'react';\nimport { createHtmlPortalNode, HtmlPortalNode } from 'react-reverse-portal';\n\nimport { LocalStorageHelper } from 'libs/common/backbone/utils/LocalStorageHelper';\n\nimport { DefaultDisplayMode, PlayerInitializationData } from 'libs/shared/context/player-context/interfaces/PlayerContextAction';\nimport { PlayerContextState } from 'libs/shared/context/player-context/interfaces/PlayerContextState';\nimport { PlayerMode } from 'libs/shared/context/player-context/interfaces/PlayerMode';\nimport { PlayerReference } from 'libs/shared/context/player-context/interfaces/PlayerReference';\nimport { playerContextReducer } from 'libs/shared/context/player-context/reducer/PlayerContextReducer';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\n\nconst _THEATRE_MODE = 'play-page-theatre-mode';\n\nexport interface PlayerContextValues extends PlayerContextState {\n playerRef?: React.MutableRefObject<PlayerReference>;\n portalNode?: HtmlPortalNode;\n questionListPortalNode?: HtmlPortalNode;\n\n useInitialize?: (initializeData: PlayerInitializationData) => void;\n dispose?: () => void;\n setPlayerRef?: (player: any) => void;\n setPlayerMode?: (mode: PlayerMode) => void;\n setDefaultDisplayMode?: (displayMode: DefaultDisplayMode) => void;\n setStarted?: (started: boolean) => void;\n setPersist?: () => void;\n\n /**\n * Tells components if an instance of <PlayerContextProvider /> exists\n * above them in the tree. I.e. When this is used in curator.\n */\n hasProvider: boolean;\n}\n\nconst PlayerContext = React.createContext<PlayerContextValues>({ hasProvider: false });\n\nexport function usePlayerContext() {\n return React.useContext(PlayerContext);\n}\n\nfunction getInitialState(): PlayerContextState {\n const hasSavedTheatreMode = LocalStorageHelper.get(_THEATRE_MODE);\n\n return {\n defaultDisplayMode: hasSavedTheatreMode ? 'theatre' : 'normal'\n };\n}\n\nexport function PlayerContextProvider(props: React.PropsWithChildren) {\n const [ state, dispatch ] = React.useReducer(playerContextReducer, getInitialState());\n const { hasPreviewVideos } = useSettings(null);\n\n const playerRef = React.useRef<any>(null);\n\n const portalNode = React.useMemo(() => createHtmlPortalNode(\n { attributes: { class: 'cv-theatre-mode-video-container' } }\n ), []);\n\n const questionListPortalNode = React.useMemo(createHtmlPortalNode, []);\n\n function setPlayerRef(player: PlayerReference) {\n playerRef.current = player;\n }\n\n function useInitialize(initializeData: PlayerInitializationData) {\n const enabled = hasPreviewVideos || initializeData.mode !== 'hover';\n\n React.useEffect(() => {\n if (!enabled)\n return;\n\n /**\n * Cannot initialize a hover player if we already have a player elsewhere.\n */\n if (initializeData.mode === 'hover' && state.mode)\n return;\n\n /**\n * No hover to play on interactives. This feature is ComingSoon™️ - Sha\n */\n if (initializeData.mode === 'hover' && initializeData.objectTypeId === MasterType.Interactive)\n return;\n\n dispatch({\n type: 'initialize',\n data: initializeData\n });\n\n return disposeInternal;\n }, []);\n }\n\n function setPlayerMode(mode: PlayerMode) {\n dispatch({ type: 'mode', data: { mode } });\n }\n\n function setDefaultDisplayMode(defaultDisplayMode: DefaultDisplayMode) {\n LocalStorageHelper.set(_THEATRE_MODE, defaultDisplayMode === 'theatre');\n\n dispatch({ type: 'defaultDisplayMode', data: { defaultDisplayMode } });\n }\n\n function setStarted(): void {\n dispatch({ type: 'started' });\n }\n\n function disposeInternal(force: boolean = false): void {\n if (force) {\n playerRef.current = null;\n }\n\n dispatch({ type: 'dispose', data: { force: force } });\n }\n\n function setPersist(): void {\n dispatch({ type: 'persist' });\n }\n\n /**\n * If anything external calls dispose, we ignore the persist flag and force a disposal\n */\n function dispose(): void {\n disposeInternal(true);\n }\n\n const playerContextValues: PlayerContextValues = {\n ...state,\n playerRef,\n setPlayerRef,\n portalNode,\n questionListPortalNode,\n useInitialize,\n setPlayerMode,\n setDefaultDisplayMode,\n setStarted,\n dispose,\n setPersist,\n hasProvider: true\n };\n\n return (\n <PlayerContext.Provider value={playerContextValues}>\n {props.children}\n </PlayerContext.Provider>\n );\n}\n","import React from 'react';\n\nexport function PlayCircleSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fillRule='evenodd'\n d='M0 12C0 5.373 5.373 0 12 0s12 5.373 12 12-5.373 12-12 12S0 18.627 0 12m23 0c0-6.075-4.925-11-11-11S1 5.925 1 12s4.925 11 11 11 11-4.925 11-11M9 7.498c0-.551.387-.756.847-.469l7.306 4.567c.468.292.46.77 0 1.058l-7.306 4.567c-.468.292-.847.074-.847-.47z'\n fill='currentColor'\n />\n </svg>\n );\n}\n","import * as React from 'react';\n\nimport { Audience } from 'libs/shared/interfaces';\n\nimport styles from './audience-label.module.scss';\n\ntype AudienceBorderColour = 'dark' | 'white';\n\ninterface AudienceLabelProps {\n audience: Audience;\n border: AudienceBorderColour;\n className?: string;\n}\n\nexport function AudienceLabel(props: AudienceLabelProps): JSX.Element {\n if (!props.audience)\n return <></>;\n\n // Note: the audience-label class is applied so that parent components can override styling, and Online can style this component\n return (\n <div\n className={`audience-label border rounded-pill d-inline-block px-2 text-nowrap \n ${'border-' + props.border} ${props.className ? props.className : ''}`}\n >\n {props.audience.name}\n </div>\n );\n}\n\ninterface AudienceLabelListProps {\n audiences: Audience[];\n border: AudienceBorderColour;\n}\n\nexport function AudienceLabelList(props: AudienceLabelListProps): JSX.Element {\n if (!props.audiences || !props.audiences.length)\n return <></>;\n\n return (\n <>\n {props.audiences.map((a, idx) => (\n <span key={idx} className={styles.audienceLabelListItem}>\n <AudienceLabel audience={a} border={props.border} />\n </span>\n ))}\n </>\n );\n}\n","import React from 'react';\n\nimport { Audience, PresentationAudience } from '../interfaces';\nimport { AudienceHelper } from '../utils/audience-helper/AudienceHelper';\n\nexport function useMergeAudiences(\n audiences: Audience[],\n presentationAudiences: PresentationAudience[]\n): PresentationAudience {\n // Memoize the audience functions as they are somewhat expensive and the result shouldn't change\n const sortedAudiences = React.useMemo(() => {\n if (!audiences?.length || !presentationAudiences || !AudienceHelper.shouldShowAudiences(presentationAudiences))\n return null;\n\n return AudienceHelper.getSortedPresentationAudiences(audiences, presentationAudiences);\n }, [audiences]);\n\n const mergedAudience = React.useMemo(() => {\n if (!sortedAudiences?.length)\n return null;\n\n return AudienceHelper.getMergedPresentationAudienceString(sortedAudiences);\n }, [sortedAudiences]);\n\n return mergedAudience;\n}\n","import { Flight } from 'libs/common/react/index';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { Config, VideoTypes } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/StreamableActions';\nimport { AppChannels } from 'shared/constants/StreamableRadioChannels';\n\ninterface UseCommonVideoPropsResult {\n hasCommonVideoPropsCompleted: boolean;\n commonVideoProps: CommonVideoProps;\n}\n\nexport function useCommonVideoProps(): UseCommonVideoPropsResult {\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const { hasPermissions, isLoaded: hasLoadedPermissions } = usePermissions();\n\n function getSubTextAppLink(video: VideoTypes) {\n if (!('productionCompanies' in video))\n return null;\n\n const productionCompany = video.productionCompanies?.data?.[0];\n\n if (!productionCompany?.id)\n return null;\n\n return {\n application: AppChannels.DASHBOARD,\n action: Actions.Dashboard.COMPANY_DASHBOARD,\n args: [ productionCompany.id, TextHelper.slugify(productionCompany.name) ]\n };\n }\n\n function getClassroomGuideAppLink(id: string) {\n return {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.CLASSROOM_GUIDE,\n args: [id]\n };\n }\n\n function getResourceGuidanceAppLink(id: string) {\n return {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.RESOURCE_GUIDANCE,\n args: [id]\n };\n }\n\n const hasCommonVideoPropsCompleted = (\n config.hasCompleted &&\n hasLoadedPermissions\n );\n\n return {\n hasCommonVideoPropsCompleted,\n commonVideoProps: {\n subTextType: 'productionCompany',\n getSubTextAppLink,\n isPlugin: false,\n canFavourite: null,\n setFavourite: null,\n imageCdnUrl: config.data?.imageCdnUrl,\n yearGroups: null,\n getInteractiveGuidanceAppLink: () => null,\n getClassroomGuideAppLink,\n getResourceGuidanceAppLink,\n showNewVideoIndicator: false,\n getCompanyLogoFallbackUrl: () => ImageUrls.StreamableLearning.LOGO,\n hasStudentExperience: hasPermissions(PermissionName.StudentExperience),\n hasGuestExperience: false,\n features: {\n showClassroomGuide: (video: VideoTypes) => VideoHelper.canViewCurriculumLinks(hasPermissions, video)\n }\n }\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"./Dp9qJj1C.chunk.js";import{lt as e,ut as t}from"./Dun43GrB.chunk.js";import{t as n}from"./CFXUbsBS.chunk.js";import{n as r}from"./CAEQvGr_.chunk.js";import{Z as i}from"./app-
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import"./Dp9qJj1C.chunk.js";import{lt as e,ut as t}from"./Dun43GrB.chunk.js";import{t as n}from"./CFXUbsBS.chunk.js";import{n as r}from"./CAEQvGr_.chunk.js";import{Z as i}from"./app-gjHxcZG3.js";import{t as a}from"./EF7Q4oN02.chunk.js";t();var o=e();function s(e){return(0,o.jsx)(`svg`,{...e,children:(0,o.jsx)(`path`,{fill:`currentColor`,d:`M9.2 6h5.6V4.6a.6.6 0 1 1 1.2 0V6h2a1 1 0 0 1 1 1v11a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V7a1 1 0 0 1 1-1h2V4.6a.6.6 0 0 1 1.2 0zm8.8 5H6v7a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1zm-3.2 1.976a.51.51 0 0 0-.046-.706.477.477 0 0 0-.686.047l-3.063 3.598-1.092-1.122a.477.477 0 0 0-.688 0 .51.51 0 0 0 0 .707l1.46 1.5a.48.48 0 0 0 .71-.024z`})})}var c={livestream(e){return{url:r.urlBuilder(`/api/discover/v1/livestreams/${e}`,{query:`audiences,recording`}),key:`streamable:livestream:${e}}`}},calendarLivestreams(e){let t=Object.keys(e).map(t=>`${t}:${e[t]}`).join(`:`);return{url:r.urlBuilder(`/api/discover/v1/livestreams`,{status:a.Published,limit:100,query:`audiences`,...e}),key:`streamable:calendar:livestreams:${t}`,normalize:!1,formatData:e=>e.data.map(e=>({id:e.id,startDate:n.format(i.convertUTCToTimezoneDate(e.startDateTime),`YYYY-MM-DD`),type:`Livestream`,name:e.name,description:e.description,content:e}))}}};export{s as n,c as t};
|
|
2
|
+
//# sourceMappingURL=DLofRa642.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"DLofRa642.chunk.js","names":[],"sources":["../../../../libs/shared/src/images/svg/objects/CalendarCheckSvg.tsx","../../src/shared/flight-requests/LivestreamRequests.ts"],"sourcesContent":["import React from 'react';\n\nexport function CalendarCheckSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fill='currentColor'\n d='M9.2 6h5.6V4.6a.6.6 0 1 1 1.2 0V6h2a1 1 0 0 1 1 1v11a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V7a1 1 0 0 1 1-1h2V4.6a.6.6 0 0 1 1.2 0zm8.8 5H6v7a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1zm-3.2 1.976a.51.51 0 0 0-.046-.706.477.477 0 0 0-.686.047l-3.063 3.598-1.092-1.122a.477.477 0 0 0-.688 0 .51.51 0 0 0 0 .707l1.46 1.5a.48.48 0 0 0 .71-.024z'\n />\n </svg>\n );\n}\n","import { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/react/index';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { TimezoneHelper } from 'libs/shared/apps/streamable-learning/utils/TimezoneHelper';\nimport { CurationStatus } from 'libs/shared/enums/CurationStatus';\nimport { BasePaginatedCollection, CalendarEvent, Livestream } from 'libs/shared/interfaces';\n\nexport const LivestreamRequests = {\n livestream(\n id: string\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`/api/discover/v1/livestreams/${id}`, { query: 'audiences,recording' }),\n key: `streamable:livestream:${id}}`\n };\n },\n calendarLivestreams(queryParams: HashObject): Flight.Request {\n const key = Object.keys(queryParams).map(param => `${param}:${queryParams[param]}`).join(':');\n\n return {\n url: UrlHelper.urlBuilder(`/api/discover/v1/livestreams`, {\n status: CurationStatus.Published,\n limit: 100,\n query: 'audiences',\n ...queryParams\n }),\n key: `streamable:calendar:livestreams:${key}`,\n normalize: false,\n formatData: (paginatedData: BasePaginatedCollection<Livestream>): CalendarEvent<Livestream>[] => {\n return paginatedData.data.map(livestream => ({\n id: livestream.id,\n startDate: DateHelper.format(TimezoneHelper.convertUTCToTimezoneDate(livestream.startDateTime), 'YYYY-MM-DD'),\n type: 'Livestream',\n name: livestream.name,\n description: livestream.description,\n content: livestream\n }));\n }\n };\n }\n};\n"],"mappings":"0PAEA,SAAgB,EAAiB,EAAsC,CACrE,OACE,EAAA,EAAA,KAAC,MAAD,CAAK,GAAI,YACP,EAAA,EAAA,KAAC,OAAD,CACE,KAAK,eACL,EAAE,mUACF,CAAA,CACE,CAAA,CCAV,IAAa,EAAqB,CAChC,WACE,EACgB,CAChB,MAAO,CACL,IAAK,EAAU,WAAW,gCAAgC,IAAM,CAAE,MAAO,sBAAuB,CAAC,CACjG,IAAK,yBAAyB,EAAG,GAClC,EAEH,oBAAoB,EAAyC,CAC3D,IAAM,EAAM,OAAO,KAAK,EAAY,CAAC,IAAI,GAAS,GAAG,EAAM,GAAG,EAAY,KAAS,CAAC,KAAK,IAAI,CAE7F,MAAO,CACL,IAAK,EAAU,WAAW,+BAAgC,CACxD,OAAQ,EAAe,UACvB,MAAO,IACP,MAAO,YACP,GAAG,EACJ,CAAC,CACF,IAAK,mCAAmC,IACxC,UAAW,GACX,WAAa,GACJ,EAAc,KAAK,IAAI,IAAe,CAC3C,GAAI,EAAW,GACf,UAAW,EAAW,OAAO,EAAe,yBAAyB,EAAW,cAAc,CAAE,aAAa,CAC7G,KAAM,aACN,KAAM,EAAW,KACjB,YAAa,EAAW,YACxB,QAAS,EACV,EAAE,CAEN,EAEJ"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{b as e,gt as t}from"./Dp9qJj1C.chunk.js";import{a as n,n as r,t as i}from"./BJvPfCvt.chunk.js";import{t as a}from"./ImQRQGZr.chunk.js";import{j as o,lt as s,ut as c}from"./Dun43GrB.chunk.js";import{t as l}from"./CFXUbsBS.chunk.js";import{n as u}from"./D86qrFLE.chunk.js";import{t as d}from"./Ca1QPe-q2.chunk.js";import{t as f}from"./Cz6swPXe2.chunk.js";import{n as p}from"./D7d5XFW82.chunk.js";import{a as m,i as h,r as g,t as _}from"./D2om474U2.chunk.js";import{N as v,P as y}from"./app-BIigh9wv.js";import{t as b}from"./xFUSLNcp.chunk.js";import{t as ee}from"./CUUUI6pl.chunk.js";import{t as x}from"./DXfGdqxs.chunk.js";import{t as S}from"./CyxOxJjg2.chunk.js";import{t as C}from"./Bt57Tmef2.chunk.js";import{n as w,r as te}from"./smdLElLq.chunk.js";import{r as T,t as E}from"./BBWlVBxr.chunk.js";import{t as D}from"./etRy6yC_.chunk.js";import{i as ne}from"./ClGIvvk6.chunk.js";var O=t(o()),k={renderInPortalIfExists(e,t){return t?(0,O.createPortal)(e,t):e}},A=t(c()),j=s(),M=`shared.backButton`;N.defaultProps={color:`black`,extraClasses:``};function N(e){let{backToName:t,appLink:n,color:o,extraClasses:s,textShadow:c}={textShadow:!0,...e},l=t?a.getPhrase(M,`backTo`,{backToName:t}):a.getPhrase(M,`back`);return(0,j.jsxs)(d,{appLink:n,className:`d-inline-flex align-items-center h5 mb-0 ${s} ${o===`black`?``:`text-white`} ${c?`text-shadow`:``}`,children:[(0,j.jsx)(i,{svg:x,size:r.Medium}),(0,j.jsx)(`span`,{className:`ms-1`,children:l})]})}var re=`${D[h.Banners].width}:${D[h.Banners].height}`,P=1200,F=1920;function I(e){return e.xxl?F:P}function L(e,t,n,r){let i={className:`banner banner-header ${n}`,style:t?{backgroundImage:`url('${t}')`}:{}};return!e&&r&&(delete i.style,i.className+=` ${r}`),i}function R(e){let{heading:t,banner:n,logo:r,imageCdnUrl:i,bannerClassName:a,blockColourClass:o}=e,s=v(),c=A.useContext(y),l=I(s),u=e.bannerImageOptions||{width:l,ratio:re,resizeType:m.Cover},d=n&&i?_.createBannerUrl(n,{fallbackBaseUrl:i,fallbackCategoryName:t,type:h.Banners},u):void 0,f=E(t,T);return{logoUrl:r&&i?_.createUrl(r.url,{size:g.Medium}):void 0,bannerUrl:d,containerProps:L(n,d,a,o),portalContainerContext:c,logoFallbackBgClassName:f}}var z={bannerContent:`_bannerContent_168u8_1`,actionsContainer:`_actionsContainer_168u8_9`,bannerContentWithLogo:`_bannerContentWithLogo_168u8_18`,container:`_container_168u8_22`,logoContainer:`_logoContainer_168u8_26`,logoContainerLeft:`_logoContainerLeft_168u8_37`,logoHeading:`_logoHeading_168u8_41`,specialEventContainer:`_specialEventContainer_168u8_44`,headingLarge:`_headingLarge_168u8_68`,heading:`_heading_168u8_68`};function B(e){return e.length<160?`h1`:z.headingLarge}var V=`shared.defaultBannerHeader`,H=A.memo(function(e){let{heading:t,banner:n,imageCdnUrl:r,actions:i,sortComponent:a,blockColourClass:o,specialEvent:s}=e,{logoUrl:c,portalContainerContext:u,logoFallbackBgClassName:d,containerProps:f}=R({heading:t,banner:n,blockColourClass:o,bannerClassName:e.bannerClassName,imageCdnUrl:r,logo:e.logo,bannerImageOptions:e.imageOptions}),m=A.useMemo(()=>{if(!s||e.showComingSoon)return!1;let t=l.format(new Date,`YYYY-MM-DD`);return s.endDate?s.startDate<=t&&s.endDate>=t:s.startDate===t},[s]);function h(e){return!e.endDate||l.isSame(e.startDate,e.endDate,`month`)?l.format(e.startDate,`MMMM`):`${l.format(e.startDate,`MMM`)} - ${l.format(e.endDate,`MMM`)}`}let g=e.detailsComponent;return k.renderInPortalIfExists((0,j.jsx)(`header`,{...f,children:(0,j.jsxs)(`div`,{className:`container ${z.container} position-relative inner-banner`,children:[e.backButtonAppLink&&(0,j.jsx)(`div`,{className:`pt-3`,children:(0,j.jsx)(N,{appLink:e.backButtonAppLink,backToName:e.backButtonText,extraClasses:e.backButtonClasses,color:`white`})}),(0,j.jsxs)(`div`,{className:`${e.alignLogoLeft?`position-absolute top-50 start-0 translate-middle-y w-100 ps-4`:`${z.bannerContent} px-2 ${e.logo?.url?z.bannerContentWithLogo:``}`}`,children:[!!s&&(0,j.jsx)(`div`,{className:`position-relative ${z.specialEventContainer}`,children:(0,j.jsx)(te,{body:{type:s.endDate?`range`:`day`,text:s.endDate?`${l.format(s.startDate,`DD`)}-${l.format(s.endDate,`DD`)}`:l.format(s.startDate,`DD`)},month:h(s),theme:e.calendarTheme})}),(0,j.jsxs)(`div`,{children:[m&&(0,j.jsx)(`div`,{className:`rounded-pill py-1 px-2 my-1 me-1 fw-semibold bg-light-blue lh-1 d-inline-block`,children:(0,j.jsx)(p,{namespace:V,phrase:`onToday`})}),e.showComingSoon&&(0,j.jsx)(S,{className:`pe-2 fw-semibold mb-1 rounded-pill justify-content-start text-nowrap`}),(0,j.jsxs)(`div`,{className:`d-flex align-items-center`,children:[e.alignLogoLeft&&e.logo?.url&&(0,j.jsx)(`div`,{className:`${z.logoContainerLeft} d-none d-md-block rounded-circle overflow-hidden me-3 ${d}`,children:(0,j.jsx)(C,{src:c,style:{backgroundColor:e.logoBgColour}})}),(0,j.jsxs)(`h1`,{className:`text-white text-shadow pe-3 position-static ${z.heading} ${B(t)} ${e.alignLogoLeft?`w-50`:``}`,children:[t,g&&(0,j.jsx)(g,{})]})]})]}),!!i&&(0,j.jsx)(`div`,{className:z.actionsContainer,children:(0,j.jsx)(ee,{actions:i,sortComponent:a,actionsDropdownClassName:e.actionsDropdownClassName})})]}),!e.alignLogoLeft&&!!e.logo?.url&&(0,j.jsx)(`div`,{className:z.logoContainer,children:(0,j.jsx)(`img`,{src:c,className:`rounded-circle`})})]})}),u?.container)},(e,t)=>e.actions===t.actions&&e.heading===t.heading&&e.logo?.url===t.logo?.url);function U(){let e=A.useContext(y);return k.renderInPortalIfExists((0,j.jsx)(`div`,{className:`partial-banner partial-loading-background ${z.banner}`}),e?.container)}function W(e){let t=A.useRef(null),[n,r]=A.useState({loaded:!1,isPlaying:!1,isFinished:!1});function i(e,t){r(n=>({...n,[e]:t}))}let a={loadstart:()=>{e?.onInit?.()},canplay:()=>{typeof e?.addDelayOnLoad==`number`?(s(),t.current?.autoplay&&(t.current.autoplay=!1),setTimeout(()=>{i(`loaded`,!0),o()},e.addDelayOnLoad)):i(`loaded`,!0)},play:()=>{i(`isPlaying`,!0),e?.onPlay?.()},pause:()=>{i(`isPlaying`,!1),e?.onPause?.()},ended:()=>{r(e=>({...e,isPlaying:!1,isFinished:!0})),e?.onEnd?.()}};A.useEffect(()=>{if(Object.keys(a).length)return Object.entries(a).forEach(([e,n])=>{t.current?.addEventListener(e,n)}),()=>{Object.entries(a).forEach(([e,n])=>{t.current?.removeEventListener(e,n)})}},[t.current]);function o(){n.isPlaying||(t.current?.play(),r(e=>({...e,isPlaying:!0,isFinished:!1})))}function s(){n.isPlaying&&(t.current?.pause(),i(`isPlaying`,!1))}function c(){n.isPlaying?(s(),e?.log?.({type:`click-video-banner-controls`,control:`pause`})):(o(),e?.log?.({type:`click-video-banner-controls`,control:`play`}))}function l(){t.current&&(t.current.loop=!0)}return{videoRef:t,...n,play:o,pause:s,togglePlayPause:c,loop:l}}var G=A.forwardRef((e,t)=>{let{autoPlay:n=!1,muted:r=!0,loop:i=!1,controls:a=!1,disablePictureInPicture:o=!0,disableRemotePlayback:s=!0,...c}=e;return(0,j.jsx)(`video`,{ref:t,autoPlay:n,muted:r,loop:i,controls:a,disablePictureInPicture:o,disableRemotePlayback:s,...c})});function K(e){return(0,j.jsx)(`svg`,{...e,children:(0,j.jsx)(`path`,{fillRule:`evenodd`,clipRule:`evenodd`,d:`M9.5 6C8.67157 6 8 6.67157 8 7.5V16.5C8 17.3284 8.67157 18 9.5 18C10.3284 18 11 17.3284 11 16.5V7.5C11 6.67157 10.3284 6 9.5 6ZM15.5 6C14.6716 6 14 6.67157 14 7.5V16.5C14 17.3284 14.6716 18 15.5 18C16.3284 18 17 17.3284 17 16.5V7.5C17 6.67157 16.3284 6 15.5 6Z`})})}var q=function(e){return e.PlayPause=`play-pause`,e.WebsiteLink=`website-link`,e}({}),J=[q.PlayPause,q.WebsiteLink],Y={getBannerHeaderContentType(e){let t=`text`;return e.logoUrl&&(t=`logo`),!e.isAuthenticated&&e.showVideoBanner&&(t=`sign-up`),t},showWebsiteLinkControls(e,t,n){return n?!1:!!t&&e.includes(q.WebsiteLink)}},X={videoBannerRadius:`_videoBannerRadius_v1xjp_1`,nowrap:`_nowrap_v1xjp_9`,hasLogo:`_hasLogo_v1xjp_12`,logoPosition:`_logoPosition_v1xjp_15`,logoContainer:`_logoContainer_v1xjp_18`,container:`_container_v1xjp_22`,signUpContainer:`_signUpContainer_v1xjp_26`,signUpContent:`_signUpContent_v1xjp_31`,signUpHeading:`_signUpHeading_v1xjp_39`,emailInput:`_emailInput_v1xjp_48`,videoControls:`_videoControls_v1xjp_52`,videoContent:`_videoContent_v1xjp_57`,videoVisible:`_videoVisible_v1xjp_61`},Z=a.encloseNamespace(`bannerHeader.partnerProfileBannerHeader`);function ie(e){return(0,j.jsx)(`div`,{className:n(`container position-relative inner-banner`,X.container),children:(0,j.jsx)(`div`,{className:`position-absolute bottom-0 start-0 mb-3 w-100 px-4`,children:(0,j.jsx)(`div`,{className:`d-flex align-items-center`,children:(0,j.jsx)(`h1`,{className:`text-white text-shadow pe-3 position-static mb-0`,children:e.name})})})})}function ae(e){return(0,j.jsx)(`div`,{className:n(`container position-relative inner-banner`,X.container),children:(0,j.jsx)(`div`,{className:n(`position-absolute start-0 px-4`,X.logoPosition),children:(0,j.jsx)(`div`,{className:X.logoContainer,children:(0,j.jsx)(w,{logoUrl:e.logoUrl,bgColor:e.bgColor,name:e.name,classNames:{container:`border border-white`}})})})})}function oe(e){let[t,r]=A.useState(``);function i(n){n.preventDefault(),e.onClickSignUp(t)}return(0,j.jsxs)(`div`,{className:n(`container position-relative inner-banner`,X.container),children:[(0,j.jsx)(`div`,{className:n(`position-absolute start-0 px-4 `,X.logoPosition),children:(0,j.jsx)(`div`,{className:X.logoContainer,children:(0,j.jsx)(w,{logoUrl:e.logoUrl,bgColor:e.bgColor,name:e.name,classNames:{container:`border border-white`}})})}),(0,j.jsx)(`div`,{className:n(`position-absolute bottom-0 pb-2 pb-md-3 px-0 px-sm-3 d-none d-xl-block`,X.signUpContainer),children:(0,j.jsxs)(`div`,{className:n(`d-flex align-items-center justify-content-between gap-2 flex-wrap rounded-3 p-3`,X.signUpContent),children:[(0,j.jsx)(`div`,{className:`d-sm-flex align-items-center gap-2 `,children:(0,j.jsx)(`h4`,{className:n(`text-white text-shadow mb-0`,X.signUpHeading),children:Z(`description`)})}),(0,j.jsxs)(`form`,{className:`d-flex align-items-center gap-2 flex-grow-1 flex-md-grow-0`,onSubmit:i,children:[(0,j.jsx)(`input`,{type:`email`,className:n(`form-control w-100`,X.emailInput),placeholder:Z(`emailPlaceholder`),value:t,onChange:e=>r(e.target.value)}),(0,j.jsx)(u,{type:`submit`,variant:`dark`,className:X.nowrap,children:Z(`cta`)})]})]})})]})}var se={logo:ae,"sign-up":oe,text:ie};function ce(e){let t=se[e.type];return(0,j.jsx)(t,{...e})}var Q=a.encloseNamespace(`bannerHeader.partnerProfileBannerHeader`);function le(e){return(0,j.jsx)(`div`,{className:n(`position-absolute top-0 start-0 w-100 h-100 overflow-hidden`,e.className,X.videoBannerRadius),children:(0,j.jsx)(G,{ref:e.videoRef,autoPlay:!0,muted:!0,controls:!1,loop:e.loop,className:`w-100 h-100 object-fit-cover position-relative`,children:(0,j.jsx)(`source`,{src:e.videoUrl,type:`video/mp4`})})})}function ue(t){let i=t.isPlaying?K:ne;function a(){t.websiteUrl&&(e.PageLoad(t.websiteUrl,!0),t.log?.({type:`click-video-banner-controls`,control:`website-link`}))}let o=t.controls||J,s=Y.showWebsiteLinkControls(o,t.websiteUrl,t.isStudent);return(0,j.jsxs)(`div`,{className:n(X.videoControls,`position-absolute d-flex gap-2 `,t.isPlaying&&`banner-header-video--controls`,t.className),children:[s&&(0,j.jsx)(f,{svg:b,svgSize:r.Standard,className:`bg-gray-200 rounded-circle cursor-pointer`,onClick:a,ariaLabel:Q(`viewWebsite`),role:`button`,tooltip:Q(`viewWebsite`),tooltipTrigger:[`hover`,`focus`]}),o.includes(q.PlayPause)&&(0,j.jsx)(f,{svg:i,svgSize:r.Standard,className:`bg-gray-200 rounded-circle cursor-pointer`,onClick:t.togglePlayPause,ariaLabel:t.isPlaying?Q(`pause`):Q(`play`),role:`button`,tooltip:t.isPlaying?Q(`pause`):Q(`play`),tooltipTrigger:[`hover`,`focus`]})]})}function de(){let e=A.useContext(y);return k.renderInPortalIfExists((0,j.jsx)(`div`,{className:`partial-banner partial-loading-background`}),e?.container)}var fe=1920,pe=`1200:330`;function me(e){let{heading:t,isAuthenticated:r,partnerBannerType:i=`static`,websiteUrl:a}=e,{videoRef:o,isPlaying:s,isFinished:c,loaded:l,togglePlayPause:u}=W({addDelayOnLoad:2500,log:e.log}),d=i===`video`&&!!e.videoUrl,f=l&&!c,{containerProps:p,portalContainerContext:h,logoUrl:g}=R({heading:t,banner:e.banner,logo:e.logo,imageCdnUrl:e.imageCdnUrl,blockColourClass:e.blockColourClass,bannerClassName:n(d&&`banner-header-video position-relative`,d&&X.videoBannerRadius),bannerImageOptions:d?{width:fe,ratio:pe,resizeType:m.Cover}:null}),_=Y.getBannerHeaderContentType({logoUrl:g,isAuthenticated:r,showVideoBanner:d}),v=_===`logo`||_===`sign-up`,y=f?J:[q.PlayPause,q.WebsiteLink];return k.renderInPortalIfExists((0,j.jsx)(`header`,{className:n(X.header,d&&`px-0 px-xl-3 pt-xl-3 `,v&&X.hasLogo),children:(0,j.jsxs)(`div`,{...p,children:[d&&(0,j.jsx)(le,{videoUrl:e.videoUrl,videoRef:o,className:n(X.videoContent,f&&X.videoVisible),loop:!e.banner}),(0,j.jsx)(ce,{type:_,name:t,logoUrl:g,bgColor:e.logoBgColour,onClickSignUp:e.onClickSignUp}),d&&(0,j.jsx)(ue,{isPlaying:s,togglePlayPause:u,controls:y,websiteUrl:a,isStudent:e.isStudent,log:e.log})]})}),h?.container)}var $={default:{Component:H,PartialComponent:U},"partner-profile":{Component:me,PartialComponent:de}};function he(e){let{type:t=`default`}=e,n=$[t].Component;return(0,j.jsx)(n,{...e})}function ge(e){let{type:t=`default`}=e,n=$[t].PartialComponent;return(0,j.jsx)(n,{...e})}export{ge as n,he as t};
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{b as e,gt as t}from"./Dp9qJj1C.chunk.js";import{a as n,n as r,t as i}from"./BJvPfCvt.chunk.js";import{t as a}from"./ImQRQGZr.chunk.js";import{j as o,lt as s,ut as c}from"./Dun43GrB.chunk.js";import{t as l}from"./CFXUbsBS.chunk.js";import{n as u}from"./D86qrFLE.chunk.js";import{t as d}from"./Ca1QPe-q2.chunk.js";import{t as f}from"./Cz6swPXe2.chunk.js";import{n as p}from"./D7d5XFW82.chunk.js";import{a as m,i as h,r as g,t as _}from"./D2om474U2.chunk.js";import{N as v,P as y}from"./app-gjHxcZG3.js";import{t as b}from"./xFUSLNcp.chunk.js";import{t as ee}from"./DQFcbMMk.chunk.js";import{t as x}from"./DXfGdqxs.chunk.js";import{t as S}from"./CyxOxJjg2.chunk.js";import{t as C}from"./Bt57Tmef2.chunk.js";import{n as w,r as te}from"./CEFKXxac.chunk.js";import{r as T,t as E}from"./BBWlVBxr.chunk.js";import{t as D}from"./etRy6yC_.chunk.js";import{i as ne}from"./ClGIvvk6.chunk.js";var O=t(o()),k={renderInPortalIfExists(e,t){return t?(0,O.createPortal)(e,t):e}},A=t(c()),j=s(),M=`shared.backButton`;N.defaultProps={color:`black`,extraClasses:``};function N(e){let{backToName:t,appLink:n,color:o,extraClasses:s,textShadow:c}={textShadow:!0,...e},l=t?a.getPhrase(M,`backTo`,{backToName:t}):a.getPhrase(M,`back`);return(0,j.jsxs)(d,{appLink:n,className:`d-inline-flex align-items-center h5 mb-0 ${s} ${o===`black`?``:`text-white`} ${c?`text-shadow`:``}`,children:[(0,j.jsx)(i,{svg:x,size:r.Medium}),(0,j.jsx)(`span`,{className:`ms-1`,children:l})]})}var re=`${D[h.Banners].width}:${D[h.Banners].height}`,P=1200,F=1920;function I(e){return e.xxl?F:P}function L(e,t,n,r){let i={className:`banner banner-header ${n}`,style:t?{backgroundImage:`url('${t}')`}:{}};return!e&&r&&(delete i.style,i.className+=` ${r}`),i}function R(e){let{heading:t,banner:n,logo:r,imageCdnUrl:i,bannerClassName:a,blockColourClass:o}=e,s=v(),c=A.useContext(y),l=I(s),u=e.bannerImageOptions||{width:l,ratio:re,resizeType:m.Cover},d=n&&i?_.createBannerUrl(n,{fallbackBaseUrl:i,fallbackCategoryName:t,type:h.Banners},u):void 0,f=E(t,T);return{logoUrl:r&&i?_.createUrl(r.url,{size:g.Medium}):void 0,bannerUrl:d,containerProps:L(n,d,a,o),portalContainerContext:c,logoFallbackBgClassName:f}}var z={bannerContent:`_bannerContent_168u8_1`,actionsContainer:`_actionsContainer_168u8_9`,bannerContentWithLogo:`_bannerContentWithLogo_168u8_18`,container:`_container_168u8_22`,logoContainer:`_logoContainer_168u8_26`,logoContainerLeft:`_logoContainerLeft_168u8_37`,logoHeading:`_logoHeading_168u8_41`,specialEventContainer:`_specialEventContainer_168u8_44`,headingLarge:`_headingLarge_168u8_68`,heading:`_heading_168u8_68`};function B(e){return e.length<160?`h1`:z.headingLarge}var V=`shared.defaultBannerHeader`,H=A.memo(function(e){let{heading:t,banner:n,imageCdnUrl:r,actions:i,sortComponent:a,blockColourClass:o,specialEvent:s}=e,{logoUrl:c,portalContainerContext:u,logoFallbackBgClassName:d,containerProps:f}=R({heading:t,banner:n,blockColourClass:o,bannerClassName:e.bannerClassName,imageCdnUrl:r,logo:e.logo,bannerImageOptions:e.imageOptions}),m=A.useMemo(()=>{if(!s||e.showComingSoon)return!1;let t=l.format(new Date,`YYYY-MM-DD`);return s.endDate?s.startDate<=t&&s.endDate>=t:s.startDate===t},[s]);function h(e){return!e.endDate||l.isSame(e.startDate,e.endDate,`month`)?l.format(e.startDate,`MMMM`):`${l.format(e.startDate,`MMM`)} - ${l.format(e.endDate,`MMM`)}`}let g=e.detailsComponent;return k.renderInPortalIfExists((0,j.jsx)(`header`,{...f,children:(0,j.jsxs)(`div`,{className:`container ${z.container} position-relative inner-banner`,children:[e.backButtonAppLink&&(0,j.jsx)(`div`,{className:`pt-3`,children:(0,j.jsx)(N,{appLink:e.backButtonAppLink,backToName:e.backButtonText,extraClasses:e.backButtonClasses,color:`white`})}),(0,j.jsxs)(`div`,{className:`${e.alignLogoLeft?`position-absolute top-50 start-0 translate-middle-y w-100 ps-4`:`${z.bannerContent} px-2 ${e.logo?.url?z.bannerContentWithLogo:``}`}`,children:[!!s&&(0,j.jsx)(`div`,{className:`position-relative ${z.specialEventContainer}`,children:(0,j.jsx)(te,{body:{type:s.endDate?`range`:`day`,text:s.endDate?`${l.format(s.startDate,`DD`)}-${l.format(s.endDate,`DD`)}`:l.format(s.startDate,`DD`)},month:h(s),theme:e.calendarTheme})}),(0,j.jsxs)(`div`,{children:[m&&(0,j.jsx)(`div`,{className:`rounded-pill py-1 px-2 my-1 me-1 fw-semibold bg-light-blue lh-1 d-inline-block`,children:(0,j.jsx)(p,{namespace:V,phrase:`onToday`})}),e.showComingSoon&&(0,j.jsx)(S,{className:`pe-2 fw-semibold mb-1 rounded-pill justify-content-start text-nowrap`}),(0,j.jsxs)(`div`,{className:`d-flex align-items-center`,children:[e.alignLogoLeft&&e.logo?.url&&(0,j.jsx)(`div`,{className:`${z.logoContainerLeft} d-none d-md-block rounded-circle overflow-hidden me-3 ${d}`,children:(0,j.jsx)(C,{src:c,style:{backgroundColor:e.logoBgColour}})}),(0,j.jsxs)(`h1`,{className:`text-white text-shadow pe-3 position-static ${z.heading} ${B(t)} ${e.alignLogoLeft?`w-50`:``}`,children:[t,g&&(0,j.jsx)(g,{})]})]})]}),!!i&&(0,j.jsx)(`div`,{className:z.actionsContainer,children:(0,j.jsx)(ee,{actions:i,sortComponent:a,actionsDropdownClassName:e.actionsDropdownClassName})})]}),!e.alignLogoLeft&&!!e.logo?.url&&(0,j.jsx)(`div`,{className:z.logoContainer,children:(0,j.jsx)(`img`,{src:c,className:`rounded-circle`})})]})}),u?.container)},(e,t)=>e.actions===t.actions&&e.heading===t.heading&&e.logo?.url===t.logo?.url);function U(){let e=A.useContext(y);return k.renderInPortalIfExists((0,j.jsx)(`div`,{className:`partial-banner partial-loading-background ${z.banner}`}),e?.container)}function W(e){let t=A.useRef(null),[n,r]=A.useState({loaded:!1,isPlaying:!1,isFinished:!1});function i(e,t){r(n=>({...n,[e]:t}))}let a={loadstart:()=>{e?.onInit?.()},canplay:()=>{typeof e?.addDelayOnLoad==`number`?(s(),t.current?.autoplay&&(t.current.autoplay=!1),setTimeout(()=>{i(`loaded`,!0),o()},e.addDelayOnLoad)):i(`loaded`,!0)},play:()=>{i(`isPlaying`,!0),e?.onPlay?.()},pause:()=>{i(`isPlaying`,!1),e?.onPause?.()},ended:()=>{r(e=>({...e,isPlaying:!1,isFinished:!0})),e?.onEnd?.()}};A.useEffect(()=>{if(Object.keys(a).length)return Object.entries(a).forEach(([e,n])=>{t.current?.addEventListener(e,n)}),()=>{Object.entries(a).forEach(([e,n])=>{t.current?.removeEventListener(e,n)})}},[t.current]);function o(){n.isPlaying||(t.current?.play(),r(e=>({...e,isPlaying:!0,isFinished:!1})))}function s(){n.isPlaying&&(t.current?.pause(),i(`isPlaying`,!1))}function c(){n.isPlaying?(s(),e?.log?.({type:`click-video-banner-controls`,control:`pause`})):(o(),e?.log?.({type:`click-video-banner-controls`,control:`play`}))}function l(){t.current&&(t.current.loop=!0)}return{videoRef:t,...n,play:o,pause:s,togglePlayPause:c,loop:l}}var G=A.forwardRef((e,t)=>{let{autoPlay:n=!1,muted:r=!0,loop:i=!1,controls:a=!1,disablePictureInPicture:o=!0,disableRemotePlayback:s=!0,...c}=e;return(0,j.jsx)(`video`,{ref:t,autoPlay:n,muted:r,loop:i,controls:a,disablePictureInPicture:o,disableRemotePlayback:s,...c})});function K(e){return(0,j.jsx)(`svg`,{...e,children:(0,j.jsx)(`path`,{fillRule:`evenodd`,clipRule:`evenodd`,d:`M9.5 6C8.67157 6 8 6.67157 8 7.5V16.5C8 17.3284 8.67157 18 9.5 18C10.3284 18 11 17.3284 11 16.5V7.5C11 6.67157 10.3284 6 9.5 6ZM15.5 6C14.6716 6 14 6.67157 14 7.5V16.5C14 17.3284 14.6716 18 15.5 18C16.3284 18 17 17.3284 17 16.5V7.5C17 6.67157 16.3284 6 15.5 6Z`})})}var q=function(e){return e.PlayPause=`play-pause`,e.WebsiteLink=`website-link`,e}({}),J=[q.PlayPause,q.WebsiteLink],Y={getBannerHeaderContentType(e){let t=`text`;return e.logoUrl&&(t=`logo`),!e.isAuthenticated&&e.showVideoBanner&&(t=`sign-up`),t},showWebsiteLinkControls(e,t,n){return n?!1:!!t&&e.includes(q.WebsiteLink)}},X={videoBannerRadius:`_videoBannerRadius_v1xjp_1`,nowrap:`_nowrap_v1xjp_9`,hasLogo:`_hasLogo_v1xjp_12`,logoPosition:`_logoPosition_v1xjp_15`,logoContainer:`_logoContainer_v1xjp_18`,container:`_container_v1xjp_22`,signUpContainer:`_signUpContainer_v1xjp_26`,signUpContent:`_signUpContent_v1xjp_31`,signUpHeading:`_signUpHeading_v1xjp_39`,emailInput:`_emailInput_v1xjp_48`,videoControls:`_videoControls_v1xjp_52`,videoContent:`_videoContent_v1xjp_57`,videoVisible:`_videoVisible_v1xjp_61`},Z=a.encloseNamespace(`bannerHeader.partnerProfileBannerHeader`);function ie(e){return(0,j.jsx)(`div`,{className:n(`container position-relative inner-banner`,X.container),children:(0,j.jsx)(`div`,{className:`position-absolute bottom-0 start-0 mb-3 w-100 px-4`,children:(0,j.jsx)(`div`,{className:`d-flex align-items-center`,children:(0,j.jsx)(`h1`,{className:`text-white text-shadow pe-3 position-static mb-0`,children:e.name})})})})}function ae(e){return(0,j.jsx)(`div`,{className:n(`container position-relative inner-banner`,X.container),children:(0,j.jsx)(`div`,{className:n(`position-absolute start-0 px-4`,X.logoPosition),children:(0,j.jsx)(`div`,{className:X.logoContainer,children:(0,j.jsx)(w,{logoUrl:e.logoUrl,bgColor:e.bgColor,name:e.name,classNames:{container:`border border-white`}})})})})}function oe(e){let[t,r]=A.useState(``);function i(n){n.preventDefault(),e.onClickSignUp(t)}return(0,j.jsxs)(`div`,{className:n(`container position-relative inner-banner`,X.container),children:[(0,j.jsx)(`div`,{className:n(`position-absolute start-0 px-4 `,X.logoPosition),children:(0,j.jsx)(`div`,{className:X.logoContainer,children:(0,j.jsx)(w,{logoUrl:e.logoUrl,bgColor:e.bgColor,name:e.name,classNames:{container:`border border-white`}})})}),(0,j.jsx)(`div`,{className:n(`position-absolute bottom-0 pb-2 pb-md-3 px-0 px-sm-3 d-none d-xl-block`,X.signUpContainer),children:(0,j.jsxs)(`div`,{className:n(`d-flex align-items-center justify-content-between gap-2 flex-wrap rounded-3 p-3`,X.signUpContent),children:[(0,j.jsx)(`div`,{className:`d-sm-flex align-items-center gap-2 `,children:(0,j.jsx)(`h4`,{className:n(`text-white text-shadow mb-0`,X.signUpHeading),children:Z(`description`)})}),(0,j.jsxs)(`form`,{className:`d-flex align-items-center gap-2 flex-grow-1 flex-md-grow-0`,onSubmit:i,children:[(0,j.jsx)(`input`,{type:`email`,className:n(`form-control w-100`,X.emailInput),placeholder:Z(`emailPlaceholder`),value:t,onChange:e=>r(e.target.value)}),(0,j.jsx)(u,{type:`submit`,variant:`dark`,className:X.nowrap,children:Z(`cta`)})]})]})})]})}var se={logo:ae,"sign-up":oe,text:ie};function ce(e){let t=se[e.type];return(0,j.jsx)(t,{...e})}var Q=a.encloseNamespace(`bannerHeader.partnerProfileBannerHeader`);function le(e){return(0,j.jsx)(`div`,{className:n(`position-absolute top-0 start-0 w-100 h-100 overflow-hidden`,e.className,X.videoBannerRadius),children:(0,j.jsx)(G,{ref:e.videoRef,autoPlay:!0,muted:!0,controls:!1,loop:e.loop,className:`w-100 h-100 object-fit-cover position-relative`,children:(0,j.jsx)(`source`,{src:e.videoUrl,type:`video/mp4`})})})}function ue(t){let i=t.isPlaying?K:ne;function a(){t.websiteUrl&&(e.PageLoad(t.websiteUrl,!0),t.log?.({type:`click-video-banner-controls`,control:`website-link`}))}let o=t.controls||J,s=Y.showWebsiteLinkControls(o,t.websiteUrl,t.isStudent);return(0,j.jsxs)(`div`,{className:n(X.videoControls,`position-absolute d-flex gap-2 `,t.isPlaying&&`banner-header-video--controls`,t.className),children:[s&&(0,j.jsx)(f,{svg:b,svgSize:r.Standard,className:`bg-gray-200 rounded-circle cursor-pointer`,onClick:a,ariaLabel:Q(`viewWebsite`),role:`button`,tooltip:Q(`viewWebsite`),tooltipTrigger:[`hover`,`focus`]}),o.includes(q.PlayPause)&&(0,j.jsx)(f,{svg:i,svgSize:r.Standard,className:`bg-gray-200 rounded-circle cursor-pointer`,onClick:t.togglePlayPause,ariaLabel:t.isPlaying?Q(`pause`):Q(`play`),role:`button`,tooltip:t.isPlaying?Q(`pause`):Q(`play`),tooltipTrigger:[`hover`,`focus`]})]})}function de(){let e=A.useContext(y);return k.renderInPortalIfExists((0,j.jsx)(`div`,{className:`partial-banner partial-loading-background`}),e?.container)}var fe=1920,pe=`1200:330`;function me(e){let{heading:t,isAuthenticated:r,partnerBannerType:i=`static`,websiteUrl:a}=e,{videoRef:o,isPlaying:s,isFinished:c,loaded:l,togglePlayPause:u}=W({addDelayOnLoad:2500,log:e.log}),d=i===`video`&&!!e.videoUrl,f=l&&!c,{containerProps:p,portalContainerContext:h,logoUrl:g}=R({heading:t,banner:e.banner,logo:e.logo,imageCdnUrl:e.imageCdnUrl,blockColourClass:e.blockColourClass,bannerClassName:n(d&&`banner-header-video position-relative`,d&&X.videoBannerRadius),bannerImageOptions:d?{width:fe,ratio:pe,resizeType:m.Cover}:null}),_=Y.getBannerHeaderContentType({logoUrl:g,isAuthenticated:r,showVideoBanner:d}),v=_===`logo`||_===`sign-up`,y=f?J:[q.PlayPause,q.WebsiteLink];return k.renderInPortalIfExists((0,j.jsx)(`header`,{className:n(X.header,d&&`px-0 px-xl-3 pt-xl-3 `,v&&X.hasLogo),children:(0,j.jsxs)(`div`,{...p,children:[d&&(0,j.jsx)(le,{videoUrl:e.videoUrl,videoRef:o,className:n(X.videoContent,f&&X.videoVisible),loop:!e.banner}),(0,j.jsx)(ce,{type:_,name:t,logoUrl:g,bgColor:e.logoBgColour,onClickSignUp:e.onClickSignUp}),d&&(0,j.jsx)(ue,{isPlaying:s,togglePlayPause:u,controls:y,websiteUrl:a,isStudent:e.isStudent,log:e.log})]})}),h?.container)}var $={default:{Component:H,PartialComponent:U},"partner-profile":{Component:me,PartialComponent:de}};function he(e){let{type:t=`default`}=e,n=$[t].Component;return(0,j.jsx)(n,{...e})}function ge(e){let{type:t=`default`}=e,n=$[t].PartialComponent;return(0,j.jsx)(n,{...e})}export{ge as n,he as t};
|
|
2
|
+
//# sourceMappingURL=DMZ--ok1.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"B5jBIPaP.chunk.js","names":[],"sources":["../../../../libs/common/src/react/utils/PortalHelper.ts","../../../../libs/shared/src/components/back-button/BackButton.tsx","../../../../libs/shared/src/components/banner-header/hooks/useBannerHeader.ts","../../../../libs/shared/src/components/banner-header/default-banner-header/default-banner-header.module.scss","../../../../libs/shared/src/components/banner-header/default-banner-header/DefaultBannerHeader.tsx","../../../../libs/shared/src/components/video/Video.tsx","../../../../libs/shared/src/images/svg/actions/PauseSvg.tsx","../../../../libs/shared/src/components/banner-header/enums/VideoBannerControlOption.ts","../../../../libs/shared/src/components/banner-header/utils/PartnerProfileBannerHeaderHelper.ts","../../../../libs/shared/src/components/banner-header/partner-profile-banner-header/partner-profile-banner-header.module.scss","../../../../libs/shared/src/components/banner-header/partner-profile-banner-header/PartnerProfileBannerHeaderContent.tsx","../../../../libs/shared/src/components/banner-header/partner-profile-banner-header/PartnerProfileBannerHeader.tsx","../../../../libs/shared/src/components/banner-header/BannerHeader.tsx"],"sourcesContent":["import React from 'react';\nimport { createPortal } from 'react-dom';\n\nexport const PortalHelper = {\n renderInPortalIfExists(component: React.ReactElement, portalContainer: Element | null): React.ReactElement {\n if (portalContainer)\n return createPortal(component, portalContainer);\n\n return component;\n }\n};\n","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { ChevronLeftSvg } from 'libs/shared/images/svg/arrows/ChevronLeftSvg';\n\nconst namespace = 'shared.backButton';\n\ninterface BackButtonProps {\n appLink: Core.AppLink;\n backToName?: string;\n color?: 'black' | 'white';\n extraClasses?: string;\n /**\n * Whether or not the button text has a text shadow. Defaults to true\n */\n textShadow?: boolean;\n}\n\nBackButton.defaultProps = {\n color: 'black',\n extraClasses: ''\n};\n\nexport function BackButton(props: BackButtonProps): React.ReactElement {\n const { backToName, appLink, color, extraClasses, textShadow } = {\n textShadow: true,\n ...props\n };\n\n const backPhrase = backToName ?\n LanguageService.getPhrase(namespace, 'backTo', { backToName }) :\n LanguageService.getPhrase(namespace, 'back');\n\n const colorClass = color === 'black' ? '' : 'text-white';\n const textShadowClass = textShadow ? 'text-shadow' : '';\n\n return (\n <AppLink\n appLink={appLink}\n className={`d-inline-flex align-items-center h5 mb-0 ${extraClasses} ${colorClass} ${textShadowClass}`}\n >\n <SvgContainer svg={ChevronLeftSvg} size={SvgContainerSize.Medium} />\n <span className='ms-1'>{backPhrase}</span>\n </AppLink>\n );\n}\n","import React from 'react';\n\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { ImageMinDimensions } from 'libs/shared/constants/ImageSizes';\nimport { BannerPortalContext } from 'libs/shared/context/BannerPortalContext';\nimport { ImageSize, ImageType, ResizeType } from 'libs/shared/enums/Images';\nimport { Breakpoints, useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Banner, Logo } from 'libs/shared/interfaces';\nimport { getBgColorClass } from 'libs/shared/utils/getBgColorClass';\nimport { ImageHelper, ImageOptions } from 'libs/shared/utils/ImageHelper';\n\nconst RATIO = `${ImageMinDimensions[ImageType.Banners].width}:${ImageMinDimensions[ImageType.Banners].height}`;\nconst DEFAULT_WIDTH = 1200; // This is ImageSize.Large for a Banner.\nconst LARGE_SCREEN_WIDTH = 1920;\n\nfunction getImageWidth(breakpoints: Breakpoints): number {\n if (breakpoints.xxl) return LARGE_SCREEN_WIDTH;\n\n return DEFAULT_WIDTH;\n}\n\ntype ContainerProps = React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>;\n\nfunction getContainerProps(\n banner?: Banner,\n bannerUrl?: string,\n bannerClassName?: string,\n blockColourClass?: string\n): ContainerProps {\n const containerProps: ContainerProps = {\n className: `banner banner-header ${bannerClassName}`,\n style: bannerUrl ? { backgroundImage: `url('${bannerUrl}')` } : {}\n };\n\n if (!banner && blockColourClass) {\n delete containerProps.style;\n containerProps.className += ` ${blockColourClass}`;\n }\n\n return containerProps;\n}\n\ninterface UseBannerHeaderOptions {\n heading: string;\n\n logo?: Logo;\n banner?: Banner;\n imageCdnUrl?: string;\n bannerImageOptions?: ImageOptions;\n bannerClassName?: string;\n blockColourClass?: string;\n}\n\nexport function useBannerHeader(options: UseBannerHeaderOptions) {\n const { heading, banner, logo, imageCdnUrl, bannerClassName, blockColourClass } = options;\n\n const breakpoints = useBreakpoints();\n const portalContainerContext = React.useContext(BannerPortalContext);\n\n const imageWidth = getImageWidth(breakpoints);\n\n const bannerImageOptions = options.bannerImageOptions || {\n width: imageWidth,\n ratio: RATIO,\n resizeType: ResizeType.Cover\n };\n\n const bannerUrl =\n !!banner && !!imageCdnUrl ?\n ImageHelper.createBannerUrl(\n banner,\n {\n fallbackBaseUrl: imageCdnUrl,\n fallbackCategoryName: heading,\n type: ImageType.Banners\n },\n bannerImageOptions\n ) :\n undefined;\n\n const logoFallbackBgClassName = getBgColorClass(heading, BG_COLOUR_CLASS_NAMES);\n const logoUrl = !!logo && !!imageCdnUrl ? ImageHelper.createUrl(logo.url, { size: ImageSize.Medium }) : undefined;\n const containerProps = getContainerProps(banner, bannerUrl, bannerClassName, blockColourClass);\n\n return {\n logoUrl,\n bannerUrl,\n containerProps,\n portalContainerContext,\n logoFallbackBgClassName\n };\n}\n","@import '~styles/utils/mixins';\n@import '~styles/utils/include-media';\n:local {\n .bannerContent {\n position: absolute;\n bottom: map-get($spacers, 3);\n right: map-get($spacers, 3);\n left: map-get($spacers, 3);\n display: flex;\n align-items: flex-end;\n\n .actionsContainer {\n margin-left: auto;\n padding-left: map-get($spacers, 2);\n }\n\n @include media('<=md') {\n bottom: 1rem;\n }\n }\n\n .bannerContentWithLogo {\n right: 7rem + map-get($spacers, 3);\n }\n\n .container {\n @include media('<=xl') {\n max-width: 100%;\n }\n }\n\n .logoContainer {\n position: absolute;\n top: 50%;\n right: map-get($spacers, 3);\n transform: translateY(-50%);\n height: 60%;\n max-height: 7.5rem;\n\n img {\n height: 100%;\n }\n }\n\n .logoContainerLeft {\n width: 8rem;\n aspect-ratio: 1 / 1;\n }\n\n .logoHeading {\n max-width: 32.5rem;\n }\n\n .specialEventContainer {\n font-size: 0.8rem;\n min-width: 7rem;\n margin-right: map-get($spacers, 3);\n\n @include media('<=lg') {\n min-width: 6rem;\n font-size: 0.7rem;\n margin-right: map-get($spacers, 2);\n }\n\n @include media('<=md') {\n min-width: 5.5rem;\n font-size: 0.65rem;\n }\n\n @include media('<=sm') {\n min-width: 5rem;\n font-size: 0.6rem;\n }\n }\n\n .headingLarge {\n @include clamp(5);\n font-size: $h3-font-size;\n\n @include media(\"<xl\") {\n font-size: $h4-font-size;\n }\n\n @include media(\"<lg\") {\n @include clamp(4);\n font-size: $h5-font-size;\n }\n\n @include media(\"<md\") {\n font-size: $h6-font-size;\n }\n }\n .heading {\n @include clamp(4);\n \n @include media(\"<=sm\") {\n @include clamp(2);\n }\n \n }\n}","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\nimport { PortalHelper } from 'libs/common/react/utils/PortalHelper';\n\nimport { ComingSoonTag } from 'libs/shared/apps/calendar/components/coming-soon-tag/ComingSoonTag';\nimport { GenericCalendarDate } from 'libs/shared/apps/calendar/components/generic-calendar-date/GenericCalendarDate';\nimport { CalendarTheme } from 'libs/shared/apps/calendar/interfaces/CalendarTheme';\nimport { ActionOptions, Actions } from 'libs/shared/components/actions/Actions';\nimport { BackButton } from 'libs/shared/components/back-button/BackButton';\nimport { LazyImage } from 'libs/shared/components/lazy-image/LazyImage';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { BannerPortalContext } from 'libs/shared/context/BannerPortalContext';\nimport { Banner, CalendarEvent, Logo } from 'libs/shared/interfaces';\nimport { ImageOptions } from 'libs/shared/utils/ImageHelper';\n\nimport { useBannerHeader } from '../hooks/useBannerHeader';\n\nimport styles from './default-banner-header.module.scss';\n\nfunction getSizeClass(heading: string): string {\n if (heading.length < 160)\n return 'h1';\n\n return styles.headingLarge;\n}\n\nexport interface DefaultBannerHeaderProps {\n heading: string;\n banner?: Banner;\n bannerClassName?: string;\n imageCdnUrl?: string;\n logo?: Logo;\n logoBgColour?: string;\n actions?: ActionOptions[];\n specialEvent?: CalendarEvent;\n backButtonAppLink?: Core.AppLink;\n backButtonText?: string;\n backButtonClasses?: string;\n sortComponent?: JSX.Element;\n blockColourClass?: string;\n actionsDropdownClassName?: string;\n detailsComponent?: () => React.ReactElement;\n imageOptions?: ImageOptions;\n showComingSoon?: boolean;\n alignLogoLeft?: boolean;\n calendarTheme?: CalendarTheme;\n}\n\nconst namespace = 'shared.defaultBannerHeader';\n\nexport const DefaultBannerHeader =\n React.memo(function(props: React.PropsWithChildren<DefaultBannerHeaderProps>): React.ReactElement {\n const { heading, banner, imageCdnUrl, actions, sortComponent, blockColourClass, specialEvent } = props;\n\n const {\n logoUrl,\n portalContainerContext,\n logoFallbackBgClassName,\n containerProps\n } = useBannerHeader({\n heading,\n banner,\n blockColourClass,\n bannerClassName: props.bannerClassName,\n imageCdnUrl,\n logo: props.logo,\n bannerImageOptions: props.imageOptions\n });\n\n const specialEventIsToday = React.useMemo(() => {\n if (!specialEvent || props.showComingSoon)\n return false;\n\n const today = DateHelper.format(new Date(), 'YYYY-MM-DD');\n\n if (!specialEvent.endDate)\n return specialEvent.startDate === today;\n\n return specialEvent.startDate <= today && specialEvent.endDate >= today;\n }, [specialEvent]);\n\n function getSpecialEventMonthText(specialEvent: CalendarEvent): string {\n if (!specialEvent.endDate)\n return DateHelper.format(specialEvent.startDate, 'MMMM');\n\n if (DateHelper.isSame(specialEvent.startDate, specialEvent.endDate, 'month'))\n return DateHelper.format(specialEvent.startDate, 'MMMM');\n\n return `${DateHelper.format(specialEvent.startDate, 'MMM')} - ${DateHelper.format(specialEvent.endDate, 'MMM')}`;\n }\n\n const DetailsComponent = props.detailsComponent;\n\n return PortalHelper.renderInPortalIfExists(\n // \"banner\" is used in playlists in Online. banner-header is used by all other projects\n <header {...containerProps}>\n <div className={`container ${styles.container} position-relative inner-banner`}>\n {props.backButtonAppLink && (\n <div className='pt-3'>\n <BackButton\n appLink={props.backButtonAppLink}\n backToName={props.backButtonText}\n extraClasses={props.backButtonClasses}\n color='white'\n />\n </div>\n )}\n \n <div className={`${props.alignLogoLeft ? 'position-absolute top-50 start-0 translate-middle-y w-100 ps-4' : `${styles.bannerContent} px-2 ${props.logo?.url ? styles.bannerContentWithLogo : ''}`}`}>\n {!!specialEvent && (\n <div className={`position-relative ${styles.specialEventContainer}`}>\n <GenericCalendarDate\n body={{\n type: specialEvent.endDate ? 'range' : 'day',\n text: specialEvent.endDate ?\n `${DateHelper.format(specialEvent.startDate, 'DD')}-${DateHelper.format(specialEvent.endDate, 'DD')}` :\n DateHelper.format(specialEvent.startDate, 'DD')\n }}\n month={getSpecialEventMonthText(specialEvent)}\n theme={props.calendarTheme}\n />\n </div>\n )}\n <div>\n {specialEventIsToday && (\n <div className='rounded-pill py-1 px-2 my-1 me-1 fw-semibold bg-light-blue lh-1 d-inline-block'>\n <Text namespace={namespace} phrase='onToday' />\n </div>\n )}\n {props.showComingSoon && (\n <ComingSoonTag className='pe-2 fw-semibold mb-1 rounded-pill justify-content-start text-nowrap' />\n )}\n <div className='d-flex align-items-center'>\n {props.alignLogoLeft && props.logo?.url &&\n <div className={`${styles.logoContainerLeft} d-none d-md-block rounded-circle overflow-hidden me-3 ${logoFallbackBgClassName}`}>\n <LazyImage\n src={logoUrl}\n style={{ backgroundColor: props.logoBgColour }}\n />\n </div>\n }\n <h1 className={`text-white text-shadow pe-3 position-static ${styles.heading} ${getSizeClass(heading)} ${props.alignLogoLeft ? 'w-50' : ''}`}>\n {heading}\n {DetailsComponent && <DetailsComponent />}\n </h1>\n </div>\n </div>\n {!!actions && (\n <div className={styles.actionsContainer}>\n <Actions\n actions={actions}\n sortComponent={sortComponent}\n actionsDropdownClassName={props.actionsDropdownClassName}\n />\n </div>\n )}\n </div>\n {!props.alignLogoLeft && !!props.logo?.url &&\n <div className={styles.logoContainer}>\n <img\n src={logoUrl}\n className='rounded-circle'\n />\n </div>\n }\n </div>\n </header>,\n portalContainerContext?.container\n );\n }, (prevProps, nextProps): boolean => (\n prevProps.actions === nextProps.actions\n && prevProps.heading === nextProps.heading\n && prevProps.logo?.url === nextProps.logo?.url\n ));\n\nexport function PartialDefaultBannerHeader(): JSX.Element {\n const portalContainerContext = React.useContext(BannerPortalContext);\n\n return PortalHelper.renderInPortalIfExists(\n <div className={`partial-banner partial-loading-background ${styles.banner}`} />,\n portalContainerContext?.container\n );\n}\n","import React from 'react';\n\nimport { ContentPartnerEventLoggerFn } from 'libs/shared/apps/content-partners/utils/get-content-partner-event-logger/getContentPartnerEventLogger';\n\ninterface VideoState {\n loaded: boolean;\n isPlaying: boolean;\n isFinished: boolean;\n}\n\ninterface VideoControlsProps {\n onPlay?: () => void;\n onPause?: () => void;\n onEnd?: () => void;\n onInit?: () => void;\n onMute?: () => void;\n onUnmute?: () => void;\n /**\n * Milliseconds to delay the the `loaded` state being set to true.\n */\n addDelayOnLoad?: number;\n log?: ContentPartnerEventLoggerFn;\n}\n\nexport function useVideoControls(options?: VideoControlsProps) {\n const ref = React.useRef<HTMLVideoElement>(null);\n\n const [ videoState, setVideoState ] = React.useState<VideoState>({\n loaded: false,\n isPlaying: false,\n // Note: If `loop` is set to true, then `isFinished` will never be true.\n isFinished: false\n });\n\n function setVideoStateProperty<K extends keyof VideoState>(key: K, value: VideoState[K]) {\n setVideoState(prevState => ({ ...prevState, [key]: value }));\n }\n\n const videoEventListenerMap: {[key in keyof HTMLVideoElementEventMap]?: (event: Event) => void } = {\n loadstart: () => {\n options?.onInit?.();\n },\n canplay: () => {\n if (typeof options?.addDelayOnLoad === 'number') {\n pause();\n if (ref.current?.autoplay)\n ref.current.autoplay = false;\n \n setTimeout(() => {\n setVideoStateProperty('loaded', true);\n play();\n }, options.addDelayOnLoad);\n } else {\n setVideoStateProperty('loaded', true);\n }\n },\n play: () => {\n setVideoStateProperty('isPlaying', true);\n options?.onPlay?.();\n },\n pause: () => {\n setVideoStateProperty('isPlaying', false);\n options?.onPause?.();\n },\n ended: () => {\n setVideoState(prevState => ({ ...prevState, isPlaying: false, isFinished: true }));\n options?.onEnd?.();\n }\n };\n\n React.useEffect(() => {\n if (!Object.keys(videoEventListenerMap).length)\n return;\n\n Object.entries(videoEventListenerMap).forEach(([ event, handler ]) => {\n ref.current?.addEventListener(event, handler);\n });\n\n return () => {\n Object.entries(videoEventListenerMap).forEach(([ event, handler ]) => {\n ref.current?.removeEventListener(event, handler);\n });\n };\n }, [ref.current]);\n\n function play() {\n if (videoState.isPlaying)\n return;\n \n ref.current?.play();\n setVideoState(prevState => ({ ...prevState, isPlaying: true, isFinished: false }));\n }\n\n function pause() {\n if (!videoState.isPlaying)\n return;\n \n ref.current?.pause();\n setVideoStateProperty('isPlaying', false);\n }\n\n function togglePlayPause() {\n if (videoState.isPlaying) {\n pause();\n options?.log?.({\n type: 'click-video-banner-controls',\n control: 'pause'\n });\n } else {\n play();\n options?.log?.({\n type: 'click-video-banner-controls',\n control: 'play'\n });\n }\n }\n\n function loop() {\n if (!ref.current)\n return;\n \n ref.current.loop = true;\n }\n\n return {\n videoRef: ref,\n ...videoState,\n play,\n pause,\n togglePlayPause,\n loop\n };\n}\n\ninterface VideoProps extends React.VideoHTMLAttributes<HTMLVideoElement> {\n}\n\nexport const Video = React.forwardRef<HTMLVideoElement, VideoProps>((props, ref) => {\n const {\n autoPlay = false,\n muted = true,\n loop = false,\n controls = false,\n disablePictureInPicture = true,\n disableRemotePlayback = true,\n ...otherProps\n } = props;\n\n return (\n <video\n ref={ref}\n autoPlay={autoPlay}\n muted={muted}\n loop={loop}\n controls={controls}\n disablePictureInPicture={disablePictureInPicture}\n disableRemotePlayback={disableRemotePlayback}\n {...otherProps}\n />\n );\n});\n","import React from 'react';\n\nexport function PauseSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M9.5 6C8.67157 6 8 6.67157 8 7.5V16.5C8 17.3284 8.67157 18 9.5 18C10.3284 18 11 17.3284 11 16.5V7.5C11 6.67157 10.3284 6 9.5 6ZM15.5 6C14.6716 6 14 6.67157 14 7.5V16.5C14 17.3284 14.6716 18 15.5 18C16.3284 18 17 17.3284 17 16.5V7.5C17 6.67157 16.3284 6 15.5 6Z'\n />\n </svg>\n\n );\n}\n","export enum VideoBannerControlOption {\n PlayPause = 'play-pause',\n WebsiteLink = 'website-link'\n}\n\nexport const AllVideoBannerControlOptions: VideoBannerControlOption[] = [\n VideoBannerControlOption.PlayPause,\n VideoBannerControlOption.WebsiteLink\n];\n","import { VideoBannerControlOption } from '../enums/VideoBannerControlOption';\n\nexport type PartnerProfileBannerHeaderContentType = 'text' | 'logo' | 'sign-up';\n\ninterface GetBannerHeaderContentTypeOptions {\n logoUrl?: string;\n isAuthenticated: boolean;\n showVideoBanner: boolean;\n}\n\nexport const PartnerProfileBannerHeaderHelper = {\n getBannerHeaderContentType(\n options: GetBannerHeaderContentTypeOptions\n ): PartnerProfileBannerHeaderContentType {\n let contentType: PartnerProfileBannerHeaderContentType = 'text';\n \n if (options.logoUrl)\n contentType = 'logo';\n\n if (!options.isAuthenticated && options.showVideoBanner)\n contentType = 'sign-up';\n \n return contentType;\n },\n\n showWebsiteLinkControls(controls: VideoBannerControlOption[], websiteUrl: string, isStudent: boolean) {\n if (isStudent)\n return false;\n\n return !!websiteUrl && controls.includes(VideoBannerControlOption.WebsiteLink);\n }\n};\n","@import '~styles/utils/mixins';\n@import '~styles/utils/include-media';\n\n:local {\n $logoContainerWidth: 13.75rem; // 220px From design and what looks good\n $logoPositionBottomOffset: 1rem; // 16px offset\n\n .videoBannerRadius {\n border-radius: 0;\n\n @include media('>=xl') {\n border-radius: $border-radius-lg;\n }\n }\n\n .nowrap {\n white-space: nowrap;\n }\n\n\n .hasLogo {\n padding-bottom: $logoPositionBottomOffset;\n }\n\n .logoPosition {\n bottom: -$logoPositionBottomOffset;\n }\n\n .logoContainer {\n width: $logoContainerWidth;\n }\n\n .container {\n @include media('<=xl') {\n max-width: 100%;\n }\n }\n\n .signUpContainer {\n $leftOffset: $logoContainerWidth + map-get($spacers, 4);\n left: calc(#{$leftOffset});\n width: calc(100% - #{$leftOffset} - map-get($spacers, 1));\n z-index: 1;\n }\n\n .signUpContent {\n background: rgba(255, 255, 255, 0.1);\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n border: 1px solid rgba(255, 255, 255, 0.35);\n border-left: none;\n border-right: none;\n }\n\n .signUpHeading {\n white-space: nowrap;\n\n @include media('<=md') {\n white-space: normal;\n }\n }\n\n .emailInput {\n @include media('>=md') {\n min-width: 19.375rem; // from design\n }\n }\n\n .videoControls {\n top: 1rem;\n right: 1rem;\n transition: opacity 0.5s ease-in-out;\n }\n\n .videoContent {\n opacity: 0;\n transition: opacity 0.5s ease-in-out;\n }\n\n .videoVisible {\n opacity: 1;\n }\n}","import React from 'react';\nimport { Button } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { RectangularLogo } from 'libs/shared/components/rectangular-logo/RectangularLogo';\n\nimport { PartnerProfileBannerHeaderContentType } from '../utils/PartnerProfileBannerHeaderHelper';\n\nimport styles from './partner-profile-banner-header.module.scss';\n\nconst namespace = 'bannerHeader.partnerProfileBannerHeader';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface PartnerProfileBannerHeaderContentProps {\n type: PartnerProfileBannerHeaderContentType;\n name: string;\n onClickSignUp: (email: string) => void;\n logoUrl?: string;\n bgColor?: string;\n}\n\nfunction BannerWithText(props: PartnerProfileBannerHeaderContentProps): JSX.Element {\n return (\n <div className={classNames('container position-relative inner-banner', styles.container)}>\n <div className='position-absolute bottom-0 start-0 mb-3 w-100 px-4'>\n <div className='d-flex align-items-center'>\n <h1 className='text-white text-shadow pe-3 position-static mb-0'>{props.name}</h1>\n </div>\n </div>\n </div>\n );\n}\n\nfunction BannerWithLogo(props: PartnerProfileBannerHeaderContentProps): JSX.Element {\n return (\n <div className={classNames('container position-relative inner-banner', styles.container)}>\n <div className={classNames('position-absolute start-0 px-4', styles.logoPosition)}>\n <div className={styles.logoContainer}>\n <RectangularLogo\n logoUrl={props.logoUrl}\n bgColor={props.bgColor}\n name={props.name}\n classNames={{\n container: 'border border-white'\n }}\n />\n </div>\n </div>\n </div>\n );\n}\n\nfunction BannerWithSignUp(props: PartnerProfileBannerHeaderContentProps): JSX.Element {\n const [ email, setEmail ] = React.useState('');\n\n function onSubmit(e: React.FormEvent<HTMLFormElement>): void {\n e.preventDefault();\n props.onClickSignUp(email);\n }\n\n return (\n <div className={classNames('container position-relative inner-banner', styles.container)}>\n <div className={classNames('position-absolute start-0 px-4 ', styles.logoPosition)}>\n <div className={styles.logoContainer}>\n <RectangularLogo\n logoUrl={props.logoUrl}\n bgColor={props.bgColor}\n name={props.name}\n classNames={{\n container: 'border border-white'\n }}\n />\n </div>\n </div>\n <div\n className={classNames(\n 'position-absolute bottom-0 pb-2 pb-md-3 px-0 px-sm-3 d-none d-xl-block',\n styles.signUpContainer\n )}\n >\n <div\n className={classNames(\n 'd-flex align-items-center justify-content-between gap-2 flex-wrap rounded-3 p-3',\n styles.signUpContent\n )}\n >\n <div className='d-sm-flex align-items-center gap-2 '>\n <h4 className={classNames('text-white text-shadow mb-0', styles.signUpHeading)}>\n {getPhrase('description')}\n </h4>\n </div>\n <form className='d-flex align-items-center gap-2 flex-grow-1 flex-md-grow-0' onSubmit={onSubmit}>\n <input\n type='email'\n className={classNames('form-control w-100', styles.emailInput)}\n placeholder={getPhrase('emailPlaceholder')}\n value={email}\n onChange={e => setEmail(e.target.value)}\n />\n <Button type='submit' variant='dark' className={styles.nowrap}>\n {getPhrase('cta')}\n </Button>\n </form>\n </div>\n </div>\n </div>\n );\n}\n\nconst HeaderTypeContentMap: Record<\n PartnerProfileBannerHeaderContentType,\n React.ComponentType<PartnerProfileBannerHeaderContentProps>\n> = {\n 'logo': BannerWithLogo,\n 'sign-up': BannerWithSignUp,\n 'text': BannerWithText\n};\n\nexport function PartnerProfileBannerHeaderContent(props: PartnerProfileBannerHeaderContentProps): JSX.Element {\n const ContentComponent = HeaderTypeContentMap[props.type];\n return <ContentComponent {...props} />;\n}\n","import React from 'react';\n\nimport { LocationUtils } from 'libs/common/backbone/core';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\nimport { PortalHelper } from 'libs/common/react/utils/PortalHelper';\n\nimport { ContentPartnerEventLoggerFn } from 'libs/shared/apps/content-partners/utils/get-content-partner-event-logger/getContentPartnerEventLogger';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { useVideoControls, Video } from 'libs/shared/components/video/Video';\nimport { BannerPortalContext } from 'libs/shared/context/BannerPortalContext';\nimport { ResizeType } from 'libs/shared/enums/Images';\nimport { PauseSvg } from 'libs/shared/images/svg/actions/PauseSvg';\nimport { PlaySvg } from 'libs/shared/images/svg/actions/PlaySvg';\nimport { LinkSvg } from 'libs/shared/images/svg/objects/LinkSvg';\nimport { Banner, Logo } from 'libs/shared/interfaces';\n\nimport { AllVideoBannerControlOptions, VideoBannerControlOption } from '../enums/VideoBannerControlOption';\nimport { useBannerHeader } from '../hooks/useBannerHeader';\nimport { PartnerProfileBannerHeaderHelper } from '../utils/PartnerProfileBannerHeaderHelper';\n\nimport { PartnerProfileBannerHeaderContent } from './PartnerProfileBannerHeaderContent';\n\nimport styles from './partner-profile-banner-header.module.scss';\n\nconst namespace = 'bannerHeader.partnerProfileBannerHeader';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface VideoBannerContentProps {\n videoUrl: string;\n className?: string;\n videoRef: React.RefObject<HTMLVideoElement>;\n loop?: boolean;\n}\n\nfunction VideoBannerContent(props: VideoBannerContentProps): JSX.Element {\n return (\n <div className={classNames('position-absolute top-0 start-0 w-100 h-100 overflow-hidden', props.className, styles.videoBannerRadius)}>\n <Video ref={props.videoRef} autoPlay muted controls={false} loop={props.loop} className='w-100 h-100 object-fit-cover position-relative'>\n <source src={props.videoUrl} type='video/mp4' />\n </Video>\n </div>\n );\n}\n\ninterface VideoBannerControlsProps {\n isPlaying: boolean;\n togglePlayPause: () => void;\n className?: string;\n controls?: VideoBannerControlOption[];\n websiteUrl?: string;\n isStudent: boolean;\n log?: ContentPartnerEventLoggerFn;\n}\n\nfunction VideoBannerControls(props: VideoBannerControlsProps): JSX.Element {\n const PlayPauseIcon = props.isPlaying ? PauseSvg : PlaySvg;\n\n function onClickWebsiteLink(): void {\n if (!props.websiteUrl) return;\n LocationUtils.PageLoad(props.websiteUrl, true);\n props.log?.({\n type: 'click-video-banner-controls',\n control: 'website-link'\n });\n }\n \n const controls = props.controls || AllVideoBannerControlOptions;\n const showWebsiteLinkControls = PartnerProfileBannerHeaderHelper.showWebsiteLinkControls(\n controls,\n props.websiteUrl,\n props.isStudent\n );\n\n return (\n <div className={classNames(\n styles.videoControls,\n 'position-absolute d-flex gap-2 ',\n props.isPlaying && 'banner-header-video--controls',\n props.className\n )}>\n {showWebsiteLinkControls && (\n <IconButton\n svg={LinkSvg}\n svgSize={SvgContainerSize.Standard}\n className='bg-gray-200 rounded-circle cursor-pointer'\n onClick={onClickWebsiteLink}\n ariaLabel={getPhrase('viewWebsite')}\n role='button'\n tooltip={getPhrase('viewWebsite')}\n tooltipTrigger={[ 'hover', 'focus' ]}\n />\n )}\n {controls.includes(VideoBannerControlOption.PlayPause) && (\n <IconButton\n svg={PlayPauseIcon}\n svgSize={SvgContainerSize.Standard}\n className='bg-gray-200 rounded-circle cursor-pointer'\n onClick={props.togglePlayPause}\n ariaLabel={props.isPlaying ? getPhrase('pause') : getPhrase('play')}\n role='button'\n tooltip={props.isPlaying ? getPhrase('pause') : getPhrase('play')}\n tooltipTrigger={[ 'hover', 'focus' ]}\n />\n )}\n </div>\n );\n}\n\nexport function PartialPartnerProfileBannerHeader(): JSX.Element {\n const portalContainerContext = React.useContext(BannerPortalContext);\n\n return PortalHelper.renderInPortalIfExists(\n <div className='partial-banner partial-loading-background' />,\n portalContainerContext?.container\n );\n}\n\nexport type PartnerBannerHeaderType = 'static' | 'video';\n\nexport interface PartnerProfileBannerHeaderProps {\n heading: string;\n onClickSignUp: (email: string) => void;\n isAuthenticated: boolean;\n isStudent: boolean;\n partnerBannerType?: PartnerBannerHeaderType;\n banner?: Banner;\n logo?: Logo;\n videoUrl?: string;\n imageCdnUrl?: string;\n logoBgColour?: string;\n actions?: ActionOptions[];\n blockColourClass?: string;\n websiteUrl?: string;\n log?: ContentPartnerEventLoggerFn;\n}\n\nconst VIDEO_BANNER_WIDTH = 1920;\nconst VIDEO_BANNER_RATIO = '1200:330';\n\nexport function PartnerProfileBannerHeader(props: PartnerProfileBannerHeaderProps): JSX.Element {\n const { heading, isAuthenticated, partnerBannerType = 'static', websiteUrl } = props;\n\n const {\n videoRef,\n isPlaying,\n isFinished,\n loaded,\n togglePlayPause\n } = useVideoControls({\n addDelayOnLoad: 2500,\n log: props.log\n });\n\n const showVideoBanner = partnerBannerType === 'video' && !!props.videoUrl;\n const isVideoVisible = loaded && !isFinished;\n\n const { containerProps, portalContainerContext, logoUrl } = useBannerHeader({\n heading,\n banner: props.banner,\n logo: props.logo,\n imageCdnUrl: props.imageCdnUrl,\n blockColourClass: props.blockColourClass,\n bannerClassName: classNames(\n showVideoBanner && 'banner-header-video position-relative',\n showVideoBanner && styles.videoBannerRadius\n ),\n bannerImageOptions: showVideoBanner ? {\n width: VIDEO_BANNER_WIDTH,\n ratio: VIDEO_BANNER_RATIO,\n resizeType: ResizeType.Cover\n } : null\n });\n\n const contentType = PartnerProfileBannerHeaderHelper.getBannerHeaderContentType({\n logoUrl,\n isAuthenticated,\n showVideoBanner\n });\n\n const showLogo = contentType === 'logo' || contentType === 'sign-up';\n const controls = isVideoVisible ?\n AllVideoBannerControlOptions :\n [ VideoBannerControlOption.PlayPause, VideoBannerControlOption.WebsiteLink ];\n \n return PortalHelper.renderInPortalIfExists(\n <header className={classNames(\n styles.header,\n showVideoBanner && 'px-0 px-xl-3 pt-xl-3 ',\n showLogo && styles.hasLogo\n )}>\n <div {...containerProps}>\n {showVideoBanner && (\n <VideoBannerContent\n videoUrl={props.videoUrl}\n videoRef={videoRef}\n className={classNames(styles.videoContent, isVideoVisible && styles.videoVisible)}\n // If loop is true then isFinished will never be true.\n loop={!props.banner}\n />\n )}\n <PartnerProfileBannerHeaderContent\n type={contentType}\n name={heading}\n logoUrl={logoUrl}\n bgColor={props.logoBgColour}\n onClickSignUp={props.onClickSignUp}\n />\n {showVideoBanner && (\n <VideoBannerControls\n isPlaying={isPlaying}\n togglePlayPause={togglePlayPause}\n controls={controls}\n websiteUrl={websiteUrl}\n isStudent={props.isStudent}\n log={props.log}\n />\n )}\n </div>\n </header>,\n portalContainerContext?.container\n );\n}\n","import React from 'react';\n\nimport {\n DefaultBannerHeader,\n DefaultBannerHeaderProps,\n PartialDefaultBannerHeader\n} from './default-banner-header/DefaultBannerHeader';\nimport {\n PartialPartnerProfileBannerHeader,\n PartnerProfileBannerHeader,\n PartnerProfileBannerHeaderProps\n} from './partner-profile-banner-header/PartnerProfileBannerHeader';\n\ntype InternalDefaultBannerHeaderProps = DefaultBannerHeaderProps & {\n type?: 'default'\n};\n\ntype InternalPartnerProfileBannerHeaderProps = PartnerProfileBannerHeaderProps & {\n type?: 'partner-profile'\n};\n\ntype BannerHeaderProps = InternalDefaultBannerHeaderProps | InternalPartnerProfileBannerHeaderProps;\n\ntype BannerType = BannerHeaderProps['type'];\ntype BannerTypeOptions = {\n Component: React.ComponentType<any>,\n PartialComponent: React.ComponentType<any>\n};\n\nconst bannerTypeMap: Record<BannerType, BannerTypeOptions> = {\n 'default': {\n Component: DefaultBannerHeader,\n PartialComponent: PartialDefaultBannerHeader\n },\n 'partner-profile': {\n Component: PartnerProfileBannerHeader,\n PartialComponent: PartialPartnerProfileBannerHeader\n }\n};\n\nexport function BannerHeader(props: BannerHeaderProps): JSX.Element {\n const { type = 'default' } = props;\n\n const Component = bannerTypeMap[type].Component;\n return <Component {...props} />;\n}\n\ninterface PartialBannerHeaderProps {\n type?: BannerType;\n}\n\nexport function PartialBannerHeader(props: PartialBannerHeaderProps): JSX.Element {\n const { type = 'default' } = props;\n\n const PartialComponent = bannerTypeMap[type].PartialComponent;\n return <PartialComponent {...props} />;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DMZ--ok1.chunk.js","names":[],"sources":["../../../../libs/common/src/react/utils/PortalHelper.ts","../../../../libs/shared/src/components/back-button/BackButton.tsx","../../../../libs/shared/src/components/banner-header/hooks/useBannerHeader.ts","../../../../libs/shared/src/components/banner-header/default-banner-header/default-banner-header.module.scss","../../../../libs/shared/src/components/banner-header/default-banner-header/DefaultBannerHeader.tsx","../../../../libs/shared/src/components/video/Video.tsx","../../../../libs/shared/src/images/svg/actions/PauseSvg.tsx","../../../../libs/shared/src/components/banner-header/enums/VideoBannerControlOption.ts","../../../../libs/shared/src/components/banner-header/utils/PartnerProfileBannerHeaderHelper.ts","../../../../libs/shared/src/components/banner-header/partner-profile-banner-header/partner-profile-banner-header.module.scss","../../../../libs/shared/src/components/banner-header/partner-profile-banner-header/PartnerProfileBannerHeaderContent.tsx","../../../../libs/shared/src/components/banner-header/partner-profile-banner-header/PartnerProfileBannerHeader.tsx","../../../../libs/shared/src/components/banner-header/BannerHeader.tsx"],"sourcesContent":["import React from 'react';\nimport { createPortal } from 'react-dom';\n\nexport const PortalHelper = {\n renderInPortalIfExists(component: React.ReactElement, portalContainer: Element | null): React.ReactElement {\n if (portalContainer)\n return createPortal(component, portalContainer);\n\n return component;\n }\n};\n","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { ChevronLeftSvg } from 'libs/shared/images/svg/arrows/ChevronLeftSvg';\n\nconst namespace = 'shared.backButton';\n\ninterface BackButtonProps {\n appLink: Core.AppLink;\n backToName?: string;\n color?: 'black' | 'white';\n extraClasses?: string;\n /**\n * Whether or not the button text has a text shadow. Defaults to true\n */\n textShadow?: boolean;\n}\n\nBackButton.defaultProps = {\n color: 'black',\n extraClasses: ''\n};\n\nexport function BackButton(props: BackButtonProps): React.ReactElement {\n const { backToName, appLink, color, extraClasses, textShadow } = {\n textShadow: true,\n ...props\n };\n\n const backPhrase = backToName ?\n LanguageService.getPhrase(namespace, 'backTo', { backToName }) :\n LanguageService.getPhrase(namespace, 'back');\n\n const colorClass = color === 'black' ? '' : 'text-white';\n const textShadowClass = textShadow ? 'text-shadow' : '';\n\n return (\n <AppLink\n appLink={appLink}\n className={`d-inline-flex align-items-center h5 mb-0 ${extraClasses} ${colorClass} ${textShadowClass}`}\n >\n <SvgContainer svg={ChevronLeftSvg} size={SvgContainerSize.Medium} />\n <span className='ms-1'>{backPhrase}</span>\n </AppLink>\n );\n}\n","import React from 'react';\n\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { ImageMinDimensions } from 'libs/shared/constants/ImageSizes';\nimport { BannerPortalContext } from 'libs/shared/context/BannerPortalContext';\nimport { ImageSize, ImageType, ResizeType } from 'libs/shared/enums/Images';\nimport { Breakpoints, useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Banner, Logo } from 'libs/shared/interfaces';\nimport { getBgColorClass } from 'libs/shared/utils/getBgColorClass';\nimport { ImageHelper, ImageOptions } from 'libs/shared/utils/ImageHelper';\n\nconst RATIO = `${ImageMinDimensions[ImageType.Banners].width}:${ImageMinDimensions[ImageType.Banners].height}`;\nconst DEFAULT_WIDTH = 1200; // This is ImageSize.Large for a Banner.\nconst LARGE_SCREEN_WIDTH = 1920;\n\nfunction getImageWidth(breakpoints: Breakpoints): number {\n if (breakpoints.xxl) return LARGE_SCREEN_WIDTH;\n\n return DEFAULT_WIDTH;\n}\n\ntype ContainerProps = React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>;\n\nfunction getContainerProps(\n banner?: Banner,\n bannerUrl?: string,\n bannerClassName?: string,\n blockColourClass?: string\n): ContainerProps {\n const containerProps: ContainerProps = {\n className: `banner banner-header ${bannerClassName}`,\n style: bannerUrl ? { backgroundImage: `url('${bannerUrl}')` } : {}\n };\n\n if (!banner && blockColourClass) {\n delete containerProps.style;\n containerProps.className += ` ${blockColourClass}`;\n }\n\n return containerProps;\n}\n\ninterface UseBannerHeaderOptions {\n heading: string;\n\n logo?: Logo;\n banner?: Banner;\n imageCdnUrl?: string;\n bannerImageOptions?: ImageOptions;\n bannerClassName?: string;\n blockColourClass?: string;\n}\n\nexport function useBannerHeader(options: UseBannerHeaderOptions) {\n const { heading, banner, logo, imageCdnUrl, bannerClassName, blockColourClass } = options;\n\n const breakpoints = useBreakpoints();\n const portalContainerContext = React.useContext(BannerPortalContext);\n\n const imageWidth = getImageWidth(breakpoints);\n\n const bannerImageOptions = options.bannerImageOptions || {\n width: imageWidth,\n ratio: RATIO,\n resizeType: ResizeType.Cover\n };\n\n const bannerUrl =\n !!banner && !!imageCdnUrl ?\n ImageHelper.createBannerUrl(\n banner,\n {\n fallbackBaseUrl: imageCdnUrl,\n fallbackCategoryName: heading,\n type: ImageType.Banners\n },\n bannerImageOptions\n ) :\n undefined;\n\n const logoFallbackBgClassName = getBgColorClass(heading, BG_COLOUR_CLASS_NAMES);\n const logoUrl = !!logo && !!imageCdnUrl ? ImageHelper.createUrl(logo.url, { size: ImageSize.Medium }) : undefined;\n const containerProps = getContainerProps(banner, bannerUrl, bannerClassName, blockColourClass);\n\n return {\n logoUrl,\n bannerUrl,\n containerProps,\n portalContainerContext,\n logoFallbackBgClassName\n };\n}\n","@import '~styles/utils/mixins';\n@import '~styles/utils/include-media';\n:local {\n .bannerContent {\n position: absolute;\n bottom: map-get($spacers, 3);\n right: map-get($spacers, 3);\n left: map-get($spacers, 3);\n display: flex;\n align-items: flex-end;\n\n .actionsContainer {\n margin-left: auto;\n padding-left: map-get($spacers, 2);\n }\n\n @include media('<=md') {\n bottom: 1rem;\n }\n }\n\n .bannerContentWithLogo {\n right: 7rem + map-get($spacers, 3);\n }\n\n .container {\n @include media('<=xl') {\n max-width: 100%;\n }\n }\n\n .logoContainer {\n position: absolute;\n top: 50%;\n right: map-get($spacers, 3);\n transform: translateY(-50%);\n height: 60%;\n max-height: 7.5rem;\n\n img {\n height: 100%;\n }\n }\n\n .logoContainerLeft {\n width: 8rem;\n aspect-ratio: 1 / 1;\n }\n\n .logoHeading {\n max-width: 32.5rem;\n }\n\n .specialEventContainer {\n font-size: 0.8rem;\n min-width: 7rem;\n margin-right: map-get($spacers, 3);\n\n @include media('<=lg') {\n min-width: 6rem;\n font-size: 0.7rem;\n margin-right: map-get($spacers, 2);\n }\n\n @include media('<=md') {\n min-width: 5.5rem;\n font-size: 0.65rem;\n }\n\n @include media('<=sm') {\n min-width: 5rem;\n font-size: 0.6rem;\n }\n }\n\n .headingLarge {\n @include clamp(5);\n font-size: $h3-font-size;\n\n @include media(\"<xl\") {\n font-size: $h4-font-size;\n }\n\n @include media(\"<lg\") {\n @include clamp(4);\n font-size: $h5-font-size;\n }\n\n @include media(\"<md\") {\n font-size: $h6-font-size;\n }\n }\n .heading {\n @include clamp(4);\n \n @include media(\"<=sm\") {\n @include clamp(2);\n }\n \n }\n}","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\nimport { PortalHelper } from 'libs/common/react/utils/PortalHelper';\n\nimport { ComingSoonTag } from 'libs/shared/apps/calendar/components/coming-soon-tag/ComingSoonTag';\nimport { GenericCalendarDate } from 'libs/shared/apps/calendar/components/generic-calendar-date/GenericCalendarDate';\nimport { CalendarTheme } from 'libs/shared/apps/calendar/interfaces/CalendarTheme';\nimport { ActionOptions, Actions } from 'libs/shared/components/actions/Actions';\nimport { BackButton } from 'libs/shared/components/back-button/BackButton';\nimport { LazyImage } from 'libs/shared/components/lazy-image/LazyImage';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { BannerPortalContext } from 'libs/shared/context/BannerPortalContext';\nimport { Banner, CalendarEvent, Logo } from 'libs/shared/interfaces';\nimport { ImageOptions } from 'libs/shared/utils/ImageHelper';\n\nimport { useBannerHeader } from '../hooks/useBannerHeader';\n\nimport styles from './default-banner-header.module.scss';\n\nfunction getSizeClass(heading: string): string {\n if (heading.length < 160)\n return 'h1';\n\n return styles.headingLarge;\n}\n\nexport interface DefaultBannerHeaderProps {\n heading: string;\n banner?: Banner;\n bannerClassName?: string;\n imageCdnUrl?: string;\n logo?: Logo;\n logoBgColour?: string;\n actions?: ActionOptions[];\n specialEvent?: CalendarEvent;\n backButtonAppLink?: Core.AppLink;\n backButtonText?: string;\n backButtonClasses?: string;\n sortComponent?: JSX.Element;\n blockColourClass?: string;\n actionsDropdownClassName?: string;\n detailsComponent?: () => React.ReactElement;\n imageOptions?: ImageOptions;\n showComingSoon?: boolean;\n alignLogoLeft?: boolean;\n calendarTheme?: CalendarTheme;\n}\n\nconst namespace = 'shared.defaultBannerHeader';\n\nexport const DefaultBannerHeader =\n React.memo(function(props: React.PropsWithChildren<DefaultBannerHeaderProps>): React.ReactElement {\n const { heading, banner, imageCdnUrl, actions, sortComponent, blockColourClass, specialEvent } = props;\n\n const {\n logoUrl,\n portalContainerContext,\n logoFallbackBgClassName,\n containerProps\n } = useBannerHeader({\n heading,\n banner,\n blockColourClass,\n bannerClassName: props.bannerClassName,\n imageCdnUrl,\n logo: props.logo,\n bannerImageOptions: props.imageOptions\n });\n\n const specialEventIsToday = React.useMemo(() => {\n if (!specialEvent || props.showComingSoon)\n return false;\n\n const today = DateHelper.format(new Date(), 'YYYY-MM-DD');\n\n if (!specialEvent.endDate)\n return specialEvent.startDate === today;\n\n return specialEvent.startDate <= today && specialEvent.endDate >= today;\n }, [specialEvent]);\n\n function getSpecialEventMonthText(specialEvent: CalendarEvent): string {\n if (!specialEvent.endDate)\n return DateHelper.format(specialEvent.startDate, 'MMMM');\n\n if (DateHelper.isSame(specialEvent.startDate, specialEvent.endDate, 'month'))\n return DateHelper.format(specialEvent.startDate, 'MMMM');\n\n return `${DateHelper.format(specialEvent.startDate, 'MMM')} - ${DateHelper.format(specialEvent.endDate, 'MMM')}`;\n }\n\n const DetailsComponent = props.detailsComponent;\n\n return PortalHelper.renderInPortalIfExists(\n // \"banner\" is used in playlists in Online. banner-header is used by all other projects\n <header {...containerProps}>\n <div className={`container ${styles.container} position-relative inner-banner`}>\n {props.backButtonAppLink && (\n <div className='pt-3'>\n <BackButton\n appLink={props.backButtonAppLink}\n backToName={props.backButtonText}\n extraClasses={props.backButtonClasses}\n color='white'\n />\n </div>\n )}\n \n <div className={`${props.alignLogoLeft ? 'position-absolute top-50 start-0 translate-middle-y w-100 ps-4' : `${styles.bannerContent} px-2 ${props.logo?.url ? styles.bannerContentWithLogo : ''}`}`}>\n {!!specialEvent && (\n <div className={`position-relative ${styles.specialEventContainer}`}>\n <GenericCalendarDate\n body={{\n type: specialEvent.endDate ? 'range' : 'day',\n text: specialEvent.endDate ?\n `${DateHelper.format(specialEvent.startDate, 'DD')}-${DateHelper.format(specialEvent.endDate, 'DD')}` :\n DateHelper.format(specialEvent.startDate, 'DD')\n }}\n month={getSpecialEventMonthText(specialEvent)}\n theme={props.calendarTheme}\n />\n </div>\n )}\n <div>\n {specialEventIsToday && (\n <div className='rounded-pill py-1 px-2 my-1 me-1 fw-semibold bg-light-blue lh-1 d-inline-block'>\n <Text namespace={namespace} phrase='onToday' />\n </div>\n )}\n {props.showComingSoon && (\n <ComingSoonTag className='pe-2 fw-semibold mb-1 rounded-pill justify-content-start text-nowrap' />\n )}\n <div className='d-flex align-items-center'>\n {props.alignLogoLeft && props.logo?.url &&\n <div className={`${styles.logoContainerLeft} d-none d-md-block rounded-circle overflow-hidden me-3 ${logoFallbackBgClassName}`}>\n <LazyImage\n src={logoUrl}\n style={{ backgroundColor: props.logoBgColour }}\n />\n </div>\n }\n <h1 className={`text-white text-shadow pe-3 position-static ${styles.heading} ${getSizeClass(heading)} ${props.alignLogoLeft ? 'w-50' : ''}`}>\n {heading}\n {DetailsComponent && <DetailsComponent />}\n </h1>\n </div>\n </div>\n {!!actions && (\n <div className={styles.actionsContainer}>\n <Actions\n actions={actions}\n sortComponent={sortComponent}\n actionsDropdownClassName={props.actionsDropdownClassName}\n />\n </div>\n )}\n </div>\n {!props.alignLogoLeft && !!props.logo?.url &&\n <div className={styles.logoContainer}>\n <img\n src={logoUrl}\n className='rounded-circle'\n />\n </div>\n }\n </div>\n </header>,\n portalContainerContext?.container\n );\n }, (prevProps, nextProps): boolean => (\n prevProps.actions === nextProps.actions\n && prevProps.heading === nextProps.heading\n && prevProps.logo?.url === nextProps.logo?.url\n ));\n\nexport function PartialDefaultBannerHeader(): JSX.Element {\n const portalContainerContext = React.useContext(BannerPortalContext);\n\n return PortalHelper.renderInPortalIfExists(\n <div className={`partial-banner partial-loading-background ${styles.banner}`} />,\n portalContainerContext?.container\n );\n}\n","import React from 'react';\n\nimport { ContentPartnerEventLoggerFn } from 'libs/shared/apps/content-partners/utils/get-content-partner-event-logger/getContentPartnerEventLogger';\n\ninterface VideoState {\n loaded: boolean;\n isPlaying: boolean;\n isFinished: boolean;\n}\n\ninterface VideoControlsProps {\n onPlay?: () => void;\n onPause?: () => void;\n onEnd?: () => void;\n onInit?: () => void;\n onMute?: () => void;\n onUnmute?: () => void;\n /**\n * Milliseconds to delay the the `loaded` state being set to true.\n */\n addDelayOnLoad?: number;\n log?: ContentPartnerEventLoggerFn;\n}\n\nexport function useVideoControls(options?: VideoControlsProps) {\n const ref = React.useRef<HTMLVideoElement>(null);\n\n const [ videoState, setVideoState ] = React.useState<VideoState>({\n loaded: false,\n isPlaying: false,\n // Note: If `loop` is set to true, then `isFinished` will never be true.\n isFinished: false\n });\n\n function setVideoStateProperty<K extends keyof VideoState>(key: K, value: VideoState[K]) {\n setVideoState(prevState => ({ ...prevState, [key]: value }));\n }\n\n const videoEventListenerMap: {[key in keyof HTMLVideoElementEventMap]?: (event: Event) => void } = {\n loadstart: () => {\n options?.onInit?.();\n },\n canplay: () => {\n if (typeof options?.addDelayOnLoad === 'number') {\n pause();\n if (ref.current?.autoplay)\n ref.current.autoplay = false;\n \n setTimeout(() => {\n setVideoStateProperty('loaded', true);\n play();\n }, options.addDelayOnLoad);\n } else {\n setVideoStateProperty('loaded', true);\n }\n },\n play: () => {\n setVideoStateProperty('isPlaying', true);\n options?.onPlay?.();\n },\n pause: () => {\n setVideoStateProperty('isPlaying', false);\n options?.onPause?.();\n },\n ended: () => {\n setVideoState(prevState => ({ ...prevState, isPlaying: false, isFinished: true }));\n options?.onEnd?.();\n }\n };\n\n React.useEffect(() => {\n if (!Object.keys(videoEventListenerMap).length)\n return;\n\n Object.entries(videoEventListenerMap).forEach(([ event, handler ]) => {\n ref.current?.addEventListener(event, handler);\n });\n\n return () => {\n Object.entries(videoEventListenerMap).forEach(([ event, handler ]) => {\n ref.current?.removeEventListener(event, handler);\n });\n };\n }, [ref.current]);\n\n function play() {\n if (videoState.isPlaying)\n return;\n \n ref.current?.play();\n setVideoState(prevState => ({ ...prevState, isPlaying: true, isFinished: false }));\n }\n\n function pause() {\n if (!videoState.isPlaying)\n return;\n \n ref.current?.pause();\n setVideoStateProperty('isPlaying', false);\n }\n\n function togglePlayPause() {\n if (videoState.isPlaying) {\n pause();\n options?.log?.({\n type: 'click-video-banner-controls',\n control: 'pause'\n });\n } else {\n play();\n options?.log?.({\n type: 'click-video-banner-controls',\n control: 'play'\n });\n }\n }\n\n function loop() {\n if (!ref.current)\n return;\n \n ref.current.loop = true;\n }\n\n return {\n videoRef: ref,\n ...videoState,\n play,\n pause,\n togglePlayPause,\n loop\n };\n}\n\ninterface VideoProps extends React.VideoHTMLAttributes<HTMLVideoElement> {\n}\n\nexport const Video = React.forwardRef<HTMLVideoElement, VideoProps>((props, ref) => {\n const {\n autoPlay = false,\n muted = true,\n loop = false,\n controls = false,\n disablePictureInPicture = true,\n disableRemotePlayback = true,\n ...otherProps\n } = props;\n\n return (\n <video\n ref={ref}\n autoPlay={autoPlay}\n muted={muted}\n loop={loop}\n controls={controls}\n disablePictureInPicture={disablePictureInPicture}\n disableRemotePlayback={disableRemotePlayback}\n {...otherProps}\n />\n );\n});\n","import React from 'react';\n\nexport function PauseSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M9.5 6C8.67157 6 8 6.67157 8 7.5V16.5C8 17.3284 8.67157 18 9.5 18C10.3284 18 11 17.3284 11 16.5V7.5C11 6.67157 10.3284 6 9.5 6ZM15.5 6C14.6716 6 14 6.67157 14 7.5V16.5C14 17.3284 14.6716 18 15.5 18C16.3284 18 17 17.3284 17 16.5V7.5C17 6.67157 16.3284 6 15.5 6Z'\n />\n </svg>\n\n );\n}\n","export enum VideoBannerControlOption {\n PlayPause = 'play-pause',\n WebsiteLink = 'website-link'\n}\n\nexport const AllVideoBannerControlOptions: VideoBannerControlOption[] = [\n VideoBannerControlOption.PlayPause,\n VideoBannerControlOption.WebsiteLink\n];\n","import { VideoBannerControlOption } from '../enums/VideoBannerControlOption';\n\nexport type PartnerProfileBannerHeaderContentType = 'text' | 'logo' | 'sign-up';\n\ninterface GetBannerHeaderContentTypeOptions {\n logoUrl?: string;\n isAuthenticated: boolean;\n showVideoBanner: boolean;\n}\n\nexport const PartnerProfileBannerHeaderHelper = {\n getBannerHeaderContentType(\n options: GetBannerHeaderContentTypeOptions\n ): PartnerProfileBannerHeaderContentType {\n let contentType: PartnerProfileBannerHeaderContentType = 'text';\n \n if (options.logoUrl)\n contentType = 'logo';\n\n if (!options.isAuthenticated && options.showVideoBanner)\n contentType = 'sign-up';\n \n return contentType;\n },\n\n showWebsiteLinkControls(controls: VideoBannerControlOption[], websiteUrl: string, isStudent: boolean) {\n if (isStudent)\n return false;\n\n return !!websiteUrl && controls.includes(VideoBannerControlOption.WebsiteLink);\n }\n};\n","@import '~styles/utils/mixins';\n@import '~styles/utils/include-media';\n\n:local {\n $logoContainerWidth: 13.75rem; // 220px From design and what looks good\n $logoPositionBottomOffset: 1rem; // 16px offset\n\n .videoBannerRadius {\n border-radius: 0;\n\n @include media('>=xl') {\n border-radius: $border-radius-lg;\n }\n }\n\n .nowrap {\n white-space: nowrap;\n }\n\n\n .hasLogo {\n padding-bottom: $logoPositionBottomOffset;\n }\n\n .logoPosition {\n bottom: -$logoPositionBottomOffset;\n }\n\n .logoContainer {\n width: $logoContainerWidth;\n }\n\n .container {\n @include media('<=xl') {\n max-width: 100%;\n }\n }\n\n .signUpContainer {\n $leftOffset: $logoContainerWidth + map-get($spacers, 4);\n left: calc(#{$leftOffset});\n width: calc(100% - #{$leftOffset} - map-get($spacers, 1));\n z-index: 1;\n }\n\n .signUpContent {\n background: rgba(255, 255, 255, 0.1);\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n border: 1px solid rgba(255, 255, 255, 0.35);\n border-left: none;\n border-right: none;\n }\n\n .signUpHeading {\n white-space: nowrap;\n\n @include media('<=md') {\n white-space: normal;\n }\n }\n\n .emailInput {\n @include media('>=md') {\n min-width: 19.375rem; // from design\n }\n }\n\n .videoControls {\n top: 1rem;\n right: 1rem;\n transition: opacity 0.5s ease-in-out;\n }\n\n .videoContent {\n opacity: 0;\n transition: opacity 0.5s ease-in-out;\n }\n\n .videoVisible {\n opacity: 1;\n }\n}","import React from 'react';\nimport { Button } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { RectangularLogo } from 'libs/shared/components/rectangular-logo/RectangularLogo';\n\nimport { PartnerProfileBannerHeaderContentType } from '../utils/PartnerProfileBannerHeaderHelper';\n\nimport styles from './partner-profile-banner-header.module.scss';\n\nconst namespace = 'bannerHeader.partnerProfileBannerHeader';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface PartnerProfileBannerHeaderContentProps {\n type: PartnerProfileBannerHeaderContentType;\n name: string;\n onClickSignUp: (email: string) => void;\n logoUrl?: string;\n bgColor?: string;\n}\n\nfunction BannerWithText(props: PartnerProfileBannerHeaderContentProps): JSX.Element {\n return (\n <div className={classNames('container position-relative inner-banner', styles.container)}>\n <div className='position-absolute bottom-0 start-0 mb-3 w-100 px-4'>\n <div className='d-flex align-items-center'>\n <h1 className='text-white text-shadow pe-3 position-static mb-0'>{props.name}</h1>\n </div>\n </div>\n </div>\n );\n}\n\nfunction BannerWithLogo(props: PartnerProfileBannerHeaderContentProps): JSX.Element {\n return (\n <div className={classNames('container position-relative inner-banner', styles.container)}>\n <div className={classNames('position-absolute start-0 px-4', styles.logoPosition)}>\n <div className={styles.logoContainer}>\n <RectangularLogo\n logoUrl={props.logoUrl}\n bgColor={props.bgColor}\n name={props.name}\n classNames={{\n container: 'border border-white'\n }}\n />\n </div>\n </div>\n </div>\n );\n}\n\nfunction BannerWithSignUp(props: PartnerProfileBannerHeaderContentProps): JSX.Element {\n const [ email, setEmail ] = React.useState('');\n\n function onSubmit(e: React.FormEvent<HTMLFormElement>): void {\n e.preventDefault();\n props.onClickSignUp(email);\n }\n\n return (\n <div className={classNames('container position-relative inner-banner', styles.container)}>\n <div className={classNames('position-absolute start-0 px-4 ', styles.logoPosition)}>\n <div className={styles.logoContainer}>\n <RectangularLogo\n logoUrl={props.logoUrl}\n bgColor={props.bgColor}\n name={props.name}\n classNames={{\n container: 'border border-white'\n }}\n />\n </div>\n </div>\n <div\n className={classNames(\n 'position-absolute bottom-0 pb-2 pb-md-3 px-0 px-sm-3 d-none d-xl-block',\n styles.signUpContainer\n )}\n >\n <div\n className={classNames(\n 'd-flex align-items-center justify-content-between gap-2 flex-wrap rounded-3 p-3',\n styles.signUpContent\n )}\n >\n <div className='d-sm-flex align-items-center gap-2 '>\n <h4 className={classNames('text-white text-shadow mb-0', styles.signUpHeading)}>\n {getPhrase('description')}\n </h4>\n </div>\n <form className='d-flex align-items-center gap-2 flex-grow-1 flex-md-grow-0' onSubmit={onSubmit}>\n <input\n type='email'\n className={classNames('form-control w-100', styles.emailInput)}\n placeholder={getPhrase('emailPlaceholder')}\n value={email}\n onChange={e => setEmail(e.target.value)}\n />\n <Button type='submit' variant='dark' className={styles.nowrap}>\n {getPhrase('cta')}\n </Button>\n </form>\n </div>\n </div>\n </div>\n );\n}\n\nconst HeaderTypeContentMap: Record<\n PartnerProfileBannerHeaderContentType,\n React.ComponentType<PartnerProfileBannerHeaderContentProps>\n> = {\n 'logo': BannerWithLogo,\n 'sign-up': BannerWithSignUp,\n 'text': BannerWithText\n};\n\nexport function PartnerProfileBannerHeaderContent(props: PartnerProfileBannerHeaderContentProps): JSX.Element {\n const ContentComponent = HeaderTypeContentMap[props.type];\n return <ContentComponent {...props} />;\n}\n","import React from 'react';\n\nimport { LocationUtils } from 'libs/common/backbone/core';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\nimport { PortalHelper } from 'libs/common/react/utils/PortalHelper';\n\nimport { ContentPartnerEventLoggerFn } from 'libs/shared/apps/content-partners/utils/get-content-partner-event-logger/getContentPartnerEventLogger';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { useVideoControls, Video } from 'libs/shared/components/video/Video';\nimport { BannerPortalContext } from 'libs/shared/context/BannerPortalContext';\nimport { ResizeType } from 'libs/shared/enums/Images';\nimport { PauseSvg } from 'libs/shared/images/svg/actions/PauseSvg';\nimport { PlaySvg } from 'libs/shared/images/svg/actions/PlaySvg';\nimport { LinkSvg } from 'libs/shared/images/svg/objects/LinkSvg';\nimport { Banner, Logo } from 'libs/shared/interfaces';\n\nimport { AllVideoBannerControlOptions, VideoBannerControlOption } from '../enums/VideoBannerControlOption';\nimport { useBannerHeader } from '../hooks/useBannerHeader';\nimport { PartnerProfileBannerHeaderHelper } from '../utils/PartnerProfileBannerHeaderHelper';\n\nimport { PartnerProfileBannerHeaderContent } from './PartnerProfileBannerHeaderContent';\n\nimport styles from './partner-profile-banner-header.module.scss';\n\nconst namespace = 'bannerHeader.partnerProfileBannerHeader';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface VideoBannerContentProps {\n videoUrl: string;\n className?: string;\n videoRef: React.RefObject<HTMLVideoElement>;\n loop?: boolean;\n}\n\nfunction VideoBannerContent(props: VideoBannerContentProps): JSX.Element {\n return (\n <div className={classNames('position-absolute top-0 start-0 w-100 h-100 overflow-hidden', props.className, styles.videoBannerRadius)}>\n <Video ref={props.videoRef} autoPlay muted controls={false} loop={props.loop} className='w-100 h-100 object-fit-cover position-relative'>\n <source src={props.videoUrl} type='video/mp4' />\n </Video>\n </div>\n );\n}\n\ninterface VideoBannerControlsProps {\n isPlaying: boolean;\n togglePlayPause: () => void;\n className?: string;\n controls?: VideoBannerControlOption[];\n websiteUrl?: string;\n isStudent: boolean;\n log?: ContentPartnerEventLoggerFn;\n}\n\nfunction VideoBannerControls(props: VideoBannerControlsProps): JSX.Element {\n const PlayPauseIcon = props.isPlaying ? PauseSvg : PlaySvg;\n\n function onClickWebsiteLink(): void {\n if (!props.websiteUrl) return;\n LocationUtils.PageLoad(props.websiteUrl, true);\n props.log?.({\n type: 'click-video-banner-controls',\n control: 'website-link'\n });\n }\n \n const controls = props.controls || AllVideoBannerControlOptions;\n const showWebsiteLinkControls = PartnerProfileBannerHeaderHelper.showWebsiteLinkControls(\n controls,\n props.websiteUrl,\n props.isStudent\n );\n\n return (\n <div className={classNames(\n styles.videoControls,\n 'position-absolute d-flex gap-2 ',\n props.isPlaying && 'banner-header-video--controls',\n props.className\n )}>\n {showWebsiteLinkControls && (\n <IconButton\n svg={LinkSvg}\n svgSize={SvgContainerSize.Standard}\n className='bg-gray-200 rounded-circle cursor-pointer'\n onClick={onClickWebsiteLink}\n ariaLabel={getPhrase('viewWebsite')}\n role='button'\n tooltip={getPhrase('viewWebsite')}\n tooltipTrigger={[ 'hover', 'focus' ]}\n />\n )}\n {controls.includes(VideoBannerControlOption.PlayPause) && (\n <IconButton\n svg={PlayPauseIcon}\n svgSize={SvgContainerSize.Standard}\n className='bg-gray-200 rounded-circle cursor-pointer'\n onClick={props.togglePlayPause}\n ariaLabel={props.isPlaying ? getPhrase('pause') : getPhrase('play')}\n role='button'\n tooltip={props.isPlaying ? getPhrase('pause') : getPhrase('play')}\n tooltipTrigger={[ 'hover', 'focus' ]}\n />\n )}\n </div>\n );\n}\n\nexport function PartialPartnerProfileBannerHeader(): JSX.Element {\n const portalContainerContext = React.useContext(BannerPortalContext);\n\n return PortalHelper.renderInPortalIfExists(\n <div className='partial-banner partial-loading-background' />,\n portalContainerContext?.container\n );\n}\n\nexport type PartnerBannerHeaderType = 'static' | 'video';\n\nexport interface PartnerProfileBannerHeaderProps {\n heading: string;\n onClickSignUp: (email: string) => void;\n isAuthenticated: boolean;\n isStudent: boolean;\n partnerBannerType?: PartnerBannerHeaderType;\n banner?: Banner;\n logo?: Logo;\n videoUrl?: string;\n imageCdnUrl?: string;\n logoBgColour?: string;\n actions?: ActionOptions[];\n blockColourClass?: string;\n websiteUrl?: string;\n log?: ContentPartnerEventLoggerFn;\n}\n\nconst VIDEO_BANNER_WIDTH = 1920;\nconst VIDEO_BANNER_RATIO = '1200:330';\n\nexport function PartnerProfileBannerHeader(props: PartnerProfileBannerHeaderProps): JSX.Element {\n const { heading, isAuthenticated, partnerBannerType = 'static', websiteUrl } = props;\n\n const {\n videoRef,\n isPlaying,\n isFinished,\n loaded,\n togglePlayPause\n } = useVideoControls({\n addDelayOnLoad: 2500,\n log: props.log\n });\n\n const showVideoBanner = partnerBannerType === 'video' && !!props.videoUrl;\n const isVideoVisible = loaded && !isFinished;\n\n const { containerProps, portalContainerContext, logoUrl } = useBannerHeader({\n heading,\n banner: props.banner,\n logo: props.logo,\n imageCdnUrl: props.imageCdnUrl,\n blockColourClass: props.blockColourClass,\n bannerClassName: classNames(\n showVideoBanner && 'banner-header-video position-relative',\n showVideoBanner && styles.videoBannerRadius\n ),\n bannerImageOptions: showVideoBanner ? {\n width: VIDEO_BANNER_WIDTH,\n ratio: VIDEO_BANNER_RATIO,\n resizeType: ResizeType.Cover\n } : null\n });\n\n const contentType = PartnerProfileBannerHeaderHelper.getBannerHeaderContentType({\n logoUrl,\n isAuthenticated,\n showVideoBanner\n });\n\n const showLogo = contentType === 'logo' || contentType === 'sign-up';\n const controls = isVideoVisible ?\n AllVideoBannerControlOptions :\n [ VideoBannerControlOption.PlayPause, VideoBannerControlOption.WebsiteLink ];\n \n return PortalHelper.renderInPortalIfExists(\n <header className={classNames(\n styles.header,\n showVideoBanner && 'px-0 px-xl-3 pt-xl-3 ',\n showLogo && styles.hasLogo\n )}>\n <div {...containerProps}>\n {showVideoBanner && (\n <VideoBannerContent\n videoUrl={props.videoUrl}\n videoRef={videoRef}\n className={classNames(styles.videoContent, isVideoVisible && styles.videoVisible)}\n // If loop is true then isFinished will never be true.\n loop={!props.banner}\n />\n )}\n <PartnerProfileBannerHeaderContent\n type={contentType}\n name={heading}\n logoUrl={logoUrl}\n bgColor={props.logoBgColour}\n onClickSignUp={props.onClickSignUp}\n />\n {showVideoBanner && (\n <VideoBannerControls\n isPlaying={isPlaying}\n togglePlayPause={togglePlayPause}\n controls={controls}\n websiteUrl={websiteUrl}\n isStudent={props.isStudent}\n log={props.log}\n />\n )}\n </div>\n </header>,\n portalContainerContext?.container\n );\n}\n","import React from 'react';\n\nimport {\n DefaultBannerHeader,\n DefaultBannerHeaderProps,\n PartialDefaultBannerHeader\n} from './default-banner-header/DefaultBannerHeader';\nimport {\n PartialPartnerProfileBannerHeader,\n PartnerProfileBannerHeader,\n PartnerProfileBannerHeaderProps\n} from './partner-profile-banner-header/PartnerProfileBannerHeader';\n\ntype InternalDefaultBannerHeaderProps = DefaultBannerHeaderProps & {\n type?: 'default'\n};\n\ntype InternalPartnerProfileBannerHeaderProps = PartnerProfileBannerHeaderProps & {\n type?: 'partner-profile'\n};\n\ntype BannerHeaderProps = InternalDefaultBannerHeaderProps | InternalPartnerProfileBannerHeaderProps;\n\ntype BannerType = BannerHeaderProps['type'];\ntype BannerTypeOptions = {\n Component: React.ComponentType<any>,\n PartialComponent: React.ComponentType<any>\n};\n\nconst bannerTypeMap: Record<BannerType, BannerTypeOptions> = {\n 'default': {\n Component: DefaultBannerHeader,\n PartialComponent: PartialDefaultBannerHeader\n },\n 'partner-profile': {\n Component: PartnerProfileBannerHeader,\n PartialComponent: PartialPartnerProfileBannerHeader\n }\n};\n\nexport function BannerHeader(props: BannerHeaderProps): JSX.Element {\n const { type = 'default' } = props;\n\n const Component = bannerTypeMap[type].Component;\n return <Component {...props} />;\n}\n\ninterface PartialBannerHeaderProps {\n type?: BannerType;\n}\n\nexport function PartialBannerHeader(props: PartialBannerHeaderProps): JSX.Element {\n const { type = 'default' } = props;\n\n const PartialComponent = bannerTypeMap[type].PartialComponent;\n return <PartialComponent {...props} />;\n}\n"],"mappings":"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"}
|