@clickview/exchange 0.56.0 → 0.56.1-dev.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundles.json +1 -1
- package/dist/en.json +1 -1
- package/dist/scripts/{PswrCgft.chunk.js → 044iq0d1.chunk.js} +2 -2
- package/dist/scripts/{PswrCgft.chunk.js.map → 044iq0d1.chunk.js.map} +1 -1
- package/dist/scripts/{CoBxE0Ze.chunk.js → 6ucD94id.chunk.js} +2 -2
- package/dist/scripts/{CoBxE0Ze.chunk.js.map → 6ucD94id.chunk.js.map} +1 -1
- package/dist/scripts/{Bf33xjOw.chunk.js → B-PNdHqp.chunk.js} +2 -2
- package/dist/scripts/{Bf33xjOw.chunk.js.map → B-PNdHqp.chunk.js.map} +1 -1
- package/dist/scripts/{BsN5hGdn.chunk.js → B2zOyhnx.chunk.js} +2 -2
- package/dist/scripts/{BsN5hGdn.chunk.js.map → B2zOyhnx.chunk.js.map} +1 -1
- package/dist/scripts/{D36WobW6.chunk.js → B3cy6PVV.chunk.js} +2 -2
- package/dist/scripts/{D36WobW6.chunk.js.map → B3cy6PVV.chunk.js.map} +1 -1
- package/dist/scripts/{DaLZ0a8R.chunk.js → B3e4NkXy.chunk.js} +2 -2
- package/dist/scripts/{DaLZ0a8R.chunk.js.map → B3e4NkXy.chunk.js.map} +1 -1
- package/dist/scripts/{CucQidno.chunk.js → B4mwlW3k.chunk.js} +2 -2
- package/dist/scripts/{CucQidno.chunk.js.map → B4mwlW3k.chunk.js.map} +1 -1
- package/dist/scripts/{BrWxbCy6.chunk.js → BC8oIL4t.chunk.js} +2 -2
- package/dist/scripts/{BrWxbCy6.chunk.js.map → BC8oIL4t.chunk.js.map} +1 -1
- package/dist/scripts/{BolzEYoc.chunk.js → BDoSZnIa.chunk.js} +2 -2
- package/dist/scripts/{BolzEYoc.chunk.js.map → BDoSZnIa.chunk.js.map} +1 -1
- package/dist/scripts/{dZRQM-hv.chunk.js → BGg12SDH.chunk.js} +2 -2
- package/dist/scripts/{dZRQM-hv.chunk.js.map → BGg12SDH.chunk.js.map} +1 -1
- package/dist/scripts/{DiCC-7dB.chunk.js → BI6c50Jh.chunk.js} +2 -2
- package/dist/scripts/{DiCC-7dB.chunk.js.map → BI6c50Jh.chunk.js.map} +1 -1
- package/dist/scripts/{BDLmm9HB.chunk.js → BSIHfhEC.chunk.js} +2 -2
- package/dist/scripts/{BDLmm9HB.chunk.js.map → BSIHfhEC.chunk.js.map} +1 -1
- package/dist/scripts/BWIFX-Ik.chunk.js +2 -0
- package/dist/scripts/{zNwtPBUz.chunk.js.map → BWIFX-Ik.chunk.js.map} +1 -1
- package/dist/scripts/{DSFKTxPl.chunk.js → BWnE7KAO.chunk.js} +2 -2
- package/dist/scripts/{DSFKTxPl.chunk.js.map → BWnE7KAO.chunk.js.map} +1 -1
- package/dist/scripts/{De7o0fUe.chunk.js → Be3-ohNT.chunk.js} +3 -3
- package/dist/scripts/{De7o0fUe.chunk.js.map → Be3-ohNT.chunk.js.map} +1 -1
- package/dist/scripts/BlQxOSJi.chunk.js +2 -0
- package/dist/scripts/{BDys2rrG.chunk.js.map → BlQxOSJi.chunk.js.map} +1 -1
- package/dist/scripts/{D1uhKPP8.chunk.js → BoCG3rE6.chunk.js} +2 -2
- package/dist/scripts/{D1uhKPP8.chunk.js.map → BoCG3rE6.chunk.js.map} +1 -1
- package/dist/scripts/{BUlwG-06.chunk.js → BpW5Hw5z.chunk.js} +2 -2
- package/dist/scripts/{BUlwG-06.chunk.js.map → BpW5Hw5z.chunk.js.map} +1 -1
- package/dist/scripts/{Bj3FQ5Ya.chunk.js → BtTTlrnZ.chunk.js} +2 -2
- package/dist/scripts/{Bj3FQ5Ya.chunk.js.map → BtTTlrnZ.chunk.js.map} +1 -1
- package/dist/scripts/{B1tVxL6y.chunk.js → ButpMiJ1.chunk.js} +2 -2
- package/dist/scripts/{B1tVxL6y.chunk.js.map → ButpMiJ1.chunk.js.map} +1 -1
- package/dist/scripts/{C4ROYls7.chunk.js → By50Y4fi.chunk.js} +2 -2
- package/dist/scripts/{C4ROYls7.chunk.js.map → By50Y4fi.chunk.js.map} +1 -1
- package/dist/scripts/{Ddk3CuwQ.chunk.js → C3YXHQU-.chunk.js} +2 -2
- package/dist/scripts/{Ddk3CuwQ.chunk.js.map → C3YXHQU-.chunk.js.map} +1 -1
- package/dist/scripts/{C7toqgJ9.chunk.js → C3jPyokw.chunk.js} +2 -2
- package/dist/scripts/{C7toqgJ9.chunk.js.map → C3jPyokw.chunk.js.map} +1 -1
- package/dist/scripts/{UxXf3AJv.chunk.js → C5DBZwej.chunk.js} +2 -2
- package/dist/scripts/{UxXf3AJv.chunk.js.map → C5DBZwej.chunk.js.map} +1 -1
- package/dist/scripts/{C4F_pZyv.chunk.js → C6BGhDq3.chunk.js} +2 -2
- package/dist/scripts/{C4F_pZyv.chunk.js.map → C6BGhDq3.chunk.js.map} +1 -1
- package/dist/scripts/C6x-ZqLl.chunk.js +2 -0
- package/dist/scripts/{0mGPhW9k.chunk.js.map → C6x-ZqLl.chunk.js.map} +1 -1
- package/dist/scripts/{Bt6iO6Kj.chunk.js → CFa8QduK.chunk.js} +2 -2
- package/dist/scripts/{Bt6iO6Kj.chunk.js.map → CFa8QduK.chunk.js.map} +1 -1
- package/dist/scripts/{C3oO96po.chunk.js → CG6eaNuu.chunk.js} +2 -2
- package/dist/scripts/{C3oO96po.chunk.js.map → CG6eaNuu.chunk.js.map} +1 -1
- package/dist/scripts/{h9ujBzqa.chunk.js → CHFINytM.chunk.js} +2 -2
- package/dist/scripts/{h9ujBzqa.chunk.js.map → CHFINytM.chunk.js.map} +1 -1
- package/dist/scripts/{CWrjr29e.chunk.js → CHzv4hsQ.chunk.js} +2 -2
- package/dist/scripts/{CWrjr29e.chunk.js.map → CHzv4hsQ.chunk.js.map} +1 -1
- package/dist/scripts/{Cn9Jwmkc.chunk.js → CV6qoMzB.chunk.js} +2 -2
- package/dist/scripts/{Cn9Jwmkc.chunk.js.map → CV6qoMzB.chunk.js.map} +1 -1
- package/dist/scripts/{EAS5-0G3.chunk.js → CVca5RIC.chunk.js} +2 -2
- package/dist/scripts/{EAS5-0G3.chunk.js.map → CVca5RIC.chunk.js.map} +1 -1
- package/dist/scripts/CWRjbtTx.chunk.js +2 -0
- package/dist/scripts/{Cfw5zASx.chunk.js.map → CWRjbtTx.chunk.js.map} +1 -1
- package/dist/scripts/{B86gu8do.chunk.js → CX1XQ05a.chunk.js} +2 -2
- package/dist/scripts/{B86gu8do.chunk.js.map → CX1XQ05a.chunk.js.map} +1 -1
- package/dist/scripts/{BoyiBqIK.chunk.js → CYrSeREi.chunk.js} +2 -2
- package/dist/scripts/{BoyiBqIK.chunk.js.map → CYrSeREi.chunk.js.map} +1 -1
- package/dist/scripts/{CA2wPtyp.chunk.js → C_AYa87x.chunk.js} +2 -2
- package/dist/scripts/{CA2wPtyp.chunk.js.map → C_AYa87x.chunk.js.map} +1 -1
- package/dist/scripts/{B0OGvFw2.chunk.js → CbOOCRVJ.chunk.js} +2 -2
- package/dist/scripts/{B0OGvFw2.chunk.js.map → CbOOCRVJ.chunk.js.map} +1 -1
- package/dist/scripts/{9xHo2Cwe.chunk.js → CinRjwth.chunk.js} +2 -2
- package/dist/scripts/{9xHo2Cwe.chunk.js.map → CinRjwth.chunk.js.map} +1 -1
- package/dist/scripts/{oxlQycmi.chunk.js → CjXJ8oFf.chunk.js} +2 -2
- package/dist/scripts/{oxlQycmi.chunk.js.map → CjXJ8oFf.chunk.js.map} +1 -1
- package/dist/scripts/{C_hVa7Ra.chunk.js → CkEsSdbO.chunk.js} +2 -2
- package/dist/scripts/{C_hVa7Ra.chunk.js.map → CkEsSdbO.chunk.js.map} +1 -1
- package/dist/scripts/{BzaGFUjc.chunk.js → CmWKgt7c.chunk.js} +2 -2
- package/dist/scripts/{BzaGFUjc.chunk.js.map → CmWKgt7c.chunk.js.map} +1 -1
- package/dist/scripts/{BRCI_rEH.chunk.js → Co6EjRu3.chunk.js} +2 -2
- package/dist/scripts/{BRCI_rEH.chunk.js.map → Co6EjRu3.chunk.js.map} +1 -1
- package/dist/scripts/{D2RVG0Pu.chunk.js → Cqky1Knl.chunk.js} +2 -2
- package/dist/scripts/{D2RVG0Pu.chunk.js.map → Cqky1Knl.chunk.js.map} +1 -1
- package/dist/scripts/{C0CSgPvj.chunk.js → CsaYiq-6.chunk.js} +2 -2
- package/dist/scripts/{C0CSgPvj.chunk.js.map → CsaYiq-6.chunk.js.map} +1 -1
- package/dist/scripts/{DqAsIeVB.chunk.js → Ct-hl94f.chunk.js} +2 -2
- package/dist/scripts/{DqAsIeVB.chunk.js.map → Ct-hl94f.chunk.js.map} +1 -1
- package/dist/scripts/{kpU1ILSr.chunk.js → CwuTuPLO.chunk.js} +2 -2
- package/dist/scripts/{kpU1ILSr.chunk.js.map → CwuTuPLO.chunk.js.map} +1 -1
- package/dist/scripts/{-hO5xjbU.chunk.js → Cy191NLr.chunk.js} +2 -2
- package/dist/scripts/{-hO5xjbU.chunk.js.map → Cy191NLr.chunk.js.map} +1 -1
- package/dist/scripts/{BswE1yhG.chunk.js → CzBvFLUu.chunk.js} +2 -2
- package/dist/scripts/{BswE1yhG.chunk.js.map → CzBvFLUu.chunk.js.map} +1 -1
- package/dist/scripts/{BZnDGuzQ.chunk.js → DCGOcoWo.chunk.js} +2 -2
- package/dist/scripts/{BZnDGuzQ.chunk.js.map → DCGOcoWo.chunk.js.map} +1 -1
- package/dist/scripts/{DIFawdym.chunk.js → DEfSuFug.chunk.js} +2 -2
- package/dist/scripts/{DIFawdym.chunk.js.map → DEfSuFug.chunk.js.map} +1 -1
- package/dist/scripts/{B67qUxbj.chunk.js → DFNZXjHy.chunk.js} +2 -2
- package/dist/scripts/{B67qUxbj.chunk.js.map → DFNZXjHy.chunk.js.map} +1 -1
- package/dist/scripts/{Cliq624L.chunk.js → DGDSZYW9.chunk.js} +2 -2
- package/dist/scripts/{Cliq624L.chunk.js.map → DGDSZYW9.chunk.js.map} +1 -1
- package/dist/scripts/{W3L3GnYz.chunk.js → DLxCyfTf.chunk.js} +2 -2
- package/dist/scripts/{W3L3GnYz.chunk.js.map → DLxCyfTf.chunk.js.map} +1 -1
- package/dist/scripts/{DeC-NkSi.chunk.js → DQ7Osv3q.chunk.js} +2 -2
- package/dist/scripts/{DeC-NkSi.chunk.js.map → DQ7Osv3q.chunk.js.map} +1 -1
- package/dist/scripts/{mj8E03dO.chunk.js → DRDYq9ZL.chunk.js} +2 -2
- package/dist/scripts/{mj8E03dO.chunk.js.map → DRDYq9ZL.chunk.js.map} +1 -1
- package/dist/scripts/{oWzYOkEl.chunk.js → DSQI-Jdp.chunk.js} +2 -2
- package/dist/scripts/{oWzYOkEl.chunk.js.map → DSQI-Jdp.chunk.js.map} +1 -1
- package/dist/scripts/{CMoQks36.chunk.js → DSwVduDL.chunk.js} +2 -2
- package/dist/scripts/{CMoQks36.chunk.js.map → DSwVduDL.chunk.js.map} +1 -1
- package/dist/scripts/{Bn31qbi-.chunk.js → DUmKCSoR.chunk.js} +2 -2
- package/dist/scripts/{Bn31qbi-.chunk.js.map → DUmKCSoR.chunk.js.map} +1 -1
- package/dist/scripts/{B2pkApo6.chunk.js → DVisFoDC.chunk.js} +2 -2
- package/dist/scripts/{B2pkApo6.chunk.js.map → DVisFoDC.chunk.js.map} +1 -1
- package/dist/scripts/{aYbKmndA.chunk.js → DWtr2GDr.chunk.js} +2 -2
- package/dist/scripts/{aYbKmndA.chunk.js.map → DWtr2GDr.chunk.js.map} +1 -1
- package/dist/scripts/{CKJlxYxE.chunk.js → DXeWv8xM.chunk.js} +2 -2
- package/dist/scripts/{CKJlxYxE.chunk.js.map → DXeWv8xM.chunk.js.map} +1 -1
- package/dist/scripts/{CD7xQQSj.chunk.js → DZZlWrzc.chunk.js} +2 -2
- package/dist/scripts/{CD7xQQSj.chunk.js.map → DZZlWrzc.chunk.js.map} +1 -1
- package/dist/scripts/D_yZCyl0.chunk.js +2 -0
- package/dist/scripts/{nYKnuiKr.chunk.js.map → D_yZCyl0.chunk.js.map} +1 -1
- package/dist/scripts/{Dbdf7QGx.chunk.js → Da9-cwkH.chunk.js} +2 -2
- package/dist/scripts/{Dbdf7QGx.chunk.js.map → Da9-cwkH.chunk.js.map} +1 -1
- package/dist/scripts/{B9Zy84TP.chunk.js → DdJUaS75.chunk.js} +2 -2
- package/dist/scripts/{B9Zy84TP.chunk.js.map → DdJUaS75.chunk.js.map} +1 -1
- package/dist/scripts/{DVd5A_3v.chunk.js → DhNUjn7p.chunk.js} +2 -2
- package/dist/scripts/{DVd5A_3v.chunk.js.map → DhNUjn7p.chunk.js.map} +1 -1
- package/dist/scripts/{C6_0NPy2.chunk.js → Dhpe3VD3.chunk.js} +2 -2
- package/dist/scripts/{C6_0NPy2.chunk.js.map → Dhpe3VD3.chunk.js.map} +1 -1
- package/dist/scripts/DiJ1txP6.chunk.js +2 -0
- package/dist/scripts/{VBw4HYiM.chunk.js.map → DiJ1txP6.chunk.js.map} +1 -1
- package/dist/scripts/{C5UlFqqr.chunk.js → DjeFO5jj.chunk.js} +2 -2
- package/dist/scripts/{C5UlFqqr.chunk.js.map → DjeFO5jj.chunk.js.map} +1 -1
- package/dist/scripts/{C37FAa5c.chunk.js → Dn7S7HZe.chunk.js} +2 -2
- package/dist/scripts/{C37FAa5c.chunk.js.map → Dn7S7HZe.chunk.js.map} +1 -1
- package/dist/scripts/{BQEr0IGt.chunk.js → Duy0OOKL.chunk.js} +2 -2
- package/dist/scripts/{BQEr0IGt.chunk.js.map → Duy0OOKL.chunk.js.map} +1 -1
- package/dist/scripts/{DEvwqrCo.chunk.js → DxLg_mEO.chunk.js} +2 -2
- package/dist/scripts/{DEvwqrCo.chunk.js.map → DxLg_mEO.chunk.js.map} +1 -1
- package/dist/scripts/{D9ECiiu8.chunk.js → HYIMjXwZ.chunk.js} +2 -2
- package/dist/scripts/{D9ECiiu8.chunk.js.map → HYIMjXwZ.chunk.js.map} +1 -1
- package/dist/scripts/{9gPNCjBk.chunk.js → J651bFfk.chunk.js} +2 -2
- package/dist/scripts/{9gPNCjBk.chunk.js.map → J651bFfk.chunk.js.map} +1 -1
- package/dist/scripts/{Y40qqQUW.chunk.js → JZmjeIJo.chunk.js} +2 -2
- package/dist/scripts/{Y40qqQUW.chunk.js.map → JZmjeIJo.chunk.js.map} +1 -1
- package/dist/scripts/{BJG50MLZ.chunk.js → SI_6LGjL.chunk.js} +2 -2
- package/dist/scripts/{BJG50MLZ.chunk.js.map → SI_6LGjL.chunk.js.map} +1 -1
- package/dist/scripts/{CiXtVo-A.chunk.js → Wfuxh2YT.chunk.js} +2 -2
- package/dist/scripts/Wfuxh2YT.chunk.js.map +1 -0
- package/dist/scripts/{BvfTundg.chunk.js → Y2CHWdPG.chunk.js} +2 -2
- package/dist/scripts/{BvfTundg.chunk.js.map → Y2CHWdPG.chunk.js.map} +1 -1
- package/dist/scripts/{B57_c_CS.chunk.js → Y5a0i_3c.chunk.js} +2 -2
- package/dist/scripts/{B57_c_CS.chunk.js.map → Y5a0i_3c.chunk.js.map} +1 -1
- package/dist/scripts/{app-BwZTeN0O.js → app-cabh1nNK.js} +3 -3
- package/dist/scripts/{app-BwZTeN0O.js.map → app-cabh1nNK.js.map} +1 -1
- package/dist/scripts/{CW89a4Mj.chunk.js → b-AUm3ni.chunk.js} +2 -2
- package/dist/scripts/{CW89a4Mj.chunk.js.map → b-AUm3ni.chunk.js.map} +1 -1
- package/dist/scripts/{DToTQA1H.chunk.js → fqbX9HRm.chunk.js} +2 -2
- package/dist/scripts/{DToTQA1H.chunk.js.map → fqbX9HRm.chunk.js.map} +1 -1
- package/dist/scripts/{DLQTbn-d.chunk.js → oVMIGZTl.chunk.js} +2 -2
- package/dist/scripts/{DLQTbn-d.chunk.js.map → oVMIGZTl.chunk.js.map} +1 -1
- package/dist/scripts/{D9BoZZhI.chunk.js → tbYGeGLS.chunk.js} +2 -2
- package/dist/scripts/{D9BoZZhI.chunk.js.map → tbYGeGLS.chunk.js.map} +1 -1
- package/dist/scripts/{xWtPEEJC.chunk.js → uGV8Ulpl.chunk.js} +2 -2
- package/dist/scripts/{xWtPEEJC.chunk.js.map → uGV8Ulpl.chunk.js.map} +1 -1
- package/dist/scripts/{CNiWunhi.chunk.js → uyrSls2s.chunk.js} +2 -2
- package/dist/scripts/{CNiWunhi.chunk.js.map → uyrSls2s.chunk.js.map} +1 -1
- package/dist/scripts/{DXtSLojN.chunk.js → vJWLdqFY.chunk.js} +2 -2
- package/dist/scripts/{DXtSLojN.chunk.js.map → vJWLdqFY.chunk.js.map} +1 -1
- package/dist/scripts/{4sHzAWaU.chunk.js → wlWC_CCa.chunk.js} +2 -2
- package/dist/scripts/{4sHzAWaU.chunk.js.map → wlWC_CCa.chunk.js.map} +1 -1
- package/dist/scripts/wmclIpxx.chunk.js +2 -0
- package/dist/scripts/{JVT9lUoz.chunk.js.map → wmclIpxx.chunk.js.map} +1 -1
- package/dist/scripts/{o-4-XLY2.chunk.js → zBOmHm2e.chunk.js} +2 -2
- package/dist/scripts/{o-4-XLY2.chunk.js.map → zBOmHm2e.chunk.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/0mGPhW9k.chunk.js +0 -2
- package/dist/scripts/BDys2rrG.chunk.js +0 -2
- package/dist/scripts/Cfw5zASx.chunk.js +0 -2
- package/dist/scripts/CiXtVo-A.chunk.js.map +0 -1
- package/dist/scripts/JVT9lUoz.chunk.js +0 -2
- package/dist/scripts/VBw4HYiM.chunk.js +0 -2
- package/dist/scripts/nYKnuiKr.chunk.js +0 -2
- package/dist/scripts/zNwtPBUz.chunk.js +0 -2
- package/vite.config.ts +0 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DVd5A_3v.chunk.js","sources":["../../../../libs/shared/src/interfaces/models/curated-widget/CuratedWidget.ts","../../../../libs/shared/src/apps/search/interfaces/SearchFilter.ts","../../../../libs/shared/src/constants/TopicsConstants.ts","../../../../libs/shared/src/enums/CurationTag.ts","../../../../libs/shared/src/apps/onboarding/utils/OnboardingStorageHelper.ts","../../../../libs/shared/src/apps/onboarding/utils/OnboardingPathwayHelper.ts","../../../../libs/shared/src/enums/PresentationLearningLevel.ts","../../../../libs/shared/src/apps/subjects/enums/ClassificationNodeType.ts","../../../../libs/shared/src/enums/ClassificationType.ts","../../../../libs/shared/src/enums/TagType.ts","../../../../libs/shared/src/utils/topics-helper/TopicsHelper.ts","../../../../libs/shared/src/apps/onboarding/constants/ClassificationVideos.ts","../../../../libs/shared/src/apps/onboarding/constants/SharedOnboardingScreenPredicates.ts","../../../../libs/shared/src/apps/onboarding/constants/OnboardingScreenConfigs.ts","../../../../libs/shared/src/enums/WidgetTemplate.ts","../../../../libs/shared/src/enums/WidgetTypeId.ts","../../../../libs/shared/src/utils/DashboardHelper.ts","../../../../libs/shared/src/constants/WidgetTypeIdConfig.ts","../../../../libs/shared/src/images/svg/status/WarningOutlineSvg.tsx","../../../../libs/shared/src/enums/WidgetStatus.ts","../../../../libs/shared/src/utils/WidgetHelper.ts","../../../../libs/shared/src/components/widgets/curated-widgets/components/header/WidgetHeader.tsx","../../../../libs/shared/src/components/tags/TagItem.tsx"],"sourcesContent":["import { HashObject } from 'libs/common/react/interfaces';\n\nimport { AllWidgetTemplateProps } from 'libs/shared/components/widgets/curated-widgets/WidgetProps';\nimport { ButtonIcon } from 'libs/shared/constants/WidgetThemingConstants';\nimport { WidgetStatus } from 'libs/shared/enums/WidgetStatus';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { CuratedObjectsWidgetData, CuratedWidgetContent, CuratedWidgetData } from 'libs/shared/interfaces';\n\nexport enum CuratedDashboardAppLink {\n LatestReleases = 'latest-releases',\n ExploreAllTopics = 'explore-all-topics',\n ClassificationLatestReleases = 'classification-latest-releases',\n ClassificationDirectory = 'classification-directory',\n}\n\nexport enum CuratedWidgetCtaAppLink {\n TopicDirectory = 'topic-directory',\n TopicNewReleases = 'topic-new-releases',\n CuratedTopic = 'curated-topic'\n}\n\nexport interface BaseWidget<TContent extends HashObject = HashObject> {\n index: number;\n templateId: WidgetTemplate;\n widgetId: WidgetTypeId;\n name: string;\n description?: string;\n content?: TContent\n}\n\nexport interface WidgetCta {\n text?: string;\n href?: string;\n icon?: ButtonIcon;\n appLink?: CuratedWidgetCtaAppLink;\n}\n\nexport type WidgetMetadata = AllWidgetTemplateProps['metadata'] & {\n showInTableOfContents: boolean;\n tocIndentation: number;\n headingOptional: boolean;\n aiAddedVideo: boolean;\n};\n\nexport interface WidgetPreference {\n id: string;\n index?: number;\n hidden?: boolean;\n}\n\nexport interface CuratedWidget<\n TData extends CuratedWidgetData = CuratedWidgetData,\n TContent extends CuratedWidgetContent = CuratedWidgetContent\n> extends BaseWidget<TContent> {\n id: string;\n dashboardId: string;\n data: TData;\n status: WidgetStatus;\n metadata?: Partial<WidgetMetadata>;\n preferences?: WidgetPreference[];\n cursor?: string;\n\n // If a widget has curriculum IDs set, then it won't be accessible to anyone who doesn't have one of those curriculums\n curriculumIds?: string[];\n}\n\nexport type CuratedMediaWidget<\n TContent extends CuratedWidgetContent = CuratedWidgetContent\n> = CuratedWidget<CuratedObjectsWidgetData, TContent>;","import { SvgIcon } from 'libs/shared/utils/SvgHelper';\n\nimport { FilterStateHash } from '../reducers';\n\nimport { FilterProps } from './FilterProps';\nimport { SearchIndices } from './SearchResults';\n\nconst FilterIdNames =\n[\n 'sort', // \"sort\" isn't even a filter but it tends to go with our filters in our designs\n 'classification',\n 'presentation',\n 'audience',\n 'yearGroup',\n 'moviesAndTv',\n 'type',\n 'rating',\n 'interactives',\n 'clips',\n 'classroom',\n 'hasResources',\n 'hasSubtitles',\n 'productionYear',\n 'isHd',\n 'producedByClickView',\n 'duration',\n 'tagOrClassification',\n 'status',\n 'isAdmin',\n 'bulkActionType',\n 'userType',\n 'filter',\n 'channel',\n 'dateBroadcast',\n 'categoryId',\n 'hasInteractives',\n 'jobStatus',\n 'source',\n 'customerStatus',\n 'specialEventType',\n 'customerType',\n 'seriesId',\n 'scopeId'\n] as const;\n\n/**\n * Any filters that shouldn't be sent to the backend as a filter\n * and are instead handled differently by the frontend\n */\nconst FilterBlacklist: Partial<Record<FilterIds, boolean>> = {\n type: true\n};\n\nexport type FilterIds = typeof FilterIdNames[number];\n\nexport const FilterWhitelist = FilterIdNames.reduce((acc, prev) => {\n return {\n ...acc,\n [prev]: !FilterBlacklist[prev]\n };\n}, {} as Record<FilterIds, boolean>);\n\nexport type FilterType = 'radio' | 'checkbox' | 'nested-checkbox' | 'grouped-checkbox' | 'switch' | 'more-filters' | 'rating' | 'dropdown' | 'tag' | 'button';\n\nexport interface SearchFilter<TFilterOptionId = string> {\n id: FilterIds;\n type: FilterType;\n compatibleIndices: SearchIndices[];\n\n name?: string;\n icon?: SvgIcon;\n description?: string;\n options?: FilterOption<TFilterOptionId>[];\n labelPrefix?: string;\n\n // For second layer options, for example 'presentation' checkbox filter has 'audience' as second layer option\n secondaryId?: FilterIds;\n\n customComponent?: (props: FilterProps) => JSX.Element;\n disabled?: boolean;\n disableOptions?: (options: FilterOption[], filters: SearchFilter[], state: FilterStateHash) => FilterOption[];\n}\n\nexport interface MoreFilters extends Omit<SearchFilter, 'id' | 'compatibleIndices'> {\n filters: SearchFilter[];\n id: string;\n}\n\nexport interface FilterOption<TId = string> {\n id: TId;\n name: string;\n default?: boolean;\n disabled?: boolean;\n secondLayerSelection?: FilterOption[];\n secondLayerOptions?: FilterOption[];\n group?: string;\n}\n\nexport type ProductionYearFilterOptions =\n 'any-year'\n | 'this-year'\n | 'last-3-years'\n | 'last-5-years';\n\nexport type DurationFilterOptions =\n 'bite-sized'\n | 'short'\n | 'medium'\n | 'long';\n\n\nexport enum SourceFilterOptions {\n MyVideos = 'my-videos',\n School = 'school',\n ExchangeArchive = 'exchange-archive',\n ClickView = 'clickview'\n}\n\nexport enum TypeFilterOptions {\n Video = 'video',\n Series = 'series',\n Playlist = 'playlist',\n Classification = 'classification',\n Clip = 'clip',\n Interactive = 'interactive',\n Company = 'company',\n Category = 'category',\n PartnerProfile = 'partner_profile'\n}","export const TopicsConstants = {\n MULTI_PRESENTATION_THRESHOLD: 2\n};","export enum CurationTag {\n CLICKVIEW_CURATED = 'is_clickview_curated',\n MOVIES_AND_TV = 'is_movies_and_tv',\n STREAMABLE_CURATED = 'is_streamable_learning_curated'\n}","import { LocalStorageHelper } from 'libs/common/backbone/utils/LocalStorageHelper';\n\nimport { PersonaId } from 'libs/shared/apps/onboarding/constants/JobTitlePersonaMapping';\nimport { OnboardingUsageIntention } from 'libs/shared/apps/onboarding/interfaces/OnboardingUsageIntention';\nimport { JobTitles } from 'libs/shared/apps/sign-up/interfaces/JobTitles';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nconst ONBOARDING_PERSONA_KEY = 'onboarding:persona';\nconst ONBOARDING_USAGE_INTENTION_KEY = 'onboarding:usage:intention';\nconst ONBOARDING_JOB_TITLE_REDIRECT_KEY = 'onboarding:had:job:title';\nconst ONBOARDING_VIDEOS_V2 = 'onboarding:videos:v2';\n\nfunction getScopedKey(userId: string, key: string) {\n if (!userId)\n return key;\n\n return `${userId}:${key}`;\n}\n\nfunction get<T>(userId: string, key: string) {\n const value = LocalStorageHelper.get(key);\n const scopedKey = getScopedKey(userId, key);\n\n /**\n * When onboarding was first released, we persisted some state in local storage, but the\n * key was not scoped to the user's ID. This lead to bugs where if a user were to create a\n * new account and go through onboarding a second time, they would see the state from the\n * first account.\n * \n * We've now moved to scoping the keys to prevent this, and this is here to migrate the old\n * keys to the new format.\n */\n if (value !== null) {\n LocalStorageHelper.remove(key);\n LocalStorageHelper.set<T>(scopedKey, value);\n }\n\n return LocalStorageHelper.get<T>(scopedKey);\n}\n\nfunction set<T>(userId: string, key: string, value: T) {\n LocalStorageHelper.set<T>(getScopedKey(userId, key), value);\n}\n\nfunction remove(userId: string, key: string) {\n const value = LocalStorageHelper.get(key);\n\n if (value !== null)\n LocalStorageHelper.remove(key);\n\n LocalStorageHelper.remove(getScopedKey(userId, key));\n}\n\nexport const OnboardingStorageHelper = {\n getPersona(userId: string): PersonaId {\n return get<PersonaId>(userId, ONBOARDING_PERSONA_KEY);\n },\n\n updatePersona(userId: string, jobTitle: JobTitles | ''): void {\n const onboardingPersona = UserHelper.getPersonaFromJobTitle(jobTitle);\n set<PersonaId>(userId, ONBOARDING_PERSONA_KEY, onboardingPersona || 'teacher');\n },\n \n getUsageIntention(userId: string): OnboardingUsageIntention {\n return get<OnboardingUsageIntention>(userId, ONBOARDING_USAGE_INTENTION_KEY);\n },\n\n updateUsageIntention(userId: string, usageIntention: OnboardingUsageIntention): void {\n set<OnboardingUsageIntention>(userId, ONBOARDING_USAGE_INTENTION_KEY, usageIntention);\n },\n\n removeUsageIntention(userId: string): void {\n remove(userId, ONBOARDING_USAGE_INTENTION_KEY);\n },\n\n getJobTitleRedirect(userId: string, jobTitle: JobTitles): boolean {\n if (typeof get(userId, ONBOARDING_JOB_TITLE_REDIRECT_KEY) !== 'boolean')\n set(userId, ONBOARDING_JOB_TITLE_REDIRECT_KEY, !!jobTitle);\n \n return !get(userId, ONBOARDING_JOB_TITLE_REDIRECT_KEY);\n },\n\n getOnboardingVideoSelections<T>(userId: string) {\n return get<T>(userId, ONBOARDING_VIDEOS_V2);\n },\n\n setOnboardingVideoSelections<T>(userId: string, videos: T[]) {\n set<T[]>(userId, ONBOARDING_VIDEOS_V2, videos);\n }\n};","import { Core } from 'libs/common/backbone/index';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { OnboardingContext, OnboardingScreenConfigs } from 'libs/shared/apps/onboarding/constants/OnboardingScreenConfigs';\nimport { OnboardingScreenAppLinks } from 'libs/shared/apps/onboarding/interfaces/OnboardingScreenAppLinks';\nimport { OnboardingScreenId } from 'libs/shared/apps/onboarding/interfaces/OnboardingScreenId';\nimport { JobTitles } from 'libs/shared/apps/sign-up/interfaces/JobTitles';\nimport { HardCoded } from 'libs/shared/constants/HardCoded';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { SettingsLookup } from 'libs/shared/enums/SettingName';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { Classification, CurrentUser, Customer, Presentation, User } from 'libs/shared/interfaces';\nimport { SettingsHelper } from 'libs/shared/utils/SettingsHelper';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport { OnboardingStorageHelper } from './OnboardingStorageHelper';\n\n/**\n * This is a big determining factor for when we want to redirect users to onboarding\n * upon login.\n * \n * Basically, all users who existed before onboarding was released to them should not be\n * automatically redirected to onboarding on login. They should just see the nag widget on\n * the Discover page instead.\n * \n * But, users who joined after onboarding was released for their customer _should_ be redirected\n * after they first activate their account.\n * \n * So, we check the dateCreated on the user to determine this.\n */\nfunction getOnboardingReleaseDate(\n presentations: Presentation[],\n customer: Customer\n): string {\n /**\n * Onboarding was initially released on March 26, 2024 to 10% of our existing customer base,\n * and 100% of new customers created from then on.\n */\n const initialReleaseDate = '2024-03-26';\n\n /**\n * Next, we upgraded all of Tertiary to the new product, and they all received access to the\n * new onboarding.\n */\n const tertiaryReleaseDate = '2024-11-28';\n\n /**\n * Finally, we released onboarding to the rest of our customer base.\n */\n const fullReleaseDate = '2024-12-11';\n\n const hasTertiaryPresentation = presentations.some(p => {\n return (\n p.id.toString() === HardCoded.PresentationIds.AU_TERTIARY.toString() ||\n p.id.toString() === HardCoded.PresentationIds.UK_TERTIARY.toString()\n );\n });\n\n // Tertiary customers created after this date will be redirected to onboarding\n if (hasTertiaryPresentation)\n return tertiaryReleaseDate;\n\n /**\n * Users who are a part of a customer that was created before the initial\n * onboarding release date will be redirected to onboarding only if they\n * were created after the full release date.\n */\n if (DateHelper.isBefore(customer?.dateCreated, initialReleaseDate))\n return fullReleaseDate;\n\n /**\n * Users who were created after the initial release date should be redirected to\n * onboarding.\n */\n return initialReleaseDate;\n}\n\ntype ScreenNode = {\n number?: number;\n progressBarNumber?: number;\n isComplete?: boolean;\n includeInProgressBar: boolean;\n next: OnboardingScreenId | null;\n previous: OnboardingScreenId | null;\n};\n\ntype ScreenNodeDictionary = {\n [key in OnboardingScreenId]?: ScreenNode;\n};\n\nexport interface OnboardingPathway {\n screens: ScreenNodeDictionary;\n currentScreen: OnboardingScreenId;\n totalScreens: number;\n totalScreensInProgressBar: number;\n hasCompletedAllSteps: boolean;\n}\n\ninterface GetPathwayArgs {\n jobTitle: JobTitles;\n userSettings: SettingsLookup;\n presentations: Presentation[];\n curriculums: Presentation[];\n preferredSubjects: Classification[];\n preferredPresentation: Presentation;\n appLink: Core.AppLink;\n appLinks: OnboardingScreenAppLinks;\n hasPermissions: HasPermissionsFunc;\n hasPlaylist: boolean;\n masterUser: User;\n customer: Customer;\n currentUser: CurrentUser;\n}\n\nexport const OnboardingPathwayHelper = {\n getOnboardingPathway(options: GetPathwayArgs): OnboardingPathway {\n const {\n jobTitle,\n userSettings,\n presentations,\n curriculums,\n preferredPresentation,\n preferredSubjects,\n hasPlaylist,\n appLink,\n appLinks,\n masterUser,\n customer,\n currentUser,\n hasPermissions\n } = options;\n \n const onboardingPersona = OnboardingStorageHelper.getPersona(currentUser?.id);\n\n if (!onboardingPersona && jobTitle)\n OnboardingStorageHelper.updatePersona(currentUser?.id, jobTitle);\n\n if (onboardingPersona && onboardingPersona !== UserHelper.getPersonaFromJobTitle(jobTitle))\n OnboardingStorageHelper.updatePersona(currentUser?.id, jobTitle);\n\n const onboardingContext: OnboardingContext = {\n jobTitle,\n hasPlaylist,\n masterUser,\n customer,\n presentations: presentations || [],\n curriculums: curriculums || [],\n preferredPresentation,\n preferredSubjects,\n instanceRegion: currentUser?.instanceRegion,\n hasPermissions,\n userSettings\n };\n\n // Get the current onboarding screen that the user is on\n let currentScreen = OnboardingPathwayHelper.getCurrentScreen(appLink, appLinks);\n\n const onboardingScreenConfigs = Object.values(OnboardingScreenConfigs);\n\n const graphDictionary: ScreenNodeDictionary = {};\n let previous: OnboardingScreenId = null;\n\n let firstScreenId: OnboardingScreenId = null;\n let screenNumber = 0;\n let progressBarNumber = 0;\n let hasCompletedAllSteps = true;\n\n onboardingScreenConfigs.forEach(screenConfig => {\n if (!screenConfig.predicate(onboardingContext))\n return;\n\n if (!firstScreenId)\n firstScreenId = screenConfig.id;\n\n const hasCompletedStep = SettingsHelper.get<boolean>(userSettings, screenConfig.setting);\n\n if (!hasCompletedStep)\n hasCompletedAllSteps = false;\n \n // If the user isn't currently viewing an onboarding screen, set the first incomplete screen as the current screen\n if (!currentScreen && !hasCompletedStep)\n currentScreen = screenConfig.id;\n\n screenNumber++;\n \n graphDictionary[screenConfig.id] = {\n isComplete: hasCompletedStep,\n next: null,\n previous,\n number: screenNumber,\n includeInProgressBar: false\n };\n\n if (screenConfig.includeInProgressBar(onboardingContext)) {\n progressBarNumber++;\n graphDictionary[screenConfig.id].progressBarNumber = progressBarNumber;\n graphDictionary[screenConfig.id].includeInProgressBar = true;\n }\n\n if (screenConfig.branches?.length) {\n screenConfig.branches.forEach(branch => {\n graphDictionary[branch] = {\n next: screenConfig.id,\n previous: screenConfig.id,\n includeInProgressBar: false\n };\n });\n }\n\n if (previous)\n graphDictionary[previous].next = screenConfig.id;\n\n previous = screenConfig.id;\n });\n\n if (!currentScreen && !hasCompletedAllSteps)\n currentScreen = firstScreenId;\n\n return {\n screens: graphDictionary,\n currentScreen,\n totalScreens: screenNumber,\n totalScreensInProgressBar: progressBarNumber,\n hasCompletedAllSteps\n };\n },\n\n getNextAppLink(pathway: OnboardingPathway, appLinks: OnboardingScreenAppLinks): Core.AppLink {\n const currentNode = pathway.screens[pathway.currentScreen];\n const nextScreenId = currentNode?.next;\n\n if (!nextScreenId)\n return null;\n\n return appLinks[nextScreenId];\n },\n\n getPreviousAppLink(pathway: OnboardingPathway, appLinks: OnboardingScreenAppLinks): Core.AppLink {\n const currentNode = pathway.screens[pathway.currentScreen];\n const previousScreenId = currentNode?.previous;\n\n if (!previousScreenId)\n return null;\n\n return appLinks[previousScreenId];\n },\n\n // Get the current screen that the user is on based on the current app route\n getCurrentScreen(currentAppLink: Core.AppLink, appLinks: OnboardingScreenAppLinks): OnboardingScreenId {\n const currentScreen = Object.entries(appLinks).find(([ , appLink ]) => {\n return appLink.action === currentAppLink.action;\n });\n\n if (!currentScreen)\n return null;\n\n return ArrayHelper.first(currentScreen) as keyof OnboardingScreenAppLinks;\n },\n\n getProgress(pathway: OnboardingPathway) {\n const currentStepNumber = pathway.screens[pathway.currentScreen]?.number;\n const currentStepProgressBarNumber = pathway.screens[pathway.currentScreen]?.progressBarNumber;\n const totalScreens = pathway.totalScreens;\n const totalScreensInProgressBar = pathway.totalScreensInProgressBar;\n\n const progressBarPercentage = (currentStepProgressBarNumber / totalScreensInProgressBar) * 100;\n const overallPercentage = ((currentStepNumber - 1) / totalScreens) * 100;\n\n return {\n showProgressBar: pathway.screens[pathway.currentScreen]?.includeInProgressBar,\n currentStepNumber,\n currentStepProgressBarNumber,\n totalScreens,\n totalScreensInProgressBar,\n progressBarPercentage,\n overallPercentage\n };\n },\n\n hasNonBdmTrial(hasPermissions: HasPermissionsFunc): boolean {\n return hasPermissions(PermissionName.ViewTrialUpgrade);\n },\n\n getOnboardingScreenStates(pathway: OnboardingPathway) {\n const completedScreens: OnboardingScreenId[] = [];\n const incompleteScreens: OnboardingScreenId[] = [];\n \n Object.keys(pathway.screens).forEach((screenId: OnboardingScreenId) => {\n if (pathway.screens[screenId].isComplete) {\n completedScreens.push(screenId);\n } else {\n incompleteScreens.push(screenId);\n }\n });\n \n return {\n completedScreens,\n incompleteScreens\n };\n },\n\n shouldRedirectToOnboarding(\n masterUser: User,\n customer: Customer,\n hasPermissions: HasPermissionsFunc,\n availablePresentations: Presentation[]\n ): boolean {\n /**\n * All users created after the release date of onboarding should be redirected into onboarding\n * the first time they open the product\n */\n if (masterUser?.dateCreated >= getOnboardingReleaseDate(availablePresentations, customer))\n return true;\n\n /**\n * If a trial user was created before the onboarding release date, but they don't have a job title,\n * we should redirect them to onboarding as we need to collect their job title.\n */\n if (OnboardingPathwayHelper.hasNonBdmTrial(hasPermissions)) {\n return OnboardingStorageHelper.getJobTitleRedirect(masterUser?.id, masterUser?.userProfile?.metadata?.jobTitle);\n }\n\n return false;\n }\n};","export enum PresentationLearningLevel {\n Level_1 = 1, // Primary/Elementary School\n Level_2 = 2, // Middle School\n Level_3 = 3, // Secondary/High School\n Level_4 = 4 // Tertiary/Post-Secondary\n}\n","export enum ClassificationNodeType {\n Root = 'root'\n}","// Maps to enum in SubjectApi but uses the\n// key rather than the value\nexport enum ClassificationType{\n Subject = 'Subject',\n CurriculumAudience = 'CurriculumAudience',\n CurriculumSubject = 'CurriculumSubject',\n CurriculumArea = 'CurriculumArea',\n CurriculumLeaf = 'CurriculumLeaf',\n CurriculumMetadata = 'CurriculumMetadata'\n}","export enum TagType {\n Normal = 'normal',\n Pedagogy = 'pedagogy',\n Hidden = 'hidden',\n Skill = 'skill',\n Curation = 'curation'\n}\n\n/**\n * This should **only** be used to create new tags in master (as it only accepts enum values).\n * Use the string enum above for all other cases.\n */\nexport enum TagTypeNumber {\n Normal = 0,\n Pedagogy = 1,\n Hidden = 2,\n Skill = 3,\n Curation = 4\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { ClassificationTab } from 'libs/shared/apps/subjects/components/classification-dashboard/classification-tabs/ClassificationTabs';\nimport { ClassificationNodeType } from 'libs/shared/apps/subjects/enums/ClassificationNodeType';\nimport { HardCoded } from 'libs/shared/constants/HardCoded';\nimport { TopicsConstants } from 'libs/shared/constants/TopicsConstants';\nimport { ClassificationType } from 'libs/shared/enums/ClassificationType';\nimport { CurationTag } from 'libs/shared/enums/CurationTag';\nimport { PresentationLearningLevel } from 'libs/shared/enums/PresentationLearningLevel';\nimport { TagType } from 'libs/shared/enums/TagType';\nimport { BaseObject, CuratedDashboard, DashboardTargetType, Presentation } from 'libs/shared/interfaces';\nimport { Classification } from 'libs/shared/interfaces/models/Classification';\n\nconst namespace = 'subjects.utils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface TopicCounts {\n dashboardVideoCount: number;\n childDashboardVideoCount: number;\n\n dashboardResourceCount: number;\n childDashboardResourceCount: number;\n\n dashboardNewVideosCount: number;\n childDashboardNewVideoCount: number;\n childClassificationCount: number;\n}\n\ntype PresentationImageType = 'cover' | 'tall-poster' | 'topic-banner' | 'new-release-banner';\n\nexport const TopicsHelper = {\n isPresentation(obj: BaseObject): obj is Presentation {\n return 'learningLevel' in obj;\n },\n\n isTopicClassification(obj: BaseObject): obj is Classification {\n return obj?.type === ClassificationType.Subject;\n },\n\n getMappedPresentationLevel(presentationLevel: PresentationLearningLevel): string | PresentationLearningLevel {\n // Handle usage of both enum value and its stringified version (online vs. lite)\n return typeof presentationLevel === 'string'\n ? PresentationLearningLevel[presentationLevel]\n : presentationLevel;\n },\n\n getMappedPresentationBackgroundColourClass(presentationLevel: PresentationLearningLevel): string {\n switch (TopicsHelper.getMappedPresentationLevel(presentationLevel)) {\n case PresentationLearningLevel.Level_1:\n return 'bg-indigo';\n\n case PresentationLearningLevel.Level_3:\n return 'bg-blue';\n \n case PresentationLearningLevel.Level_4:\n return 'bg-navy';\n\n default:\n case PresentationLearningLevel.Level_2:\n return 'bg-green';\n }\n },\n\n // TODO: This should maybe live on the presentation metadata at some point instead.\n getMappedPresentationBackgroundColourCode(presentationLevel: PresentationLearningLevel): string {\n switch (TopicsHelper.getMappedPresentationLevel(presentationLevel)) {\n case PresentationLearningLevel.Level_1:\n return '#7A76E8';\n\n case PresentationLearningLevel.Level_3:\n return '#38A2E8';\n\n case PresentationLearningLevel.Level_4:\n return '#1B2D71';\n\n default:\n case PresentationLearningLevel.Level_2:\n return '#5DC786';\n }\n },\n\n getPresentationLevelImage(presentationLevel: PresentationLearningLevel, imageType: PresentationImageType): string {\n switch (TopicsHelper.getMappedPresentationLevel(presentationLevel)) {\n case PresentationLearningLevel.Level_1: {\n if (imageType === 'topic-banner')\n return HardCoded.Images.Level_1.TOPIC_BANNER;\n if (imageType === 'new-release-banner')\n return HardCoded.Images.Level_1.NEW_RELEASES_BANNER;\n if (imageType === 'cover')\n return HardCoded.Images.Level_1.TOPIC_COVER;\n if (imageType === 'tall-poster')\n return HardCoded.Images.Level_1.TOPIC_TALL_POSTER;\n }\n\n case PresentationLearningLevel.Level_2: {\n if (imageType === 'topic-banner')\n return HardCoded.Images.Level_2.TOPIC_BANNER;\n if (imageType === 'new-release-banner')\n return HardCoded.Images.Level_2.NEW_RELEASES_BANNER;\n if (imageType === 'cover')\n return HardCoded.Images.Level_2.TOPIC_COVER;\n if (imageType === 'tall-poster')\n return HardCoded.Images.Level_2.TOPIC_TALL_POSTER;\n }\n\n default:\n case PresentationLearningLevel.Level_3: {\n if (imageType === 'topic-banner')\n return HardCoded.Images.Level_3.TOPIC_BANNER;\n if (imageType === 'new-release-banner')\n return HardCoded.Images.Level_3.NEW_RELEASES_BANNER;\n if (imageType === 'cover')\n return HardCoded.Images.Level_3.TOPIC_COVER;\n if (imageType === 'tall-poster')\n return HardCoded.Images.Level_3.TOPIC_TALL_POSTER;\n }\n\n case PresentationLearningLevel.Level_4: {\n if (imageType === 'topic-banner')\n return HardCoded.Images.Level_4.TOPIC_BANNER;\n\n if (imageType === 'cover')\n return HardCoded.Images.Level_4.TOPIC_COVER;\n }\n }\n },\n\n getExploreAllTopicsTitle(presentationName: string, presentationCount: number): string {\n if (presentationCount < TopicsConstants.MULTI_PRESENTATION_THRESHOLD)\n return getPhrase('exploreAllTopicsHeading');\n\n return getPhrase('exploreAllTopicsDynamicHeading', { presentationName });\n },\n\n getExploreAllTopicsBreadcrumb(presentationName: string, presentationCount: number): string {\n if (presentationCount < TopicsConstants.MULTI_PRESENTATION_THRESHOLD)\n return getPhrase('exploreAllTopicsHeading');\n\n return presentationName;\n },\n\n isFollowing(classification: Classification): boolean {\n return classification?.followers?.data?.length === 1;\n },\n\n isTopLevelTopic(classification: Classification): boolean {\n return !!classification?.parentIds?.includes(ClassificationNodeType.Root);\n },\n\n canHaveVideoListTab(dashboard: CuratedDashboard): boolean {\n return dashboard?.widgets?.some(w => w.metadata?.showInTableOfContents);\n },\n\n getActiveTopicTab(classification: Classification, targetType: DashboardTargetType): ClassificationTab {\n if (TopicsHelper.isTopLevelTopic(classification))\n return targetType === DashboardTargetType.Classification ? 'new-releases' : 'all-topics';\n\n return targetType === DashboardTargetType.Classification ? 'curated-topic' : 'curriculum';\n },\n\n getCounts(classification: Classification): TopicCounts {\n const childClassificationCount = classification?.metadata?.childClassificationCount ?? 0;\n\n if (!classification?.externalMetadata) {\n return {\n childClassificationCount,\n\n dashboardVideoCount: 0,\n childDashboardVideoCount: 0,\n\n dashboardResourceCount: 0,\n childDashboardResourceCount: 0,\n\n dashboardNewVideosCount: 0,\n childDashboardNewVideoCount: 0\n };\n }\n\n return {\n childClassificationCount,\n\n dashboardVideoCount: classification.externalMetadata.dashboardVideoCount || 0,\n childDashboardVideoCount: classification.externalMetadata.childDashboardVideoCount || 0,\n\n dashboardResourceCount: classification.externalMetadata.dashboardResourceCount || 0,\n childDashboardResourceCount: classification.externalMetadata.childDashboardResourceCount || 0,\n\n dashboardNewVideosCount: classification.externalMetadata.dashboardNewVideosCount || 0,\n childDashboardNewVideoCount: classification.externalMetadata.childDashboardNewVideoCount || 0\n };\n },\n\n isTertiary(presentationId: string): boolean {\n return (\n presentationId?.toString() === HardCoded.PresentationIds.AU_TERTIARY.toString() ||\n presentationId?.toString() === HardCoded.PresentationIds.UK_TERTIARY.toString()\n );\n },\n\n isNewZealandTopic(presentationId: string): boolean {\n return (\n presentationId?.toString() === HardCoded.PresentationIds.NZ_PRIMARY.toString() ||\n presentationId?.toString() === HardCoded.PresentationIds.NZ_SECONDARY.toString()\n );\n },\n\n isCanadaTopic(presentationId: string): boolean {\n return (\n presentationId?.toString() === HardCoded.PresentationIds.CA_ELEMENTARY.toString() ||\n presentationId?.toString() === HardCoded.PresentationIds.CA_MIDDLE.toString() ||\n presentationId?.toString() === HardCoded.PresentationIds.CA_HIGH.toString()\n );\n },\n\n isInternationalTopic(presentationId: string): boolean {\n return (\n presentationId?.toString() === HardCoded.PresentationIds.INT_PRIMARY.toString() ||\n presentationId?.toString() === HardCoded.PresentationIds.INT_SECONDARY.toString()\n );\n },\n\n isMtv(classification: Classification): boolean {\n if (!classification?.tags?.data)\n return false;\n\n return classification.tags.data.some(t => t.tagType === TagType.Curation && t.name === CurationTag.MOVIES_AND_TV);\n },\n\n sortByLearningLevel(a: Classification, b: Classification, availablePresentations: Presentation[]): number {\n const aPresentation = availablePresentations.find(p => p?.id.toString() === a?.presentationId?.toString());\n const bPresentation = availablePresentations.find(p => p?.id.toString() === b?.presentationId?.toString());\n const aLearningLevel = PresentationLearningLevel[aPresentation?.learningLevel] as unknown as number; // ts does not play nice\n const bLearningLevel = PresentationLearningLevel[bPresentation?.learningLevel] as unknown as number;\n\n return aLearningLevel - bLearningLevel;\n }\n};","import ClassificationVideosMapJson from 'libs/shared/apps/onboarding/constants/classification-videos.json';\n\ntype Mappings = Record<string, Record<string, { name: string; videoIds: string[] }>>;\nconst ClassificationVideosMap = ClassificationVideosMapJson as Mappings;\n\nexport { ClassificationVideosMap };","import { ClassificationVideosMap } from './ClassificationVideos';\nimport { OnboardingContext } from './OnboardingScreenConfigs';\n\n\nexport const SharedOnboardingScreenPredicates = {\n CreatePlaylist: (context: OnboardingContext) => {\n /**\n * We don't want to prompt a user who has created a playlist in the past\n * to create their \"first\" playlist.\n */\n if (context.hasPlaylist)\n return false;\n\n /**\n * This is a safety check to make sure that we have videos to show the user based on the\n * presentation that they've selected. Just in case we introduce a new presentation and\n * accidentally forget to add hardcoded videos to `ClassificationVideosMap` for it.\n */\n if (context.preferredPresentation && !ClassificationVideosMap[context.preferredPresentation.id])\n return false;\n\n return true;\n }\n};","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { OnboardingScreenId } from 'libs/shared/apps/onboarding/interfaces/OnboardingScreenId';\nimport { OnboardingPathwayHelper } from 'libs/shared/apps/onboarding/utils/OnboardingPathwayHelper';\nimport { JobTitles } from 'libs/shared/apps/sign-up/interfaces/JobTitles';\nimport { InstanceRegion } from 'libs/shared/enums/InstanceRegion';\nimport { PresentationLearningLevel } from 'libs/shared/enums/PresentationLearningLevel';\nimport { SettingName, SettingsLookup } from 'libs/shared/enums/SettingName';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { Classification, Customer, Presentation, User } from 'libs/shared/interfaces';\nimport { TopicsHelper } from 'libs/shared/utils/topics-helper/TopicsHelper';\n\nimport { SharedOnboardingScreenPredicates } from './SharedOnboardingScreenPredicates';\n\nconst namespace = 'onboarding.constants';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface OnboardingContext {\n masterUser?: User;\n customer?: Customer;\n jobTitle?: JobTitles;\n instanceRegion?: InstanceRegion;\n presentations?: Presentation[];\n curriculums?: Presentation[];\n preferredPresentation?: Presentation;\n preferredSubjects?: Classification[];\n hasPlaylist?: boolean;\n hasPermissions?: HasPermissionsFunc;\n userSettings: SettingsLookup;\n}\n\nexport interface OnboardingScreenConfig {\n id: OnboardingScreenId;\n setting: SettingName;\n analyticsLocation: LocationContext;\n includeInProgressBar: (context: OnboardingContext) => boolean;\n predicate: (context: OnboardingContext) => boolean;\n getWidgetHeading: (isKdm: boolean) => string;\n getWidgetDescription: (isKdm: boolean) => string;\n getPageTitle: () => string;\n branches?: OnboardingScreenId[];\n}\n\nexport const OnboardingScreenConfigs: Record<OnboardingScreenId, OnboardingScreenConfig> = {\n /**\n * The welcome video screen plays an introductory video for new users.\n */\n 'welcome-video': {\n id: 'welcome-video',\n getPageTitle: () => getPhrase('welcomeVideoPageTitle'),\n predicate: context => {\n /**\n * Users who will be redirected to onboarding by the onboarding filter will always be\n * new users. This means that they should see the welcome video screen.\n */\n if (!OnboardingPathwayHelper.shouldRedirectToOnboarding(\n context.masterUser,\n context.customer,\n context.hasPermissions,\n context.presentations\n )) {\n return false;\n }\n\n // We currently only have a welcome video for the US.\n return context.instanceRegion === InstanceRegion.US;\n },\n setting: SettingName.HasCompletedOnboardingStepWelcomeVideo,\n analyticsLocation: LocationContext.OnboardingWelcomeVideoScreen,\n includeInProgressBar: () => false,\n getWidgetHeading: () => getPhrase('selectRoleHeading'),\n getWidgetDescription: () => getPhrase('selectRoleMessage')\n },\n\n 'select-role': {\n id: 'select-role',\n getPageTitle: () => getPhrase('selectRolePageTitle'),\n predicate: (context: OnboardingContext) => {\n /**\n * Some trial sign up flows include a step for users to select their job title\n * before they reach onboarding. This is the only circumstance where we won't show\n * this screen to users.\n */\n if (OnboardingPathwayHelper.hasNonBdmTrial(context.hasPermissions)) {\n // Trial users who don't have a job title set must see this screen\n if (!context.jobTitle)\n return true;\n\n /**\n * Trial users who do have a job title will continue seeing this screen if\n * we can determine that they set it during onboarding\n */\n if (context.userSettings?.[SettingName.HasCompletedOnboardingStepSelectRole]?.value)\n return true;\n\n return false;\n }\n \n return true;\n },\n setting: SettingName.HasCompletedOnboardingStepSelectRole,\n analyticsLocation: LocationContext.OnboardingSelectRoleScreen,\n includeInProgressBar: () => true,\n getWidgetHeading: () => getPhrase('selectRoleHeading'),\n getWidgetDescription: () => getPhrase('selectRoleMessage')\n },\n\n 'usage-intention': {\n id: 'usage-intention',\n getPageTitle: () => getPhrase('usageIntentionPageTitle'),\n predicate: () => true,\n setting: SettingName.HasCompletedOnboardingStepUsageIntention,\n analyticsLocation: LocationContext.OnboardingUsageIntentionScreen,\n includeInProgressBar: () => true,\n getWidgetHeading: () => getPhrase('usageIntentionHeading'),\n getWidgetDescription: () => getPhrase('usageIntentionMessage')\n },\n\n 'subjects-summary': {\n id: 'subjects-summary',\n getPageTitle: () => getPhrase('subjectsSummaryPageTitle'),\n predicate: context => {\n /**\n * This screen is exclusively for users who existed before we released onboarding,\n * and selected some subject preferences in the past.\n * It offers them the opportunity to optionally review and update their preferences.\n */\n if (!context.preferredSubjects?.length)\n return false;\n\n /**\n * If a user has completed any of these 3 steps, then they shouldn't be seeing the summary.\n */\n if (\n context.userSettings?.[SettingName.HasCompletedOnboardingStepSubjects]?.value ||\n context.userSettings?.[SettingName.HasCompletedOnboardingStepSelectCurriculum]?.value ||\n context.userSettings?.[SettingName.HasCompletedOnboardingStepSchoolLevel]?.value\n ) {\n return false;\n }\n\n return true;\n },\n setting: SettingName.HasCompletedOnboardingStepSubjectsSummary,\n analyticsLocation: LocationContext.OnboardingSubjectsSummaryScreen,\n includeInProgressBar: () => true,\n getWidgetHeading: () => getPhrase('subjectsHeading'),\n getWidgetDescription: () => getPhrase('subjectsMessage'),\n branches: [ 'school-level', 'subjects', 'select-curriculum' ]\n },\n\n 'school-level': {\n id: 'school-level',\n getPageTitle: () => getPhrase('schoolLevelPageTitle'),\n predicate: context => {\n if (OnboardingScreenConfigs['subjects-summary'].predicate(context))\n return false;\n\n if (context.presentations?.length < 2)\n return false;\n\n const hasTertiary = context.presentations?.some(p => {\n return TopicsHelper.getMappedPresentationLevel(p.learningLevel) === PresentationLearningLevel.Level_4;\n });\n\n if (hasTertiary)\n return false;\n\n return true;\n },\n setting: SettingName.HasCompletedOnboardingStepSchoolLevel,\n analyticsLocation: LocationContext.OnboardingSchoolLevelScreen,\n includeInProgressBar: ctx => !OnboardingScreenConfigs['subjects-summary'].predicate(ctx),\n getWidgetHeading: isKdm => getPhrase(isKdm ? 'schoolLevelHeadingKdm' : 'schoolLevelHeading'),\n getWidgetDescription: isKdm => getPhrase(isKdm ? 'schoolLevelMessageKdm' : 'schoolLevelMessage')\n },\n\n 'select-curriculum': {\n id: 'select-curriculum',\n getPageTitle: () => getPhrase('selectCurriculumPageTitle'),\n predicate: context => {\n if (OnboardingScreenConfigs['subjects-summary'].predicate(context))\n return false;\n\n if (context.curriculums?.length < 2)\n return false;\n\n return true;\n },\n setting: SettingName.HasCompletedOnboardingStepSelectCurriculum,\n analyticsLocation: LocationContext.OnboardingSelectCurriculumScreen,\n includeInProgressBar: ctx => !OnboardingScreenConfigs['subjects-summary'].predicate(ctx),\n getWidgetHeading: () => getPhrase('selectCurriculumHeading'),\n getWidgetDescription: () => getPhrase('selectCurriculumMessage')\n },\n\n 'subjects': {\n id: 'subjects',\n getPageTitle: () => getPhrase('subjectsPageTitle'),\n predicate: context => {\n if (OnboardingScreenConfigs['subjects-summary'].predicate(context))\n return false;\n\n return true;\n },\n setting: SettingName.HasCompletedOnboardingStepSubjects,\n analyticsLocation: LocationContext.OnboardingSubjectsScreen,\n includeInProgressBar: ctx => !OnboardingScreenConfigs['subjects-summary'].predicate(ctx),\n getWidgetHeading: isKdm => getPhrase(isKdm ? 'subjectsHeadingKdm' : 'subjectsHeading'),\n getWidgetDescription: () => getPhrase('subjectsMessage')\n },\n\n 'select-videos': {\n id: 'select-videos',\n getPageTitle: () => getPhrase('selectVideosPageTitle'),\n predicate: SharedOnboardingScreenPredicates.CreatePlaylist,\n setting: SettingName.HasCompletedOnboardingStepSelectVideos,\n analyticsLocation: LocationContext.OnboardingSelectVideosScreen,\n includeInProgressBar: () => true,\n getWidgetHeading: () => getPhrase('selectVideosHeading'),\n getWidgetDescription: isKdm => getPhrase(isKdm ? 'selectVideosMessageKdm' : 'selectVideosMessage')\n },\n\n 'create-playlist': {\n id: 'create-playlist',\n getPageTitle: () => getPhrase('createPlaylistPageTitle'),\n predicate: SharedOnboardingScreenPredicates.CreatePlaylist,\n setting: SettingName.HasCompletedOnboardingStepCreatePlaylist,\n analyticsLocation: LocationContext.OnboardingCreatePlaylistScreen,\n includeInProgressBar: () => true,\n getWidgetHeading: () => getPhrase('createPlaylistHeading'),\n getWidgetDescription: () => getPhrase('createPlaylistMessage')\n }\n};","export enum WidgetTemplate {\n // Videos\n ThumbnailHeroMedia = 'thumbnail_hero_media',\n ThumbnailFeaturedMedia = 'thumbnail_featured_media',\n ThumbnailSlidingListSmall = 'thumbnail_sliding_list_small',\n ThumbnailSlidingListSmallV2 = 'thumbnail_sliding_list_small_v2',\n ThumbnailSlidingListLarge = 'thumbnail_sliding_list_large',\n ThumbnailFixedListMediaSmall = 'thumbnail_fixed_list_media_small',\n ThumbnailFixedListMediaLarge = 'thumbnail_fixed_list_media_large',\n ThumbnailFixedListFolderSmall = 'thumbnail_fixed_list_folder_small',\n ThumbnailVerticalList = 'thumbnail_vertical_list',\n PopoutThumbnailSlidingListLarge = 'popout_thumbnail_sliding_list_large',\n PopoutThumbnailSlidingListSmall = 'popout_thumbnail_sliding_list_small',\n FeaturedThumbnailSlidingList = 'featured_thumbnail_sliding_list',\n ThumbnailFixedListXLarge = 'thumbnail_fixed_list_xlarge',\n\n // Topics\n CoverSlidingPillListSmall = 'cover_sliding_pill_list_small',\n CoverFixedPillListLarge = 'cover_fixed_pill_list_large',\n StatsCoverFixedPillListLarge = 'stats_cover_fixed_pill_list_large',\n CoverFixedPillListXSmall = 'cover_fixed_pill_list_xsmall',\n ThumbnailFixedListLarge = 'thumbnail_fixed_list_large',\n ThumbnailFixedListSmall = 'thumbnail_fixed_list_small',\n EditableCoverFixedPillListSmall = 'editable_cover_fixed_pill_list_small',\n HeroBanner = 'hero_banner',\n HeroThumbnailSmall = 'hero_thumbnail_small',\n HeroBlockColourSmall = 'hero_block_colour_small',\n\n // Curriculum\n CurriculumResourcesAccordion = 'curriculum_resources_accordion',\n CurriculumCodeSearchResults = 'curriculum_code_search_results',\n\n // Playlists\n CoverFixedTileList = 'cover_fixed_tile_list',\n\n // Topics & Series\n PosterSlidingListLarge = 'poster_sliding_list_large',\n PosterSlidingListMedium = 'poster_sliding_list_medium',\n PosterSlidingListSmall = 'poster_sliding_list_small',\n PosterFixedListLarge = 'poster_fixed_list_large',\n\n // Blurbs & Topics\n HeroBannerSmall = 'hero_banner_small',\n\n // Text-based blurbs\n Heading = 'heading',\n AuthorReviewer = 'author_reviewer',\n Question = 'question',\n QuestionAccordion = 'question_accordion',\n\n // Onboarding\n OnboardingSteps = 'onboarding_steps',\n\n // Companies / Studios / Content Partners\n CircleLogoSlidingList = 'circle_logo_sliding_list',\n RectangularLogoSlidingList = 'rectangular_logo_sliding_list',\n RectangularLogoFixedList = 'rectangular_logo_fixed_list',\n ThumbnailFixedListSearchCta = 'thumbnail_fixed_list_search_cta',\n InfiniteThumbnailVerticalList = 'infinite_thumbnail_vertical_list',\n\n // Rating filters\n FilterSlidingPillListSmall = 'filter_sliding_pill_list_small',\n\n // Special events\n EventIconSlidingList = 'event_icon_sliding_list',\n\n // Tags filter\n TagSlidingList = 'tag_sliding_list',\n\n SearchSuggestionsBlurb = 'search_suggestions_blurb'\n}\n","export enum WidgetTypeId {\n // Video group\n CuratedMedia = 'curated_media',\n PlaylistMedia = 'playlist_media',\n SeriesMedia = 'series_media',\n ClassificationMedia = 'classification_media',\n LatestReleasedVideos = 'latest_released_videos',\n ContinueWatching = 'continue_watching_videos',\n CompanyLatestReleasedVideo = 'company_latest_released_video',\n CompanyVideos = 'company_videos',\n ClassificationLatestReleasedVideo = 'classification_latest_released_video',\n ClassificationLatestReleasedVideosV2 = 'classification_latest_released_videos_v2',\n CompanyClassificationVideos = 'company_classification_videos',\n ClassificationDashboardMedia = 'classification_dashboard_media',\n ClassificationDashboardExternalMedia = 'classification_dashboard_external_media',\n SeasonalClassificationMedia = 'seasonal_classification_media',\n TrendingClassificationsMedia = 'trending_classifications_media',\n ClassificationCurriculumMedia = 'classification_curriculum_media',\n\n // Topics group\n CuratedClassifications = 'curated_classifications',\n Classifications = 'classifications',\n ClassificationLatestReleasedVideos = 'classification_latest_released_videos',\n SpecialEventClassifications = 'special_event_classifications',\n LatestReleasedClassifications = 'latest_released_classifications',\n TrendingClassifications = 'trending_classifications',\n\n // Series group\n CuratedSeries = 'curated_series',\n\n // Playlists group\n CuratedPlaylists = 'curated_playlists',\n\n // Blurb group\n Blurb = 'blurb',\n DynamicBlurb = 'dynamic_blurb',\n AuthorReviewer = 'author_reviewer',\n Faq = 'faq',\n\n // Network group\n CuratedCompanies = 'curated_companies',\n\n // Partner Profile group\n CuratedContentPartners = 'curated_content_partners',\n ContentPartnerLatestReleasedVideos = 'content_partner_latest_released_videos',\n ContentPartnerSeries = 'content_partner_series',\n ContentPartnerVideos = 'content_partner_videos',\n SpotlightContentPartners = 'spotlight_curated_content_partners',\n ContentPartners = 'content_partners',\n ContentPartnersHub = 'content_partners_hub',\n TrendingContentPartnersVideo = 'content_partner_trending_videos',\n ContentPartnerAllVideos = 'content_partner_all_videos',\n\n // Search filter group\n Ratings = 'ratings',\n\n // Presentations group\n Presentations = 'presentations',\n\n // Livestreams group\n UpcomingLivestreams = 'upcoming_livestreams',\n\n // Multimedia group\n CuratedMultimedia = 'curated_multimedia',\n\n // Legacy widget types\n ClassificationPlaylists = 'classification_playlists',\n ClassificationSeries = 'classification_series',\n ClassificationFeaturedVideo = 'classification_featured_video',\n ClassificationPinnedVideos = 'classification_pinned_videos',\n\n // Search widget types\n SearchRelevantTopics = 'search_relevant_topics',\n SearchCompanies = 'search_companies',\n SearchTopResults = 'search_top_results',\n SearchSeries = 'search_series',\n SearchPlaylists = 'search_playlists',\n SearchMyVideosFolder = 'search_my_videos_folders',\n SearchMySchoolLibraryFolder = 'search_my_school_library_folders',\n SearchMyVideos = 'search_my_videos',\n SearchMySchoolLibraryVideos = 'search_my_school_library_videos',\n SearchExchangeArchive = 'search_exchange_archive',\n SearchRelatedResults = 'search_related_results',\n SearchTags = 'search_tags',\n SearchCurriculumCode = 'search_curriculum_code',\n SearchSuggestions = 'search_suggestions',\n SearchContentPartners = 'search_content_partners'\n}\n","import { FormikContextType } from 'formik';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { SearchResultObjectTypes } from 'libs/shared/apps/search/interfaces';\nimport { GetCustomParamOptions, WidgetTypeIdConfig } from 'libs/shared/constants/WidgetTypeIdConfig';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { OnlineUserRole } from 'libs/shared/enums/UserRole';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { SettingsHash } from 'libs/shared/hooks/useSettings';\nimport { BaseObject, ClassificationCurriculumInfo, ClassificationDashboardInfo, ClassificationDirectoryInfo, CuratedDashboard, CuratedMediaWidget, CuratedWidget, CuratedWidgetQueryParams, DashboardTargetInfo, DashboardTargetType, PartnerProfileDashboardInfo, UnknownDashboardTargetInfo } from 'libs/shared/interfaces';\n\ninterface LatestReleasesTimeRange {\n from: string;\n to: string;\n}\n\nexport const DashboardHelper = {\n\n /**\n * Same implementation as GetUserGroup() in Online.\n * @param userRole \n */\n getUserGroup(userRole: OnlineUserRole): UserGroup {\n if (userRole === OnlineUserRole.Student)\n return UserGroup.Learner;\n\n return UserGroup.Staff;\n }\n};\n\nexport const CuratedDashboardHelper = {\n onSelectCuratedObject(\n selectedObj: SearchResultObjectTypes | BaseObject,\n formikProps: FormikContextType<CuratedMediaWidget<BaseObject[]>>\n ) {\n const data = {\n ...formikProps.values.data,\n objectIds: ArrayHelper.addOrRemoveImmutable(formikProps.values.data.objectIds || [], selectedObj.id)\n };\n \n formikProps.setFieldValue('data', data);\n \n formikProps.setTouched({\n ...formikProps.touched,\n data: {\n objectIds: true\n }\n });\n },\n\n onRemoveCuratedObject(\n objectId: string,\n formikProps: FormikContextType<CuratedMediaWidget<BaseObject[]>>\n ) {\n const newData = {\n ...formikProps.values.data,\n objectIds: formikProps.values.data.objectIds.filter(id => id !== objectId)\n };\n\n formikProps.setFieldValue('data', newData);\n },\n\n getDashboardTarget(info: DashboardTargetInfo): string {\n if (info.targetType === DashboardTargetType.Discover)\n return `discover:presentation:${info.presentationId}`;\n\n if (info.targetType === DashboardTargetType.Classification)\n return `classification:${info.classificationId}`;\n\n if (info.targetType === DashboardTargetType.ClassificationDirectory)\n return `classification:${info.classificationId}:directory`;\n\n if (info.targetType === DashboardTargetType.ClassificationCurriculum)\n return `classification:${info.classificationId}:curriculum`;\n\n if (info.targetType === DashboardTargetType.MoviesAndTv)\n return `moviesAndTv:presentation:${info.presentationId}`;\n\n if (info.targetType === DashboardTargetType.Company)\n return `company:${info.companyId}:presentation:${info.presentationId}`;\n\n if (info.targetType === DashboardTargetType.PartnerProfile)\n return `partnerprofile:${info.slug}`;\n\n if (info.targetType === DashboardTargetType.DiscoverPartnerProfiles)\n return `discover:partners`;\n\n if (info.targetType === DashboardTargetType.PartnerProfileHub)\n return `discover:partners:hub`;\n\n return null;\n },\n\n getUnknownDashboardTarget(options: UnknownDashboardTargetInfo): string {\n const {\n presentationId,\n companyId,\n targetType,\n classificationId,\n slug\n } = options;\n\n if (targetType === DashboardTargetType.Discover) {\n return CuratedDashboardHelper.getDashboardTarget({\n targetType: DashboardTargetType.Discover,\n presentationId\n });\n }\n \n if (targetType === DashboardTargetType.MoviesAndTv) {\n return CuratedDashboardHelper.getDashboardTarget({\n targetType: DashboardTargetType.MoviesAndTv,\n presentationId\n });\n }\n \n if (targetType === DashboardTargetType.Company) {\n return CuratedDashboardHelper.getDashboardTarget({\n targetType: DashboardTargetType.Company,\n presentationId,\n companyId\n });\n }\n \n if (targetType === DashboardTargetType.Classification) {\n return CuratedDashboardHelper.getDashboardTarget({\n targetType: DashboardTargetType.Classification,\n classificationId\n });\n }\n \n if (targetType === DashboardTargetType.ClassificationDirectory) {\n return CuratedDashboardHelper.getDashboardTarget({\n targetType: DashboardTargetType.ClassificationDirectory,\n classificationId\n });\n }\n \n if (targetType === DashboardTargetType.ClassificationCurriculum) {\n return CuratedDashboardHelper.getDashboardTarget({\n targetType: DashboardTargetType.ClassificationCurriculum,\n classificationId\n });\n }\n\n if (targetType === DashboardTargetType.PartnerProfile) {\n return CuratedDashboardHelper.getDashboardTarget({\n targetType: DashboardTargetType.PartnerProfile,\n slug\n });\n }\n\n if (targetType === DashboardTargetType.DiscoverPartnerProfiles) {\n return CuratedDashboardHelper.getDashboardTarget({\n targetType: DashboardTargetType.DiscoverPartnerProfiles\n });\n }\n\n if (targetType === DashboardTargetType.PartnerProfileHub) {\n return CuratedDashboardHelper.getDashboardTarget({\n targetType: DashboardTargetType.PartnerProfileHub\n });\n }\n },\n\n getDashboardTargetInfo(dashboard: CuratedDashboard): DashboardTargetInfo {\n const type = CuratedDashboardHelper.getDashboardTargetType(dashboard);\n const split = dashboard?.target?.split(':');\n\n if (type === DashboardTargetType.Discover) {\n return {\n targetType: DashboardTargetType.Discover,\n presentationId: split[2]\n };\n }\n\n if (type === DashboardTargetType.Classification) {\n return {\n targetType: DashboardTargetType.Classification,\n classificationId: split[1]\n };\n }\n\n if (type === DashboardTargetType.ClassificationDirectory) {\n return {\n targetType: DashboardTargetType.ClassificationDirectory,\n classificationId: split[1]\n };\n }\n\n if (type === DashboardTargetType.ClassificationCurriculum) {\n return {\n targetType: DashboardTargetType.ClassificationCurriculum,\n classificationId: split[1]\n };\n }\n\n if (type === DashboardTargetType.MoviesAndTv) {\n return {\n targetType: DashboardTargetType.MoviesAndTv,\n presentationId: split[2]\n };\n }\n\n if (type === DashboardTargetType.Company) {\n return {\n targetType: DashboardTargetType.Company,\n companyId: split[1],\n presentationId: split[3]\n };\n }\n\n if (type === DashboardTargetType.PartnerProfile) {\n return {\n targetType: DashboardTargetType.PartnerProfile,\n slug: split[1]\n };\n }\n\n return null;\n },\n\n getDashboardTargetType(dashboard: CuratedDashboard): DashboardTargetType {\n if (!dashboard?.target)\n return null;\n\n if (dashboard.target.startsWith('discover')) {\n if (dashboard.target.endsWith('partners'))\n return DashboardTargetType.DiscoverPartnerProfiles;\n\n if (dashboard.target.endsWith('hub'))\n return DashboardTargetType.PartnerProfileHub;\n\n return DashboardTargetType.Discover;\n }\n\n if (dashboard.target.startsWith('classification')) {\n if (dashboard.target.endsWith('directory'))\n return DashboardTargetType.ClassificationDirectory;\n\n if (dashboard.target.endsWith('curriculum'))\n return DashboardTargetType.ClassificationCurriculum;\n\n return DashboardTargetType.Classification;\n }\n\n if (dashboard.target.startsWith('moviesAndTv'))\n return DashboardTargetType.MoviesAndTv;\n\n if (dashboard.target.startsWith('company')) {\n return DashboardTargetType.Company;\n }\n\n if (dashboard.target.startsWith('partnerprofile'))\n return DashboardTargetType.PartnerProfile;\n\n return null;\n },\n\n isType(dashboard: CuratedDashboard, target: DashboardTargetType): boolean {\n return CuratedDashboardHelper.getDashboardTargetType(dashboard) === target;\n },\n\n isCuratedDashboard(obj: BaseObject): obj is CuratedDashboard {\n const dashboard = obj as CuratedDashboard;\n\n const targetType = CuratedDashboardHelper.getDashboardTargetType(dashboard);\n\n if (targetType === DashboardTargetType.Discover)\n return true;\n\n if (targetType === DashboardTargetType.Classification)\n return true;\n\n if (targetType === DashboardTargetType.ClassificationDirectory)\n return true;\n\n if (targetType === DashboardTargetType.ClassificationCurriculum)\n return true;\n\n if (targetType === DashboardTargetType.MoviesAndTv)\n return true;\n\n if (targetType === DashboardTargetType.Company)\n return true;\n\n return false;\n },\n\n getLatestReleasedTimeRange(): LatestReleasesTimeRange {\n const now = new Date();\n const from = DateHelper.format(DateHelper.endOf(DateHelper.subtract(now, 2, 'month'), 'day'), 'YYYY-MM-DD');\n const to = DateHelper.format(DateHelper.endOf(now, 'day'), 'YYYY-MM-DD');\n return { from, to };\n },\n\n getWidgetParams(\n widgetTypeId: WidgetTypeId,\n templateId: WidgetTemplate,\n target: DashboardTargetType,\n audienceIds?: string | string[],\n preferredCurriculumId?: string,\n options?: GetCustomParamOptions\n ): CuratedWidgetQueryParams {\n const params: CuratedWidgetQueryParams = { };\n\n if (audienceIds)\n params.audienceId = audienceIds;\n\n if (widgetTypeId === WidgetTypeId.ClassificationCurriculumMedia)\n params.curriculumPresentationId = preferredCurriculumId;\n\n return {\n ...params,\n ...WidgetTypeIdConfig[widgetTypeId]?.getCustomParams?.(templateId, target, options)\n };\n },\n\n isSystemGeneratedDashboard(widgets: CuratedWidget[]): boolean {\n const systemGeneratedClassificationWidgetTypes = new Set<WidgetTypeId>([\n WidgetTypeId.ClassificationFeaturedVideo,\n WidgetTypeId.ClassificationPinnedVideos,\n WidgetTypeId.ClassificationPlaylists,\n WidgetTypeId.ClassificationSeries\n ]);\n\n return widgets?.some(widget => systemGeneratedClassificationWidgetTypes.has(widget.widgetId));\n },\n\n isClassificationDashboard(\n targetInfo: DashboardTargetInfo\n ): targetInfo is ClassificationDashboardInfo | ClassificationDirectoryInfo | ClassificationCurriculumInfo {\n return [\n DashboardTargetType.Classification,\n DashboardTargetType.ClassificationDirectory,\n DashboardTargetType.ClassificationCurriculum\n ].includes(targetInfo?.targetType);\n },\n\n isContentPartnerDashboard(targetInfo: DashboardTargetInfo): targetInfo is PartnerProfileDashboardInfo {\n return targetInfo?.targetType === DashboardTargetType.PartnerProfile;\n },\n\n isDirectoryDashboard(\n targetInfo: DashboardTargetInfo\n ): targetInfo is ClassificationDirectoryInfo {\n return targetInfo?.targetType === DashboardTargetType.ClassificationDirectory;\n },\n\n isWidgetTypeEnabled(\n widgetTypeId: WidgetTypeId,\n settingsHash: SettingsHash,\n targetType: DashboardTargetType\n ): boolean {\n const config = WidgetTypeIdConfig[widgetTypeId];\n \n return config?.predicate?.({ settingsHash, targetType }) ?? true;\n }\n};","import { Core } from 'libs/common/backbone/index';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { OnboardingScreenConfigs } from '../apps/onboarding/constants/OnboardingScreenConfigs';\nimport { SourceFilterOptions, TypeFilterOptions } from '../apps/search/interfaces';\nimport { WidgetAppLinks } from '../components/widgets/curated-widgets/WidgetProps';\nimport { SettingName } from '../enums/SettingName';\nimport { WidgetTemplate } from '../enums/WidgetTemplate';\nimport { WidgetTypeId } from '../enums/WidgetTypeId';\nimport { SettingsHash } from '../hooks/useSettings';\nimport { CuratedWidgetContent, CuratedWidgetQueryParams, DashboardTargetType, Series } from '../interfaces';\nimport { CuratedDashboardHelper } from '../utils/DashboardHelper';\n\ninterface WidgetTypeIdPredicateOptions {\n settingsHash: SettingsHash;\n targetType: DashboardTargetType;\n}\n\nexport interface GetCustomParamOptions {\n params?: CuratedWidgetQueryParams;\n}\n\ninterface WidgetTypeIdConfigType {\n getCustomParams: (\n widgetTemplate: WidgetTemplate,\n targetType: DashboardTargetType,\n options?: GetCustomParamOptions\n ) => CuratedWidgetQueryParams;\n minContent?: number;\n getCollectionAppLink?: (appLinks: Partial<WidgetAppLinks>, content?: CuratedWidgetContent) => Core.AppLink;\n /**\n * Predicate used to determine if the widget\n * should be displayed based on the target\n * type and settings. Useful for feature flagging widgets.\n */\n predicate?: (options: WidgetTypeIdPredicateOptions) => boolean;\n}\n\nfunction partnerProfileWidgetTypeIdPredicate(options: WidgetTypeIdPredicateOptions): boolean {\n return options.settingsHash?.hasPartnerProfiles ?? false;\n}\n\nexport const WidgetTypeIdConfig: Record<WidgetTypeId, WidgetTypeIdConfigType> = {\n [WidgetTypeId.CuratedMedia]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.PlaylistMedia]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.SeriesMedia]: {\n getCustomParams: (widgetTemplate: WidgetTemplate) => {\n switch (widgetTemplate) {\n case WidgetTemplate.ThumbnailFixedListMediaLarge:\n return { limit: 2 };\n case WidgetTemplate.ThumbnailHeroMedia:\n case WidgetTemplate.ThumbnailFeaturedMedia:\n return { limit: 1 };\n default:\n return { limit: 12 };\n }\n },\n getCollectionAppLink: (appLinks, content) => appLinks?.series?.(ArrayHelper.first(content) as Series)\n },\n [WidgetTypeId.ClassificationMedia]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.LatestReleasedVideos]: {\n getCustomParams: () => {\n return CuratedDashboardHelper.getLatestReleasedTimeRange();\n }\n },\n [WidgetTypeId.ContinueWatching]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks?.watchHistory?.()\n },\n [WidgetTypeId.CompanyLatestReleasedVideo]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.CompanyVideos]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.ClassificationLatestReleasedVideo]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.ClassificationLatestReleasedVideosV2]: {\n getCustomParams: () => {\n return {\n limit: 12\n };\n },\n minContent: 4\n },\n [WidgetTypeId.SeasonalClassificationMedia]: {\n getCustomParams: () => {\n return {\n limit: 12\n };\n },\n minContent: 4\n },\n [WidgetTypeId.CompanyClassificationVideos]: {\n getCustomParams: () => ({}),\n minContent: 4\n },\n [WidgetTypeId.TrendingClassificationsMedia]: {\n getCustomParams: () => {\n return {\n limit: 12\n };\n },\n minContent: 4\n },\n\n [WidgetTypeId.CuratedClassifications]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.TrendingClassifications]: {\n getCustomParams: () => {\n return {\n limit: 6\n };\n },\n minContent: 3\n },\n [WidgetTypeId.Classifications]: {\n getCustomParams: (template: WidgetTemplate, targetType: DashboardTargetType) => {\n if (targetType === DashboardTargetType.Discover) {\n if (template === WidgetTemplate.EditableCoverFixedPillListSmall) {\n return {\n canBePreferred: true,\n isFollowing: true\n };\n }\n\n if ([ WidgetTemplate.PosterSlidingListSmall, WidgetTemplate.CoverFixedPillListXSmall ].includes(template)) {\n return {\n canBePreferred: true\n };\n }\n }\n\n return {};\n }\n },\n [WidgetTypeId.ClassificationLatestReleasedVideos]: {\n getCustomParams: () => {\n return CuratedDashboardHelper.getLatestReleasedTimeRange();\n }\n },\n [WidgetTypeId.SpecialEventClassifications]: {\n getCustomParams: () => ({\n from: DateHelper.format(new Date(), 'YYYY-MM-DD')\n })\n },\n [WidgetTypeId.LatestReleasedClassifications]: {\n getCustomParams: () => {\n return {\n limit: 6\n };\n },\n minContent: 3\n },\n\n [WidgetTypeId.CuratedSeries]: {\n getCustomParams: () => ({})\n },\n\n [WidgetTypeId.CuratedPlaylists]: {\n getCustomParams: () => ({})\n },\n\n [WidgetTypeId.Blurb]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.DynamicBlurb]: {\n getCustomParams: (templateId: WidgetTemplate) => {\n if (templateId === WidgetTemplate.OnboardingSteps) {\n return {\n customerSetting: [SettingName.HasNewOnboarding],\n userSettings: [\n ...Object.values(OnboardingScreenConfigs).map(c => c.setting),\n SettingName.HasCompletedOnboardingV2,\n SettingName.HasExitedOnboarding\n ]\n };\n }\n\n return {};\n }\n },\n [WidgetTypeId.AuthorReviewer]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.Faq]: {\n getCustomParams: () => ({})\n },\n\n [WidgetTypeId.CuratedCompanies]: {\n getCustomParams: () => ({}),\n predicate: options => {\n if (options.settingsHash?.hasPartnerProfiles)\n return false;\n return true;\n }\n },\n\n [WidgetTypeId.Ratings]: {\n getCustomParams: () => ({})\n },\n\n [WidgetTypeId.Presentations]: {\n getCustomParams: () => ({})\n },\n\n [WidgetTypeId.UpcomingLivestreams]: {\n getCustomParams: () => ({\n from: DateHelper.format(new Date(), 'YYYY-MM-DD')\n })\n },\n\n [WidgetTypeId.CuratedMultimedia]: {\n getCustomParams: () => ({})\n },\n\n [WidgetTypeId.ClassificationPlaylists]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.ClassificationSeries]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.ClassificationFeaturedVideo]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.ClassificationPinnedVideos]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.ClassificationDashboardExternalMedia]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.ClassificationDashboardMedia]: {\n getCustomParams: () => ({})\n },\n\n [WidgetTypeId.SearchRelevantTopics]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchRelevantTopics],\n type: [TypeFilterOptions.Classification]\n })\n },\n [WidgetTypeId.SearchCompanies]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchCompanies],\n type: [TypeFilterOptions.Company]\n }),\n predicate: options => {\n if (options.settingsHash?.hasPartnerProfiles)\n return false;\n return true;\n }\n },\n [WidgetTypeId.SearchSeries]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchSeries],\n type: [TypeFilterOptions.Series]\n })\n },\n [WidgetTypeId.SearchPlaylists]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchPlaylists],\n type: [TypeFilterOptions.Playlist]\n })\n },\n [WidgetTypeId.SearchMyVideosFolder]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchMyVideosFolder],\n source: [SourceFilterOptions.MyVideos]\n })\n },\n [WidgetTypeId.SearchMySchoolLibraryFolder]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchMySchoolLibraryFolder],\n source: [SourceFilterOptions.School]\n })\n },\n [WidgetTypeId.SearchMyVideos]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchMyVideos],\n source: [SourceFilterOptions.MyVideos]\n })\n },\n [WidgetTypeId.SearchMySchoolLibraryVideos]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchMySchoolLibraryVideos],\n source: [SourceFilterOptions.School]\n })\n },\n [WidgetTypeId.SearchExchangeArchive]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchExchangeArchive],\n source: [SourceFilterOptions.ExchangeArchive]\n })\n },\n [WidgetTypeId.SearchRelatedResults]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.SearchTopResults]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.ClassificationCurriculumMedia]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.SearchTags]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.SearchCurriculumCode]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.SearchSuggestions]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.SearchContentPartners]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchContentPartners],\n type: [TypeFilterOptions.PartnerProfile]\n }),\n predicate: partnerProfileWidgetTypeIdPredicate\n },\n [WidgetTypeId.CuratedContentPartners]: {\n getCustomParams: () => ({\n limit: 12\n }),\n predicate: partnerProfileWidgetTypeIdPredicate\n },\n [WidgetTypeId.ContentPartnerLatestReleasedVideos]: {\n getCustomParams: () => ({}),\n predicate: partnerProfileWidgetTypeIdPredicate\n },\n [WidgetTypeId.ContentPartnerSeries]: {\n getCustomParams: () => ({}),\n predicate: partnerProfileWidgetTypeIdPredicate\n },\n [WidgetTypeId.ContentPartnerVideos]: {\n getCustomParams: () => ({}),\n predicate: partnerProfileWidgetTypeIdPredicate\n },\n [WidgetTypeId.SpotlightContentPartners]: {\n getCustomParams: () => ({}),\n predicate: partnerProfileWidgetTypeIdPredicate\n },\n [WidgetTypeId.ContentPartners]: {\n getCustomParams: (\n widgetTemplate: WidgetTemplate,\n targetType: DashboardTargetType,\n options?: GetCustomParamOptions\n ) => ({\n letterPrefix: options?.params?.letterPrefix\n }),\n predicate: partnerProfileWidgetTypeIdPredicate\n },\n [WidgetTypeId.ContentPartnersHub]: {\n getCustomParams: (\n widgetTemplate: WidgetTemplate,\n targetType: DashboardTargetType,\n options?: GetCustomParamOptions\n ) => {\n if (targetType !== DashboardTargetType.PartnerProfileHub)\n return {};\n\n return {\n objectId: options?.params?.objectId\n };\n },\n predicate: partnerProfileWidgetTypeIdPredicate\n },\n [WidgetTypeId.TrendingContentPartnersVideo]: {\n getCustomParams: () => ({}),\n predicate: partnerProfileWidgetTypeIdPredicate\n },\n [WidgetTypeId.ContentPartnerAllVideos]: {\n getCustomParams: () => ({}),\n predicate: partnerProfileWidgetTypeIdPredicate\n }\n};","import React from 'react';\n\nexport function WarningOutlineSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n d='m13.026 4.377 8.5 14A1.2 1.2 0 0 1 20.5 20.2h-17a1.2 1.2 0 0 1-1.026-1.823l8.5-14a1.2 1.2 0 0 1 2.052 0M12 5 3.5 19h17zm0 13a1 1 0 1 1 0-2 1 1 0 0 1 0 2m.75-3.677a.69.69 0 0 1-.7.677.69.69 0 0 1-.7-.677V8.677c0-.374.313-.677.7-.677s.7.303.7.677z'\n fill='currentColor'\n />\n </svg>\n );\n}\n","export enum WidgetStatus {\n Draft = 0,\n Published = 1,\n Archived = 2\n}\n\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { WidgetStatus } from 'libs/shared/enums/WidgetStatus';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { Breakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { BaseWidget, CuratedDashboardAppLink, CuratedWidget, CuratedWidgetContent, Playlist, Presentation, Series, Video, VideoTypes, VideoWidgetTemplateContent, WidgetMetadata, WidgetPreference } from 'libs/shared/interfaces';\n\nimport { AnyWidgetTemplateProps } from '../components/widgets/curated-widgets/WidgetProps';\nimport { WidgetTypeIdConfig } from '../constants/WidgetTypeIdConfig';\nimport { MasterType } from '../enums/MasterType';\n\nimport { MasterTypeHelper } from './MasterTypeHelper';\n\nenum WidgetStatusString {\n Draft = 'Draft',\n Published = 'Published',\n Archived = 'Archived'\n}\n\nexport const WidgetHelper = {\n /**\n * Used by both the FixedWidget and DynamicWidget\n */\n getSliderAnalyticsOptions: (): AnalyticsOptions => ({\n actionType: UserAction.Click,\n location: LocationContext.SlidingList,\n entity: EntityType.Widget,\n descriptor: ClickDescriptor.Slide\n }),\n\n /**\n * Used by both the FixedWidget and DynamicWidget\n */\n getSliderItemAnalyticsOptions: (): AnalyticsOptions => ({\n location: LocationContext.SlidingListItem\n }),\n\n getSliderHeadingAnalyticsOptions: (): AnalyticsOptions => ({\n actionType: UserAction.Click,\n location: LocationContext.SlidingList,\n entity: EntityType.Widget,\n descriptor: ClickDescriptor.Title\n }),\n\n useGetContent(\n content: CuratedWidgetContent,\n widgetTypeId: WidgetTypeId,\n isPreviewing: boolean,\n preferences: WidgetPreference[],\n removedItemIds: string[]\n ): { content: CuratedWidgetContent; unfilteredContent: CuratedWidgetContent; } {\n return React.useMemo(() => {\n if (!content)\n return { content: null, unfilteredContent: null };\n\n if (!Array.isArray(content))\n return { content, unfilteredContent: content };\n\n const preferencesHash = preferences?.reduce((acc: HashObject, current) => {\n acc[current.id] = current;\n return acc;\n }, {}) ?? {};\n\n const removedItemIdsHash = removedItemIds.reduce((acc: HashObject, current) => {\n acc[current] = true;\n return acc;\n }, {});\n\n const contentCopy = [...content];\n \n const sortedContent = contentCopy.sort((a, b) => {\n if (!('id' in a) || !('id' in b))\n return 0;\n\n const aIndex = preferencesHash[a.id]?.index ?? contentCopy.findIndex(c => 'id' in c && c.id === a.id);\n const bIndex = preferencesHash[b.id]?.index ?? contentCopy.findIndex(c => 'id' in c && c.id === b.id);\n\n if (aIndex < bIndex)\n return -1;\n\n if (aIndex > bIndex)\n return 1;\n\n return 0;\n });\n\n if (WidgetHelper.isBelowContentMinimum(sortedContent, widgetTypeId) && !isPreviewing) {\n return {\n content: [],\n unfilteredContent: sortedContent\n };\n }\n\n const filteredContent = sortedContent.filter(item => {\n if (preferencesHash['id' in item && item.id]?.hidden)\n return false;\n\n if (removedItemIdsHash['id' in item && item.id])\n return false;\n\n return true;\n });\n\n return {\n content: filteredContent,\n unfilteredContent: sortedContent\n };\n }, [ content, preferences ]);\n },\n\n isBelowContentMinimum(content: CuratedWidgetContent, widgetTypeId: WidgetTypeId): boolean {\n const minContent = WidgetTypeIdConfig[widgetTypeId]?.minContent || 0;\n return content?.length < minContent;\n },\n\n getCustomAppLink(props: AnyWidgetTemplateProps): Core.AppLink | null {\n if (\n !('metadata' in props) ||\n !('appLinks' in props) ||\n !('appLink' in props.metadata)\n ) {\n return null;\n }\n\n if (props.metadata?.appLink === CuratedDashboardAppLink.LatestReleases && 'latestReleases' in props.appLinks)\n return props.appLinks?.latestReleases?.();\n\n if (props.metadata?.appLink === CuratedDashboardAppLink.ExploreAllTopics && 'allTopics' in props.appLinks && 'presentation' in props)\n return props.appLinks?.allTopics?.(props.presentation.id);\n\n return null;\n },\n\n getWidgetStatus(widget: CuratedWidget): WidgetStatus {\n let status = widget.status;\n\n if (typeof (status) === 'string') {\n switch (status) {\n case WidgetStatusString.Archived:\n status = WidgetStatus.Archived;\n break;\n case WidgetStatusString.Published:\n status = WidgetStatus.Published;\n break;\n case WidgetStatusString.Draft:\n status = WidgetStatus.Draft;\n break;\n }\n }\n\n return status;\n },\n\n formatResponseData(widget: CuratedWidget, presentation?: Presentation): CuratedWidget {\n const content = widget.content;\n\n if (!content)\n return widget;\n\n if ('author' in content) {\n widget.content = [content] as CuratedWidgetContent;\n return widget;\n }\n\n if ('data' in content)\n widget.content = content.data as CuratedWidgetContent;\n else if (!Array.isArray(content))\n widget.content = [content]; // Handle `classification_featured_video` widgets, which don't return content as an array\n\n switch (widget.widgetId) {\n case WidgetTypeId.ClassificationSeries:\n widget.content = widget.content.filter((c): c is Series => 'tallPoster' in c && !!c.tallPoster?.id);\n break;\n case WidgetTypeId.ClassificationPlaylists:\n widget.content = widget.content.filter((c): c is Playlist => 'cover' in c && !!c.cover?.id);\n break;\n case WidgetTypeId.ContinueWatching:\n widget.content = widget.content.map(c => 'object' in c && c.object);\n default:\n break;\n case WidgetTypeId.Presentations:\n widget.content = widget.content.filter((c): c is Presentation => 'id' in c && c.id.toString() !== presentation?.id?.toString());\n break;\n }\n\n return widget;\n },\n \n isWidgetInTableOfContents(metadata: Partial<WidgetMetadata>): boolean {\n return !!metadata?.showInTableOfContents;\n },\n\n /**\n * Widget container view won't render a widget with no content typically,\n * but some widgets (such as blurbs) have no content, but should render anyway.\n */\n hasNoContent(widgetTypeId: WidgetTypeId): boolean {\n if (widgetTypeId === WidgetTypeId.Blurb)\n return true;\n\n return false;\n },\n\n /**\n * If any widgets should be hidden on smaller screen sizes, add them here.\n * If this needs to be more flexible at some point, it should be added to\n * the widget settings and metadata object.\n */\n canDisplayOnScreenSize(\n breakpoints: Breakpoints,\n widgetTypeId: WidgetTypeId,\n widgetTemplate: WidgetTemplate\n ): boolean {\n if (widgetTypeId === WidgetTypeId.Blurb && widgetTemplate === WidgetTemplate.HeroBannerSmall)\n return !breakpoints.xs && !breakpoints.sm;\n\n return true;\n },\n\n isCompanyWidget(widgetTypeId: WidgetTypeId): boolean {\n switch (widgetTypeId) {\n case WidgetTypeId.CompanyLatestReleasedVideo:\n case WidgetTypeId.CompanyVideos:\n case WidgetTypeId.UpcomingLivestreams:\n return true;\n default:\n return false;\n }\n },\n\n getVideoContent(content: VideoWidgetTemplateContent): VideoTypes[] {\n const firstItem = ArrayHelper.first<Video | Series>(content);\n\n if (MasterTypeHelper.isType<Series>(firstItem, MasterType.Series))\n return firstItem.videos.data;\n\n return content as VideoTypes[];\n },\n\n showRemoveButton(widgetTypeId: WidgetTypeId): boolean {\n return widgetTypeId === WidgetTypeId.ContinueWatching;\n },\n\n /**\n * Paginated data returns more widgets so if we dont merge the widget content by widget type id,\n * it would add another widget to the page rather than appending content to the relevant\n * search result index\n * \n * For example:\n * Say we receive these widgets for a query:\n * - topics widget\n * - related results widget\n * \n * If a user scrolls down to the end of page we fetch more items from the last widget\n * which in this case is 'related results widget'. \n * Now our overall response looks like this\n * - topics widget\n * - related results widget\n * - related results widget\n * \n * Since this is a new widget item entry it will be rendered as a new widget with seprate headings etc.\n * In this case we want to combine these two widgets data into one so its looks like this again:\n * - topics widget\n * - related results widget (data is combined)\n * \n * But what if widget we get recieve has a different widget template id. This currently happens for\n * the 'series widget' - series widget can have the tall poster template or the thumbnail like template.\n * \n * so to visualize this it can be like:\n * - topics widget\n * - top results widget\n * - series widget (template: tall poster)\n * - series widget (template: thumbnail)\n * \n * Since they technically will look different based on the template id we will not merge the data in this case.\n * It will merge the data to the same widget as long as the combination of widget Id + template Id is the same.\n * \n * Since they are separate widgets they will render duplicate headings - we handle this in css instead which\n * checks for adjacent siblings and if its the same widget - it hides the widget heading so it will look\n * like its a single widget rather than separate widgets.\n * \n * - Nish\n */\n mergeWidgets<T extends BaseWidget>(\n items: T[],\n mergeContent: (target: T, source: T) => void\n ): T[] {\n const widgets = ObjectHelper.deepClone(items);\n const groupedWidgets = ArrayHelper.groupBy(widgets, 'widgetId');\n const mergedWidgets: T[] = [];\n\n for (const widgetGroup of Object.values(groupedWidgets)) {\n let currentMergedWidget: T | null = null;\n const groupMergedWidgets: T[] = [];\n\n for (const widget of widgetGroup) {\n if (!currentMergedWidget) {\n currentMergedWidget = widget;\n continue;\n }\n\n if (widget.templateId !== currentMergedWidget.templateId) {\n groupMergedWidgets.push(currentMergedWidget);\n currentMergedWidget = widget;\n continue;\n }\n\n mergeContent(currentMergedWidget, widget);\n }\n\n if (currentMergedWidget) {\n groupMergedWidgets.push(currentMergedWidget);\n }\n mergedWidgets.push(...groupMergedWidgets);\n }\n\n return mergedWidgets;\n }\n};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor, LocationContext } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { WidgetTypeIdConfig } from 'libs/shared/constants/WidgetTypeIdConfig';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { WarningOutlineSvg } from 'libs/shared/images/svg/status/WarningOutlineSvg';\nimport { WidgetHelper } from 'libs/shared/utils/WidgetHelper';\n\nimport styles from './widget-header.module.scss';\n\nconst namespace = 'shared.widgetHeader';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface WidgetHeaderProps {\n name: string;\n description?: string | JSX.Element;\n isPreviewing?: boolean;\n content?: any[];\n widgetTypeId?: WidgetTypeId;\n badgeComponent?: JSX.Element;\n\n appLink?: Core.AppLink;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n \n showSeeMoreLink?: boolean;\n onClick?: () => void;\n}\n\nfunction SeeMore(props: WidgetHeaderProps) {\n return (\n <div className={`ms-3 ${styles.seeMore}`}>\n <AppLink\n appLink={props.appLink}\n analyticsData={props.analyticsData }\n analyticsOptions={{\n location: LocationContext.SlidingList,\n ...props.analyticsOptions,\n descriptor: ClickDescriptor.SeeMore\n }}\n className={`text-decoration-none ${props.appLink ? 'curated-widget-link' : ''}`}\n >\n <p className='hover-text-underline text-dark curated-widget-heading'>{getPhrase('seeAll')}</p>\n </AppLink>\n </div>\n );\n}\n\nexport function WidgetHeader(props: WidgetHeaderProps): JSX.Element {\n const hasDescription = !!props.description;\n\n if (!props.name && !props.description)\n return <></>;\n\n const isBelowMinimum = WidgetHelper.isBelowContentMinimum(props.content, props.widgetTypeId);\n const minContent = WidgetTypeIdConfig[props.widgetTypeId]?.minContent ?? 0;\n\n return (\n <div className='curated-widget-header'>\n <div className='d-flex justify-content-between'>\n {!!props.name && (\n <div className='d-flex align-items-center'>\n <AppLink\n appLink={props.appLink}\n analyticsData={props.analyticsData}\n className={`text-decoration-none ${props.appLink ? 'curated-widget-link text-reset' : ''}`}\n onClick={props.onClick}\n >\n <h2 className='h4 curated-widget-heading'>\n {props.isPreviewing && isBelowMinimum && (\n <SvgContainer\n svg={WarningOutlineSvg}\n title={`Widget is below the minimum content threshold of ${minContent} and won't be displayed.`}\n tooltipSpanHack\n tooltipSpanHackClassName='d-inline text-danger me-1'\n />\n )}\n {props.name}\n </h2>\n </AppLink>\n {!!React.isValidElement(props.badgeComponent) && props.badgeComponent}\n </div>\n )}\n {!!props.appLink && !hasDescription && !!props.showSeeMoreLink && <SeeMore {...props}/>}\n </div>\n \n {hasDescription && (\n <div className='d-flex justify-content-between align-items-end'>\n <p className={`description curated-widget-description`}>\n <span>{props.description}</span>\n </p>\n {!!props.appLink && !!props.showSeeMoreLink && <SeeMore {...props}/> }\n </div>\n )}\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { TagType } from 'libs/shared/enums/TagType';\nimport { Tag, ThemeColours } from 'libs/shared/interfaces';\n\nimport { DivButton } from '../div-button/DivButton';\n\nimport styles from './tags.module.scss';\n\nconst namespace = 'shared.tags';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface TagItemProps {\n tag: Tag;\n themeColours?: ThemeColours;\n appLink?: Core.AppLink;\n onClick?: () => void;\n onRemove?: () => void;\n disabled?: boolean;\n tagClass?: string;\n}\n\nfunction getTagTypeClass(tagType: TagType, hasThemeColour: boolean): string {\n switch (tagType) {\n case TagType.Pedagogy:\n case TagType.Skill:\n return 'pedagogy-tag text-white';\n\n case TagType.Hidden:\n return 'hidden-tag fw-normal';\n\n case TagType.Normal:\n if (!hasThemeColour)\n return 'bg-gray-100 fw-normal';\n return '';\n\n default:\n return '';\n }\n}\n\nexport function TagItem(props: TagItemProps): JSX.Element {\n const { tag, appLink, onClick, disabled, tagClass = 'tag' } = props;\n\n const name = tag.name.toLowerCase();\n const tagType = tag.tagType?.toLowerCase() as TagType;\n\n const hasThemeColour = (tagType === TagType.Normal && props.themeColours) && !!props.themeColours?.secondary;\n let classNames = `${styles.badgeBase} rounded-pill py-1 px-2 my-1 me-1 ${tagClass} ${getTagTypeClass(tagType, hasThemeColour)}`;\n let textContainerClass = `text-truncate text-nowrap`;\n\n if (hasThemeColour)\n classNames += ' text-white';\n\n if ((appLink || onClick) && !disabled)\n classNames += ' cursor-pointer';\n\n if (disabled)\n classNames += ' ' + styles.disabled;\n\n if (props.onRemove) {\n classNames += ' ' + styles.removeBadge;\n textContainerClass += ' ' + `${styles.removeBadgeText} d-inline-flex align-items-center lh-1`;\n }\n if (!appLink)\n classNames += ' d-inline-block';\n\n const style: React.CSSProperties = hasThemeColour\n ? { backgroundColor: props.themeColours.secondary }\n : {};\n\n if (appLink) {\n return (\n <AppLink\n onClick={onClick}\n appLink={appLink}\n className={classNames}\n title={name}\n style={style}\n >\n <span className={textContainerClass}>{name}</span>\n </AppLink>\n );\n }\n\n return (\n <button\n onClick={onClick}\n className={classNames}\n title={name}\n style={style}\n aria-label={`${getPhrase('ariaFilter')} ${name}`}\n >\n <span className={textContainerClass}>\n {name}\n {props.onRemove &&\n <DivButton\n onClick={props.onRemove}\n className={`${styles.close} btn-close font-size-normal`}\n role='button'\n aria-label='Close'\n />\n }\n </span>\n </button>\n );\n}"],"names":["CuratedDashboardAppLink","FilterIdNames","FilterBlacklist","FilterWhitelist","acc","prev","SourceFilterOptions","TypeFilterOptions","TopicsConstants","CurationTag","ONBOARDING_PERSONA_KEY","ONBOARDING_USAGE_INTENTION_KEY","ONBOARDING_JOB_TITLE_REDIRECT_KEY","ONBOARDING_VIDEOS_V2","getScopedKey","userId","key","get","value","LocalStorageHelper","scopedKey","set","remove","OnboardingStorageHelper","jobTitle","onboardingPersona","UserHelper","usageIntention","videos","getOnboardingReleaseDate","presentations","customer","initialReleaseDate","tertiaryReleaseDate","fullReleaseDate","p","HardCoded","DateHelper","OnboardingPathwayHelper","options","userSettings","curriculums","preferredPresentation","preferredSubjects","hasPlaylist","appLink","appLinks","masterUser","currentUser","hasPermissions","onboardingContext","currentScreen","onboardingScreenConfigs","OnboardingScreenConfigs","graphDictionary","previous","firstScreenId","screenNumber","progressBarNumber","hasCompletedAllSteps","screenConfig","hasCompletedStep","SettingsHelper","_a","branch","pathway","currentNode","nextScreenId","previousScreenId","currentAppLink","ArrayHelper","currentStepNumber","currentStepProgressBarNumber","_b","totalScreens","totalScreensInProgressBar","progressBarPercentage","overallPercentage","_c","PermissionName","completedScreens","incompleteScreens","screenId","availablePresentations","PresentationLearningLevel","ClassificationNodeType","ClassificationType","TagType","namespace","getPhrase","LanguageService","TopicsHelper","obj","presentationLevel","imageType","presentationName","presentationCount","classification","dashboard","w","targetType","DashboardTargetType","childClassificationCount","presentationId","t","a","b","aPresentation","bPresentation","aLearningLevel","bLearningLevel","ClassificationVideosMap","ClassificationVideosMapJson","SharedOnboardingScreenPredicates","context","InstanceRegion","SettingName","LocationContext","_e","_d","_g","_f","ctx","isKdm","WidgetTemplate","WidgetTypeId","CuratedDashboardHelper","selectedObj","formikProps","data","objectId","newData","id","info","companyId","classificationId","slug","type","split","target","now","from","to","widgetTypeId","templateId","audienceIds","preferredCurriculumId","params","WidgetTypeIdConfig","widgets","systemGeneratedClassificationWidgetTypes","widget","targetInfo","settingsHash","config","partnerProfileWidgetTypeIdPredicate","widgetTemplate","content","template","c","WarningOutlineSvg","props","jsx","WidgetStatus","WidgetHelper","UserAction","EntityType","ClickDescriptor","isPreviewing","preferences","removedItemIds","React","preferencesHash","current","removedItemIdsHash","contentCopy","sortedContent","aIndex","bIndex","item","minContent","status","presentation","metadata","breakpoints","firstItem","MasterTypeHelper","MasterType","items","mergeContent","ObjectHelper","groupedWidgets","mergedWidgets","widgetGroup","currentMergedWidget","groupMergedWidgets","SeeMore","styles","AppLink","WidgetHeader","hasDescription","Fragment","isBelowMinimum","jsxs","SvgContainer","getTagTypeClass","tagType","hasThemeColour","TagItem","tag","onClick","disabled","tagClass","name","classNames","textContainerClass","style","DivButton"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DhNUjn7p.chunk.js","sources":["../../../../libs/shared/src/interfaces/models/curated-widget/CuratedWidget.ts","../../../../libs/shared/src/apps/search/interfaces/SearchFilter.ts","../../../../libs/shared/src/constants/TopicsConstants.ts","../../../../libs/shared/src/enums/CurationTag.ts","../../../../libs/shared/src/apps/onboarding/utils/OnboardingStorageHelper.ts","../../../../libs/shared/src/apps/onboarding/utils/OnboardingPathwayHelper.ts","../../../../libs/shared/src/enums/PresentationLearningLevel.ts","../../../../libs/shared/src/apps/subjects/enums/ClassificationNodeType.ts","../../../../libs/shared/src/enums/ClassificationType.ts","../../../../libs/shared/src/enums/TagType.ts","../../../../libs/shared/src/utils/topics-helper/TopicsHelper.ts","../../../../libs/shared/src/apps/onboarding/constants/ClassificationVideos.ts","../../../../libs/shared/src/apps/onboarding/constants/SharedOnboardingScreenPredicates.ts","../../../../libs/shared/src/apps/onboarding/constants/OnboardingScreenConfigs.ts","../../../../libs/shared/src/enums/WidgetTemplate.ts","../../../../libs/shared/src/enums/WidgetTypeId.ts","../../../../libs/shared/src/utils/DashboardHelper.ts","../../../../libs/shared/src/constants/WidgetTypeIdConfig.ts","../../../../libs/shared/src/images/svg/status/WarningOutlineSvg.tsx","../../../../libs/shared/src/enums/WidgetStatus.ts","../../../../libs/shared/src/utils/WidgetHelper.ts","../../../../libs/shared/src/components/widgets/curated-widgets/components/header/WidgetHeader.tsx","../../../../libs/shared/src/components/tags/TagItem.tsx"],"sourcesContent":["import { HashObject } from 'libs/common/react/interfaces';\n\nimport { AllWidgetTemplateProps } from 'libs/shared/components/widgets/curated-widgets/WidgetProps';\nimport { ButtonIcon } from 'libs/shared/constants/WidgetThemingConstants';\nimport { WidgetStatus } from 'libs/shared/enums/WidgetStatus';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { CuratedObjectsWidgetData, CuratedWidgetContent, CuratedWidgetData } from 'libs/shared/interfaces';\n\nexport enum CuratedDashboardAppLink {\n LatestReleases = 'latest-releases',\n ExploreAllTopics = 'explore-all-topics',\n ClassificationLatestReleases = 'classification-latest-releases',\n ClassificationDirectory = 'classification-directory',\n}\n\nexport enum CuratedWidgetCtaAppLink {\n TopicDirectory = 'topic-directory',\n TopicNewReleases = 'topic-new-releases',\n CuratedTopic = 'curated-topic'\n}\n\nexport interface BaseWidget<TContent extends HashObject = HashObject> {\n index: number;\n templateId: WidgetTemplate;\n widgetId: WidgetTypeId;\n name: string;\n description?: string;\n content?: TContent\n}\n\nexport interface WidgetCta {\n text?: string;\n href?: string;\n icon?: ButtonIcon;\n appLink?: CuratedWidgetCtaAppLink;\n}\n\nexport type WidgetMetadata = AllWidgetTemplateProps['metadata'] & {\n showInTableOfContents: boolean;\n tocIndentation: number;\n headingOptional: boolean;\n aiAddedVideo: boolean;\n};\n\nexport interface WidgetPreference {\n id: string;\n index?: number;\n hidden?: boolean;\n}\n\nexport interface CuratedWidget<\n TData extends CuratedWidgetData = CuratedWidgetData,\n TContent extends CuratedWidgetContent = CuratedWidgetContent\n> extends BaseWidget<TContent> {\n id: string;\n dashboardId: string;\n data: TData;\n status: WidgetStatus;\n metadata?: Partial<WidgetMetadata>;\n preferences?: WidgetPreference[];\n cursor?: string;\n\n // If a widget has curriculum IDs set, then it won't be accessible to anyone who doesn't have one of those curriculums\n curriculumIds?: string[];\n}\n\nexport type CuratedMediaWidget<\n TContent extends CuratedWidgetContent = CuratedWidgetContent\n> = CuratedWidget<CuratedObjectsWidgetData, TContent>;","import { SvgIcon } from 'libs/shared/utils/SvgHelper';\n\nimport { FilterStateHash } from '../reducers';\n\nimport { FilterProps } from './FilterProps';\nimport { SearchIndices } from './SearchResults';\n\nconst FilterIdNames =\n[\n 'sort', // \"sort\" isn't even a filter but it tends to go with our filters in our designs\n 'classification',\n 'presentation',\n 'audience',\n 'yearGroup',\n 'moviesAndTv',\n 'type',\n 'rating',\n 'interactives',\n 'clips',\n 'classroom',\n 'hasResources',\n 'hasSubtitles',\n 'productionYear',\n 'isHd',\n 'producedByClickView',\n 'duration',\n 'tagOrClassification',\n 'status',\n 'isAdmin',\n 'bulkActionType',\n 'userType',\n 'filter',\n 'channel',\n 'dateBroadcast',\n 'categoryId',\n 'hasInteractives',\n 'jobStatus',\n 'source',\n 'customerStatus',\n 'specialEventType',\n 'customerType',\n 'seriesId',\n 'scopeId'\n] as const;\n\n/**\n * Any filters that shouldn't be sent to the backend as a filter\n * and are instead handled differently by the frontend\n */\nconst FilterBlacklist: Partial<Record<FilterIds, boolean>> = {\n type: true\n};\n\nexport type FilterIds = typeof FilterIdNames[number];\n\nexport const FilterWhitelist = FilterIdNames.reduce((acc, prev) => {\n return {\n ...acc,\n [prev]: !FilterBlacklist[prev]\n };\n}, {} as Record<FilterIds, boolean>);\n\nexport type FilterType = 'radio' | 'checkbox' | 'nested-checkbox' | 'grouped-checkbox' | 'switch' | 'more-filters' | 'rating' | 'dropdown' | 'tag' | 'button';\n\nexport interface SearchFilter<TFilterOptionId = string> {\n id: FilterIds;\n type: FilterType;\n compatibleIndices: SearchIndices[];\n\n name?: string;\n icon?: SvgIcon;\n description?: string;\n options?: FilterOption<TFilterOptionId>[];\n labelPrefix?: string;\n\n // For second layer options, for example 'presentation' checkbox filter has 'audience' as second layer option\n secondaryId?: FilterIds;\n\n customComponent?: (props: FilterProps) => JSX.Element;\n disabled?: boolean;\n disableOptions?: (options: FilterOption[], filters: SearchFilter[], state: FilterStateHash) => FilterOption[];\n}\n\nexport interface MoreFilters extends Omit<SearchFilter, 'id' | 'compatibleIndices'> {\n filters: SearchFilter[];\n id: string;\n}\n\nexport interface FilterOption<TId = string> {\n id: TId;\n name: string;\n default?: boolean;\n disabled?: boolean;\n secondLayerSelection?: FilterOption[];\n secondLayerOptions?: FilterOption[];\n group?: string;\n}\n\nexport type ProductionYearFilterOptions =\n 'any-year'\n | 'this-year'\n | 'last-3-years'\n | 'last-5-years';\n\nexport type DurationFilterOptions =\n 'bite-sized'\n | 'short'\n | 'medium'\n | 'long';\n\n\nexport enum SourceFilterOptions {\n MyVideos = 'my-videos',\n School = 'school',\n ExchangeArchive = 'exchange-archive',\n ClickView = 'clickview'\n}\n\nexport enum TypeFilterOptions {\n Video = 'video',\n Series = 'series',\n Playlist = 'playlist',\n Classification = 'classification',\n Clip = 'clip',\n Interactive = 'interactive',\n Company = 'company',\n Category = 'category',\n PartnerProfile = 'partner_profile'\n}","export const TopicsConstants = {\n MULTI_PRESENTATION_THRESHOLD: 2\n};","export enum CurationTag {\n CLICKVIEW_CURATED = 'is_clickview_curated',\n MOVIES_AND_TV = 'is_movies_and_tv',\n STREAMABLE_CURATED = 'is_streamable_learning_curated'\n}","import { LocalStorageHelper } from 'libs/common/backbone/utils/LocalStorageHelper';\n\nimport { PersonaId } from 'libs/shared/apps/onboarding/constants/JobTitlePersonaMapping';\nimport { OnboardingUsageIntention } from 'libs/shared/apps/onboarding/interfaces/OnboardingUsageIntention';\nimport { JobTitles } from 'libs/shared/apps/sign-up/interfaces/JobTitles';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nconst ONBOARDING_PERSONA_KEY = 'onboarding:persona';\nconst ONBOARDING_USAGE_INTENTION_KEY = 'onboarding:usage:intention';\nconst ONBOARDING_JOB_TITLE_REDIRECT_KEY = 'onboarding:had:job:title';\nconst ONBOARDING_VIDEOS_V2 = 'onboarding:videos:v2';\n\nfunction getScopedKey(userId: string, key: string) {\n if (!userId)\n return key;\n\n return `${userId}:${key}`;\n}\n\nfunction get<T>(userId: string, key: string) {\n const value = LocalStorageHelper.get(key);\n const scopedKey = getScopedKey(userId, key);\n\n /**\n * When onboarding was first released, we persisted some state in local storage, but the\n * key was not scoped to the user's ID. This lead to bugs where if a user were to create a\n * new account and go through onboarding a second time, they would see the state from the\n * first account.\n * \n * We've now moved to scoping the keys to prevent this, and this is here to migrate the old\n * keys to the new format.\n */\n if (value !== null) {\n LocalStorageHelper.remove(key);\n LocalStorageHelper.set<T>(scopedKey, value);\n }\n\n return LocalStorageHelper.get<T>(scopedKey);\n}\n\nfunction set<T>(userId: string, key: string, value: T) {\n LocalStorageHelper.set<T>(getScopedKey(userId, key), value);\n}\n\nfunction remove(userId: string, key: string) {\n const value = LocalStorageHelper.get(key);\n\n if (value !== null)\n LocalStorageHelper.remove(key);\n\n LocalStorageHelper.remove(getScopedKey(userId, key));\n}\n\nexport const OnboardingStorageHelper = {\n getPersona(userId: string): PersonaId {\n return get<PersonaId>(userId, ONBOARDING_PERSONA_KEY);\n },\n\n updatePersona(userId: string, jobTitle: JobTitles | ''): void {\n const onboardingPersona = UserHelper.getPersonaFromJobTitle(jobTitle);\n set<PersonaId>(userId, ONBOARDING_PERSONA_KEY, onboardingPersona || 'teacher');\n },\n \n getUsageIntention(userId: string): OnboardingUsageIntention {\n return get<OnboardingUsageIntention>(userId, ONBOARDING_USAGE_INTENTION_KEY);\n },\n\n updateUsageIntention(userId: string, usageIntention: OnboardingUsageIntention): void {\n set<OnboardingUsageIntention>(userId, ONBOARDING_USAGE_INTENTION_KEY, usageIntention);\n },\n\n removeUsageIntention(userId: string): void {\n remove(userId, ONBOARDING_USAGE_INTENTION_KEY);\n },\n\n getJobTitleRedirect(userId: string, jobTitle: JobTitles): boolean {\n if (typeof get(userId, ONBOARDING_JOB_TITLE_REDIRECT_KEY) !== 'boolean')\n set(userId, ONBOARDING_JOB_TITLE_REDIRECT_KEY, !!jobTitle);\n \n return !get(userId, ONBOARDING_JOB_TITLE_REDIRECT_KEY);\n },\n\n getOnboardingVideoSelections<T>(userId: string) {\n return get<T>(userId, ONBOARDING_VIDEOS_V2);\n },\n\n setOnboardingVideoSelections<T>(userId: string, videos: T[]) {\n set<T[]>(userId, ONBOARDING_VIDEOS_V2, videos);\n }\n};","import { Core } from 'libs/common/backbone/index';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { OnboardingContext, OnboardingScreenConfigs } from 'libs/shared/apps/onboarding/constants/OnboardingScreenConfigs';\nimport { OnboardingScreenAppLinks } from 'libs/shared/apps/onboarding/interfaces/OnboardingScreenAppLinks';\nimport { OnboardingScreenId } from 'libs/shared/apps/onboarding/interfaces/OnboardingScreenId';\nimport { JobTitles } from 'libs/shared/apps/sign-up/interfaces/JobTitles';\nimport { HardCoded } from 'libs/shared/constants/HardCoded';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { SettingsLookup } from 'libs/shared/enums/SettingName';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { Classification, CurrentUser, Customer, Presentation, User } from 'libs/shared/interfaces';\nimport { SettingsHelper } from 'libs/shared/utils/SettingsHelper';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport { OnboardingStorageHelper } from './OnboardingStorageHelper';\n\n/**\n * This is a big determining factor for when we want to redirect users to onboarding\n * upon login.\n * \n * Basically, all users who existed before onboarding was released to them should not be\n * automatically redirected to onboarding on login. They should just see the nag widget on\n * the Discover page instead.\n * \n * But, users who joined after onboarding was released for their customer _should_ be redirected\n * after they first activate their account.\n * \n * So, we check the dateCreated on the user to determine this.\n */\nfunction getOnboardingReleaseDate(\n presentations: Presentation[],\n customer: Customer\n): string {\n /**\n * Onboarding was initially released on March 26, 2024 to 10% of our existing customer base,\n * and 100% of new customers created from then on.\n */\n const initialReleaseDate = '2024-03-26';\n\n /**\n * Next, we upgraded all of Tertiary to the new product, and they all received access to the\n * new onboarding.\n */\n const tertiaryReleaseDate = '2024-11-28';\n\n /**\n * Finally, we released onboarding to the rest of our customer base.\n */\n const fullReleaseDate = '2024-12-11';\n\n const hasTertiaryPresentation = presentations.some(p => {\n return (\n p.id.toString() === HardCoded.PresentationIds.AU_TERTIARY.toString() ||\n p.id.toString() === HardCoded.PresentationIds.UK_TERTIARY.toString()\n );\n });\n\n // Tertiary customers created after this date will be redirected to onboarding\n if (hasTertiaryPresentation)\n return tertiaryReleaseDate;\n\n /**\n * Users who are a part of a customer that was created before the initial\n * onboarding release date will be redirected to onboarding only if they\n * were created after the full release date.\n */\n if (DateHelper.isBefore(customer?.dateCreated, initialReleaseDate))\n return fullReleaseDate;\n\n /**\n * Users who were created after the initial release date should be redirected to\n * onboarding.\n */\n return initialReleaseDate;\n}\n\ntype ScreenNode = {\n number?: number;\n progressBarNumber?: number;\n isComplete?: boolean;\n includeInProgressBar: boolean;\n next: OnboardingScreenId | null;\n previous: OnboardingScreenId | null;\n};\n\ntype ScreenNodeDictionary = {\n [key in OnboardingScreenId]?: ScreenNode;\n};\n\nexport interface OnboardingPathway {\n screens: ScreenNodeDictionary;\n currentScreen: OnboardingScreenId;\n totalScreens: number;\n totalScreensInProgressBar: number;\n hasCompletedAllSteps: boolean;\n}\n\ninterface GetPathwayArgs {\n jobTitle: JobTitles;\n userSettings: SettingsLookup;\n presentations: Presentation[];\n curriculums: Presentation[];\n preferredSubjects: Classification[];\n preferredPresentation: Presentation;\n appLink: Core.AppLink;\n appLinks: OnboardingScreenAppLinks;\n hasPermissions: HasPermissionsFunc;\n hasPlaylist: boolean;\n masterUser: User;\n customer: Customer;\n currentUser: CurrentUser;\n}\n\nexport const OnboardingPathwayHelper = {\n getOnboardingPathway(options: GetPathwayArgs): OnboardingPathway {\n const {\n jobTitle,\n userSettings,\n presentations,\n curriculums,\n preferredPresentation,\n preferredSubjects,\n hasPlaylist,\n appLink,\n appLinks,\n masterUser,\n customer,\n currentUser,\n hasPermissions\n } = options;\n \n const onboardingPersona = OnboardingStorageHelper.getPersona(currentUser?.id);\n\n if (!onboardingPersona && jobTitle)\n OnboardingStorageHelper.updatePersona(currentUser?.id, jobTitle);\n\n if (onboardingPersona && onboardingPersona !== UserHelper.getPersonaFromJobTitle(jobTitle))\n OnboardingStorageHelper.updatePersona(currentUser?.id, jobTitle);\n\n const onboardingContext: OnboardingContext = {\n jobTitle,\n hasPlaylist,\n masterUser,\n customer,\n presentations: presentations || [],\n curriculums: curriculums || [],\n preferredPresentation,\n preferredSubjects,\n instanceRegion: currentUser?.instanceRegion,\n hasPermissions,\n userSettings\n };\n\n // Get the current onboarding screen that the user is on\n let currentScreen = OnboardingPathwayHelper.getCurrentScreen(appLink, appLinks);\n\n const onboardingScreenConfigs = Object.values(OnboardingScreenConfigs);\n\n const graphDictionary: ScreenNodeDictionary = {};\n let previous: OnboardingScreenId = null;\n\n let firstScreenId: OnboardingScreenId = null;\n let screenNumber = 0;\n let progressBarNumber = 0;\n let hasCompletedAllSteps = true;\n\n onboardingScreenConfigs.forEach(screenConfig => {\n if (!screenConfig.predicate(onboardingContext))\n return;\n\n if (!firstScreenId)\n firstScreenId = screenConfig.id;\n\n const hasCompletedStep = SettingsHelper.get<boolean>(userSettings, screenConfig.setting);\n\n if (!hasCompletedStep)\n hasCompletedAllSteps = false;\n \n // If the user isn't currently viewing an onboarding screen, set the first incomplete screen as the current screen\n if (!currentScreen && !hasCompletedStep)\n currentScreen = screenConfig.id;\n\n screenNumber++;\n \n graphDictionary[screenConfig.id] = {\n isComplete: hasCompletedStep,\n next: null,\n previous,\n number: screenNumber,\n includeInProgressBar: false\n };\n\n if (screenConfig.includeInProgressBar(onboardingContext)) {\n progressBarNumber++;\n graphDictionary[screenConfig.id].progressBarNumber = progressBarNumber;\n graphDictionary[screenConfig.id].includeInProgressBar = true;\n }\n\n if (screenConfig.branches?.length) {\n screenConfig.branches.forEach(branch => {\n graphDictionary[branch] = {\n next: screenConfig.id,\n previous: screenConfig.id,\n includeInProgressBar: false\n };\n });\n }\n\n if (previous)\n graphDictionary[previous].next = screenConfig.id;\n\n previous = screenConfig.id;\n });\n\n if (!currentScreen && !hasCompletedAllSteps)\n currentScreen = firstScreenId;\n\n return {\n screens: graphDictionary,\n currentScreen,\n totalScreens: screenNumber,\n totalScreensInProgressBar: progressBarNumber,\n hasCompletedAllSteps\n };\n },\n\n getNextAppLink(pathway: OnboardingPathway, appLinks: OnboardingScreenAppLinks): Core.AppLink {\n const currentNode = pathway.screens[pathway.currentScreen];\n const nextScreenId = currentNode?.next;\n\n if (!nextScreenId)\n return null;\n\n return appLinks[nextScreenId];\n },\n\n getPreviousAppLink(pathway: OnboardingPathway, appLinks: OnboardingScreenAppLinks): Core.AppLink {\n const currentNode = pathway.screens[pathway.currentScreen];\n const previousScreenId = currentNode?.previous;\n\n if (!previousScreenId)\n return null;\n\n return appLinks[previousScreenId];\n },\n\n // Get the current screen that the user is on based on the current app route\n getCurrentScreen(currentAppLink: Core.AppLink, appLinks: OnboardingScreenAppLinks): OnboardingScreenId {\n const currentScreen = Object.entries(appLinks).find(([ , appLink ]) => {\n return appLink.action === currentAppLink.action;\n });\n\n if (!currentScreen)\n return null;\n\n return ArrayHelper.first(currentScreen) as keyof OnboardingScreenAppLinks;\n },\n\n getProgress(pathway: OnboardingPathway) {\n const currentStepNumber = pathway.screens[pathway.currentScreen]?.number;\n const currentStepProgressBarNumber = pathway.screens[pathway.currentScreen]?.progressBarNumber;\n const totalScreens = pathway.totalScreens;\n const totalScreensInProgressBar = pathway.totalScreensInProgressBar;\n\n const progressBarPercentage = (currentStepProgressBarNumber / totalScreensInProgressBar) * 100;\n const overallPercentage = ((currentStepNumber - 1) / totalScreens) * 100;\n\n return {\n showProgressBar: pathway.screens[pathway.currentScreen]?.includeInProgressBar,\n currentStepNumber,\n currentStepProgressBarNumber,\n totalScreens,\n totalScreensInProgressBar,\n progressBarPercentage,\n overallPercentage\n };\n },\n\n hasNonBdmTrial(hasPermissions: HasPermissionsFunc): boolean {\n return hasPermissions(PermissionName.ViewTrialUpgrade);\n },\n\n getOnboardingScreenStates(pathway: OnboardingPathway) {\n const completedScreens: OnboardingScreenId[] = [];\n const incompleteScreens: OnboardingScreenId[] = [];\n \n Object.keys(pathway.screens).forEach((screenId: OnboardingScreenId) => {\n if (pathway.screens[screenId].isComplete) {\n completedScreens.push(screenId);\n } else {\n incompleteScreens.push(screenId);\n }\n });\n \n return {\n completedScreens,\n incompleteScreens\n };\n },\n\n shouldRedirectToOnboarding(\n masterUser: User,\n customer: Customer,\n hasPermissions: HasPermissionsFunc,\n availablePresentations: Presentation[]\n ): boolean {\n /**\n * All users created after the release date of onboarding should be redirected into onboarding\n * the first time they open the product\n */\n if (masterUser?.dateCreated >= getOnboardingReleaseDate(availablePresentations, customer))\n return true;\n\n /**\n * If a trial user was created before the onboarding release date, but they don't have a job title,\n * we should redirect them to onboarding as we need to collect their job title.\n */\n if (OnboardingPathwayHelper.hasNonBdmTrial(hasPermissions)) {\n return OnboardingStorageHelper.getJobTitleRedirect(masterUser?.id, masterUser?.userProfile?.metadata?.jobTitle);\n }\n\n return false;\n }\n};","export enum PresentationLearningLevel {\n Level_1 = 1, // Primary/Elementary School\n Level_2 = 2, // Middle School\n Level_3 = 3, // Secondary/High School\n Level_4 = 4 // Tertiary/Post-Secondary\n}\n","export enum ClassificationNodeType {\n Root = 'root'\n}","// Maps to enum in SubjectApi but uses the\n// key rather than the value\nexport enum ClassificationType{\n Subject = 'Subject',\n CurriculumAudience = 'CurriculumAudience',\n CurriculumSubject = 'CurriculumSubject',\n CurriculumArea = 'CurriculumArea',\n CurriculumLeaf = 'CurriculumLeaf',\n CurriculumMetadata = 'CurriculumMetadata'\n}","export enum TagType {\n Normal = 'normal',\n Pedagogy = 'pedagogy',\n Hidden = 'hidden',\n Skill = 'skill',\n Curation = 'curation'\n}\n\n/**\n * This should **only** be used to create new tags in master (as it only accepts enum values).\n * Use the string enum above for all other cases.\n */\nexport enum TagTypeNumber {\n Normal = 0,\n Pedagogy = 1,\n Hidden = 2,\n Skill = 3,\n Curation = 4\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { ClassificationTab } from 'libs/shared/apps/subjects/components/classification-dashboard/classification-tabs/ClassificationTabs';\nimport { ClassificationNodeType } from 'libs/shared/apps/subjects/enums/ClassificationNodeType';\nimport { HardCoded } from 'libs/shared/constants/HardCoded';\nimport { TopicsConstants } from 'libs/shared/constants/TopicsConstants';\nimport { ClassificationType } from 'libs/shared/enums/ClassificationType';\nimport { CurationTag } from 'libs/shared/enums/CurationTag';\nimport { PresentationLearningLevel } from 'libs/shared/enums/PresentationLearningLevel';\nimport { TagType } from 'libs/shared/enums/TagType';\nimport { BaseObject, CuratedDashboard, DashboardTargetType, Presentation } from 'libs/shared/interfaces';\nimport { Classification } from 'libs/shared/interfaces/models/Classification';\n\nconst namespace = 'subjects.utils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface TopicCounts {\n dashboardVideoCount: number;\n childDashboardVideoCount: number;\n\n dashboardResourceCount: number;\n childDashboardResourceCount: number;\n\n dashboardNewVideosCount: number;\n childDashboardNewVideoCount: number;\n childClassificationCount: number;\n}\n\ntype PresentationImageType = 'cover' | 'tall-poster' | 'topic-banner' | 'new-release-banner';\n\nexport const TopicsHelper = {\n isPresentation(obj: BaseObject): obj is Presentation {\n return 'learningLevel' in obj;\n },\n\n isTopicClassification(obj: BaseObject): obj is Classification {\n return obj?.type === ClassificationType.Subject;\n },\n\n getMappedPresentationLevel(presentationLevel: PresentationLearningLevel): string | PresentationLearningLevel {\n // Handle usage of both enum value and its stringified version (online vs. lite)\n return typeof presentationLevel === 'string'\n ? PresentationLearningLevel[presentationLevel]\n : presentationLevel;\n },\n\n getMappedPresentationBackgroundColourClass(presentationLevel: PresentationLearningLevel): string {\n switch (TopicsHelper.getMappedPresentationLevel(presentationLevel)) {\n case PresentationLearningLevel.Level_1:\n return 'bg-indigo';\n\n case PresentationLearningLevel.Level_3:\n return 'bg-blue';\n \n case PresentationLearningLevel.Level_4:\n return 'bg-navy';\n\n default:\n case PresentationLearningLevel.Level_2:\n return 'bg-green';\n }\n },\n\n // TODO: This should maybe live on the presentation metadata at some point instead.\n getMappedPresentationBackgroundColourCode(presentationLevel: PresentationLearningLevel): string {\n switch (TopicsHelper.getMappedPresentationLevel(presentationLevel)) {\n case PresentationLearningLevel.Level_1:\n return '#7A76E8';\n\n case PresentationLearningLevel.Level_3:\n return '#38A2E8';\n\n case PresentationLearningLevel.Level_4:\n return '#1B2D71';\n\n default:\n case PresentationLearningLevel.Level_2:\n return '#5DC786';\n }\n },\n\n getPresentationLevelImage(presentationLevel: PresentationLearningLevel, imageType: PresentationImageType): string {\n switch (TopicsHelper.getMappedPresentationLevel(presentationLevel)) {\n case PresentationLearningLevel.Level_1: {\n if (imageType === 'topic-banner')\n return HardCoded.Images.Level_1.TOPIC_BANNER;\n if (imageType === 'new-release-banner')\n return HardCoded.Images.Level_1.NEW_RELEASES_BANNER;\n if (imageType === 'cover')\n return HardCoded.Images.Level_1.TOPIC_COVER;\n if (imageType === 'tall-poster')\n return HardCoded.Images.Level_1.TOPIC_TALL_POSTER;\n }\n\n case PresentationLearningLevel.Level_2: {\n if (imageType === 'topic-banner')\n return HardCoded.Images.Level_2.TOPIC_BANNER;\n if (imageType === 'new-release-banner')\n return HardCoded.Images.Level_2.NEW_RELEASES_BANNER;\n if (imageType === 'cover')\n return HardCoded.Images.Level_2.TOPIC_COVER;\n if (imageType === 'tall-poster')\n return HardCoded.Images.Level_2.TOPIC_TALL_POSTER;\n }\n\n default:\n case PresentationLearningLevel.Level_3: {\n if (imageType === 'topic-banner')\n return HardCoded.Images.Level_3.TOPIC_BANNER;\n if (imageType === 'new-release-banner')\n return HardCoded.Images.Level_3.NEW_RELEASES_BANNER;\n if (imageType === 'cover')\n return HardCoded.Images.Level_3.TOPIC_COVER;\n if (imageType === 'tall-poster')\n return HardCoded.Images.Level_3.TOPIC_TALL_POSTER;\n }\n\n case PresentationLearningLevel.Level_4: {\n if (imageType === 'topic-banner')\n return HardCoded.Images.Level_4.TOPIC_BANNER;\n\n if (imageType === 'cover')\n return HardCoded.Images.Level_4.TOPIC_COVER;\n }\n }\n },\n\n getExploreAllTopicsTitle(presentationName: string, presentationCount: number): string {\n if (presentationCount < TopicsConstants.MULTI_PRESENTATION_THRESHOLD)\n return getPhrase('exploreAllTopicsHeading');\n\n return getPhrase('exploreAllTopicsDynamicHeading', { presentationName });\n },\n\n getExploreAllTopicsBreadcrumb(presentationName: string, presentationCount: number): string {\n if (presentationCount < TopicsConstants.MULTI_PRESENTATION_THRESHOLD)\n return getPhrase('exploreAllTopicsHeading');\n\n return presentationName;\n },\n\n isFollowing(classification: Classification): boolean {\n return classification?.followers?.data?.length === 1;\n },\n\n isTopLevelTopic(classification: Classification): boolean {\n return !!classification?.parentIds?.includes(ClassificationNodeType.Root);\n },\n\n canHaveVideoListTab(dashboard: CuratedDashboard): boolean {\n return dashboard?.widgets?.some(w => w.metadata?.showInTableOfContents);\n },\n\n getActiveTopicTab(classification: Classification, targetType: DashboardTargetType): ClassificationTab {\n if (TopicsHelper.isTopLevelTopic(classification))\n return targetType === DashboardTargetType.Classification ? 'new-releases' : 'all-topics';\n\n return targetType === DashboardTargetType.Classification ? 'curated-topic' : 'curriculum';\n },\n\n getCounts(classification: Classification): TopicCounts {\n const childClassificationCount = classification?.metadata?.childClassificationCount ?? 0;\n\n if (!classification?.externalMetadata) {\n return {\n childClassificationCount,\n\n dashboardVideoCount: 0,\n childDashboardVideoCount: 0,\n\n dashboardResourceCount: 0,\n childDashboardResourceCount: 0,\n\n dashboardNewVideosCount: 0,\n childDashboardNewVideoCount: 0\n };\n }\n\n return {\n childClassificationCount,\n\n dashboardVideoCount: classification.externalMetadata.dashboardVideoCount || 0,\n childDashboardVideoCount: classification.externalMetadata.childDashboardVideoCount || 0,\n\n dashboardResourceCount: classification.externalMetadata.dashboardResourceCount || 0,\n childDashboardResourceCount: classification.externalMetadata.childDashboardResourceCount || 0,\n\n dashboardNewVideosCount: classification.externalMetadata.dashboardNewVideosCount || 0,\n childDashboardNewVideoCount: classification.externalMetadata.childDashboardNewVideoCount || 0\n };\n },\n\n isTertiary(presentationId: string): boolean {\n return (\n presentationId?.toString() === HardCoded.PresentationIds.AU_TERTIARY.toString() ||\n presentationId?.toString() === HardCoded.PresentationIds.UK_TERTIARY.toString()\n );\n },\n\n isNewZealandTopic(presentationId: string): boolean {\n return (\n presentationId?.toString() === HardCoded.PresentationIds.NZ_PRIMARY.toString() ||\n presentationId?.toString() === HardCoded.PresentationIds.NZ_SECONDARY.toString()\n );\n },\n\n isCanadaTopic(presentationId: string): boolean {\n return (\n presentationId?.toString() === HardCoded.PresentationIds.CA_ELEMENTARY.toString() ||\n presentationId?.toString() === HardCoded.PresentationIds.CA_MIDDLE.toString() ||\n presentationId?.toString() === HardCoded.PresentationIds.CA_HIGH.toString()\n );\n },\n\n isInternationalTopic(presentationId: string): boolean {\n return (\n presentationId?.toString() === HardCoded.PresentationIds.INT_PRIMARY.toString() ||\n presentationId?.toString() === HardCoded.PresentationIds.INT_SECONDARY.toString()\n );\n },\n\n isMtv(classification: Classification): boolean {\n if (!classification?.tags?.data)\n return false;\n\n return classification.tags.data.some(t => t.tagType === TagType.Curation && t.name === CurationTag.MOVIES_AND_TV);\n },\n\n sortByLearningLevel(a: Classification, b: Classification, availablePresentations: Presentation[]): number {\n const aPresentation = availablePresentations.find(p => p?.id.toString() === a?.presentationId?.toString());\n const bPresentation = availablePresentations.find(p => p?.id.toString() === b?.presentationId?.toString());\n const aLearningLevel = PresentationLearningLevel[aPresentation?.learningLevel] as unknown as number; // ts does not play nice\n const bLearningLevel = PresentationLearningLevel[bPresentation?.learningLevel] as unknown as number;\n\n return aLearningLevel - bLearningLevel;\n }\n};","import ClassificationVideosMapJson from 'libs/shared/apps/onboarding/constants/classification-videos.json';\n\ntype Mappings = Record<string, Record<string, { name: string; videoIds: string[] }>>;\nconst ClassificationVideosMap = ClassificationVideosMapJson as Mappings;\n\nexport { ClassificationVideosMap };","import { ClassificationVideosMap } from './ClassificationVideos';\nimport { OnboardingContext } from './OnboardingScreenConfigs';\n\n\nexport const SharedOnboardingScreenPredicates = {\n CreatePlaylist: (context: OnboardingContext) => {\n /**\n * We don't want to prompt a user who has created a playlist in the past\n * to create their \"first\" playlist.\n */\n if (context.hasPlaylist)\n return false;\n\n /**\n * This is a safety check to make sure that we have videos to show the user based on the\n * presentation that they've selected. Just in case we introduce a new presentation and\n * accidentally forget to add hardcoded videos to `ClassificationVideosMap` for it.\n */\n if (context.preferredPresentation && !ClassificationVideosMap[context.preferredPresentation.id])\n return false;\n\n return true;\n }\n};","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { OnboardingScreenId } from 'libs/shared/apps/onboarding/interfaces/OnboardingScreenId';\nimport { OnboardingPathwayHelper } from 'libs/shared/apps/onboarding/utils/OnboardingPathwayHelper';\nimport { JobTitles } from 'libs/shared/apps/sign-up/interfaces/JobTitles';\nimport { InstanceRegion } from 'libs/shared/enums/InstanceRegion';\nimport { PresentationLearningLevel } from 'libs/shared/enums/PresentationLearningLevel';\nimport { SettingName, SettingsLookup } from 'libs/shared/enums/SettingName';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { Classification, Customer, Presentation, User } from 'libs/shared/interfaces';\nimport { TopicsHelper } from 'libs/shared/utils/topics-helper/TopicsHelper';\n\nimport { SharedOnboardingScreenPredicates } from './SharedOnboardingScreenPredicates';\n\nconst namespace = 'onboarding.constants';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface OnboardingContext {\n masterUser?: User;\n customer?: Customer;\n jobTitle?: JobTitles;\n instanceRegion?: InstanceRegion;\n presentations?: Presentation[];\n curriculums?: Presentation[];\n preferredPresentation?: Presentation;\n preferredSubjects?: Classification[];\n hasPlaylist?: boolean;\n hasPermissions?: HasPermissionsFunc;\n userSettings: SettingsLookup;\n}\n\nexport interface OnboardingScreenConfig {\n id: OnboardingScreenId;\n setting: SettingName;\n analyticsLocation: LocationContext;\n includeInProgressBar: (context: OnboardingContext) => boolean;\n predicate: (context: OnboardingContext) => boolean;\n getWidgetHeading: (isKdm: boolean) => string;\n getWidgetDescription: (isKdm: boolean) => string;\n getPageTitle: () => string;\n branches?: OnboardingScreenId[];\n}\n\nexport const OnboardingScreenConfigs: Record<OnboardingScreenId, OnboardingScreenConfig> = {\n /**\n * The welcome video screen plays an introductory video for new users.\n */\n 'welcome-video': {\n id: 'welcome-video',\n getPageTitle: () => getPhrase('welcomeVideoPageTitle'),\n predicate: context => {\n /**\n * Users who will be redirected to onboarding by the onboarding filter will always be\n * new users. This means that they should see the welcome video screen.\n */\n if (!OnboardingPathwayHelper.shouldRedirectToOnboarding(\n context.masterUser,\n context.customer,\n context.hasPermissions,\n context.presentations\n )) {\n return false;\n }\n\n // We currently only have a welcome video for the US.\n return context.instanceRegion === InstanceRegion.US;\n },\n setting: SettingName.HasCompletedOnboardingStepWelcomeVideo,\n analyticsLocation: LocationContext.OnboardingWelcomeVideoScreen,\n includeInProgressBar: () => false,\n getWidgetHeading: () => getPhrase('selectRoleHeading'),\n getWidgetDescription: () => getPhrase('selectRoleMessage')\n },\n\n 'select-role': {\n id: 'select-role',\n getPageTitle: () => getPhrase('selectRolePageTitle'),\n predicate: (context: OnboardingContext) => {\n /**\n * Some trial sign up flows include a step for users to select their job title\n * before they reach onboarding. This is the only circumstance where we won't show\n * this screen to users.\n */\n if (OnboardingPathwayHelper.hasNonBdmTrial(context.hasPermissions)) {\n // Trial users who don't have a job title set must see this screen\n if (!context.jobTitle)\n return true;\n\n /**\n * Trial users who do have a job title will continue seeing this screen if\n * we can determine that they set it during onboarding\n */\n if (context.userSettings?.[SettingName.HasCompletedOnboardingStepSelectRole]?.value)\n return true;\n\n return false;\n }\n \n return true;\n },\n setting: SettingName.HasCompletedOnboardingStepSelectRole,\n analyticsLocation: LocationContext.OnboardingSelectRoleScreen,\n includeInProgressBar: () => true,\n getWidgetHeading: () => getPhrase('selectRoleHeading'),\n getWidgetDescription: () => getPhrase('selectRoleMessage')\n },\n\n 'usage-intention': {\n id: 'usage-intention',\n getPageTitle: () => getPhrase('usageIntentionPageTitle'),\n predicate: () => true,\n setting: SettingName.HasCompletedOnboardingStepUsageIntention,\n analyticsLocation: LocationContext.OnboardingUsageIntentionScreen,\n includeInProgressBar: () => true,\n getWidgetHeading: () => getPhrase('usageIntentionHeading'),\n getWidgetDescription: () => getPhrase('usageIntentionMessage')\n },\n\n 'subjects-summary': {\n id: 'subjects-summary',\n getPageTitle: () => getPhrase('subjectsSummaryPageTitle'),\n predicate: context => {\n /**\n * This screen is exclusively for users who existed before we released onboarding,\n * and selected some subject preferences in the past.\n * It offers them the opportunity to optionally review and update their preferences.\n */\n if (!context.preferredSubjects?.length)\n return false;\n\n /**\n * If a user has completed any of these 3 steps, then they shouldn't be seeing the summary.\n */\n if (\n context.userSettings?.[SettingName.HasCompletedOnboardingStepSubjects]?.value ||\n context.userSettings?.[SettingName.HasCompletedOnboardingStepSelectCurriculum]?.value ||\n context.userSettings?.[SettingName.HasCompletedOnboardingStepSchoolLevel]?.value\n ) {\n return false;\n }\n\n return true;\n },\n setting: SettingName.HasCompletedOnboardingStepSubjectsSummary,\n analyticsLocation: LocationContext.OnboardingSubjectsSummaryScreen,\n includeInProgressBar: () => true,\n getWidgetHeading: () => getPhrase('subjectsHeading'),\n getWidgetDescription: () => getPhrase('subjectsMessage'),\n branches: [ 'school-level', 'subjects', 'select-curriculum' ]\n },\n\n 'school-level': {\n id: 'school-level',\n getPageTitle: () => getPhrase('schoolLevelPageTitle'),\n predicate: context => {\n if (OnboardingScreenConfigs['subjects-summary'].predicate(context))\n return false;\n\n if (context.presentations?.length < 2)\n return false;\n\n const hasTertiary = context.presentations?.some(p => {\n return TopicsHelper.getMappedPresentationLevel(p.learningLevel) === PresentationLearningLevel.Level_4;\n });\n\n if (hasTertiary)\n return false;\n\n return true;\n },\n setting: SettingName.HasCompletedOnboardingStepSchoolLevel,\n analyticsLocation: LocationContext.OnboardingSchoolLevelScreen,\n includeInProgressBar: ctx => !OnboardingScreenConfigs['subjects-summary'].predicate(ctx),\n getWidgetHeading: isKdm => getPhrase(isKdm ? 'schoolLevelHeadingKdm' : 'schoolLevelHeading'),\n getWidgetDescription: isKdm => getPhrase(isKdm ? 'schoolLevelMessageKdm' : 'schoolLevelMessage')\n },\n\n 'select-curriculum': {\n id: 'select-curriculum',\n getPageTitle: () => getPhrase('selectCurriculumPageTitle'),\n predicate: context => {\n if (OnboardingScreenConfigs['subjects-summary'].predicate(context))\n return false;\n\n if (context.curriculums?.length < 2)\n return false;\n\n return true;\n },\n setting: SettingName.HasCompletedOnboardingStepSelectCurriculum,\n analyticsLocation: LocationContext.OnboardingSelectCurriculumScreen,\n includeInProgressBar: ctx => !OnboardingScreenConfigs['subjects-summary'].predicate(ctx),\n getWidgetHeading: () => getPhrase('selectCurriculumHeading'),\n getWidgetDescription: () => getPhrase('selectCurriculumMessage')\n },\n\n 'subjects': {\n id: 'subjects',\n getPageTitle: () => getPhrase('subjectsPageTitle'),\n predicate: context => {\n if (OnboardingScreenConfigs['subjects-summary'].predicate(context))\n return false;\n\n return true;\n },\n setting: SettingName.HasCompletedOnboardingStepSubjects,\n analyticsLocation: LocationContext.OnboardingSubjectsScreen,\n includeInProgressBar: ctx => !OnboardingScreenConfigs['subjects-summary'].predicate(ctx),\n getWidgetHeading: isKdm => getPhrase(isKdm ? 'subjectsHeadingKdm' : 'subjectsHeading'),\n getWidgetDescription: () => getPhrase('subjectsMessage')\n },\n\n 'select-videos': {\n id: 'select-videos',\n getPageTitle: () => getPhrase('selectVideosPageTitle'),\n predicate: SharedOnboardingScreenPredicates.CreatePlaylist,\n setting: SettingName.HasCompletedOnboardingStepSelectVideos,\n analyticsLocation: LocationContext.OnboardingSelectVideosScreen,\n includeInProgressBar: () => true,\n getWidgetHeading: () => getPhrase('selectVideosHeading'),\n getWidgetDescription: isKdm => getPhrase(isKdm ? 'selectVideosMessageKdm' : 'selectVideosMessage')\n },\n\n 'create-playlist': {\n id: 'create-playlist',\n getPageTitle: () => getPhrase('createPlaylistPageTitle'),\n predicate: SharedOnboardingScreenPredicates.CreatePlaylist,\n setting: SettingName.HasCompletedOnboardingStepCreatePlaylist,\n analyticsLocation: LocationContext.OnboardingCreatePlaylistScreen,\n includeInProgressBar: () => true,\n getWidgetHeading: () => getPhrase('createPlaylistHeading'),\n getWidgetDescription: () => getPhrase('createPlaylistMessage')\n }\n};","export enum WidgetTemplate {\n // Videos\n ThumbnailHeroMedia = 'thumbnail_hero_media',\n ThumbnailFeaturedMedia = 'thumbnail_featured_media',\n ThumbnailSlidingListSmall = 'thumbnail_sliding_list_small',\n ThumbnailSlidingListSmallV2 = 'thumbnail_sliding_list_small_v2',\n ThumbnailSlidingListLarge = 'thumbnail_sliding_list_large',\n ThumbnailFixedListMediaSmall = 'thumbnail_fixed_list_media_small',\n ThumbnailFixedListMediaLarge = 'thumbnail_fixed_list_media_large',\n ThumbnailFixedListFolderSmall = 'thumbnail_fixed_list_folder_small',\n ThumbnailVerticalList = 'thumbnail_vertical_list',\n PopoutThumbnailSlidingListLarge = 'popout_thumbnail_sliding_list_large',\n PopoutThumbnailSlidingListSmall = 'popout_thumbnail_sliding_list_small',\n FeaturedThumbnailSlidingList = 'featured_thumbnail_sliding_list',\n ThumbnailFixedListXLarge = 'thumbnail_fixed_list_xlarge',\n\n // Topics\n CoverSlidingPillListSmall = 'cover_sliding_pill_list_small',\n CoverFixedPillListLarge = 'cover_fixed_pill_list_large',\n StatsCoverFixedPillListLarge = 'stats_cover_fixed_pill_list_large',\n CoverFixedPillListXSmall = 'cover_fixed_pill_list_xsmall',\n ThumbnailFixedListLarge = 'thumbnail_fixed_list_large',\n ThumbnailFixedListSmall = 'thumbnail_fixed_list_small',\n EditableCoverFixedPillListSmall = 'editable_cover_fixed_pill_list_small',\n HeroBanner = 'hero_banner',\n HeroThumbnailSmall = 'hero_thumbnail_small',\n HeroBlockColourSmall = 'hero_block_colour_small',\n\n // Curriculum\n CurriculumResourcesAccordion = 'curriculum_resources_accordion',\n CurriculumCodeSearchResults = 'curriculum_code_search_results',\n\n // Playlists\n CoverFixedTileList = 'cover_fixed_tile_list',\n\n // Topics & Series\n PosterSlidingListLarge = 'poster_sliding_list_large',\n PosterSlidingListMedium = 'poster_sliding_list_medium',\n PosterSlidingListSmall = 'poster_sliding_list_small',\n PosterFixedListLarge = 'poster_fixed_list_large',\n\n // Blurbs & Topics\n HeroBannerSmall = 'hero_banner_small',\n\n // Text-based blurbs\n Heading = 'heading',\n AuthorReviewer = 'author_reviewer',\n Question = 'question',\n QuestionAccordion = 'question_accordion',\n\n // Onboarding\n OnboardingSteps = 'onboarding_steps',\n\n // Companies / Studios / Content Partners\n CircleLogoSlidingList = 'circle_logo_sliding_list',\n RectangularLogoSlidingList = 'rectangular_logo_sliding_list',\n RectangularLogoFixedList = 'rectangular_logo_fixed_list',\n ThumbnailFixedListSearchCta = 'thumbnail_fixed_list_search_cta',\n InfiniteThumbnailVerticalList = 'infinite_thumbnail_vertical_list',\n\n // Rating filters\n FilterSlidingPillListSmall = 'filter_sliding_pill_list_small',\n\n // Special events\n EventIconSlidingList = 'event_icon_sliding_list',\n\n // Tags filter\n TagSlidingList = 'tag_sliding_list',\n\n SearchSuggestionsBlurb = 'search_suggestions_blurb'\n}\n","export enum WidgetTypeId {\n // Video group\n CuratedMedia = 'curated_media',\n PlaylistMedia = 'playlist_media',\n SeriesMedia = 'series_media',\n ClassificationMedia = 'classification_media',\n LatestReleasedVideos = 'latest_released_videos',\n ContinueWatching = 'continue_watching_videos',\n CompanyLatestReleasedVideo = 'company_latest_released_video',\n CompanyVideos = 'company_videos',\n ClassificationLatestReleasedVideo = 'classification_latest_released_video',\n ClassificationLatestReleasedVideosV2 = 'classification_latest_released_videos_v2',\n CompanyClassificationVideos = 'company_classification_videos',\n ClassificationDashboardMedia = 'classification_dashboard_media',\n ClassificationDashboardExternalMedia = 'classification_dashboard_external_media',\n SeasonalClassificationMedia = 'seasonal_classification_media',\n TrendingClassificationsMedia = 'trending_classifications_media',\n ClassificationCurriculumMedia = 'classification_curriculum_media',\n\n // Topics group\n CuratedClassifications = 'curated_classifications',\n Classifications = 'classifications',\n ClassificationLatestReleasedVideos = 'classification_latest_released_videos',\n SpecialEventClassifications = 'special_event_classifications',\n LatestReleasedClassifications = 'latest_released_classifications',\n TrendingClassifications = 'trending_classifications',\n\n // Series group\n CuratedSeries = 'curated_series',\n\n // Playlists group\n CuratedPlaylists = 'curated_playlists',\n\n // Blurb group\n Blurb = 'blurb',\n DynamicBlurb = 'dynamic_blurb',\n AuthorReviewer = 'author_reviewer',\n Faq = 'faq',\n\n // Network group\n CuratedCompanies = 'curated_companies',\n\n // Partner Profile group\n CuratedContentPartners = 'curated_content_partners',\n ContentPartnerLatestReleasedVideos = 'content_partner_latest_released_videos',\n ContentPartnerSeries = 'content_partner_series',\n ContentPartnerVideos = 'content_partner_videos',\n SpotlightContentPartners = 'spotlight_curated_content_partners',\n ContentPartners = 'content_partners',\n ContentPartnersHub = 'content_partners_hub',\n TrendingContentPartnersVideo = 'content_partner_trending_videos',\n ContentPartnerAllVideos = 'content_partner_all_videos',\n\n // Search filter group\n Ratings = 'ratings',\n\n // Presentations group\n Presentations = 'presentations',\n\n // Livestreams group\n UpcomingLivestreams = 'upcoming_livestreams',\n\n // Multimedia group\n CuratedMultimedia = 'curated_multimedia',\n\n // Legacy widget types\n ClassificationPlaylists = 'classification_playlists',\n ClassificationSeries = 'classification_series',\n ClassificationFeaturedVideo = 'classification_featured_video',\n ClassificationPinnedVideos = 'classification_pinned_videos',\n\n // Search widget types\n SearchRelevantTopics = 'search_relevant_topics',\n SearchCompanies = 'search_companies',\n SearchTopResults = 'search_top_results',\n SearchSeries = 'search_series',\n SearchPlaylists = 'search_playlists',\n SearchMyVideosFolder = 'search_my_videos_folders',\n SearchMySchoolLibraryFolder = 'search_my_school_library_folders',\n SearchMyVideos = 'search_my_videos',\n SearchMySchoolLibraryVideos = 'search_my_school_library_videos',\n SearchExchangeArchive = 'search_exchange_archive',\n SearchRelatedResults = 'search_related_results',\n SearchTags = 'search_tags',\n SearchCurriculumCode = 'search_curriculum_code',\n SearchSuggestions = 'search_suggestions',\n SearchContentPartners = 'search_content_partners'\n}\n","import { FormikContextType } from 'formik';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { SearchResultObjectTypes } from 'libs/shared/apps/search/interfaces';\nimport { GetCustomParamOptions, WidgetTypeIdConfig } from 'libs/shared/constants/WidgetTypeIdConfig';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { OnlineUserRole } from 'libs/shared/enums/UserRole';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { SettingsHash } from 'libs/shared/hooks/useSettings';\nimport { BaseObject, ClassificationCurriculumInfo, ClassificationDashboardInfo, ClassificationDirectoryInfo, CuratedDashboard, CuratedMediaWidget, CuratedWidget, CuratedWidgetQueryParams, DashboardTargetInfo, DashboardTargetType, PartnerProfileDashboardInfo, UnknownDashboardTargetInfo } from 'libs/shared/interfaces';\n\ninterface LatestReleasesTimeRange {\n from: string;\n to: string;\n}\n\nexport const DashboardHelper = {\n\n /**\n * Same implementation as GetUserGroup() in Online.\n * @param userRole \n */\n getUserGroup(userRole: OnlineUserRole): UserGroup {\n if (userRole === OnlineUserRole.Student)\n return UserGroup.Learner;\n\n return UserGroup.Staff;\n }\n};\n\nexport const CuratedDashboardHelper = {\n onSelectCuratedObject(\n selectedObj: SearchResultObjectTypes | BaseObject,\n formikProps: FormikContextType<CuratedMediaWidget<BaseObject[]>>\n ) {\n const data = {\n ...formikProps.values.data,\n objectIds: ArrayHelper.addOrRemoveImmutable(formikProps.values.data.objectIds || [], selectedObj.id)\n };\n \n formikProps.setFieldValue('data', data);\n \n formikProps.setTouched({\n ...formikProps.touched,\n data: {\n objectIds: true\n }\n });\n },\n\n onRemoveCuratedObject(\n objectId: string,\n formikProps: FormikContextType<CuratedMediaWidget<BaseObject[]>>\n ) {\n const newData = {\n ...formikProps.values.data,\n objectIds: formikProps.values.data.objectIds.filter(id => id !== objectId)\n };\n\n formikProps.setFieldValue('data', newData);\n },\n\n getDashboardTarget(info: DashboardTargetInfo): string {\n if (info.targetType === DashboardTargetType.Discover)\n return `discover:presentation:${info.presentationId}`;\n\n if (info.targetType === DashboardTargetType.Classification)\n return `classification:${info.classificationId}`;\n\n if (info.targetType === DashboardTargetType.ClassificationDirectory)\n return `classification:${info.classificationId}:directory`;\n\n if (info.targetType === DashboardTargetType.ClassificationCurriculum)\n return `classification:${info.classificationId}:curriculum`;\n\n if (info.targetType === DashboardTargetType.MoviesAndTv)\n return `moviesAndTv:presentation:${info.presentationId}`;\n\n if (info.targetType === DashboardTargetType.Company)\n return `company:${info.companyId}:presentation:${info.presentationId}`;\n\n if (info.targetType === DashboardTargetType.PartnerProfile)\n return `partnerprofile:${info.slug}`;\n\n if (info.targetType === DashboardTargetType.DiscoverPartnerProfiles)\n return `discover:partners`;\n\n if (info.targetType === DashboardTargetType.PartnerProfileHub)\n return `discover:partners:hub`;\n\n return null;\n },\n\n getUnknownDashboardTarget(options: UnknownDashboardTargetInfo): string {\n const {\n presentationId,\n companyId,\n targetType,\n classificationId,\n slug\n } = options;\n\n if (targetType === DashboardTargetType.Discover) {\n return CuratedDashboardHelper.getDashboardTarget({\n targetType: DashboardTargetType.Discover,\n presentationId\n });\n }\n \n if (targetType === DashboardTargetType.MoviesAndTv) {\n return CuratedDashboardHelper.getDashboardTarget({\n targetType: DashboardTargetType.MoviesAndTv,\n presentationId\n });\n }\n \n if (targetType === DashboardTargetType.Company) {\n return CuratedDashboardHelper.getDashboardTarget({\n targetType: DashboardTargetType.Company,\n presentationId,\n companyId\n });\n }\n \n if (targetType === DashboardTargetType.Classification) {\n return CuratedDashboardHelper.getDashboardTarget({\n targetType: DashboardTargetType.Classification,\n classificationId\n });\n }\n \n if (targetType === DashboardTargetType.ClassificationDirectory) {\n return CuratedDashboardHelper.getDashboardTarget({\n targetType: DashboardTargetType.ClassificationDirectory,\n classificationId\n });\n }\n \n if (targetType === DashboardTargetType.ClassificationCurriculum) {\n return CuratedDashboardHelper.getDashboardTarget({\n targetType: DashboardTargetType.ClassificationCurriculum,\n classificationId\n });\n }\n\n if (targetType === DashboardTargetType.PartnerProfile) {\n return CuratedDashboardHelper.getDashboardTarget({\n targetType: DashboardTargetType.PartnerProfile,\n slug\n });\n }\n\n if (targetType === DashboardTargetType.DiscoverPartnerProfiles) {\n return CuratedDashboardHelper.getDashboardTarget({\n targetType: DashboardTargetType.DiscoverPartnerProfiles\n });\n }\n\n if (targetType === DashboardTargetType.PartnerProfileHub) {\n return CuratedDashboardHelper.getDashboardTarget({\n targetType: DashboardTargetType.PartnerProfileHub\n });\n }\n },\n\n getDashboardTargetInfo(dashboard: CuratedDashboard): DashboardTargetInfo {\n const type = CuratedDashboardHelper.getDashboardTargetType(dashboard);\n const split = dashboard?.target?.split(':');\n\n if (type === DashboardTargetType.Discover) {\n return {\n targetType: DashboardTargetType.Discover,\n presentationId: split[2]\n };\n }\n\n if (type === DashboardTargetType.Classification) {\n return {\n targetType: DashboardTargetType.Classification,\n classificationId: split[1]\n };\n }\n\n if (type === DashboardTargetType.ClassificationDirectory) {\n return {\n targetType: DashboardTargetType.ClassificationDirectory,\n classificationId: split[1]\n };\n }\n\n if (type === DashboardTargetType.ClassificationCurriculum) {\n return {\n targetType: DashboardTargetType.ClassificationCurriculum,\n classificationId: split[1]\n };\n }\n\n if (type === DashboardTargetType.MoviesAndTv) {\n return {\n targetType: DashboardTargetType.MoviesAndTv,\n presentationId: split[2]\n };\n }\n\n if (type === DashboardTargetType.Company) {\n return {\n targetType: DashboardTargetType.Company,\n companyId: split[1],\n presentationId: split[3]\n };\n }\n\n if (type === DashboardTargetType.PartnerProfile) {\n return {\n targetType: DashboardTargetType.PartnerProfile,\n slug: split[1]\n };\n }\n\n return null;\n },\n\n getDashboardTargetType(dashboard: CuratedDashboard): DashboardTargetType {\n if (!dashboard?.target)\n return null;\n\n if (dashboard.target.startsWith('discover')) {\n if (dashboard.target.endsWith('partners'))\n return DashboardTargetType.DiscoverPartnerProfiles;\n\n if (dashboard.target.endsWith('hub'))\n return DashboardTargetType.PartnerProfileHub;\n\n return DashboardTargetType.Discover;\n }\n\n if (dashboard.target.startsWith('classification')) {\n if (dashboard.target.endsWith('directory'))\n return DashboardTargetType.ClassificationDirectory;\n\n if (dashboard.target.endsWith('curriculum'))\n return DashboardTargetType.ClassificationCurriculum;\n\n return DashboardTargetType.Classification;\n }\n\n if (dashboard.target.startsWith('moviesAndTv'))\n return DashboardTargetType.MoviesAndTv;\n\n if (dashboard.target.startsWith('company')) {\n return DashboardTargetType.Company;\n }\n\n if (dashboard.target.startsWith('partnerprofile'))\n return DashboardTargetType.PartnerProfile;\n\n return null;\n },\n\n isType(dashboard: CuratedDashboard, target: DashboardTargetType): boolean {\n return CuratedDashboardHelper.getDashboardTargetType(dashboard) === target;\n },\n\n isCuratedDashboard(obj: BaseObject): obj is CuratedDashboard {\n const dashboard = obj as CuratedDashboard;\n\n const targetType = CuratedDashboardHelper.getDashboardTargetType(dashboard);\n\n if (targetType === DashboardTargetType.Discover)\n return true;\n\n if (targetType === DashboardTargetType.Classification)\n return true;\n\n if (targetType === DashboardTargetType.ClassificationDirectory)\n return true;\n\n if (targetType === DashboardTargetType.ClassificationCurriculum)\n return true;\n\n if (targetType === DashboardTargetType.MoviesAndTv)\n return true;\n\n if (targetType === DashboardTargetType.Company)\n return true;\n\n return false;\n },\n\n getLatestReleasedTimeRange(): LatestReleasesTimeRange {\n const now = new Date();\n const from = DateHelper.format(DateHelper.endOf(DateHelper.subtract(now, 2, 'month'), 'day'), 'YYYY-MM-DD');\n const to = DateHelper.format(DateHelper.endOf(now, 'day'), 'YYYY-MM-DD');\n return { from, to };\n },\n\n getWidgetParams(\n widgetTypeId: WidgetTypeId,\n templateId: WidgetTemplate,\n target: DashboardTargetType,\n audienceIds?: string | string[],\n preferredCurriculumId?: string,\n options?: GetCustomParamOptions\n ): CuratedWidgetQueryParams {\n const params: CuratedWidgetQueryParams = { };\n\n if (audienceIds)\n params.audienceId = audienceIds;\n\n if (widgetTypeId === WidgetTypeId.ClassificationCurriculumMedia)\n params.curriculumPresentationId = preferredCurriculumId;\n\n return {\n ...params,\n ...WidgetTypeIdConfig[widgetTypeId]?.getCustomParams?.(templateId, target, options)\n };\n },\n\n isSystemGeneratedDashboard(widgets: CuratedWidget[]): boolean {\n const systemGeneratedClassificationWidgetTypes = new Set<WidgetTypeId>([\n WidgetTypeId.ClassificationFeaturedVideo,\n WidgetTypeId.ClassificationPinnedVideos,\n WidgetTypeId.ClassificationPlaylists,\n WidgetTypeId.ClassificationSeries\n ]);\n\n return widgets?.some(widget => systemGeneratedClassificationWidgetTypes.has(widget.widgetId));\n },\n\n isClassificationDashboard(\n targetInfo: DashboardTargetInfo\n ): targetInfo is ClassificationDashboardInfo | ClassificationDirectoryInfo | ClassificationCurriculumInfo {\n return [\n DashboardTargetType.Classification,\n DashboardTargetType.ClassificationDirectory,\n DashboardTargetType.ClassificationCurriculum\n ].includes(targetInfo?.targetType);\n },\n\n isContentPartnerDashboard(targetInfo: DashboardTargetInfo): targetInfo is PartnerProfileDashboardInfo {\n return targetInfo?.targetType === DashboardTargetType.PartnerProfile;\n },\n\n isDirectoryDashboard(\n targetInfo: DashboardTargetInfo\n ): targetInfo is ClassificationDirectoryInfo {\n return targetInfo?.targetType === DashboardTargetType.ClassificationDirectory;\n },\n\n isWidgetTypeEnabled(\n widgetTypeId: WidgetTypeId,\n settingsHash: SettingsHash,\n targetType: DashboardTargetType\n ): boolean {\n const config = WidgetTypeIdConfig[widgetTypeId];\n \n return config?.predicate?.({ settingsHash, targetType }) ?? true;\n }\n};","import { Core } from 'libs/common/backbone/index';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { OnboardingScreenConfigs } from '../apps/onboarding/constants/OnboardingScreenConfigs';\nimport { SourceFilterOptions, TypeFilterOptions } from '../apps/search/interfaces';\nimport { WidgetAppLinks } from '../components/widgets/curated-widgets/WidgetProps';\nimport { SettingName } from '../enums/SettingName';\nimport { WidgetTemplate } from '../enums/WidgetTemplate';\nimport { WidgetTypeId } from '../enums/WidgetTypeId';\nimport { SettingsHash } from '../hooks/useSettings';\nimport { CuratedWidgetContent, CuratedWidgetQueryParams, DashboardTargetType, Series } from '../interfaces';\nimport { CuratedDashboardHelper } from '../utils/DashboardHelper';\n\ninterface WidgetTypeIdPredicateOptions {\n settingsHash: SettingsHash;\n targetType: DashboardTargetType;\n}\n\nexport interface GetCustomParamOptions {\n params?: CuratedWidgetQueryParams;\n}\n\ninterface WidgetTypeIdConfigType {\n getCustomParams: (\n widgetTemplate: WidgetTemplate,\n targetType: DashboardTargetType,\n options?: GetCustomParamOptions\n ) => CuratedWidgetQueryParams;\n minContent?: number;\n getCollectionAppLink?: (appLinks: Partial<WidgetAppLinks>, content?: CuratedWidgetContent) => Core.AppLink;\n /**\n * Predicate used to determine if the widget\n * should be displayed based on the target\n * type and settings. Useful for feature flagging widgets.\n */\n predicate?: (options: WidgetTypeIdPredicateOptions) => boolean;\n}\n\nfunction partnerProfileWidgetTypeIdPredicate(options: WidgetTypeIdPredicateOptions): boolean {\n return options.settingsHash?.hasPartnerProfiles ?? false;\n}\n\nexport const WidgetTypeIdConfig: Record<WidgetTypeId, WidgetTypeIdConfigType> = {\n [WidgetTypeId.CuratedMedia]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.PlaylistMedia]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.SeriesMedia]: {\n getCustomParams: (widgetTemplate: WidgetTemplate) => {\n switch (widgetTemplate) {\n case WidgetTemplate.ThumbnailFixedListMediaLarge:\n return { limit: 2 };\n case WidgetTemplate.ThumbnailHeroMedia:\n case WidgetTemplate.ThumbnailFeaturedMedia:\n return { limit: 1 };\n default:\n return { limit: 12 };\n }\n },\n getCollectionAppLink: (appLinks, content) => appLinks?.series?.(ArrayHelper.first(content) as Series)\n },\n [WidgetTypeId.ClassificationMedia]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.LatestReleasedVideos]: {\n getCustomParams: () => {\n return CuratedDashboardHelper.getLatestReleasedTimeRange();\n }\n },\n [WidgetTypeId.ContinueWatching]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks?.watchHistory?.()\n },\n [WidgetTypeId.CompanyLatestReleasedVideo]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.CompanyVideos]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.ClassificationLatestReleasedVideo]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.ClassificationLatestReleasedVideosV2]: {\n getCustomParams: () => {\n return {\n limit: 12\n };\n },\n minContent: 4\n },\n [WidgetTypeId.SeasonalClassificationMedia]: {\n getCustomParams: () => {\n return {\n limit: 12\n };\n },\n minContent: 4\n },\n [WidgetTypeId.CompanyClassificationVideos]: {\n getCustomParams: () => ({}),\n minContent: 4\n },\n [WidgetTypeId.TrendingClassificationsMedia]: {\n getCustomParams: () => {\n return {\n limit: 12\n };\n },\n minContent: 4\n },\n\n [WidgetTypeId.CuratedClassifications]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.TrendingClassifications]: {\n getCustomParams: () => {\n return {\n limit: 6\n };\n },\n minContent: 3\n },\n [WidgetTypeId.Classifications]: {\n getCustomParams: (template: WidgetTemplate, targetType: DashboardTargetType) => {\n if (targetType === DashboardTargetType.Discover) {\n if (template === WidgetTemplate.EditableCoverFixedPillListSmall) {\n return {\n canBePreferred: true,\n isFollowing: true\n };\n }\n\n if ([ WidgetTemplate.PosterSlidingListSmall, WidgetTemplate.CoverFixedPillListXSmall ].includes(template)) {\n return {\n canBePreferred: true\n };\n }\n }\n\n return {};\n }\n },\n [WidgetTypeId.ClassificationLatestReleasedVideos]: {\n getCustomParams: () => {\n return CuratedDashboardHelper.getLatestReleasedTimeRange();\n }\n },\n [WidgetTypeId.SpecialEventClassifications]: {\n getCustomParams: () => ({\n from: DateHelper.format(new Date(), 'YYYY-MM-DD')\n })\n },\n [WidgetTypeId.LatestReleasedClassifications]: {\n getCustomParams: () => {\n return {\n limit: 6\n };\n },\n minContent: 3\n },\n\n [WidgetTypeId.CuratedSeries]: {\n getCustomParams: () => ({})\n },\n\n [WidgetTypeId.CuratedPlaylists]: {\n getCustomParams: () => ({})\n },\n\n [WidgetTypeId.Blurb]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.DynamicBlurb]: {\n getCustomParams: (templateId: WidgetTemplate) => {\n if (templateId === WidgetTemplate.OnboardingSteps) {\n return {\n customerSetting: [SettingName.HasNewOnboarding],\n userSettings: [\n ...Object.values(OnboardingScreenConfigs).map(c => c.setting),\n SettingName.HasCompletedOnboardingV2,\n SettingName.HasExitedOnboarding\n ]\n };\n }\n\n return {};\n }\n },\n [WidgetTypeId.AuthorReviewer]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.Faq]: {\n getCustomParams: () => ({})\n },\n\n [WidgetTypeId.CuratedCompanies]: {\n getCustomParams: () => ({}),\n predicate: options => {\n if (options.settingsHash?.hasPartnerProfiles)\n return false;\n return true;\n }\n },\n\n [WidgetTypeId.Ratings]: {\n getCustomParams: () => ({})\n },\n\n [WidgetTypeId.Presentations]: {\n getCustomParams: () => ({})\n },\n\n [WidgetTypeId.UpcomingLivestreams]: {\n getCustomParams: () => ({\n from: DateHelper.format(new Date(), 'YYYY-MM-DD')\n })\n },\n\n [WidgetTypeId.CuratedMultimedia]: {\n getCustomParams: () => ({})\n },\n\n [WidgetTypeId.ClassificationPlaylists]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.ClassificationSeries]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.ClassificationFeaturedVideo]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.ClassificationPinnedVideos]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.ClassificationDashboardExternalMedia]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.ClassificationDashboardMedia]: {\n getCustomParams: () => ({})\n },\n\n [WidgetTypeId.SearchRelevantTopics]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchRelevantTopics],\n type: [TypeFilterOptions.Classification]\n })\n },\n [WidgetTypeId.SearchCompanies]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchCompanies],\n type: [TypeFilterOptions.Company]\n }),\n predicate: options => {\n if (options.settingsHash?.hasPartnerProfiles)\n return false;\n return true;\n }\n },\n [WidgetTypeId.SearchSeries]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchSeries],\n type: [TypeFilterOptions.Series]\n })\n },\n [WidgetTypeId.SearchPlaylists]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchPlaylists],\n type: [TypeFilterOptions.Playlist]\n })\n },\n [WidgetTypeId.SearchMyVideosFolder]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchMyVideosFolder],\n source: [SourceFilterOptions.MyVideos]\n })\n },\n [WidgetTypeId.SearchMySchoolLibraryFolder]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchMySchoolLibraryFolder],\n source: [SourceFilterOptions.School]\n })\n },\n [WidgetTypeId.SearchMyVideos]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchMyVideos],\n source: [SourceFilterOptions.MyVideos]\n })\n },\n [WidgetTypeId.SearchMySchoolLibraryVideos]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchMySchoolLibraryVideos],\n source: [SourceFilterOptions.School]\n })\n },\n [WidgetTypeId.SearchExchangeArchive]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchExchangeArchive],\n source: [SourceFilterOptions.ExchangeArchive]\n })\n },\n [WidgetTypeId.SearchRelatedResults]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.SearchTopResults]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.ClassificationCurriculumMedia]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.SearchTags]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.SearchCurriculumCode]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.SearchSuggestions]: {\n getCustomParams: () => ({})\n },\n [WidgetTypeId.SearchContentPartners]: {\n getCustomParams: () => ({}),\n getCollectionAppLink: appLinks => appLinks.searchHome({\n focus: [WidgetTypeId.SearchContentPartners],\n type: [TypeFilterOptions.PartnerProfile]\n }),\n predicate: partnerProfileWidgetTypeIdPredicate\n },\n [WidgetTypeId.CuratedContentPartners]: {\n getCustomParams: () => ({\n limit: 12\n }),\n predicate: partnerProfileWidgetTypeIdPredicate\n },\n [WidgetTypeId.ContentPartnerLatestReleasedVideos]: {\n getCustomParams: () => ({}),\n predicate: partnerProfileWidgetTypeIdPredicate\n },\n [WidgetTypeId.ContentPartnerSeries]: {\n getCustomParams: () => ({}),\n predicate: partnerProfileWidgetTypeIdPredicate\n },\n [WidgetTypeId.ContentPartnerVideos]: {\n getCustomParams: () => ({}),\n predicate: partnerProfileWidgetTypeIdPredicate\n },\n [WidgetTypeId.SpotlightContentPartners]: {\n getCustomParams: () => ({}),\n predicate: partnerProfileWidgetTypeIdPredicate\n },\n [WidgetTypeId.ContentPartners]: {\n getCustomParams: (\n widgetTemplate: WidgetTemplate,\n targetType: DashboardTargetType,\n options?: GetCustomParamOptions\n ) => ({\n letterPrefix: options?.params?.letterPrefix\n }),\n predicate: partnerProfileWidgetTypeIdPredicate\n },\n [WidgetTypeId.ContentPartnersHub]: {\n getCustomParams: (\n widgetTemplate: WidgetTemplate,\n targetType: DashboardTargetType,\n options?: GetCustomParamOptions\n ) => {\n if (targetType !== DashboardTargetType.PartnerProfileHub)\n return {};\n\n return {\n objectId: options?.params?.objectId\n };\n },\n predicate: partnerProfileWidgetTypeIdPredicate\n },\n [WidgetTypeId.TrendingContentPartnersVideo]: {\n getCustomParams: () => ({}),\n predicate: partnerProfileWidgetTypeIdPredicate\n },\n [WidgetTypeId.ContentPartnerAllVideos]: {\n getCustomParams: () => ({}),\n predicate: partnerProfileWidgetTypeIdPredicate\n }\n};","import React from 'react';\n\nexport function WarningOutlineSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n d='m13.026 4.377 8.5 14A1.2 1.2 0 0 1 20.5 20.2h-17a1.2 1.2 0 0 1-1.026-1.823l8.5-14a1.2 1.2 0 0 1 2.052 0M12 5 3.5 19h17zm0 13a1 1 0 1 1 0-2 1 1 0 0 1 0 2m.75-3.677a.69.69 0 0 1-.7.677.69.69 0 0 1-.7-.677V8.677c0-.374.313-.677.7-.677s.7.303.7.677z'\n fill='currentColor'\n />\n </svg>\n );\n}\n","export enum WidgetStatus {\n Draft = 0,\n Published = 1,\n Archived = 2\n}\n\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { WidgetStatus } from 'libs/shared/enums/WidgetStatus';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { Breakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { BaseWidget, CuratedDashboardAppLink, CuratedWidget, CuratedWidgetContent, Playlist, Presentation, Series, Video, VideoTypes, VideoWidgetTemplateContent, WidgetMetadata, WidgetPreference } from 'libs/shared/interfaces';\n\nimport { AnyWidgetTemplateProps } from '../components/widgets/curated-widgets/WidgetProps';\nimport { WidgetTypeIdConfig } from '../constants/WidgetTypeIdConfig';\nimport { MasterType } from '../enums/MasterType';\n\nimport { MasterTypeHelper } from './MasterTypeHelper';\n\nenum WidgetStatusString {\n Draft = 'Draft',\n Published = 'Published',\n Archived = 'Archived'\n}\n\nexport const WidgetHelper = {\n /**\n * Used by both the FixedWidget and DynamicWidget\n */\n getSliderAnalyticsOptions: (): AnalyticsOptions => ({\n actionType: UserAction.Click,\n location: LocationContext.SlidingList,\n entity: EntityType.Widget,\n descriptor: ClickDescriptor.Slide\n }),\n\n /**\n * Used by both the FixedWidget and DynamicWidget\n */\n getSliderItemAnalyticsOptions: (): AnalyticsOptions => ({\n location: LocationContext.SlidingListItem\n }),\n\n getSliderHeadingAnalyticsOptions: (): AnalyticsOptions => ({\n actionType: UserAction.Click,\n location: LocationContext.SlidingList,\n entity: EntityType.Widget,\n descriptor: ClickDescriptor.Title\n }),\n\n useGetContent(\n content: CuratedWidgetContent,\n widgetTypeId: WidgetTypeId,\n isPreviewing: boolean,\n preferences: WidgetPreference[],\n removedItemIds: string[]\n ): { content: CuratedWidgetContent; unfilteredContent: CuratedWidgetContent; } {\n return React.useMemo(() => {\n if (!content)\n return { content: null, unfilteredContent: null };\n\n if (!Array.isArray(content))\n return { content, unfilteredContent: content };\n\n const preferencesHash = preferences?.reduce((acc: HashObject, current) => {\n acc[current.id] = current;\n return acc;\n }, {}) ?? {};\n\n const removedItemIdsHash = removedItemIds.reduce((acc: HashObject, current) => {\n acc[current] = true;\n return acc;\n }, {});\n\n const contentCopy = [...content];\n \n const sortedContent = contentCopy.sort((a, b) => {\n if (!('id' in a) || !('id' in b))\n return 0;\n\n const aIndex = preferencesHash[a.id]?.index ?? contentCopy.findIndex(c => 'id' in c && c.id === a.id);\n const bIndex = preferencesHash[b.id]?.index ?? contentCopy.findIndex(c => 'id' in c && c.id === b.id);\n\n if (aIndex < bIndex)\n return -1;\n\n if (aIndex > bIndex)\n return 1;\n\n return 0;\n });\n\n if (WidgetHelper.isBelowContentMinimum(sortedContent, widgetTypeId) && !isPreviewing) {\n return {\n content: [],\n unfilteredContent: sortedContent\n };\n }\n\n const filteredContent = sortedContent.filter(item => {\n if (preferencesHash['id' in item && item.id]?.hidden)\n return false;\n\n if (removedItemIdsHash['id' in item && item.id])\n return false;\n\n return true;\n });\n\n return {\n content: filteredContent,\n unfilteredContent: sortedContent\n };\n }, [ content, preferences ]);\n },\n\n isBelowContentMinimum(content: CuratedWidgetContent, widgetTypeId: WidgetTypeId): boolean {\n const minContent = WidgetTypeIdConfig[widgetTypeId]?.minContent || 0;\n return content?.length < minContent;\n },\n\n getCustomAppLink(props: AnyWidgetTemplateProps): Core.AppLink | null {\n if (\n !('metadata' in props) ||\n !('appLinks' in props) ||\n !('appLink' in props.metadata)\n ) {\n return null;\n }\n\n if (props.metadata?.appLink === CuratedDashboardAppLink.LatestReleases && 'latestReleases' in props.appLinks)\n return props.appLinks?.latestReleases?.();\n\n if (props.metadata?.appLink === CuratedDashboardAppLink.ExploreAllTopics && 'allTopics' in props.appLinks && 'presentation' in props)\n return props.appLinks?.allTopics?.(props.presentation.id);\n\n return null;\n },\n\n getWidgetStatus(widget: CuratedWidget): WidgetStatus {\n let status = widget.status;\n\n if (typeof (status) === 'string') {\n switch (status) {\n case WidgetStatusString.Archived:\n status = WidgetStatus.Archived;\n break;\n case WidgetStatusString.Published:\n status = WidgetStatus.Published;\n break;\n case WidgetStatusString.Draft:\n status = WidgetStatus.Draft;\n break;\n }\n }\n\n return status;\n },\n\n formatResponseData(widget: CuratedWidget, presentation?: Presentation): CuratedWidget {\n const content = widget.content;\n\n if (!content)\n return widget;\n\n if ('author' in content) {\n widget.content = [content] as CuratedWidgetContent;\n return widget;\n }\n\n if ('data' in content)\n widget.content = content.data as CuratedWidgetContent;\n else if (!Array.isArray(content))\n widget.content = [content]; // Handle `classification_featured_video` widgets, which don't return content as an array\n\n switch (widget.widgetId) {\n case WidgetTypeId.ClassificationSeries:\n widget.content = widget.content.filter((c): c is Series => 'tallPoster' in c && !!c.tallPoster?.id);\n break;\n case WidgetTypeId.ClassificationPlaylists:\n widget.content = widget.content.filter((c): c is Playlist => 'cover' in c && !!c.cover?.id);\n break;\n case WidgetTypeId.ContinueWatching:\n widget.content = widget.content.map(c => 'object' in c && c.object);\n default:\n break;\n case WidgetTypeId.Presentations:\n widget.content = widget.content.filter((c): c is Presentation => 'id' in c && c.id.toString() !== presentation?.id?.toString());\n break;\n }\n\n return widget;\n },\n \n isWidgetInTableOfContents(metadata: Partial<WidgetMetadata>): boolean {\n return !!metadata?.showInTableOfContents;\n },\n\n /**\n * Widget container view won't render a widget with no content typically,\n * but some widgets (such as blurbs) have no content, but should render anyway.\n */\n hasNoContent(widgetTypeId: WidgetTypeId): boolean {\n if (widgetTypeId === WidgetTypeId.Blurb)\n return true;\n\n return false;\n },\n\n /**\n * If any widgets should be hidden on smaller screen sizes, add them here.\n * If this needs to be more flexible at some point, it should be added to\n * the widget settings and metadata object.\n */\n canDisplayOnScreenSize(\n breakpoints: Breakpoints,\n widgetTypeId: WidgetTypeId,\n widgetTemplate: WidgetTemplate\n ): boolean {\n if (widgetTypeId === WidgetTypeId.Blurb && widgetTemplate === WidgetTemplate.HeroBannerSmall)\n return !breakpoints.xs && !breakpoints.sm;\n\n return true;\n },\n\n isCompanyWidget(widgetTypeId: WidgetTypeId): boolean {\n switch (widgetTypeId) {\n case WidgetTypeId.CompanyLatestReleasedVideo:\n case WidgetTypeId.CompanyVideos:\n case WidgetTypeId.UpcomingLivestreams:\n return true;\n default:\n return false;\n }\n },\n\n getVideoContent(content: VideoWidgetTemplateContent): VideoTypes[] {\n const firstItem = ArrayHelper.first<Video | Series>(content);\n\n if (MasterTypeHelper.isType<Series>(firstItem, MasterType.Series))\n return firstItem.videos.data;\n\n return content as VideoTypes[];\n },\n\n showRemoveButton(widgetTypeId: WidgetTypeId): boolean {\n return widgetTypeId === WidgetTypeId.ContinueWatching;\n },\n\n /**\n * Paginated data returns more widgets so if we dont merge the widget content by widget type id,\n * it would add another widget to the page rather than appending content to the relevant\n * search result index\n * \n * For example:\n * Say we receive these widgets for a query:\n * - topics widget\n * - related results widget\n * \n * If a user scrolls down to the end of page we fetch more items from the last widget\n * which in this case is 'related results widget'. \n * Now our overall response looks like this\n * - topics widget\n * - related results widget\n * - related results widget\n * \n * Since this is a new widget item entry it will be rendered as a new widget with seprate headings etc.\n * In this case we want to combine these two widgets data into one so its looks like this again:\n * - topics widget\n * - related results widget (data is combined)\n * \n * But what if widget we get recieve has a different widget template id. This currently happens for\n * the 'series widget' - series widget can have the tall poster template or the thumbnail like template.\n * \n * so to visualize this it can be like:\n * - topics widget\n * - top results widget\n * - series widget (template: tall poster)\n * - series widget (template: thumbnail)\n * \n * Since they technically will look different based on the template id we will not merge the data in this case.\n * It will merge the data to the same widget as long as the combination of widget Id + template Id is the same.\n * \n * Since they are separate widgets they will render duplicate headings - we handle this in css instead which\n * checks for adjacent siblings and if its the same widget - it hides the widget heading so it will look\n * like its a single widget rather than separate widgets.\n * \n * - Nish\n */\n mergeWidgets<T extends BaseWidget>(\n items: T[],\n mergeContent: (target: T, source: T) => void\n ): T[] {\n const widgets = ObjectHelper.deepClone(items);\n const groupedWidgets = ArrayHelper.groupBy(widgets, 'widgetId');\n const mergedWidgets: T[] = [];\n\n for (const widgetGroup of Object.values(groupedWidgets)) {\n let currentMergedWidget: T | null = null;\n const groupMergedWidgets: T[] = [];\n\n for (const widget of widgetGroup) {\n if (!currentMergedWidget) {\n currentMergedWidget = widget;\n continue;\n }\n\n if (widget.templateId !== currentMergedWidget.templateId) {\n groupMergedWidgets.push(currentMergedWidget);\n currentMergedWidget = widget;\n continue;\n }\n\n mergeContent(currentMergedWidget, widget);\n }\n\n if (currentMergedWidget) {\n groupMergedWidgets.push(currentMergedWidget);\n }\n mergedWidgets.push(...groupMergedWidgets);\n }\n\n return mergedWidgets;\n }\n};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor, LocationContext } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { WidgetTypeIdConfig } from 'libs/shared/constants/WidgetTypeIdConfig';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { WarningOutlineSvg } from 'libs/shared/images/svg/status/WarningOutlineSvg';\nimport { WidgetHelper } from 'libs/shared/utils/WidgetHelper';\n\nimport styles from './widget-header.module.scss';\n\nconst namespace = 'shared.widgetHeader';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface WidgetHeaderProps {\n name: string;\n description?: string | JSX.Element;\n isPreviewing?: boolean;\n content?: any[];\n widgetTypeId?: WidgetTypeId;\n badgeComponent?: JSX.Element;\n\n appLink?: Core.AppLink;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n \n showSeeMoreLink?: boolean;\n onClick?: () => void;\n}\n\nfunction SeeMore(props: WidgetHeaderProps) {\n return (\n <div className={`ms-3 ${styles.seeMore}`}>\n <AppLink\n appLink={props.appLink}\n analyticsData={props.analyticsData }\n analyticsOptions={{\n location: LocationContext.SlidingList,\n ...props.analyticsOptions,\n descriptor: ClickDescriptor.SeeMore\n }}\n className={`text-decoration-none ${props.appLink ? 'curated-widget-link' : ''}`}\n >\n <p className='hover-text-underline text-dark curated-widget-heading'>{getPhrase('seeAll')}</p>\n </AppLink>\n </div>\n );\n}\n\nexport function WidgetHeader(props: WidgetHeaderProps): JSX.Element {\n const hasDescription = !!props.description;\n\n if (!props.name && !props.description)\n return <></>;\n\n const isBelowMinimum = WidgetHelper.isBelowContentMinimum(props.content, props.widgetTypeId);\n const minContent = WidgetTypeIdConfig[props.widgetTypeId]?.minContent ?? 0;\n\n return (\n <div className='curated-widget-header'>\n <div className='d-flex justify-content-between'>\n {!!props.name && (\n <div className='d-flex align-items-center'>\n <AppLink\n appLink={props.appLink}\n analyticsData={props.analyticsData}\n className={`text-decoration-none ${props.appLink ? 'curated-widget-link text-reset' : ''}`}\n onClick={props.onClick}\n >\n <h2 className='h4 curated-widget-heading'>\n {props.isPreviewing && isBelowMinimum && (\n <SvgContainer\n svg={WarningOutlineSvg}\n title={`Widget is below the minimum content threshold of ${minContent} and won't be displayed.`}\n tooltipSpanHack\n tooltipSpanHackClassName='d-inline text-danger me-1'\n />\n )}\n {props.name}\n </h2>\n </AppLink>\n {!!React.isValidElement(props.badgeComponent) && props.badgeComponent}\n </div>\n )}\n {!!props.appLink && !hasDescription && !!props.showSeeMoreLink && <SeeMore {...props}/>}\n </div>\n \n {hasDescription && (\n <div className='d-flex justify-content-between align-items-end'>\n <p className={`description curated-widget-description`}>\n <span>{props.description}</span>\n </p>\n {!!props.appLink && !!props.showSeeMoreLink && <SeeMore {...props}/> }\n </div>\n )}\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { TagType } from 'libs/shared/enums/TagType';\nimport { Tag, ThemeColours } from 'libs/shared/interfaces';\n\nimport { DivButton } from '../div-button/DivButton';\n\nimport styles from './tags.module.scss';\n\nconst namespace = 'shared.tags';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface TagItemProps {\n tag: Tag;\n themeColours?: ThemeColours;\n appLink?: Core.AppLink;\n onClick?: () => void;\n onRemove?: () => void;\n disabled?: boolean;\n tagClass?: string;\n}\n\nfunction getTagTypeClass(tagType: TagType, hasThemeColour: boolean): string {\n switch (tagType) {\n case TagType.Pedagogy:\n case TagType.Skill:\n return 'pedagogy-tag text-white';\n\n case TagType.Hidden:\n return 'hidden-tag fw-normal';\n\n case TagType.Normal:\n if (!hasThemeColour)\n return 'bg-gray-100 fw-normal';\n return '';\n\n default:\n return '';\n }\n}\n\nexport function TagItem(props: TagItemProps): JSX.Element {\n const { tag, appLink, onClick, disabled, tagClass = 'tag' } = props;\n\n const name = tag.name.toLowerCase();\n const tagType = tag.tagType?.toLowerCase() as TagType;\n\n const hasThemeColour = (tagType === TagType.Normal && props.themeColours) && !!props.themeColours?.secondary;\n let classNames = `${styles.badgeBase} rounded-pill py-1 px-2 my-1 me-1 ${tagClass} ${getTagTypeClass(tagType, hasThemeColour)}`;\n let textContainerClass = `text-truncate text-nowrap`;\n\n if (hasThemeColour)\n classNames += ' text-white';\n\n if ((appLink || onClick) && !disabled)\n classNames += ' cursor-pointer';\n\n if (disabled)\n classNames += ' ' + styles.disabled;\n\n if (props.onRemove) {\n classNames += ' ' + styles.removeBadge;\n textContainerClass += ' ' + `${styles.removeBadgeText} d-inline-flex align-items-center lh-1`;\n }\n if (!appLink)\n classNames += ' d-inline-block';\n\n const style: React.CSSProperties = hasThemeColour\n ? { backgroundColor: props.themeColours.secondary }\n : {};\n\n if (appLink) {\n return (\n <AppLink\n onClick={onClick}\n appLink={appLink}\n className={classNames}\n title={name}\n style={style}\n >\n <span className={textContainerClass}>{name}</span>\n </AppLink>\n );\n }\n\n return (\n <button\n onClick={onClick}\n className={classNames}\n title={name}\n style={style}\n aria-label={`${getPhrase('ariaFilter')} ${name}`}\n >\n <span className={textContainerClass}>\n {name}\n {props.onRemove &&\n <DivButton\n onClick={props.onRemove}\n className={`${styles.close} btn-close font-size-normal`}\n role='button'\n aria-label='Close'\n />\n }\n </span>\n </button>\n );\n}"],"names":["CuratedDashboardAppLink","FilterIdNames","FilterBlacklist","FilterWhitelist","acc","prev","SourceFilterOptions","TypeFilterOptions","TopicsConstants","CurationTag","ONBOARDING_PERSONA_KEY","ONBOARDING_USAGE_INTENTION_KEY","ONBOARDING_JOB_TITLE_REDIRECT_KEY","ONBOARDING_VIDEOS_V2","getScopedKey","userId","key","get","value","LocalStorageHelper","scopedKey","set","remove","OnboardingStorageHelper","jobTitle","onboardingPersona","UserHelper","usageIntention","videos","getOnboardingReleaseDate","presentations","customer","initialReleaseDate","tertiaryReleaseDate","fullReleaseDate","p","HardCoded","DateHelper","OnboardingPathwayHelper","options","userSettings","curriculums","preferredPresentation","preferredSubjects","hasPlaylist","appLink","appLinks","masterUser","currentUser","hasPermissions","onboardingContext","currentScreen","onboardingScreenConfigs","OnboardingScreenConfigs","graphDictionary","previous","firstScreenId","screenNumber","progressBarNumber","hasCompletedAllSteps","screenConfig","hasCompletedStep","SettingsHelper","_a","branch","pathway","currentNode","nextScreenId","previousScreenId","currentAppLink","ArrayHelper","currentStepNumber","currentStepProgressBarNumber","_b","totalScreens","totalScreensInProgressBar","progressBarPercentage","overallPercentage","_c","PermissionName","completedScreens","incompleteScreens","screenId","availablePresentations","PresentationLearningLevel","ClassificationNodeType","ClassificationType","TagType","namespace","getPhrase","LanguageService","TopicsHelper","obj","presentationLevel","imageType","presentationName","presentationCount","classification","dashboard","w","targetType","DashboardTargetType","childClassificationCount","presentationId","t","a","b","aPresentation","bPresentation","aLearningLevel","bLearningLevel","ClassificationVideosMap","ClassificationVideosMapJson","SharedOnboardingScreenPredicates","context","InstanceRegion","SettingName","LocationContext","_e","_d","_g","_f","ctx","isKdm","WidgetTemplate","WidgetTypeId","CuratedDashboardHelper","selectedObj","formikProps","data","objectId","newData","id","info","companyId","classificationId","slug","type","split","target","now","from","to","widgetTypeId","templateId","audienceIds","preferredCurriculumId","params","WidgetTypeIdConfig","widgets","systemGeneratedClassificationWidgetTypes","widget","targetInfo","settingsHash","config","partnerProfileWidgetTypeIdPredicate","widgetTemplate","content","template","c","WarningOutlineSvg","props","jsx","WidgetStatus","WidgetHelper","UserAction","EntityType","ClickDescriptor","isPreviewing","preferences","removedItemIds","React","preferencesHash","current","removedItemIdsHash","contentCopy","sortedContent","aIndex","bIndex","item","minContent","status","presentation","metadata","breakpoints","firstItem","MasterTypeHelper","MasterType","items","mergeContent","ObjectHelper","groupedWidgets","mergedWidgets","widgetGroup","currentMergedWidget","groupMergedWidgets","SeeMore","styles","AppLink","WidgetHeader","hasDescription","Fragment","isBelowMinimum","jsxs","SvgContainer","getTagTypeClass","tagType","hasThemeColour","TagItem","tag","onClick","disabled","tagClass","name","classNames","textContainerClass","style","DivButton"],"mappings":"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"}
|