@clickview/streamable-learning 0.48.0-rc.0 → 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.
Files changed (116) hide show
  1. package/dist/.vite/manifest.json +650 -650
  2. package/dist/bundles.json +1 -1
  3. package/dist/css/DU3tPCD_.chunk.css +12 -0
  4. package/dist/en.json +1 -1
  5. package/dist/scripts/{CeWjJPIz.chunk.js → BIisq8ZO.chunk.js} +2 -2
  6. package/dist/scripts/{CeWjJPIz.chunk.js.map → BIisq8ZO.chunk.js.map} +1 -1
  7. package/dist/scripts/{DxsW8K0n2.chunk.js → BWU6_pPN2.chunk.js} +2 -2
  8. package/dist/scripts/{DxsW8K0n2.chunk.js.map → BWU6_pPN2.chunk.js.map} +1 -1
  9. package/dist/scripts/{BMjES83N2.chunk.js → BcZFo9Vw2.chunk.js} +2 -2
  10. package/dist/scripts/{BMjES83N2.chunk.js.map → BcZFo9Vw2.chunk.js.map} +1 -1
  11. package/dist/scripts/Bd2bbHru.chunk.js +1 -0
  12. package/dist/scripts/{0xQRFMBY.chunk.js → BfNy0Hvk.chunk.js} +2 -2
  13. package/dist/scripts/{0xQRFMBY.chunk.js.map → BfNy0Hvk.chunk.js.map} +1 -1
  14. package/dist/scripts/{C9UjF0q6.chunk.js → BivP7X20.chunk.js} +2 -2
  15. package/dist/scripts/{C9UjF0q6.chunk.js.map → BivP7X20.chunk.js.map} +1 -1
  16. package/dist/scripts/{DrDQfaFN2.chunk.js → BjbY4Fbp2.chunk.js} +3 -3
  17. package/dist/scripts/{DrDQfaFN2.chunk.js.map → BjbY4Fbp2.chunk.js.map} +1 -1
  18. package/dist/scripts/{awemA_vU2.chunk.js → BmxcE73n2.chunk.js} +2 -2
  19. package/dist/scripts/{awemA_vU2.chunk.js.map → BmxcE73n2.chunk.js.map} +1 -1
  20. package/dist/scripts/{BMl02f_62.chunk.js → BnEMhkEE2.chunk.js} +2 -2
  21. package/dist/scripts/{BMl02f_62.chunk.js.map → BnEMhkEE2.chunk.js.map} +1 -1
  22. package/dist/scripts/{DmfbtOlu.chunk.js → Buc8GegC.chunk.js} +2 -2
  23. package/dist/scripts/{DmfbtOlu.chunk.js.map → Buc8GegC.chunk.js.map} +1 -1
  24. package/dist/scripts/{DvL3J2BU.chunk.js → Byczy1lS.chunk.js} +2 -2
  25. package/dist/scripts/{DvL3J2BU.chunk.js.map → Byczy1lS.chunk.js.map} +1 -1
  26. package/dist/scripts/{BV74ZRR22.chunk.js → C2itEpvc2.chunk.js} +2 -2
  27. package/dist/scripts/{BV74ZRR22.chunk.js.map → C2itEpvc2.chunk.js.map} +1 -1
  28. package/dist/scripts/{UAcFqQzZ.chunk.js → CEFKXxac.chunk.js} +2 -2
  29. package/dist/scripts/{UAcFqQzZ.chunk.js.map → CEFKXxac.chunk.js.map} +1 -1
  30. package/dist/scripts/{B7if0Lk52.chunk.js → CEYjJAp52.chunk.js} +2 -2
  31. package/dist/scripts/{B7if0Lk52.chunk.js.map → CEYjJAp52.chunk.js.map} +1 -1
  32. package/dist/scripts/{B1jitqYS2.chunk.js → CJSc4YDq2.chunk.js} +2 -2
  33. package/dist/scripts/{B1jitqYS2.chunk.js.map → CJSc4YDq2.chunk.js.map} +1 -1
  34. package/dist/scripts/{JtFbyaXc.chunk.js → CKUA5J3R.chunk.js} +2 -2
  35. package/dist/scripts/{JtFbyaXc.chunk.js.map → CKUA5J3R.chunk.js.map} +1 -1
  36. package/dist/scripts/{DNO0KpY72.chunk.js → CYrzupmS2.chunk.js} +2 -2
  37. package/dist/scripts/{DNO0KpY72.chunk.js.map → CYrzupmS2.chunk.js.map} +1 -1
  38. package/dist/scripts/{E9tNds1l.chunk.js → CcGYZb9f.chunk.js} +2 -2
  39. package/dist/scripts/{E9tNds1l.chunk.js.map → CcGYZb9f.chunk.js.map} +1 -1
  40. package/dist/scripts/{CibcLNJP2.chunk.js → CeQGaFi-2.chunk.js} +2 -2
  41. package/dist/scripts/{CibcLNJP2.chunk.js.map → CeQGaFi-2.chunk.js.map} +1 -1
  42. package/dist/scripts/{BqO6i89w2.chunk.js → Cr3Blj6H2.chunk.js} +2 -2
  43. package/dist/scripts/{BqO6i89w2.chunk.js.map → Cr3Blj6H2.chunk.js.map} +1 -1
  44. package/dist/scripts/{D0vsmyva.chunk.js → CxCkwLio.chunk.js} +2 -2
  45. package/dist/scripts/{D0vsmyva.chunk.js.map → CxCkwLio.chunk.js.map} +1 -1
  46. package/dist/scripts/{CvqqZmNo2.chunk.js → Cxj75Dqe2.chunk.js} +2 -2
  47. package/dist/scripts/{CvqqZmNo2.chunk.js.map → Cxj75Dqe2.chunk.js.map} +1 -1
  48. package/dist/scripts/{CcDgbmw52.chunk.js → D-VNmhoM2.chunk.js} +2 -2
  49. package/dist/scripts/{CcDgbmw52.chunk.js.map → D-VNmhoM2.chunk.js.map} +1 -1
  50. package/dist/scripts/{DAvXFgC62.chunk.js → D2FqnK9m2.chunk.js} +2 -2
  51. package/dist/scripts/{DAvXFgC62.chunk.js.map → D2FqnK9m2.chunk.js.map} +1 -1
  52. package/dist/scripts/{lokG7Sha2.chunk.js → D3sdyN2Q2.chunk.js} +2 -2
  53. package/dist/scripts/{lokG7Sha2.chunk.js.map → D3sdyN2Q2.chunk.js.map} +1 -1
  54. package/dist/scripts/{KCdpQ8qv2.chunk.js → D6IzS-bj2.chunk.js} +2 -2
  55. package/dist/scripts/{KCdpQ8qv2.chunk.js.map → D6IzS-bj2.chunk.js.map} +1 -1
  56. package/dist/scripts/{CPkKuTSK2.chunk.js → D8g6nOG92.chunk.js} +2 -2
  57. package/dist/scripts/{CPkKuTSK2.chunk.js.map → D8g6nOG92.chunk.js.map} +1 -1
  58. package/dist/scripts/{Bkv1Tbyu.chunk.js → DCKKwz9L.chunk.js} +2 -2
  59. package/dist/scripts/{Bkv1Tbyu.chunk.js.map → DCKKwz9L.chunk.js.map} +1 -1
  60. package/dist/scripts/{CeI-LCE-.chunk.js → DL4UFxRK.chunk.js} +2 -2
  61. package/dist/scripts/{CeI-LCE-.chunk.js.map → DL4UFxRK.chunk.js.map} +1 -1
  62. package/dist/scripts/{DLp7yHzT2.chunk.js → DLofRa642.chunk.js} +2 -2
  63. package/dist/scripts/{DLp7yHzT2.chunk.js.map → DLofRa642.chunk.js.map} +1 -1
  64. package/dist/scripts/{BSjm_rCE.chunk.js → DMZ--ok1.chunk.js} +2 -2
  65. package/dist/scripts/{BSjm_rCE.chunk.js.map → DMZ--ok1.chunk.js.map} +1 -1
  66. package/dist/scripts/{CikSQKH-.chunk.js → DQFcbMMk.chunk.js} +2 -2
  67. package/dist/scripts/{CikSQKH-.chunk.js.map → DQFcbMMk.chunk.js.map} +1 -1
  68. package/dist/scripts/{XnBhLH-02.chunk.js → DVeqPzBe2.chunk.js} +2 -2
  69. package/dist/scripts/{XnBhLH-02.chunk.js.map → DVeqPzBe2.chunk.js.map} +1 -1
  70. package/dist/scripts/{Clh6wBrg.chunk.js → DWerltCT.chunk.js} +2 -2
  71. package/dist/scripts/{Clh6wBrg.chunk.js.map → DWerltCT.chunk.js.map} +1 -1
  72. package/dist/scripts/{i2-k6ULv2.chunk.js → DatscYpA2.chunk.js} +2 -2
  73. package/dist/scripts/{i2-k6ULv2.chunk.js.map → DatscYpA2.chunk.js.map} +1 -1
  74. package/dist/scripts/{BXT8nHry2.chunk.js → DkaGC5IU2.chunk.js} +2 -2
  75. package/dist/scripts/{BXT8nHry2.chunk.js.map → DkaGC5IU2.chunk.js.map} +1 -1
  76. package/dist/scripts/{BoxedFO8.chunk.js → DqZWSPDJ.chunk.js} +2 -2
  77. package/dist/scripts/{BoxedFO8.chunk.js.map → DqZWSPDJ.chunk.js.map} +1 -1
  78. package/dist/scripts/{CoYNU7We2.chunk.js → Dql-1E6g2.chunk.js} +2 -2
  79. package/dist/scripts/{CoYNU7We2.chunk.js.map → Dql-1E6g2.chunk.js.map} +1 -1
  80. package/dist/scripts/{DNNNPLMp.chunk.js → DuBHin02.chunk.js} +2 -2
  81. package/dist/scripts/{DNNNPLMp.chunk.js.map → DuBHin02.chunk.js.map} +1 -1
  82. package/dist/scripts/{CK6c6uHp2.chunk.js → QMuFwiiF2.chunk.js} +2 -2
  83. package/dist/scripts/{CK6c6uHp2.chunk.js.map → QMuFwiiF2.chunk.js.map} +1 -1
  84. package/dist/scripts/{NV4_mMU8.chunk.js → U_sIlzAD.chunk.js} +2 -2
  85. package/dist/scripts/{NV4_mMU8.chunk.js.map → U_sIlzAD.chunk.js.map} +1 -1
  86. package/dist/scripts/{m9QbGES0.chunk.js → WLyOm9Lj.chunk.js} +2 -2
  87. package/dist/scripts/{m9QbGES0.chunk.js.map → WLyOm9Lj.chunk.js.map} +1 -1
  88. package/dist/scripts/{DlQrdOls.chunk.js → Ymq7JLkU.chunk.js} +2 -2
  89. package/dist/scripts/{DlQrdOls.chunk.js.map → Ymq7JLkU.chunk.js.map} +1 -1
  90. package/dist/scripts/{app-B1XBsz23.js → app-gjHxcZG3.js} +4 -4
  91. package/dist/scripts/app-gjHxcZG3.js.map +1 -0
  92. package/dist/scripts/{DIHDe4Sg.chunk.js → djRnI462.chunk.js} +2 -2
  93. package/dist/scripts/{DIHDe4Sg.chunk.js.map → djRnI462.chunk.js.map} +1 -1
  94. package/dist/scripts/{BDliRFoa.chunk.js → e2K2YU7z.chunk.js} +2 -2
  95. package/dist/scripts/{BDliRFoa.chunk.js.map → e2K2YU7z.chunk.js.map} +1 -1
  96. package/dist/scripts/{CpFOQcL7.chunk.js → fnfhCa1P.chunk.js} +2 -2
  97. package/dist/scripts/{CpFOQcL7.chunk.js.map → fnfhCa1P.chunk.js.map} +1 -1
  98. package/dist/scripts/{Dd8r1SE32.chunk.js → iyIL3kim2.chunk.js} +2 -2
  99. package/dist/scripts/{Dd8r1SE32.chunk.js.map → iyIL3kim2.chunk.js.map} +1 -1
  100. package/dist/scripts/{BKbKu9Rp.chunk.js → kfFYr9dc.chunk.js} +2 -2
  101. package/dist/scripts/{BKbKu9Rp.chunk.js.map → kfFYr9dc.chunk.js.map} +1 -1
  102. package/dist/scripts/{CwI-7tep2.chunk.js → kts5xiiM2.chunk.js} +2 -2
  103. package/dist/scripts/{CwI-7tep2.chunk.js.map → kts5xiiM2.chunk.js.map} +1 -1
  104. package/dist/scripts/{D8_5yfHY2.chunk.js → lLAYbgAy2.chunk.js} +2 -2
  105. package/dist/scripts/{D8_5yfHY2.chunk.js.map → lLAYbgAy2.chunk.js.map} +1 -1
  106. package/dist/scripts/{CXNve4Wq2.chunk.js → p9ukva5a2.chunk.js} +2 -2
  107. package/dist/scripts/{CXNve4Wq2.chunk.js.map → p9ukva5a2.chunk.js.map} +1 -1
  108. package/dist/scripts/{BCdnm1Nn.chunk.js → wOeN2ls0.chunk.js} +2 -2
  109. package/dist/scripts/{BCdnm1Nn.chunk.js.map → wOeN2ls0.chunk.js.map} +1 -1
  110. package/dist/scripts/{DMq5Gp-U2.chunk.js → zp2BHOp82.chunk.js} +2 -2
  111. package/dist/scripts/{DMq5Gp-U2.chunk.js.map → zp2BHOp82.chunk.js.map} +1 -1
  112. package/dist/scripts/{CmrPRojb.chunk.js → zyVwH8JF.chunk.js} +2 -2
  113. package/dist/scripts/{CmrPRojb.chunk.js.map → zyVwH8JF.chunk.js.map} +1 -1
  114. package/package.json +1 -1
  115. package/dist/scripts/D5Jnyjf8.chunk.js +0 -1
  116. package/dist/scripts/app-B1XBsz23.js.map +0 -1
@@ -1,2 +1,2 @@
1
- import{v as e}from"./Dp9qJj1C.chunk.js";import{t}from"./ImQRQGZr.chunk.js";import{C as n,l as r,lt as i,m as a,ut as o}from"./Dun43GrB.chunk.js";import{t as s}from"./B-OL6Vs7.chunk.js";import{t as c}from"./DeldjYRc.chunk.js";import{t as l}from"./CoualKDX.chunk.js";import{t as u}from"./Bkv1Tbyu.chunk.js";var d={pillTab:`_pillTab_1wdcp_2`};o();var f=i(),p=`streamable.header`;function m(i){let o=[{name:t.getPhrase(p,`heading`),appLink:i.appLinks?.discover,active:i.active===`discover`,analyticsData:{name:t.getPhrase(p,`heading`),url:e.getHref(i.appLinks?.discover)},analyticsOptions:{actionType:n.Click,entity:r.Url,location:a.MagicTabs}}];return i.appLinks?.calendar&&o.push({name:t.getPhrase(p,`livestreams`),appLink:i.appLinks?.calendar,active:i.active===`calendar`,analyticsData:{name:t.getPhrase(p,`livestreams`),url:e.getHref(i.appLinks?.calendar)},analyticsOptions:{actionType:n.Click,entity:r.Url,location:a.MagicTabs}}),o.push({name:t.getPhrase(p,`partners`),appLink:i.appLinks?.partners,active:i.active===`partners`,analyticsData:{name:t.getPhrase(p,`partners`),url:e.getHref(i.appLinks?.partners)},analyticsOptions:{actionType:n.Click,entity:r.Url,location:a.MagicTabs}}),(0,f.jsx)(`div`,{className:`py-3 text-center`,children:(0,f.jsx)(u,{tabs:o,className:d.pillTab})})}function h(e){return{...l,classification:t=>l.classification(t,e),classificationDirectory:()=>l.classificationDirectory(e),series:()=>null,latestReleases:()=>null,classificationLatestReleases:()=>null,playlist:()=>null,watchHistory:()=>null,widgetWizard:()=>null,partner:()=>null,partnerHome:()=>null}}function g(){return{discover:{application:s.DASHBOARD,action:c.Dashboard.HOME},calendar:{application:s.CALENDAR,action:c.Calendar.CALENDAR},partners:{application:s.DASHBOARD,action:c.Dashboard.CONTENT_PARTNERS}}}export{g as n,m as r,h as t};
2
- //# sourceMappingURL=NV4_mMU8.chunk.js.map
1
+ import{v as e}from"./Dp9qJj1C.chunk.js";import{t}from"./ImQRQGZr.chunk.js";import{C as n,l as r,lt as i,m as a,ut as o}from"./Dun43GrB.chunk.js";import{t as s}from"./B-OL6Vs7.chunk.js";import{t as c}from"./DeldjYRc.chunk.js";import{t as l}from"./CoualKDX.chunk.js";import{t as u}from"./DCKKwz9L.chunk.js";var d={pillTab:`_pillTab_1wdcp_2`};o();var f=i(),p=`streamable.header`;function m(i){let o=[{name:t.getPhrase(p,`heading`),appLink:i.appLinks?.discover,active:i.active===`discover`,analyticsData:{name:t.getPhrase(p,`heading`),url:e.getHref(i.appLinks?.discover)},analyticsOptions:{actionType:n.Click,entity:r.Url,location:a.MagicTabs}}];return i.appLinks?.calendar&&o.push({name:t.getPhrase(p,`livestreams`),appLink:i.appLinks?.calendar,active:i.active===`calendar`,analyticsData:{name:t.getPhrase(p,`livestreams`),url:e.getHref(i.appLinks?.calendar)},analyticsOptions:{actionType:n.Click,entity:r.Url,location:a.MagicTabs}}),o.push({name:t.getPhrase(p,`partners`),appLink:i.appLinks?.partners,active:i.active===`partners`,analyticsData:{name:t.getPhrase(p,`partners`),url:e.getHref(i.appLinks?.partners)},analyticsOptions:{actionType:n.Click,entity:r.Url,location:a.MagicTabs}}),(0,f.jsx)(`div`,{className:`py-3 text-center`,children:(0,f.jsx)(u,{tabs:o,className:d.pillTab})})}function h(e){return{...l,classification:t=>l.classification(t,e),classificationDirectory:()=>l.classificationDirectory(e),series:()=>null,latestReleases:()=>null,classificationLatestReleases:()=>null,playlist:()=>null,watchHistory:()=>null,widgetWizard:()=>null,partner:()=>null,partnerHome:()=>null}}function g(){return{discover:{application:s.DASHBOARD,action:c.Dashboard.HOME},calendar:{application:s.CALENDAR,action:c.Calendar.CALENDAR},partners:{application:s.DASHBOARD,action:c.Dashboard.CONTENT_PARTNERS}}}export{g as n,m as r,h as t};
2
+ //# sourceMappingURL=U_sIlzAD.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"NV4_mMU8.chunk.js","names":[],"sources":["../../../../libs/shared/src/apps/streamable-learning/components/header/streamable-header.module.scss","../../../../libs/shared/src/apps/streamable-learning/components/header/StreamableHeader.tsx","../../src/apps/dashboard/views/dashboard/DiscoverViewUtils.ts"],"sourcesContent":["@import '~styles/utils/include-media';\n:local{\n .pillTab {\n @include media('<=md') {\n li {\n min-width: 5rem;\n }\n }\n\n }\n}","import React from 'react';\n\nimport { AppLinkHelper } from 'libs/common/backbone/core';\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { PillTabSelector } from 'libs/shared/components/pill-tab-selector/PillTabSelector';\n\nimport styles from './streamable-header.module.scss';\n\nconst namespace = 'streamable.header';\n\nexport interface StreamableHeaderAppLinks {\n discover: Core.AppLink;\n calendar?: Core.AppLink;\n partners: Core.AppLink;\n}\n\ninterface StreamableHeaderProps {\n appLinks?: StreamableHeaderAppLinks;\n active: keyof StreamableHeaderAppLinks;\n}\n\nexport function StreamableHeader(props: StreamableHeaderProps): JSX.Element {\n const tabs = [{\n name: LanguageService.getPhrase(namespace, 'heading'),\n appLink: props.appLinks?.discover,\n active: props.active === 'discover',\n analyticsData: {\n name: LanguageService.getPhrase(namespace, 'heading'),\n url: AppLinkHelper.getHref(props.appLinks?.discover)\n },\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.Url,\n location: LocationContext.MagicTabs\n }\n }];\n\n if (props.appLinks?.calendar)\n tabs.push({\n name: LanguageService.getPhrase(namespace, 'livestreams'),\n appLink: props.appLinks?.calendar,\n active: props.active === 'calendar',\n analyticsData: {\n name: LanguageService.getPhrase(namespace, 'livestreams'),\n url: AppLinkHelper.getHref(props.appLinks?.calendar)\n },\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.Url,\n location: LocationContext.MagicTabs\n }\n });\n\n tabs.push({\n name: LanguageService.getPhrase(namespace, 'partners'),\n appLink: props.appLinks?.partners,\n active: props.active === 'partners',\n analyticsData: {\n name: LanguageService.getPhrase(namespace, 'partners'),\n url: AppLinkHelper.getHref(props.appLinks?.partners)\n },\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.Url,\n location: LocationContext.MagicTabs\n }\n });\n\n return (\n <div className='py-3 text-center'>\n <PillTabSelector\n tabs={tabs}\n className={styles.pillTab}\n />\n </div>\n );\n}\n","import { HashObject } from 'libs/common/react/interfaces';\n\nimport { StreamableDiscoverDashboardProps } from 'libs/shared/apps/streamable-learning/components/dashboard/StreamableDiscoverDashboard';\nimport { StreamableHeaderAppLinks } from 'libs/shared/apps/streamable-learning/components/header/StreamableHeader';\n\nimport { Actions } from 'shared/constants/StreamableActions';\nimport { AppChannels } from 'shared/constants/StreamableRadioChannels';\nimport { StreamableAppLinks } from 'shared/utils/StreamableAppLinks';\n\nexport function getDiscoverWidgetAppLinks(params?: HashObject): StreamableDiscoverDashboardProps['widgetAppLinks'] {\n return {\n ...StreamableAppLinks,\n classification: classification => StreamableAppLinks.classification(classification, params),\n classificationDirectory: () => StreamableAppLinks.classificationDirectory(params),\n\n // TODO: Find a nice way around having to pass these in\n series: () => null,\n latestReleases: () => null,\n classificationLatestReleases: () => null,\n playlist: () => null,\n watchHistory: () => null,\n widgetWizard: () => null,\n partner: () => null,\n partnerHome: () => null\n };\n}\n\nexport function getStreamableHeaderAppLinks(): StreamableHeaderAppLinks {\n return {\n discover: { application: AppChannels.DASHBOARD, action: Actions.Dashboard.HOME },\n calendar: { application: AppChannels.CALENDAR, action: Actions.Calendar.CALENDAR },\n partners: { application: AppChannels.DASHBOARD, action: Actions.Dashboard.CONTENT_PARTNERS }\n };\n}\n"],"mappings":"kWCYM,EAAY,oBAalB,SAAgB,EAAiB,EAA2C,CAC1E,IAAM,EAAO,CAAC,CACZ,KAAM,EAAgB,UAAU,EAAW,UAAU,CACrD,QAAS,EAAM,UAAU,SACzB,OAAQ,EAAM,SAAW,WACzB,cAAe,CACb,KAAM,EAAgB,UAAU,EAAW,UAAU,CACrD,IAAK,EAAc,QAAQ,EAAM,UAAU,SAAS,CACrD,CACD,iBAAkB,CAChB,WAAY,EAAW,MACvB,OAAQ,EAAW,IACnB,SAAU,EAAgB,UAC3B,CACF,CAAC,CAiCF,OA/BI,EAAM,UAAU,UAClB,EAAK,KAAK,CACR,KAAM,EAAgB,UAAU,EAAW,cAAc,CACzD,QAAS,EAAM,UAAU,SACzB,OAAQ,EAAM,SAAW,WACzB,cAAe,CACb,KAAM,EAAgB,UAAU,EAAW,cAAc,CACzD,IAAK,EAAc,QAAQ,EAAM,UAAU,SAAS,CACrD,CACD,iBAAkB,CAChB,WAAY,EAAW,MACvB,OAAQ,EAAW,IACnB,SAAU,EAAgB,UAC3B,CACF,CAAC,CAEJ,EAAK,KAAK,CACR,KAAM,EAAgB,UAAU,EAAW,WAAW,CACtD,QAAS,EAAM,UAAU,SACzB,OAAQ,EAAM,SAAW,WACzB,cAAe,CACb,KAAM,EAAgB,UAAU,EAAW,WAAW,CACtD,IAAK,EAAc,QAAQ,EAAM,UAAU,SAAS,CACrD,CACD,iBAAkB,CAChB,WAAY,EAAW,MACvB,OAAQ,EAAW,IACnB,SAAU,EAAgB,UAC3B,CACF,CAAC,EAGA,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,6BACb,EAAA,EAAA,KAAC,EAAD,CACQ,OACN,UAAW,EAAO,QAClB,CAAA,CACE,CAAA,CCrEV,SAAgB,EAA0B,EAAyE,CACjH,MAAO,CACL,GAAG,EACH,eAAgB,GAAkB,EAAmB,eAAe,EAAgB,EAAO,CAC3F,4BAA+B,EAAmB,wBAAwB,EAAO,CAGjF,WAAc,KACd,mBAAsB,KACtB,iCAAoC,KACpC,aAAgB,KAChB,iBAAoB,KACpB,iBAAoB,KACpB,YAAe,KACf,gBAAmB,KACpB,CAGH,SAAgB,GAAwD,CACtE,MAAO,CACL,SAAU,CAAE,YAAa,EAAY,UAAW,OAAQ,EAAQ,UAAU,KAAM,CAChF,SAAU,CAAE,YAAa,EAAY,SAAU,OAAQ,EAAQ,SAAS,SAAU,CAClF,SAAU,CAAE,YAAa,EAAY,UAAW,OAAQ,EAAQ,UAAU,iBAAkB,CAC7F"}
1
+ {"version":3,"file":"U_sIlzAD.chunk.js","names":[],"sources":["../../../../libs/shared/src/apps/streamable-learning/components/header/streamable-header.module.scss","../../../../libs/shared/src/apps/streamable-learning/components/header/StreamableHeader.tsx","../../src/apps/dashboard/views/dashboard/DiscoverViewUtils.ts"],"sourcesContent":["@import '~styles/utils/include-media';\n:local{\n .pillTab {\n @include media('<=md') {\n li {\n min-width: 5rem;\n }\n }\n\n }\n}","import React from 'react';\n\nimport { AppLinkHelper } from 'libs/common/backbone/core';\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { PillTabSelector } from 'libs/shared/components/pill-tab-selector/PillTabSelector';\n\nimport styles from './streamable-header.module.scss';\n\nconst namespace = 'streamable.header';\n\nexport interface StreamableHeaderAppLinks {\n discover: Core.AppLink;\n calendar?: Core.AppLink;\n partners: Core.AppLink;\n}\n\ninterface StreamableHeaderProps {\n appLinks?: StreamableHeaderAppLinks;\n active: keyof StreamableHeaderAppLinks;\n}\n\nexport function StreamableHeader(props: StreamableHeaderProps): JSX.Element {\n const tabs = [{\n name: LanguageService.getPhrase(namespace, 'heading'),\n appLink: props.appLinks?.discover,\n active: props.active === 'discover',\n analyticsData: {\n name: LanguageService.getPhrase(namespace, 'heading'),\n url: AppLinkHelper.getHref(props.appLinks?.discover)\n },\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.Url,\n location: LocationContext.MagicTabs\n }\n }];\n\n if (props.appLinks?.calendar)\n tabs.push({\n name: LanguageService.getPhrase(namespace, 'livestreams'),\n appLink: props.appLinks?.calendar,\n active: props.active === 'calendar',\n analyticsData: {\n name: LanguageService.getPhrase(namespace, 'livestreams'),\n url: AppLinkHelper.getHref(props.appLinks?.calendar)\n },\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.Url,\n location: LocationContext.MagicTabs\n }\n });\n\n tabs.push({\n name: LanguageService.getPhrase(namespace, 'partners'),\n appLink: props.appLinks?.partners,\n active: props.active === 'partners',\n analyticsData: {\n name: LanguageService.getPhrase(namespace, 'partners'),\n url: AppLinkHelper.getHref(props.appLinks?.partners)\n },\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.Url,\n location: LocationContext.MagicTabs\n }\n });\n\n return (\n <div className='py-3 text-center'>\n <PillTabSelector\n tabs={tabs}\n className={styles.pillTab}\n />\n </div>\n );\n}\n","import { HashObject } from 'libs/common/react/interfaces';\n\nimport { StreamableDiscoverDashboardProps } from 'libs/shared/apps/streamable-learning/components/dashboard/StreamableDiscoverDashboard';\nimport { StreamableHeaderAppLinks } from 'libs/shared/apps/streamable-learning/components/header/StreamableHeader';\n\nimport { Actions } from 'shared/constants/StreamableActions';\nimport { AppChannels } from 'shared/constants/StreamableRadioChannels';\nimport { StreamableAppLinks } from 'shared/utils/StreamableAppLinks';\n\nexport function getDiscoverWidgetAppLinks(params?: HashObject): StreamableDiscoverDashboardProps['widgetAppLinks'] {\n return {\n ...StreamableAppLinks,\n classification: classification => StreamableAppLinks.classification(classification, params),\n classificationDirectory: () => StreamableAppLinks.classificationDirectory(params),\n\n // TODO: Find a nice way around having to pass these in\n series: () => null,\n latestReleases: () => null,\n classificationLatestReleases: () => null,\n playlist: () => null,\n watchHistory: () => null,\n widgetWizard: () => null,\n partner: () => null,\n partnerHome: () => null\n };\n}\n\nexport function getStreamableHeaderAppLinks(): StreamableHeaderAppLinks {\n return {\n discover: { application: AppChannels.DASHBOARD, action: Actions.Dashboard.HOME },\n calendar: { application: AppChannels.CALENDAR, action: Actions.Calendar.CALENDAR },\n partners: { application: AppChannels.DASHBOARD, action: Actions.Dashboard.CONTENT_PARTNERS }\n };\n}\n"],"mappings":"kWCYM,EAAY,oBAalB,SAAgB,EAAiB,EAA2C,CAC1E,IAAM,EAAO,CAAC,CACZ,KAAM,EAAgB,UAAU,EAAW,UAAU,CACrD,QAAS,EAAM,UAAU,SACzB,OAAQ,EAAM,SAAW,WACzB,cAAe,CACb,KAAM,EAAgB,UAAU,EAAW,UAAU,CACrD,IAAK,EAAc,QAAQ,EAAM,UAAU,SAAS,CACrD,CACD,iBAAkB,CAChB,WAAY,EAAW,MACvB,OAAQ,EAAW,IACnB,SAAU,EAAgB,UAC3B,CACF,CAAC,CAiCF,OA/BI,EAAM,UAAU,UAClB,EAAK,KAAK,CACR,KAAM,EAAgB,UAAU,EAAW,cAAc,CACzD,QAAS,EAAM,UAAU,SACzB,OAAQ,EAAM,SAAW,WACzB,cAAe,CACb,KAAM,EAAgB,UAAU,EAAW,cAAc,CACzD,IAAK,EAAc,QAAQ,EAAM,UAAU,SAAS,CACrD,CACD,iBAAkB,CAChB,WAAY,EAAW,MACvB,OAAQ,EAAW,IACnB,SAAU,EAAgB,UAC3B,CACF,CAAC,CAEJ,EAAK,KAAK,CACR,KAAM,EAAgB,UAAU,EAAW,WAAW,CACtD,QAAS,EAAM,UAAU,SACzB,OAAQ,EAAM,SAAW,WACzB,cAAe,CACb,KAAM,EAAgB,UAAU,EAAW,WAAW,CACtD,IAAK,EAAc,QAAQ,EAAM,UAAU,SAAS,CACrD,CACD,iBAAkB,CAChB,WAAY,EAAW,MACvB,OAAQ,EAAW,IACnB,SAAU,EAAgB,UAC3B,CACF,CAAC,EAGA,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,6BACb,EAAA,EAAA,KAAC,EAAD,CACQ,OACN,UAAW,EAAO,QAClB,CAAA,CACE,CAAA,CCrEV,SAAgB,EAA0B,EAAyE,CACjH,MAAO,CACL,GAAG,EACH,eAAgB,GAAkB,EAAmB,eAAe,EAAgB,EAAO,CAC3F,4BAA+B,EAAmB,wBAAwB,EAAO,CAGjF,WAAc,KACd,mBAAsB,KACtB,iCAAoC,KACpC,aAAgB,KAChB,iBAAoB,KACpB,iBAAoB,KACpB,YAAe,KACf,gBAAmB,KACpB,CAGH,SAAgB,GAAwD,CACtE,MAAO,CACL,SAAU,CAAE,YAAa,EAAY,UAAW,OAAQ,EAAQ,UAAU,KAAM,CAChF,SAAU,CAAE,YAAa,EAAY,SAAU,OAAQ,EAAQ,SAAS,SAAU,CAClF,SAAU,CAAE,YAAa,EAAY,UAAW,OAAQ,EAAQ,UAAU,iBAAkB,CAC7F"}
@@ -1,2 +1,2 @@
1
- import{r as e}from"./Dp9qJj1C.chunk.js";import{t}from"./epZn2FwZ.chunk.js";import{U as n,c as r,o as i,u as a}from"./app-B1XBsz23.js";import{t as o}from"./BlQ4coEt.chunk.js";var s=o(),c=`braze:new:iam`,l=class extends e{get name(){return t.BrazeClient}get channelName(){return n.BRAZE}get clientInstance(){if(this.ready)return this.brazeClient}constructor(e){super(e)}initialize(){this.options.eventOptions?.logUtmParameters&&(this.utmParameters=i.getUtmParameters()),this.options.eventOptions?.logAttributionData&&(this.attributionData=r.getDecodedAttributionData()),this.setup()}get isReady(){return this.ready&&this.options.client.shouldInitialize}setup(){let{context:e}=this.options;if(this.iamQueue=[],this.brazeClient=new s.BrazeClient({apiOptions:this.getInstanceOptions(),allowAnonymous:!1,shouldInitialize:this.options.client.shouldInitialize,subscriptions:{subscribeToInAppMessage:e=>this.subscribeToInAppMessage(e)}}),e.user.isAuthenticated&&this.options.client.shouldInitialize){let t=this.getBrazeUser(e.user);this.options.geoLocation?.countryCode&&(t.country=this.options.geoLocation.countryCode),this.setUser(t)}this.ready=!0}setUser(e){this.brazeClient.setUser(e)}setUserInit(e){this.brazeClient.setUserInit(e)}getBrazeUser(e){return{email:e.email,firstName:e.givenName,lastName:e.familyName,custom:{masterId:e.id,source:a.BRAZE_CLIENT_SOURCE}}}getInstanceOptions(){return{productName:this.options.client.productName,productVersion:this.options.client.version,apiKey:this.options.client.apiKey,baseUrl:this.options.client.baseUrl,enableLogging:!1,automaticallyShowInAppMessages:!1,allowUserSuppliedJavascript:!0}}subscribeToInAppMessage(e){if(!this.options?.subscriptions?.inAppMessage||e.isControl)return;let t=this.getChannel();this.iamQueue.push(e),t.trigger(c)}async getContentCards(){return await this.brazeClient.card?.getContentCards()}logContentCardDismissal(e){return this.brazeClient.card?.logDismissal(e)}logContentCardClick(e){return this.brazeClient.card?.logClick(e)}logContentCardImpressions(e){return this.brazeClient.card?.logImpressions(e)}logFormEvent(e){let t=this.hydrateAdditionalData(e);this.brazeClient.event.logForm(t)}logAnalyticsEvent(e){let t=this.hydrateAdditionalData(e);this.brazeClient.event.logAnalytics(t)}logEvent(e){let t=this.hydrateAdditionalData(e);return this.brazeClient.event.log(t)}showInAppMessage(e,t,n){return this.brazeClient.bam.show(e,t,n)}handleInAppMessages(e){if(this.iamQueue.length)for(;this.iamQueue.length;){let t=this.iamQueue.pop();if(!t)return;e(t)}}hydrateAdditionalData(e){let t=e.additionalData||{};return this.utmParameters&&(t.utms=this.utmParameters),this.attributionData?.originalReferrer&&(t.original_referrer=this.attributionData.originalReferrer),this.attributionData?.internalReferrer&&(t.internal_referrer=this.attributionData.internalReferrer),{...e,additionalData:t}}};export{l as BrazeClientService};
2
- //# sourceMappingURL=m9QbGES0.chunk.js.map
1
+ import{r as e}from"./Dp9qJj1C.chunk.js";import{t}from"./epZn2FwZ.chunk.js";import{U as n,c as r,o as i,u as a}from"./app-gjHxcZG3.js";import{t as o}from"./BlQ4coEt.chunk.js";var s=o(),c=`braze:new:iam`,l=class extends e{get name(){return t.BrazeClient}get channelName(){return n.BRAZE}get clientInstance(){if(this.ready)return this.brazeClient}constructor(e){super(e)}initialize(){this.options.eventOptions?.logUtmParameters&&(this.utmParameters=i.getUtmParameters()),this.options.eventOptions?.logAttributionData&&(this.attributionData=r.getDecodedAttributionData()),this.setup()}get isReady(){return this.ready&&this.options.client.shouldInitialize}setup(){let{context:e}=this.options;if(this.iamQueue=[],this.brazeClient=new s.BrazeClient({apiOptions:this.getInstanceOptions(),allowAnonymous:!1,shouldInitialize:this.options.client.shouldInitialize,subscriptions:{subscribeToInAppMessage:e=>this.subscribeToInAppMessage(e)}}),e.user.isAuthenticated&&this.options.client.shouldInitialize){let t=this.getBrazeUser(e.user);this.options.geoLocation?.countryCode&&(t.country=this.options.geoLocation.countryCode),this.setUser(t)}this.ready=!0}setUser(e){this.brazeClient.setUser(e)}setUserInit(e){this.brazeClient.setUserInit(e)}getBrazeUser(e){return{email:e.email,firstName:e.givenName,lastName:e.familyName,custom:{masterId:e.id,source:a.BRAZE_CLIENT_SOURCE}}}getInstanceOptions(){return{productName:this.options.client.productName,productVersion:this.options.client.version,apiKey:this.options.client.apiKey,baseUrl:this.options.client.baseUrl,enableLogging:!1,automaticallyShowInAppMessages:!1,allowUserSuppliedJavascript:!0}}subscribeToInAppMessage(e){if(!this.options?.subscriptions?.inAppMessage||e.isControl)return;let t=this.getChannel();this.iamQueue.push(e),t.trigger(c)}async getContentCards(){return await this.brazeClient.card?.getContentCards()}logContentCardDismissal(e){return this.brazeClient.card?.logDismissal(e)}logContentCardClick(e){return this.brazeClient.card?.logClick(e)}logContentCardImpressions(e){return this.brazeClient.card?.logImpressions(e)}logFormEvent(e){let t=this.hydrateAdditionalData(e);this.brazeClient.event.logForm(t)}logAnalyticsEvent(e){let t=this.hydrateAdditionalData(e);this.brazeClient.event.logAnalytics(t)}logEvent(e){let t=this.hydrateAdditionalData(e);return this.brazeClient.event.log(t)}showInAppMessage(e,t,n){return this.brazeClient.bam.show(e,t,n)}handleInAppMessages(e){if(this.iamQueue.length)for(;this.iamQueue.length;){let t=this.iamQueue.pop();if(!t)return;e(t)}}hydrateAdditionalData(e){let t=e.additionalData||{};return this.utmParameters&&(t.utms=this.utmParameters),this.attributionData?.originalReferrer&&(t.original_referrer=this.attributionData.originalReferrer),this.attributionData?.internalReferrer&&(t.internal_referrer=this.attributionData.internalReferrer),{...e,additionalData:t}}};export{l as BrazeClientService};
2
+ //# sourceMappingURL=WLyOm9Lj.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"m9QbGES0.chunk.js","names":[],"sources":["../../../../libs/shared/src/services/BrazeClientService.ts"],"sourcesContent":["import type { AnalyticsEventType, BrazeClientOptions, BrazeUser, CaptionedImageCard, Card, ControlMessage, EventType, FormEventType, InAppMessage, LogEventOptions } from '@clickview/braze-client';\nimport { BrazeClient } from '@clickview/braze-client';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsClientOptions } from 'libs/analytics/clients/BaseAnalyticsClient';\nimport { AttributionData, UtmParameters } from 'libs/analytics/models/CollectionEvent';\nimport { AttributionHelper } from 'libs/analytics/utils/AttributionHelper';\nimport { UtmHelper } from 'libs/analytics/utils/UtmHelper';\n\nimport { SharedServiceChannels } from 'libs/shared/constants/RadioChannels';\nimport { SharedServices } from 'libs/shared/constants/SharedServices';\nimport { CurrentUser } from 'libs/shared/interfaces';\nimport { HandleIamCallback } from 'libs/shared/interfaces/braze/BrazeIam';\nimport { GeoLocation } from 'libs/shared/interfaces/responses/GeoLocation';\nimport { SharedBrazeHelper } from 'libs/shared/utils/SharedBrazeHelper';\n\nexport interface BrazeClientServiceOptions extends AnalyticsClientOptions {\n client: {\n productName: string,\n version: string,\n apiKey: string,\n baseUrl: string,\n geoLocation: GeoLocation,\n shouldInitialize: boolean\n };\n subscriptions?: {\n inAppMessage?: boolean,\n contentCards?: boolean\n };\n context: {\n user: CurrentUser\n };\n eventOptions?: {\n logUtmParameters?: boolean,\n logAttributionData?: boolean\n };\n}\n\nexport const BrazeNewIamEvent = 'braze:new:iam';\n\nexport class BrazeClientService extends Core.Service {\n private brazeClient: BrazeClient;\n \n private iamQueue: InAppMessage[];\n private utmParameters?: UtmParameters;\n private attributionData?: AttributionData;\n\n declare protected options: BrazeClientServiceOptions;\n protected ready: boolean;\n\n // @ts-ignore\n public get name(): string {\n return SharedServices.BrazeClient;\n }\n\n // @ts-ignore\n public get channelName(): string {\n return SharedServiceChannels.BRAZE;\n }\n\n public get clientInstance(): BrazeClient {\n if (!this.ready) return;\n\n return this.brazeClient;\n }\n\n constructor(options: BrazeClientServiceOptions) {\n super(options);\n }\n\n public initialize(): void {\n if (this.options.eventOptions?.logUtmParameters) {\n this.utmParameters = UtmHelper.getUtmParameters();\n }\n\n if (this.options.eventOptions?.logAttributionData) {\n this.attributionData = AttributionHelper.getDecodedAttributionData();\n }\n\n this.setup();\n }\n\n public get isReady() {\n return this.ready && this.options.client.shouldInitialize;\n }\n\n public setup() {\n const { context } = this.options;\n\n this.iamQueue = [];\n\n this.brazeClient = new BrazeClient({\n apiOptions: this.getInstanceOptions(),\n allowAnonymous: false,\n shouldInitialize: this.options.client.shouldInitialize,\n subscriptions: {\n subscribeToInAppMessage: iam => this.subscribeToInAppMessage(iam)\n }\n });\n\n if (context.user.isAuthenticated && this.options.client.shouldInitialize) {\n const brazeUser: BrazeUser = this.getBrazeUser(context.user);\n \n if (this.options.geoLocation?.countryCode) {\n brazeUser.country = this.options.geoLocation.countryCode;\n }\n\n this.setUser(brazeUser);\n }\n\n this.ready = true;\n }\n\n public setUser(user: BrazeUser) {\n this.brazeClient.setUser(user);\n }\n\n public setUserInit(user: BrazeUser) {\n this.brazeClient.setUserInit(user);\n }\n\n private getBrazeUser(currentUser: CurrentUser): BrazeUser {\n return {\n email: currentUser.email,\n firstName: currentUser.givenName,\n lastName: currentUser.familyName,\n custom: {\n masterId: currentUser.id,\n source: SharedBrazeHelper.BRAZE_CLIENT_SOURCE\n }\n };\n }\n\n private getInstanceOptions(): BrazeClientOptions {\n return {\n productName: this.options.client.productName,\n productVersion: this.options.client.version,\n apiKey: this.options.client.apiKey,\n baseUrl: this.options.client.baseUrl,\n enableLogging: false,\n automaticallyShowInAppMessages: false,\n allowUserSuppliedJavascript: true\n };\n }\n\n private subscribeToInAppMessage(iam: InAppMessage | ControlMessage) {\n if (!this.options?.subscriptions?.inAppMessage || iam.isControl) return;\n \n const channel = this.getChannel();\n this.iamQueue.push(iam as InAppMessage);\n channel.trigger(BrazeNewIamEvent);\n }\n\n public async getContentCards(): Promise<CaptionedImageCard[]> {\n return await this.brazeClient.card?.getContentCards() as CaptionedImageCard[];\n }\n\n public logContentCardDismissal(card: Card): void {\n return this.brazeClient.card?.logDismissal(card);\n }\n\n public logContentCardClick(card: Card): void {\n return this.brazeClient.card?.logClick(card);\n }\n\n public logContentCardImpressions(cards: Card[]): void {\n return this.brazeClient.card?.logImpressions(cards);\n }\n\n public logFormEvent(event: LogEventOptions<FormEventType>) {\n const hydratedEvent = this.hydrateAdditionalData(event);\n \n this.brazeClient.event.logForm(hydratedEvent);\n }\n\n public logAnalyticsEvent(event: LogEventOptions<AnalyticsEventType>) {\n const hydratedEvent = this.hydrateAdditionalData(event);\n\n this.brazeClient.event.logAnalytics(hydratedEvent);\n }\n\n public logEvent(event: LogEventOptions): void {\n const hydratedEvent = this.hydrateAdditionalData(event);\n\n return this.brazeClient.event.log(hydratedEvent);\n }\n\n public showInAppMessage(\n inAppMessage: InAppMessage | ControlMessage,\n parentNode?: Element | null,\n onDisplayCallback?: undefined | (() => void)\n ) {\n return this.brazeClient.bam.show(inAppMessage, parentNode, onDisplayCallback);\n }\n\n public handleInAppMessages(callback: HandleIamCallback) {\n if (!this.iamQueue.length) return;\n\n while (this.iamQueue.length) {\n const currIam = this.iamQueue.pop();\n \n if (!currIam) return;\n\n callback(currIam);\n }\n }\n\n private hydrateAdditionalData<T = EventType>(event: LogEventOptions<T>): LogEventOptions<T> {\n const additionalData: HashObject<any> = event.additionalData || {};\n if (this.utmParameters) {\n additionalData['utms'] = this.utmParameters;\n }\n\n if (this.attributionData?.originalReferrer) {\n additionalData['original_referrer'] = this.attributionData.originalReferrer;\n }\n\n if (this.attributionData?.internalReferrer) {\n additionalData['internal_referrer'] = this.attributionData.internalReferrer;\n }\n \n return {\n ...event,\n additionalData\n };\n }\n}\n"],"mappings":"wLAwCa,EAAmB,gBAEnB,EAAb,cAAwC,CAAa,CAWnD,IAAW,MAAe,CACxB,OAAO,EAAe,YAIxB,IAAW,aAAsB,CAC/B,OAAO,EAAsB,MAG/B,IAAW,gBAA8B,CAClC,QAAK,MAEV,OAAO,KAAK,YAGd,YAAY,EAAoC,CAC9C,MAAM,EAAQ,CAGhB,YAA0B,CACpB,KAAK,QAAQ,cAAc,mBAC7B,KAAK,cAAgB,EAAU,kBAAkB,EAG/C,KAAK,QAAQ,cAAc,qBAC7B,KAAK,gBAAkB,EAAkB,2BAA2B,EAGtE,KAAK,OAAO,CAGd,IAAW,SAAU,CACnB,OAAO,KAAK,OAAS,KAAK,QAAQ,OAAO,iBAG3C,OAAe,CACb,GAAM,CAAE,WAAY,KAAK,QAazB,GAXA,KAAK,SAAW,EAAE,CAElB,KAAK,YAAc,IAAI,EAAA,YAAY,CACjC,WAAY,KAAK,oBAAoB,CACrC,eAAgB,GAChB,iBAAkB,KAAK,QAAQ,OAAO,iBACtC,cAAe,CACb,wBAAyB,GAAO,KAAK,wBAAwB,EAAI,CAClE,CACF,CAAC,CAEE,EAAQ,KAAK,iBAAmB,KAAK,QAAQ,OAAO,iBAAkB,CACxE,IAAM,EAAuB,KAAK,aAAa,EAAQ,KAAK,CAExD,KAAK,QAAQ,aAAa,cAC5B,EAAU,QAAU,KAAK,QAAQ,YAAY,aAG/C,KAAK,QAAQ,EAAU,CAGzB,KAAK,MAAQ,GAGf,QAAe,EAAiB,CAC9B,KAAK,YAAY,QAAQ,EAAK,CAGhC,YAAmB,EAAiB,CAClC,KAAK,YAAY,YAAY,EAAK,CAGpC,aAAqB,EAAqC,CACxD,MAAO,CACL,MAAO,EAAY,MACnB,UAAW,EAAY,UACvB,SAAU,EAAY,WACtB,OAAQ,CACN,SAAU,EAAY,GACtB,OAAQ,EAAkB,oBAC3B,CACF,CAGH,oBAAiD,CAC/C,MAAO,CACL,YAAa,KAAK,QAAQ,OAAO,YACjC,eAAgB,KAAK,QAAQ,OAAO,QACpC,OAAQ,KAAK,QAAQ,OAAO,OAC5B,QAAS,KAAK,QAAQ,OAAO,QAC7B,cAAe,GACf,+BAAgC,GAChC,4BAA6B,GAC9B,CAGH,wBAAgC,EAAoC,CAClE,GAAI,CAAC,KAAK,SAAS,eAAe,cAAgB,EAAI,UAAW,OAEjE,IAAM,EAAU,KAAK,YAAY,CACjC,KAAK,SAAS,KAAK,EAAoB,CACvC,EAAQ,QAAQ,EAAiB,CAGnC,MAAa,iBAAiD,CAC5D,OAAO,MAAM,KAAK,YAAY,MAAM,iBAAiB,CAGvD,wBAA+B,EAAkB,CAC/C,OAAO,KAAK,YAAY,MAAM,aAAa,EAAK,CAGlD,oBAA2B,EAAkB,CAC3C,OAAO,KAAK,YAAY,MAAM,SAAS,EAAK,CAG9C,0BAAiC,EAAqB,CACpD,OAAO,KAAK,YAAY,MAAM,eAAe,EAAM,CAGrD,aAAoB,EAAuC,CACzD,IAAM,EAAgB,KAAK,sBAAsB,EAAM,CAEvD,KAAK,YAAY,MAAM,QAAQ,EAAc,CAG/C,kBAAyB,EAA4C,CACnE,IAAM,EAAgB,KAAK,sBAAsB,EAAM,CAEvD,KAAK,YAAY,MAAM,aAAa,EAAc,CAGpD,SAAgB,EAA8B,CAC5C,IAAM,EAAgB,KAAK,sBAAsB,EAAM,CAEvD,OAAO,KAAK,YAAY,MAAM,IAAI,EAAc,CAGlD,iBACE,EACA,EACA,EACA,CACA,OAAO,KAAK,YAAY,IAAI,KAAK,EAAc,EAAY,EAAkB,CAG/E,oBAA2B,EAA6B,CACjD,QAAK,SAAS,OAEnB,KAAO,KAAK,SAAS,QAAQ,CAC3B,IAAM,EAAU,KAAK,SAAS,KAAK,CAEnC,GAAI,CAAC,EAAS,OAEd,EAAS,EAAQ,EAIrB,sBAA6C,EAA+C,CAC1F,IAAM,EAAkC,EAAM,gBAAkB,EAAE,CAalE,OAZI,KAAK,gBACP,EAAe,KAAU,KAAK,eAG5B,KAAK,iBAAiB,mBACxB,EAAe,kBAAuB,KAAK,gBAAgB,kBAGzD,KAAK,iBAAiB,mBACxB,EAAe,kBAAuB,KAAK,gBAAgB,kBAGtD,CACL,GAAG,EACH,iBACD"}
1
+ {"version":3,"file":"WLyOm9Lj.chunk.js","names":[],"sources":["../../../../libs/shared/src/services/BrazeClientService.ts"],"sourcesContent":["import type { AnalyticsEventType, BrazeClientOptions, BrazeUser, CaptionedImageCard, Card, ControlMessage, EventType, FormEventType, InAppMessage, LogEventOptions } from '@clickview/braze-client';\nimport { BrazeClient } from '@clickview/braze-client';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsClientOptions } from 'libs/analytics/clients/BaseAnalyticsClient';\nimport { AttributionData, UtmParameters } from 'libs/analytics/models/CollectionEvent';\nimport { AttributionHelper } from 'libs/analytics/utils/AttributionHelper';\nimport { UtmHelper } from 'libs/analytics/utils/UtmHelper';\n\nimport { SharedServiceChannels } from 'libs/shared/constants/RadioChannels';\nimport { SharedServices } from 'libs/shared/constants/SharedServices';\nimport { CurrentUser } from 'libs/shared/interfaces';\nimport { HandleIamCallback } from 'libs/shared/interfaces/braze/BrazeIam';\nimport { GeoLocation } from 'libs/shared/interfaces/responses/GeoLocation';\nimport { SharedBrazeHelper } from 'libs/shared/utils/SharedBrazeHelper';\n\nexport interface BrazeClientServiceOptions extends AnalyticsClientOptions {\n client: {\n productName: string,\n version: string,\n apiKey: string,\n baseUrl: string,\n geoLocation: GeoLocation,\n shouldInitialize: boolean\n };\n subscriptions?: {\n inAppMessage?: boolean,\n contentCards?: boolean\n };\n context: {\n user: CurrentUser\n };\n eventOptions?: {\n logUtmParameters?: boolean,\n logAttributionData?: boolean\n };\n}\n\nexport const BrazeNewIamEvent = 'braze:new:iam';\n\nexport class BrazeClientService extends Core.Service {\n private brazeClient: BrazeClient;\n \n private iamQueue: InAppMessage[];\n private utmParameters?: UtmParameters;\n private attributionData?: AttributionData;\n\n declare protected options: BrazeClientServiceOptions;\n protected ready: boolean;\n\n // @ts-ignore\n public get name(): string {\n return SharedServices.BrazeClient;\n }\n\n // @ts-ignore\n public get channelName(): string {\n return SharedServiceChannels.BRAZE;\n }\n\n public get clientInstance(): BrazeClient {\n if (!this.ready) return;\n\n return this.brazeClient;\n }\n\n constructor(options: BrazeClientServiceOptions) {\n super(options);\n }\n\n public initialize(): void {\n if (this.options.eventOptions?.logUtmParameters) {\n this.utmParameters = UtmHelper.getUtmParameters();\n }\n\n if (this.options.eventOptions?.logAttributionData) {\n this.attributionData = AttributionHelper.getDecodedAttributionData();\n }\n\n this.setup();\n }\n\n public get isReady() {\n return this.ready && this.options.client.shouldInitialize;\n }\n\n public setup() {\n const { context } = this.options;\n\n this.iamQueue = [];\n\n this.brazeClient = new BrazeClient({\n apiOptions: this.getInstanceOptions(),\n allowAnonymous: false,\n shouldInitialize: this.options.client.shouldInitialize,\n subscriptions: {\n subscribeToInAppMessage: iam => this.subscribeToInAppMessage(iam)\n }\n });\n\n if (context.user.isAuthenticated && this.options.client.shouldInitialize) {\n const brazeUser: BrazeUser = this.getBrazeUser(context.user);\n \n if (this.options.geoLocation?.countryCode) {\n brazeUser.country = this.options.geoLocation.countryCode;\n }\n\n this.setUser(brazeUser);\n }\n\n this.ready = true;\n }\n\n public setUser(user: BrazeUser) {\n this.brazeClient.setUser(user);\n }\n\n public setUserInit(user: BrazeUser) {\n this.brazeClient.setUserInit(user);\n }\n\n private getBrazeUser(currentUser: CurrentUser): BrazeUser {\n return {\n email: currentUser.email,\n firstName: currentUser.givenName,\n lastName: currentUser.familyName,\n custom: {\n masterId: currentUser.id,\n source: SharedBrazeHelper.BRAZE_CLIENT_SOURCE\n }\n };\n }\n\n private getInstanceOptions(): BrazeClientOptions {\n return {\n productName: this.options.client.productName,\n productVersion: this.options.client.version,\n apiKey: this.options.client.apiKey,\n baseUrl: this.options.client.baseUrl,\n enableLogging: false,\n automaticallyShowInAppMessages: false,\n allowUserSuppliedJavascript: true\n };\n }\n\n private subscribeToInAppMessage(iam: InAppMessage | ControlMessage) {\n if (!this.options?.subscriptions?.inAppMessage || iam.isControl) return;\n \n const channel = this.getChannel();\n this.iamQueue.push(iam as InAppMessage);\n channel.trigger(BrazeNewIamEvent);\n }\n\n public async getContentCards(): Promise<CaptionedImageCard[]> {\n return await this.brazeClient.card?.getContentCards() as CaptionedImageCard[];\n }\n\n public logContentCardDismissal(card: Card): void {\n return this.brazeClient.card?.logDismissal(card);\n }\n\n public logContentCardClick(card: Card): void {\n return this.brazeClient.card?.logClick(card);\n }\n\n public logContentCardImpressions(cards: Card[]): void {\n return this.brazeClient.card?.logImpressions(cards);\n }\n\n public logFormEvent(event: LogEventOptions<FormEventType>) {\n const hydratedEvent = this.hydrateAdditionalData(event);\n \n this.brazeClient.event.logForm(hydratedEvent);\n }\n\n public logAnalyticsEvent(event: LogEventOptions<AnalyticsEventType>) {\n const hydratedEvent = this.hydrateAdditionalData(event);\n\n this.brazeClient.event.logAnalytics(hydratedEvent);\n }\n\n public logEvent(event: LogEventOptions): void {\n const hydratedEvent = this.hydrateAdditionalData(event);\n\n return this.brazeClient.event.log(hydratedEvent);\n }\n\n public showInAppMessage(\n inAppMessage: InAppMessage | ControlMessage,\n parentNode?: Element | null,\n onDisplayCallback?: undefined | (() => void)\n ) {\n return this.brazeClient.bam.show(inAppMessage, parentNode, onDisplayCallback);\n }\n\n public handleInAppMessages(callback: HandleIamCallback) {\n if (!this.iamQueue.length) return;\n\n while (this.iamQueue.length) {\n const currIam = this.iamQueue.pop();\n \n if (!currIam) return;\n\n callback(currIam);\n }\n }\n\n private hydrateAdditionalData<T = EventType>(event: LogEventOptions<T>): LogEventOptions<T> {\n const additionalData: HashObject<any> = event.additionalData || {};\n if (this.utmParameters) {\n additionalData['utms'] = this.utmParameters;\n }\n\n if (this.attributionData?.originalReferrer) {\n additionalData['original_referrer'] = this.attributionData.originalReferrer;\n }\n\n if (this.attributionData?.internalReferrer) {\n additionalData['internal_referrer'] = this.attributionData.internalReferrer;\n }\n \n return {\n ...event,\n additionalData\n };\n }\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{gt as e}from"./Dp9qJj1C.chunk.js";import{t}from"./ImQRQGZr.chunk.js";import{C as n,c as r,l as i,lt as a,m as o,n as s,ut as c}from"./Dun43GrB.chunk.js";import{t as l}from"./CFXUbsBS.chunk.js";import{t as u}from"./D86qrFLE.chunk.js";import{n as d,t as f}from"./Da5tDmIW2.chunk.js";import{t as p}from"./Ca1QPe-q2.chunk.js";import{n as ee}from"./D7d5XFW82.chunk.js";import{n as te}from"./iuoIcGAm2.chunk.js";import{a as m,i as h,r as g,t as _}from"./D2om474U2.chunk.js";import{t as v}from"./DlVp8-h62.chunk.js";import{t as y}from"./B4z8dIrI2.chunk.js";import{c as ne,f as re,g as b,o as x,p as S}from"./CK6c6uHp2.chunk.js";import{t as C}from"./DDKwae_D2.chunk.js";import{t as w}from"./LdxNQaUZ2.chunk.js";import{n as T,t as E}from"./CeyqMjfq.chunk.js";import{t as D}from"./BBWlVBxr.chunk.js";import{n as O,t as k}from"./ClGIvvk6.chunk.js";import{c as A,l as j,n as M,r as N,s as P}from"./CeI-LCE-.chunk.js";var F={playlistItem:`_playlistItem_euqll_1`,playlistItemGradient:`_playlistItemGradient_euqll_4`,playlistMetadata:`_playlistMetadata_euqll_13`,partialHeading:`_partialHeading_euqll_20`,ownerAvatarContainer:`_ownerAvatarContainer_euqll_24`},I=e(c()),L=a();R.defaultProps={numItems:8};function R(e){let t=[...Array(e.numItems)],n=e.itemClassName||``;return(0,L.jsxs)(L.Fragment,{children:[e.showHeading&&(0,L.jsx)(`div`,{className:`${F.partialHeading} mb-1 partial-loading-background`}),(0,L.jsx)(d,{className:`mx-n1 mb-n2`,children:t.map((e,t)=>(0,L.jsx)(u,{xs:6,sm:4,lg:3,className:`${n} px-1 pb-2`,children:(0,L.jsx)(`div`,{className:`${F.playlistItem} partial-loading-background rounded-3`})},t))})]})}var z=[`second`,`minute`,`hour`,`day`,`week`,`month`,`year`];function B(e,t){if(t===0)return[`just now`,`right now`];var n=z[Math.floor(t/2)];return e>1&&(n+=`s`),[e+` `+n+` ago`,`in `+e+` `+n]}var V=[`秒`,`分钟`,`小时`,`天`,`周`,`个月`,`年`];function H(e,t){if(t===0)return[`刚刚`,`片刻后`];var n=V[~~(t/2)];return[e+` `+n+`前`,e+` `+n+`后`]}var U={},W=function(e,t){U[e]=t},ie=function(e){return U[e]||U.en_US},G=[60,60,24,7,365/7/12,12];function K(e){return e instanceof Date?e:!isNaN(e)||/^\d+$/.test(e)?new Date(parseInt(e)):(e=(e||``).trim().replace(/\.\d+/,``).replace(/-/,`/`).replace(/-/,`/`).replace(/(\d)T(\d)/,`$1 $2`).replace(/Z/,` UTC`).replace(/([+-]\d\d):?(\d\d)/,` $1$2`),new Date(e))}function q(e,t){var n=e<0?1:0;e=Math.abs(e);for(var r=e,i=0;e>=G[i]&&i<G.length;i++)e/=G[i];return e=Math.floor(e),i*=2,e>(i===0?9:1)&&(i+=1),t(e,i,r)[n].replace(`%s`,e.toString())}function J(e,t){return((t?K(t):new Date)-+K(e))/1e3}var Y=function(e,t,n){return q(J(e,n&&n.relativeDate),ie(t))};W(`en_US`,B),W(`zh_CN`,H);var ae=`playlists.playlistCount`;function oe(e){if(!e)return!1;let t=e.videos?.count??0,n=e.interactives?.count??0,r=e.clips?.count??0;return t+n+r}function se(e){let t=oe(e.playlist);return t===!1||Number.isNaN(t)?(0,L.jsx)(L.Fragment,{}):(0,L.jsx)(`span`,{className:`text-shadow font-size-sm`,children:(0,L.jsx)(ee,{namespace:ae,phrase:`count`,options:{smartCount:t}})})}var ce={avatar:`_avatar_1ylw0_1`};function le(){return(0,L.jsx)(`div`,{className:ce.avatar,children:(0,L.jsx)(f,{})})}function ue(e){let{_liteOwner:t}=e.playlist;return e.playlist._isClickViewCurated?.value?(0,L.jsx)(le,{}):!t?.id||!e.currentUser?.id||t.id.toString()===e.currentUser.id.toString()?(0,L.jsx)(L.Fragment,{}):(0,L.jsx)(v,{imageUrl:typeof t.avatar==`string`?t.avatar:t.avatar?.url,imageCdnUrl:e.imageCdnUrl,initials:y.getInitials(t.name,t.surname)})}var de=`playlists.playlistList`;X.defaultProps={itemStyle:`square`};function X(e){let n=_.createUrl(e.data.cover&&e.data.cover.url,{size:g.Medium,resizeType:m.Cover}),r=e.data.subjectPresentationAudiences&&e.data.subjectPresentationAudiences.data,a=M(r,e.presentationAudiences),o=F.playlistItem,s=!!n||!!e.showFallbackImage;s&&(o+=` ${F.playlistItemGradient}`),!s&&e.bgColourClassNames&&(o+=` ${F.playlistItem} ${D(e.data.name,e.bgColourClassNames)}`),e.itemStyle===`round`&&(o+=` rounded-3 overflow-hidden`),e.itemStyle===`round-left`&&(o+=` rounded-start-lg overflow-hidden`);let c={...e.analyticsData,id:e.data?.id,name:e.data?.name},u={...e.analyticsOptions,entity:i.Playlist};return(0,L.jsx)(p,{appLink:e.appLink,analyticsData:c,analyticsOptions:u,title:!e.data.contentModifiedDate||e.data._isClickViewCurated?.value?``:t.getPhrase(de,`lastUpdated`,{timeago:Y(l.convertUTCToLocal(e.data.contentModifiedDate))}),children:(0,L.jsxs)(w,{data:n,alt:e.data.name,className:o,children:[!!e.showFallbackImage&&(0,L.jsx)(k,{type:O.Playlist}),(0,L.jsxs)(`div`,{className:`text-white ${F.playlistMetadata}`,children:[!!e.showCount&&(0,L.jsx)(se,{playlist:e.data}),(0,L.jsx)(`h5`,{className:`mb-0 ${e.titleClassName||``}`,children:(0,L.jsx)(`span`,{className:`text-shadow clamp-2`,children:e.data.name})}),!!r&&!!r.length&&!!a&&(0,L.jsx)(N,{className:`${e.audienceLabelClass?e.audienceLabelClass:``} mt-1`,audience:a,border:`white`})]}),!!e.showOwner&&!!e.imageCdnUrl&&(0,L.jsx)(`div`,{className:F.ownerAvatarContainer,children:(0,L.jsx)(ue,{playlist:e.data,currentUser:e.currentUser,imageCdnUrl:e.imageCdnUrl})})]})})}n.Click,i.Playlist,o.PlaylistListItem,r.Cover;var Z={labelContainer:`_labelContainer_1rf8p_1`,labelContainerOverlay:`_labelContainerOverlay_1rf8p_15`,hoverActive:`_hoverActive_1rf8p_23`,mask:`_mask_1rf8p_37`,largeHoverTitle:`_largeHoverTitle_1rf8p_50`,smallHoverTitle:`_smallHoverTitle_1rf8p_69`,description:`_description_1rf8p_93`,largeHoverDescription:`_largeHoverDescription_1rf8p_99`,hasTableOfContents:`_hasTableOfContents_1rf8p_141`,smallHoverDescription:`_smallHoverDescription_1rf8p_194`};function fe(e){return(0,L.jsxs)(`div`,{className:`py-3 mx-2 px-2 rounded bg-white text-center ${Z.mask} d-flex flex-column align-items-center`,children:[(0,L.jsx)(`h3`,{className:`fw-semibold mb-0 ${Z.hoverTitle} ${e.isSmall?Z.smallHoverTitle:Z.largeHoverTitle}`,children:(0,L.jsx)(`span`,{className:`clamp-3`,children:e.series.name})}),!!e.series.description&&(0,L.jsx)(`p`,{className:`${e.hasTableOfContents?Z.hasTableOfContents:``} ${Z.hoverDescription} ${e.isSmall?Z.smallHoverDescription:Z.largeHoverDescription} mb-0`,children:e.series.description}),(0,L.jsx)(`div`,{className:`${Z.labelContainerOverlay}`,children:e.mergedAudience?(0,L.jsx)(N,{audience:e.mergedAudience,border:`dark`,className:`mt-2 w-fit`}):(0,L.jsx)(E,{type:T.Rating,data:A.getRating(e.series),className:`mt-2`})})]})}function pe(e){let[t,n]=te({className:Z.hoverActive}),r=e.series&&e.series.subjectPresentationAudiences&&e.series.subjectPresentationAudiences.data||[],i=M(r,e.presentationAudiences),a=!!(r&&r.length&&i);return(0,L.jsx)(`div`,{ref:t,children:(0,L.jsxs)(w,{data:e.series.tallPoster,alt:e.series.name,imageType:h.TallPosters,preload:e.preloadImage,imageOptions:{size:g.Large},imageClassName:e.imageClass?e.imageClass:`rounded-3`,children:[n&&(0,L.jsx)(fe,{isSmall:e.isSmall,series:e.series,mergedAudience:r&&r.length?i:null,hasTableOfContents:e.hasTableOfContents}),(0,L.jsx)(k,{type:O.Series}),(0,L.jsx)(`div`,{className:`position-absolute text-white ${Z.labelContainer}`,children:a?(0,L.jsx)(N,{audience:i,className:`bg-white text-dark`,border:`dark`}):(0,L.jsx)(E,{className:`text-shadow`,type:T.Rating,data:A.getRating(e.series)})})]})})}var Q={partialHeroThumbnail:`_partialHeroThumbnail_pydn0_1`,partialSeriesText:`_partialSeriesText_pydn0_6`,partialVideoTitleText:`_partialVideoTitleText_pydn0_10`,partialBadge:`_partialBadge_pydn0_14`,partialDescription:`_partialDescription_pydn0_18`,partialSubject:`_partialSubject_pydn0_22`,partialHeading:`_partialHeading_pydn0_26`,guidance:`_guidance_pydn0_30`,responsiveGuidance:`_responsiveGuidance_pydn0_41`,description:`_description_pydn0_56`,details:`_details_pydn0_82`};$.defaultProps={newDurationStyle:!0,badgePosition:`thumbnail`};function $(e){let t=e.video?.subjectPresentationAudiences?.data,n=M(t,e.presentationAudiences),r=s.mergeOptions(e.analyticsOptions,{location:o.ClassificationHero,entity:C.getAnalyticsEntity(e.video)}),i=I.useRef(null);return e.video?(0,L.jsxs)(d,{children:[(0,L.jsx)(u,{xs:12,md:6,children:(0,L.jsx)(`div`,{ref:i,children:(0,L.jsx)(re,{analyticsOptions:r,video:e.video,appLink:e.getVideoAppLink?.(e.video,{}),imageOptions:{size:g.Medium},textPosition:S.Independent,type:`static`,audience:e.badgePosition===`thumbnail`?n:null,hideRating:e.badgePosition===`thumbnail`?!!n:!0,commonVideoProps:e.commonVideoProps})})}),(0,L.jsxs)(u,{xs:12,md:6,className:`${Q.details} position-relative`,children:[(0,L.jsxs)(`div`,{className:`d-flex justify-content-between`,children:[(0,L.jsxs)(`div`,{className:`overflow-hidden`,children:[(0,L.jsx)(P,{type:e.commonVideoProps.subTextType,appLink:e.commonVideoProps.getSubTextAppLink?.(e.video),analyticsData:e.analyticsData,analyticsOptions:r,video:e.video,className:`text-reset clamp-1`}),(0,L.jsx)(ne,{yearGroups:e.commonVideoProps.yearGroups,video:e.video,analyticsData:e.analyticsData,analyticsOptions:r,appLink:e.getVideoAppLink?.(e.video,{}),titleSize:`h4`,showNewVideoIndicator:e.showNewVideoIndicator,showPadlock:!e.commonVideoProps.hasStudentExperience&&!e.commonVideoProps.hasGuestExperience,titleClassName:e.titleClassName,clampLevel:2})]}),(0,L.jsx)(x,{analyticsData:e.analyticsData,analyticsOptions:r,video:e.video})]}),e.badgePosition===`info-panel`&&(0,L.jsxs)(j,{className:`pb-1`,children:[!e.hideInteractiveBadge&&(0,L.jsx)(E,{type:T.Interactive,data:e.video.interactives}),(0,L.jsx)(E,{type:T.Rating,data:C.getRating(e.video)}),(0,L.jsx)(E,{type:T.ProductionYear,data:e.video.productionYear})]}),(0,L.jsx)(`p`,{className:`mb-1`,children:(0,L.jsx)(`span`,{className:Q.description,children:e.video.description})}),e.badgePosition===`info-panel`&&(0,L.jsx)(N,{audience:n,className:`mt-1`,border:`dark`}),e.showVideoGuidance&&(0,L.jsx)(b,{video:e.video,analyticsData:e.analyticsData,analyticsOptions:r,containerClassName:`d-flex ${Q.guidance}`,responsiveClassName:Q.responsiveGuidance,commonVideoProps:e.commonVideoProps})]})]}):(0,L.jsx)(L.Fragment,{})}export{R as i,pe as n,X as r,$ as t};
2
- //# sourceMappingURL=DlQrdOls.chunk.js.map
1
+ import{gt as e}from"./Dp9qJj1C.chunk.js";import{t}from"./ImQRQGZr.chunk.js";import{C as n,c as r,l as i,lt as a,m as o,n as s,ut as c}from"./Dun43GrB.chunk.js";import{t as l}from"./CFXUbsBS.chunk.js";import{t as u}from"./D86qrFLE.chunk.js";import{n as d,t as f}from"./Da5tDmIW2.chunk.js";import{t as p}from"./Ca1QPe-q2.chunk.js";import{n as ee}from"./D7d5XFW82.chunk.js";import{n as te}from"./iuoIcGAm2.chunk.js";import{a as m,i as h,r as g,t as _}from"./D2om474U2.chunk.js";import{t as v}from"./DlVp8-h62.chunk.js";import{t as y}from"./B4z8dIrI2.chunk.js";import{c as ne,f as re,g as b,o as x,p as S}from"./QMuFwiiF2.chunk.js";import{t as C}from"./DDKwae_D2.chunk.js";import{t as w}from"./LdxNQaUZ2.chunk.js";import{n as T,t as E}from"./CeyqMjfq.chunk.js";import{t as D}from"./BBWlVBxr.chunk.js";import{n as O,t as k}from"./ClGIvvk6.chunk.js";import{c as A,l as j,n as M,r as N,s as P}from"./DL4UFxRK.chunk.js";var F={playlistItem:`_playlistItem_euqll_1`,playlistItemGradient:`_playlistItemGradient_euqll_4`,playlistMetadata:`_playlistMetadata_euqll_13`,partialHeading:`_partialHeading_euqll_20`,ownerAvatarContainer:`_ownerAvatarContainer_euqll_24`},I=e(c()),L=a();R.defaultProps={numItems:8};function R(e){let t=[...Array(e.numItems)],n=e.itemClassName||``;return(0,L.jsxs)(L.Fragment,{children:[e.showHeading&&(0,L.jsx)(`div`,{className:`${F.partialHeading} mb-1 partial-loading-background`}),(0,L.jsx)(d,{className:`mx-n1 mb-n2`,children:t.map((e,t)=>(0,L.jsx)(u,{xs:6,sm:4,lg:3,className:`${n} px-1 pb-2`,children:(0,L.jsx)(`div`,{className:`${F.playlistItem} partial-loading-background rounded-3`})},t))})]})}var z=[`second`,`minute`,`hour`,`day`,`week`,`month`,`year`];function B(e,t){if(t===0)return[`just now`,`right now`];var n=z[Math.floor(t/2)];return e>1&&(n+=`s`),[e+` `+n+` ago`,`in `+e+` `+n]}var V=[`秒`,`分钟`,`小时`,`天`,`周`,`个月`,`年`];function H(e,t){if(t===0)return[`刚刚`,`片刻后`];var n=V[~~(t/2)];return[e+` `+n+`前`,e+` `+n+`后`]}var U={},W=function(e,t){U[e]=t},ie=function(e){return U[e]||U.en_US},G=[60,60,24,7,365/7/12,12];function K(e){return e instanceof Date?e:!isNaN(e)||/^\d+$/.test(e)?new Date(parseInt(e)):(e=(e||``).trim().replace(/\.\d+/,``).replace(/-/,`/`).replace(/-/,`/`).replace(/(\d)T(\d)/,`$1 $2`).replace(/Z/,` UTC`).replace(/([+-]\d\d):?(\d\d)/,` $1$2`),new Date(e))}function q(e,t){var n=e<0?1:0;e=Math.abs(e);for(var r=e,i=0;e>=G[i]&&i<G.length;i++)e/=G[i];return e=Math.floor(e),i*=2,e>(i===0?9:1)&&(i+=1),t(e,i,r)[n].replace(`%s`,e.toString())}function J(e,t){return((t?K(t):new Date)-+K(e))/1e3}var Y=function(e,t,n){return q(J(e,n&&n.relativeDate),ie(t))};W(`en_US`,B),W(`zh_CN`,H);var ae=`playlists.playlistCount`;function oe(e){if(!e)return!1;let t=e.videos?.count??0,n=e.interactives?.count??0,r=e.clips?.count??0;return t+n+r}function se(e){let t=oe(e.playlist);return t===!1||Number.isNaN(t)?(0,L.jsx)(L.Fragment,{}):(0,L.jsx)(`span`,{className:`text-shadow font-size-sm`,children:(0,L.jsx)(ee,{namespace:ae,phrase:`count`,options:{smartCount:t}})})}var ce={avatar:`_avatar_1ylw0_1`};function le(){return(0,L.jsx)(`div`,{className:ce.avatar,children:(0,L.jsx)(f,{})})}function ue(e){let{_liteOwner:t}=e.playlist;return e.playlist._isClickViewCurated?.value?(0,L.jsx)(le,{}):!t?.id||!e.currentUser?.id||t.id.toString()===e.currentUser.id.toString()?(0,L.jsx)(L.Fragment,{}):(0,L.jsx)(v,{imageUrl:typeof t.avatar==`string`?t.avatar:t.avatar?.url,imageCdnUrl:e.imageCdnUrl,initials:y.getInitials(t.name,t.surname)})}var de=`playlists.playlistList`;X.defaultProps={itemStyle:`square`};function X(e){let n=_.createUrl(e.data.cover&&e.data.cover.url,{size:g.Medium,resizeType:m.Cover}),r=e.data.subjectPresentationAudiences&&e.data.subjectPresentationAudiences.data,a=M(r,e.presentationAudiences),o=F.playlistItem,s=!!n||!!e.showFallbackImage;s&&(o+=` ${F.playlistItemGradient}`),!s&&e.bgColourClassNames&&(o+=` ${F.playlistItem} ${D(e.data.name,e.bgColourClassNames)}`),e.itemStyle===`round`&&(o+=` rounded-3 overflow-hidden`),e.itemStyle===`round-left`&&(o+=` rounded-start-lg overflow-hidden`);let c={...e.analyticsData,id:e.data?.id,name:e.data?.name},u={...e.analyticsOptions,entity:i.Playlist};return(0,L.jsx)(p,{appLink:e.appLink,analyticsData:c,analyticsOptions:u,title:!e.data.contentModifiedDate||e.data._isClickViewCurated?.value?``:t.getPhrase(de,`lastUpdated`,{timeago:Y(l.convertUTCToLocal(e.data.contentModifiedDate))}),children:(0,L.jsxs)(w,{data:n,alt:e.data.name,className:o,children:[!!e.showFallbackImage&&(0,L.jsx)(k,{type:O.Playlist}),(0,L.jsxs)(`div`,{className:`text-white ${F.playlistMetadata}`,children:[!!e.showCount&&(0,L.jsx)(se,{playlist:e.data}),(0,L.jsx)(`h5`,{className:`mb-0 ${e.titleClassName||``}`,children:(0,L.jsx)(`span`,{className:`text-shadow clamp-2`,children:e.data.name})}),!!r&&!!r.length&&!!a&&(0,L.jsx)(N,{className:`${e.audienceLabelClass?e.audienceLabelClass:``} mt-1`,audience:a,border:`white`})]}),!!e.showOwner&&!!e.imageCdnUrl&&(0,L.jsx)(`div`,{className:F.ownerAvatarContainer,children:(0,L.jsx)(ue,{playlist:e.data,currentUser:e.currentUser,imageCdnUrl:e.imageCdnUrl})})]})})}n.Click,i.Playlist,o.PlaylistListItem,r.Cover;var Z={labelContainer:`_labelContainer_1rf8p_1`,labelContainerOverlay:`_labelContainerOverlay_1rf8p_15`,hoverActive:`_hoverActive_1rf8p_23`,mask:`_mask_1rf8p_37`,largeHoverTitle:`_largeHoverTitle_1rf8p_50`,smallHoverTitle:`_smallHoverTitle_1rf8p_69`,description:`_description_1rf8p_93`,largeHoverDescription:`_largeHoverDescription_1rf8p_99`,hasTableOfContents:`_hasTableOfContents_1rf8p_141`,smallHoverDescription:`_smallHoverDescription_1rf8p_194`};function fe(e){return(0,L.jsxs)(`div`,{className:`py-3 mx-2 px-2 rounded bg-white text-center ${Z.mask} d-flex flex-column align-items-center`,children:[(0,L.jsx)(`h3`,{className:`fw-semibold mb-0 ${Z.hoverTitle} ${e.isSmall?Z.smallHoverTitle:Z.largeHoverTitle}`,children:(0,L.jsx)(`span`,{className:`clamp-3`,children:e.series.name})}),!!e.series.description&&(0,L.jsx)(`p`,{className:`${e.hasTableOfContents?Z.hasTableOfContents:``} ${Z.hoverDescription} ${e.isSmall?Z.smallHoverDescription:Z.largeHoverDescription} mb-0`,children:e.series.description}),(0,L.jsx)(`div`,{className:`${Z.labelContainerOverlay}`,children:e.mergedAudience?(0,L.jsx)(N,{audience:e.mergedAudience,border:`dark`,className:`mt-2 w-fit`}):(0,L.jsx)(E,{type:T.Rating,data:A.getRating(e.series),className:`mt-2`})})]})}function pe(e){let[t,n]=te({className:Z.hoverActive}),r=e.series&&e.series.subjectPresentationAudiences&&e.series.subjectPresentationAudiences.data||[],i=M(r,e.presentationAudiences),a=!!(r&&r.length&&i);return(0,L.jsx)(`div`,{ref:t,children:(0,L.jsxs)(w,{data:e.series.tallPoster,alt:e.series.name,imageType:h.TallPosters,preload:e.preloadImage,imageOptions:{size:g.Large},imageClassName:e.imageClass?e.imageClass:`rounded-3`,children:[n&&(0,L.jsx)(fe,{isSmall:e.isSmall,series:e.series,mergedAudience:r&&r.length?i:null,hasTableOfContents:e.hasTableOfContents}),(0,L.jsx)(k,{type:O.Series}),(0,L.jsx)(`div`,{className:`position-absolute text-white ${Z.labelContainer}`,children:a?(0,L.jsx)(N,{audience:i,className:`bg-white text-dark`,border:`dark`}):(0,L.jsx)(E,{className:`text-shadow`,type:T.Rating,data:A.getRating(e.series)})})]})})}var Q={partialHeroThumbnail:`_partialHeroThumbnail_pydn0_1`,partialSeriesText:`_partialSeriesText_pydn0_6`,partialVideoTitleText:`_partialVideoTitleText_pydn0_10`,partialBadge:`_partialBadge_pydn0_14`,partialDescription:`_partialDescription_pydn0_18`,partialSubject:`_partialSubject_pydn0_22`,partialHeading:`_partialHeading_pydn0_26`,guidance:`_guidance_pydn0_30`,responsiveGuidance:`_responsiveGuidance_pydn0_41`,description:`_description_pydn0_56`,details:`_details_pydn0_82`};$.defaultProps={newDurationStyle:!0,badgePosition:`thumbnail`};function $(e){let t=e.video?.subjectPresentationAudiences?.data,n=M(t,e.presentationAudiences),r=s.mergeOptions(e.analyticsOptions,{location:o.ClassificationHero,entity:C.getAnalyticsEntity(e.video)}),i=I.useRef(null);return e.video?(0,L.jsxs)(d,{children:[(0,L.jsx)(u,{xs:12,md:6,children:(0,L.jsx)(`div`,{ref:i,children:(0,L.jsx)(re,{analyticsOptions:r,video:e.video,appLink:e.getVideoAppLink?.(e.video,{}),imageOptions:{size:g.Medium},textPosition:S.Independent,type:`static`,audience:e.badgePosition===`thumbnail`?n:null,hideRating:e.badgePosition===`thumbnail`?!!n:!0,commonVideoProps:e.commonVideoProps})})}),(0,L.jsxs)(u,{xs:12,md:6,className:`${Q.details} position-relative`,children:[(0,L.jsxs)(`div`,{className:`d-flex justify-content-between`,children:[(0,L.jsxs)(`div`,{className:`overflow-hidden`,children:[(0,L.jsx)(P,{type:e.commonVideoProps.subTextType,appLink:e.commonVideoProps.getSubTextAppLink?.(e.video),analyticsData:e.analyticsData,analyticsOptions:r,video:e.video,className:`text-reset clamp-1`}),(0,L.jsx)(ne,{yearGroups:e.commonVideoProps.yearGroups,video:e.video,analyticsData:e.analyticsData,analyticsOptions:r,appLink:e.getVideoAppLink?.(e.video,{}),titleSize:`h4`,showNewVideoIndicator:e.showNewVideoIndicator,showPadlock:!e.commonVideoProps.hasStudentExperience&&!e.commonVideoProps.hasGuestExperience,titleClassName:e.titleClassName,clampLevel:2})]}),(0,L.jsx)(x,{analyticsData:e.analyticsData,analyticsOptions:r,video:e.video})]}),e.badgePosition===`info-panel`&&(0,L.jsxs)(j,{className:`pb-1`,children:[!e.hideInteractiveBadge&&(0,L.jsx)(E,{type:T.Interactive,data:e.video.interactives}),(0,L.jsx)(E,{type:T.Rating,data:C.getRating(e.video)}),(0,L.jsx)(E,{type:T.ProductionYear,data:e.video.productionYear})]}),(0,L.jsx)(`p`,{className:`mb-1`,children:(0,L.jsx)(`span`,{className:Q.description,children:e.video.description})}),e.badgePosition===`info-panel`&&(0,L.jsx)(N,{audience:n,className:`mt-1`,border:`dark`}),e.showVideoGuidance&&(0,L.jsx)(b,{video:e.video,analyticsData:e.analyticsData,analyticsOptions:r,containerClassName:`d-flex ${Q.guidance}`,responsiveClassName:Q.responsiveGuidance,commonVideoProps:e.commonVideoProps})]})]}):(0,L.jsx)(L.Fragment,{})}export{R as i,pe as n,X as r,$ as t};
2
+ //# sourceMappingURL=Ymq7JLkU.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DlQrdOls.chunk.js","names":["en_US","zh_CN"],"sources":["../../../../libs/shared/src/apps/playlists/components/playlist-list/playlist.module.scss","../../../../libs/shared/src/apps/playlists/components/playlist-list/PartialPlaylistList.tsx","../../../../../node_modules/timeago.js/esm/lang/en_US.js","../../../../../node_modules/timeago.js/esm/lang/zh_CN.js","../../../../../node_modules/timeago.js/esm/register.js","../../../../../node_modules/timeago.js/esm/utils/date.js","../../../../../node_modules/timeago.js/esm/format.js","../../../../../node_modules/timeago.js/esm/index.js","../../../../libs/shared/src/apps/playlists/components/playlist-count/PlaylistCount.tsx","../../../../libs/shared/src/components/clickview-avatar/clickview-avatar.module.scss","../../../../libs/shared/src/components/clickview-avatar/ClickViewAvatar.tsx","../../../../libs/shared/src/apps/playlists/components/playlist-list/PlaylistOwnerAvatar.tsx","../../../../libs/shared/src/apps/playlists/components/playlist-list/PlaylistItem.tsx","../../../../libs/shared/src/apps/playlists/components/playlist-list/PlaylistList.tsx","../../../../libs/shared/src/components/series-tall-poster/series-tall-poster.module.scss","../../../../libs/shared/src/components/series-tall-poster/SeriesTallPoster.tsx","../../../../libs/shared/src/apps/subjects/components/hero-video/hero-video.module.scss","../../../../libs/shared/src/apps/subjects/components/hero-video/HeroVideo.tsx"],"sourcesContent":[":local {\n .playlistItem {\n padding-bottom: 100%; // 1:1 aspect ratio\n }\n\n .playlistItemGradient {\n &::after {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: linear-gradient(\n to top,\n rgba(0, 0, 0, 0.55) 00%,\n rgba(0, 0, 0, 0.50) 05%,\n rgba(0, 0, 0, 0.40) 10%,\n rgba(0, 0, 0, 0.20) 25%,\n rgba(0, 0, 0, 0.05) 50%,\n rgba(0, 0, 0, 0.02) 60%,\n rgba(0, 0, 0, 0.00) 80%\n );\n }\n }\n\n .playlistMetadata {\n position: absolute;\n left: map-get($spacers, 2);\n right: map-get($spacers, 2);\n bottom: map-get($spacers, 2);\n z-index: 1;\n }\n\n .partialHeading {\n height: 2rem;\n width: 17rem;\n }\n\n .ownerAvatarContainer {\n position: absolute;\n right: map-get($spacers, 2);\n top: map-get($spacers, 2);\n z-index: 1;\n width: 15%;\n height: 15%;\n }\n}","import * as React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport styles from './playlist.module.scss';\n\ninterface PartialPlaylistListProps {\n numItems?: number;\n itemClassName?: string;\n showHeading?: boolean;\n}\n\nPartialPlaylistList.defaultProps = {\n numItems: 8\n};\n\nexport function PartialPlaylistList(props: PartialPlaylistListProps): JSX.Element {\n const PARTIAL_PLAYLISTS = [...Array(props.numItems)];\n\n const className = props.itemClassName || '';\n\n return (\n <>\n {props.showHeading && <div className={`${styles.partialHeading} mb-1 partial-loading-background`} />}\n <Row className='mx-n1 mb-n2'>\n {PARTIAL_PLAYLISTS.map((p, idx) => (\n <Col key={idx} xs={6} sm={4} lg={3} className={`${className} px-1 pb-2`}>\n <div className={`${styles.playlistItem} partial-loading-background rounded-3`} />\n </Col>\n ))}\n </Row>\n </>\n );\n}\n","var EN_US = ['second', 'minute', 'hour', 'day', 'week', 'month', 'year'];\nexport default function (diff, idx) {\n if (idx === 0)\n return ['just now', 'right now'];\n var unit = EN_US[Math.floor(idx / 2)];\n if (diff > 1)\n unit += 's';\n return [diff + \" \" + unit + \" ago\", \"in \" + diff + \" \" + unit];\n}\n//# sourceMappingURL=en_US.js.map","var ZH_CN = ['秒', '分钟', '小时', '天', '周', '个月', '年'];\nexport default function (diff, idx) {\n if (idx === 0)\n return ['刚刚', '片刻后'];\n var unit = ZH_CN[~~(idx / 2)];\n return [diff + \" \" + unit + \"\\u524D\", diff + \" \" + unit + \"\\u540E\"];\n}\n//# sourceMappingURL=zh_CN.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\n/**\n * All supported locales\n */\nvar Locales = {};\n/**\n * register a locale\n * @param locale\n * @param func\n */\nexport var register = function (locale, func) {\n Locales[locale] = func;\n};\n/**\n * get a locale, default is en_US\n * @param locale\n * @returns {*}\n */\nexport var getLocale = function (locale) {\n return Locales[locale] || Locales['en_US'];\n};\n//# sourceMappingURL=register.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\nvar SEC_ARRAY = [\n 60,\n 60,\n 24,\n 7,\n 365 / 7 / 12,\n 12,\n];\n/**\n * format Date / string / timestamp to timestamp\n * @param input\n * @returns {*}\n */\nexport function toDate(input) {\n if (input instanceof Date)\n return input;\n // @ts-ignore\n if (!isNaN(input) || /^\\d+$/.test(input))\n return new Date(parseInt(input));\n input = (input || '')\n // @ts-ignore\n .trim()\n .replace(/\\.\\d+/, '') // remove milliseconds\n .replace(/-/, '/')\n .replace(/-/, '/')\n .replace(/(\\d)T(\\d)/, '$1 $2')\n .replace(/Z/, ' UTC') // 2017-2-5T3:57:52Z -> 2017-2-5 3:57:52UTC\n .replace(/([+-]\\d\\d):?(\\d\\d)/, ' $1$2'); // -04:00 -> -0400\n return new Date(input);\n}\n/**\n * format the diff second to *** time ago, with setting locale\n * @param diff\n * @param localeFunc\n * @returns\n */\nexport function formatDiff(diff, localeFunc) {\n /**\n * if locale is not exist, use defaultLocale.\n * if defaultLocale is not exist, use build-in `en`.\n * be sure of no error when locale is not exist.\n *\n * If `time in`, then 1\n * If `time ago`, then 0\n */\n var agoIn = diff < 0 ? 1 : 0;\n /**\n * Get absolute value of number (|diff| is non-negative) value of x\n * |diff| = diff if diff is positive\n * |diff| = -diff if diff is negative\n * |0| = 0\n */\n diff = Math.abs(diff);\n /**\n * Time in seconds\n */\n var totalSec = diff;\n /**\n * Unit of time\n */\n var idx = 0;\n for (; diff >= SEC_ARRAY[idx] && idx < SEC_ARRAY.length; idx++) {\n diff /= SEC_ARRAY[idx];\n }\n /**\n * Math.floor() is alternative of ~~\n *\n * The differences and bugs:\n * Math.floor(3.7) -> 4 but ~~3.7 -> 3\n * Math.floor(1559125440000.6) -> 1559125440000 but ~~1559125440000.6 -> 52311552\n *\n * More information about the performance of algebraic:\n * https://www.youtube.com/watch?v=65-RbBwZQdU\n */\n diff = Math.floor(diff);\n idx *= 2;\n if (diff > (idx === 0 ? 9 : 1))\n idx += 1;\n return localeFunc(diff, idx, totalSec)[agoIn].replace('%s', diff.toString());\n}\n/**\n * calculate the diff second between date to be formatted an now date.\n * @param date\n * @param relativeDate\n * @returns {number}\n */\nexport function diffSec(date, relativeDate) {\n var relDate = relativeDate ? toDate(relativeDate) : new Date();\n return (+relDate - +toDate(date)) / 1000;\n}\n/**\n * nextInterval: calculate the next interval time.\n * - diff: the diff sec between now and date to be formatted.\n *\n * What's the meaning?\n * diff = 61 then return 59\n * diff = 3601 (an hour + 1 second), then return 3599\n * make the interval with high performance.\n **/\nexport function nextInterval(diff) {\n var rst = 1, i = 0, d = Math.abs(diff);\n for (; diff >= SEC_ARRAY[i] && i < SEC_ARRAY.length; i++) {\n diff /= SEC_ARRAY[i];\n rst *= SEC_ARRAY[i];\n }\n d = d % rst;\n d = d ? rst - d : rst;\n return Math.ceil(d);\n}\n//# sourceMappingURL=date.js.map","import { formatDiff, diffSec } from './utils/date';\nimport { getLocale } from './register';\n/**\n * format a TDate into string\n * @param date\n * @param locale\n * @param opts\n */\nexport var format = function (date, locale, opts) {\n // diff seconds\n var sec = diffSec(date, opts && opts.relativeDate);\n // format it with locale\n return formatDiff(sec, getLocale(locale));\n};\n//# sourceMappingURL=format.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\nimport en_US from './lang/en_US';\nimport zh_CN from './lang/zh_CN';\nimport { register } from './register';\nregister('en_US', en_US);\nregister('zh_CN', zh_CN);\nexport { format } from './format';\nexport { render, cancel } from './realtime';\nexport { register };\n//# sourceMappingURL=index.js.map","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Playlist } from 'libs/shared/interfaces';\n\nconst namespace = 'playlists.playlistCount';\n\nfunction getCount(playlist: Playlist): number | false {\n if (!playlist)\n return false;\n\n const videos = playlist.videos?.count ?? 0;\n const interactives = playlist.interactives?.count ?? 0;\n const clips = playlist.clips?.count ?? 0;\n\n return videos + interactives + clips;\n}\n\ninterface PlaylistCountProps {\n playlist: Playlist;\n}\n\nexport function PlaylistCount(props: PlaylistCountProps): JSX.Element {\n const count = getCount(props.playlist);\n\n if (count === false || Number.isNaN(count))\n return <></>;\n\n return (\n <span className='text-shadow font-size-sm'>\n <Text namespace={namespace} phrase='count' options={{ smartCount: count }} />\n </span>\n );\n}\n",".avatar {\n position: relative;\n border-radius: 50%;\n background-color: $white;\n width: 100%;\n height: 100%;\n text-align: center;\n\n svg {\n position: absolute;\n top: 50%;\n left: 59%; // 59 rather than 50 as it makes the play icon look more centered\n transform: translate(-50%, -50%);\n width: 60%;\n height: 60%;\n }\n}","import * as React from 'react';\n\nimport { ClickViewLogoMark } from 'libs/shared/components/svgs/clickview-logo/ClickViewLogo';\n\nimport styles from './clickview-avatar.module.scss';\n\nexport function ClickViewAvatar(): JSX.Element {\n return (\n <div className={styles.avatar}>\n <ClickViewLogoMark />\n </div>\n );\n}\n","import * as React from 'react';\n\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { ClickViewAvatar } from 'libs/shared/components/clickview-avatar/ClickViewAvatar';\nimport { CurrentUser, Playlist } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\ninterface PlaylistOwnerAvatarProps {\n playlist: Playlist;\n imageCdnUrl: string;\n currentUser?: CurrentUser;\n}\n\nexport function PlaylistOwnerAvatar(props: PlaylistOwnerAvatarProps): JSX.Element {\n const { _liteOwner } = props.playlist;\n\n if (props.playlist._isClickViewCurated?.value)\n return (\n <ClickViewAvatar />\n );\n\n if (!_liteOwner?.id || !props.currentUser?.id)\n return <></>;\n\n const currentUserIsOwner = _liteOwner.id.toString() === props.currentUser.id.toString();\n\n if (currentUserIsOwner)\n return <></>;\n\n const url = typeof _liteOwner.avatar === 'string' ? _liteOwner.avatar : _liteOwner.avatar?.url;\n\n return (\n <Avatar\n imageUrl={url}\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(_liteOwner.name, _liteOwner.surname)}\n />\n );\n}\n","import * as React from 'react';\nimport { format } from 'timeago.js';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { AnalyticsOptions, EntityType, HashObject } from 'libs/analytics/interfaces';\n\nimport { PlaylistCount } from 'libs/shared/apps/playlists/components/playlist-count/PlaylistCount';\nimport { PlaylistOwnerAvatar } from 'libs/shared/apps/playlists/components/playlist-list/PlaylistOwnerAvatar';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { AudienceLabel } from 'libs/shared/components/audience-label/AudienceLabel';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { ImageSize, ResizeType } from 'libs/shared/enums/Images';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { CurrentUser, Playlist, PresentationAudience } from 'libs/shared/interfaces';\nimport { getBgColorClass } from 'libs/shared/utils/getBgColorClass';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\n\nimport styles from './playlist.module.scss';\n\nconst namespace = 'playlists.playlistList';\n\nexport type PlaylistItemStyle = 'square' | 'round' | 'round-left';\n\nexport interface PlaylistItemProps {\n data: Playlist;\n appLink: Core.AppLink;\n currentUser?: CurrentUser;\n presentationAudiences?: PresentationAudience[];\n bgColourClassNames?: string[];\n titleClassName?: string;\n imageCdnUrl?: string;\n itemStyle?: PlaylistItemStyle;\n showCount?: boolean;\n showOwner?: boolean;\n showFallbackImage?: boolean;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n audienceLabelClass?: string;\n}\n\nPlaylistItem.defaultProps = {\n itemStyle: 'square'\n};\n\nexport function PlaylistItem(props: PlaylistItemProps): JSX.Element {\n const imageUrl = ImageHelper.createUrl(props.data.cover && props.data.cover.url, {\n size: ImageSize.Medium,\n resizeType: ResizeType.Cover\n });\n\n const audiences = props.data.subjectPresentationAudiences &&\n props.data.subjectPresentationAudiences.data;\n\n const mergedAudience = useMergeAudiences(audiences, props.presentationAudiences);\n\n let className = styles.playlistItem;\n\n const showImage = !!imageUrl || !!props.showFallbackImage;\n\n if (showImage)\n className += ` ${styles.playlistItemGradient}`;\n\n if (!showImage && props.bgColourClassNames)\n className += ` ${styles.playlistItem} ${getBgColorClass(props.data.name, props.bgColourClassNames)}`;\n\n if (props.itemStyle === 'round')\n className += ` rounded-3 overflow-hidden`;\n\n if (props.itemStyle === 'round-left')\n className += ` rounded-start-lg overflow-hidden`;\n\n const analyticsData = { ...props.analyticsData,\n id: props.data?.id,\n name: props.data?.name\n };\n\n const analyticsOptions = {\n ...props.analyticsOptions,\n entity: EntityType.Playlist\n };\n\n const getTitle = () => {\n if (!props.data.contentModifiedDate || props.data._isClickViewCurated?.value)\n return '';\n\n return LanguageService.getPhrase(namespace, 'lastUpdated', {\n timeago: format(DateHelper.convertUTCToLocal(props.data.contentModifiedDate))\n });\n };\n\n return (\n <AppLink\n appLink={props.appLink}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n title={getTitle()}\n >\n <BaseImage data={imageUrl} alt={props.data.name} className={className}>\n {!!props.showFallbackImage && <ImageFallback type={ImageFallbackType.Playlist} />}\n <div className={`text-white ${styles.playlistMetadata}`}>\n {!!props.showCount && (\n <PlaylistCount playlist={props.data} />\n )}\n <h5 className={`mb-0 ${props.titleClassName || ''}`}><span className='text-shadow clamp-2'>{props.data.name}</span></h5>\n {!!audiences && !!audiences.length && !!mergedAudience &&\n <AudienceLabel\n className={`${props.audienceLabelClass ? props.audienceLabelClass : ''} mt-1`}\n audience={mergedAudience}\n border='white'\n />\n }\n </div>\n {!!props.showOwner && !!props.imageCdnUrl &&\n <div className={styles.ownerAvatarContainer}>\n <PlaylistOwnerAvatar\n playlist={props.data}\n currentUser={props.currentUser}\n imageCdnUrl={props.imageCdnUrl}\n />\n </div>\n }\n </BaseImage>\n </AppLink>\n );\n}\n","import * as React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, HashObject, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { CurrentUser, Playlist, PresentationAudience } from 'libs/shared/interfaces';\n\nimport { PlaylistItem, PlaylistItemStyle } from './PlaylistItem';\n\ninterface PlaylistListProps {\n playlists: Playlist[];\n getPlaylistAppLink: (playlist: Playlist) => Core.AppLink;\n currentUser?: CurrentUser;\n presentationAudiences?: PresentationAudience[];\n itemContainerClassName?: string;\n itemTitleClassName?: string;\n bgColourClassNames?: string[];\n itemStyle?: PlaylistItemStyle;\n imageCdnUrl?: string;\n showCount?: boolean;\n showOwner?: boolean;\n showFallbackImage?: boolean;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n extraPlaylistItem?: JSX.Element;\n}\n\nconst analyticsOptions: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Playlist,\n location: LocationContext.PlaylistListItem,\n descriptor: ClickDescriptor.Cover\n};\n\nexport function PlaylistList(props: PlaylistListProps): JSX.Element {\n return (\n <Row as='ul' className='list-unstyled mx-n1'>\n {props.extraPlaylistItem && (\n <Col as='li' key='extra-playlist-item' xs={6} sm={4} lg={3} className={`mb-2 px-1 ${props.itemContainerClassName ? props.itemContainerClassName : ''}`}>\n {props.extraPlaylistItem}\n </Col>\n )}\n\n {props.playlists.map(p => (\n <Col as='li' key={p.id} xs={6} sm={4} lg={3} className={`mb-2 px-1 ${props.itemContainerClassName ? props.itemContainerClassName : ''}`}>\n <PlaylistItem\n data={p}\n appLink={props.getPlaylistAppLink(p)}\n imageCdnUrl={props.imageCdnUrl}\n currentUser={props.currentUser}\n presentationAudiences={props.presentationAudiences}\n bgColourClassNames={props.bgColourClassNames}\n showCount={props.showCount}\n showOwner={props.showOwner}\n showFallbackImage={props.showFallbackImage}\n titleClassName={props.itemTitleClassName}\n itemStyle={props.itemStyle}\n analyticsData={props.analyticsData}\n analyticsOptions={{ ...props.analyticsOptions, ...analyticsOptions }}\n />\n </Col>\n ))}\n </Row>\n );\n}\n","@import '~styles/utils/mixins';\n@import '~styles/utils/include-media';\n:local {\n .labelContainer {\n z-index: 1;\n bottom: map-get($spacers, 2);\n left: 50%;\n transform: translate(-50%, 0%);\n\n :global(.rating-badge) {\n @include thumbnail-poster-badge;\n }\n }\n\n .labelContainerOverlay {\n :global(.rating-badge) {\n @include thumbnail-poster-badge;\n }\n }\n\n .hoverActive {\n transform: translate3D(0, -1px, 0) scale(1.01);\n transition: all .1s ease;\n\n &:after {\n content: '';\n\n position: absolute;\n top: 0;\n left: -(map-get($spacers, 1));\n right: -(map-get($spacers, 1));\n bottom: 0;\n\n margin: 0 map-get($spacers, 1);\n\n border-radius: $border-radius-lg;\n }\n }\n\n .mask {\n z-index: 2;\n position: absolute;\n bottom: map-get($spacers, 2);\n right: 0;\n left: 0;\n\n max-height: calc(100% - (map-get($spacers, 2) * 2));\n \n @include media('<=lg') {\n padding: map-get($spacers, 3) map-get($spacers, 1);\n }\n\n .largeHoverTitle {\n font-size: $h4-font-size;\n\n @include media('<=lg') {\n font-size: $h5-font-size;\n }\n\n @include media('<=md') {\n font-size: $h6-font-size;\n margin-bottom: map-get($spacers, 1);\n }\n\n @include media('<=sm') {\n font-size: $h5-font-size;\n }\n }\n\n .smallHoverTitle {\n font-size: $h5-font-size;\n\n @include media('<=xl') {\n font-size: $h6-font-size;\n }\n\n @include media('<=lg') {\n font-size: $h6-font-size;\n }\n\n @include media('<=md') {\n @include clamp(5);\n }\n }\n\n .description {\n text-overflow: ellipsis;\n overflow: hidden;\n -webkit-box-orient: vertical;\n display: -webkit-box;\n }\n\n .largeHoverDescription {\n @include clamp(11);\n\n @include media('<=xl') {\n @include clamp(9);\n }\n @include media('<=lg') {\n @include clamp(7);\n }\n @include media(\"<=878px\") {\n @include clamp(4);\n }\n\n &.hasTableOfContents {\n @include clamp(7);\n\n @include media('<=xl') {\n @include clamp(5);\n }\n @include media(\"<=1003px\") {\n @include clamp(4);\n }\n @include media('<=lg') {\n @include clamp(7);\n }\n @include media(\"<=878px\") {\n @include clamp(4);\n }\n }\n }\n\n .smallHoverDescription {\n @include clamp(8);\n\n @include media('<=xl') {\n @include clamp(8);\n font-size: 12px;\n }\n\n @include media('<=md') {\n @include clamp(6);\n }\n @include media('<=sm') {\n @include clamp(9);\n }\n } \n }\n}","import React from 'react';\n\nimport { AudienceLabel } from 'libs/shared/components/audience-label/AudienceLabel';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { ImageSize, ImageType } from 'libs/shared/enums/Images';\nimport { useHoverIntent } from 'libs/shared/hooks/UseHover';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { PresentationAudience, Series } from 'libs/shared/interfaces';\nimport { SeriesHelper } from 'libs/shared/utils/SeriesHelper';\n\nimport styles from './series-tall-poster.module.scss';\n\ninterface SeriesTallPosterHoverOverlay {\n series: Series;\n mergedAudience: PresentationAudience;\n isSmall?: boolean;\n hasTableOfContents?: boolean;\n}\n\nfunction SeriesTallPosterHoverOverlay(props: SeriesTallPosterHoverOverlay): JSX.Element {\n return (\n <div className={`py-3 mx-2 px-2 rounded bg-white text-center ${styles.mask} d-flex flex-column align-items-center`}>\n <h3 className={`fw-semibold mb-0 ${styles.hoverTitle} ${props.isSmall ? styles.smallHoverTitle : styles.largeHoverTitle}`}>\n <span className='clamp-3'>\n {props.series.name}\n </span>\n </h3>\n\n {!!props.series.description && (\n <p className={`${props.hasTableOfContents ? styles.hasTableOfContents : ''} ${styles.hoverDescription} ${props.isSmall ? styles.smallHoverDescription : styles.largeHoverDescription} mb-0`}>{props.series.description}</p>\n )}\n <div className={`${styles.labelContainerOverlay}`}>\n {props.mergedAudience ?\n <AudienceLabel audience={props.mergedAudience} border='dark' className='mt-2 w-fit'/> :\n <Badge type={BadgeType.Rating} data={SeriesHelper.getRating(props.series)} className='mt-2' />\n }\n </div>\n </div>\n );\n}\n\ninterface SeriesTallPosterMaskProps {\n series: Series;\n presentationAudiences: PresentationAudience[];\n preloadImage: boolean;\n imageClass?: string;\n isSmall?: boolean;\n hasTableOfContents?: boolean;\n}\n\nexport function SeriesTallPoster(props: SeriesTallPosterMaskProps): JSX.Element {\n const [ hoverRef, isHovering ] = useHoverIntent<HTMLDivElement>({ className: styles.hoverActive });\n \n const audiences = props.series && props.series.subjectPresentationAudiences &&\n props.series.subjectPresentationAudiences.data || [];\n\n const mergedAudience = useMergeAudiences(audiences, props.presentationAudiences);\n const displayAudience = !!(audiences && audiences.length && mergedAudience);\n\n return (\n <div ref={hoverRef}>\n <BaseImage\n data={props.series.tallPoster}\n alt={props.series.name}\n imageType={ImageType.TallPosters}\n preload={props.preloadImage}\n imageOptions={{ size: ImageSize.Large }}\n imageClassName={props.imageClass ? props.imageClass : 'rounded-3'}\n >\n {isHovering && (\n <SeriesTallPosterHoverOverlay\n isSmall={props.isSmall}\n series={props.series}\n mergedAudience={audiences && audiences.length ? mergedAudience : null}\n hasTableOfContents={props.hasTableOfContents}\n />\n )}\n \n <ImageFallback type={ImageFallbackType.Series} />\n <div className={`position-absolute text-white ${styles.labelContainer}`}>\n {displayAudience ?\n <AudienceLabel audience={mergedAudience} className='bg-white text-dark' border='dark' /> :\n <Badge className='text-shadow' type={BadgeType.Rating} data={SeriesHelper.getRating(props.series)} />\n }\n </div>\n </BaseImage>\n </div>\n );\n}\n","@import '~styles/utils/mixins';\n@import '~styles/utils/include-media';\n:local {\n .partialHeroThumbnail {\n position: relative;\n width: 100%;\n padding-bottom: 56.25%;\n }\n\n .partialSeriesText {\n width: 6.25rem;\n height: 1rem;\n }\n\n .partialVideoTitleText {\n width: 16rem;\n height: 2rem;\n }\n\n .partialBadge {\n width: 4rem;\n height: 1rem;\n }\n\n .partialDescription {\n width: 80%;\n height: 4rem;\n }\n\n .partialSubject {\n width: 6.25rem;\n height: 1.5rem;\n }\n\n .partialHeading {\n height: 1.5rem;\n width: 8.4375rem;\n }\n\n .guidance {\n position: absolute;\n bottom: 0;\n gap: map-get($spacers, 1);\n\n @include media(\"<md\") {\n position: relative;\n }\n }\n\n .responsiveGuidance {\n @include media('>md') {\n @include responsive-guidance-tags;\n }\n\n @include media('<=sm') {\n @include responsive-guidance-tags;\n }\n }\n\n .description {\n @include clamp(4);\n \n @include media(\"<xl\") {\n @include clamp(3);\n }\n \n @include media(\"<md\") {\n display: none;\n }\n }\n\n .details {\n @include media(\"<md\") {\n padding-top: map-get($spacers, 2);\n }\n }\n}","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, LocationContext } from 'libs/analytics/interfaces';\n\nimport { AudienceLabel } from 'libs/shared/components/audience-label/AudienceLabel';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BadgeListContainer } from 'libs/shared/components/badges/BadgeListContainer';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { VideoItemGuidance } from 'libs/shared/components/video-list/components/video-guidance/VideoItemGuidance';\nimport { VideoItemActions } from 'libs/shared/components/video-list/components/video-item-actions/VideoItemActions';\nimport { VideoItemTitle } from 'libs/shared/components/video-list/components/video-item-title/VideoItemTitle';\nimport { VideoSubText } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { PresentationAudience, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './hero-video.module.scss';\n\ninterface HeroVideoProps {\n video: Video;\n presentationAudiences: PresentationAudience[];\n showVideoGuidance: boolean;\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n hideInteractiveBadge?: boolean;\n badgePosition?: 'thumbnail' | 'info-panel';\n titleClassName?: string;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n commonVideoProps: CommonVideoProps;\n showNewVideoIndicator?: boolean;\n}\n\nHeroVideo.defaultProps = {\n newDurationStyle: true,\n badgePosition: 'thumbnail'\n};\n\nexport function HeroVideo(props: HeroVideoProps): JSX.Element {\n const videoAudiences = props.video?.subjectPresentationAudiences?.data;\n const mergedAudience = useMergeAudiences(videoAudiences, props.presentationAudiences);\n\n const analyticsOptions = AnalyticsHelper.mergeOptions(props.analyticsOptions, {\n location: LocationContext.ClassificationHero,\n entity: VideoHelper.getAnalyticsEntity(props.video)\n });\n\n const containerRef = React.useRef(null);\n \n if (!props.video)\n return <></>;\n\n return (\n <Row>\n <Col xs={12} md={6}>\n <div ref={containerRef} >\n <VideoThumbnail\n analyticsOptions={analyticsOptions}\n video={props.video}\n appLink={props.getVideoAppLink?.(props.video, {})}\n imageOptions={{ size: ImageSize.Medium }}\n textPosition={ThumbnailTextPosition.Independent}\n type='static'\n audience={props.badgePosition === 'thumbnail' ? mergedAudience : null}\n hideRating={props.badgePosition === 'thumbnail' ? !!mergedAudience : true}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n </Col>\n <Col xs={12} md={6} className={`${styles.details} position-relative`}>\n <div className='d-flex justify-content-between'>\n <div className='overflow-hidden'>\n <VideoSubText\n type={props.commonVideoProps.subTextType}\n appLink={props.commonVideoProps.getSubTextAppLink?.(props.video)}\n analyticsData={props.analyticsData}\n analyticsOptions={analyticsOptions}\n video={props.video}\n className='text-reset clamp-1'\n />\n <VideoItemTitle\n yearGroups={props.commonVideoProps.yearGroups}\n video={props.video}\n analyticsData={props.analyticsData}\n analyticsOptions={analyticsOptions}\n appLink={props.getVideoAppLink?.(props.video, {})}\n titleSize='h4'\n showNewVideoIndicator={props.showNewVideoIndicator}\n showPadlock={!props.commonVideoProps.hasStudentExperience && !props.commonVideoProps.hasGuestExperience}\n titleClassName={props.titleClassName}\n clampLevel={2}\n />\n </div>\n <VideoItemActions\n analyticsData={props.analyticsData}\n analyticsOptions={analyticsOptions}\n video={props.video}\n />\n </div>\n\n {props.badgePosition === 'info-panel' && (\n <BadgeListContainer className='pb-1'>\n {!props.hideInteractiveBadge && <Badge type={ BadgeType.Interactive } data={props.video.interactives} />}\n <Badge type={ BadgeType.Rating } data={VideoHelper.getRating(props.video)} />\n <Badge type={ BadgeType.ProductionYear } data={props.video.productionYear} />\n </BadgeListContainer>\n )}\n\n <p className='mb-1'><span className={styles.description}>{props.video.description}</span></p>\n \n {props.badgePosition === 'info-panel' && (\n <AudienceLabel\n audience={mergedAudience}\n className='mt-1'\n border='dark'\n />\n )}\n\n {props.showVideoGuidance && (\n <VideoItemGuidance\n video={props.video}\n analyticsData={props.analyticsData}\n analyticsOptions={analyticsOptions}\n containerClassName={`d-flex ${styles.guidance}`}\n responsiveClassName={styles.responsiveGuidance}\n commonVideoProps={props.commonVideoProps}\n />\n )}\n </Col>\n </Row>\n );\n}\n\nexport function PartialHeroVideo(): JSX.Element {\n return (\n <>\n <div className={`partial-loading-background mb-2 ${styles.partialHeading}`} />\n <div className='row pb-3'>\n <div className='col-6 p1'>\n <div className={`${styles.partialHeroThumbnail} partial-loading-background rounded-3`}></div>\n </div>\n <div className='col-6 p1'>\n <div className={`partial-loading-background mb-1 ${styles.partialSeriesText}`}></div>\n <div className={`partial-loading-background my-1 ${styles.partialVideoTitleText}`}></div>\n <div className='d-flex'>\n <div className={`partial-loading-background my-1 me-1 ${styles.partialBadge}`}></div>\n <div className={`partial-loading-background my-1 ms-1 ${styles.partialBadge}`}></div>\n </div>\n <div className={`partial-loading-background my-1 ${styles.partialDescription}`}></div>\n <div className={`partial-loading-background mt-2 ${styles.partialSubject}`}></div>\n </div>\n </div>\n </>\n );\n}\n"],"x_google_ignoreList":[2,3,4,5,6,7],"mappings":"+oCCWA,EAAoB,aAAe,CACjC,SAAU,EACX,CAED,SAAgB,EAAoB,EAA8C,CAChF,IAAM,EAAoB,CAAC,GAAG,MAAM,EAAM,SAAS,CAAC,CAE9C,EAAY,EAAM,eAAiB,GAEzC,OACE,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,CACG,EAAM,cAAe,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,GAAG,EAAO,eAAe,kCAAqC,CAAA,EACpG,EAAA,EAAA,KAAC,EAAD,CAAK,UAAU,uBACZ,EAAkB,KAAK,EAAG,KACzB,EAAA,EAAA,KAAC,EAAD,CAAe,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,UAAW,GAAG,EAAU,sBAC1D,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,GAAG,EAAO,aAAa,uCAA0C,CAAA,CAC7E,CAFI,EAEJ,CAAA,CAEJ,CAAA,CACL,CAAA,CAAA,CC9BP,IAAI,EAAQ,CAAC,SAAU,SAAU,OAAQ,MAAO,OAAQ,QAAS,OAAO,CACxE,SAAA,EAAyB,EAAM,EAAK,CAChC,GAAI,IAAQ,EACR,MAAO,CAAC,WAAY,YAAY,CACpC,IAAI,EAAO,EAAM,KAAK,MAAM,EAAM,EAAE,EAGpC,OAFI,EAAO,IACP,GAAQ,KACL,CAAC,EAAO,IAAM,EAAO,OAAQ,MAAQ,EAAO,IAAM,EAAK,CCPlE,IAAI,EAAQ,CAAC,IAAK,KAAM,KAAM,IAAK,IAAK,KAAM,IAAI,CAClD,SAAA,EAAyB,EAAM,EAAK,CAChC,GAAI,IAAQ,EACR,MAAO,CAAC,KAAM,MAAM,CACxB,IAAI,EAAO,EAAM,CAAC,EAAE,EAAM,IAC1B,MAAO,CAAC,EAAO,IAAM,EAAO,IAAU,EAAO,IAAM,EAAO,IAAS,CCEvE,IAAI,EAAU,EAAE,CAML,EAAW,SAAU,EAAQ,EAAM,CAC1C,EAAQ,GAAU,GAOX,GAAY,SAAU,EAAQ,CACrC,OAAO,EAAQ,IAAW,EAAQ,OClBlC,EAAY,CACZ,GACA,GACA,GACA,EACA,IAAM,EAAI,GACV,GACH,CAMD,SAAgB,EAAO,EAAO,CAe1B,OAdI,aAAiB,KACV,EAEP,CAAC,MAAM,EAAM,EAAI,QAAQ,KAAK,EAAM,CAC7B,IAAI,KAAK,SAAS,EAAM,CAAC,EACpC,GAAS,GAAS,IAEb,MAAK,CACL,QAAQ,QAAS,GAAG,CACpB,QAAQ,IAAK,IAAG,CAChB,QAAQ,IAAK,IAAG,CAChB,QAAQ,YAAa,QAAO,CAC5B,QAAQ,IAAK,OAAO,CACpB,QAAQ,qBAAsB,QAAQ,CACpC,IAAI,KAAK,EAAM,EAQ1B,SAAgB,EAAW,EAAM,EAAY,CASzC,IAAI,EAAQ,EAAO,EAAI,EAAI,EAO3B,EAAO,KAAK,IAAI,EAAK,CASrB,IALA,IAAI,EAAW,EAIX,EAAM,EACH,GAAQ,EAAU,IAAQ,EAAM,EAAU,OAAQ,IACrD,GAAQ,EAAU,GAgBtB,MAJA,GAAO,KAAK,MAAM,EAAK,CACvB,GAAO,EACH,GAAQ,IAAQ,EAAI,EAAI,KACxB,GAAO,GACJ,EAAW,EAAM,EAAK,EAAS,CAAC,GAAO,QAAQ,KAAM,EAAK,UAAU,CAAC,CAQhF,SAAgB,EAAQ,EAAM,EAAc,CAExC,QADc,EAAe,EAAO,EAAa,CAAG,IAAI,MACrC,CAAC,EAAO,EAAK,EAAI,ICpFxC,IAAW,EAAS,SAAU,EAAM,EAAQ,EAAM,CAI9C,OAAO,EAFG,EAAQ,EAAM,GAAQ,EAAK,aAAa,CAE3B,GAAU,EAAO,CAAC,ECL7C,EAAS,QAASA,EAAM,CACxB,EAAS,QAASC,EAAM,CCHxB,IAAM,GAAY,0BAElB,SAAS,GAAS,EAAoC,CACpD,GAAI,CAAC,EACH,MAAO,GAET,IAAM,EAAS,EAAS,QAAQ,OAAS,EACnC,EAAe,EAAS,cAAc,OAAS,EAC/C,EAAQ,EAAS,OAAO,OAAS,EAEvC,OAAO,EAAS,EAAe,EAOjC,SAAgB,GAAc,EAAwC,CACpE,IAAM,EAAQ,GAAS,EAAM,SAAS,CAKtC,OAHI,IAAU,IAAS,OAAO,MAAM,EAAM,EACjC,EAAA,EAAA,KAAA,EAAA,SAAA,EAAK,CAAA,EAGZ,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,qCACd,EAAA,EAAA,KAAC,GAAD,CAAiB,UAAA,GAAW,OAAO,QAAQ,QAAS,CAAE,WAAY,EAAO,CAAI,CAAA,CACxE,CAAA,mCEzBX,SAAgB,IAA+B,CAC7C,OACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,GAAO,iBACrB,EAAA,EAAA,KAAC,EAAD,EAAqB,CAAA,CACjB,CAAA,CCGV,SAAgB,GAAoB,EAA8C,CAChF,GAAM,CAAE,cAAe,EAAM,SAiB7B,OAfI,EAAM,SAAS,qBAAqB,OAEpC,EAAA,EAAA,KAAC,GAAD,EAAmB,CAAA,CAGnB,CAAC,GAAY,IAAM,CAAC,EAAM,aAAa,IAGhB,EAAW,GAAG,UAAU,GAAK,EAAM,YAAY,GAAG,UAAU,EAG9E,EAAA,EAAA,KAAA,EAAA,SAAA,EAAK,CAAA,EAKZ,EAAA,EAAA,KAAC,EAAD,CACE,SAJQ,OAAO,EAAW,QAAW,SAAW,EAAW,OAAS,EAAW,QAAQ,IAKvF,YAAa,EAAM,YACnB,SAAU,EAAW,YAAY,EAAW,KAAM,EAAW,QAAQ,CACrE,CAAA,CCbN,IAAM,GAAY,yBAqBlB,EAAa,aAAe,CAC1B,UAAW,SACZ,CAED,SAAgB,EAAa,EAAuC,CAClE,IAAM,EAAW,EAAY,UAAU,EAAM,KAAK,OAAS,EAAM,KAAK,MAAM,IAAK,CAC/E,KAAM,EAAU,OAChB,WAAY,EAAW,MACxB,CAAC,CAEI,EAAY,EAAM,KAAK,8BAC3B,EAAM,KAAK,6BAA6B,KAEpC,EAAiB,EAAkB,EAAW,EAAM,sBAAsB,CAE5E,EAAY,EAAO,aAEjB,EAAY,CAAC,CAAC,GAAY,CAAC,CAAC,EAAM,kBAEpC,IACF,GAAa,IAAI,EAAO,wBAEtB,CAAC,GAAa,EAAM,qBACtB,GAAa,IAAI,EAAO,aAAa,GAAG,EAAgB,EAAM,KAAK,KAAM,EAAM,mBAAmB,IAEhG,EAAM,YAAc,UACtB,GAAa,8BAEX,EAAM,YAAc,eACtB,GAAa,qCAEf,IAAM,EAAgB,CAAE,GAAG,EAAM,cAC/B,GAAI,EAAM,MAAM,GAChB,KAAM,EAAM,MAAM,KACnB,CAEK,EAAmB,CACvB,GAAG,EAAM,iBACT,OAAQ,EAAW,SACpB,CAWD,OACE,EAAA,EAAA,KAAC,EAAD,CACE,QAAS,EAAM,QACA,gBACG,mBAClB,MAbE,CAAC,EAAM,KAAK,qBAAuB,EAAM,KAAK,qBAAqB,MAC9D,GAEF,EAAgB,UAAU,GAAW,cAAe,CACzD,QAAS,EAAO,EAAW,kBAAkB,EAAM,KAAK,oBAAoB,CAAC,CAC9E,CAAC,WAUA,EAAA,EAAA,MAAC,EAAD,CAAW,KAAM,EAAU,IAAK,EAAM,KAAK,KAAiB,qBAA5D,CACG,CAAC,CAAC,EAAM,oBAAqB,EAAA,EAAA,KAAC,EAAD,CAAe,KAAM,EAAkB,SAAY,CAAA,EACjF,EAAA,EAAA,MAAC,MAAD,CAAK,UAAW,cAAc,EAAO,4BAArC,CACG,CAAC,CAAC,EAAM,YACP,EAAA,EAAA,KAAC,GAAD,CAAe,SAAU,EAAM,KAAQ,CAAA,EAEzC,EAAA,EAAA,KAAC,KAAD,CAAI,UAAW,QAAQ,EAAM,gBAAkB,eAAM,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,+BAAuB,EAAM,KAAK,KAAY,CAAA,CAAK,CAAA,CACvH,CAAC,CAAC,GAAa,CAAC,CAAC,EAAU,QAAU,CAAC,CAAC,IACtC,EAAA,EAAA,KAAC,EAAD,CACE,UAAW,GAAG,EAAM,mBAAqB,EAAM,mBAAqB,GAAG,OACvE,SAAU,EACV,OAAO,QACP,CAAA,IAGL,CAAC,CAAC,EAAM,WAAa,CAAC,CAAC,EAAM,cAC5B,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,EAAO,+BACrB,EAAA,EAAA,KAAC,GAAD,CACE,SAAU,EAAM,KAChB,YAAa,EAAM,YACnB,YAAa,EAAM,YACnB,CAAA,CACE,CAAA,IAGF,CAAA,CChGA,EAAW,MACf,EAAW,SACT,EAAgB,iBACd,EAAgB,ycEZ9B,SAAS,GAA6B,EAAkD,CACtF,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAW,+CAA+C,EAAO,KAAK,iDAA3E,EACE,EAAA,EAAA,KAAC,KAAD,CAAI,UAAW,oBAAoB,EAAO,WAAW,GAAG,EAAM,QAAU,EAAO,gBAAkB,EAAO,4BACtG,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,mBACb,EAAM,OAAO,KACT,CAAA,CACJ,CAAA,CAEJ,CAAC,CAAC,EAAM,OAAO,cACd,EAAA,EAAA,KAAC,IAAD,CAAG,UAAW,GAAG,EAAM,mBAAqB,EAAO,mBAAqB,GAAG,GAAG,EAAO,iBAAiB,GAAG,EAAM,QAAU,EAAO,sBAAwB,EAAO,sBAAsB,gBAAS,EAAM,OAAO,YAAgB,CAAA,EAE7N,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,GAAG,EAAO,iCACvB,EAAM,gBACL,EAAA,EAAA,KAAC,EAAD,CAAe,SAAU,EAAM,eAAgB,OAAO,OAAO,UAAU,aAAc,CAAA,EACrF,EAAA,EAAA,KAAC,EAAD,CAAO,KAAM,EAAU,OAAQ,KAAM,EAAa,UAAU,EAAM,OAAO,CAAE,UAAU,OAAS,CAAA,CAE5F,CAAA,IAcZ,SAAgB,GAAiB,EAA+C,CAC9E,GAAM,CAAE,EAAU,GAAe,GAA+B,CAAE,UAAW,EAAO,YAAa,CAAC,CAE5F,EAAY,EAAM,QAAU,EAAM,OAAO,8BAC7C,EAAM,OAAO,6BAA6B,MAAQ,EAAE,CAEhD,EAAiB,EAAkB,EAAW,EAAM,sBAAsB,CAC1E,EAAkB,CAAC,EAAE,GAAa,EAAU,QAAU,GAE5D,OACE,EAAA,EAAA,KAAC,MAAD,CAAK,IAAK,YACR,EAAA,EAAA,MAAC,EAAD,CACE,KAAM,EAAM,OAAO,WACnB,IAAK,EAAM,OAAO,KAClB,UAAW,EAAU,YACrB,QAAS,EAAM,aACf,aAAc,CAAE,KAAM,EAAU,MAAO,CACvC,eAAgB,EAAM,WAAa,EAAM,WAAa,qBANxD,CAQG,IACC,EAAA,EAAA,KAAC,GAAD,CACE,QAAS,EAAM,QACf,OAAQ,EAAM,OACd,eAAgB,GAAa,EAAU,OAAS,EAAiB,KACjE,mBAAoB,EAAM,mBAC1B,CAAA,EAGJ,EAAA,EAAA,KAAC,EAAD,CAAe,KAAM,EAAkB,OAAU,CAAA,EACjD,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,gCAAgC,EAAO,0BACpD,GACC,EAAA,EAAA,KAAC,EAAD,CAAe,SAAU,EAAgB,UAAU,qBAAqB,OAAO,OAAS,CAAA,EACxF,EAAA,EAAA,KAAC,EAAD,CAAO,UAAU,cAAc,KAAM,EAAU,OAAQ,KAAM,EAAa,UAAU,EAAM,OAAA,CAAW,CAAA,CAEnG,CAAA,IAEJ,CAAA,ieE/CV,EAAU,aAAe,CACvB,iBAAkB,GAClB,cAAe,YAChB,CAED,SAAgB,EAAU,EAAoC,CAC5D,IAAM,EAAiB,EAAM,OAAO,8BAA8B,KAC5D,EAAiB,EAAkB,EAAgB,EAAM,sBAAsB,CAE/E,EAAmB,EAAgB,aAAa,EAAM,iBAAkB,CAC5E,SAAU,EAAgB,mBAC1B,OAAQ,EAAY,mBAAmB,EAAM,MAAA,CAC9C,CAAC,CAEI,EAAA,EAAqB,OAAO,KAAK,CAKvC,OAHK,EAAM,OAIT,EAAA,EAAA,MAAC,EAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAD,CAAK,GAAI,GAAI,GAAI,YACf,EAAA,EAAA,KAAC,MAAD,CAAK,IAAK,YACR,EAAA,EAAA,KAAC,GAAD,CACoB,mBAClB,MAAO,EAAM,MACb,QAAS,EAAM,kBAAkB,EAAM,MAAO,EAAE,CAAC,CACjD,aAAc,CAAE,KAAM,EAAU,OAAQ,CACxC,aAAc,EAAsB,YACpC,KAAK,SACL,SAAU,EAAM,gBAAkB,YAAc,EAAiB,KACjE,WAAY,EAAM,gBAAkB,YAAc,CAAC,CAAC,EAAiB,GACrE,iBAAkB,EAAM,iBACxB,CAAA,CACE,CAAA,CACF,CAAA,EACN,EAAA,EAAA,MAAC,EAAD,CAAK,GAAI,GAAI,GAAI,EAAG,UAAW,GAAG,EAAO,QAAQ,6BAAjD,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,0CAAf,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,2BAAf,EACE,EAAA,EAAA,KAAC,EAAD,CACE,KAAM,EAAM,iBAAiB,YAC7B,QAAS,EAAM,iBAAiB,oBAAoB,EAAM,MAAM,CAChE,cAAe,EAAM,cACH,mBAClB,MAAO,EAAM,MACb,UAAU,qBACV,CAAA,EACF,EAAA,EAAA,KAAC,GAAD,CACE,WAAY,EAAM,iBAAiB,WACnC,MAAO,EAAM,MACb,cAAe,EAAM,cACH,mBAClB,QAAS,EAAM,kBAAkB,EAAM,MAAO,EAAE,CAAC,CACjD,UAAU,KACV,sBAAuB,EAAM,sBAC7B,YAAa,CAAC,EAAM,iBAAiB,sBAAwB,CAAC,EAAM,iBAAiB,mBACrF,eAAgB,EAAM,eACtB,WAAY,EACZ,CAAA,CAAA,IAEJ,EAAA,EAAA,KAAC,EAAD,CACE,cAAe,EAAM,cACH,mBAClB,MAAO,EAAM,MACb,CAAA,CAAA,GAGH,EAAM,gBAAkB,eACvB,EAAA,EAAA,MAAC,EAAD,CAAoB,UAAU,gBAA9B,CACG,CAAC,EAAM,uBAAwB,EAAA,EAAA,KAAC,EAAD,CAAO,KAAO,EAAU,YAAc,KAAM,EAAM,MAAM,aAAgB,CAAA,EACxG,EAAA,EAAA,KAAC,EAAD,CAAO,KAAO,EAAU,OAAS,KAAM,EAAY,UAAU,EAAM,MAAA,CAAU,CAAA,EAC7E,EAAA,EAAA,KAAC,EAAD,CAAO,KAAO,EAAU,eAAiB,KAAM,EAAM,MAAM,eAAkB,CAAA,KAIjF,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,iBAAO,EAAA,EAAA,KAAC,OAAD,CAAM,UAAW,EAAO,qBAAc,EAAM,MAAM,YAAmB,CAAA,CAAI,CAAA,CAE5F,EAAM,gBAAkB,eACvB,EAAA,EAAA,KAAC,EAAD,CACE,SAAU,EACV,UAAU,OACV,OAAO,OACP,CAAA,CAGH,EAAM,oBACL,EAAA,EAAA,KAAC,EAAD,CACE,MAAO,EAAM,MACb,cAAe,EAAM,cACH,mBAClB,mBAAoB,UAAU,EAAO,WACrC,oBAAqB,EAAO,mBAC5B,iBAAkB,EAAM,iBACxB,CAAA,IAGF,CAAA,CAAA,EA/EC,EAAA,EAAA,KAAA,EAAA,SAAA,EAAK,CAAA"}
1
+ {"version":3,"file":"Ymq7JLkU.chunk.js","names":["en_US","zh_CN"],"sources":["../../../../libs/shared/src/apps/playlists/components/playlist-list/playlist.module.scss","../../../../libs/shared/src/apps/playlists/components/playlist-list/PartialPlaylistList.tsx","../../../../../node_modules/timeago.js/esm/lang/en_US.js","../../../../../node_modules/timeago.js/esm/lang/zh_CN.js","../../../../../node_modules/timeago.js/esm/register.js","../../../../../node_modules/timeago.js/esm/utils/date.js","../../../../../node_modules/timeago.js/esm/format.js","../../../../../node_modules/timeago.js/esm/index.js","../../../../libs/shared/src/apps/playlists/components/playlist-count/PlaylistCount.tsx","../../../../libs/shared/src/components/clickview-avatar/clickview-avatar.module.scss","../../../../libs/shared/src/components/clickview-avatar/ClickViewAvatar.tsx","../../../../libs/shared/src/apps/playlists/components/playlist-list/PlaylistOwnerAvatar.tsx","../../../../libs/shared/src/apps/playlists/components/playlist-list/PlaylistItem.tsx","../../../../libs/shared/src/apps/playlists/components/playlist-list/PlaylistList.tsx","../../../../libs/shared/src/components/series-tall-poster/series-tall-poster.module.scss","../../../../libs/shared/src/components/series-tall-poster/SeriesTallPoster.tsx","../../../../libs/shared/src/apps/subjects/components/hero-video/hero-video.module.scss","../../../../libs/shared/src/apps/subjects/components/hero-video/HeroVideo.tsx"],"sourcesContent":[":local {\n .playlistItem {\n padding-bottom: 100%; // 1:1 aspect ratio\n }\n\n .playlistItemGradient {\n &::after {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: linear-gradient(\n to top,\n rgba(0, 0, 0, 0.55) 00%,\n rgba(0, 0, 0, 0.50) 05%,\n rgba(0, 0, 0, 0.40) 10%,\n rgba(0, 0, 0, 0.20) 25%,\n rgba(0, 0, 0, 0.05) 50%,\n rgba(0, 0, 0, 0.02) 60%,\n rgba(0, 0, 0, 0.00) 80%\n );\n }\n }\n\n .playlistMetadata {\n position: absolute;\n left: map-get($spacers, 2);\n right: map-get($spacers, 2);\n bottom: map-get($spacers, 2);\n z-index: 1;\n }\n\n .partialHeading {\n height: 2rem;\n width: 17rem;\n }\n\n .ownerAvatarContainer {\n position: absolute;\n right: map-get($spacers, 2);\n top: map-get($spacers, 2);\n z-index: 1;\n width: 15%;\n height: 15%;\n }\n}","import * as React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport styles from './playlist.module.scss';\n\ninterface PartialPlaylistListProps {\n numItems?: number;\n itemClassName?: string;\n showHeading?: boolean;\n}\n\nPartialPlaylistList.defaultProps = {\n numItems: 8\n};\n\nexport function PartialPlaylistList(props: PartialPlaylistListProps): JSX.Element {\n const PARTIAL_PLAYLISTS = [...Array(props.numItems)];\n\n const className = props.itemClassName || '';\n\n return (\n <>\n {props.showHeading && <div className={`${styles.partialHeading} mb-1 partial-loading-background`} />}\n <Row className='mx-n1 mb-n2'>\n {PARTIAL_PLAYLISTS.map((p, idx) => (\n <Col key={idx} xs={6} sm={4} lg={3} className={`${className} px-1 pb-2`}>\n <div className={`${styles.playlistItem} partial-loading-background rounded-3`} />\n </Col>\n ))}\n </Row>\n </>\n );\n}\n","var EN_US = ['second', 'minute', 'hour', 'day', 'week', 'month', 'year'];\nexport default function (diff, idx) {\n if (idx === 0)\n return ['just now', 'right now'];\n var unit = EN_US[Math.floor(idx / 2)];\n if (diff > 1)\n unit += 's';\n return [diff + \" \" + unit + \" ago\", \"in \" + diff + \" \" + unit];\n}\n//# sourceMappingURL=en_US.js.map","var ZH_CN = ['秒', '分钟', '小时', '天', '周', '个月', '年'];\nexport default function (diff, idx) {\n if (idx === 0)\n return ['刚刚', '片刻后'];\n var unit = ZH_CN[~~(idx / 2)];\n return [diff + \" \" + unit + \"\\u524D\", diff + \" \" + unit + \"\\u540E\"];\n}\n//# sourceMappingURL=zh_CN.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\n/**\n * All supported locales\n */\nvar Locales = {};\n/**\n * register a locale\n * @param locale\n * @param func\n */\nexport var register = function (locale, func) {\n Locales[locale] = func;\n};\n/**\n * get a locale, default is en_US\n * @param locale\n * @returns {*}\n */\nexport var getLocale = function (locale) {\n return Locales[locale] || Locales['en_US'];\n};\n//# sourceMappingURL=register.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\nvar SEC_ARRAY = [\n 60,\n 60,\n 24,\n 7,\n 365 / 7 / 12,\n 12,\n];\n/**\n * format Date / string / timestamp to timestamp\n * @param input\n * @returns {*}\n */\nexport function toDate(input) {\n if (input instanceof Date)\n return input;\n // @ts-ignore\n if (!isNaN(input) || /^\\d+$/.test(input))\n return new Date(parseInt(input));\n input = (input || '')\n // @ts-ignore\n .trim()\n .replace(/\\.\\d+/, '') // remove milliseconds\n .replace(/-/, '/')\n .replace(/-/, '/')\n .replace(/(\\d)T(\\d)/, '$1 $2')\n .replace(/Z/, ' UTC') // 2017-2-5T3:57:52Z -> 2017-2-5 3:57:52UTC\n .replace(/([+-]\\d\\d):?(\\d\\d)/, ' $1$2'); // -04:00 -> -0400\n return new Date(input);\n}\n/**\n * format the diff second to *** time ago, with setting locale\n * @param diff\n * @param localeFunc\n * @returns\n */\nexport function formatDiff(diff, localeFunc) {\n /**\n * if locale is not exist, use defaultLocale.\n * if defaultLocale is not exist, use build-in `en`.\n * be sure of no error when locale is not exist.\n *\n * If `time in`, then 1\n * If `time ago`, then 0\n */\n var agoIn = diff < 0 ? 1 : 0;\n /**\n * Get absolute value of number (|diff| is non-negative) value of x\n * |diff| = diff if diff is positive\n * |diff| = -diff if diff is negative\n * |0| = 0\n */\n diff = Math.abs(diff);\n /**\n * Time in seconds\n */\n var totalSec = diff;\n /**\n * Unit of time\n */\n var idx = 0;\n for (; diff >= SEC_ARRAY[idx] && idx < SEC_ARRAY.length; idx++) {\n diff /= SEC_ARRAY[idx];\n }\n /**\n * Math.floor() is alternative of ~~\n *\n * The differences and bugs:\n * Math.floor(3.7) -> 4 but ~~3.7 -> 3\n * Math.floor(1559125440000.6) -> 1559125440000 but ~~1559125440000.6 -> 52311552\n *\n * More information about the performance of algebraic:\n * https://www.youtube.com/watch?v=65-RbBwZQdU\n */\n diff = Math.floor(diff);\n idx *= 2;\n if (diff > (idx === 0 ? 9 : 1))\n idx += 1;\n return localeFunc(diff, idx, totalSec)[agoIn].replace('%s', diff.toString());\n}\n/**\n * calculate the diff second between date to be formatted an now date.\n * @param date\n * @param relativeDate\n * @returns {number}\n */\nexport function diffSec(date, relativeDate) {\n var relDate = relativeDate ? toDate(relativeDate) : new Date();\n return (+relDate - +toDate(date)) / 1000;\n}\n/**\n * nextInterval: calculate the next interval time.\n * - diff: the diff sec between now and date to be formatted.\n *\n * What's the meaning?\n * diff = 61 then return 59\n * diff = 3601 (an hour + 1 second), then return 3599\n * make the interval with high performance.\n **/\nexport function nextInterval(diff) {\n var rst = 1, i = 0, d = Math.abs(diff);\n for (; diff >= SEC_ARRAY[i] && i < SEC_ARRAY.length; i++) {\n diff /= SEC_ARRAY[i];\n rst *= SEC_ARRAY[i];\n }\n d = d % rst;\n d = d ? rst - d : rst;\n return Math.ceil(d);\n}\n//# sourceMappingURL=date.js.map","import { formatDiff, diffSec } from './utils/date';\nimport { getLocale } from './register';\n/**\n * format a TDate into string\n * @param date\n * @param locale\n * @param opts\n */\nexport var format = function (date, locale, opts) {\n // diff seconds\n var sec = diffSec(date, opts && opts.relativeDate);\n // format it with locale\n return formatDiff(sec, getLocale(locale));\n};\n//# sourceMappingURL=format.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\nimport en_US from './lang/en_US';\nimport zh_CN from './lang/zh_CN';\nimport { register } from './register';\nregister('en_US', en_US);\nregister('zh_CN', zh_CN);\nexport { format } from './format';\nexport { render, cancel } from './realtime';\nexport { register };\n//# sourceMappingURL=index.js.map","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Playlist } from 'libs/shared/interfaces';\n\nconst namespace = 'playlists.playlistCount';\n\nfunction getCount(playlist: Playlist): number | false {\n if (!playlist)\n return false;\n\n const videos = playlist.videos?.count ?? 0;\n const interactives = playlist.interactives?.count ?? 0;\n const clips = playlist.clips?.count ?? 0;\n\n return videos + interactives + clips;\n}\n\ninterface PlaylistCountProps {\n playlist: Playlist;\n}\n\nexport function PlaylistCount(props: PlaylistCountProps): JSX.Element {\n const count = getCount(props.playlist);\n\n if (count === false || Number.isNaN(count))\n return <></>;\n\n return (\n <span className='text-shadow font-size-sm'>\n <Text namespace={namespace} phrase='count' options={{ smartCount: count }} />\n </span>\n );\n}\n",".avatar {\n position: relative;\n border-radius: 50%;\n background-color: $white;\n width: 100%;\n height: 100%;\n text-align: center;\n\n svg {\n position: absolute;\n top: 50%;\n left: 59%; // 59 rather than 50 as it makes the play icon look more centered\n transform: translate(-50%, -50%);\n width: 60%;\n height: 60%;\n }\n}","import * as React from 'react';\n\nimport { ClickViewLogoMark } from 'libs/shared/components/svgs/clickview-logo/ClickViewLogo';\n\nimport styles from './clickview-avatar.module.scss';\n\nexport function ClickViewAvatar(): JSX.Element {\n return (\n <div className={styles.avatar}>\n <ClickViewLogoMark />\n </div>\n );\n}\n","import * as React from 'react';\n\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { ClickViewAvatar } from 'libs/shared/components/clickview-avatar/ClickViewAvatar';\nimport { CurrentUser, Playlist } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\ninterface PlaylistOwnerAvatarProps {\n playlist: Playlist;\n imageCdnUrl: string;\n currentUser?: CurrentUser;\n}\n\nexport function PlaylistOwnerAvatar(props: PlaylistOwnerAvatarProps): JSX.Element {\n const { _liteOwner } = props.playlist;\n\n if (props.playlist._isClickViewCurated?.value)\n return (\n <ClickViewAvatar />\n );\n\n if (!_liteOwner?.id || !props.currentUser?.id)\n return <></>;\n\n const currentUserIsOwner = _liteOwner.id.toString() === props.currentUser.id.toString();\n\n if (currentUserIsOwner)\n return <></>;\n\n const url = typeof _liteOwner.avatar === 'string' ? _liteOwner.avatar : _liteOwner.avatar?.url;\n\n return (\n <Avatar\n imageUrl={url}\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(_liteOwner.name, _liteOwner.surname)}\n />\n );\n}\n","import * as React from 'react';\nimport { format } from 'timeago.js';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { AnalyticsOptions, EntityType, HashObject } from 'libs/analytics/interfaces';\n\nimport { PlaylistCount } from 'libs/shared/apps/playlists/components/playlist-count/PlaylistCount';\nimport { PlaylistOwnerAvatar } from 'libs/shared/apps/playlists/components/playlist-list/PlaylistOwnerAvatar';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { AudienceLabel } from 'libs/shared/components/audience-label/AudienceLabel';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { ImageSize, ResizeType } from 'libs/shared/enums/Images';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { CurrentUser, Playlist, PresentationAudience } from 'libs/shared/interfaces';\nimport { getBgColorClass } from 'libs/shared/utils/getBgColorClass';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\n\nimport styles from './playlist.module.scss';\n\nconst namespace = 'playlists.playlistList';\n\nexport type PlaylistItemStyle = 'square' | 'round' | 'round-left';\n\nexport interface PlaylistItemProps {\n data: Playlist;\n appLink: Core.AppLink;\n currentUser?: CurrentUser;\n presentationAudiences?: PresentationAudience[];\n bgColourClassNames?: string[];\n titleClassName?: string;\n imageCdnUrl?: string;\n itemStyle?: PlaylistItemStyle;\n showCount?: boolean;\n showOwner?: boolean;\n showFallbackImage?: boolean;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n audienceLabelClass?: string;\n}\n\nPlaylistItem.defaultProps = {\n itemStyle: 'square'\n};\n\nexport function PlaylistItem(props: PlaylistItemProps): JSX.Element {\n const imageUrl = ImageHelper.createUrl(props.data.cover && props.data.cover.url, {\n size: ImageSize.Medium,\n resizeType: ResizeType.Cover\n });\n\n const audiences = props.data.subjectPresentationAudiences &&\n props.data.subjectPresentationAudiences.data;\n\n const mergedAudience = useMergeAudiences(audiences, props.presentationAudiences);\n\n let className = styles.playlistItem;\n\n const showImage = !!imageUrl || !!props.showFallbackImage;\n\n if (showImage)\n className += ` ${styles.playlistItemGradient}`;\n\n if (!showImage && props.bgColourClassNames)\n className += ` ${styles.playlistItem} ${getBgColorClass(props.data.name, props.bgColourClassNames)}`;\n\n if (props.itemStyle === 'round')\n className += ` rounded-3 overflow-hidden`;\n\n if (props.itemStyle === 'round-left')\n className += ` rounded-start-lg overflow-hidden`;\n\n const analyticsData = { ...props.analyticsData,\n id: props.data?.id,\n name: props.data?.name\n };\n\n const analyticsOptions = {\n ...props.analyticsOptions,\n entity: EntityType.Playlist\n };\n\n const getTitle = () => {\n if (!props.data.contentModifiedDate || props.data._isClickViewCurated?.value)\n return '';\n\n return LanguageService.getPhrase(namespace, 'lastUpdated', {\n timeago: format(DateHelper.convertUTCToLocal(props.data.contentModifiedDate))\n });\n };\n\n return (\n <AppLink\n appLink={props.appLink}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n title={getTitle()}\n >\n <BaseImage data={imageUrl} alt={props.data.name} className={className}>\n {!!props.showFallbackImage && <ImageFallback type={ImageFallbackType.Playlist} />}\n <div className={`text-white ${styles.playlistMetadata}`}>\n {!!props.showCount && (\n <PlaylistCount playlist={props.data} />\n )}\n <h5 className={`mb-0 ${props.titleClassName || ''}`}><span className='text-shadow clamp-2'>{props.data.name}</span></h5>\n {!!audiences && !!audiences.length && !!mergedAudience &&\n <AudienceLabel\n className={`${props.audienceLabelClass ? props.audienceLabelClass : ''} mt-1`}\n audience={mergedAudience}\n border='white'\n />\n }\n </div>\n {!!props.showOwner && !!props.imageCdnUrl &&\n <div className={styles.ownerAvatarContainer}>\n <PlaylistOwnerAvatar\n playlist={props.data}\n currentUser={props.currentUser}\n imageCdnUrl={props.imageCdnUrl}\n />\n </div>\n }\n </BaseImage>\n </AppLink>\n );\n}\n","import * as React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, HashObject, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { CurrentUser, Playlist, PresentationAudience } from 'libs/shared/interfaces';\n\nimport { PlaylistItem, PlaylistItemStyle } from './PlaylistItem';\n\ninterface PlaylistListProps {\n playlists: Playlist[];\n getPlaylistAppLink: (playlist: Playlist) => Core.AppLink;\n currentUser?: CurrentUser;\n presentationAudiences?: PresentationAudience[];\n itemContainerClassName?: string;\n itemTitleClassName?: string;\n bgColourClassNames?: string[];\n itemStyle?: PlaylistItemStyle;\n imageCdnUrl?: string;\n showCount?: boolean;\n showOwner?: boolean;\n showFallbackImage?: boolean;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n extraPlaylistItem?: JSX.Element;\n}\n\nconst analyticsOptions: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Playlist,\n location: LocationContext.PlaylistListItem,\n descriptor: ClickDescriptor.Cover\n};\n\nexport function PlaylistList(props: PlaylistListProps): JSX.Element {\n return (\n <Row as='ul' className='list-unstyled mx-n1'>\n {props.extraPlaylistItem && (\n <Col as='li' key='extra-playlist-item' xs={6} sm={4} lg={3} className={`mb-2 px-1 ${props.itemContainerClassName ? props.itemContainerClassName : ''}`}>\n {props.extraPlaylistItem}\n </Col>\n )}\n\n {props.playlists.map(p => (\n <Col as='li' key={p.id} xs={6} sm={4} lg={3} className={`mb-2 px-1 ${props.itemContainerClassName ? props.itemContainerClassName : ''}`}>\n <PlaylistItem\n data={p}\n appLink={props.getPlaylistAppLink(p)}\n imageCdnUrl={props.imageCdnUrl}\n currentUser={props.currentUser}\n presentationAudiences={props.presentationAudiences}\n bgColourClassNames={props.bgColourClassNames}\n showCount={props.showCount}\n showOwner={props.showOwner}\n showFallbackImage={props.showFallbackImage}\n titleClassName={props.itemTitleClassName}\n itemStyle={props.itemStyle}\n analyticsData={props.analyticsData}\n analyticsOptions={{ ...props.analyticsOptions, ...analyticsOptions }}\n />\n </Col>\n ))}\n </Row>\n );\n}\n","@import '~styles/utils/mixins';\n@import '~styles/utils/include-media';\n:local {\n .labelContainer {\n z-index: 1;\n bottom: map-get($spacers, 2);\n left: 50%;\n transform: translate(-50%, 0%);\n\n :global(.rating-badge) {\n @include thumbnail-poster-badge;\n }\n }\n\n .labelContainerOverlay {\n :global(.rating-badge) {\n @include thumbnail-poster-badge;\n }\n }\n\n .hoverActive {\n transform: translate3D(0, -1px, 0) scale(1.01);\n transition: all .1s ease;\n\n &:after {\n content: '';\n\n position: absolute;\n top: 0;\n left: -(map-get($spacers, 1));\n right: -(map-get($spacers, 1));\n bottom: 0;\n\n margin: 0 map-get($spacers, 1);\n\n border-radius: $border-radius-lg;\n }\n }\n\n .mask {\n z-index: 2;\n position: absolute;\n bottom: map-get($spacers, 2);\n right: 0;\n left: 0;\n\n max-height: calc(100% - (map-get($spacers, 2) * 2));\n \n @include media('<=lg') {\n padding: map-get($spacers, 3) map-get($spacers, 1);\n }\n\n .largeHoverTitle {\n font-size: $h4-font-size;\n\n @include media('<=lg') {\n font-size: $h5-font-size;\n }\n\n @include media('<=md') {\n font-size: $h6-font-size;\n margin-bottom: map-get($spacers, 1);\n }\n\n @include media('<=sm') {\n font-size: $h5-font-size;\n }\n }\n\n .smallHoverTitle {\n font-size: $h5-font-size;\n\n @include media('<=xl') {\n font-size: $h6-font-size;\n }\n\n @include media('<=lg') {\n font-size: $h6-font-size;\n }\n\n @include media('<=md') {\n @include clamp(5);\n }\n }\n\n .description {\n text-overflow: ellipsis;\n overflow: hidden;\n -webkit-box-orient: vertical;\n display: -webkit-box;\n }\n\n .largeHoverDescription {\n @include clamp(11);\n\n @include media('<=xl') {\n @include clamp(9);\n }\n @include media('<=lg') {\n @include clamp(7);\n }\n @include media(\"<=878px\") {\n @include clamp(4);\n }\n\n &.hasTableOfContents {\n @include clamp(7);\n\n @include media('<=xl') {\n @include clamp(5);\n }\n @include media(\"<=1003px\") {\n @include clamp(4);\n }\n @include media('<=lg') {\n @include clamp(7);\n }\n @include media(\"<=878px\") {\n @include clamp(4);\n }\n }\n }\n\n .smallHoverDescription {\n @include clamp(8);\n\n @include media('<=xl') {\n @include clamp(8);\n font-size: 12px;\n }\n\n @include media('<=md') {\n @include clamp(6);\n }\n @include media('<=sm') {\n @include clamp(9);\n }\n } \n }\n}","import React from 'react';\n\nimport { AudienceLabel } from 'libs/shared/components/audience-label/AudienceLabel';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { ImageSize, ImageType } from 'libs/shared/enums/Images';\nimport { useHoverIntent } from 'libs/shared/hooks/UseHover';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { PresentationAudience, Series } from 'libs/shared/interfaces';\nimport { SeriesHelper } from 'libs/shared/utils/SeriesHelper';\n\nimport styles from './series-tall-poster.module.scss';\n\ninterface SeriesTallPosterHoverOverlay {\n series: Series;\n mergedAudience: PresentationAudience;\n isSmall?: boolean;\n hasTableOfContents?: boolean;\n}\n\nfunction SeriesTallPosterHoverOverlay(props: SeriesTallPosterHoverOverlay): JSX.Element {\n return (\n <div className={`py-3 mx-2 px-2 rounded bg-white text-center ${styles.mask} d-flex flex-column align-items-center`}>\n <h3 className={`fw-semibold mb-0 ${styles.hoverTitle} ${props.isSmall ? styles.smallHoverTitle : styles.largeHoverTitle}`}>\n <span className='clamp-3'>\n {props.series.name}\n </span>\n </h3>\n\n {!!props.series.description && (\n <p className={`${props.hasTableOfContents ? styles.hasTableOfContents : ''} ${styles.hoverDescription} ${props.isSmall ? styles.smallHoverDescription : styles.largeHoverDescription} mb-0`}>{props.series.description}</p>\n )}\n <div className={`${styles.labelContainerOverlay}`}>\n {props.mergedAudience ?\n <AudienceLabel audience={props.mergedAudience} border='dark' className='mt-2 w-fit'/> :\n <Badge type={BadgeType.Rating} data={SeriesHelper.getRating(props.series)} className='mt-2' />\n }\n </div>\n </div>\n );\n}\n\ninterface SeriesTallPosterMaskProps {\n series: Series;\n presentationAudiences: PresentationAudience[];\n preloadImage: boolean;\n imageClass?: string;\n isSmall?: boolean;\n hasTableOfContents?: boolean;\n}\n\nexport function SeriesTallPoster(props: SeriesTallPosterMaskProps): JSX.Element {\n const [ hoverRef, isHovering ] = useHoverIntent<HTMLDivElement>({ className: styles.hoverActive });\n \n const audiences = props.series && props.series.subjectPresentationAudiences &&\n props.series.subjectPresentationAudiences.data || [];\n\n const mergedAudience = useMergeAudiences(audiences, props.presentationAudiences);\n const displayAudience = !!(audiences && audiences.length && mergedAudience);\n\n return (\n <div ref={hoverRef}>\n <BaseImage\n data={props.series.tallPoster}\n alt={props.series.name}\n imageType={ImageType.TallPosters}\n preload={props.preloadImage}\n imageOptions={{ size: ImageSize.Large }}\n imageClassName={props.imageClass ? props.imageClass : 'rounded-3'}\n >\n {isHovering && (\n <SeriesTallPosterHoverOverlay\n isSmall={props.isSmall}\n series={props.series}\n mergedAudience={audiences && audiences.length ? mergedAudience : null}\n hasTableOfContents={props.hasTableOfContents}\n />\n )}\n \n <ImageFallback type={ImageFallbackType.Series} />\n <div className={`position-absolute text-white ${styles.labelContainer}`}>\n {displayAudience ?\n <AudienceLabel audience={mergedAudience} className='bg-white text-dark' border='dark' /> :\n <Badge className='text-shadow' type={BadgeType.Rating} data={SeriesHelper.getRating(props.series)} />\n }\n </div>\n </BaseImage>\n </div>\n );\n}\n","@import '~styles/utils/mixins';\n@import '~styles/utils/include-media';\n:local {\n .partialHeroThumbnail {\n position: relative;\n width: 100%;\n padding-bottom: 56.25%;\n }\n\n .partialSeriesText {\n width: 6.25rem;\n height: 1rem;\n }\n\n .partialVideoTitleText {\n width: 16rem;\n height: 2rem;\n }\n\n .partialBadge {\n width: 4rem;\n height: 1rem;\n }\n\n .partialDescription {\n width: 80%;\n height: 4rem;\n }\n\n .partialSubject {\n width: 6.25rem;\n height: 1.5rem;\n }\n\n .partialHeading {\n height: 1.5rem;\n width: 8.4375rem;\n }\n\n .guidance {\n position: absolute;\n bottom: 0;\n gap: map-get($spacers, 1);\n\n @include media(\"<md\") {\n position: relative;\n }\n }\n\n .responsiveGuidance {\n @include media('>md') {\n @include responsive-guidance-tags;\n }\n\n @include media('<=sm') {\n @include responsive-guidance-tags;\n }\n }\n\n .description {\n @include clamp(4);\n \n @include media(\"<xl\") {\n @include clamp(3);\n }\n \n @include media(\"<md\") {\n display: none;\n }\n }\n\n .details {\n @include media(\"<md\") {\n padding-top: map-get($spacers, 2);\n }\n }\n}","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, LocationContext } from 'libs/analytics/interfaces';\n\nimport { AudienceLabel } from 'libs/shared/components/audience-label/AudienceLabel';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BadgeListContainer } from 'libs/shared/components/badges/BadgeListContainer';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { VideoItemGuidance } from 'libs/shared/components/video-list/components/video-guidance/VideoItemGuidance';\nimport { VideoItemActions } from 'libs/shared/components/video-list/components/video-item-actions/VideoItemActions';\nimport { VideoItemTitle } from 'libs/shared/components/video-list/components/video-item-title/VideoItemTitle';\nimport { VideoSubText } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { PresentationAudience, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './hero-video.module.scss';\n\ninterface HeroVideoProps {\n video: Video;\n presentationAudiences: PresentationAudience[];\n showVideoGuidance: boolean;\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n hideInteractiveBadge?: boolean;\n badgePosition?: 'thumbnail' | 'info-panel';\n titleClassName?: string;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n commonVideoProps: CommonVideoProps;\n showNewVideoIndicator?: boolean;\n}\n\nHeroVideo.defaultProps = {\n newDurationStyle: true,\n badgePosition: 'thumbnail'\n};\n\nexport function HeroVideo(props: HeroVideoProps): JSX.Element {\n const videoAudiences = props.video?.subjectPresentationAudiences?.data;\n const mergedAudience = useMergeAudiences(videoAudiences, props.presentationAudiences);\n\n const analyticsOptions = AnalyticsHelper.mergeOptions(props.analyticsOptions, {\n location: LocationContext.ClassificationHero,\n entity: VideoHelper.getAnalyticsEntity(props.video)\n });\n\n const containerRef = React.useRef(null);\n \n if (!props.video)\n return <></>;\n\n return (\n <Row>\n <Col xs={12} md={6}>\n <div ref={containerRef} >\n <VideoThumbnail\n analyticsOptions={analyticsOptions}\n video={props.video}\n appLink={props.getVideoAppLink?.(props.video, {})}\n imageOptions={{ size: ImageSize.Medium }}\n textPosition={ThumbnailTextPosition.Independent}\n type='static'\n audience={props.badgePosition === 'thumbnail' ? mergedAudience : null}\n hideRating={props.badgePosition === 'thumbnail' ? !!mergedAudience : true}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n </Col>\n <Col xs={12} md={6} className={`${styles.details} position-relative`}>\n <div className='d-flex justify-content-between'>\n <div className='overflow-hidden'>\n <VideoSubText\n type={props.commonVideoProps.subTextType}\n appLink={props.commonVideoProps.getSubTextAppLink?.(props.video)}\n analyticsData={props.analyticsData}\n analyticsOptions={analyticsOptions}\n video={props.video}\n className='text-reset clamp-1'\n />\n <VideoItemTitle\n yearGroups={props.commonVideoProps.yearGroups}\n video={props.video}\n analyticsData={props.analyticsData}\n analyticsOptions={analyticsOptions}\n appLink={props.getVideoAppLink?.(props.video, {})}\n titleSize='h4'\n showNewVideoIndicator={props.showNewVideoIndicator}\n showPadlock={!props.commonVideoProps.hasStudentExperience && !props.commonVideoProps.hasGuestExperience}\n titleClassName={props.titleClassName}\n clampLevel={2}\n />\n </div>\n <VideoItemActions\n analyticsData={props.analyticsData}\n analyticsOptions={analyticsOptions}\n video={props.video}\n />\n </div>\n\n {props.badgePosition === 'info-panel' && (\n <BadgeListContainer className='pb-1'>\n {!props.hideInteractiveBadge && <Badge type={ BadgeType.Interactive } data={props.video.interactives} />}\n <Badge type={ BadgeType.Rating } data={VideoHelper.getRating(props.video)} />\n <Badge type={ BadgeType.ProductionYear } data={props.video.productionYear} />\n </BadgeListContainer>\n )}\n\n <p className='mb-1'><span className={styles.description}>{props.video.description}</span></p>\n \n {props.badgePosition === 'info-panel' && (\n <AudienceLabel\n audience={mergedAudience}\n className='mt-1'\n border='dark'\n />\n )}\n\n {props.showVideoGuidance && (\n <VideoItemGuidance\n video={props.video}\n analyticsData={props.analyticsData}\n analyticsOptions={analyticsOptions}\n containerClassName={`d-flex ${styles.guidance}`}\n responsiveClassName={styles.responsiveGuidance}\n commonVideoProps={props.commonVideoProps}\n />\n )}\n </Col>\n </Row>\n );\n}\n\nexport function PartialHeroVideo(): JSX.Element {\n return (\n <>\n <div className={`partial-loading-background mb-2 ${styles.partialHeading}`} />\n <div className='row pb-3'>\n <div className='col-6 p1'>\n <div className={`${styles.partialHeroThumbnail} partial-loading-background rounded-3`}></div>\n </div>\n <div className='col-6 p1'>\n <div className={`partial-loading-background mb-1 ${styles.partialSeriesText}`}></div>\n <div className={`partial-loading-background my-1 ${styles.partialVideoTitleText}`}></div>\n <div className='d-flex'>\n <div className={`partial-loading-background my-1 me-1 ${styles.partialBadge}`}></div>\n <div className={`partial-loading-background my-1 ms-1 ${styles.partialBadge}`}></div>\n </div>\n <div className={`partial-loading-background my-1 ${styles.partialDescription}`}></div>\n <div className={`partial-loading-background mt-2 ${styles.partialSubject}`}></div>\n </div>\n </div>\n </>\n );\n}\n"],"x_google_ignoreList":[2,3,4,5,6,7],"mappings":"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"}