@clickview/curator 1.101.0-rc.4 → 1.101.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 (61) hide show
  1. package/dist/.vite/manifest.json +475 -475
  2. package/dist/Assets/js/dist/scripts/{Bs1Y6-vh.chunk.js → -OUl3n-W.chunk.js} +2 -2
  3. package/dist/Assets/js/dist/scripts/{Bs1Y6-vh.chunk.js.map → -OUl3n-W.chunk.js.map} +1 -1
  4. package/dist/Assets/js/dist/scripts/5FGdlWcH.chunk.js +9 -0
  5. package/dist/Assets/js/dist/scripts/5FGdlWcH.chunk.js.map +1 -0
  6. package/dist/Assets/js/dist/scripts/B0UOCPE6.chunk.js +2 -0
  7. package/dist/Assets/js/dist/scripts/{r-zw-56e.chunk.js.map → B0UOCPE6.chunk.js.map} +1 -1
  8. package/dist/Assets/js/dist/scripts/{Ds6WvphR2.chunk.js → BD2aIccu2.chunk.js} +2 -2
  9. package/dist/Assets/js/dist/scripts/{Ds6WvphR2.chunk.js.map → BD2aIccu2.chunk.js.map} +1 -1
  10. package/dist/Assets/js/dist/scripts/{BwpzKPd12.chunk.js → BJJeLngO2.chunk.js} +2 -2
  11. package/dist/Assets/js/dist/scripts/{BwpzKPd12.chunk.js.map → BJJeLngO2.chunk.js.map} +1 -1
  12. package/dist/Assets/js/dist/scripts/{CaG8Cjey2.chunk.js → BKQIzKcF2.chunk.js} +2 -2
  13. package/dist/Assets/js/dist/scripts/{CaG8Cjey2.chunk.js.map → BKQIzKcF2.chunk.js.map} +1 -1
  14. package/dist/Assets/js/dist/scripts/{BEw27Jf3.chunk.js → BOrAaHLK.chunk.js} +2 -2
  15. package/dist/Assets/js/dist/scripts/{BEw27Jf3.chunk.js.map → BOrAaHLK.chunk.js.map} +1 -1
  16. package/dist/Assets/js/dist/scripts/BSMzg7zU.chunk.js.map +1 -1
  17. package/dist/Assets/js/dist/scripts/{CO69n5GB2.chunk.js → BUWsFXQp2.chunk.js} +2 -2
  18. package/dist/Assets/js/dist/scripts/{CO69n5GB2.chunk.js.map → BUWsFXQp2.chunk.js.map} +1 -1
  19. package/dist/Assets/js/dist/scripts/{BZU4ADoQ2.chunk.js → C1xOGHlL2.chunk.js} +2 -2
  20. package/dist/Assets/js/dist/scripts/{BZU4ADoQ2.chunk.js.map → C1xOGHlL2.chunk.js.map} +1 -1
  21. package/dist/Assets/js/dist/scripts/{CbaobIxf2.chunk.js → CAo_C8em2.chunk.js} +2 -2
  22. package/dist/Assets/js/dist/scripts/{CbaobIxf2.chunk.js.map → CAo_C8em2.chunk.js.map} +1 -1
  23. package/dist/Assets/js/dist/scripts/{D_e7ctVq.chunk.js → COH92JF5.chunk.js} +2 -2
  24. package/dist/Assets/js/dist/scripts/{D_e7ctVq.chunk.js.map → COH92JF5.chunk.js.map} +1 -1
  25. package/dist/Assets/js/dist/scripts/{CJpr073K.chunk.js → CR-5nCWm.chunk.js} +2 -2
  26. package/dist/Assets/js/dist/scripts/{CJpr073K.chunk.js.map → CR-5nCWm.chunk.js.map} +1 -1
  27. package/dist/Assets/js/dist/scripts/{CqhZ98rZ2.chunk.js → CW1ea_Kx2.chunk.js} +2 -2
  28. package/dist/Assets/js/dist/scripts/{CqhZ98rZ2.chunk.js.map → CW1ea_Kx2.chunk.js.map} +1 -1
  29. package/dist/Assets/js/dist/scripts/{DPA1azNU2.chunk.js → Cbwl04yH2.chunk.js} +2 -2
  30. package/dist/Assets/js/dist/scripts/{DPA1azNU2.chunk.js.map → Cbwl04yH2.chunk.js.map} +1 -1
  31. package/dist/Assets/js/dist/scripts/{DsHVJvUP.chunk.js → CpqMUVVi.chunk.js} +2 -2
  32. package/dist/Assets/js/dist/scripts/{DsHVJvUP.chunk.js.map → CpqMUVVi.chunk.js.map} +1 -1
  33. package/dist/Assets/js/dist/scripts/{I_gdFDV7.chunk.js → CqZqlJSF.chunk.js} +2 -2
  34. package/dist/Assets/js/dist/scripts/{I_gdFDV7.chunk.js.map → CqZqlJSF.chunk.js.map} +1 -1
  35. package/dist/Assets/js/dist/scripts/{CofA9RRF.chunk.js → CzCUe0Ej.chunk.js} +2 -2
  36. package/dist/Assets/js/dist/scripts/{CofA9RRF.chunk.js.map → CzCUe0Ej.chunk.js.map} +1 -1
  37. package/dist/Assets/js/dist/scripts/{DhN_Jc2z.chunk.js → DTUkmChD.chunk.js} +3 -3
  38. package/dist/Assets/js/dist/scripts/{DhN_Jc2z.chunk.js.map → DTUkmChD.chunk.js.map} +1 -1
  39. package/dist/Assets/js/dist/scripts/{C8YkY0we.chunk.js → DW7-la-i.chunk.js} +2 -2
  40. package/dist/Assets/js/dist/scripts/{C8YkY0we.chunk.js.map → DW7-la-i.chunk.js.map} +1 -1
  41. package/dist/Assets/js/dist/scripts/{ecehd0o7.chunk.js → Dhnl-PB5.chunk.js} +2 -2
  42. package/dist/Assets/js/dist/scripts/{ecehd0o7.chunk.js.map → Dhnl-PB5.chunk.js.map} +1 -1
  43. package/dist/Assets/js/dist/scripts/{jdQzplq1.chunk.js → DuU4GBw5.chunk.js} +2 -2
  44. package/dist/Assets/js/dist/scripts/{jdQzplq1.chunk.js.map → DuU4GBw5.chunk.js.map} +1 -1
  45. package/dist/Assets/js/dist/scripts/{CvMpxc4j2.chunk.js → LmwQmHZz2.chunk.js} +2 -2
  46. package/dist/Assets/js/dist/scripts/{CvMpxc4j2.chunk.js.map → LmwQmHZz2.chunk.js.map} +1 -1
  47. package/dist/Assets/js/dist/scripts/{app-D2seXuq-.js → app-DHtN6XkT.js} +3 -3
  48. package/dist/Assets/js/dist/scripts/{app-D2seXuq-.js.map → app-DHtN6XkT.js.map} +1 -1
  49. package/dist/Assets/js/dist/scripts/{DUsXdKYh.chunk.js → eKSK4iyn.chunk.js} +2 -2
  50. package/dist/Assets/js/dist/scripts/{DUsXdKYh.chunk.js.map → eKSK4iyn.chunk.js.map} +1 -1
  51. package/dist/Assets/js/dist/scripts/{BdXsbiX1.chunk.js → esASf9N4.chunk.js} +2 -2
  52. package/dist/Assets/js/dist/scripts/{BdXsbiX1.chunk.js.map → esASf9N4.chunk.js.map} +1 -1
  53. package/dist/Assets/js/dist/scripts/{De-ohgjE.chunk.js → x1pOfdJd.chunk.js} +2 -2
  54. package/dist/Assets/js/dist/scripts/x1pOfdJd.chunk.js.map +1 -0
  55. package/dist/bundles.json +1 -1
  56. package/dist/en.json +1 -1
  57. package/package.json +1 -1
  58. package/dist/Assets/js/dist/scripts/C7Rwn3_U.chunk.js +0 -9
  59. package/dist/Assets/js/dist/scripts/C7Rwn3_U.chunk.js.map +0 -1
  60. package/dist/Assets/js/dist/scripts/De-ohgjE.chunk.js.map +0 -1
  61. package/dist/Assets/js/dist/scripts/r-zw-56e.chunk.js +0 -2
@@ -1,2 +1,2 @@
1
- import{a as e,ln as t,r as n}from"./BlDu0qdC.chunk.js";import{t as r}from"./C7Rwn3_U.chunk.js";import{c as i}from"./BIZf7Q462.chunk.js";import"./COkf8IPk2.chunk.js";import{n as a}from"./DalFHGv7.chunk.js";import{t as o}from"./CzALYUiA.chunk.js";import{t as s}from"./RVXazxrl.chunk.js";import{t as c}from"./BKO1diPb.chunk.js";import{t as l}from"./CVg7lnul.chunk.js";import{t as u}from"./CUVnn-Rk.chunk.js";import{t as d}from"./BHEVDLt9.chunk.js";import{t as f}from"./D_xjtP8a.chunk.js";import{t as p}from"./h8NvpGLQ2.chunk.js";import{t as m}from"./CIep1gDJ2.chunk.js";import{t as h}from"./W4Ji-YW82.chunk.js";var g=t(e()),_={option:`_option_wpjp4_1`},v=n();function y(e){let[t,n]=g.useState(),y=p(e.dashboardId),b=i(l.allowedTemplates(e.widgetTypeId)),x=o.getDashboardTargetInfo(y.data),S=o.isClassificationDashboard(x),C=i(S&&S&&s.classification(x.classificationId)),w=i(u.cvLivePresentation()),T=b?.data?.filter(t=>{if(!y.hasCompleted)return!1;let n=o.getDashboardTargetType(y.data),i=f.getProduct(y.data,w.data?.id,C.data?.presentationId);return r[t.id]?.predicate({targetType:n,product:i,widgetTypeId:e.widgetTypeId,isTopLevelClassification:c.isTopLevelTopic(C.data)})})?.map((e,t)=>({id:e.id,description:e.description,name:r[e.id].displayName??e.name,icon:r[e.id].icon,order:t,fontSize:`sm`,infoComponent:()=>(0,v.jsx)(h,{description:e.description})}));return(0,v.jsxs)(m,{dashboard:y.data,widgetTypeId:e.widgetTypeId,templateId:t,currentStep:`select-template`,children:[(0,v.jsx)(`h2`,{className:`h4`,children:`Select a template`}),b.hasCompleted&&y.hasCompleted?(0,v.jsx)(d,{enableHighlight:!0,iconClassName:_.option,iconSize:`large`,options:T,selectedAction:t,setOption:e=>n(e)}):(0,v.jsx)(`div`,{className:`p-5 text-center`,children:(0,v.jsx)(a,{as:`div`,animation:`border`,role:`status`})})]})}export{y as DashboardWizardSelectTemplateView};
2
- //# sourceMappingURL=DPA1azNU2.chunk.js.map
1
+ import{a as e,ln as t,r as n}from"./BlDu0qdC.chunk.js";import{t as r}from"./5FGdlWcH.chunk.js";import{c as i}from"./BIZf7Q462.chunk.js";import"./COkf8IPk2.chunk.js";import{n as a}from"./DalFHGv7.chunk.js";import{t as o}from"./CzALYUiA.chunk.js";import{t as s}from"./RVXazxrl.chunk.js";import{t as c}from"./BKO1diPb.chunk.js";import{t as l}from"./CVg7lnul.chunk.js";import{t as u}from"./CUVnn-Rk.chunk.js";import{t as d}from"./BHEVDLt9.chunk.js";import{t as f}from"./D_xjtP8a.chunk.js";import{t as p}from"./h8NvpGLQ2.chunk.js";import{t as m}from"./CIep1gDJ2.chunk.js";import{t as h}from"./W4Ji-YW82.chunk.js";var g=t(e()),_={option:`_option_wpjp4_1`},v=n();function y(e){let[t,n]=g.useState(),y=p(e.dashboardId),b=i(l.allowedTemplates(e.widgetTypeId)),x=o.getDashboardTargetInfo(y.data),S=o.isClassificationDashboard(x),C=i(S&&S&&s.classification(x.classificationId)),w=i(u.cvLivePresentation()),T=b?.data?.filter(t=>{if(!y.hasCompleted)return!1;let n=o.getDashboardTargetType(y.data),i=f.getProduct(y.data,w.data?.id,C.data?.presentationId);return r[t.id]?.predicate({targetType:n,product:i,widgetTypeId:e.widgetTypeId,isTopLevelClassification:c.isTopLevelTopic(C.data)})})?.map((e,t)=>({id:e.id,description:e.description,name:r[e.id].displayName??e.name,icon:r[e.id].icon,order:t,fontSize:`sm`,infoComponent:()=>(0,v.jsx)(h,{description:e.description})}));return(0,v.jsxs)(m,{dashboard:y.data,widgetTypeId:e.widgetTypeId,templateId:t,currentStep:`select-template`,children:[(0,v.jsx)(`h2`,{className:`h4`,children:`Select a template`}),b.hasCompleted&&y.hasCompleted?(0,v.jsx)(d,{enableHighlight:!0,iconClassName:_.option,iconSize:`large`,options:T,selectedAction:t,setOption:e=>n(e)}):(0,v.jsx)(`div`,{className:`p-5 text-center`,children:(0,v.jsx)(a,{as:`div`,animation:`border`,role:`status`})})]})}export{y as DashboardWizardSelectTemplateView};
2
+ //# sourceMappingURL=Cbwl04yH2.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DPA1azNU2.chunk.js","names":[],"sources":["../../../../../src/apps/dashboard-editor/views/wizard/dashboard-wizard-select-template/dashboard-wizard-select-template-view.module.scss","../../../../../src/apps/dashboard-editor/views/wizard/dashboard-wizard-select-template/DashboardWizardSelectTemplateView.tsx"],"sourcesContent":[":local {\n .option {\n color: $gray-400;\n }\n}","import React from 'react';\nimport { Spinner } from 'react-bootstrap';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { WizardOptionHash, WizardOptions } from 'libs/shared/components/wizard/options/WizardOptions';\nimport { WidgetTemplateConfig } from 'libs/shared/constants/WidgetTemplateConfig';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { Classification, CuratedWidgetTemplate, Presentation } from 'libs/shared/interfaces';\nimport { CuratedDashboardHelper } from 'libs/shared/utils/DashboardHelper';\nimport { TopicsHelper } from 'libs/shared/utils/topics-helper/TopicsHelper';\n\nimport { DashboardRequests } from 'shared/flight-requests/DashboardRequests';\nimport { SubjectRequests } from 'shared/flight-requests/SubjectRequests';\nimport { DashboardHelper } from 'shared/utils/DashboardHelper';\n\nimport { PresentationRequests } from 'apps/cv-live/flight-requests/CvLivePresentationRequests';\nimport { DashboardWizardLayout } from 'apps/dashboard-editor/components/wizard/layout/DashboardWizardLayout';\nimport { WizardItemDescription } from 'apps/dashboard-editor/components/wizard/wizard-item-description/WizardItemDescription';\nimport { useFetchDashboard } from 'apps/dashboard-editor/hooks/useFetchDashboard';\n\nimport styles from './dashboard-wizard-select-template-view.module.scss';\n\ninterface DashboardWizardSelectTemplateViewProps {\n dashboardId: string;\n widgetTypeId: WidgetTypeId;\n}\n\nexport function DashboardWizardSelectTemplateView(props: DashboardWizardSelectTemplateViewProps): JSX.Element {\n const [ templateId, setTemplateId ] = React.useState<WidgetTemplate>();\n const dashboard = useFetchDashboard(props.dashboardId);\n \n const templates = Flight.useBasicFetch<CuratedWidgetTemplate[]>(\n DashboardRequests.allowedTemplates(props.widgetTypeId)\n );\n\n const targetInfo = CuratedDashboardHelper.getDashboardTargetInfo(dashboard.data);\n const isTopicDashboard = CuratedDashboardHelper.isClassificationDashboard(targetInfo);\n\n const classification = Flight.useBasicFetch<Classification>(isTopicDashboard &&\n isTopicDashboard &&\n SubjectRequests.classification(targetInfo.classificationId));\n\n const cvLivePresentation = Flight.useBasicFetch<Presentation>(\n PresentationRequests.cvLivePresentation()\n );\n\n const options = templates?.data\n ?.filter(template => {\n if (!dashboard.hasCompleted)\n return false;\n\n const target = CuratedDashboardHelper.getDashboardTargetType(dashboard.data);\n const product = DashboardHelper.getProduct(\n dashboard.data,\n cvLivePresentation.data?.id,\n classification.data?.presentationId\n );\n\n return WidgetTemplateConfig[template.id]?.predicate({\n targetType: target,\n product,\n widgetTypeId: props.widgetTypeId,\n isTopLevelClassification: TopicsHelper.isTopLevelTopic(classification.data)\n });\n })\n ?.map<WizardOptionHash<WidgetTemplate>>((template, idx) => ({\n id: template.id,\n description: template.description,\n name: WidgetTemplateConfig[template.id].displayName ?? template.name,\n icon: WidgetTemplateConfig[template.id].icon,\n order: idx,\n fontSize: 'sm',\n infoComponent: () => (\n <WizardItemDescription description={template.description} />\n )\n }));\n\n return (\n <DashboardWizardLayout\n dashboard={dashboard.data}\n widgetTypeId={props.widgetTypeId}\n templateId={templateId}\n currentStep='select-template'\n >\n <h2 className='h4'>\n Select a template\n </h2>\n {!(templates.hasCompleted && dashboard.hasCompleted) ? (\n <div className='p-5 text-center'>\n <Spinner as='div' animation='border' role='status' />\n </div>\n ) : (\n <WizardOptions\n enableHighlight\n iconClassName={styles.option}\n iconSize='large'\n options={options}\n selectedAction={templateId}\n setOption={action => setTemplateId(action)}\n />\n )}\n </DashboardWizardLayout>\n );\n}\n"],"mappings":"gpBC6BA,SAAgB,EAAkC,EAA4D,CAC5G,GAAM,CAAE,EAAY,GAAA,EAAwB,SAAyB,EAC/D,EAAY,EAAkB,EAAM,WAAW,EAE/C,EAAY,EAChB,EAAkB,iBAAiB,EAAM,YAAY,CACvD,EAEM,EAAa,EAAuB,uBAAuB,EAAU,IAAI,EACzE,EAAmB,EAAuB,0BAA0B,CAAU,EAE9E,EAAiB,EAAqC,GAC1D,GACA,EAAgB,eAAe,EAAW,gBAAgB,CAAC,EAEvD,EAAqB,EACzB,EAAqB,mBAAmB,CAC1C,EAEM,EAAU,GAAW,MACvB,OAAO,GAAY,CACnB,GAAI,CAAC,EAAU,aACb,MAAO,GAET,IAAM,EAAS,EAAuB,uBAAuB,EAAU,IAAI,EACrE,EAAU,EAAgB,WAC9B,EAAU,KACV,EAAmB,MAAM,GACzB,EAAe,MAAM,cACvB,EAEA,OAAO,EAAqB,EAAS,GAAG,EAAE,UAAU,CAClD,WAAY,EACZ,UACA,aAAc,EAAM,aACpB,yBAA0B,EAAa,gBAAgB,EAAe,IAAI,CAC5E,CAAC,CACH,CAAC,CAAC,EACA,KAAuC,EAAU,KAAS,CAC1D,GAAI,EAAS,GACb,YAAa,EAAS,YACtB,KAAM,EAAqB,EAAS,GAAG,CAAC,aAAe,EAAS,KAChE,KAAM,EAAqB,EAAS,GAAG,CAAC,KACxC,MAAO,EACP,SAAU,KACV,mBACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAuB,YAAa,EAAS,WAAc,CAAA,CAE/D,EAAE,EAEJ,OACE,EAAA,EAAA,KAAA,CAAC,EAAD,CACE,UAAW,EAAU,KACrB,aAAc,EAAM,aACR,aACZ,YAAY,2BAJd,EAME,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAU,cAAK,mBAEf,CAAA,EACD,EAAU,cAAgB,EAAU,cAKrC,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,gBAAA,GACA,cAAe,EAAO,OACtB,SAAS,QACA,UACT,eAAgB,EAChB,UAAW,GAAU,EAAc,CAAM,CAC1C,CAAA,GAXD,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,4BACb,EAAA,EAAA,IAAA,CAAC,EAAD,CAAS,GAAG,MAAM,UAAU,SAAS,KAAK,QAAU,CAAA,CACjD,CAAA,CAWc,GAE3B"}
1
+ {"version":3,"file":"Cbwl04yH2.chunk.js","names":[],"sources":["../../../../../src/apps/dashboard-editor/views/wizard/dashboard-wizard-select-template/dashboard-wizard-select-template-view.module.scss","../../../../../src/apps/dashboard-editor/views/wizard/dashboard-wizard-select-template/DashboardWizardSelectTemplateView.tsx"],"sourcesContent":[":local {\n .option {\n color: $gray-400;\n }\n}","import React from 'react';\nimport { Spinner } from 'react-bootstrap';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { WizardOptionHash, WizardOptions } from 'libs/shared/components/wizard/options/WizardOptions';\nimport { WidgetTemplateConfig } from 'libs/shared/constants/WidgetTemplateConfig';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { Classification, CuratedWidgetTemplate, Presentation } from 'libs/shared/interfaces';\nimport { CuratedDashboardHelper } from 'libs/shared/utils/DashboardHelper';\nimport { TopicsHelper } from 'libs/shared/utils/topics-helper/TopicsHelper';\n\nimport { DashboardRequests } from 'shared/flight-requests/DashboardRequests';\nimport { SubjectRequests } from 'shared/flight-requests/SubjectRequests';\nimport { DashboardHelper } from 'shared/utils/DashboardHelper';\n\nimport { PresentationRequests } from 'apps/cv-live/flight-requests/CvLivePresentationRequests';\nimport { DashboardWizardLayout } from 'apps/dashboard-editor/components/wizard/layout/DashboardWizardLayout';\nimport { WizardItemDescription } from 'apps/dashboard-editor/components/wizard/wizard-item-description/WizardItemDescription';\nimport { useFetchDashboard } from 'apps/dashboard-editor/hooks/useFetchDashboard';\n\nimport styles from './dashboard-wizard-select-template-view.module.scss';\n\ninterface DashboardWizardSelectTemplateViewProps {\n dashboardId: string;\n widgetTypeId: WidgetTypeId;\n}\n\nexport function DashboardWizardSelectTemplateView(props: DashboardWizardSelectTemplateViewProps): JSX.Element {\n const [ templateId, setTemplateId ] = React.useState<WidgetTemplate>();\n const dashboard = useFetchDashboard(props.dashboardId);\n \n const templates = Flight.useBasicFetch<CuratedWidgetTemplate[]>(\n DashboardRequests.allowedTemplates(props.widgetTypeId)\n );\n\n const targetInfo = CuratedDashboardHelper.getDashboardTargetInfo(dashboard.data);\n const isTopicDashboard = CuratedDashboardHelper.isClassificationDashboard(targetInfo);\n\n const classification = Flight.useBasicFetch<Classification>(isTopicDashboard &&\n isTopicDashboard &&\n SubjectRequests.classification(targetInfo.classificationId));\n\n const cvLivePresentation = Flight.useBasicFetch<Presentation>(\n PresentationRequests.cvLivePresentation()\n );\n\n const options = templates?.data\n ?.filter(template => {\n if (!dashboard.hasCompleted)\n return false;\n\n const target = CuratedDashboardHelper.getDashboardTargetType(dashboard.data);\n const product = DashboardHelper.getProduct(\n dashboard.data,\n cvLivePresentation.data?.id,\n classification.data?.presentationId\n );\n\n return WidgetTemplateConfig[template.id]?.predicate({\n targetType: target,\n product,\n widgetTypeId: props.widgetTypeId,\n isTopLevelClassification: TopicsHelper.isTopLevelTopic(classification.data)\n });\n })\n ?.map<WizardOptionHash<WidgetTemplate>>((template, idx) => ({\n id: template.id,\n description: template.description,\n name: WidgetTemplateConfig[template.id].displayName ?? template.name,\n icon: WidgetTemplateConfig[template.id].icon,\n order: idx,\n fontSize: 'sm',\n infoComponent: () => (\n <WizardItemDescription description={template.description} />\n )\n }));\n\n return (\n <DashboardWizardLayout\n dashboard={dashboard.data}\n widgetTypeId={props.widgetTypeId}\n templateId={templateId}\n currentStep='select-template'\n >\n <h2 className='h4'>\n Select a template\n </h2>\n {!(templates.hasCompleted && dashboard.hasCompleted) ? (\n <div className='p-5 text-center'>\n <Spinner as='div' animation='border' role='status' />\n </div>\n ) : (\n <WizardOptions\n enableHighlight\n iconClassName={styles.option}\n iconSize='large'\n options={options}\n selectedAction={templateId}\n setOption={action => setTemplateId(action)}\n />\n )}\n </DashboardWizardLayout>\n );\n}\n"],"mappings":"gpBC6BA,SAAgB,EAAkC,EAA4D,CAC5G,GAAM,CAAE,EAAY,GAAA,EAAwB,SAAyB,EAC/D,EAAY,EAAkB,EAAM,WAAW,EAE/C,EAAY,EAChB,EAAkB,iBAAiB,EAAM,YAAY,CACvD,EAEM,EAAa,EAAuB,uBAAuB,EAAU,IAAI,EACzE,EAAmB,EAAuB,0BAA0B,CAAU,EAE9E,EAAiB,EAAqC,GAC1D,GACA,EAAgB,eAAe,EAAW,gBAAgB,CAAC,EAEvD,EAAqB,EACzB,EAAqB,mBAAmB,CAC1C,EAEM,EAAU,GAAW,MACvB,OAAO,GAAY,CACnB,GAAI,CAAC,EAAU,aACb,MAAO,GAET,IAAM,EAAS,EAAuB,uBAAuB,EAAU,IAAI,EACrE,EAAU,EAAgB,WAC9B,EAAU,KACV,EAAmB,MAAM,GACzB,EAAe,MAAM,cACvB,EAEA,OAAO,EAAqB,EAAS,GAAG,EAAE,UAAU,CAClD,WAAY,EACZ,UACA,aAAc,EAAM,aACpB,yBAA0B,EAAa,gBAAgB,EAAe,IAAI,CAC5E,CAAC,CACH,CAAC,CAAC,EACA,KAAuC,EAAU,KAAS,CAC1D,GAAI,EAAS,GACb,YAAa,EAAS,YACtB,KAAM,EAAqB,EAAS,GAAG,CAAC,aAAe,EAAS,KAChE,KAAM,EAAqB,EAAS,GAAG,CAAC,KACxC,MAAO,EACP,SAAU,KACV,mBACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAuB,YAAa,EAAS,WAAc,CAAA,CAE/D,EAAE,EAEJ,OACE,EAAA,EAAA,KAAA,CAAC,EAAD,CACE,UAAW,EAAU,KACrB,aAAc,EAAM,aACR,aACZ,YAAY,2BAJd,EAME,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAU,cAAK,mBAEf,CAAA,EACD,EAAU,cAAgB,EAAU,cAKrC,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,gBAAA,GACA,cAAe,EAAO,OACtB,SAAS,QACA,UACT,eAAgB,EAChB,UAAW,GAAU,EAAc,CAAM,CAC1C,CAAA,GAXD,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,4BACb,EAAA,EAAA,IAAA,CAAC,EAAD,CAAS,GAAG,MAAM,UAAU,SAAS,KAAK,QAAU,CAAA,CACjD,CAAA,CAWc,GAE3B"}
@@ -1,2 +1,2 @@
1
- import{a as e,ln as t,r as n}from"./BlDu0qdC.chunk.js";import{n as r,r as i,t as a}from"./DqUkhPat.chunk.js";import{x as o}from"./C7Rwn3_U.chunk.js";import{H as s}from"./BjSaXG862.chunk.js";import{c,d as l}from"./BIZf7Q462.chunk.js";import"./COkf8IPk2.chunk.js";import{t as u}from"./Bt5qHBoM2.chunk.js";import{n as d,t as f}from"./DyKk_C_Y.chunk.js";import{t as p}from"./CVBPygL42.chunk.js";import{t as m}from"./Dpe4Jbky2.chunk.js";import{t as h}from"./wbPvk2s42.chunk.js";import{t as g}from"./lRFOmERf2.chunk.js";import{t as _}from"./Hprw1_Va.chunk.js";import{d as v,i as y,n as b,r as x}from"./CHZfdgw6.chunk.js";import{t as S}from"./CQNIee51.chunk.js";import{t as C}from"./CRX0R26k2.chunk.js";import{t as w}from"./CZYfGOZQ2.chunk.js";import{t as T}from"./CoqIP93V2.chunk.js";import{t as E}from"./B2JmsSAI2.chunk.js";import{t as D}from"./BZU4ADoQ2.chunk.js";var O=t(e(),1),k=t(s(),1),A={row:`_row_18op7_1`,index:`_index_18op7_1`,handle:`_handle_18op7_4`,name:`_name_18op7_17`},j=n();function M(e){let{partner:t,onRemove:n,index:a}=e,{setNodeRef:o,transform:s,transition:c,listeners:l,attributes:u}=y({id:t.id});return(0,j.jsxs)(`div`,{ref:o,style:{transform:v.Transform.toString(s),transition:c,touchAction:`none`},className:(0,k.default)(A.row,`d-flex align-items-center py-2 bg-white border-bottom`),...u,...l,children:[(0,j.jsx)(`span`,{className:(0,k.default)(A.handle,`user-select-none mb-3 me-1`),children:(0,j.jsx)(r,{svg:C,size:i.XXS})}),(0,j.jsx)(`span`,{className:(0,k.default)(A.index,`me-2`),children:a+1}),(0,j.jsx)(`span`,{className:(0,k.default)(A.name,`flex-grow-1 text-truncate px-1`),children:t.name}),(0,j.jsx)(m,{svg:_,className:`text-danger`,onClick:()=>n(t.id)})]})}var N={sidebar:`_sidebar_1mh5y_1`,regionItem:`_regionItem_1mh5y_4`,active:`_active_1mh5y_7`,main:`_main_1mh5y_10`,dragOverlay:`_dragOverlay_1mh5y_14`},P=18,F=6;function I(e,t){return t.map((t,n)=>({contentRegion:e,index:n,partnerProfileId:t.id}))}function L(){let e=l(),t=E(),n=p(),i=c(T.contentRegions()),s=[...i.data?.data??[]].sort((e,t)=>e.name.localeCompare(t.name))??[],m=c(u.currentUser()),[_,v]=(0,O.useState)([]),[y,C]=(0,O.useState)(null),A=c(y&&w.getFeaturedChannelsForRegion(y));if(O.useEffect(()=>{A.hasCompleted&&v(A.data??[])},[A.hasCompleted,y]),O.useEffect(()=>{y||C(i.data?.data?.[0]?.systemName??null)},[i.hasCompleted]),!i.hasCompleted||!m.hasCompleted)return(0,j.jsx)(h,{});let L=s.find(e=>e.systemName===y)??null,R=new Set(_.map(e=>e.id)),z=_.length>=P,B=_.length<F;function V(e){C(e),v([])}async function H(t){if(R.has(t.id))return;let n=await e(w.getContentPartner(t.id));v(e=>[...e,n])}function U(e){v(t=>t.filter(t=>t.id!==e))}function W(e){let{active:t,over:n}=e;!n||t.id===n.id||v(e=>{let r=e.findIndex(e=>e.id?.toString()===t.id.toString()),i=e.findIndex(e=>e.id?.toString()===n.id.toString());return r===-1||i===-1?e:x(e,r,i)})}async function G(){if(!(!y||B))try{await e(w.updateFeaturedChannelsForRegion(y,I(y,_))),n.success(`Featured channels updated successfully`)}catch{n.error(`Failed to update featured channels`)}}return(0,j.jsxs)(`div`,{className:`d-flex gap-3`,children:[(0,j.jsxs)(`div`,{className:(0,k.default)(N.sidebar,`flex-shrink-0`),children:[(0,j.jsx)(`div`,{className:`mb-2`,children:(0,j.jsxs)(a,{appLink:t.contentPartners(),className:`text-secondary d-flex align-items-center`,children:[(0,j.jsx)(r,{svg:S}),`Channels`]})}),(0,j.jsx)(`h6`,{className:`mb-3`,children:`Regions`}),(0,j.jsx)(`ul`,{className:`list-unstyled m-0`,children:s.map(e=>(0,j.jsx)(`li`,{className:(0,k.default)(N.regionItem,{[N.active]:e.systemName===y},`cursor-pointer d-flex align-items-center rounded-1 user-select-none p-2`),onClick:()=>V(e.systemName),children:e.name},e.id))})]}),(0,j.jsx)(`div`,{className:N.main,children:L?(0,j.jsxs)(j.Fragment,{children:[(0,j.jsxs)(`h3`,{className:`mb-3`,children:[`Featured Channels — `,L.name]}),(0,j.jsxs)(`div`,{className:`my-3`,children:[(0,j.jsx)(g,{disabled:z,placeholder:`Search for a channel to add`,onSuggestionSelected:H,getRemoteUrl:()=>`/api/search/v4/search?userId=${m.data?.id}&customerId=${m.data?.customerId}&searchAllChannels=true`,getRemotePostBody:e=>({query:e,indices:[{index:`partner_profile`}],searchType:`content`}),formatRemoteSuggestions:e=>e.results,activationLength:0,clearQueryOnSelect:!0,shouldUpdateQueryOnSelection:!1,renderAsForm:!1}),z&&(0,j.jsxs)(`p`,{className:`text-secondary mt-2 mb-0 small`,children:[`Maximum of `,P,` featured channels reached. Remove a channel before adding a new one.`]})]}),_.length>0?(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`p`,{className:`text-secondary mb-0`,children:`Drag and drop to reorder`}),(0,j.jsx)(b,{ids:_.map(e=>e.id),onSortEnd:W,getDragOverlay:e=>{let t=_.find(t=>t.id===e);return(0,j.jsx)(`div`,{className:(0,k.default)(N.dragOverlay,`bg-white rounded-1 border`),children:t?.name})},children:_.map((e,t)=>(0,j.jsx)(M,{partner:e,index:t,onRemove:U},e.id))})]}):(0,j.jsx)(`p`,{className:`text-secondary mt-2`,children:`No featured channels. Add one using the search above.`}),(0,j.jsxs)(`div`,{className:`mt-4`,children:[(0,j.jsx)(`h4`,{className:`mb-4`,children:`Preview`}),_.length>0?(0,j.jsx)(D,{content:_,templateId:d.RectangularLogoSlidingList,widgetTypeId:f.SpotlightContentPartners,description:``,name:``,id:`featured-channels`,metadata:{},location:`curator`}):(0,j.jsx)(o,{isPreviewing:!0})]}),(0,j.jsxs)(`div`,{className:`mt-3 text-end`,children:[B&&(0,j.jsxs)(`p`,{className:`text-secondary mb-2 small`,children:[`A minimum of `,F,` featured channels is required.`]}),(0,j.jsx)(`button`,{type:`button`,className:`btn btn-dark`,disabled:B,onClick:G,children:`Save`})]})]}):(0,j.jsx)(`p`,{className:`text-secondary mt-2`,children:`Select a region to manage its featured channels.`})})]})}export{L as ManageFeaturedChannelsView};
2
- //# sourceMappingURL=DsHVJvUP.chunk.js.map
1
+ import{a as e,ln as t,r as n}from"./BlDu0qdC.chunk.js";import{n as r,r as i,t as a}from"./DqUkhPat.chunk.js";import{x as o}from"./5FGdlWcH.chunk.js";import{H as s}from"./BjSaXG862.chunk.js";import{c,d as l}from"./BIZf7Q462.chunk.js";import"./COkf8IPk2.chunk.js";import{t as u}from"./Bt5qHBoM2.chunk.js";import{n as d,t as f}from"./DyKk_C_Y.chunk.js";import{t as p}from"./CVBPygL42.chunk.js";import{t as m}from"./Dpe4Jbky2.chunk.js";import{t as h}from"./wbPvk2s42.chunk.js";import{t as g}from"./lRFOmERf2.chunk.js";import{t as _}from"./Hprw1_Va.chunk.js";import{d as v,i as y,n as b,r as x}from"./CHZfdgw6.chunk.js";import{t as S}from"./CQNIee51.chunk.js";import{t as C}from"./CRX0R26k2.chunk.js";import{t as w}from"./CZYfGOZQ2.chunk.js";import{t as T}from"./CoqIP93V2.chunk.js";import{t as E}from"./B2JmsSAI2.chunk.js";import{t as D}from"./C1xOGHlL2.chunk.js";var O=t(e(),1),k=t(s(),1),A={row:`_row_18op7_1`,index:`_index_18op7_1`,handle:`_handle_18op7_4`,name:`_name_18op7_17`},j=n();function M(e){let{partner:t,onRemove:n,index:a}=e,{setNodeRef:o,transform:s,transition:c,listeners:l,attributes:u}=y({id:t.id});return(0,j.jsxs)(`div`,{ref:o,style:{transform:v.Transform.toString(s),transition:c,touchAction:`none`},className:(0,k.default)(A.row,`d-flex align-items-center py-2 bg-white border-bottom`),...u,...l,children:[(0,j.jsx)(`span`,{className:(0,k.default)(A.handle,`user-select-none mb-3 me-1`),children:(0,j.jsx)(r,{svg:C,size:i.XXS})}),(0,j.jsx)(`span`,{className:(0,k.default)(A.index,`me-2`),children:a+1}),(0,j.jsx)(`span`,{className:(0,k.default)(A.name,`flex-grow-1 text-truncate px-1`),children:t.name}),(0,j.jsx)(m,{svg:_,className:`text-danger`,onClick:()=>n(t.id)})]})}var N={sidebar:`_sidebar_1mh5y_1`,regionItem:`_regionItem_1mh5y_4`,active:`_active_1mh5y_7`,main:`_main_1mh5y_10`,dragOverlay:`_dragOverlay_1mh5y_14`},P=18,F=6;function I(e,t){return t.map((t,n)=>({contentRegion:e,index:n,partnerProfileId:t.id}))}function L(){let e=l(),t=E(),n=p(),i=c(T.contentRegions()),s=[...i.data?.data??[]].sort((e,t)=>e.name.localeCompare(t.name))??[],m=c(u.currentUser()),[_,v]=(0,O.useState)([]),[y,C]=(0,O.useState)(null),A=c(y&&w.getFeaturedChannelsForRegion(y));if(O.useEffect(()=>{A.hasCompleted&&v(A.data??[])},[A.hasCompleted,y]),O.useEffect(()=>{y||C(i.data?.data?.[0]?.systemName??null)},[i.hasCompleted]),!i.hasCompleted||!m.hasCompleted)return(0,j.jsx)(h,{});let L=s.find(e=>e.systemName===y)??null,R=new Set(_.map(e=>e.id)),z=_.length>=P,B=_.length<F;function V(e){C(e),v([])}async function H(t){if(R.has(t.id))return;let n=await e(w.getContentPartner(t.id));v(e=>[...e,n])}function U(e){v(t=>t.filter(t=>t.id!==e))}function W(e){let{active:t,over:n}=e;!n||t.id===n.id||v(e=>{let r=e.findIndex(e=>e.id?.toString()===t.id.toString()),i=e.findIndex(e=>e.id?.toString()===n.id.toString());return r===-1||i===-1?e:x(e,r,i)})}async function G(){if(!(!y||B))try{await e(w.updateFeaturedChannelsForRegion(y,I(y,_))),n.success(`Featured channels updated successfully`)}catch{n.error(`Failed to update featured channels`)}}return(0,j.jsxs)(`div`,{className:`d-flex gap-3`,children:[(0,j.jsxs)(`div`,{className:(0,k.default)(N.sidebar,`flex-shrink-0`),children:[(0,j.jsx)(`div`,{className:`mb-2`,children:(0,j.jsxs)(a,{appLink:t.contentPartners(),className:`text-secondary d-flex align-items-center`,children:[(0,j.jsx)(r,{svg:S}),`Channels`]})}),(0,j.jsx)(`h6`,{className:`mb-3`,children:`Regions`}),(0,j.jsx)(`ul`,{className:`list-unstyled m-0`,children:s.map(e=>(0,j.jsx)(`li`,{className:(0,k.default)(N.regionItem,{[N.active]:e.systemName===y},`cursor-pointer d-flex align-items-center rounded-1 user-select-none p-2`),onClick:()=>V(e.systemName),children:e.name},e.id))})]}),(0,j.jsx)(`div`,{className:N.main,children:L?(0,j.jsxs)(j.Fragment,{children:[(0,j.jsxs)(`h3`,{className:`mb-3`,children:[`Featured Channels — `,L.name]}),(0,j.jsxs)(`div`,{className:`my-3`,children:[(0,j.jsx)(g,{disabled:z,placeholder:`Search for a channel to add`,onSuggestionSelected:H,getRemoteUrl:()=>`/api/search/v4/search?userId=${m.data?.id}&customerId=${m.data?.customerId}&searchAllChannels=true`,getRemotePostBody:e=>({query:e,indices:[{index:`partner_profile`}],searchType:`content`}),formatRemoteSuggestions:e=>e.results,activationLength:0,clearQueryOnSelect:!0,shouldUpdateQueryOnSelection:!1,renderAsForm:!1}),z&&(0,j.jsxs)(`p`,{className:`text-secondary mt-2 mb-0 small`,children:[`Maximum of `,P,` featured channels reached. Remove a channel before adding a new one.`]})]}),_.length>0?(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`p`,{className:`text-secondary mb-0`,children:`Drag and drop to reorder`}),(0,j.jsx)(b,{ids:_.map(e=>e.id),onSortEnd:W,getDragOverlay:e=>{let t=_.find(t=>t.id===e);return(0,j.jsx)(`div`,{className:(0,k.default)(N.dragOverlay,`bg-white rounded-1 border`),children:t?.name})},children:_.map((e,t)=>(0,j.jsx)(M,{partner:e,index:t,onRemove:U},e.id))})]}):(0,j.jsx)(`p`,{className:`text-secondary mt-2`,children:`No featured channels. Add one using the search above.`}),(0,j.jsxs)(`div`,{className:`mt-4`,children:[(0,j.jsx)(`h4`,{className:`mb-4`,children:`Preview`}),_.length>0?(0,j.jsx)(D,{content:_,templateId:d.RectangularLogoSlidingList,widgetTypeId:f.SpotlightContentPartners,description:``,name:``,id:`featured-channels`,metadata:{},location:`curator`}):(0,j.jsx)(o,{isPreviewing:!0})]}),(0,j.jsxs)(`div`,{className:`mt-3 text-end`,children:[B&&(0,j.jsxs)(`p`,{className:`text-secondary mb-2 small`,children:[`A minimum of `,F,` featured channels is required.`]}),(0,j.jsx)(`button`,{type:`button`,className:`btn btn-dark`,disabled:B,onClick:G,children:`Save`})]})]}):(0,j.jsx)(`p`,{className:`text-secondary mt-2`,children:`Select a region to manage its featured channels.`})})]})}export{L as ManageFeaturedChannelsView};
2
+ //# sourceMappingURL=CpqMUVVi.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DsHVJvUP.chunk.js","names":[],"sources":["../../../../../src/apps/content-partners/views/manage-featured-channels/components/featured-channel-row.module.scss","../../../../../src/apps/content-partners/views/manage-featured-channels/components/FeaturedChannelRow.tsx","../../../../../src/apps/content-partners/views/manage-featured-channels/manage-featured-channels-view.module.scss","../../../../../src/apps/content-partners/views/manage-featured-channels/ManageFeaturedChannelsView.tsx"],"sourcesContent":[":local {\n .row {\n &:hover .index {\n display: none;\n }\n\n &:hover .handle {\n display: flex;\n }\n }\n\n .index {\n display: flex;\n }\n\n .handle {\n display: none;\n cursor: grab;\n\n &:active {\n cursor: grabbing;\n }\n }\n\n .name {\n min-width: 0;\n }\n}","import React from 'react';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport classnames from 'classnames';\n\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { DeleteSvg } from 'libs/shared/images/svg/actions/DeleteSvg';\nimport { HandleSvg } from 'libs/shared/images/svg/objects/HandleSvg';\nimport { PartnerProfile } from 'libs/shared/interfaces';\n\nimport styles from './featured-channel-row.module.scss';\n\ninterface FeaturedChannelRowProps {\n partner: PartnerProfile;\n onRemove: (id: string) => void;\n index: number;\n}\n\nexport function FeaturedChannelRow(props: FeaturedChannelRowProps): JSX.Element {\n const { partner, onRemove, index } = props;\n const { setNodeRef, transform, transition, listeners, attributes } = useSortable({ id: partner.id });\n\n const style: React.CSSProperties = {\n transform: CSS.Transform.toString(transform),\n transition,\n touchAction: 'none'\n };\n\n return (\n <div ref={setNodeRef} style={style} className={classnames(styles.row, 'd-flex align-items-center py-2 bg-white border-bottom')} {...attributes} {...listeners}>\n <span className={classnames(styles.handle, 'user-select-none mb-3 me-1')}>\n <SvgContainer svg={HandleSvg} size={SvgContainerSize.XXS} />\n </span>\n <span className={classnames(styles.index, 'me-2')}>{index + 1}</span>\n <span className={classnames(styles.name, 'flex-grow-1 text-truncate px-1')}>{partner.name}</span>\n <IconButton\n svg={DeleteSvg}\n className='text-danger'\n onClick={() => onRemove(partner.id)}\n />\n </div>\n );\n}\n",":local {\n .sidebar {\n width: 12rem;\n }\n\n .regionItem {\n &:hover {\n background-color: $white;\n }\n\n &.active {\n background-color: $gray-100;\n }\n }\n\n .main {\n flex: 1;\n min-width: 0;\n }\n\n .dragOverlay {\n padding: 0.5rem 0.75rem;\n box-shadow: 0 0.25rem 1.3rem rgba($black, 0.1);\n opacity: 0.9;\n }\n}","import React, { useState } from 'react';\nimport { DragEndEvent } from '@dnd-kit/core';\nimport { arrayMove } from '@dnd-kit/sortable';\nimport classnames from 'classnames';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { PopupLoadingSpinner } from 'libs/shared/components/popup/PopupLoadingSpinner';\nimport { SearchBar } from 'libs/shared/components/search-bar/SearchBar';\nimport { SortableContainerWrapper } from 'libs/shared/components/sortable/SortableContainerWrapper';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { PartialRectangularLogoSlidingListWidgetTemplate } from 'libs/shared/components/widgets/curated-widgets/templates/rectangular-logo-sliding-list/partial-loading/PartialRectangularLogoSlidingList';\nimport { WidgetContainerView } from 'libs/shared/components/widgets/curated-widgets/WidgetContainerView';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { ChevronLeftSvg } from 'libs/shared/images/svg/arrows/ChevronLeftSvg';\nimport {\n ContentRegionCollection,\n ContentRegionObject,\n CurrentUser,\n PartnerProfile\n} from 'libs/shared/interfaces';\n\nimport { ContentRegionRequests } from 'shared/flight-requests/ContentRegionRequests';\n\nimport { ContentPartnerRequests } from 'apps/content-partners/flight-requests/ContentPartnerRequests';\nimport { PinnedContentPartner } from 'apps/content-partners/interfaces/PinnedContentPartner';\nimport { getContentPartnerAppLinks } from 'apps/content-partners/utils/getContentPartnerAppLinks';\n\nimport { FeaturedChannelRow } from './components/FeaturedChannelRow';\n\nimport styles from './manage-featured-channels-view.module.scss';\n\nconst MAX_FEATURED_CHANNELS = 18;\nconst MIN_FEATURED_CHANNELS = 6;\n\nfunction buildSortedChannels(contentRegion: string, channels: PartnerProfile[]): PinnedContentPartner[] {\n return channels.map((channel, index) => ({\n contentRegion,\n index,\n partnerProfileId: channel.id\n }));\n}\n\nexport function ManageFeaturedChannelsView(): JSX.Element {\n const fetchAsync = Flight.useGetFetchAsync();\n const appLinks = getContentPartnerAppLinks();\n const alerts = useAlerts();\n\n const regionsResponse = Flight.useBasicFetch<ContentRegionCollection>(\n ContentRegionRequests.contentRegions()\n );\n const regions: ContentRegionObject[] = [...(regionsResponse.data?.data ?? [])]\n .sort((a, b) => a.name.localeCompare(b.name)) ?? [];\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const [ featuredChannels, setFeaturedChannels ] = useState<PartnerProfile[]>([]);\n const [ selectedRegionSystemName, setSelectedRegionSystemName ] = useState<string | null>(null);\n const pinnedPartners = Flight.useBasicFetch<PartnerProfile[]>(\n selectedRegionSystemName && ContentPartnerRequests.getFeaturedChannelsForRegion(selectedRegionSystemName)\n );\n\n React.useEffect(() => {\n if (!pinnedPartners.hasCompleted) return;\n setFeaturedChannels(pinnedPartners.data ?? []);\n }, [ pinnedPartners.hasCompleted, selectedRegionSystemName ]);\n\n React.useEffect(() => {\n if (!selectedRegionSystemName) {\n setSelectedRegionSystemName(regionsResponse.data?.data?.[0]?.systemName ?? null);\n }\n }, [regionsResponse.hasCompleted]);\n\n if (!regionsResponse.hasCompleted || !currentUser.hasCompleted) {\n return <PopupLoadingSpinner />;\n }\n\n const selectedRegion = regions.find(r => r.systemName === selectedRegionSystemName) ?? null;\n const featuredIds = new Set(featuredChannels.map(p => p.id));\n const isAtMaxCapacity = featuredChannels.length >= MAX_FEATURED_CHANNELS;\n const isBelowMinCapacity = featuredChannels.length < MIN_FEATURED_CHANNELS;\n\n function handleSelectRegion(systemName: string): void {\n setSelectedRegionSystemName(systemName);\n setFeaturedChannels([]);\n }\n\n async function handleAddPartner(partner: PartnerProfile): Promise<void> {\n if (featuredIds.has(partner.id)) return;\n // fetch the full content partner object to render the preview\n const fullProfile = await fetchAsync<PartnerProfile>(ContentPartnerRequests.getContentPartner(partner.id));\n setFeaturedChannels(prev => [ ...prev, fullProfile ]);\n }\n\n function handleRemove(partnerId: string): void {\n setFeaturedChannels(prev => prev.filter(p => p.id !== partnerId));\n }\n\n function handleSortEnd(event: DragEndEvent): void {\n const { active, over } = event;\n if (!over || active.id === over.id) return;\n\n setFeaturedChannels(prev => {\n const oldIndex = prev.findIndex(p => p.id?.toString() === active.id.toString());\n const newIndex = prev.findIndex(p => p.id?.toString() === over.id.toString());\n if (oldIndex === -1 || newIndex === -1) return prev;\n return arrayMove(prev, oldIndex, newIndex);\n });\n }\n\n async function handleSave(): Promise<void> {\n if (!selectedRegionSystemName || isBelowMinCapacity) return;\n try {\n await fetchAsync(ContentPartnerRequests.updateFeaturedChannelsForRegion(\n selectedRegionSystemName,\n buildSortedChannels(selectedRegionSystemName, featuredChannels)\n ));\n alerts.success('Featured channels updated successfully');\n } catch {\n alerts.error('Failed to update featured channels');\n }\n }\n\n return (\n <div className='d-flex gap-3'>\n <div className={classnames(styles.sidebar, 'flex-shrink-0')}>\n <div className='mb-2'>\n <AppLink appLink={appLinks.contentPartners()} className='text-secondary d-flex align-items-center'>\n <SvgContainer svg={ChevronLeftSvg} />\n Channels\n </AppLink>\n </div>\n <h6 className='mb-3'>Regions</h6>\n <ul className='list-unstyled m-0'>\n {regions.map(region => (\n <li\n key={region.id}\n className={classnames(styles.regionItem, { [styles.active]: region.systemName === selectedRegionSystemName }, 'cursor-pointer d-flex align-items-center rounded-1 user-select-none p-2')}\n onClick={() => handleSelectRegion(region.systemName)}\n >\n {region.name}\n </li>\n ))}\n </ul>\n </div>\n\n <div className={styles.main}>\n {selectedRegion ? (\n <>\n <h3 className='mb-3'>Featured Channels — {selectedRegion.name}</h3>\n\n <div className='my-3'>\n <SearchBar<PartnerProfile>\n disabled={isAtMaxCapacity}\n placeholder='Search for a channel to add'\n onSuggestionSelected={handleAddPartner}\n getRemoteUrl={() => `/api/search/v4/search?userId=${currentUser.data?.id}&customerId=${currentUser.data?.customerId}&searchAllChannels=true`}\n getRemotePostBody={(q: string) => ({\n query: q,\n indices: [{ index: 'partner_profile' }],\n searchType: 'content'\n })}\n formatRemoteSuggestions={data => data.results}\n activationLength={0}\n clearQueryOnSelect\n shouldUpdateQueryOnSelection={false}\n renderAsForm={false}\n />\n {isAtMaxCapacity && (\n <p className='text-secondary mt-2 mb-0 small'>\n Maximum of {MAX_FEATURED_CHANNELS} featured channels reached. Remove a channel before adding a new\n one.\n </p>\n )}\n </div>\n\n {featuredChannels.length > 0 ? (\n <div>\n <p className='text-secondary mb-0'>Drag and drop to reorder</p>\n <SortableContainerWrapper\n ids={featuredChannels.map(p => p.id)}\n onSortEnd={handleSortEnd}\n getDragOverlay={id => {\n const partner = featuredChannels.find(p => p.id === id);\n return <div className={classnames(styles.dragOverlay, 'bg-white rounded-1 border')}>{partner?.name}</div>;\n }}\n >\n {featuredChannels.map((partner, i) => (\n <FeaturedChannelRow key={partner.id} partner={partner} index={i} onRemove={handleRemove} />\n ))}\n </SortableContainerWrapper>\n </div>\n ) : (\n <p className='text-secondary mt-2'>No featured channels. Add one using the search above.</p>\n )}\n\n <div className='mt-4'>\n <h4 className='mb-4'>Preview</h4>\n {featuredChannels.length > 0 ? (\n <WidgetContainerView\n content={featuredChannels}\n templateId={WidgetTemplate.RectangularLogoSlidingList}\n widgetTypeId={WidgetTypeId.SpotlightContentPartners}\n // mocking a widget here\n description=''\n name=''\n id='featured-channels'\n metadata={{}}\n location='curator'\n />\n ) : (\n <PartialRectangularLogoSlidingListWidgetTemplate isPreviewing />\n )}\n </div>\n\n <div className='mt-3 text-end'>\n {isBelowMinCapacity && (\n <p className='text-secondary mb-2 small'>\n A minimum of {MIN_FEATURED_CHANNELS} featured channels is required.\n </p>\n )}\n <button type='button' className='btn btn-dark' disabled={isBelowMinCapacity} onClick={handleSave}>\n Save\n </button>\n </div>\n </>\n ) : (\n <p className='text-secondary mt-2'>Select a region to manage its featured channels.</p>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"CpqMUVVi.chunk.js","names":[],"sources":["../../../../../src/apps/content-partners/views/manage-featured-channels/components/featured-channel-row.module.scss","../../../../../src/apps/content-partners/views/manage-featured-channels/components/FeaturedChannelRow.tsx","../../../../../src/apps/content-partners/views/manage-featured-channels/manage-featured-channels-view.module.scss","../../../../../src/apps/content-partners/views/manage-featured-channels/ManageFeaturedChannelsView.tsx"],"sourcesContent":[":local {\n .row {\n &:hover .index {\n display: none;\n }\n\n &:hover .handle {\n display: flex;\n }\n }\n\n .index {\n display: flex;\n }\n\n .handle {\n display: none;\n cursor: grab;\n\n &:active {\n cursor: grabbing;\n }\n }\n\n .name {\n min-width: 0;\n }\n}","import React from 'react';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport classnames from 'classnames';\n\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { DeleteSvg } from 'libs/shared/images/svg/actions/DeleteSvg';\nimport { HandleSvg } from 'libs/shared/images/svg/objects/HandleSvg';\nimport { PartnerProfile } from 'libs/shared/interfaces';\n\nimport styles from './featured-channel-row.module.scss';\n\ninterface FeaturedChannelRowProps {\n partner: PartnerProfile;\n onRemove: (id: string) => void;\n index: number;\n}\n\nexport function FeaturedChannelRow(props: FeaturedChannelRowProps): JSX.Element {\n const { partner, onRemove, index } = props;\n const { setNodeRef, transform, transition, listeners, attributes } = useSortable({ id: partner.id });\n\n const style: React.CSSProperties = {\n transform: CSS.Transform.toString(transform),\n transition,\n touchAction: 'none'\n };\n\n return (\n <div ref={setNodeRef} style={style} className={classnames(styles.row, 'd-flex align-items-center py-2 bg-white border-bottom')} {...attributes} {...listeners}>\n <span className={classnames(styles.handle, 'user-select-none mb-3 me-1')}>\n <SvgContainer svg={HandleSvg} size={SvgContainerSize.XXS} />\n </span>\n <span className={classnames(styles.index, 'me-2')}>{index + 1}</span>\n <span className={classnames(styles.name, 'flex-grow-1 text-truncate px-1')}>{partner.name}</span>\n <IconButton\n svg={DeleteSvg}\n className='text-danger'\n onClick={() => onRemove(partner.id)}\n />\n </div>\n );\n}\n",":local {\n .sidebar {\n width: 12rem;\n }\n\n .regionItem {\n &:hover {\n background-color: $white;\n }\n\n &.active {\n background-color: $gray-100;\n }\n }\n\n .main {\n flex: 1;\n min-width: 0;\n }\n\n .dragOverlay {\n padding: 0.5rem 0.75rem;\n box-shadow: 0 0.25rem 1.3rem rgba($black, 0.1);\n opacity: 0.9;\n }\n}","import React, { useState } from 'react';\nimport { DragEndEvent } from '@dnd-kit/core';\nimport { arrayMove } from '@dnd-kit/sortable';\nimport classnames from 'classnames';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { PopupLoadingSpinner } from 'libs/shared/components/popup/PopupLoadingSpinner';\nimport { SearchBar } from 'libs/shared/components/search-bar/SearchBar';\nimport { SortableContainerWrapper } from 'libs/shared/components/sortable/SortableContainerWrapper';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { PartialRectangularLogoSlidingListWidgetTemplate } from 'libs/shared/components/widgets/curated-widgets/templates/rectangular-logo-sliding-list/partial-loading/PartialRectangularLogoSlidingList';\nimport { WidgetContainerView } from 'libs/shared/components/widgets/curated-widgets/WidgetContainerView';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { ChevronLeftSvg } from 'libs/shared/images/svg/arrows/ChevronLeftSvg';\nimport {\n ContentRegionCollection,\n ContentRegionObject,\n CurrentUser,\n PartnerProfile\n} from 'libs/shared/interfaces';\n\nimport { ContentRegionRequests } from 'shared/flight-requests/ContentRegionRequests';\n\nimport { ContentPartnerRequests } from 'apps/content-partners/flight-requests/ContentPartnerRequests';\nimport { PinnedContentPartner } from 'apps/content-partners/interfaces/PinnedContentPartner';\nimport { getContentPartnerAppLinks } from 'apps/content-partners/utils/getContentPartnerAppLinks';\n\nimport { FeaturedChannelRow } from './components/FeaturedChannelRow';\n\nimport styles from './manage-featured-channels-view.module.scss';\n\nconst MAX_FEATURED_CHANNELS = 18;\nconst MIN_FEATURED_CHANNELS = 6;\n\nfunction buildSortedChannels(contentRegion: string, channels: PartnerProfile[]): PinnedContentPartner[] {\n return channels.map((channel, index) => ({\n contentRegion,\n index,\n partnerProfileId: channel.id\n }));\n}\n\nexport function ManageFeaturedChannelsView(): JSX.Element {\n const fetchAsync = Flight.useGetFetchAsync();\n const appLinks = getContentPartnerAppLinks();\n const alerts = useAlerts();\n\n const regionsResponse = Flight.useBasicFetch<ContentRegionCollection>(\n ContentRegionRequests.contentRegions()\n );\n const regions: ContentRegionObject[] = [...(regionsResponse.data?.data ?? [])]\n .sort((a, b) => a.name.localeCompare(b.name)) ?? [];\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const [ featuredChannels, setFeaturedChannels ] = useState<PartnerProfile[]>([]);\n const [ selectedRegionSystemName, setSelectedRegionSystemName ] = useState<string | null>(null);\n const pinnedPartners = Flight.useBasicFetch<PartnerProfile[]>(\n selectedRegionSystemName && ContentPartnerRequests.getFeaturedChannelsForRegion(selectedRegionSystemName)\n );\n\n React.useEffect(() => {\n if (!pinnedPartners.hasCompleted) return;\n setFeaturedChannels(pinnedPartners.data ?? []);\n }, [ pinnedPartners.hasCompleted, selectedRegionSystemName ]);\n\n React.useEffect(() => {\n if (!selectedRegionSystemName) {\n setSelectedRegionSystemName(regionsResponse.data?.data?.[0]?.systemName ?? null);\n }\n }, [regionsResponse.hasCompleted]);\n\n if (!regionsResponse.hasCompleted || !currentUser.hasCompleted) {\n return <PopupLoadingSpinner />;\n }\n\n const selectedRegion = regions.find(r => r.systemName === selectedRegionSystemName) ?? null;\n const featuredIds = new Set(featuredChannels.map(p => p.id));\n const isAtMaxCapacity = featuredChannels.length >= MAX_FEATURED_CHANNELS;\n const isBelowMinCapacity = featuredChannels.length < MIN_FEATURED_CHANNELS;\n\n function handleSelectRegion(systemName: string): void {\n setSelectedRegionSystemName(systemName);\n setFeaturedChannels([]);\n }\n\n async function handleAddPartner(partner: PartnerProfile): Promise<void> {\n if (featuredIds.has(partner.id)) return;\n // fetch the full content partner object to render the preview\n const fullProfile = await fetchAsync<PartnerProfile>(ContentPartnerRequests.getContentPartner(partner.id));\n setFeaturedChannels(prev => [ ...prev, fullProfile ]);\n }\n\n function handleRemove(partnerId: string): void {\n setFeaturedChannels(prev => prev.filter(p => p.id !== partnerId));\n }\n\n function handleSortEnd(event: DragEndEvent): void {\n const { active, over } = event;\n if (!over || active.id === over.id) return;\n\n setFeaturedChannels(prev => {\n const oldIndex = prev.findIndex(p => p.id?.toString() === active.id.toString());\n const newIndex = prev.findIndex(p => p.id?.toString() === over.id.toString());\n if (oldIndex === -1 || newIndex === -1) return prev;\n return arrayMove(prev, oldIndex, newIndex);\n });\n }\n\n async function handleSave(): Promise<void> {\n if (!selectedRegionSystemName || isBelowMinCapacity) return;\n try {\n await fetchAsync(ContentPartnerRequests.updateFeaturedChannelsForRegion(\n selectedRegionSystemName,\n buildSortedChannels(selectedRegionSystemName, featuredChannels)\n ));\n alerts.success('Featured channels updated successfully');\n } catch {\n alerts.error('Failed to update featured channels');\n }\n }\n\n return (\n <div className='d-flex gap-3'>\n <div className={classnames(styles.sidebar, 'flex-shrink-0')}>\n <div className='mb-2'>\n <AppLink appLink={appLinks.contentPartners()} className='text-secondary d-flex align-items-center'>\n <SvgContainer svg={ChevronLeftSvg} />\n Channels\n </AppLink>\n </div>\n <h6 className='mb-3'>Regions</h6>\n <ul className='list-unstyled m-0'>\n {regions.map(region => (\n <li\n key={region.id}\n className={classnames(styles.regionItem, { [styles.active]: region.systemName === selectedRegionSystemName }, 'cursor-pointer d-flex align-items-center rounded-1 user-select-none p-2')}\n onClick={() => handleSelectRegion(region.systemName)}\n >\n {region.name}\n </li>\n ))}\n </ul>\n </div>\n\n <div className={styles.main}>\n {selectedRegion ? (\n <>\n <h3 className='mb-3'>Featured Channels — {selectedRegion.name}</h3>\n\n <div className='my-3'>\n <SearchBar<PartnerProfile>\n disabled={isAtMaxCapacity}\n placeholder='Search for a channel to add'\n onSuggestionSelected={handleAddPartner}\n getRemoteUrl={() => `/api/search/v4/search?userId=${currentUser.data?.id}&customerId=${currentUser.data?.customerId}&searchAllChannels=true`}\n getRemotePostBody={(q: string) => ({\n query: q,\n indices: [{ index: 'partner_profile' }],\n searchType: 'content'\n })}\n formatRemoteSuggestions={data => data.results}\n activationLength={0}\n clearQueryOnSelect\n shouldUpdateQueryOnSelection={false}\n renderAsForm={false}\n />\n {isAtMaxCapacity && (\n <p className='text-secondary mt-2 mb-0 small'>\n Maximum of {MAX_FEATURED_CHANNELS} featured channels reached. Remove a channel before adding a new\n one.\n </p>\n )}\n </div>\n\n {featuredChannels.length > 0 ? (\n <div>\n <p className='text-secondary mb-0'>Drag and drop to reorder</p>\n <SortableContainerWrapper\n ids={featuredChannels.map(p => p.id)}\n onSortEnd={handleSortEnd}\n getDragOverlay={id => {\n const partner = featuredChannels.find(p => p.id === id);\n return <div className={classnames(styles.dragOverlay, 'bg-white rounded-1 border')}>{partner?.name}</div>;\n }}\n >\n {featuredChannels.map((partner, i) => (\n <FeaturedChannelRow key={partner.id} partner={partner} index={i} onRemove={handleRemove} />\n ))}\n </SortableContainerWrapper>\n </div>\n ) : (\n <p className='text-secondary mt-2'>No featured channels. Add one using the search above.</p>\n )}\n\n <div className='mt-4'>\n <h4 className='mb-4'>Preview</h4>\n {featuredChannels.length > 0 ? (\n <WidgetContainerView\n content={featuredChannels}\n templateId={WidgetTemplate.RectangularLogoSlidingList}\n widgetTypeId={WidgetTypeId.SpotlightContentPartners}\n // mocking a widget here\n description=''\n name=''\n id='featured-channels'\n metadata={{}}\n location='curator'\n />\n ) : (\n <PartialRectangularLogoSlidingListWidgetTemplate isPreviewing />\n )}\n </div>\n\n <div className='mt-3 text-end'>\n {isBelowMinCapacity && (\n <p className='text-secondary mb-2 small'>\n A minimum of {MIN_FEATURED_CHANNELS} featured channels is required.\n </p>\n )}\n <button type='button' className='btn btn-dark' disabled={isBelowMinCapacity} onClick={handleSave}>\n Save\n </button>\n </div>\n </>\n ) : (\n <p className='text-secondary mt-2'>Select a region to manage its featured channels.</p>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{C as e,a as t,ln as n,r,t as i}from"./BlDu0qdC.chunk.js";import{t as a}from"./DZX1tZ-D.chunk.js";import{t as o}from"./DEBg-sxL.chunk.js";import{t as s}from"./BvMTtGLi.chunk.js";import"./BjggjRoR.chunk.js";import{c}from"./BIZf7Q462.chunk.js";import"./COkf8IPk2.chunk.js";import{t as l}from"./Bt5qHBoM2.chunk.js";import{t as u}from"./Bv9Em12_.chunk.js";import{b as d}from"./CSSol6ro.chunk.js";import{n as f}from"./DalFHGv7.chunk.js";import{t as p}from"./OMMvCI-u.chunk.js";import{t as m}from"./BDwjs8qz.chunk.js";import{a as h,o as g}from"./DBq-nnnE.chunk.js";import{t as _}from"./BrCws9ZQ.chunk.js";import{R as v,z as y}from"./DhN_Jc2z.chunk.js";import{t as b}from"./C0xW53b02.chunk.js";import{n as x,t as S}from"./C8YkY0we.chunk.js";var C=n(t()),w=r();function T(t){let[n,r]=C.useState(!1),T=c(l.currentUser()),E=c(l.token()),D=c(_.interactiveMetadata(t.id)),O=c(D.data&&v.createViewKey(D.data.id,y.MasterObject)),k=C.useMemo(()=>g(),[]);C.useEffect(()=>{!D.hasCompleted||D.data.status!==m.Draft||e.trigger({application:s.INTERACTIVES,action:o.Interactives.EDIT_INTERACTIVE,args:[t.id]},{replace:!0})},[D.hasCompleted]);function A(){let e=[{label:`Open in ClickView`,href:a.safeUrlConcat(ClickView.Config.Urls.LiteUrl,`interactive/${t.id}/${i.slugify(D.data.name)}`),openInNewTab:!0,className:`btn btn-outline-dark me-2`,svg:p,button:!0},{label:`Edit details`,appLink:{application:s.INTERACTIVES,action:o.Interactives.EDIT_INTERACTIVE_DETAILS,args:[D.data.id]},button:!1},{label:`Copy interactive`,appLink:{application:s.INTERACTIVES,action:o.Interactives.COPY_INTERACTIVE,args:[D.data.id]},button:!1}];return D.data._parentClip?.id?e.push({label:`Open parent clip`,appLink:{application:s.CLIPS,action:o.Clips.EDIT_CLIP_INTERACTIVES,args:[D.data._parentClip.id]},button:!1}):D.data._parentVideo?.id&&e.push({label:`Open parent video`,appLink:{application:s.VIDEOS,action:o.Videos.EDIT_VIDEO,args:[D.data._parentVideo.id]},button:!1}),D.data.status===m.Published?e.push({label:`Archive interactive`,appLink:{application:s.INTERACTIVES,action:o.Interactives.ARCHIVE_INTERACTIVE,args:[t.id]},className:`text-danger`,button:!1}):e.push({label:`Publish interactive`,appLink:{application:s.INTERACTIVES,action:o.Interactives.PUBLISH_INTERACTIVE,args:[t.id]},button:!1}),e}return!O.data||!D.data||!E.data?(0,w.jsx)(`div`,{className:`text-center py-5`,children:(0,w.jsx)(f,{as:`div`,animation:`border`})}):(0,w.jsxs)(w.Fragment,{children:[(0,w.jsx)(b,{interactive:D.data,activeAction:o.Interactives.PREVIEW_INTERACTIVE,currentUser:T.data}),D.data.status===m.Published&&(0,w.jsxs)(u,{variant:`info`,className:`mt-3 mb-1`,children:[`This interactive is `,(0,w.jsx)(`strong`,{children:`published`}),` and cannot be edited or deleted. You may archive it if you believe it should no longer be in use.`]}),D.data.status===m.Archived&&(0,w.jsxs)(u,{variant:`info`,className:`mt-3 mb-1`,children:[`This interactive is `,(0,w.jsx)(`strong`,{children:`archived`}),`. You may publish it again from the options menu.`]}),(0,w.jsxs)(`div`,{className:`${n?``:`d-none`}`,children:[(0,w.jsx)(d,{object:{name:D.data.name,status:D.data.status},actions:A(),actionsDropdownClassName:`btn btn-outline-dark`,showStatus:!0}),(0,w.jsx)(S,{viewKey:O.data.viewKey,imageApi:new URL(ClickView.Config.Urls.ImageAPI),playerApi:new URL(ClickView.Config.Urls.PlayerApi),hotkeyElQuerySelector:`body`,onReady:()=>r(!0),currentUser:T.data,mode:x.View,questionListPortalNode:k,eventLogging:!1}),(0,w.jsx)(h,{node:k})]})]})}export{T as PreviewInteractiveView};
2
- //# sourceMappingURL=I_gdFDV7.chunk.js.map
1
+ import{C as e,a as t,ln as n,r,t as i}from"./BlDu0qdC.chunk.js";import{t as a}from"./DZX1tZ-D.chunk.js";import{t as o}from"./DEBg-sxL.chunk.js";import{t as s}from"./BvMTtGLi.chunk.js";import"./BjggjRoR.chunk.js";import{c}from"./BIZf7Q462.chunk.js";import"./COkf8IPk2.chunk.js";import{t as l}from"./Bt5qHBoM2.chunk.js";import{t as u}from"./Bv9Em12_.chunk.js";import{b as d}from"./CSSol6ro.chunk.js";import{n as f}from"./DalFHGv7.chunk.js";import{t as p}from"./OMMvCI-u.chunk.js";import{t as m}from"./BDwjs8qz.chunk.js";import{a as h,o as g}from"./DBq-nnnE.chunk.js";import{t as _}from"./BrCws9ZQ.chunk.js";import{R as v,z as y}from"./DTUkmChD.chunk.js";import{t as b}from"./C0xW53b02.chunk.js";import{n as x,t as S}from"./DW7-la-i.chunk.js";var C=n(t()),w=r();function T(t){let[n,r]=C.useState(!1),T=c(l.currentUser()),E=c(l.token()),D=c(_.interactiveMetadata(t.id)),O=c(D.data&&v.createViewKey(D.data.id,y.MasterObject)),k=C.useMemo(()=>g(),[]);C.useEffect(()=>{!D.hasCompleted||D.data.status!==m.Draft||e.trigger({application:s.INTERACTIVES,action:o.Interactives.EDIT_INTERACTIVE,args:[t.id]},{replace:!0})},[D.hasCompleted]);function A(){let e=[{label:`Open in ClickView`,href:a.safeUrlConcat(ClickView.Config.Urls.LiteUrl,`interactive/${t.id}/${i.slugify(D.data.name)}`),openInNewTab:!0,className:`btn btn-outline-dark me-2`,svg:p,button:!0},{label:`Edit details`,appLink:{application:s.INTERACTIVES,action:o.Interactives.EDIT_INTERACTIVE_DETAILS,args:[D.data.id]},button:!1},{label:`Copy interactive`,appLink:{application:s.INTERACTIVES,action:o.Interactives.COPY_INTERACTIVE,args:[D.data.id]},button:!1}];return D.data._parentClip?.id?e.push({label:`Open parent clip`,appLink:{application:s.CLIPS,action:o.Clips.EDIT_CLIP_INTERACTIVES,args:[D.data._parentClip.id]},button:!1}):D.data._parentVideo?.id&&e.push({label:`Open parent video`,appLink:{application:s.VIDEOS,action:o.Videos.EDIT_VIDEO,args:[D.data._parentVideo.id]},button:!1}),D.data.status===m.Published?e.push({label:`Archive interactive`,appLink:{application:s.INTERACTIVES,action:o.Interactives.ARCHIVE_INTERACTIVE,args:[t.id]},className:`text-danger`,button:!1}):e.push({label:`Publish interactive`,appLink:{application:s.INTERACTIVES,action:o.Interactives.PUBLISH_INTERACTIVE,args:[t.id]},button:!1}),e}return!O.data||!D.data||!E.data?(0,w.jsx)(`div`,{className:`text-center py-5`,children:(0,w.jsx)(f,{as:`div`,animation:`border`})}):(0,w.jsxs)(w.Fragment,{children:[(0,w.jsx)(b,{interactive:D.data,activeAction:o.Interactives.PREVIEW_INTERACTIVE,currentUser:T.data}),D.data.status===m.Published&&(0,w.jsxs)(u,{variant:`info`,className:`mt-3 mb-1`,children:[`This interactive is `,(0,w.jsx)(`strong`,{children:`published`}),` and cannot be edited or deleted. You may archive it if you believe it should no longer be in use.`]}),D.data.status===m.Archived&&(0,w.jsxs)(u,{variant:`info`,className:`mt-3 mb-1`,children:[`This interactive is `,(0,w.jsx)(`strong`,{children:`archived`}),`. You may publish it again from the options menu.`]}),(0,w.jsxs)(`div`,{className:`${n?``:`d-none`}`,children:[(0,w.jsx)(d,{object:{name:D.data.name,status:D.data.status},actions:A(),actionsDropdownClassName:`btn btn-outline-dark`,showStatus:!0}),(0,w.jsx)(S,{viewKey:O.data.viewKey,imageApi:new URL(ClickView.Config.Urls.ImageAPI),playerApi:new URL(ClickView.Config.Urls.PlayerApi),hotkeyElQuerySelector:`body`,onReady:()=>r(!0),currentUser:T.data,mode:x.View,questionListPortalNode:k,eventLogging:!1}),(0,w.jsx)(h,{node:k})]})]})}export{T as PreviewInteractiveView};
2
+ //# sourceMappingURL=CqZqlJSF.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"I_gdFDV7.chunk.js","names":[],"sources":["../../../../../src/apps/interactives/views/preview-interactive/PreviewInteractiveView.tsx"],"sourcesContent":["import React from 'react';\nimport { Alert, Spinner } from 'react-bootstrap';\nimport { createHtmlPortalNode, OutPortal } from 'react-reverse-portal';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/react/index';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { CurationStatus } from 'libs/shared/enums/CurationStatus';\nimport { MediaIdType } from 'libs/shared/enums/MediaIdType';\nimport { PlayerRequests } from 'libs/shared/flight-requests/PlayerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VisibleOnSvg } from 'libs/shared/images/svg/actions/VisibleOnSvg';\nimport { CuratorUser, CurrentUser, InteractiveMetadata, PlayerViewKey } from 'libs/shared/interfaces';\n\nimport { InteractiveMode } from 'projects/player/plugins/interactive-plugin/interfaces';\nimport { ClickViewInteractivePlayer } from 'projects/player/react/InteractivePlayer';\n\nimport { ObjectHeader } from 'shared/components';\nimport { Actions, AppChannels } from 'shared/constants';\n\nimport { EditInteractivesNav } from 'apps/interactives/components/edit-interactives-nav/EditInteractivesNav';\nimport { InteractiveRequests } from 'apps/interactives/flight-requests/CuratorInteractiveRequests';\n\ninterface PreviewInteractiveViewProps {\n id: string;\n}\n\nexport function PreviewInteractiveView(props: PreviewInteractiveViewProps): JSX.Element {\n const [ ready, setReady ] = React.useState(false);\n\n const currentUser = Flight.useBasicFetch<CuratorUser>(UserRequests.currentUser());\n const token = Flight.useBasicFetch<string>(UserRequests.token());\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n InteractiveRequests.interactiveMetadata(props.id)\n );\n\n const viewKey = Flight.useBasicFetch<PlayerViewKey>(\n interactiveMetadata.data &&\n PlayerRequests.createViewKey(interactiveMetadata.data.id, MediaIdType.MasterObject)\n );\n\n const questionListPortalNode = React.useMemo(() => createHtmlPortalNode(), []);\n\n React.useEffect(() => {\n if (!interactiveMetadata.hasCompleted || interactiveMetadata.data.status !== CurationStatus.Draft)\n return;\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.EDIT_INTERACTIVE,\n args: [props.id]\n }, { replace: true });\n }, [interactiveMetadata.hasCompleted]);\n\n function getActions(): ActionOptions[] {\n const actions: ActionOptions[] = [{\n label: 'Open in ClickView',\n href: UrlHelper.safeUrlConcat(\n ClickView.Config.Urls.LiteUrl,\n `interactive/${props.id}/${TextHelper.slugify(interactiveMetadata.data.name)}`\n ),\n openInNewTab: true,\n className: 'btn btn-outline-dark me-2',\n svg: VisibleOnSvg,\n button: true\n }, {\n label: 'Edit details',\n appLink: {\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.EDIT_INTERACTIVE_DETAILS,\n args: [interactiveMetadata.data.id]\n },\n button: false\n }, {\n label: 'Copy interactive',\n appLink: {\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.COPY_INTERACTIVE,\n args: [interactiveMetadata.data.id]\n },\n button: false\n }];\n\n if (interactiveMetadata.data._parentClip?.id) {\n actions.push({\n label: 'Open parent clip',\n appLink: {\n application: AppChannels.CLIPS,\n action: Actions.Clips.EDIT_CLIP_INTERACTIVES,\n args: [interactiveMetadata.data._parentClip.id]\n },\n button: false\n });\n } else if (interactiveMetadata.data._parentVideo?.id) {\n actions.push({\n label: 'Open parent video',\n appLink: {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.EDIT_VIDEO,\n args: [interactiveMetadata.data._parentVideo.id]\n },\n button: false\n });\n }\n \n if (interactiveMetadata.data.status === CurationStatus.Published) {\n actions.push({\n label: 'Archive interactive',\n appLink: {\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.ARCHIVE_INTERACTIVE,\n args: [props.id]\n },\n className: 'text-danger',\n button: false\n });\n } else {\n actions.push({\n label: 'Publish interactive',\n appLink: {\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.PUBLISH_INTERACTIVE,\n args: [props.id]\n },\n button: false\n });\n }\n\n return actions;\n }\n\n if (!viewKey.data || !interactiveMetadata.data || !token.data) {\n return (\n <div className='text-center py-5'>\n <Spinner as='div' animation='border' />\n </div>\n );\n }\n\n return (\n <>\n <EditInteractivesNav\n interactive={interactiveMetadata.data}\n activeAction={Actions.Interactives.PREVIEW_INTERACTIVE}\n currentUser={currentUser.data}\n />\n\n {interactiveMetadata.data.status === CurationStatus.Published && (\n <Alert variant='info' className='mt-3 mb-1'>\n This interactive is <strong>published</strong> and cannot be edited or deleted.\n You may archive it if you believe it should no longer be in use.\n </Alert>\n )}\n\n {interactiveMetadata.data.status === CurationStatus.Archived && (\n <Alert variant='info' className='mt-3 mb-1'>\n This interactive is <strong>archived</strong>. You may publish it again\n from the options menu.\n </Alert>\n )}\n\n <div className={`${ready ? '' : 'd-none'}`}>\n <ObjectHeader\n object={{ name: interactiveMetadata.data.name, status: interactiveMetadata.data.status }}\n actions={getActions()}\n actionsDropdownClassName='btn btn-outline-dark'\n showStatus\n />\n <ClickViewInteractivePlayer\n viewKey={viewKey.data.viewKey}\n imageApi={new URL(ClickView.Config.Urls.ImageAPI)}\n playerApi={new URL(ClickView.Config.Urls.PlayerApi)}\n hotkeyElQuerySelector='body'\n onReady={() => setReady(true)}\n currentUser={currentUser.data as unknown as CurrentUser}\n mode={InteractiveMode.View}\n questionListPortalNode={questionListPortalNode}\n eventLogging={false}\n />\n <OutPortal node={questionListPortalNode} />\n </div>\n </>\n );\n}\n"],"mappings":"uvBA8BA,SAAgB,EAAuB,EAAiD,CACtF,GAAM,CAAE,EAAO,GAAA,EAAmB,SAAS,EAAK,EAE1C,EAAc,EAAkC,EAAa,YAAY,CAAC,EAC1E,EAAQ,EAA6B,EAAa,MAAM,CAAC,EAEzD,EAAsB,EAC1B,EAAoB,oBAAoB,EAAM,EAAE,CAClD,EAEM,EAAU,EACd,EAAoB,MACpB,EAAe,cAAc,EAAoB,KAAK,GAAI,EAAY,YAAY,CACpF,EAEM,EAAA,EAA+B,YAAc,EAAqB,EAAG,CAAC,CAAC,EAE7E,EAAM,cAAgB,CAChB,CAAC,EAAoB,cAAgB,EAAoB,KAAK,SAAW,EAAe,OAG5F,EAAmB,QAAQ,CACzB,YAAa,EAAY,aACzB,OAAQ,EAAQ,aAAa,iBAC7B,KAAM,CAAC,EAAM,EAAE,CACjB,EAAG,CAAE,QAAS,EAAK,CAAC,CACtB,EAAG,CAAC,EAAoB,YAAY,CAAC,EAErC,SAAS,GAA8B,CACrC,IAAM,EAA2B,CAAC,CAChC,MAAO,oBACP,KAAM,EAAU,cACd,UAAU,OAAO,KAAK,QACtB,eAAe,EAAM,GAAG,GAAG,EAAW,QAAQ,EAAoB,KAAK,IAAI,GAC7E,EACA,aAAc,GACd,UAAW,4BACX,IAAK,EACL,OAAQ,EACV,EAAG,CACD,MAAO,eACP,QAAS,CACP,YAAa,EAAY,aACzB,OAAQ,EAAQ,aAAa,yBAC7B,KAAM,CAAC,EAAoB,KAAK,EAAE,CACpC,EACA,OAAQ,EACV,EAAG,CACD,MAAO,mBACP,QAAS,CACP,YAAa,EAAY,aACzB,OAAQ,EAAQ,aAAa,iBAC7B,KAAM,CAAC,EAAoB,KAAK,EAAE,CACpC,EACA,OAAQ,EACV,CAAC,EA+CD,OA7CI,EAAoB,KAAK,aAAa,GACxC,EAAQ,KAAK,CACX,MAAO,mBACP,QAAS,CACP,YAAa,EAAY,MACzB,OAAQ,EAAQ,MAAM,uBACtB,KAAM,CAAC,EAAoB,KAAK,YAAY,EAAE,CAChD,EACA,OAAQ,EACV,CAAC,EACQ,EAAoB,KAAK,cAAc,IAChD,EAAQ,KAAK,CACX,MAAO,oBACP,QAAS,CACP,YAAa,EAAY,OACzB,OAAQ,EAAQ,OAAO,WACvB,KAAM,CAAC,EAAoB,KAAK,aAAa,EAAE,CACjD,EACA,OAAQ,EACV,CAAC,EAGC,EAAoB,KAAK,SAAW,EAAe,UACrD,EAAQ,KAAK,CACX,MAAO,sBACP,QAAS,CACP,YAAa,EAAY,aACzB,OAAQ,EAAQ,aAAa,oBAC7B,KAAM,CAAC,EAAM,EAAE,CACjB,EACA,UAAW,cACX,OAAQ,EACV,CAAC,EAED,EAAQ,KAAK,CACX,MAAO,sBACP,QAAS,CACP,YAAa,EAAY,aACzB,OAAQ,EAAQ,aAAa,oBAC7B,KAAM,CAAC,EAAM,EAAE,CACjB,EACA,OAAQ,EACV,CAAC,EAGI,CACT,CAUA,MARI,CAAC,EAAQ,MAAQ,CAAC,EAAoB,MAAQ,CAAC,EAAM,MAErD,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,6BACb,EAAA,EAAA,IAAA,CAAC,EAAD,CAAS,GAAG,MAAM,UAAU,QAAU,CAAA,CACnC,CAAA,GAKP,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,YAAa,EAAoB,KACjC,aAAc,EAAQ,aAAa,oBACnC,YAAa,EAAY,IAC1B,CAAA,EAEA,EAAoB,KAAK,SAAW,EAAe,YAClD,EAAA,EAAA,KAAA,CAAC,EAAD,CAAO,QAAQ,OAAO,UAAU,qBAAhC,CAA4C,wBACtB,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,WAAiB,CAAA,EAAC,oGAEzC,IAGR,EAAoB,KAAK,SAAW,EAAe,WAClD,EAAA,EAAA,KAAA,CAAC,EAAD,CAAO,QAAQ,OAAO,UAAU,qBAAhC,CAA4C,wBACtB,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,UAAgB,CAAA,EAAC,mDAExC,KAGT,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,GAAG,EAAQ,GAAK,oBAAhC,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,OAAQ,CAAE,KAAM,EAAoB,KAAK,KAAM,OAAQ,EAAoB,KAAK,MAAO,EACvF,QAAS,EAAW,EACpB,yBAAyB,uBACzB,WAAA,EACD,CAAA,GACD,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,QAAS,EAAQ,KAAK,QACtB,SAAU,IAAI,IAAI,UAAU,OAAO,KAAK,QAAQ,EAChD,UAAW,IAAI,IAAI,UAAU,OAAO,KAAK,SAAS,EAClD,sBAAsB,OACtB,YAAe,EAAS,EAAI,EAC5B,YAAa,EAAY,KACzB,KAAM,EAAgB,KACE,yBACxB,aAAc,EACf,CAAA,GACD,EAAA,EAAA,IAAA,CAAC,EAAD,CAAW,KAAM,CAAyB,CAAA,CACvC,GACL,CAAA,CAAA,CAEN"}
1
+ {"version":3,"file":"CqZqlJSF.chunk.js","names":[],"sources":["../../../../../src/apps/interactives/views/preview-interactive/PreviewInteractiveView.tsx"],"sourcesContent":["import React from 'react';\nimport { Alert, Spinner } from 'react-bootstrap';\nimport { createHtmlPortalNode, OutPortal } from 'react-reverse-portal';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/react/index';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { CurationStatus } from 'libs/shared/enums/CurationStatus';\nimport { MediaIdType } from 'libs/shared/enums/MediaIdType';\nimport { PlayerRequests } from 'libs/shared/flight-requests/PlayerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VisibleOnSvg } from 'libs/shared/images/svg/actions/VisibleOnSvg';\nimport { CuratorUser, CurrentUser, InteractiveMetadata, PlayerViewKey } from 'libs/shared/interfaces';\n\nimport { InteractiveMode } from 'projects/player/plugins/interactive-plugin/interfaces';\nimport { ClickViewInteractivePlayer } from 'projects/player/react/InteractivePlayer';\n\nimport { ObjectHeader } from 'shared/components';\nimport { Actions, AppChannels } from 'shared/constants';\n\nimport { EditInteractivesNav } from 'apps/interactives/components/edit-interactives-nav/EditInteractivesNav';\nimport { InteractiveRequests } from 'apps/interactives/flight-requests/CuratorInteractiveRequests';\n\ninterface PreviewInteractiveViewProps {\n id: string;\n}\n\nexport function PreviewInteractiveView(props: PreviewInteractiveViewProps): JSX.Element {\n const [ ready, setReady ] = React.useState(false);\n\n const currentUser = Flight.useBasicFetch<CuratorUser>(UserRequests.currentUser());\n const token = Flight.useBasicFetch<string>(UserRequests.token());\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n InteractiveRequests.interactiveMetadata(props.id)\n );\n\n const viewKey = Flight.useBasicFetch<PlayerViewKey>(\n interactiveMetadata.data &&\n PlayerRequests.createViewKey(interactiveMetadata.data.id, MediaIdType.MasterObject)\n );\n\n const questionListPortalNode = React.useMemo(() => createHtmlPortalNode(), []);\n\n React.useEffect(() => {\n if (!interactiveMetadata.hasCompleted || interactiveMetadata.data.status !== CurationStatus.Draft)\n return;\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.EDIT_INTERACTIVE,\n args: [props.id]\n }, { replace: true });\n }, [interactiveMetadata.hasCompleted]);\n\n function getActions(): ActionOptions[] {\n const actions: ActionOptions[] = [{\n label: 'Open in ClickView',\n href: UrlHelper.safeUrlConcat(\n ClickView.Config.Urls.LiteUrl,\n `interactive/${props.id}/${TextHelper.slugify(interactiveMetadata.data.name)}`\n ),\n openInNewTab: true,\n className: 'btn btn-outline-dark me-2',\n svg: VisibleOnSvg,\n button: true\n }, {\n label: 'Edit details',\n appLink: {\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.EDIT_INTERACTIVE_DETAILS,\n args: [interactiveMetadata.data.id]\n },\n button: false\n }, {\n label: 'Copy interactive',\n appLink: {\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.COPY_INTERACTIVE,\n args: [interactiveMetadata.data.id]\n },\n button: false\n }];\n\n if (interactiveMetadata.data._parentClip?.id) {\n actions.push({\n label: 'Open parent clip',\n appLink: {\n application: AppChannels.CLIPS,\n action: Actions.Clips.EDIT_CLIP_INTERACTIVES,\n args: [interactiveMetadata.data._parentClip.id]\n },\n button: false\n });\n } else if (interactiveMetadata.data._parentVideo?.id) {\n actions.push({\n label: 'Open parent video',\n appLink: {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.EDIT_VIDEO,\n args: [interactiveMetadata.data._parentVideo.id]\n },\n button: false\n });\n }\n \n if (interactiveMetadata.data.status === CurationStatus.Published) {\n actions.push({\n label: 'Archive interactive',\n appLink: {\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.ARCHIVE_INTERACTIVE,\n args: [props.id]\n },\n className: 'text-danger',\n button: false\n });\n } else {\n actions.push({\n label: 'Publish interactive',\n appLink: {\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.PUBLISH_INTERACTIVE,\n args: [props.id]\n },\n button: false\n });\n }\n\n return actions;\n }\n\n if (!viewKey.data || !interactiveMetadata.data || !token.data) {\n return (\n <div className='text-center py-5'>\n <Spinner as='div' animation='border' />\n </div>\n );\n }\n\n return (\n <>\n <EditInteractivesNav\n interactive={interactiveMetadata.data}\n activeAction={Actions.Interactives.PREVIEW_INTERACTIVE}\n currentUser={currentUser.data}\n />\n\n {interactiveMetadata.data.status === CurationStatus.Published && (\n <Alert variant='info' className='mt-3 mb-1'>\n This interactive is <strong>published</strong> and cannot be edited or deleted.\n You may archive it if you believe it should no longer be in use.\n </Alert>\n )}\n\n {interactiveMetadata.data.status === CurationStatus.Archived && (\n <Alert variant='info' className='mt-3 mb-1'>\n This interactive is <strong>archived</strong>. You may publish it again\n from the options menu.\n </Alert>\n )}\n\n <div className={`${ready ? '' : 'd-none'}`}>\n <ObjectHeader\n object={{ name: interactiveMetadata.data.name, status: interactiveMetadata.data.status }}\n actions={getActions()}\n actionsDropdownClassName='btn btn-outline-dark'\n showStatus\n />\n <ClickViewInteractivePlayer\n viewKey={viewKey.data.viewKey}\n imageApi={new URL(ClickView.Config.Urls.ImageAPI)}\n playerApi={new URL(ClickView.Config.Urls.PlayerApi)}\n hotkeyElQuerySelector='body'\n onReady={() => setReady(true)}\n currentUser={currentUser.data as unknown as CurrentUser}\n mode={InteractiveMode.View}\n questionListPortalNode={questionListPortalNode}\n eventLogging={false}\n />\n <OutPortal node={questionListPortalNode} />\n </div>\n </>\n );\n}\n"],"mappings":"uvBA8BA,SAAgB,EAAuB,EAAiD,CACtF,GAAM,CAAE,EAAO,GAAA,EAAmB,SAAS,EAAK,EAE1C,EAAc,EAAkC,EAAa,YAAY,CAAC,EAC1E,EAAQ,EAA6B,EAAa,MAAM,CAAC,EAEzD,EAAsB,EAC1B,EAAoB,oBAAoB,EAAM,EAAE,CAClD,EAEM,EAAU,EACd,EAAoB,MACpB,EAAe,cAAc,EAAoB,KAAK,GAAI,EAAY,YAAY,CACpF,EAEM,EAAA,EAA+B,YAAc,EAAqB,EAAG,CAAC,CAAC,EAE7E,EAAM,cAAgB,CAChB,CAAC,EAAoB,cAAgB,EAAoB,KAAK,SAAW,EAAe,OAG5F,EAAmB,QAAQ,CACzB,YAAa,EAAY,aACzB,OAAQ,EAAQ,aAAa,iBAC7B,KAAM,CAAC,EAAM,EAAE,CACjB,EAAG,CAAE,QAAS,EAAK,CAAC,CACtB,EAAG,CAAC,EAAoB,YAAY,CAAC,EAErC,SAAS,GAA8B,CACrC,IAAM,EAA2B,CAAC,CAChC,MAAO,oBACP,KAAM,EAAU,cACd,UAAU,OAAO,KAAK,QACtB,eAAe,EAAM,GAAG,GAAG,EAAW,QAAQ,EAAoB,KAAK,IAAI,GAC7E,EACA,aAAc,GACd,UAAW,4BACX,IAAK,EACL,OAAQ,EACV,EAAG,CACD,MAAO,eACP,QAAS,CACP,YAAa,EAAY,aACzB,OAAQ,EAAQ,aAAa,yBAC7B,KAAM,CAAC,EAAoB,KAAK,EAAE,CACpC,EACA,OAAQ,EACV,EAAG,CACD,MAAO,mBACP,QAAS,CACP,YAAa,EAAY,aACzB,OAAQ,EAAQ,aAAa,iBAC7B,KAAM,CAAC,EAAoB,KAAK,EAAE,CACpC,EACA,OAAQ,EACV,CAAC,EA+CD,OA7CI,EAAoB,KAAK,aAAa,GACxC,EAAQ,KAAK,CACX,MAAO,mBACP,QAAS,CACP,YAAa,EAAY,MACzB,OAAQ,EAAQ,MAAM,uBACtB,KAAM,CAAC,EAAoB,KAAK,YAAY,EAAE,CAChD,EACA,OAAQ,EACV,CAAC,EACQ,EAAoB,KAAK,cAAc,IAChD,EAAQ,KAAK,CACX,MAAO,oBACP,QAAS,CACP,YAAa,EAAY,OACzB,OAAQ,EAAQ,OAAO,WACvB,KAAM,CAAC,EAAoB,KAAK,aAAa,EAAE,CACjD,EACA,OAAQ,EACV,CAAC,EAGC,EAAoB,KAAK,SAAW,EAAe,UACrD,EAAQ,KAAK,CACX,MAAO,sBACP,QAAS,CACP,YAAa,EAAY,aACzB,OAAQ,EAAQ,aAAa,oBAC7B,KAAM,CAAC,EAAM,EAAE,CACjB,EACA,UAAW,cACX,OAAQ,EACV,CAAC,EAED,EAAQ,KAAK,CACX,MAAO,sBACP,QAAS,CACP,YAAa,EAAY,aACzB,OAAQ,EAAQ,aAAa,oBAC7B,KAAM,CAAC,EAAM,EAAE,CACjB,EACA,OAAQ,EACV,CAAC,EAGI,CACT,CAUA,MARI,CAAC,EAAQ,MAAQ,CAAC,EAAoB,MAAQ,CAAC,EAAM,MAErD,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,6BACb,EAAA,EAAA,IAAA,CAAC,EAAD,CAAS,GAAG,MAAM,UAAU,QAAU,CAAA,CACnC,CAAA,GAKP,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,YAAa,EAAoB,KACjC,aAAc,EAAQ,aAAa,oBACnC,YAAa,EAAY,IAC1B,CAAA,EAEA,EAAoB,KAAK,SAAW,EAAe,YAClD,EAAA,EAAA,KAAA,CAAC,EAAD,CAAO,QAAQ,OAAO,UAAU,qBAAhC,CAA4C,wBACtB,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,WAAiB,CAAA,EAAC,oGAEzC,IAGR,EAAoB,KAAK,SAAW,EAAe,WAClD,EAAA,EAAA,KAAA,CAAC,EAAD,CAAO,QAAQ,OAAO,UAAU,qBAAhC,CAA4C,wBACtB,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,UAAgB,CAAA,EAAC,mDAExC,KAGT,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,GAAG,EAAQ,GAAK,oBAAhC,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,OAAQ,CAAE,KAAM,EAAoB,KAAK,KAAM,OAAQ,EAAoB,KAAK,MAAO,EACvF,QAAS,EAAW,EACpB,yBAAyB,uBACzB,WAAA,EACD,CAAA,GACD,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,QAAS,EAAQ,KAAK,QACtB,SAAU,IAAI,IAAI,UAAU,OAAO,KAAK,QAAQ,EAChD,UAAW,IAAI,IAAI,UAAU,OAAO,KAAK,SAAS,EAClD,sBAAsB,OACtB,YAAe,EAAS,EAAI,EAC5B,YAAa,EAAY,KACzB,KAAM,EAAgB,KACE,yBACxB,aAAc,EACf,CAAA,GACD,EAAA,EAAA,IAAA,CAAC,EAAD,CAAW,KAAM,CAAyB,CAAA,CACvC,GACL,CAAA,CAAA,CAEN"}
@@ -1,6 +1,6 @@
1
- import{a as e,ln as t,r as n}from"./BlDu0qdC.chunk.js";import{F as r,L as i,r as a}from"./DhN_Jc2z.chunk.js";var o=i.getPlugin(`plugin`),s=10,c=class extends o{constructor(e,t){if(super(e),t.startTime===void 0)throw Error(`Invalid clip start`);if(t.endTime===void 0)throw Error(`Invalid clip end`);if(t.startTime>t.endTime)throw Error(`Clip start cannot be greater than clip end`);this._clipStart=parseFloat(t.startTime.toPrecision(4)),this._clipEnd=parseFloat(t.endTime.toPrecision(4)),this.playerEndedFn=this.player.ended.bind(e),this.playerDurationFn=this.player.duration.bind(e),this.playerCurrentTimeFn=this.player.currentTime.bind(e),this.playerbufferedFn=this.player.buffered.bind(e),this.player.ended=this.ended.bind(this),this.player.duration=this.duration.bind(this),this.player.currentTime=this.currentTime.bind(this),this.player.buffered=this.buffered.bind(this),this.initialize(),this.player.ready(()=>{this.player.trigger(`durationchange`)})}get clipStart(){let e=this.playerDurationFn();return this._clipStart>e?e:this._clipStart}get clipEnd(){let e=this.playerDurationFn();return e<=0?this._clipEnd:this._clipEnd>e?e:this._clipEnd}dispose(){this.player.off(`timeupdate`,this.onTimeUpdate),this.player.off(`play`,this.onPlay),this.player.ended=this.playerEndedFn,this.player.duration=this.playerDurationFn,this.player.currentTime=this.playerCurrentTimeFn,this.player.buffered=this.playerbufferedFn,this.player.trigger(`durationchange`),super.dispose()}initialize(){this.onTimeUpdate=this.onTimeUpdate.bind(this),this.onPlay=this.onPlay.bind(this),this.player.on(`timeupdate`,this.onTimeUpdate),this.player.on(`play`,this.onPlay)}onPlay(){this._isEnded&&this.player.currentTime(0)}onTimeUpdate(){let e=this.getCurrentTime(!1);if(e>this.clipEnd){this._isEnded||=(this.player.pause(),this.player.trigger(`ended`),!0);return}this._isEnded=!1,e<this.clipStart-s&&this.playerCurrentTimeFn(this.clipStart,!0)}ended(){return this.getCurrentTime(!1)>this.clipEnd}duration(e){return e&&e>0&&(this.playerDurationFn()?console.info(`The duration of the player has already been set. This is a no-op.`):this.playerDurationFn(e)),this.clipEnd-this.clipStart}currentTime(e,...t){if(typeof e!=`number`)return this.getCurrentTime(!0);let n=e+this.clipStart;this.playerCurrentTimeFn(n,...t)}getCurrentTime(e){let t=this.playerCurrentTimeFn(),n=0;return t>=this.clipStart&&(n=t-this.clipStart),this.player.getCache().currentTime=n,e?n:t}buffered(){let e=this.playerbufferedFn(),t=[];for(let n=0;n<e.length;n++)t[n]=[Math.max(0,e.start(n)-this.clipStart),Math.min(Math.max(0,e.end(n)-this.clipStart),this.player.duration())];return i.createTimeRanges(t)}};i.registerPlugin(`clipPlugin`,c);var l=function(e){return e.None=`None`,e.Complete=`Complete`,e.Incomplete=`Incomplete`,e}({}),u=i.getComponent(`Button`),d=class extends u{constructor(e,t){super(e,t),this.update()}update(){this.options_.activityStatus===l.Complete?this.addClass(`cv-activity-completed`):this.removeClass(`cv-activity-completed`)}handleClick(...e){this.options_.activityStatus=this.getToggledActivityStatus(),this.update(),this.options_.clickHandler&&this.options_.clickHandler.call(this,e)}buildCSSClass(){return`cv-activity-status-button`}getToggledActivityStatus(){if(this.options_.activityStatus===l.None||this.options_.activityStatus===l.Incomplete)return l.Complete;if(this.options_.activityStatus===l.Complete)return l.Incomplete}};d.prototype.controlText_=`Complete`;var f=i.getPlugin(`plugin`),p=class extends f{setActivityStatus(e,t){e!==this.activityStatus&&(this.activityStatus=e,this.onToggleStatus=t,this.player.ready(()=>{this.renderActivityStatusButton()}))}renderActivityStatusButton(){this.button&&this.player.removeChild(this.button),this.button=new d(this.player,{activityStatus:this.activityStatus,clickHandler:this.onToggleStatus}),this.player.addChild(this.button)}};i.registerPlugin(`activityStatusPlugin`,p);var m=i.getComponent(`MenuItem`),h=class extends m{constructor(e,t){super(e,t),this.onLoopVideoChange=this.onLoopVideoChange.bind(this),this.player_.on(`cv:loopvideo`,this.onLoopVideoChange),this.onLoopVideoChange(null,this.player_.loopVideoPlugin().loop())}onLoopVideoChange(e,t){t?this.toggleOn():this.toggleOff()}handleToggle(){let e=this.player_.loopVideoPlugin().loop();this.player_.loopVideoPlugin().loop(!e)}toggleOn(){i.dom.addClass(this.toggleEl,`on`)}toggleOff(){i.dom.removeClass(this.toggleEl,`on`)}handleClick(e){e.stopImmediatePropagation()}createEl(e,t,n){this.handlerBound||=(this.handleToggle=this.handleToggle.bind(this),!0),this.toggleEl&&this.toggleEl.removeEventListener(`click`,this.handleToggle),this.toggleEl=i.dom.createEl(`div`,{className:`custom-toggle custom-toggle-info toggle-option float-end`,innerHTML:`<span class="handle"></span></div>`}),this.toggleEl.addEventListener(`click`,this.handleToggle);let r=super.createEl(e,{className:`vjs-menu-item cv-cog-menu-item cv-loop-video-toggle`,innerHTML:`
1
+ import{a as e,ln as t,r as n}from"./BlDu0qdC.chunk.js";import{F as r,L as i,r as a}from"./DTUkmChD.chunk.js";var o=i.getPlugin(`plugin`),s=10,c=class extends o{constructor(e,t){if(super(e),t.startTime===void 0)throw Error(`Invalid clip start`);if(t.endTime===void 0)throw Error(`Invalid clip end`);if(t.startTime>t.endTime)throw Error(`Clip start cannot be greater than clip end`);this._clipStart=parseFloat(t.startTime.toPrecision(4)),this._clipEnd=parseFloat(t.endTime.toPrecision(4)),this.playerEndedFn=this.player.ended.bind(e),this.playerDurationFn=this.player.duration.bind(e),this.playerCurrentTimeFn=this.player.currentTime.bind(e),this.playerbufferedFn=this.player.buffered.bind(e),this.player.ended=this.ended.bind(this),this.player.duration=this.duration.bind(this),this.player.currentTime=this.currentTime.bind(this),this.player.buffered=this.buffered.bind(this),this.initialize(),this.player.ready(()=>{this.player.trigger(`durationchange`)})}get clipStart(){let e=this.playerDurationFn();return this._clipStart>e?e:this._clipStart}get clipEnd(){let e=this.playerDurationFn();return e<=0?this._clipEnd:this._clipEnd>e?e:this._clipEnd}dispose(){this.player.off(`timeupdate`,this.onTimeUpdate),this.player.off(`play`,this.onPlay),this.player.ended=this.playerEndedFn,this.player.duration=this.playerDurationFn,this.player.currentTime=this.playerCurrentTimeFn,this.player.buffered=this.playerbufferedFn,this.player.trigger(`durationchange`),super.dispose()}initialize(){this.onTimeUpdate=this.onTimeUpdate.bind(this),this.onPlay=this.onPlay.bind(this),this.player.on(`timeupdate`,this.onTimeUpdate),this.player.on(`play`,this.onPlay)}onPlay(){this._isEnded&&this.player.currentTime(0)}onTimeUpdate(){let e=this.getCurrentTime(!1);if(e>this.clipEnd){this._isEnded||=(this.player.pause(),this.player.trigger(`ended`),!0);return}this._isEnded=!1,e<this.clipStart-s&&this.playerCurrentTimeFn(this.clipStart,!0)}ended(){return this.getCurrentTime(!1)>this.clipEnd}duration(e){return e&&e>0&&(this.playerDurationFn()?console.info(`The duration of the player has already been set. This is a no-op.`):this.playerDurationFn(e)),this.clipEnd-this.clipStart}currentTime(e,...t){if(typeof e!=`number`)return this.getCurrentTime(!0);let n=e+this.clipStart;this.playerCurrentTimeFn(n,...t)}getCurrentTime(e){let t=this.playerCurrentTimeFn(),n=0;return t>=this.clipStart&&(n=t-this.clipStart),this.player.getCache().currentTime=n,e?n:t}buffered(){let e=this.playerbufferedFn(),t=[];for(let n=0;n<e.length;n++)t[n]=[Math.max(0,e.start(n)-this.clipStart),Math.min(Math.max(0,e.end(n)-this.clipStart),this.player.duration())];return i.createTimeRanges(t)}};i.registerPlugin(`clipPlugin`,c);var l=function(e){return e.None=`None`,e.Complete=`Complete`,e.Incomplete=`Incomplete`,e}({}),u=i.getComponent(`Button`),d=class extends u{constructor(e,t){super(e,t),this.update()}update(){this.options_.activityStatus===l.Complete?this.addClass(`cv-activity-completed`):this.removeClass(`cv-activity-completed`)}handleClick(...e){this.options_.activityStatus=this.getToggledActivityStatus(),this.update(),this.options_.clickHandler&&this.options_.clickHandler.call(this,e)}buildCSSClass(){return`cv-activity-status-button`}getToggledActivityStatus(){if(this.options_.activityStatus===l.None||this.options_.activityStatus===l.Incomplete)return l.Complete;if(this.options_.activityStatus===l.Complete)return l.Incomplete}};d.prototype.controlText_=`Complete`;var f=i.getPlugin(`plugin`),p=class extends f{setActivityStatus(e,t){e!==this.activityStatus&&(this.activityStatus=e,this.onToggleStatus=t,this.player.ready(()=>{this.renderActivityStatusButton()}))}renderActivityStatusButton(){this.button&&this.player.removeChild(this.button),this.button=new d(this.player,{activityStatus:this.activityStatus,clickHandler:this.onToggleStatus}),this.player.addChild(this.button)}};i.registerPlugin(`activityStatusPlugin`,p);var m=i.getComponent(`MenuItem`),h=class extends m{constructor(e,t){super(e,t),this.onLoopVideoChange=this.onLoopVideoChange.bind(this),this.player_.on(`cv:loopvideo`,this.onLoopVideoChange),this.onLoopVideoChange(null,this.player_.loopVideoPlugin().loop())}onLoopVideoChange(e,t){t?this.toggleOn():this.toggleOff()}handleToggle(){let e=this.player_.loopVideoPlugin().loop();this.player_.loopVideoPlugin().loop(!e)}toggleOn(){i.dom.addClass(this.toggleEl,`on`)}toggleOff(){i.dom.removeClass(this.toggleEl,`on`)}handleClick(e){e.stopImmediatePropagation()}createEl(e,t,n){this.handlerBound||=(this.handleToggle=this.handleToggle.bind(this),!0),this.toggleEl&&this.toggleEl.removeEventListener(`click`,this.handleToggle),this.toggleEl=i.dom.createEl(`div`,{className:`custom-toggle custom-toggle-info toggle-option float-end`,innerHTML:`<span class="handle"></span></div>`}),this.toggleEl.addEventListener(`click`,this.handleToggle);let r=super.createEl(e,{className:`vjs-menu-item cv-cog-menu-item cv-loop-video-toggle`,innerHTML:`
2
2
  <span class="vjs-menu-item-text">Loop video</span>
3
3
  <span class="cv-toggle-container"></span>`},n);return r.children[1].appendChild(this.toggleEl),r}dispose(){this.player_.off(`cv:loopvideo`,this.onLoopVideoChange),super.dispose()}};i.registerComponent(`LoopVideoMenuItem`,h);var g=i.getPlugin(`plugin`),_=i.getComponent(`LoopVideoMenuItem`),v=class extends g{constructor(e,t){super(e),t.allowLoop&&this.player.ready(()=>this.addButton()),this.onEnded=this.onEnded.bind(this),this.player.on(`ended`,this.onEnded)}addButton(){(this.player.getChild(`collapserator`)?.getChild(`cogButton`)).addItem({ctor:_,name:`LoopVideoMenuItem`})}onEnded(){this.player.loop()&&this.player.play()}loop(e){if(typeof e!=`boolean`)return this.player.loop();e&&this.player.nextVideoPlugin?.()?.setShouldPlayNext(!1,!1),this.player.trigger(`cv:loopvideo`,e),this.player.loop(e)}dispose(){this.player.off(`ended`,this.onEnded),super.dispose()}};i.registerPlugin(`loopVideoPlugin`,v);var y=t(e()),b=n();function x(e){let[t,n]=y.useState(5);if(y.useEffect(()=>{let e=setInterval(()=>{n(e=>e-1)},1e3);return()=>{clearInterval(e)}},[]),y.useEffect(()=>{t===0&&e.onPlayNext()},[t]),!e.nextVideo||!e.onPlayNext)return(0,b.jsx)(b.Fragment,{});let r=Math.ceil(t),i=r===1?`second`:`seconds`;return(0,b.jsx)(b.Fragment,{children:(0,b.jsxs)(`div`,{className:`cv-up-next-container`,children:[(0,b.jsx)(`div`,{className:`cv-cancel-up-next cursor-pointer`,role:`button`,onClick:e.onCancel,children:`×`}),(0,b.jsxs)(`div`,{className:`cv-up-next-heading`,children:[`Up next in `,r,` `,i,`:`]}),(0,b.jsx)(`div`,{className:`cv-up-next-image cursor-pointer`,onClick:e.onPlayNext,style:{backgroundImage:`url(${e.nextVideo?.thumbnailUrl})`}}),(0,b.jsx)(`div`,{className:`cv-up-next-title`,children:e.nextVideo.name})]})})}i.registerComponent(`UpNext`,a((e,t)=>(0,b.jsx)(x,{player:e,...t})));var S=i.getComponent(`MenuItem`),C=class extends S{constructor(e,t){super(e,t),this.bindListeners(),this.player_.nextVideoPlugin().getShouldPlayNext()&&this.toggleOn()}bindListeners(){this.onPlayNextChange=this.onPlayNextChange.bind(this),this.player_.on(`cv:playnext`,this.onPlayNextChange)}handleToggle(){let e=this.player_.nextVideoPlugin().getShouldPlayNext();this.player_.nextVideoPlugin().setShouldPlayNext(!e,!0)}onPlayNextChange(e,t){t?this.toggleOn():this.toggleOff()}toggleOn(){i.dom.addClass(this.toggleEl,`on`)}toggleOff(){i.dom.removeClass(this.toggleEl,`on`)}handleClick(e){e.stopImmediatePropagation()}createEl(e,t,n){this.handlerBound||=(this.handleToggle=this.handleToggle.bind(this),!0),this.toggleEl&&this.toggleEl.removeEventListener(`click`,this.handleToggle),this.toggleEl=i.dom.createEl(`div`,{className:`custom-toggle custom-toggle-info toggle-option float-end`,innerHTML:`<span class="handle"></span></div>`}),this.toggleEl.addEventListener(`click`,this.handleToggle);let r=super.createEl(e,{className:`vjs-menu-item cv-cog-menu-item cv-play-next-toggle`,innerHTML:`
4
4
  <span class="vjs-menu-item-text">Play next video</span>
5
5
  <span class="cv-toggle-container"></span>`},n);return r.children[1].appendChild(this.toggleEl),r}dispose(){this.player_.off(`cv:playnext`,this.onPlayNextChange),super.dispose()}};i.registerComponent(`NextVideoMenuItem`,C);var w=`cv-persisttest`,T=`cv-play-next-video`,E=i.getPlugin(`plugin`),D=i.getComponent(`NextVideoMenuItem`),O=class extends E{constructor(e){if(super(e),this.setShouldPlayNext=this.setShouldPlayNext.bind(this),this.getShouldPlayNext=this.getShouldPlayNext.bind(this),this.getChapterTrack=this.getChapterTrack.bind(this),this.onTimeUpdate=this.onTimeUpdate.bind(this),this.hasLocalStorage=this.testHasLocalStorage(),this.shouldPlayNextVideo=!1,this.hasLocalStorage){let e=window.localStorage.getItem(T);this.shouldPlayNextVideo=e===`true`}e.ready(()=>{this.initialize()})}initialize(){this.player.isDisposed()||this.bindListeners()}getChapterTrack(){return r.getTrack(this.player,`chapters`,null)}setNextVideo(e,t,n){this.nextVideo=e,this.callback=n,t&&this.setShouldPlayNext(!0),(this.player.getChild(`collapserator`)?.getChild(`cogButton`)).addItem({ctor:D,name:`NextVideoMenuItem`})}getShouldPlayNext(){return this.shouldPlayNextVideo}setShouldPlayNext(e,t){this.shouldPlayNextVideo=e,this.player.trigger(`cv:playnext`,e),this.hasLocalStorage&&t&&window.localStorage.setItem(T,e.toString()),e&&this.player.loopVideoPlugin().loop(!1)}bindListeners(){this.player.on(`timeupdate`,this.onTimeUpdate)}dispose(){this.player.off(`timeupdate`,this.onTimeUpdate),this.hideUpNext(),super.dispose()}onTimeUpdate(){if(!(this.player.pictureInPicture&&this.player.isInPictureInPicture())){if(!this.getShouldPlayNext()){this.hideUpNext();return}if(this.upNextRendered&&this.player.currentTime()<this.player.duration()){this.hideUpNext();return}this.player.ended()&&this.showUpNext()}}showUpNext(){this.upNextRendered||(this.upNextRendered=!0,this.player.addChild(`UpNext`,{nextVideo:this.nextVideo,onPlayNext:this.callback,onCancel:()=>{this.hideUpNext(),this.setShouldPlayNext(!1)}}))}hideUpNext(){if(!this.upNextRendered)return;this.upNextRendered=!1;let e=this.player.getChild(`UpNext`);e&&(this.player.removeChild(e),e.dispose())}testHasLocalStorage(){try{return window.localStorage.setItem(w,`persistPlayNext`),window.localStorage.removeItem(w),!0}catch{return!1}}};i.registerPlugin(`nextVideoPlugin`,O);
6
- //# sourceMappingURL=CofA9RRF.chunk.js.map
6
+ //# sourceMappingURL=CzCUe0Ej.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CofA9RRF.chunk.js","names":[],"sources":["../../../../../../player/src/plugins/clip-plugin/clip-plugin.ts","../../../../../../../libs/shared/src/enums/ShareActivityStatus.ts","../../../../../../player/src/plugins/activity-status-plugin/components/activity-status-button.ts","../../../../../../player/src/plugins/activity-status-plugin/activity-status-plugin.ts","../../../../../../player/src/plugins/loop-video-plugin/components/loop-video-menu-item.ts","../../../../../../player/src/plugins/loop-video-plugin/loop-video-plugin.ts","../../../../../../player/src/plugins/next-video-plugin/components/up-next/up-next.scss","../../../../../../player/src/plugins/next-video-plugin/components/up-next/up-next.tsx","../../../../../../player/src/components/next-video-menu-item/next-video-menu-item.ts","../../../../../../player/src/plugins/next-video-plugin/next-video-plugin.ts"],"sourcesContent":["import videojs, { VideoJsPlayer } from 'video.js';\n\nconst Plugin = videojs.getPlugin('plugin');\n\n/**\n * TODO:\n * The value below is set quite high to compensate for the ridiculous amount of drift that can occur\n * when casting to a Vivi device. This is a temporary fix until we can get Vivi to fix the issue on their end.\n */\nconst CLIP_SEEK_DRIFT_IN_SECONDS = 10;\n\nexport interface ClipPluginOptions {\n startTime: number;\n endTime: number;\n}\n\nexport class ClipPlugin extends Plugin {\n private _clipStart: number;\n private _clipEnd: number;\n private _isEnded: boolean;\n\n private playerEndedFn: () => boolean;\n private playerDurationFn: (seconds?: number) => number;\n private playerCurrentTimeFn: (seconds?: number, ...args: any[]) => number;\n private playerbufferedFn: () => TimeRanges;\n\n constructor(player: VideoJsPlayer, options: ClipPluginOptions) {\n super(player);\n\n // validate clip start/end\n if (options.startTime === undefined) {\n throw Error('Invalid clip start');\n }\n\n if (options.endTime === undefined) {\n throw Error('Invalid clip end');\n }\n\n if (options.startTime > options.endTime) {\n throw Error('Clip start cannot be greater than clip end');\n }\n\n this._clipStart = parseFloat(options.startTime.toPrecision(4));\n this._clipEnd = parseFloat(options.endTime.toPrecision(4));\n\n // save old player functions\n this.playerEndedFn = this.player.ended.bind(player);\n this.playerDurationFn = this.player.duration.bind(player);\n this.playerCurrentTimeFn = this.player.currentTime.bind(player);\n this.playerbufferedFn = this.player.buffered.bind(player);\n\n // overwrite the base player function with our new fancy ones\n this.player.ended = this.ended.bind(this);\n this.player.duration = this.duration.bind(this);\n this.player.currentTime = this.currentTime.bind(this);\n this.player.buffered = this.buffered.bind(this);\n\n this.initialize();\n\n this.player.ready(() => {\n // manually trigger a duation change since we have a new duration from the clip\n this.player.trigger('durationchange');\n });\n }\n\n /**\n * Ensure that the clip start is not greater than the total video duration\n */\n public get clipStart(): number {\n const videoDuration = this.playerDurationFn();\n\n if (this._clipStart > videoDuration)\n return videoDuration;\n\n return this._clipStart;\n }\n\n /**\n * Ensure that the clip end is not greater than the total video duration\n */\n public get clipEnd(): number {\n const videoDuration = this.playerDurationFn();\n\n // The video duration may not have been determined yet, so we can't do\n // any clamping right now..\n if (videoDuration <= 0)\n return this._clipEnd;\n\n // Clamp the clip end to the video duration\n if (this._clipEnd > videoDuration)\n return videoDuration;\n\n return this._clipEnd;\n }\n\n public dispose(): void {\n this.player.off('timeupdate', this.onTimeUpdate);\n this.player.off('play', this.onPlay);\n\n // put the original functions back\n this.player.ended = this.playerEndedFn;\n this.player.duration = this.playerDurationFn;\n this.player.currentTime = this.playerCurrentTimeFn;\n this.player.buffered = this.playerbufferedFn;\n\n // trigger another durationchange since the duration will now go back to the original\n this.player.trigger('durationchange');\n\n super.dispose();\n }\n\n private initialize(): void {\n this.onTimeUpdate = this.onTimeUpdate.bind(this);\n this.onPlay = this.onPlay.bind(this);\n\n this.player.on('timeupdate', this.onTimeUpdate);\n this.player.on('play', this.onPlay);\n }\n\n private onPlay(): void {\n // if we try to play but the clip has ended, go back to the start\n if (this._isEnded) {\n this.player.currentTime(0);\n }\n }\n\n private onTimeUpdate(): void {\n const currentTime = this.getCurrentTime(false);\n\n // check ended\n if (currentTime > this.clipEnd) {\n if (!this._isEnded) {\n this.player.pause();\n this.player.trigger('ended');\n \n this._isEnded = true;\n }\n\n return;\n }\n\n this._isEnded = false;\n\n // ensure video is playing from the correct clip start (taking into account some seek drift)\n if (currentTime < (this.clipStart - CLIP_SEEK_DRIFT_IN_SECONDS)) {\n this.playerCurrentTimeFn(this.clipStart, true);\n }\n }\n\n private ended(): boolean {\n return this.getCurrentTime(false) > this.clipEnd;\n }\n\n private duration(seconds?: number): number {\n // set the underlying player duration (and cache) if it hasn't been set already\n if (seconds && seconds > 0) {\n const existingDuration = this.playerDurationFn();\n\n if (existingDuration)\n console.info('The duration of the player has already been set. This is a no-op.');\n else\n this.playerDurationFn(seconds);\n }\n \n return this.clipEnd - this.clipStart;\n }\n\n private currentTime(seconds?: number, ...args: any[]): number {\n if (typeof seconds !== 'number') {\n return this.getCurrentTime(true);\n }\n\n const correctedSeconds = seconds + this.clipStart;\n\n this.playerCurrentTimeFn(correctedSeconds, ...args);\n\n return;\n }\n\n /**\n * Gets the current time of the video and updates the videojs currentTime cache\n * @param clipTime Set to true to return the current time in the context of a clip\n */\n private getCurrentTime(clipTime: boolean): number {\n const playerCurrentTime = this.playerCurrentTimeFn();\n let time = 0;\n\n if (playerCurrentTime >= this.clipStart) {\n time = playerCurrentTime - this.clipStart;\n }\n\n // ensure that the videojs currentTime cache reflects our fake time\n this.player.getCache().currentTime = time;\n\n if (clipTime)\n return time;\n\n return playerCurrentTime;\n }\n\n private buffered(): TimeRanges {\n const buff = this.playerbufferedFn();\n const ranges = [];\n\n for (let i = 0; i < buff.length; i++) {\n ranges[i] = [\n Math.max(0, buff.start(i) - this.clipStart),\n Math.min(Math.max(0, buff.end(i) - this.clipStart), this.player.duration())\n ];\n }\n\n return videojs.createTimeRanges(ranges as any);\n }\n}\n\nvideojs.registerPlugin('clipPlugin', ClipPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n clipPlugin(options: ClipPluginOptions): void;\n }\n}\n","export enum ShareActivityStatus {\n None = 'None',\n Complete = 'Complete',\n Incomplete = 'Incomplete'\n}\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport { ShareActivityStatus } from 'libs/shared/enums/ShareActivityStatus';\n\nconst Button = videojs.getComponent('Button');\n\nimport './activity-status-button.scss';\n\ninterface ActivityStatusButtonOptions extends videojs.ComponentOptions {\n activityStatus: ShareActivityStatus;\n clickHandler: () => void;\n}\n\nexport class ActivityStatusButton extends Button {\n public options_: ActivityStatusButtonOptions;\n public controlText_: string;\n\n constructor(player: VideoJsPlayer, options: ActivityStatusButtonOptions) {\n super(player, options);\n\n this.update();\n }\n\n public update(): void {\n if (this.options_.activityStatus === ShareActivityStatus.Complete)\n this.addClass('cv-activity-completed');\n else\n this.removeClass('cv-activity-completed');\n }\n\n public handleClick(...args: any[]) {\n this.options_.activityStatus = this.getToggledActivityStatus();\n\n this.update();\n if (this.options_.clickHandler) {\n this.options_.clickHandler.call(this, args);\n }\n }\n\n public buildCSSClass(): string {\n return 'cv-activity-status-button';\n }\n\n private getToggledActivityStatus(): ShareActivityStatus {\n if (this.options_.activityStatus === ShareActivityStatus.None\n || this.options_.activityStatus === ShareActivityStatus.Incomplete) {\n return ShareActivityStatus.Complete;\n }\n\n if (this.options_.activityStatus === ShareActivityStatus.Complete) {\n return ShareActivityStatus.Incomplete;\n }\n }\n}\n\nActivityStatusButton.prototype.controlText_ = 'Complete';\n","import videojs from 'video.js';\n\nimport { ShareActivityStatus } from 'libs/shared/enums/ShareActivityStatus';\n\nimport { ActivityStatusButton } from 'projects/player/plugins/activity-status-plugin/components/activity-status-button';\n\nconst Plugin = videojs.getPlugin('plugin');\n\nclass ActivityStatusPlugin extends Plugin {\n private activityStatus: ShareActivityStatus;\n private onToggleStatus: () => void;\n private button: ActivityStatusButton;\n\n public setActivityStatus(activityStatus: ShareActivityStatus, onToggleStatus: () => void): void {\n if (activityStatus === this.activityStatus)\n return;\n\n this.activityStatus = activityStatus;\n this.onToggleStatus = onToggleStatus;\n\n this.player.ready(() => {\n this.renderActivityStatusButton();\n });\n }\n\n // Remove old button and render new button when activity status is different from previous status\n private renderActivityStatusButton(): void {\n if (this.button) {\n this.player.removeChild(this.button);\n }\n\n this.button = new ActivityStatusButton(this.player, {\n activityStatus: this.activityStatus,\n clickHandler: this.onToggleStatus\n });\n\n this.player.addChild(this.button);\n }\n}\n\nvideojs.registerPlugin('activityStatusPlugin', ActivityStatusPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n activityStatusPlugin(): ActivityStatusPlugin;\n }\n}\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport './loop-video-menu-item.scss';\n\nconst MenuItem = videojs.getComponent('MenuItem');\n\nexport class LoopVideoMenuItem extends MenuItem {\n private toggleEl: Element;\n\n /**\n * Because we want to bind our listener in createEl\n * and createEl runs in super. We store if we've bounud\n * our handler, so we only call bind once and \n * the call to removeEventListener will still work\n */\n private handlerBound: boolean;\n\n constructor(player: VideoJsPlayer, options: videojs.ComponentOptions) {\n super(player, options);\n\n this.onLoopVideoChange = this.onLoopVideoChange.bind(this);\n\n this.player_.on('cv:loopvideo', this.onLoopVideoChange);\n\n this.onLoopVideoChange(null, this.player_.loopVideoPlugin().loop());\n }\n\n private onLoopVideoChange(_: any, enabled: boolean): void {\n enabled ? this.toggleOn() : this.toggleOff();\n }\n\n public handleToggle(): void {\n const loop = this.player_.loopVideoPlugin().loop();\n\n this.player_.loopVideoPlugin().loop(!loop);\n }\n\n private toggleOn(): void {\n videojs.dom.addClass(this.toggleEl, 'on');\n }\n\n private toggleOff(): void {\n videojs.dom.removeClass(this.toggleEl, 'on');\n }\n\n /**\n * Because we extend MenuItem which will close the menu by default\n * we need to halt the event propogation here\n */\n public handleClick(event: videojs.EventTarget.Event): void {\n event.stopImmediatePropagation();\n }\n\n public createEl(tagName?: string, properties?: any, attributes?: any): HTMLLIElement {\n /**\n * Bind our event listener only once\n * see the comment where handlerBound is defined\n */\n if (!this.handlerBound) {\n this.handleToggle = this.handleToggle.bind(this);\n this.handlerBound = true;\n }\n\n if (this.toggleEl)\n this.toggleEl.removeEventListener('click', this.handleToggle);\n\n this.toggleEl = videojs.dom.createEl('div', {\n className: `custom-toggle custom-toggle-info toggle-option float-end`,\n innerHTML: '<span class=\"handle\"></span></div>'\n });\n this.toggleEl.addEventListener('click', this.handleToggle);\n\n const innerHTML = `\n <span class=\"vjs-menu-item-text\">Loop video</span>\n <span class=\"cv-toggle-container\"></span>`;\n\n const el = super.createEl(tagName, {\n className: 'vjs-menu-item cv-cog-menu-item cv-loop-video-toggle',\n innerHTML\n }, attributes);\n\n /**\n * Indexing into the child this way is only safe to do because\n * we know that the el only has two children\n */\n el.children[1].appendChild(this.toggleEl);\n\n return el;\n }\n\n public dispose(): void {\n this.player_.off('cv:loopvideo', this.onLoopVideoChange);\n super.dispose();\n }\n}\n\nvideojs.registerComponent('LoopVideoMenuItem', LoopVideoMenuItem);\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport { CogButton } from 'projects/player/components/cog-button/cog-button';\n\nimport 'projects/player/plugins/loop-video-plugin/components/loop-video-menu-item';\n\nconst Plugin = videojs.getPlugin('plugin');\nconst LoopVideoMenuItem = videojs.getComponent('LoopVideoMenuItem') as unknown as typeof videojs.MenuItem;\n\ninterface LoopVideoPluginOptions {\n allowLoop: boolean;\n}\n\nclass LoopVideoPlugin extends Plugin {\n constructor(player: VideoJsPlayer, options: LoopVideoPluginOptions) {\n super(player);\n\n // Button must be added after ctor finishes, otherwise subsequent calls to\n // this.player.loopVideoPlugin() will try make a new plugin - Sha\n if (options.allowLoop)\n this.player.ready(() => this.addButton());\n\n this.onEnded = this.onEnded.bind(this);\n this.player.on('ended', this.onEnded);\n }\n\n private addButton(): void {\n /**\n * Check additionalItemOrder in cog-button.ts if you need to change the order. - Sha\n */\n const cogButton = this.player.getChild('collapserator')?.getChild('cogButton') as CogButton;\n cogButton.addItem({ ctor: LoopVideoMenuItem, name: 'LoopVideoMenuItem' });\n }\n\n private onEnded(): void {\n // turns out the regular loop functionality doesn't work with clips.\n // this call will just do nothing for videos - Sha\n if (this.player.loop())\n this.player.play();\n }\n\n public loop(enabled: boolean): void;\n public loop(): boolean ;\n public loop(enabled?: boolean): any {\n if (typeof enabled !== 'boolean')\n return this.player.loop();\n\n if (enabled)\n this.player.nextVideoPlugin?.()?.setShouldPlayNext(false, false);\n\n this.player.trigger('cv:loopvideo', enabled);\n this.player.loop(enabled);\n }\n\n public dispose(): void {\n this.player.off('ended', this.onEnded);\n super.dispose();\n }\n}\n\nvideojs.registerPlugin('loopVideoPlugin', LoopVideoPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n loopVideoPlugin(options?: LoopVideoPluginOptions): LoopVideoPlugin;\n }\n}\n","// This file is using some horrid valuies\n// It needs to be re-written this was just quickly thrown together\n// to show something at retro - Sha\n\n.video-js {\n .cv-up-next-container {\n position: absolute;\n bottom: 1.5em;\n color: $white;\n padding: 0.8em;\n width: 19em;\n border-radius: 0.3333em;\n background: $menu-bg;\n right: 1.5em;\n font-size: 1.5em;\n z-index: 6;\n }\n\n .cv-cancel-up-next {\n position: absolute;\n top: 0;\n right: 0.4em;\n font-size: 2em;\n }\n\n .cv-up-next-image {\n padding-bottom: 56.25%;\n background-size: contain;\n border-radius: 0.3333em;\n background-color: linear-gradient(to right, $gray-300, $gray-100);\n }\n\n .cv-up-next-heading {\n color: $white;\n padding-bottom: 0.6em;\n }\n\n .cv-up-next-title {\n color: $white;\n padding-top: 0.6em;\n }\n}","import * as React from 'react';\nimport videojs, { VideoJsPlayer } from 'video.js';\n\nimport { NextVideo } from 'projects/player/interfaces/NextVideo';\nimport { getReactComponent } from 'projects/player/react/react-component';\n\nimport './up-next.scss';\n\ninterface UpNextProps {\n player: VideoJsPlayer;\n nextVideo: NextVideo;\n onPlayNext: () => void;\n onCancel: () => void;\n}\n\nfunction UpNext(props: UpNextProps): JSX.Element {\n const [ timeRemaining, setTimeRemaining ] = React.useState(5);\n\n React.useEffect(() => {\n const timer = setInterval(() => {\n setTimeRemaining(prev => prev - 1);\n }, 1000);\n\n return () => {\n clearInterval(timer);\n };\n }, []);\n\n React.useEffect(() => {\n if (timeRemaining === 0)\n props.onPlayNext();\n }, [timeRemaining]);\n\n if (!props.nextVideo || !props.onPlayNext)\n return <></>;\n\n const roundedTimeRemaining = Math.ceil(timeRemaining);\n const secondsString = roundedTimeRemaining === 1 ? 'second' : 'seconds';\n\n return (\n <>\n <div className='cv-up-next-container'>\n <div className='cv-cancel-up-next cursor-pointer' role='button' onClick={props.onCancel}>&times;</div>\n <div className='cv-up-next-heading'>Up next in {roundedTimeRemaining} {secondsString}:</div>\n <div\n className='cv-up-next-image cursor-pointer'\n onClick={props.onPlayNext}\n style={{\n backgroundImage: `url(${props.nextVideo?.thumbnailUrl})`\n }}\n ></div>\n <div className='cv-up-next-title'>{props.nextVideo.name}</div>\n </div>\n </>\n );\n}\n\nvideojs.registerComponent(\n 'UpNext',\n getReactComponent(\n (player: VideoJsPlayer, options: UpNextProps) => <UpNext player={player} {...options} />\n )\n);\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport './next-video-menu-item.scss';\n\nconst MenuItem = videojs.getComponent('MenuItem');\n\nclass NextVideoMenuItem extends MenuItem {\n private toggleEl: Element;\n\n /**\n * Because we want to bind our listener in createEl\n * and createEl runs in super. We store if we've bounud\n * our handler, so we only call bind once and \n * the call to removeEventListener will still work\n */\n private handlerBound: boolean;\n\n constructor(player: VideoJsPlayer, options: videojs.ComponentOptions) {\n super(player, options);\n\n this.bindListeners();\n\n if (this.player_.nextVideoPlugin().getShouldPlayNext())\n this.toggleOn();\n }\n\n private bindListeners(): void {\n this.onPlayNextChange = this.onPlayNextChange.bind(this);\n\n this.player_.on('cv:playnext', this.onPlayNextChange);\n }\n\n public handleToggle(): void {\n const shouldPlayNext = this.player_.nextVideoPlugin().getShouldPlayNext();\n\n this.player_.nextVideoPlugin().setShouldPlayNext(!shouldPlayNext, true);\n }\n\n private onPlayNextChange(_: any, enabled: boolean): void {\n enabled ? this.toggleOn() : this.toggleOff();\n }\n\n private toggleOn(): void {\n videojs.dom.addClass(this.toggleEl, 'on');\n }\n\n private toggleOff(): void {\n videojs.dom.removeClass(this.toggleEl, 'on');\n }\n\n /**\n * Because we extend MenuItem which will close the menu by default\n * we need to halt the event propogation here\n */\n public handleClick(event: videojs.EventTarget.Event): void {\n event.stopImmediatePropagation();\n }\n\n public createEl(tagName?: string, properties?: any, attributes?: any): HTMLLIElement {\n /**\n * Bind our event listener only once\n * see the comment where handlerBound is defined\n */\n if (!this.handlerBound) {\n this.handleToggle = this.handleToggle.bind(this);\n this.handlerBound = true;\n }\n\n if (this.toggleEl)\n this.toggleEl.removeEventListener('click', this.handleToggle);\n\n this.toggleEl = videojs.dom.createEl('div', {\n className: `custom-toggle custom-toggle-info toggle-option float-end`,\n innerHTML: '<span class=\"handle\"></span></div>'\n });\n this.toggleEl.addEventListener('click', this.handleToggle);\n\n const innerHTML = `\n <span class=\"vjs-menu-item-text\">Play next video</span>\n <span class=\"cv-toggle-container\"></span>`;\n\n const el = super.createEl(tagName, {\n className: 'vjs-menu-item cv-cog-menu-item cv-play-next-toggle',\n innerHTML\n }, attributes);\n\n /**\n * Indexing into the child this way is only safe to do because\n * we know that the el only has two children\n */\n el.children[1].appendChild(this.toggleEl);\n\n return el;\n }\n\n public dispose(): void {\n this.player_.off('cv:playnext', this.onPlayNextChange);\n super.dispose();\n }\n}\n\nvideojs.registerComponent('NextVideoMenuItem', NextVideoMenuItem);\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport { CogButton } from 'projects/player/components/cog-button/cog-button';\nimport { NextVideo } from 'projects/player/interfaces/NextVideo';\nimport { TrackHelper } from 'projects/player/utils/track-helper';\n\nimport 'projects/player/plugins/next-video-plugin/components/up-next/up-next';\nimport 'projects/player/components/next-video-menu-item/next-video-menu-item';\n\nconst TEST = 'cv-persisttest';\nconst PLAY_NEXT = 'cv-play-next-video';\n\nconst Plugin = videojs.getPlugin('plugin');\nconst NextVideoMenuItem = videojs.getComponent('NextVideoMenuItem') as unknown as typeof videojs.MenuItem;\n\nclass NextVideoPlugin extends Plugin {\n private shouldPlayNextVideo: boolean;\n private hasLocalStorage: boolean;\n private nextVideoMenuItem: typeof videojs.MenuItem;\n\n private upNextRendered: boolean;\n\n private nextVideo: NextVideo;\n private callback: () => void;\n \n constructor(player: VideoJsPlayer) {\n super(player);\n\n this.setShouldPlayNext = this.setShouldPlayNext.bind(this);\n this.getShouldPlayNext = this.getShouldPlayNext.bind(this);\n this.getChapterTrack = this.getChapterTrack.bind(this);\n this.onTimeUpdate = this.onTimeUpdate.bind(this);\n\n this.hasLocalStorage = this.testHasLocalStorage();\n\n this.shouldPlayNextVideo = false;\n\n if (this.hasLocalStorage) {\n const item = window.localStorage.getItem(PLAY_NEXT);\n this.shouldPlayNextVideo = item === 'true';\n }\n\n player.ready(() => {\n this.initialize();\n });\n }\n \n private initialize(): void {\n if ((this.player as any).isDisposed())\n return;\n \n this.bindListeners();\n }\n\n private getChapterTrack(): TextTrack {\n return TrackHelper.getTrack(this.player, 'chapters', null);\n }\n\n public setNextVideo(nextVideo: NextVideo, playNext: boolean, callback: () => void): void {\n this.nextVideo = nextVideo;\n this.callback = callback;\n\n if (playNext)\n this.setShouldPlayNext(true);\n\n /**\n * Check additionalItemOrder in cog-button.ts if you need to change the order. - Sha\n */\n const cogButton = this.player.getChild('collapserator')?.getChild('cogButton') as CogButton;\n cogButton.addItem({ ctor: NextVideoMenuItem, name: 'NextVideoMenuItem' });\n }\n\n public getShouldPlayNext(): boolean {\n return this.shouldPlayNextVideo;\n }\n\n public setShouldPlayNext(val: boolean, persist?: boolean): void {\n this.shouldPlayNextVideo = val;\n this.player.trigger('cv:playnext', val);\n\n if (this.hasLocalStorage && persist)\n window.localStorage.setItem(PLAY_NEXT, val.toString());\n\n if (val)\n this.player.loopVideoPlugin().loop(false);\n }\n\n private bindListeners(): void {\n this.player.on('timeupdate', this.onTimeUpdate);\n }\n\n public dispose(): void {\n this.player.off('timeupdate', this.onTimeUpdate);\n\n this.hideUpNext();\n\n super.dispose();\n }\n\n private onTimeUpdate(): void {\n /**\n * Do nothing when in picture in picture.\n * TODO: Figure out how next video should work for PiP\n */\n if (this.player.pictureInPicture && this.player.isInPictureInPicture())\n return;\n\n if (!this.getShouldPlayNext()) {\n this.hideUpNext();\n return;\n }\n\n /*\n * Always hide the up-next tile if the video is not at the end\n */\n if (this.upNextRendered && this.player.currentTime() < this.player.duration()) {\n this.hideUpNext();\n return;\n }\n\n /*\n * Show the up-next tile when the video has finished\n */\n if (this.player.ended()) {\n this.showUpNext();\n }\n }\n\n private showUpNext(): void {\n if (this.upNextRendered)\n return;\n\n this.upNextRendered = true;\n\n this.player.addChild('UpNext', {\n nextVideo: this.nextVideo,\n onPlayNext: this.callback,\n onCancel: () => {\n this.hideUpNext();\n this.setShouldPlayNext(false);\n }\n });\n }\n\n private hideUpNext(): void {\n if (!this.upNextRendered)\n return;\n\n this.upNextRendered = false;\n\n const upNext = this.player.getChild('UpNext');\n\n if (upNext) {\n this.player.removeChild(upNext);\n upNext.dispose();\n }\n }\n\n private testHasLocalStorage(): boolean {\n try {\n window.localStorage.setItem(TEST, 'persistPlayNext');\n window.localStorage.removeItem(TEST);\n return true;\n } catch {\n return false;\n }\n }\n}\n\nvideojs.registerPlugin('nextVideoPlugin', NextVideoPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n nextVideoPlugin(): NextVideoPlugin;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"CzCUe0Ej.chunk.js","names":[],"sources":["../../../../../../player/src/plugins/clip-plugin/clip-plugin.ts","../../../../../../../libs/shared/src/enums/ShareActivityStatus.ts","../../../../../../player/src/plugins/activity-status-plugin/components/activity-status-button.ts","../../../../../../player/src/plugins/activity-status-plugin/activity-status-plugin.ts","../../../../../../player/src/plugins/loop-video-plugin/components/loop-video-menu-item.ts","../../../../../../player/src/plugins/loop-video-plugin/loop-video-plugin.ts","../../../../../../player/src/plugins/next-video-plugin/components/up-next/up-next.scss","../../../../../../player/src/plugins/next-video-plugin/components/up-next/up-next.tsx","../../../../../../player/src/components/next-video-menu-item/next-video-menu-item.ts","../../../../../../player/src/plugins/next-video-plugin/next-video-plugin.ts"],"sourcesContent":["import videojs, { VideoJsPlayer } from 'video.js';\n\nconst Plugin = videojs.getPlugin('plugin');\n\n/**\n * TODO:\n * The value below is set quite high to compensate for the ridiculous amount of drift that can occur\n * when casting to a Vivi device. This is a temporary fix until we can get Vivi to fix the issue on their end.\n */\nconst CLIP_SEEK_DRIFT_IN_SECONDS = 10;\n\nexport interface ClipPluginOptions {\n startTime: number;\n endTime: number;\n}\n\nexport class ClipPlugin extends Plugin {\n private _clipStart: number;\n private _clipEnd: number;\n private _isEnded: boolean;\n\n private playerEndedFn: () => boolean;\n private playerDurationFn: (seconds?: number) => number;\n private playerCurrentTimeFn: (seconds?: number, ...args: any[]) => number;\n private playerbufferedFn: () => TimeRanges;\n\n constructor(player: VideoJsPlayer, options: ClipPluginOptions) {\n super(player);\n\n // validate clip start/end\n if (options.startTime === undefined) {\n throw Error('Invalid clip start');\n }\n\n if (options.endTime === undefined) {\n throw Error('Invalid clip end');\n }\n\n if (options.startTime > options.endTime) {\n throw Error('Clip start cannot be greater than clip end');\n }\n\n this._clipStart = parseFloat(options.startTime.toPrecision(4));\n this._clipEnd = parseFloat(options.endTime.toPrecision(4));\n\n // save old player functions\n this.playerEndedFn = this.player.ended.bind(player);\n this.playerDurationFn = this.player.duration.bind(player);\n this.playerCurrentTimeFn = this.player.currentTime.bind(player);\n this.playerbufferedFn = this.player.buffered.bind(player);\n\n // overwrite the base player function with our new fancy ones\n this.player.ended = this.ended.bind(this);\n this.player.duration = this.duration.bind(this);\n this.player.currentTime = this.currentTime.bind(this);\n this.player.buffered = this.buffered.bind(this);\n\n this.initialize();\n\n this.player.ready(() => {\n // manually trigger a duation change since we have a new duration from the clip\n this.player.trigger('durationchange');\n });\n }\n\n /**\n * Ensure that the clip start is not greater than the total video duration\n */\n public get clipStart(): number {\n const videoDuration = this.playerDurationFn();\n\n if (this._clipStart > videoDuration)\n return videoDuration;\n\n return this._clipStart;\n }\n\n /**\n * Ensure that the clip end is not greater than the total video duration\n */\n public get clipEnd(): number {\n const videoDuration = this.playerDurationFn();\n\n // The video duration may not have been determined yet, so we can't do\n // any clamping right now..\n if (videoDuration <= 0)\n return this._clipEnd;\n\n // Clamp the clip end to the video duration\n if (this._clipEnd > videoDuration)\n return videoDuration;\n\n return this._clipEnd;\n }\n\n public dispose(): void {\n this.player.off('timeupdate', this.onTimeUpdate);\n this.player.off('play', this.onPlay);\n\n // put the original functions back\n this.player.ended = this.playerEndedFn;\n this.player.duration = this.playerDurationFn;\n this.player.currentTime = this.playerCurrentTimeFn;\n this.player.buffered = this.playerbufferedFn;\n\n // trigger another durationchange since the duration will now go back to the original\n this.player.trigger('durationchange');\n\n super.dispose();\n }\n\n private initialize(): void {\n this.onTimeUpdate = this.onTimeUpdate.bind(this);\n this.onPlay = this.onPlay.bind(this);\n\n this.player.on('timeupdate', this.onTimeUpdate);\n this.player.on('play', this.onPlay);\n }\n\n private onPlay(): void {\n // if we try to play but the clip has ended, go back to the start\n if (this._isEnded) {\n this.player.currentTime(0);\n }\n }\n\n private onTimeUpdate(): void {\n const currentTime = this.getCurrentTime(false);\n\n // check ended\n if (currentTime > this.clipEnd) {\n if (!this._isEnded) {\n this.player.pause();\n this.player.trigger('ended');\n \n this._isEnded = true;\n }\n\n return;\n }\n\n this._isEnded = false;\n\n // ensure video is playing from the correct clip start (taking into account some seek drift)\n if (currentTime < (this.clipStart - CLIP_SEEK_DRIFT_IN_SECONDS)) {\n this.playerCurrentTimeFn(this.clipStart, true);\n }\n }\n\n private ended(): boolean {\n return this.getCurrentTime(false) > this.clipEnd;\n }\n\n private duration(seconds?: number): number {\n // set the underlying player duration (and cache) if it hasn't been set already\n if (seconds && seconds > 0) {\n const existingDuration = this.playerDurationFn();\n\n if (existingDuration)\n console.info('The duration of the player has already been set. This is a no-op.');\n else\n this.playerDurationFn(seconds);\n }\n \n return this.clipEnd - this.clipStart;\n }\n\n private currentTime(seconds?: number, ...args: any[]): number {\n if (typeof seconds !== 'number') {\n return this.getCurrentTime(true);\n }\n\n const correctedSeconds = seconds + this.clipStart;\n\n this.playerCurrentTimeFn(correctedSeconds, ...args);\n\n return;\n }\n\n /**\n * Gets the current time of the video and updates the videojs currentTime cache\n * @param clipTime Set to true to return the current time in the context of a clip\n */\n private getCurrentTime(clipTime: boolean): number {\n const playerCurrentTime = this.playerCurrentTimeFn();\n let time = 0;\n\n if (playerCurrentTime >= this.clipStart) {\n time = playerCurrentTime - this.clipStart;\n }\n\n // ensure that the videojs currentTime cache reflects our fake time\n this.player.getCache().currentTime = time;\n\n if (clipTime)\n return time;\n\n return playerCurrentTime;\n }\n\n private buffered(): TimeRanges {\n const buff = this.playerbufferedFn();\n const ranges = [];\n\n for (let i = 0; i < buff.length; i++) {\n ranges[i] = [\n Math.max(0, buff.start(i) - this.clipStart),\n Math.min(Math.max(0, buff.end(i) - this.clipStart), this.player.duration())\n ];\n }\n\n return videojs.createTimeRanges(ranges as any);\n }\n}\n\nvideojs.registerPlugin('clipPlugin', ClipPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n clipPlugin(options: ClipPluginOptions): void;\n }\n}\n","export enum ShareActivityStatus {\n None = 'None',\n Complete = 'Complete',\n Incomplete = 'Incomplete'\n}\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport { ShareActivityStatus } from 'libs/shared/enums/ShareActivityStatus';\n\nconst Button = videojs.getComponent('Button');\n\nimport './activity-status-button.scss';\n\ninterface ActivityStatusButtonOptions extends videojs.ComponentOptions {\n activityStatus: ShareActivityStatus;\n clickHandler: () => void;\n}\n\nexport class ActivityStatusButton extends Button {\n public options_: ActivityStatusButtonOptions;\n public controlText_: string;\n\n constructor(player: VideoJsPlayer, options: ActivityStatusButtonOptions) {\n super(player, options);\n\n this.update();\n }\n\n public update(): void {\n if (this.options_.activityStatus === ShareActivityStatus.Complete)\n this.addClass('cv-activity-completed');\n else\n this.removeClass('cv-activity-completed');\n }\n\n public handleClick(...args: any[]) {\n this.options_.activityStatus = this.getToggledActivityStatus();\n\n this.update();\n if (this.options_.clickHandler) {\n this.options_.clickHandler.call(this, args);\n }\n }\n\n public buildCSSClass(): string {\n return 'cv-activity-status-button';\n }\n\n private getToggledActivityStatus(): ShareActivityStatus {\n if (this.options_.activityStatus === ShareActivityStatus.None\n || this.options_.activityStatus === ShareActivityStatus.Incomplete) {\n return ShareActivityStatus.Complete;\n }\n\n if (this.options_.activityStatus === ShareActivityStatus.Complete) {\n return ShareActivityStatus.Incomplete;\n }\n }\n}\n\nActivityStatusButton.prototype.controlText_ = 'Complete';\n","import videojs from 'video.js';\n\nimport { ShareActivityStatus } from 'libs/shared/enums/ShareActivityStatus';\n\nimport { ActivityStatusButton } from 'projects/player/plugins/activity-status-plugin/components/activity-status-button';\n\nconst Plugin = videojs.getPlugin('plugin');\n\nclass ActivityStatusPlugin extends Plugin {\n private activityStatus: ShareActivityStatus;\n private onToggleStatus: () => void;\n private button: ActivityStatusButton;\n\n public setActivityStatus(activityStatus: ShareActivityStatus, onToggleStatus: () => void): void {\n if (activityStatus === this.activityStatus)\n return;\n\n this.activityStatus = activityStatus;\n this.onToggleStatus = onToggleStatus;\n\n this.player.ready(() => {\n this.renderActivityStatusButton();\n });\n }\n\n // Remove old button and render new button when activity status is different from previous status\n private renderActivityStatusButton(): void {\n if (this.button) {\n this.player.removeChild(this.button);\n }\n\n this.button = new ActivityStatusButton(this.player, {\n activityStatus: this.activityStatus,\n clickHandler: this.onToggleStatus\n });\n\n this.player.addChild(this.button);\n }\n}\n\nvideojs.registerPlugin('activityStatusPlugin', ActivityStatusPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n activityStatusPlugin(): ActivityStatusPlugin;\n }\n}\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport './loop-video-menu-item.scss';\n\nconst MenuItem = videojs.getComponent('MenuItem');\n\nexport class LoopVideoMenuItem extends MenuItem {\n private toggleEl: Element;\n\n /**\n * Because we want to bind our listener in createEl\n * and createEl runs in super. We store if we've bounud\n * our handler, so we only call bind once and \n * the call to removeEventListener will still work\n */\n private handlerBound: boolean;\n\n constructor(player: VideoJsPlayer, options: videojs.ComponentOptions) {\n super(player, options);\n\n this.onLoopVideoChange = this.onLoopVideoChange.bind(this);\n\n this.player_.on('cv:loopvideo', this.onLoopVideoChange);\n\n this.onLoopVideoChange(null, this.player_.loopVideoPlugin().loop());\n }\n\n private onLoopVideoChange(_: any, enabled: boolean): void {\n enabled ? this.toggleOn() : this.toggleOff();\n }\n\n public handleToggle(): void {\n const loop = this.player_.loopVideoPlugin().loop();\n\n this.player_.loopVideoPlugin().loop(!loop);\n }\n\n private toggleOn(): void {\n videojs.dom.addClass(this.toggleEl, 'on');\n }\n\n private toggleOff(): void {\n videojs.dom.removeClass(this.toggleEl, 'on');\n }\n\n /**\n * Because we extend MenuItem which will close the menu by default\n * we need to halt the event propogation here\n */\n public handleClick(event: videojs.EventTarget.Event): void {\n event.stopImmediatePropagation();\n }\n\n public createEl(tagName?: string, properties?: any, attributes?: any): HTMLLIElement {\n /**\n * Bind our event listener only once\n * see the comment where handlerBound is defined\n */\n if (!this.handlerBound) {\n this.handleToggle = this.handleToggle.bind(this);\n this.handlerBound = true;\n }\n\n if (this.toggleEl)\n this.toggleEl.removeEventListener('click', this.handleToggle);\n\n this.toggleEl = videojs.dom.createEl('div', {\n className: `custom-toggle custom-toggle-info toggle-option float-end`,\n innerHTML: '<span class=\"handle\"></span></div>'\n });\n this.toggleEl.addEventListener('click', this.handleToggle);\n\n const innerHTML = `\n <span class=\"vjs-menu-item-text\">Loop video</span>\n <span class=\"cv-toggle-container\"></span>`;\n\n const el = super.createEl(tagName, {\n className: 'vjs-menu-item cv-cog-menu-item cv-loop-video-toggle',\n innerHTML\n }, attributes);\n\n /**\n * Indexing into the child this way is only safe to do because\n * we know that the el only has two children\n */\n el.children[1].appendChild(this.toggleEl);\n\n return el;\n }\n\n public dispose(): void {\n this.player_.off('cv:loopvideo', this.onLoopVideoChange);\n super.dispose();\n }\n}\n\nvideojs.registerComponent('LoopVideoMenuItem', LoopVideoMenuItem);\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport { CogButton } from 'projects/player/components/cog-button/cog-button';\n\nimport 'projects/player/plugins/loop-video-plugin/components/loop-video-menu-item';\n\nconst Plugin = videojs.getPlugin('plugin');\nconst LoopVideoMenuItem = videojs.getComponent('LoopVideoMenuItem') as unknown as typeof videojs.MenuItem;\n\ninterface LoopVideoPluginOptions {\n allowLoop: boolean;\n}\n\nclass LoopVideoPlugin extends Plugin {\n constructor(player: VideoJsPlayer, options: LoopVideoPluginOptions) {\n super(player);\n\n // Button must be added after ctor finishes, otherwise subsequent calls to\n // this.player.loopVideoPlugin() will try make a new plugin - Sha\n if (options.allowLoop)\n this.player.ready(() => this.addButton());\n\n this.onEnded = this.onEnded.bind(this);\n this.player.on('ended', this.onEnded);\n }\n\n private addButton(): void {\n /**\n * Check additionalItemOrder in cog-button.ts if you need to change the order. - Sha\n */\n const cogButton = this.player.getChild('collapserator')?.getChild('cogButton') as CogButton;\n cogButton.addItem({ ctor: LoopVideoMenuItem, name: 'LoopVideoMenuItem' });\n }\n\n private onEnded(): void {\n // turns out the regular loop functionality doesn't work with clips.\n // this call will just do nothing for videos - Sha\n if (this.player.loop())\n this.player.play();\n }\n\n public loop(enabled: boolean): void;\n public loop(): boolean ;\n public loop(enabled?: boolean): any {\n if (typeof enabled !== 'boolean')\n return this.player.loop();\n\n if (enabled)\n this.player.nextVideoPlugin?.()?.setShouldPlayNext(false, false);\n\n this.player.trigger('cv:loopvideo', enabled);\n this.player.loop(enabled);\n }\n\n public dispose(): void {\n this.player.off('ended', this.onEnded);\n super.dispose();\n }\n}\n\nvideojs.registerPlugin('loopVideoPlugin', LoopVideoPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n loopVideoPlugin(options?: LoopVideoPluginOptions): LoopVideoPlugin;\n }\n}\n","// This file is using some horrid valuies\n// It needs to be re-written this was just quickly thrown together\n// to show something at retro - Sha\n\n.video-js {\n .cv-up-next-container {\n position: absolute;\n bottom: 1.5em;\n color: $white;\n padding: 0.8em;\n width: 19em;\n border-radius: 0.3333em;\n background: $menu-bg;\n right: 1.5em;\n font-size: 1.5em;\n z-index: 6;\n }\n\n .cv-cancel-up-next {\n position: absolute;\n top: 0;\n right: 0.4em;\n font-size: 2em;\n }\n\n .cv-up-next-image {\n padding-bottom: 56.25%;\n background-size: contain;\n border-radius: 0.3333em;\n background-color: linear-gradient(to right, $gray-300, $gray-100);\n }\n\n .cv-up-next-heading {\n color: $white;\n padding-bottom: 0.6em;\n }\n\n .cv-up-next-title {\n color: $white;\n padding-top: 0.6em;\n }\n}","import * as React from 'react';\nimport videojs, { VideoJsPlayer } from 'video.js';\n\nimport { NextVideo } from 'projects/player/interfaces/NextVideo';\nimport { getReactComponent } from 'projects/player/react/react-component';\n\nimport './up-next.scss';\n\ninterface UpNextProps {\n player: VideoJsPlayer;\n nextVideo: NextVideo;\n onPlayNext: () => void;\n onCancel: () => void;\n}\n\nfunction UpNext(props: UpNextProps): JSX.Element {\n const [ timeRemaining, setTimeRemaining ] = React.useState(5);\n\n React.useEffect(() => {\n const timer = setInterval(() => {\n setTimeRemaining(prev => prev - 1);\n }, 1000);\n\n return () => {\n clearInterval(timer);\n };\n }, []);\n\n React.useEffect(() => {\n if (timeRemaining === 0)\n props.onPlayNext();\n }, [timeRemaining]);\n\n if (!props.nextVideo || !props.onPlayNext)\n return <></>;\n\n const roundedTimeRemaining = Math.ceil(timeRemaining);\n const secondsString = roundedTimeRemaining === 1 ? 'second' : 'seconds';\n\n return (\n <>\n <div className='cv-up-next-container'>\n <div className='cv-cancel-up-next cursor-pointer' role='button' onClick={props.onCancel}>&times;</div>\n <div className='cv-up-next-heading'>Up next in {roundedTimeRemaining} {secondsString}:</div>\n <div\n className='cv-up-next-image cursor-pointer'\n onClick={props.onPlayNext}\n style={{\n backgroundImage: `url(${props.nextVideo?.thumbnailUrl})`\n }}\n ></div>\n <div className='cv-up-next-title'>{props.nextVideo.name}</div>\n </div>\n </>\n );\n}\n\nvideojs.registerComponent(\n 'UpNext',\n getReactComponent(\n (player: VideoJsPlayer, options: UpNextProps) => <UpNext player={player} {...options} />\n )\n);\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport './next-video-menu-item.scss';\n\nconst MenuItem = videojs.getComponent('MenuItem');\n\nclass NextVideoMenuItem extends MenuItem {\n private toggleEl: Element;\n\n /**\n * Because we want to bind our listener in createEl\n * and createEl runs in super. We store if we've bounud\n * our handler, so we only call bind once and \n * the call to removeEventListener will still work\n */\n private handlerBound: boolean;\n\n constructor(player: VideoJsPlayer, options: videojs.ComponentOptions) {\n super(player, options);\n\n this.bindListeners();\n\n if (this.player_.nextVideoPlugin().getShouldPlayNext())\n this.toggleOn();\n }\n\n private bindListeners(): void {\n this.onPlayNextChange = this.onPlayNextChange.bind(this);\n\n this.player_.on('cv:playnext', this.onPlayNextChange);\n }\n\n public handleToggle(): void {\n const shouldPlayNext = this.player_.nextVideoPlugin().getShouldPlayNext();\n\n this.player_.nextVideoPlugin().setShouldPlayNext(!shouldPlayNext, true);\n }\n\n private onPlayNextChange(_: any, enabled: boolean): void {\n enabled ? this.toggleOn() : this.toggleOff();\n }\n\n private toggleOn(): void {\n videojs.dom.addClass(this.toggleEl, 'on');\n }\n\n private toggleOff(): void {\n videojs.dom.removeClass(this.toggleEl, 'on');\n }\n\n /**\n * Because we extend MenuItem which will close the menu by default\n * we need to halt the event propogation here\n */\n public handleClick(event: videojs.EventTarget.Event): void {\n event.stopImmediatePropagation();\n }\n\n public createEl(tagName?: string, properties?: any, attributes?: any): HTMLLIElement {\n /**\n * Bind our event listener only once\n * see the comment where handlerBound is defined\n */\n if (!this.handlerBound) {\n this.handleToggle = this.handleToggle.bind(this);\n this.handlerBound = true;\n }\n\n if (this.toggleEl)\n this.toggleEl.removeEventListener('click', this.handleToggle);\n\n this.toggleEl = videojs.dom.createEl('div', {\n className: `custom-toggle custom-toggle-info toggle-option float-end`,\n innerHTML: '<span class=\"handle\"></span></div>'\n });\n this.toggleEl.addEventListener('click', this.handleToggle);\n\n const innerHTML = `\n <span class=\"vjs-menu-item-text\">Play next video</span>\n <span class=\"cv-toggle-container\"></span>`;\n\n const el = super.createEl(tagName, {\n className: 'vjs-menu-item cv-cog-menu-item cv-play-next-toggle',\n innerHTML\n }, attributes);\n\n /**\n * Indexing into the child this way is only safe to do because\n * we know that the el only has two children\n */\n el.children[1].appendChild(this.toggleEl);\n\n return el;\n }\n\n public dispose(): void {\n this.player_.off('cv:playnext', this.onPlayNextChange);\n super.dispose();\n }\n}\n\nvideojs.registerComponent('NextVideoMenuItem', NextVideoMenuItem);\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport { CogButton } from 'projects/player/components/cog-button/cog-button';\nimport { NextVideo } from 'projects/player/interfaces/NextVideo';\nimport { TrackHelper } from 'projects/player/utils/track-helper';\n\nimport 'projects/player/plugins/next-video-plugin/components/up-next/up-next';\nimport 'projects/player/components/next-video-menu-item/next-video-menu-item';\n\nconst TEST = 'cv-persisttest';\nconst PLAY_NEXT = 'cv-play-next-video';\n\nconst Plugin = videojs.getPlugin('plugin');\nconst NextVideoMenuItem = videojs.getComponent('NextVideoMenuItem') as unknown as typeof videojs.MenuItem;\n\nclass NextVideoPlugin extends Plugin {\n private shouldPlayNextVideo: boolean;\n private hasLocalStorage: boolean;\n private nextVideoMenuItem: typeof videojs.MenuItem;\n\n private upNextRendered: boolean;\n\n private nextVideo: NextVideo;\n private callback: () => void;\n \n constructor(player: VideoJsPlayer) {\n super(player);\n\n this.setShouldPlayNext = this.setShouldPlayNext.bind(this);\n this.getShouldPlayNext = this.getShouldPlayNext.bind(this);\n this.getChapterTrack = this.getChapterTrack.bind(this);\n this.onTimeUpdate = this.onTimeUpdate.bind(this);\n\n this.hasLocalStorage = this.testHasLocalStorage();\n\n this.shouldPlayNextVideo = false;\n\n if (this.hasLocalStorage) {\n const item = window.localStorage.getItem(PLAY_NEXT);\n this.shouldPlayNextVideo = item === 'true';\n }\n\n player.ready(() => {\n this.initialize();\n });\n }\n \n private initialize(): void {\n if ((this.player as any).isDisposed())\n return;\n \n this.bindListeners();\n }\n\n private getChapterTrack(): TextTrack {\n return TrackHelper.getTrack(this.player, 'chapters', null);\n }\n\n public setNextVideo(nextVideo: NextVideo, playNext: boolean, callback: () => void): void {\n this.nextVideo = nextVideo;\n this.callback = callback;\n\n if (playNext)\n this.setShouldPlayNext(true);\n\n /**\n * Check additionalItemOrder in cog-button.ts if you need to change the order. - Sha\n */\n const cogButton = this.player.getChild('collapserator')?.getChild('cogButton') as CogButton;\n cogButton.addItem({ ctor: NextVideoMenuItem, name: 'NextVideoMenuItem' });\n }\n\n public getShouldPlayNext(): boolean {\n return this.shouldPlayNextVideo;\n }\n\n public setShouldPlayNext(val: boolean, persist?: boolean): void {\n this.shouldPlayNextVideo = val;\n this.player.trigger('cv:playnext', val);\n\n if (this.hasLocalStorage && persist)\n window.localStorage.setItem(PLAY_NEXT, val.toString());\n\n if (val)\n this.player.loopVideoPlugin().loop(false);\n }\n\n private bindListeners(): void {\n this.player.on('timeupdate', this.onTimeUpdate);\n }\n\n public dispose(): void {\n this.player.off('timeupdate', this.onTimeUpdate);\n\n this.hideUpNext();\n\n super.dispose();\n }\n\n private onTimeUpdate(): void {\n /**\n * Do nothing when in picture in picture.\n * TODO: Figure out how next video should work for PiP\n */\n if (this.player.pictureInPicture && this.player.isInPictureInPicture())\n return;\n\n if (!this.getShouldPlayNext()) {\n this.hideUpNext();\n return;\n }\n\n /*\n * Always hide the up-next tile if the video is not at the end\n */\n if (this.upNextRendered && this.player.currentTime() < this.player.duration()) {\n this.hideUpNext();\n return;\n }\n\n /*\n * Show the up-next tile when the video has finished\n */\n if (this.player.ended()) {\n this.showUpNext();\n }\n }\n\n private showUpNext(): void {\n if (this.upNextRendered)\n return;\n\n this.upNextRendered = true;\n\n this.player.addChild('UpNext', {\n nextVideo: this.nextVideo,\n onPlayNext: this.callback,\n onCancel: () => {\n this.hideUpNext();\n this.setShouldPlayNext(false);\n }\n });\n }\n\n private hideUpNext(): void {\n if (!this.upNextRendered)\n return;\n\n this.upNextRendered = false;\n\n const upNext = this.player.getChild('UpNext');\n\n if (upNext) {\n this.player.removeChild(upNext);\n upNext.dispose();\n }\n }\n\n private testHasLocalStorage(): boolean {\n try {\n window.localStorage.setItem(TEST, 'persistPlayNext');\n window.localStorage.removeItem(TEST);\n return true;\n } catch {\n return false;\n }\n }\n}\n\nvideojs.registerPlugin('nextVideoPlugin', NextVideoPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n nextVideoPlugin(): NextVideoPlugin;\n }\n}\n"],"mappings":"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"}