@clickview/lite 0.73.1 → 0.74.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. package/dist/bundles.json +2 -2
  2. package/dist/css/{7122-lite-a094f8fe17.chunk.css → 7122-lite-e0652641e4.chunk.css} +1 -1
  3. package/dist/css/{4499-lite-c43d17524f.chunk.css → 7150-lite-60d455ba66.chunk.css} +1 -1
  4. package/dist/css/{lite-app-10d57977f3.css → lite-app-98b3200025.css} +1 -1
  5. package/dist/languages/en.json +1 -1
  6. package/dist/scripts/{1362-061cd588c0-lite.chunk.js → 1362-56810ef4c8-lite.chunk.js} +3 -3
  7. package/dist/scripts/1362-56810ef4c8-lite.chunk.js.map +1 -0
  8. package/dist/scripts/{1367-12750422b0-lite.chunk.js → 1367-e0481edee3-lite.chunk.js} +2 -2
  9. package/dist/scripts/1367-e0481edee3-lite.chunk.js.map +1 -0
  10. package/dist/scripts/{1735-c0f3f1238a-lite.chunk.js → 1735-e4cdbc46ed-lite.chunk.js} +3 -3
  11. package/dist/scripts/1735-e4cdbc46ed-lite.chunk.js.map +1 -0
  12. package/dist/scripts/{324-6d6ee95d5d-lite.chunk.js → 324-e7a99b7d52-lite.chunk.js} +2 -2
  13. package/dist/scripts/{324-6d6ee95d5d-lite.chunk.js.map → 324-e7a99b7d52-lite.chunk.js.map} +1 -1
  14. package/dist/scripts/{3252-22fac3da15-lite.chunk.js → 3252-50b5c19f19-lite.chunk.js} +1 -1
  15. package/dist/scripts/{3252-22fac3da15-lite.chunk.js.map → 3252-50b5c19f19-lite.chunk.js.map} +1 -1
  16. package/dist/scripts/3677-4904f30c6a-lite.chunk.js +2 -0
  17. package/dist/scripts/3677-4904f30c6a-lite.chunk.js.map +1 -0
  18. package/dist/scripts/{3781-7a9ddc7736-lite.chunk.js → 3781-e092f92668-lite.chunk.js} +2 -2
  19. package/dist/scripts/{3781-7a9ddc7736-lite.chunk.js.map → 3781-e092f92668-lite.chunk.js.map} +1 -1
  20. package/dist/scripts/{3823-e38a508a3c-lite.chunk.js → 3823-0dc1972eb2-lite.chunk.js} +2 -2
  21. package/dist/scripts/3823-0dc1972eb2-lite.chunk.js.map +1 -0
  22. package/dist/scripts/3915-abd9a65a08-lite.chunk.js +2 -0
  23. package/dist/scripts/3915-abd9a65a08-lite.chunk.js.map +1 -0
  24. package/dist/scripts/{3978-09fb1f250e-lite.chunk.js → 3978-a551dd2648-lite.chunk.js} +2 -2
  25. package/dist/scripts/3978-a551dd2648-lite.chunk.js.map +1 -0
  26. package/dist/scripts/{4013-d31272b42a-lite.chunk.js → 4013-6f68d7031e-lite.chunk.js} +1 -1
  27. package/dist/scripts/{4013-d31272b42a-lite.chunk.js.map → 4013-6f68d7031e-lite.chunk.js.map} +1 -1
  28. package/dist/scripts/{4014-4225ce1eb6-lite.chunk.js → 4014-3eccce2f89-lite.chunk.js} +3 -3
  29. package/dist/scripts/4014-3eccce2f89-lite.chunk.js.map +1 -0
  30. package/dist/scripts/{4050-cf35c4ec45-lite.chunk.js → 4050-ffe5b6ae6d-lite.chunk.js} +2 -2
  31. package/dist/scripts/{4050-cf35c4ec45-lite.chunk.js.map → 4050-ffe5b6ae6d-lite.chunk.js.map} +1 -1
  32. package/dist/scripts/{4061-525ef00f69-lite.chunk.js → 4061-100002abf6-lite.chunk.js} +2 -2
  33. package/dist/scripts/4061-100002abf6-lite.chunk.js.map +1 -0
  34. package/dist/scripts/4191-9a08c4b205-lite.chunk.js +2 -0
  35. package/dist/scripts/4191-9a08c4b205-lite.chunk.js.map +1 -0
  36. package/dist/scripts/{4358-b21c24f96a-lite.chunk.js → 4358-a1bbca8249-lite.chunk.js} +1 -1
  37. package/dist/scripts/{4358-b21c24f96a-lite.chunk.js.map → 4358-a1bbca8249-lite.chunk.js.map} +1 -1
  38. package/dist/scripts/{4400-8c36fb4ab5-lite.chunk.js → 4400-755a158a52-lite.chunk.js} +2 -2
  39. package/dist/scripts/4400-755a158a52-lite.chunk.js.map +1 -0
  40. package/dist/scripts/4806-13c9302b2c-lite.chunk.js +2 -0
  41. package/dist/scripts/4806-13c9302b2c-lite.chunk.js.map +1 -0
  42. package/dist/scripts/{5135-864055ab0b-lite.chunk.js → 5135-166ec46620-lite.chunk.js} +2 -2
  43. package/dist/scripts/5135-166ec46620-lite.chunk.js.map +1 -0
  44. package/dist/scripts/{5143-286c66de2b-lite.chunk.js → 5143-d6c4a357ea-lite.chunk.js} +2 -2
  45. package/dist/scripts/5143-d6c4a357ea-lite.chunk.js.map +1 -0
  46. package/dist/scripts/{5743-a764171a6d-lite.chunk.js → 5743-14700e4f76-lite.chunk.js} +2 -2
  47. package/dist/scripts/5743-14700e4f76-lite.chunk.js.map +1 -0
  48. package/dist/scripts/{6030-5db8cc1bc4-lite.chunk.js → 6030-c2e07df714-lite.chunk.js} +2 -2
  49. package/dist/scripts/6030-c2e07df714-lite.chunk.js.map +1 -0
  50. package/dist/scripts/{618-4334f9451b-lite.chunk.js → 618-996d8b560b-lite.chunk.js} +2 -2
  51. package/dist/scripts/618-996d8b560b-lite.chunk.js.map +1 -0
  52. package/dist/scripts/{6207-f444184025-lite.chunk.js → 6207-be843186e0-lite.chunk.js} +1 -1
  53. package/dist/scripts/{6207-f444184025-lite.chunk.js.map → 6207-be843186e0-lite.chunk.js.map} +1 -1
  54. package/dist/scripts/{6413-c4333e80d4-lite.chunk.js → 6413-caaae6a383-lite.chunk.js} +3 -3
  55. package/dist/scripts/{6413-c4333e80d4-lite.chunk.js.map → 6413-caaae6a383-lite.chunk.js.map} +1 -1
  56. package/dist/scripts/{6646-24a34f7d99-lite.chunk.js → 6646-c5775f6553-lite.chunk.js} +3 -3
  57. package/dist/scripts/6646-c5775f6553-lite.chunk.js.map +1 -0
  58. package/dist/scripts/{6909-8a45942b63-lite.chunk.js → 6909-6805b6a0d9-lite.chunk.js} +2 -2
  59. package/dist/scripts/6909-6805b6a0d9-lite.chunk.js.map +1 -0
  60. package/dist/scripts/7064-b3bafc599f-lite.chunk.js +2 -0
  61. package/dist/scripts/7064-b3bafc599f-lite.chunk.js.map +1 -0
  62. package/dist/scripts/7122-dbf374af58-lite.chunk.js +2 -0
  63. package/dist/scripts/7122-dbf374af58-lite.chunk.js.map +1 -0
  64. package/dist/scripts/7150-93a205975c-lite.chunk.js +2 -0
  65. package/dist/scripts/7150-93a205975c-lite.chunk.js.map +1 -0
  66. package/dist/scripts/{7234-85d4acaa33-lite.chunk.js → 7234-bcddfe2112-lite.chunk.js} +2 -2
  67. package/dist/scripts/7234-bcddfe2112-lite.chunk.js.map +1 -0
  68. package/dist/scripts/{7383-690bc234f1-lite.chunk.js → 7383-02d4956304-lite.chunk.js} +2 -2
  69. package/dist/scripts/7383-02d4956304-lite.chunk.js.map +1 -0
  70. package/dist/scripts/{7873-2e64f4eb37-lite.chunk.js → 7873-0ce0523a28-lite.chunk.js} +2 -2
  71. package/dist/scripts/{7873-2e64f4eb37-lite.chunk.js.map → 7873-0ce0523a28-lite.chunk.js.map} +1 -1
  72. package/dist/scripts/{8248-050265ed2d-lite.chunk.js → 8248-41dad9bf71-lite.chunk.js} +3 -3
  73. package/dist/scripts/8248-41dad9bf71-lite.chunk.js.map +1 -0
  74. package/dist/scripts/8385-6ef08fa319-lite.chunk.js +2 -0
  75. package/dist/scripts/8385-6ef08fa319-lite.chunk.js.map +1 -0
  76. package/dist/scripts/{8451-1cb649a3f3-lite.chunk.js → 8451-0103210a8f-lite.chunk.js} +2 -2
  77. package/dist/scripts/8451-0103210a8f-lite.chunk.js.map +1 -0
  78. package/dist/scripts/8630-80f676dcda-lite.chunk.js +2 -0
  79. package/dist/scripts/8630-80f676dcda-lite.chunk.js.map +1 -0
  80. package/dist/scripts/8891-5118c47b59-lite.chunk.js +2 -0
  81. package/dist/scripts/8891-5118c47b59-lite.chunk.js.map +1 -0
  82. package/dist/scripts/8982-b9e53e43ec-lite.chunk.js +2 -0
  83. package/dist/scripts/8982-b9e53e43ec-lite.chunk.js.map +1 -0
  84. package/dist/scripts/{9186-daf77d7174-lite.chunk.js → 9186-c1d2615458-lite.chunk.js} +2 -2
  85. package/dist/scripts/9186-c1d2615458-lite.chunk.js.map +1 -0
  86. package/dist/scripts/{9241-dbac9cb9f9-lite.chunk.js → 9241-2386134dd3-lite.chunk.js} +2 -2
  87. package/dist/scripts/9241-2386134dd3-lite.chunk.js.map +1 -0
  88. package/dist/scripts/{9345-30ccf524c5-lite.chunk.js → 9345-0a7f58bb53-lite.chunk.js} +3 -3
  89. package/dist/scripts/9345-0a7f58bb53-lite.chunk.js.map +1 -0
  90. package/dist/scripts/9352-d4b2dc16a8-lite.chunk.js +2 -0
  91. package/dist/scripts/9352-d4b2dc16a8-lite.chunk.js.map +1 -0
  92. package/dist/scripts/{9503-275c13891d-lite.chunk.js → 9503-715c46ecc1-lite.chunk.js} +2 -2
  93. package/dist/scripts/9503-715c46ecc1-lite.chunk.js.map +1 -0
  94. package/dist/scripts/9630-ca2a850260-lite.chunk.js +2 -0
  95. package/dist/scripts/9630-ca2a850260-lite.chunk.js.map +1 -0
  96. package/dist/scripts/{9767-d69fdc31b0-lite.chunk.js → 9767-1b583ceb6c-lite.chunk.js} +2 -2
  97. package/dist/scripts/9767-1b583ceb6c-lite.chunk.js.map +1 -0
  98. package/dist/scripts/9894-7c119a8fe3-lite.chunk.js +2 -0
  99. package/dist/scripts/9894-7c119a8fe3-lite.chunk.js.map +1 -0
  100. package/dist/scripts/bundle-5b65703152.min.js +3 -0
  101. package/dist/scripts/{bundle-0075afb6af.min.js.map → bundle-5b65703152.min.js.map} +1 -1
  102. package/package.json +1 -1
  103. package/dist/scripts/1362-061cd588c0-lite.chunk.js.map +0 -1
  104. package/dist/scripts/1367-12750422b0-lite.chunk.js.map +0 -1
  105. package/dist/scripts/1735-c0f3f1238a-lite.chunk.js.map +0 -1
  106. package/dist/scripts/3677-20958f59d3-lite.chunk.js +0 -2
  107. package/dist/scripts/3677-20958f59d3-lite.chunk.js.map +0 -1
  108. package/dist/scripts/3823-e38a508a3c-lite.chunk.js.map +0 -1
  109. package/dist/scripts/3915-a1f15d687a-lite.chunk.js +0 -2
  110. package/dist/scripts/3915-a1f15d687a-lite.chunk.js.map +0 -1
  111. package/dist/scripts/3978-09fb1f250e-lite.chunk.js.map +0 -1
  112. package/dist/scripts/4014-4225ce1eb6-lite.chunk.js.map +0 -1
  113. package/dist/scripts/4061-525ef00f69-lite.chunk.js.map +0 -1
  114. package/dist/scripts/4191-7612e1713c-lite.chunk.js +0 -2
  115. package/dist/scripts/4191-7612e1713c-lite.chunk.js.map +0 -1
  116. package/dist/scripts/4400-8c36fb4ab5-lite.chunk.js.map +0 -1
  117. package/dist/scripts/4499-1365934bf2-lite.chunk.js +0 -2
  118. package/dist/scripts/4499-1365934bf2-lite.chunk.js.map +0 -1
  119. package/dist/scripts/4806-384760d9c9-lite.chunk.js +0 -2
  120. package/dist/scripts/4806-384760d9c9-lite.chunk.js.map +0 -1
  121. package/dist/scripts/5135-864055ab0b-lite.chunk.js.map +0 -1
  122. package/dist/scripts/5143-286c66de2b-lite.chunk.js.map +0 -1
  123. package/dist/scripts/5743-a764171a6d-lite.chunk.js.map +0 -1
  124. package/dist/scripts/6030-5db8cc1bc4-lite.chunk.js.map +0 -1
  125. package/dist/scripts/618-4334f9451b-lite.chunk.js.map +0 -1
  126. package/dist/scripts/6646-24a34f7d99-lite.chunk.js.map +0 -1
  127. package/dist/scripts/6909-8a45942b63-lite.chunk.js.map +0 -1
  128. package/dist/scripts/7064-3ccf1b82d1-lite.chunk.js +0 -2
  129. package/dist/scripts/7064-3ccf1b82d1-lite.chunk.js.map +0 -1
  130. package/dist/scripts/7122-352fdd3516-lite.chunk.js +0 -2
  131. package/dist/scripts/7122-352fdd3516-lite.chunk.js.map +0 -1
  132. package/dist/scripts/7234-85d4acaa33-lite.chunk.js.map +0 -1
  133. package/dist/scripts/7383-690bc234f1-lite.chunk.js.map +0 -1
  134. package/dist/scripts/8248-050265ed2d-lite.chunk.js.map +0 -1
  135. package/dist/scripts/8385-083e882d77-lite.chunk.js +0 -2
  136. package/dist/scripts/8385-083e882d77-lite.chunk.js.map +0 -1
  137. package/dist/scripts/8451-1cb649a3f3-lite.chunk.js.map +0 -1
  138. package/dist/scripts/8630-0945271ea2-lite.chunk.js +0 -2
  139. package/dist/scripts/8630-0945271ea2-lite.chunk.js.map +0 -1
  140. package/dist/scripts/8891-393bb5bdaf-lite.chunk.js +0 -2
  141. package/dist/scripts/8891-393bb5bdaf-lite.chunk.js.map +0 -1
  142. package/dist/scripts/8982-8c21fab48a-lite.chunk.js +0 -2
  143. package/dist/scripts/8982-8c21fab48a-lite.chunk.js.map +0 -1
  144. package/dist/scripts/9186-daf77d7174-lite.chunk.js.map +0 -1
  145. package/dist/scripts/9241-dbac9cb9f9-lite.chunk.js.map +0 -1
  146. package/dist/scripts/9345-30ccf524c5-lite.chunk.js.map +0 -1
  147. package/dist/scripts/9352-04db4c533d-lite.chunk.js +0 -2
  148. package/dist/scripts/9352-04db4c533d-lite.chunk.js.map +0 -1
  149. package/dist/scripts/9503-275c13891d-lite.chunk.js.map +0 -1
  150. package/dist/scripts/9630-285237c980-lite.chunk.js +0 -2
  151. package/dist/scripts/9630-285237c980-lite.chunk.js.map +0 -1
  152. package/dist/scripts/9767-d69fdc31b0-lite.chunk.js.map +0 -1
  153. package/dist/scripts/9894-10943e41f7-lite.chunk.js +0 -2
  154. package/dist/scripts/9894-10943e41f7-lite.chunk.js.map +0 -1
  155. package/dist/scripts/bundle-0075afb6af.min.js +0 -3
  156. /package/dist/scripts/{1362-061cd588c0-lite.chunk.js.LICENSE.txt → 1362-56810ef4c8-lite.chunk.js.LICENSE.txt} +0 -0
  157. /package/dist/scripts/{1735-c0f3f1238a-lite.chunk.js.LICENSE.txt → 1735-e4cdbc46ed-lite.chunk.js.LICENSE.txt} +0 -0
  158. /package/dist/scripts/{4014-4225ce1eb6-lite.chunk.js.LICENSE.txt → 4014-3eccce2f89-lite.chunk.js.LICENSE.txt} +0 -0
  159. /package/dist/scripts/{4050-cf35c4ec45-lite.chunk.js.LICENSE.txt → 4050-ffe5b6ae6d-lite.chunk.js.LICENSE.txt} +0 -0
  160. /package/dist/scripts/{6413-c4333e80d4-lite.chunk.js.LICENSE.txt → 6413-caaae6a383-lite.chunk.js.LICENSE.txt} +0 -0
  161. /package/dist/scripts/{6646-24a34f7d99-lite.chunk.js.LICENSE.txt → 6646-c5775f6553-lite.chunk.js.LICENSE.txt} +0 -0
  162. /package/dist/scripts/{8248-050265ed2d-lite.chunk.js.LICENSE.txt → 8248-41dad9bf71-lite.chunk.js.LICENSE.txt} +0 -0
  163. /package/dist/scripts/{9345-30ccf524c5-lite.chunk.js.LICENSE.txt → 9345-0a7f58bb53-lite.chunk.js.LICENSE.txt} +0 -0
  164. /package/dist/scripts/{bundle-0075afb6af.min.js.LICENSE.txt → bundle-5b65703152.min.js.LICENSE.txt} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/8248-050265ed2d-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/enums/BulkOnboardingPreferencesState.ts","file:///app/packages/libs/shared/src/apps/subjects/utils/OnboardingHelper.ts","file:///app/packages/libs/shared/src/components/widgets/items/subject-widget-item/CoverPill.tsx","file:///app/packages/projects/lite/src/apps/onboarding/components/left-panel-item/left-panel-item.scss","file:///app/packages/projects/lite/src/apps/onboarding/components/left-panel-item/LeftPanelItem.tsx","file:///app/packages/projects/lite/src/apps/onboarding/components/mock-views/discover/mock-discover.scss","file:///app/packages/projects/lite/src/apps/onboarding/components/mock-views/discover/MockDiscover.tsx","file:///app/packages/projects/lite/src/apps/onboarding/components/mock-views/layout/mock-layout.scss","file:///app/packages/projects/lite/src/apps/onboarding/components/mock-views/layout/MockLayout.tsx","file:///app/packages/projects/lite/src/apps/onboarding/views/subjects/subjects.scss","file:///app/packages/projects/lite/src/apps/onboarding/views/subjects/OnboardingSubjectsView.tsx","file:///app/packages/libs/shared/src/components/widgets/items/subject-widget-item/cover-pill.scss"],"sourcesContent":["export enum BulkOnboardingPreferencesState {\n None = 0,\n AllSubjects = 1,\n AllLevels = 2,\n AllSubjectsAndAllLevels = 3\n}","import { HashObject } from 'libs/common/react/interfaces';\n\nimport { BulkOnboardingPreferencesState } from 'libs/shared/enums/BulkOnboardingPreferencesState';\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { Presentation } from 'libs/shared/interfaces';\n\n/**\n * These are all the valid preference steps in the onboarding worflow\n * Steps are displayed in full workflow order from left to right.\n * \n * Important: Not all customers/users will be required to compelete all steps.\n * \n * School-level = presentation selection for K12\n */\nexport type OnboardingStep = 'welcome' | 'school-level' | 'curriculum' | 'audiences' | 'topics' | 'summary' ;\n\nexport const OnboardingHelper = {\n hasManyPresentationTypes(presentations: Presentation[] = []): HashObject {\n let totalAvailableSubjectPresentations = 0;\n let totalAvailableCurriculumPresentations = 0;\n\n presentations?.forEach(p => {\n if (p.type === PresentationType.Subject)\n totalAvailableSubjectPresentations++;\n\n else if (p.type === PresentationType.Curriculum)\n totalAvailableCurriculumPresentations++;\n });\n\n /**\n * The checks for \"> 1\" are done because we _only_ want to display presentation selectors\n * if the user has more than 1 presentation to select from. If they only have 1 available,\n * then that will always be used by default and they don't have to make any decisions.\n */\n return {\n hasManySubjectPresentations: totalAvailableSubjectPresentations > 1,\n hasManyCurriculumPresentations: totalAvailableCurriculumPresentations > 1\n };\n },\n\n getBulkPreferencesState(state: BulkOnboardingPreferencesState): { [key in 'levels' | 'subjects']: boolean } {\n if (state === BulkOnboardingPreferencesState.AllSubjectsAndAllLevels)\n return {\n levels: true,\n subjects: true\n };\n\n return {\n levels: state === BulkOnboardingPreferencesState.AllLevels,\n subjects: state === BulkOnboardingPreferencesState.AllSubjects\n };\n },\n\n hasBulkSelectedLevels(bulkState: BulkOnboardingPreferencesState): boolean {\n return (\n bulkState === BulkOnboardingPreferencesState.AllLevels ||\n bulkState === BulkOnboardingPreferencesState.AllSubjectsAndAllLevels\n );\n },\n\n hasBulkSelectedTopics(bulkState: BulkOnboardingPreferencesState): boolean {\n return (\n bulkState === BulkOnboardingPreferencesState.AllSubjects ||\n bulkState === BulkOnboardingPreferencesState.AllSubjectsAndAllLevels\n );\n },\n\n getNextBulkState(current: BulkOnboardingPreferencesState, managing: 'topics' | 'audiences'): BulkOnboardingPreferencesState {\n const { None, AllSubjects, AllLevels, AllSubjectsAndAllLevels } = BulkOnboardingPreferencesState;\n\n const isManagingTopics = managing === 'topics';\n\n switch (current) {\n case None:\n default:\n return isManagingTopics ? AllSubjects : AllLevels;\n case AllSubjects:\n return isManagingTopics ? None : AllSubjectsAndAllLevels;\n case AllLevels:\n return isManagingTopics ? AllSubjectsAndAllLevels : None;\n case AllSubjectsAndAllLevels:\n return isManagingTopics ? AllLevels : AllSubjects;\n }\n }\n};\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\nimport { RandomHelper } from 'libs/common/react/utils/RandomHelper';\n\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { IconCircle } from 'libs/shared/components/icon-circle/IconCircle';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { BaseObject, Classification, Presentation } from 'libs/shared/interfaces';\nimport { getBgColorClass } from 'libs/shared/utils/getBgColorClass';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\nimport { MasterTypeHelper } from 'libs/shared/utils/MasterTypeHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './cover-pill.scss';\n\nconst namespace = 'shared.subjectWidgetItem';\n\ninterface NamePanelProps {\n name: string;\n multiline?: boolean;\n subtitle?: string;\n noUnderLine?: boolean;\n newVideosCount?: number;\n}\n\nconst ComingSoonNamePanel = ({ name, multiline, noUnderLine }: NamePanelProps) => {\n let wrapperClassName = `${styles.comingSoonPanel} \n d-flex flex-column align-items-center justify-content-center px-3 text-center`;\n\n let textClassName = '';\n\n if (!multiline) {\n wrapperClassName += ' text-nowrap';\n textClassName += ' text-truncate';\n } else {\n textClassName += ` ${styles.clamped} clamp-2`;\n }\n\n return (\n <div className={wrapperClassName}>\n <small className='text-secondary'><Text namespace={namespace} phrase='comingSoon' /></small>\n <p className={`${noUnderLine ? '' : styles.name} h6`}><span className={textClassName}>{name}</span></p>\n </div>\n );\n};\n\nconst NormalNamePanel = ({ name, multiline, subtitle, noUnderLine, newVideosCount }: NamePanelProps) => {\n let wrapperClassName = 'px-3 d-flex flex-column justify-content-center';\n let textClassName = `${noUnderLine ? '' : styles.name} h6`;\n\n if (!multiline) {\n wrapperClassName += ' text-nowrap text-truncate';\n textClassName += ' text-truncate mb-0';\n } else {\n textClassName += ` ${newVideosCount ? 'clamp-2' : 'clamp-3'} text-start`;\n }\n\n return (\n <div className={wrapperClassName}>\n {subtitle && <div className={`text-secondary clamp-1 ${styles.text}`}>{subtitle}</div>}\n <div className={textClassName} title={name}>{name}</div>\n {!!newVideosCount && (\n <div className={`fw-semibold d-inline-block rounded-pill px-2 mt-1 bg-light-green w-fit h-fit text-green ${styles.newVideos}`}>\n <Text namespace={namespace} phrase='newVideos' options={{ smartCount: newVideosCount }} />\n </div>\n )}\n </div>\n );\n};\n\nexport interface CoverPillWidgetItemProps<T extends BaseObject> {\n data: T;\n getChildAppLink?: (data: T) => Core.AppLink;\n getChildAppLinkOptions?: () => Core.AppLinkOptions;\n isLarge?: boolean;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n availablePresentations?: Presentation[];\n getSubtitle?: (data: T) => string;\n multiline?: boolean;\n // set to true it will highlight on hover and also remove the hover text underline\n highlightOnHover?: boolean;\n showNewVideosCount?: boolean;\n shouldHighlight?: (data: T) => boolean;\n showFallbackBackgroundColour?: boolean;\n}\n\nCoverPillWidgetContent.defaultProps = {\n showFallbackBackgroundColour: true\n};\n\ninterface CoverPillWidgetContentProps<T> extends CoverPillWidgetItemProps<T> {\n coverUrl?: string;\n coverBgColor?: string;\n subtitle?: string;\n isComingSoon?: boolean;\n className?: string;\n imageClassName?: string;\n isSelected?: boolean;\n hideFallback?: boolean;\n hideCheckmark?: boolean;\n themeColor?: string;\n}\n\nexport function CoverPillWidgetContent(props: CoverPillWidgetContentProps<BaseObject>): JSX.Element {\n const coverUrl = ImageHelper.createUrl(props.coverUrl, { size: props.isLarge ? ImageSize.Medium : ImageSize.Small });\n\n let classification: Classification | undefined = undefined;\n if (MasterTypeHelper.isClassification(props.data)) {\n classification = props.data;\n }\n\n const childProps = {\n name: props.data.name,\n multiline: props.isLarge || props.multiline,\n subtitle: props.subtitle,\n noUnderLine: props.highlightOnHover,\n newVideosCount: props.showNewVideosCount ? classification?.externalMetadata?.childDashboardNewVideoCount : 0\n };\n\n const coverStyle: React.CSSProperties = {\n backgroundImage: coverUrl ? `url('${coverUrl}')` : null,\n backgroundColor: props.coverBgColor\n };\n\n const fallbackCoverBgClassName = getBgColorClass(props.data.name, BG_COLOUR_CLASS_NAMES);\n\n return (\n <div\n className={`${props.themeColor ? styles.hasThemeColor : 'border'} d-flex position-relative ${props.className} ${styles.widgetItem} ${props.isSelected ? 'border-success border-2' : ''} ${props.highlightOnHover && !props.themeColor ? 'bg-light-blue-hover' : ''}`}\n style={props.themeColor ? { '--themeColor': props.themeColor } as unknown as React.CSSProperties : {}}\n id={`${props.data.id}-${RandomHelper.getRandomInt()}`}\n >\n {props.isSelected && (\n <div className={`${styles.selectedMask} border-2`} />\n )}\n\n <div className={`${styles.imagePanel} ${props.isLarge ? styles.large : ''}`}>\n {props.isSelected && !props.hideCheckmark && (\n <div className={styles.selected}>\n <IconCircle svgName={cvSvgLibrary.Check} svgSize={SvgContainerSize.Large} textVariant='white' variant='green' />\n </div>\n )}\n\n {coverUrl &&\n <div\n className={classNames(\n styles.image,\n props.imageClassName,\n !props.coverBgColor && props.showFallbackBackgroundColour && fallbackCoverBgClassName\n )}\n style={coverStyle}\n />\n }\n {!props.hideFallback && (\n <ImageFallback\n type={ImageFallbackType.Subject}\n extraClasses={props.isLarge ? styles.large : ''}\n />\n )}\n </div>\n\n {props.isComingSoon\n ? <ComingSoonNamePanel {...childProps} />\n : <NormalNamePanel {...childProps} />\n }\n </div>\n );\n}\n\nexport function CoverPillWidgetContentWrapper(props: CoverPillWidgetContentProps<BaseObject>) {\n const appLink = props.getChildAppLink ? props.getChildAppLink(props.data) : null;\n\n return (\n <>\n {appLink ? (\n <AppLink\n className={styles.appLink}\n appLink={appLink}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n appLinkOptions={props.getChildAppLinkOptions?.()}\n >\n <CoverPillWidgetContent {...props} />\n </AppLink>\n ) : (<CoverPillWidgetContent {...props} />)\n }\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"annotation\":\"LkdHB\",\"above\":\"ROdbm\",\"below\":\"OzyHx\",\"left\":\"W9EBF\",\"right\":\"zhio2\",\"divider\":\"cdR_p\",\"imageContainer\":\"QZZMF\"};","import React from 'react';\n\nimport styles from './left-panel-item.scss';\n\nexport interface LeftPanelItemProps {\n contentPosition?: 'center' | 'right';\n annotationUrl?: string;\n annotationPosition?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n annotationClassName?: string;\n}\n\nLeftPanelItem.defaultProps = {\n contentPosition: 'center'\n};\n\nexport function LeftPanelItem(props: React.PropsWithChildren<LeftPanelItemProps>): JSX.Element {\n function getAnnotationClassName(): string {\n let className = styles.annotation;\n\n switch (props.annotationPosition) {\n case 'top-left': {\n className += ` ${styles.above} ${styles.left}`;\n break;\n }\n\n case 'top-right': {\n className += ` ${styles.above} ${styles.right}`;\n break;\n }\n\n case 'bottom-left': {\n className += ` ${styles.below} ${styles.left}`;\n break;\n }\n\n case 'bottom-right': {\n className += ` ${styles.below} ${styles.right}`;\n break;\n }\n }\n\n if (props.annotationClassName)\n className += ` ${props.annotationClassName}`;\n\n return className;\n }\n\n function getContainerClassName(): string {\n let className = `d-flex align-items-center text-center position-relative w-100 ${styles.imageContainer}`;\n\n if (props.contentPosition === 'center')\n className += ' px-5 justify-content-center';\n\n if (props.contentPosition === 'right')\n className += ' me-n5 justify-content-end';\n\n return className;\n }\n\n return (\n <div className={getContainerClassName()}>\n {!!props.annotationUrl && (\n <div className={getAnnotationClassName()}>\n <img className={`img-fluid`} src={props.annotationUrl} />\n </div>\n )}\n\n {props.children}\n {props.contentPosition === 'right' && (\n <div className={styles.divider} />\n )}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"magicTab\":\"H5jzm\",\"subjectPlaceholder\":\"r1L6T\",\"placeholderCover\":\"z9CFT\",\"promotedTopicPlaceholder\":\"PbYs6\",\"promotedTopicPlaceholderText\":\"hZ8Nf\"};","import React from 'react';\n\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { Classification, Presentation } from 'libs/shared/interfaces';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\n\nimport { MockLayout } from 'apps/onboarding/components/mock-views/layout/MockLayout';\n\nimport styles from './mock-discover.scss';\n\ninterface SubjectPlaceholderProps {\n coverUrl?: string;\n}\n\nfunction SubjectPlaceholder(props: SubjectPlaceholderProps): JSX.Element {\n return (\n <li className='col-4'>\n <div className={`d-flex border rounded-3 overflow-hidden ${styles.subjectPlaceholder}`}>\n {props.coverUrl ? (\n <div className={styles.placeholderCover}>\n <img className='img-fluid' src={ImageHelper.createUrl(props.coverUrl, { size: ImageSize.Small })} />\n </div>\n ) : (\n <div className={`${styles.placeholderCover} bg-light-blue`} />\n )}\n </div>\n </li>\n );\n}\n\nfunction PromotedTopicPlaceholder(): JSX.Element {\n return (\n <li className='col-4'>\n <div className={`bg-light-blue rounded-3 w-100 p-1 ${styles.promotedTopicPlaceholder}`} />\n </li>\n );\n}\n\ninterface MockDiscoverProps {\n subjects?: Classification[];\n presentation?: Presentation;\n curriculum?: Presentation;\n editingCurriculum?: boolean;\n}\n\nexport function MockDiscover(props: MockDiscoverProps): JSX.Element {\n const placeholderSubjects = Math.max(12 - (props.subjects?.length ?? 0), 0);\n\n return (\n <MockLayout\n presentation={props.presentation}\n curriculum={props.curriculum}\n editingCurriculum={props.editingCurriculum}\n >\n <div className='px-3 pt-3 w-100 d-flex flex-column align-items-center'>\n {/* Magic tabs */}\n <div className='rounded-3 border overflow-hidden d-flex mb-2'>\n <div className={`bg-light ${styles.magicTab}`} />\n <div className={`${styles.magicTab}`} />\n </div>\n\n {/* Subjects */}\n <ul className='list-unstyled mb-0 row w-100 g-xl-2 g-lg-1 mb-2'>\n {props.subjects?.map(subject => {\n return (\n <SubjectPlaceholder key={subject.id} coverUrl={subject.cover?.url} />\n );\n })}\n {new Array(placeholderSubjects).fill(0).map((_, index) => {\n return (\n <SubjectPlaceholder key={index} />\n );\n })}\n </ul>\n\n {/* Promoted topics */}\n <ul className='list-unstyled mb-0 row w-100 g-xl-2 g-lg-1'>\n <PromotedTopicPlaceholder />\n <PromotedTopicPlaceholder />\n <PromotedTopicPlaceholder />\n <PromotedTopicPlaceholder />\n <PromotedTopicPlaceholder />\n <PromotedTopicPlaceholder />\n <PromotedTopicPlaceholder />\n <PromotedTopicPlaceholder />\n <PromotedTopicPlaceholder />\n </ul>\n </div>\n </MockLayout>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"dot\":\"AlRQD\",\"logo\":\"L42gR\",\"blackBar\":\"ESCxm\",\"topNav\":\"a3G_4\",\"leftNav\":\"YxGVV\",\"belowHeader\":\"jc_cg\",\"leftNavIcon\":\"U6i6r\",\"leftNavText\":\"LnYlW\",\"presentationPlaceholderIcon\":\"Ljaju\",\"presentationIcon\":\"QdwPq\",\"presentationPlaceholderText\":\"af06V\",\"curriculumIcon\":\"N7T4T\",\"curriculumIconSmall\":\"_6xrUg\",\"curriculumContainer\":\"Z65qX\",\"iconPlaceholder\":\"CKOXL\",\"shadow\":\"zygeJ\",\"presentationName\":\"Oj7Dt\"};","import React from 'react';\n\nimport { IconCircle } from 'libs/shared/components/icon-circle/IconCircle';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { ClickViewLogo, ClickViewPrimaryLogo } from 'libs/shared/components/svgs/clickview-logo/ClickViewLogo';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { PresentationLearningLevel } from 'libs/shared/enums/PresentationLearningLevel';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Presentation } from 'libs/shared/interfaces';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { TopicsHelper } from 'libs/shared/utils/topics-helper/TopicsHelper';\n\nimport styles from './mock-layout.scss';\n\nconst namespace = 'onboarding.mockLayout';\n\nfunction LeftNavItem(): JSX.Element {\n return (\n <div className='d-flex align-items-center justify-content-center mb-2 px-3'>\n <div className={`${styles.leftNavIcon} rounded-circle`} />\n <div className={`${styles.leftNavText} rounded-pill`} />\n </div>\n );\n}\n\ninterface MockLayoutProps {\n editingCurriculum?: boolean;\n curriculum?: Presentation;\n presentation?: Presentation;\n}\n\nexport function MockLayout(props: React.PropsWithChildren<MockLayoutProps>): JSX.Element {\n const breakpoints = useBreakpoints();\n \n function getPresentationClass(): string {\n if (!props.presentation)\n return styles.presentationPlaceholderIcon;\n\n switch (TopicsHelper.getMappedPresentationLevel(props.presentation.learningLevel)) {\n case PresentationLearningLevel.Level_1:\n return `bg-indigo ${styles.presentationIcon}`;\n\n case PresentationLearningLevel.Level_3:\n return `bg-blue ${styles.presentationIcon}`;\n\n default:\n case PresentationLearningLevel.Level_2:\n return `bg-green ${styles.presentationIcon}`;\n }\n }\n\n return (\n <div className={`border border-dark border-2 bg-white rounded-3 user-select-none overflow-hidden position-relative h-100 w-100`}>\n {!!props.editingCurriculum && (\n <div className={`w-100 h-100 position-absolute ${styles.shadow}`}>\n <div className={`d-flex align-items-center h-100 w-50 ${styles.curriculumContainer}`}>\n <div className='bg-white rounded-3 border p-3 w-100'>\n <h2 className='h6 text-start'><Text namespace={namespace} phrase='curriculum' /></h2>\n\n {props.curriculum ? (\n <div className='d-flex align-items-center'>\n <div className={`${styles.curriculumIcon} rounded-circle me-2 border`}>\n <IconCircle\n imageUrl={ImageHelper.createUrl(props.curriculum.cover?.url, { size: ImageSize.Small })}\n />\n </div>\n <div className='text-start'>{props.curriculum.name}</div>\n </div>\n ) : (\n <div className='d-flex align-items-center text-secondary'>\n <div className={`me-2 rounded-circle p-1 ${styles.iconPlaceholder}`}>\n <IconCircle svgSize={SvgContainerSize.Large} textVariant='secondary' svgName={cvSvgLibrary.GraduationCap} />\n </div>\n <Text namespace={namespace} phrase='selectCurriculum' />\n </div>\n )}\n </div>\n </div>\n </div>\n )}\n\n {/* Black bar */}\n <div className={`bg-dark d-flex px-3 py-2 ${styles.blackBar}`}>\n <div className={`rounded-circle me-2 ${styles.dot}`} />\n <div className={`rounded-circle me-2 ${styles.dot}`} />\n <div className={`rounded-circle ${styles.dot}`} />\n </div>\n\n {/* Header */}\n <div className={`border-bottom px-3 py-2 d-flex align-items-center ${styles.topNav}`}>\n <div className={`${styles.logo} me-4`}>\n {breakpoints.xs ? (\n <ClickViewPrimaryLogo />\n ) : (\n <ClickViewLogo />\n )}\n </div>\n <div className='form-control w-75 d-flex justify-content-start'>\n <SvgContainer svgName={cvSvgLibrary.Search} />\n </div>\n {!!props.curriculum && (\n <div className={`${styles.curriculumIconSmall} rounded-circle ms-2 me-n1 border`}>\n <IconCircle imageUrl={props.curriculum.cover?.url} />\n </div>\n )}\n </div>\n\n <div className={`d-flex ${styles.belowHeader}`}>\n {/* Left nav */}\n <div className={`${styles.leftNav} border-end`}>\n <div className='d-flex flex-column pt-3 h-100'>\n <LeftNavItem />\n <LeftNavItem />\n <LeftNavItem />\n <LeftNavItem />\n <LeftNavItem />\n\n {/* Presentation */}\n <div className='d-flex align-items-end h-100 w-100'>\n <div className='border-top p-3 w-100'>\n <div className='d-flex align-items-center'>\n <div className={`${getPresentationClass()} text-white rounded`}>\n <SvgContainer svgName={cvSvgLibrary.School} size={SvgContainerSize.Large} />\n </div>\n\n {!props.presentation ? (\n <div className={`${styles.presentationPlaceholderText} fw-semibold`}>\n <Text namespace={namespace} phrase='schoolLevel' />\n </div>\n ) : (\n <span className={`fw-semibold text-truncate ${styles.presentationName}`}>{props.presentation.name}</span>\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* Main content */}\n <div className={`w-100 h-100 overflow-hidden`}>\n {props.children}\n </div>\n </div>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"selected\":\"igx0Y\",\"disabled\":\"nDUWB\",\"annotation\":\"IN0vA\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { OnboardingDescriptor, UserAction } from 'libs/analytics/interfaces';\n\nimport { ClassificationVideosMap } from 'libs/shared/apps/onboarding/constants/ClassificationVideos';\nimport { OnboardingScreenConfigs } from 'libs/shared/apps/onboarding/constants/OnboardingScreenConfigs';\nimport { useOnboardingPathway } from 'libs/shared/apps/onboarding/hooks/useOnboardingPathway';\nimport { OnboardingHelper } from 'libs/shared/apps/subjects/utils/OnboardingHelper';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { CoverPillWidgetContent } from 'libs/shared/components/widgets/items/subject-widget-item/CoverPill';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { SettingKind } from 'libs/shared/enums/SettingKind';\nimport { SettingName } from 'libs/shared/enums/SettingName';\nimport { PreferenceRequests } from 'libs/shared/flight-requests/PreferenceRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useIsKDM } from 'libs/shared/hooks/UseIsKdm';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Classification, CurrentUser } from 'libs/shared/interfaces';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\nimport { TopicsHelper } from 'libs/shared/utils/topics-helper/TopicsHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { useCurriculums } from 'shared/hooks/useCurriculums';\nimport { usePresentation } from 'shared/hooks/usePresentation';\n\nimport { OnboardingScreenHeading } from 'apps/onboarding/components/heading/OnboardingScreenHeading';\nimport { OnboardingScreenInfo } from 'apps/onboarding/components/info/OnboardingScreenInfo';\nimport { OnboardingLayout } from 'apps/onboarding/components/layout/OnboardingLayout';\nimport { LeftPanelItem } from 'apps/onboarding/components/left-panel-item/LeftPanelItem';\nimport { MockDiscover } from 'apps/onboarding/components/mock-views/discover/MockDiscover';\nimport { useOnboardingCallbacks } from 'apps/onboarding/hooks/useOnboardingCallbacks';\nimport { useOnboardingEventLogger } from 'apps/onboarding/hooks/useOnboardingEventLogger';\nimport { OnboardingViewProps } from 'apps/onboarding/interfaces/OnboardingViewProps';\nimport { getOnboardingAppLinks } from 'apps/onboarding/utils/OnboardingAppLinkHelper';\n\nimport styles from './subjects.scss';\n\nconst namespace = 'onboarding.subjects';\n\nexport function OnboardingSubjectsView(props: OnboardingViewProps): JSX.Element {\n const appLinks = getOnboardingAppLinks();\n const { getPathway } = useOnboardingPathway(appLinks);\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const { preferredPresentation } = usePresentation();\n const fetchAsync = Flight.useGetFetchAsync();\n const {\n onClickBack,\n exitOnboarding,\n onSaveError,\n completeStepAsync\n } = useOnboardingCallbacks(props.redirectUrl);\n const { preferredCurriculum } = useCurriculums();\n const { logEvent } = useOnboardingEventLogger();\n\n const pathway = getPathway();\n const screenConfig = OnboardingScreenConfigs[pathway.currentScreen];\n\n const { updateSettingAsync, bulkOnboardingPreferencesState } = useSettings(screenConfig?.analyticsLocation);\n useSetPageMetadata({ title: screenConfig?.getPageTitle?.() ?? '' });\n\n const subjects = Flight.useBasicFetch<Classification[]>(PreferenceRequests.allSubjectPreferences());\n const initialSelectedSubjects = Flight.useBasicFetch<Classification[]>(PreferenceRequests.mySubjectPreferences());\n const initialBulkState = OnboardingHelper.hasBulkSelectedTopics(bulkOnboardingPreferencesState);\n\n const [ selectedSubjects, setSelectedSubjects ] = React.useState<Classification[]>([]);\n const [ allSubjectsSelected, setAllSubjectsSelected ] = React.useState(initialBulkState);\n\n const isKDM = useIsKDM();\n\n const selectableSubjects = subjects.data?.filter(subject => {\n if (!ClassificationVideosMap[subject.presentationId])\n return true;\n\n return !!ClassificationVideosMap[subject.presentationId]?.[subject.id];\n });\n\n React.useEffect(() => {\n if (!initialSelectedSubjects.hasCompleted || !initialSelectedSubjects.data?.length)\n return;\n\n if (allSubjectsSelected)\n return;\n\n setSelectedSubjects(initialSelectedSubjects.data);\n }, [initialSelectedSubjects.hasCompleted]);\n\n function onSelectSubject(subject: Classification): void {\n if (allSubjectsSelected)\n return;\n\n logEvent(UserAction.Select, OnboardingDescriptor.SelectSubject, {\n subjectId: subject.id,\n subjectName: subject.name,\n presentationId: preferredPresentation.id,\n presentationName: preferredPresentation.name,\n presentationDescription: preferredPresentation.description\n });\n\n if (selectedSubjects.find(s => s.id === subject.id)) {\n setSelectedSubjects(selectedSubjects.filter(s => s.id !== subject.id));\n return;\n }\n\n setSelectedSubjects(selectedSubjects.concat(subject));\n }\n\n function onClickAllSubjects(): void {\n logEvent(UserAction.Select, OnboardingDescriptor.SelectAllSubjects, {\n presentationId: preferredPresentation.id,\n presentationName: preferredPresentation.name,\n presentationDescription: preferredPresentation.description\n });\n\n if (!allSubjectsSelected)\n setSelectedSubjects([]);\n\n setAllSubjectsSelected(!allSubjectsSelected);\n }\n\n async function onClickNext(): Promise<void> {\n logEvent(UserAction.Click, OnboardingDescriptor.Next, {\n subjects: selectedSubjects.map(s => ({\n subjectId: s.id,\n subjectName: s.name\n })),\n allSubjectsSelected,\n presentationId: preferredPresentation.id,\n presentationName: preferredPresentation.name,\n presentationDescription: preferredPresentation.description\n });\n\n try {\n const requests: Promise<void>[] = [];\n\n if (allSubjectsSelected !== initialBulkState) {\n requests.push(\n updateSettingAsync(currentUser.data.id, {\n name: SettingName.BulkOnboardingPreferencesState,\n value: OnboardingHelper.getNextBulkState(bulkOnboardingPreferencesState, 'topics'),\n kind: SettingKind.Permanent\n })\n );\n }\n\n if (!allSubjectsSelected) {\n const addedSubjects = selectedSubjects.filter(selection => {\n return !initialSelectedSubjects.data.find(p => p.id === selection.id);\n });\n const removedSubjects = initialSelectedSubjects.data.filter(p => !selectedSubjects.find(s => s.id === p.id));\n \n if (addedSubjects?.length)\n requests.push(fetchAsync<void>(PreferenceRequests.followSubjects(addedSubjects.map(s => s.id))));\n \n if (removedSubjects?.length)\n requests.push(fetchAsync<void>(PreferenceRequests.unfollowSubjects(removedSubjects.map(s => s.id))));\n }\n\n await Promise.all(requests);\n await completeStepAsync();\n } catch {\n onSaveError();\n return Promise.reject();\n }\n }\n\n return (\n <OnboardingLayout namespace={namespace}>\n <OnboardingLayout.Left className='bg-ultramarine d-flex flex-column align-items-end justify-content-center'>\n <LeftPanelItem\n annotationUrl={ImageUrls.OnboardingV2.Subjects.ANNOTATION}\n annotationPosition='top-right'\n annotationClassName={`me-5 ${styles.annotation}`}\n >\n <MockDiscover\n presentation={preferredPresentation}\n subjects={allSubjectsSelected ? selectableSubjects : selectedSubjects}\n curriculum={preferredCurriculum}\n />\n </LeftPanelItem>\n </OnboardingLayout.Left>\n\n <OnboardingLayout.Right\n hasCustomButtons={false}\n onClickNext={onClickNext}\n onClickBack={onClickBack}\n onClickComeBackLater={exitOnboarding}\n disableNext={!selectedSubjects.length && !allSubjectsSelected}\n >\n <OnboardingScreenHeading>\n <Text phrase={isKDM ? 'headingKdm' : 'heading'} />\n </OnboardingScreenHeading>\n\n <OnboardingScreenInfo>\n <Text phrase='info' />\n </OnboardingScreenInfo>\n\n <DivButton onClick={onClickAllSubjects}>\n <CoverPillWidgetContent\n data={{ name: LanguageService.getPhrase(namespace, 'allSubjects') }}\n coverUrl={TopicsHelper.getPresentationLevelImage(preferredPresentation.learningLevel, 'cover')}\n isSelected={allSubjectsSelected}\n multiline\n />\n </DivButton>\n\n <div className='d-flex align-items-center justify-content-between py-3'>\n <hr className='m-0 flex-grow-1 border-dark' />\n\n <p className='mb-0 px-3'><Text phrase='orSelectSubjects' /></p>\n\n <hr className='m-0 flex-grow-1 border-dark' />\n </div>\n\n <ul className='list-unstyled row g-2 mb-0'>\n {selectableSubjects?.map(subject => {\n const isSelected = !!selectedSubjects.find(s => s.id === subject.id);\n\n let className = '';\n\n if (allSubjectsSelected)\n className += `cursor-default ${styles.disabled}`;\n else if (isSelected)\n className += styles.selected;\n \n return (\n <li key={subject.id} className='col-12 col-sm-6 col-md-6 col-lg-12 col-xl-6'>\n <DivButton\n onClick={() => onSelectSubject(subject)}\n disabled={allSubjectsSelected}\n className={className}\n >\n <CoverPillWidgetContent\n data={subject}\n coverUrl={ImageHelper.createUrl(subject.cover?.url, {\n size: ImageSize.Small\n })}\n isSelected={isSelected}\n multiline\n />\n </DivButton>\n </li>\n );\n })}\n </ul>\n\n <OnboardingScreenInfo className='mt-2'>\n <Text phrase='addMoreLater' />\n </OnboardingScreenInfo>\n </OnboardingLayout.Right>\n </OnboardingLayout>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"appLink\":\"fFjKN\",\"name\":\"A_by9\",\"selectedMask\":\"xSQtR\",\"widgetItem\":\"Ys9W_\",\"hasThemeColor\":\"DX2ua\",\"text\":\"JfAoy\",\"imagePanel\":\"aUNDc\",\"partialLargeImage\":\"RuLxv\",\"selected\":\"BViJb\",\"image\":\"LkTep\",\"dragHandle\":\"CJqvP\",\"large\":\"R5clw\",\"comingSoonPanel\":\"Wa2PG\",\"newVideos\":\"s61h8\",\"editSubjectsItem\":\"gGNFD\",\"allSubjectsItem\":\"IHdlJ\",\"logoContainer\":\"Nzaes\",\"draggingItem\":\"zUOye\",\"partialLargeFallback\":\"FmJP9\",\"partialIcon\":\"sdZuo\"};"],"names":["BulkOnboardingPreferencesState","OnboardingHelper","hasManyPresentationTypes","presentations","totalAvailableSubjectPresentations","totalAvailableCurriculumPresentations","forEach","p","type","PresentationType","hasManySubjectPresentations","hasManyCurriculumPresentations","getBulkPreferencesState","state","AllSubjectsAndAllLevels","levels","subjects","AllLevels","AllSubjects","hasBulkSelectedLevels","bulkState","hasBulkSelectedTopics","getNextBulkState","current","managing","None","isManagingTopics","namespace","ComingSoonNamePanel","name","multiline","noUnderLine","wrapperClassName","textClassName","className","phrase","NormalNamePanel","subtitle","newVideosCount","title","options","smartCount","CoverPillWidgetContent","props","coverUrl","size","isLarge","classification","undefined","data","childProps","highlightOnHover","showNewVideosCount","externalMetadata","childDashboardNewVideoCount","coverStyle","backgroundImage","backgroundColor","coverBgColor","fallbackCoverBgClassName","themeColor","isSelected","style","id","hideCheckmark","svgName","svgSize","S","textVariant","variant","imageClassName","showFallbackBackgroundColour","hideFallback","extraClasses","isComingSoon","CoverPillWidgetContentWrapper","appLink","getChildAppLink","analyticsData","analyticsOptions","appLinkOptions","getChildAppLinkOptions","defaultProps","LeftPanelItem","contentPosition","annotationUrl","annotationPosition","annotationClassName","getAnnotationClassName","src","children","SubjectPlaceholder","ImageHelper","PromotedTopicPlaceholder","MockDiscover","placeholderSubjects","Math","max","length","MockLayout","presentation","curriculum","editingCurriculum","map","subject","key","cover","url","Array","fill","_","index","LeftNavItem","breakpoints","useBreakpoints","Text","IconCircle","imageUrl","SvgContainer","xs","ClickViewLogo","TopicsHelper","learningLevel","PresentationLearningLevel","getPresentationClass","OnboardingSubjectsView","appLinks","getPathway","useOnboardingPathway","currentUser","UserRequests","preferredPresentation","usePresentation","fetchAsync","useOnboardingCallbacks","redirectUrl","onClickBack","exitOnboarding","onSaveError","completeStepAsync","preferredCurriculum","useCurriculums","logEvent","useOnboardingEventLogger","pathway","screenConfig","OnboardingScreenConfigs","currentScreen","useSettings","analyticsLocation","updateSettingAsync","bulkOnboardingPreferencesState","useSetPageMetadata","getPageTitle","PreferenceRequests","initialSelectedSubjects","initialBulkState","selectedSubjects","setSelectedSubjects","allSubjectsSelected","setAllSubjectsSelected","isKDM","selectableSubjects","filter","ClassificationVideos","presentationId","hasCompleted","OnboardingLayout","ImageUrls","hasCustomButtons","onClickNext","s","subjectId","subjectName","presentationName","presentationDescription","description","requests","push","SettingName","value","kind","SettingKind","addedSubjects","selection","find","removedSubjects","Promise","all","reject","onClickComeBackLater","disableNext","OnboardingScreenHeading","OnboardingScreenInfo","DivButton","onClick","CoverPill","LanguageService","concat","onSelectSubject","disabled"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- (self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[8385],{20191:(e,t,n)=>{"use strict";n.r(t),n.d(t,{PreviewPdfView:()=>U});var a=n(32735),r=n(51354),o=n(17327),c=n.n(o),i=n(23481),l=n(97395),u=n(20354),s=n(49985),d=n(65858),m=n(83657),f=n(91693),p=n(9111),v=n(13876),y=n(50023),g=n(83345),h=n(90281),b=n(4594),k=n(1164),w=n(99940),E=n(45157),N={resource:function(e){return{url:"/api/domain/v2/objects/".concat(e),key:"resources:".concat(e)}},publicResource:function(e,t){var n="/api/objects/".concat(e);return t&&(n+="?shareId=".concat(t)),{url:n,key:"resources:".concat(e,":").concat(t)}},videoResources:function(e){return{url:"/api/domain/v2/objects/".concat(e,"/resources?query=customer"),key:"videos:".concat(e,":resources")}},addResource:function(e,t,n,a,r){return{url:"/api/domain/v2/objects/".concat(e,"/resources"),key:"create:resource:".concat(t.fileId||E.Y.getRandomInt()),data:t,type:w.k.POST,invalidationKeys:"videos:".concat(e,":resources"),success:n,error:a,always:r}},updateResource:function(e,t,n,a,r){return{url:"/api/domain/v2/objects/".concat(e),key:"update:resource:".concat(e),data:t,type:w.k.PUT,success:n,error:a,always:r}},deleteResource:function(e,t,n,a,r){return{url:"/api/domain/v2/objects/".concat(e),key:"delete:resource:".concat(e),type:w.k.DELETE,invalidationKeys:"videos:".concat(t,":resources"),success:n,error:a,always:r}}},I=n(1575),R=n(74237),C=n(35223),L=n(31908);const j={dialog:"wZhfj",document:"frWZr",page:"BxRha",documentError:"swyjp",buttonLeft:"mVvyw",buttonRight:"XSAEx"};function P(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,o,c,i=[],l=!0,u=!1;try{if(o=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(a=o.call(n)).done)&&(i.push(a.value),i.length!==t);l=!0);}catch(e){u=!0,r=e}finally{try{if(!l&&null!=n.return&&(c=n.return(),Object(c)!==c))return}finally{if(u)throw r}}return i}}(e,t)||function(e,t){if(e){if("string"==typeof e)return x(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?x(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function x(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var S="shared.previewPdf",A=i.T.encloseNamespace(S);function B(e){var t,n,a;return e?(null===(t=e.metadata)||void 0===t?void 0:t.type)===k.L.Pdf||(null===(n=e.metadata)||void 0===n?void 0:n.type)===k.L.Image?e.url:null===(a=e.pdf)||void 0===a?void 0:a.url:null}function T(e){return a.createElement("div",{className:"d-flex flex-column align-items-center justify-content-center"},a.createElement("img",{alt:"",role:"presentation",src:e.errorImageUrl,className:"w-50 pb-3"}),a.createElement("h2",{className:"h5"},a.createElement(g.x,{namespace:S,phrase:"errorHeading"})),a.createElement("p",null,a.createElement(g.x,{namespace:S,phrase:"downloadAnyway"})),a.createElement(f.h,{svgName:C.vn.Download,onClick:e.onClickDownload,className:"btn btn-dark"},a.createElement(g.x,{namespace:S,phrase:"download"})))}function U(e){var t,n,o=P(a.useState(null),2),i=o[0],f=o[1],w=P(a.useState(1),2),E=w[0],x=w[1],U=P(a.useState(!1),2),D=U[0],V=U[1],O=a.useRef(null),Z=u.a.useBasicFetch(N.publicResource(e.id,e.shareId)),_=u.a.useBasicFetch(e.shareId?I.R.sharedVideo(e.videoId,e.shareId):I.R.video(e.videoId));function F(e){!function(e){if(O.current){var t=O.current.style.height;e>+t.substring(0,t.length-2)&&(O.current.style.height=e+"px")}}(e.height)}function W(e){f(e.numPages)}function M(){E===i||D||x(E+1)}function G(){1===E||D||x(E-1)}function K(){var e,t;D||(c()(l._.urlBuilder(B(Z.data),{dl:"false"}),Z.data.metadata.type===k.L.Image?"image":"pdf"),s.k.logUserAction({id:null===(e=Z.data)||void 0===e?void 0:e.id,name:null===(t=Z.data)||void 0===t?void 0:t.name,video:Object.assign({},L.M.getAnalyticsData(_.data))},{location:d.LZ.Popup,actionType:d.Vw.Print,entity:d.py.Resource,workflowPhase:d.eu.Complete}))}function q(){var e,t;R.T.downloadResource(Z.data,{videoId:null===(e=_.data)||void 0===e?void 0:e.id,videoName:null===(t=_.data)||void 0===t?void 0:t.name},{location:d.LZ.Popup})}return a.createElement(p.G,{title:null!==(n=null===(t=Z.data)||void 0===t?void 0:t.name)&&void 0!==n?n:"",showLoadingSpinner:!Z.data,size:"lg",closePopup:e.closePopup,dialogClassName:j.dialog},function(){var t;return Z.data?(null===(t=Z.data.metadata)||void 0===t?void 0:t.type)===k.L.Image?a.createElement("div",{className:"d-flex justify-content-center w-100 h-100"},a.createElement("img",{alt:Z.data.name,className:"img-fluid",src:B(Z.data)})):a.createElement(a.Fragment,null,a.createElement(r.BB,{file:B(Z.data),className:"".concat(j.document," ").concat(D?j.documentError:""),onLoadSuccess:W,onLoadError:function(){return V(!0)},error:function(){return a.createElement(T,{onClickDownload:q,errorImageUrl:e.errorImageUrl})},loading:y.E},a.createElement(r.T3,{pageNumber:E,loading:y.E,inputRef:function(e){return O.current=e},className:"".concat(j.page," d-flex justify-content-center position-relative"),onLoadSuccess:F,onLoadError:function(){return V(!0)},error:function(){return a.createElement(T,{onClickDownload:q,errorImageUrl:e.errorImageUrl})}}),a.createElement(h.W,{onClick:G,direction:h.f.Left,hide:D||1===E,className:j.buttonLeft,containerClassName:"start-0 end-0"}),a.createElement(h.W,{onClick:M,direction:h.f.Right,hide:D||E===i,className:j.buttonRight,containerClassName:"start-0 end-0"})),!(!(i&&i>1)||D)&&a.createElement("p",{className:"mt-3 text-center"},a.createElement(g.x,{namespace:S,phrase:"pageNumber",options:{current:E,total:i}}))):a.createElement(a.Fragment,null)}(),a.createElement(v.u,null,a.createElement(m.e,{actions:function(){var t,n=[{label:A("download"),svgName:C.vn.Download,onClick:q,button:!0,className:"btn btn-outline-dark me-2"}];return e.showBackButton&&n.unshift({label:A("back"),appLink:e.getResourceGuidanceAppLink(null===(t=_.data)||void 0===t?void 0:t.id,L.M.isClip(parent)?b.E.Clip:b.E.Video),analyticsOptions:{entity:d.py.Resource,actionType:d.Vw.Click,location:d.LZ.PreviewVideoResources,workflowPhase:d.eu.Back},button:!0,className:"btn btn-link"}),D||n.push({label:A("printAsWorksheet"),svgName:C.vn.Print,onClick:K,className:"btn btn-outline-dark me-2",button:!0}),n}()})))}},90502:()=>{},98530:()=>{},74042:()=>{},88312:()=>{},81465:()=>{}}]);
2
- //# sourceMappingURL=8385-083e882d77-lite.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/8385-083e882d77-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/flight-requests/ResourceRequests.ts","file:///app/packages/libs/shared/src/views/preview-pdf/preview-pdf.scss","file:///app/packages/libs/shared/src/views/preview-pdf/PreviewPdfView.tsx"],"sourcesContent":["import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Xhr } from 'libs/common/backbone/interfaces/Xhr';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\nimport { RandomHelper } from 'libs/common/react/utils/RandomHelper';\n\nimport { UpdateResourceRequest } from 'libs/shared/interfaces';\n\nexport const ResourceRequests = {\n resource(id: string): Flight.Request {\n return {\n url: `/api/domain/v2/objects/${id}`,\n key: `resources:${id}`\n };\n },\n\n /**\n * Used to fetch resources publicly by Lite\n */\n publicResource(id: string, shareId?: string): Flight.Request {\n let url = `/api/objects/${id}`;\n\n if (shareId)\n url += `?shareId=${shareId}`;\n\n return {\n url,\n key: `resources:${id}:${shareId}`\n };\n },\n\n videoResources(videoId: string): Flight.Request {\n return {\n url: `/api/domain/v2/objects/${videoId}/resources?query=customer`,\n key: `videos:${videoId}:resources`\n };\n },\n\n addResource(\n videoId: string,\n resource: any,\n success?: (data: HashObject) => void,\n error?: (xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: `/api/domain/v2/objects/${videoId}/resources`,\n key: `create:resource:${resource.fileId || RandomHelper.getRandomInt()}`,\n data: resource,\n type: HttpVerbs.POST,\n invalidationKeys: `videos:${videoId}:resources`,\n success,\n error,\n always\n };\n },\n\n updateResource(\n id: string,\n data: UpdateResourceRequest,\n success?: (data: HashObject) => void,\n error?: (xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: `/api/domain/v2/objects/${id}`,\n key: `update:resource:${id}`,\n data,\n type: HttpVerbs.PUT,\n success,\n error,\n always\n };\n },\n\n deleteResource(\n id: string,\n videoId: string,\n success?: (data: HashObject) => void,\n error?: (xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: `/api/domain/v2/objects/${id}`,\n key: `delete:resource:${id}`,\n type: HttpVerbs.DELETE,\n invalidationKeys: `videos:${videoId}:resources`,\n success,\n error,\n always\n };\n }\n};","// extracted by mini-css-extract-plugin\nexport default {\"dialog\":\"wZhfj\",\"document\":\"frWZr\",\"page\":\"BxRha\",\"documentError\":\"swyjp\",\"buttonLeft\":\"mVvyw\",\"buttonRight\":\"XSAEx\"};","import React from 'react';\nimport { Document, Page } from 'react-pdf/dist/esm/entry.webpack';\nimport { PDFPageProxy } from 'react-pdf/dist/Page';\nimport { PDFDocumentProxy } from 'pdfjs-dist';\nimport printJS from 'print-js';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { ActionOptions, Actions as ActionButtons } from 'libs/shared/components/actions/Actions';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { PopupLoadingSpinner } from 'libs/shared/components/popup/PopupLoadingSpinner';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WidgetButton, WidgetButtonDirection } from 'libs/shared/components/widgets/widget-button/WidgetButton';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ResourceFileType } from 'libs/shared/enums/ResourceFileType';\nimport { ResourceRequests } from 'libs/shared/flight-requests/ResourceRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { PopupViewProps, Resource, Video } from 'libs/shared/interfaces';\nimport { DownloadHelper } from 'libs/shared/utils/DownloadHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './preview-pdf.scss';\n\nconst namespace = 'shared.previewPdf';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getPreviewUrl(resource: Resource): string {\n if (!resource)\n return null;\n\n if (resource.metadata?.type === ResourceFileType.Pdf || resource.metadata?.type === ResourceFileType.Image)\n return resource.url;\n\n return resource.pdf?.url;\n}\n\nfunction PreviewPdfError(props: { onClickDownload: () => void, errorImageUrl: string }): JSX.Element {\n return (\n <div className='d-flex flex-column align-items-center justify-content-center'>\n <img\n alt=''\n role='presentation'\n src={props.errorImageUrl}\n className='w-50 pb-3'\n />\n\n <h2 className='h5'><Text namespace={namespace} phrase='errorHeading' /></h2>\n <p><Text namespace={namespace} phrase='downloadAnyway' /></p>\n <IconButton\n svgName={cvSvgLibrary.Download}\n onClick={props.onClickDownload}\n className='btn btn-dark'\n >\n <Text namespace={namespace} phrase='download' />\n </IconButton>\n </div>\n );\n}\n\nexport interface PreviewPdfQueryParams {\n id: string;\n videoId: string;\n shareId?: string;\n errorImageUrl: string;\n showBackButton?: boolean;\n}\n\ntype PreviewPdfViewProps = PopupViewProps & PreviewPdfQueryParams & {\n getResourceGuidanceAppLink?: (id: string, masterType: MasterType) => Core.AppLink;\n}\n\nexport function PreviewPdfView(props: PreviewPdfViewProps): JSX.Element {\n const [ numPages, setNumPages ] = React.useState(null);\n const [ pageNumber, setPageNumber ] = React.useState(1);\n const [ hasError, setHasError ] = React.useState(false);\n\n const pageRef = React.useRef<HTMLDivElement>(null);\n\n /**\n * Fetching the public resource because resources can be viewed on publicly shared links.\n */\n const resource = Flight.useBasicFetch<Resource>(ResourceRequests.publicResource(props.id, props.shareId));\n\n /**\n * Only used for event collection, we need the video's name\n */\n const video = Flight.useBasicFetch<Video>(props.shareId ?\n VideoRequests.sharedVideo(props.videoId, props.shareId) :\n VideoRequests.video(props.videoId));\n\n /**\n * Set a height on the preview container element.\n * This is needed because when the user changes pages, the popup momentarily shrinks in height\n * until it has finished loading the next page. This prevents that shrink from occurring.\n */\n function setCanvasHeight(currentPreviewHeight: number): void {\n if (!pageRef.current)\n return;\n\n const currentHeightStyle = pageRef.current.style.height;\n const currentHeightStyleNumber = +(currentHeightStyle.substring(0, currentHeightStyle.length - 2));\n\n if (currentPreviewHeight > currentHeightStyleNumber)\n pageRef.current.style.height = currentPreviewHeight + 'px';\n }\n\n function onPageLoadSuccess(data: PDFPageProxy): void {\n setCanvasHeight(data.height);\n }\n\n function onDocumentLoadSuccess(doc: PDFDocumentProxy): void {\n setNumPages(doc.numPages);\n }\n\n function onClickNext(): void {\n if (pageNumber === numPages || hasError)\n return;\n\n setPageNumber(pageNumber + 1);\n }\n\n function onClickPrevious(): void {\n if (pageNumber === 1 || hasError)\n return;\n\n setPageNumber(pageNumber - 1);\n }\n\n function onClickPrint(): void {\n if (hasError)\n return;\n\n printJS(\n UrlHelper.urlBuilder(getPreviewUrl(resource.data), { dl: 'false' }),\n resource.data.metadata.type === ResourceFileType.Image ? 'image' : 'pdf'\n );\n\n AnalyticsHelper.logUserAction({\n id: resource.data?.id,\n name: resource.data?.name,\n video: {\n ...VideoHelper.getAnalyticsData(video.data)\n }\n }, {\n location: LocationContext.Popup,\n actionType: UserAction.Print,\n entity: EntityType.Resource,\n workflowPhase: WorkflowPhase.Complete\n });\n }\n \n function onClickDownload(): void {\n DownloadHelper.downloadResource(\n resource.data,\n { videoId: video.data?.id, videoName: video.data?.name },\n { location: LocationContext.Popup }\n );\n }\n\n function getActionsOptions(): ActionOptions[] {\n const buttons: ActionOptions[] = [{\n label: getPhrase('download'),\n svgName: cvSvgLibrary.Download,\n onClick: onClickDownload,\n button: true,\n className: 'btn btn-outline-dark me-2'\n }];\n\n if (props.showBackButton) {\n buttons.unshift(\n {\n label: getPhrase('back'),\n appLink: props.getResourceGuidanceAppLink(\n video.data?.id,\n VideoHelper.isClip(parent) ? MasterType.Clip : MasterType.Video\n ),\n analyticsOptions: {\n entity: EntityType.Resource,\n actionType: UserAction.Click,\n location: LocationContext.PreviewVideoResources,\n workflowPhase: WorkflowPhase.Back\n },\n button: true,\n className: 'btn btn-link'\n }\n );\n }\n if (!hasError) {\n buttons.push({\n label: getPhrase('printAsWorksheet'),\n svgName: cvSvgLibrary.Print,\n onClick: onClickPrint,\n className: 'btn btn-outline-dark me-2',\n button: true\n });\n }\n\n return buttons;\n }\n\n return (\n <Popup\n title={resource.data?.name ?? ''}\n showLoadingSpinner={!resource.data}\n size='lg'\n closePopup={props.closePopup}\n dialogClassName={styles.dialog}\n >\n {(() => {\n if (!resource.data)\n return <></>;\n\n if (resource.data.metadata?.type === ResourceFileType.Image)\n return (\n <div className='d-flex justify-content-center w-100 h-100'>\n <img alt={resource.data.name} className='img-fluid' src={getPreviewUrl(resource.data)} />\n </div>\n );\n\n return (\n <>\n <Document\n file={getPreviewUrl(resource.data)}\n className={`${styles.document} ${hasError ? styles.documentError : ''}`}\n onLoadSuccess={onDocumentLoadSuccess}\n onLoadError={() => setHasError(true)}\n error={() => <PreviewPdfError onClickDownload={onClickDownload} errorImageUrl={props.errorImageUrl} />}\n loading={PopupLoadingSpinner}\n >\n <Page\n pageNumber={pageNumber}\n loading={PopupLoadingSpinner}\n inputRef={ref => pageRef.current = ref}\n className={`${styles.page} d-flex justify-content-center position-relative`}\n onLoadSuccess={onPageLoadSuccess}\n onLoadError={() => setHasError(true)}\n error={() => <PreviewPdfError onClickDownload={onClickDownload} errorImageUrl={props.errorImageUrl} />}\n />\n <WidgetButton\n onClick={onClickPrevious}\n direction={WidgetButtonDirection.Left}\n hide={hasError || pageNumber === 1}\n className={styles.buttonLeft}\n containerClassName='start-0 end-0'\n />\n <WidgetButton\n onClick={onClickNext}\n direction={WidgetButtonDirection.Right}\n hide={hasError || pageNumber === numPages}\n className={styles.buttonRight}\n containerClassName='start-0 end-0'\n />\n </Document>\n {!!(numPages && numPages > 1 && !hasError) && (\n <p className='mt-3 text-center'>\n <Text\n namespace={namespace}\n phrase='pageNumber'\n options={{\n current: pageNumber,\n total: numPages\n }}\n />\n </p>\n )}\n </>\n );\n })()}\n <PopupButtons>\n <ActionButtons actions={getActionsOptions()} />\n </PopupButtons>\n </Popup>\n );\n}\n"],"names":["ResourceRequests","resource","id","url","key","publicResource","shareId","videoResources","videoId","addResource","success","error","always","fileId","RandomHelper","data","type","HttpVerbs","invalidationKeys","updateResource","deleteResource","namespace","getPhrase","LanguageService","getPreviewUrl","metadata","ResourceFileType","pdf","PreviewPdfError","props","className","alt","role","src","errorImageUrl","Text","phrase","IconButton","svgName","onClick","onClickDownload","PreviewPdfView","numPages","setNumPages","pageNumber","setPageNumber","hasError","setHasError","pageRef","video","VideoRequests","onPageLoadSuccess","currentPreviewHeight","current","currentHeightStyle","style","height","substring","length","setCanvasHeight","onDocumentLoadSuccess","doc","onClickNext","onClickPrevious","onClickPrint","UrlHelper","dl","AnalyticsHelper","name","VideoHelper","location","actionType","entity","workflowPhase","DownloadHelper","videoName","Popup","title","showLoadingSpinner","size","closePopup","dialogClassName","file","onLoadSuccess","onLoadError","loading","PopupLoadingSpinner","inputRef","ref","WidgetButton","W","direction","hide","containerClassName","options","total","PopupButtons","actions","buttons","label","button","showBackButton","unshift","appLink","getResourceGuidanceAppLink","parent","MasterType","analyticsOptions","push","getActionsOptions"],"sourceRoot":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/8451-1cb649a3f3-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/hooks/UseBatchFetch.ts","file:///app/packages/libs/shared/src/hooks/useBreadcrumbs.ts","file:///app/packages/projects/lite/src/apps/content-updates/components/classification-banner/classification-banner.scss","file:///app/packages/projects/lite/src/apps/content-updates/components/classification-banner/ClassificationBanner.tsx","file:///app/packages/projects/lite/src/apps/content-updates/views/classification-update/partial-loading/partial-classification-update.scss","file:///app/packages/projects/lite/src/apps/content-updates/views/classification-update/partial-loading/PartialClassificationUpdate.tsx","file:///app/packages/projects/lite/src/apps/content-updates/views/classification-update/ClassificationUpdateViewCallbacks.tsx","file:///app/packages/projects/lite/src/apps/content-updates/views/classification-update/ClassificationUpdateView.tsx","file:///app/packages/projects/lite/src/shared/hooks/useCommonVideoProps.ts","file:///app/packages/projects/lite/src/shared/hooks/usePresentationAudiences.ts","file:///app/packages/projects/lite/src/shared/hooks/useVideoMixin.ts"],"sourcesContent":["import React from 'react';\n\nimport { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { BaseObject } from 'libs/shared/interfaces';\n\nconst CHUNK_SIZE = 50;\n\nexport interface UseBatchFetchResult<T extends BaseObject> {\n itemsArr: T[];\n items: { [key: string]: T} | null;\n isFetching: boolean;\n}\n\n/**\n * Used to fetch multiple items by id with Flight. Will fetch 25 items at a time firing off multiple\n * requests if there are more than 25 items.\n * This will return items as null until we have all our items. Items will be returned as an object with\n * their ids as they key for easy mapping\n * \n * @param itemIds \n * @param getRequest \n */\nexport function useBatchFetch<T extends BaseObject>(\n itemIds: string[],\n getRequest: (ids: string[]) => Flight.Request\n): UseBatchFetchResult<T> {\n const chunks = ArrayHelper.chunk<string>(itemIds, CHUNK_SIZE);\n\n const requests = chunks.map(chunk => getRequest(ArrayHelper.uniq(chunk)));\n\n const responses = Flight.useBasicFetchAll<T[]>(requests);\n\n const itemsArr = ArrayHelper.flatten(responses.data);\n const items = responses.data.length\n ? itemsArr.reduce((acc, item) => ({ ...acc, [item.id]: item }), {})\n : null;\n\n return {\n itemsArr,\n items,\n isFetching: responses.isFetching\n };\n}\n\n/**\n * When you need the useBatchFetch() behavior, but your list of objects to hydrate\n * will grow, such as on a scrolling page. useGrowingBatchFetch() will use local state\n * to determine what we've already built a request for and what items are new\n * as to not re-fetch items - Sha\n */\nexport function useGrowingBatchFetch<T>(\n objs: T[],\n getRequest: (items: T[]) => Flight.Request,\n _getKey?: (obj: T) => string\n) {\n const getKey = _getKey || ((obj: any) => {\n if (typeof obj === 'object')\n return obj.id;\n\n return obj;\n });\n\n const fetchedItems = React.useRef<Set<string>>(new Set<string>());\n\n const [ requests, setRequests ] = React.useState<Flight.Request[]>([]);\n\n React.useEffect(() => {\n if (!objs?.length)\n return;\n\n const unfetchedItems: T[] = [];\n \n objs.forEach(obj => {\n const key = getKey(obj);\n\n if (fetchedItems.current.has(key))\n return;\n\n unfetchedItems.push(obj);\n fetchedItems.current.add(key);\n });\n \n if (!unfetchedItems.length)\n return;\n\n setRequests(r => ([ ...r, ...ArrayHelper.chunk<T>(unfetchedItems, CHUNK_SIZE).map(getRequest) ]));\n }, [objs?.length]);\n\n const responses = Flight.useBasicFetchAll<T[]>(requests);\n\n const itemsArr = ArrayHelper.flatten(responses.data);\n const items = responses.data.length\n ? itemsArr.reduce((acc, item) => ({ ...acc, [getKey(item)]: item }), {})\n : null;\n\n return {\n hasFirstRequestCompleted: !!responses.responses?.[0]?.hasCompleted,\n itemsArr,\n items,\n isFetching: responses.isFetching\n };\n}","import React from 'react';\n\nimport { Breadcrumb } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { BreadcrumbService } from 'libs/shared/services/BreadcrumbService';\n\nexport function useBreadcrumbs(current: Breadcrumb): Breadcrumb[] {\n const [ match, useBuilder ] = React.useMemo(() => BreadcrumbService.getBuilder(), []);\n\n const breadcrumbs = useBuilder(match);\n\n if (!breadcrumbs || !current)\n return breadcrumbs;\n\n return [ ...breadcrumbs, { ...current, active: true }];\n}\n\n","// extracted by mini-css-extract-plugin\nexport default {\"banner\":\"B7jhq\"};","import * as React from 'react';\nimport { Spinner } from 'react-bootstrap';\n\nimport { StorageType } from 'libs/common/backbone/utils/LocalStorageHelper';\nimport { Core } from 'libs/common/core';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { Classification, PresentationAudience } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './classification-banner.scss';\n\nconst namespace = 'contentUpdates.classificationBanner';\n\ninterface ClassificationBannerProps {\n classification: Classification;\n backgroundUrl: string;\n getClassificationAppLink: (classification: Classification, activeAudiences: PresentationAudience[]) => Core.AppLink;\n followed: boolean;\n follow: (classificationId: string, classificationName: string, follow: boolean) => void;\n showFollowSpinner: boolean;\n canFollow: boolean;\n}\n\nexport function ClassificationBanner(props: ClassificationBannerProps): JSX.Element {\n const { classification, backgroundUrl, followed, follow, showFollowSpinner } = props;\n\n const [activeAudiences] = useViewModel<PresentationAudience[]>(\n SharedViewModelKeys.AUDIENCE_FILTER,\n undefined,\n { storage: StorageType.SessionStorage }\n );\n\n return (\n <div\n className={`banner mb-2 d-flex justify-content-between align-items-center rounded ${styles.banner}`}\n style={{ backgroundImage: `url('${backgroundUrl}')` }}\n >\n <AppLink className='text-white text-shadow' appLink={props.getClassificationAppLink(classification, activeAudiences)}>\n <h2 className='h3 mb-0'>{classification.name}</h2>\n </AppLink>\n\n {props.canFollow && (\n <IconButton\n className={`btn follow-btn ${followed ? 'btn-outline-dark' : 'btn-dark'}`}\n svgName={followed ? cvSvgLibrary.BellFilled : cvSvgLibrary.Bell}\n onClick={() => follow(classification.id, classification.name, !followed)}\n >\n {showFollowSpinner\n ? <Spinner as='span' animation='border' role='status' size='sm' />\n : <Text namespace={namespace} phrase={followed ? 'following' : 'follow'} />\n }\n </IconButton>\n )}\n </div>\n );\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"partialBanner\":\"DKukI\"};","import React from 'react';\n\nimport { PartialBreadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { PartialVideoList } from 'libs/shared/components/video-list/partial-loading/PartialVideoList';\n\nimport styles from './partial-classification-update.scss';\n\nexport function PartialClassificationUpdate(): JSX.Element {\n return (\n <div className='bg-white px-3'>\n <div className={`partial-loading-background mb-2 ${styles.partialBanner} rounded`} />\n\n <div className='mb-1'>\n <PartialBreadcrumbs />\n </div>\n\n <PartialVideoList />\n </div>\n );\n}","\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, ToggleDescriptor, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { PreferenceRequests } from 'libs/shared/flight-requests/PreferenceRequests';\nimport { Alerts } from 'libs/shared/hooks/UseAlerts';\nimport { CurrentUser } from 'libs/shared/interfaces';\n\nconst namespace = 'contentUpdates.classificationUpdate';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ClassificationViewCallbackManager {\n dispatch: React.Dispatch<Flight.RequestAction>;\n alerts: Alerts;\n setShowFollowSpinner: React.Dispatch<React.SetStateAction<boolean>>;\n currentUser: CurrentUser;\n}\n\nexport function getClassificationCallbacks(\n options: ClassificationViewCallbackManager\n) {\n const { dispatch, alerts, setShowFollowSpinner } = options;\n\n function onFollow(classificationId: string, classificationName: string, follow: boolean): void {\n setShowFollowSpinner(true);\n\n const onSuccess = () => {\n setShowFollowSpinner(false);\n\n AnalyticsHelper.logUserAction({\n id: classificationId,\n name: classificationName\n }, {\n location: LocationContext.ContentUpdatesClassificationBanner,\n workflowPhase: WorkflowPhase.Complete,\n descriptor: follow ? ToggleDescriptor.On : ToggleDescriptor.Off,\n actionType: UserAction.Follow,\n entity: EntityType.Classification\n });\n\n alerts.success(getPhrase(follow ? 'followed' : 'unfollowed', { name: classificationName, escapeText: true }));\n };\n\n const onError = () => {\n setShowFollowSpinner(false);\n alerts.error(LanguageService.getPhrase(namespace, 'error'));\n };\n\n const request = follow ?\n PreferenceRequests.followSubjects([classificationId], onSuccess, onError) :\n PreferenceRequests.unfollowSubjects([classificationId], onSuccess, onError);\n\n Flight.fetch(dispatch, request);\n }\n\n return {\n onFollow\n };\n}\n","import * as React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { ContentUpdateRequests } from 'libs/shared/apps/content-updates/flight-requests/ContentUpdateRequests';\nimport { ClassificationVideosGrouping, ContentUpdateAppLinks } from 'libs/shared/apps/content-updates/interfaces';\nimport { Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { VideoList } from 'libs/shared/components/video-list/VideoList';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { PreferenceRequests } from 'libs/shared/flight-requests/PreferenceRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useBreadcrumbs } from 'libs/shared/hooks/useBreadcrumbs';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Classification, CurrentUser } from 'libs/shared/interfaces';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { useCommonVideoProps } from 'shared/hooks/useCommonVideoProps';\nimport { usePresentationAudiences } from 'shared/hooks/usePresentationAudiences';\nimport { useVideoMixin } from 'shared/hooks/useVideoMixin';\nimport { InteractiveHelpers } from 'shared/utils/InteractiveHelper';\nimport { SeoHelper } from 'shared/utils/SeoHelper';\n\nimport { ClassificationBanner } from 'apps/content-updates/components';\n\nimport { PartialClassificationUpdate } from './partial-loading/PartialClassificationUpdate';\nimport { getClassificationCallbacks } from './ClassificationUpdateViewCallbacks';\n\nconst namespace = 'contentUpdates.classificationUpdate';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ClassificationUpdateViewProps {\n classificationId: string;\n appLinks: ContentUpdateAppLinks;\n presentationSlug?: string;\n}\n\nexport function ClassificationUpdateView(props: ClassificationUpdateViewProps): JSX.Element {\n const { classificationId } = props;\n\n const dispatch = useDispatch();\n const alerts = useAlerts();\n \n const { commonVideoProps } = useCommonVideoProps({ locationContext: LocationContext.VideoThumbnail });\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const [ showFollowSpinner, setShowFollowSpinner ] = React.useState(false);\n\n const callbacks = getClassificationCallbacks({\n dispatch,\n alerts,\n setShowFollowSpinner,\n currentUser: currentUser?.data\n });\n\n const date = new Date();\n // Retrieve the past 1 year from today\n const from = DateHelper.format(DateHelper.endOf(DateHelper.subtract(date, 1, 'year'), 'day'), 'YYYY-MM-DD');\n const to = DateHelper.format(DateHelper.endOf(date, 'day'), 'YYYY-MM-DD');\n\n const { hasPermissions } = usePermissions();\n const canFollowSubjects = hasPermissions(PermissionName.FollowSubjects);\n\n const classification = Flight.useBasicFetch<Classification>(\n ContentUpdateRequests.getClassification(classificationId)\n );\n\n const contentUpdates = Flight.useBasicFetch<ClassificationVideosGrouping>(currentUser.data &&\n ContentUpdateRequests.getClassificationUpdates(classificationId, from, to));\n\n const subjectPreferences = Flight.useBasicFetch<Classification[]>(canFollowSubjects &&\n PreferenceRequests.mySubjectPreferences());\n\n const audiences = usePresentationAudiences();\n\n const breadcrumbs = useBreadcrumbs({ name: classification.data?.name });\n\n useSetPageMetadata(PageMetadataHelper.getDefaultMetadata({\n title: classification.data?.name,\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n },\n canonicalLink: SeoHelper.getCanonicalLink({\n customAppLink: props.appLinks?.getClassificationUpdateAppLink(classification.data)\n }),\n allowIndexing: SeoHelper.allowIndexing()\n }));\n\n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem });\n\n useVideoMixin(contentUpdates.data?.videos ?? []);\n\n const hasLoadedPreferences = subjectPreferences.hasCompleted || !canFollowSubjects;\n\n const dataLoaded = (\n contentUpdates.data && classification.data &&\n hasLoadedPreferences && currentUser.data\n );\n\n if (!dataLoaded)\n return <PartialClassificationUpdate />;\n\n const preferredSubjectIds = subjectPreferences.data?.map(subject => subject.id) ?? [];\n\n return (\n <VideoActionsContext.Provider value={videoActions}>\n <div className='bg-white px-3'>\n <ClassificationBanner\n classification={classification.data}\n backgroundUrl={classification.data.banner?.url ?? ''}\n getClassificationAppLink={props.appLinks.getClassificationAppLink}\n followed={!!preferredSubjectIds.find(id => id.toString() === classification.data.id.toString())}\n follow={callbacks.onFollow}\n showFollowSpinner={showFollowSpinner}\n canFollow={canFollowSubjects}\n />\n <Breadcrumbs breadcrumbs={breadcrumbs} />\n\n\n <VideoList\n videos={contentUpdates.data.videos}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n hasPermissions={hasPermissions}\n presentationAudiences={audiences.data}\n getPreviewQuestionsAppLink={interactive => InteractiveHelpers.getPreviewQuestionsAppLink(interactive)}\n commonVideoProps={commonVideoProps}\n />\n </div>\n </VideoActionsContext.Provider>\n );\n}","import { Core } from 'libs/common/backbone/index';\nimport { Flight } from 'libs/common/react/index';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, CurrentUser, VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\n\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { SeriesAppLinkHelper } from 'apps/series/SeriesAppLinkHelper';\n\nimport { usePluginHelper } from './use-plugin-helper/usePluginHelper';\nimport { useLiteFavourites } from './useLiteFavourites';\n\ninterface UseCommonVideoPropsResult {\n hasCommonVideoPropsCompleted: boolean;\n commonVideoProps: CommonVideoProps;\n}\n\ninterface UseCommonVideoPropsOptions {\n locationContext: LocationContext,\n mtv?: boolean;\n flightNamespace?: string;\n sharedPlaylist?: boolean;\n}\n\nexport function useCommonVideoProps(options: UseCommonVideoPropsOptions): UseCommonVideoPropsResult {\n const { locationContext, mtv, flightNamespace, sharedPlaylist } = options || {};\n\n const { isPlugin } = usePluginHelper();\n const { setFavourite, canFavourite } = useLiteFavourites(locationContext, flightNamespace);\n const { hasTopicDirectories, isLoadingSettings } = useSettings(null);\n const { hasPermissions, isLoaded: hasLoadedPermissions } = usePermissions();\n const hasStudentExperience = hasPermissions(PermissionName.StudentExperience);\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n function getSubTextAppLink(video: VideoTypes): Core.AppLink {\n if (!('series' in video))\n return null;\n\n /**\n * We do not allow navigating to series on shared playlists when the user is not signed in\n * because most series are customer created and will be empty for public users\n * \n * We do not have to do this for shared series, because all the series links are self referencing\n * - Sha\n */\n if (sharedPlaylist && !currentUser.data?.isAuthenticated)\n return null;\n \n return SeriesAppLinkHelper.getSeriesAppLink(video.series, { mtv });\n }\n\n const hasCommonVideoPropsCompleted = (\n !isLoadingSettings &&\n hasLoadedPermissions &&\n config.hasCompleted &&\n currentUser.hasCompleted &&\n (!currentUser.data?.isAuthenticated || yearGroups.hasCompleted)\n );\n\n return {\n hasCommonVideoPropsCompleted,\n commonVideoProps: {\n subTextType: 'series',\n getSubTextAppLink,\n isPlugin,\n canFavourite,\n setFavourite,\n imageCdnUrl: config.data?.imageCdnUrl,\n yearGroups: yearGroups.data,\n getClassroomGuideAppLink: VideoAppLinkHelper.getClassroomGuideAppLink,\n getInteractiveGuidanceAppLink: VideoAppLinkHelper.getInteractiveGuidanceAppLink,\n getResourceGuidanceAppLink: VideoAppLinkHelper.getResourceGuidanceAppLink,\n showNewVideoIndicator: hasTopicDirectories,\n companyLogoFallbackUrl: null,\n hasStudentExperience\n }\n };\n}","import { Flight } from 'libs/common/react/index';\n\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\nimport { usePresentation } from 'shared/hooks/usePresentation';\n\nexport const usePresentationAudiences = () => {\n const { activePresentation, getFallbackPresentation } = usePresentation({ redirectOnError: true });\n\n const presentation = activePresentation || getFallbackPresentation();\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n !!presentation &&\n AudienceRequests.presentationAudiences(presentation.id)\n );\n\n return audiences;\n};","import { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useGrowingBatchFetch } from 'libs/shared/hooks/UseBatchFetch';\nimport { Clip, ClipCollection, Video, VideoCollection } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\ntype Types = Video[] | VideoCollection | Clip[] | ClipCollection;\n\nfunction getValidObjects(objects: Types): (Video | Clip)[] {\n if (!objects)\n return [];\n\n if (Array.isArray(objects))\n return objects.filter(o => !!o && (VideoHelper.isVideo(o) || VideoHelper.isClip(o)));\n\n if ('data' in objects)\n return objects.data.filter(o => !!o && (VideoHelper.isVideo(o) || VideoHelper.isClip(o)));\n\n return [];\n}\n\ninterface VideoMixinOptions {\n /**\n * If the videos that are having new data mixed into are sitting on an explicit Flight namespace,\n * providing that namespace here is required\n */\n flightNamespace?: string;\n}\n\nexport function useVideoMixin(objects: Types, options: VideoMixinOptions = {}): void {\n const videoIds = getValidObjects(objects).map(v => v.id);\n\n useGrowingBatchFetch(videoIds, ids => VideoRequests.videoMixinAssocs(ids, options.flightNamespace));\n}"],"names":["CHUNK_SIZE","useBatchFetch","itemIds","getRequest","requests","map","chunk","responses","itemsArr","data","items","length","reduce","acc","item","id","isFetching","useGrowingBatchFetch","objs","_getKey","getKey","obj","fetchedItems","Set","setRequests","unfetchedItems","forEach","key","current","has","push","add","r","hasFirstRequestCompleted","hasCompleted","useBreadcrumbs","match","breadcrumbs","useBuilder","active","ClassificationBanner","props","classification","backgroundUrl","followed","follow","showFollowSpinner","activeAudiences","SharedViewModelKeys","undefined","storage","className","style","backgroundImage","appLink","getClassificationAppLink","name","canFollow","IconButton","svgName","onClick","Spinner","as","animation","role","size","namespace","phrase","PartialClassificationUpdate","PartialVideoList","getPhrase","LanguageService","ClassificationUpdateView","classificationId","dispatch","alerts","commonVideoProps","useCommonVideoProps","locationContext","currentUser","UserRequests","callbacks","options","setShowFollowSpinner","onFollow","classificationName","onSuccess","AnalyticsHelper","location","workflowPhase","descriptor","actionType","entity","success","escapeText","onError","error","request","PreferenceRequests","getClassificationCallbacks","date","Date","from","DateHelper","to","hasPermissions","usePermissions","canFollowSubjects","PermissionName","ContentUpdateRequests","contentUpdates","subjectPreferences","audiences","usePresentationAudiences","useSetPageMetadata","PageMetadataHelper","title","phraseContext","phraseHandler","titlePhrase","descriptionPhrase","canonicalLink","SeoHelper","customAppLink","appLinks","getClassificationUpdateAppLink","allowIndexing","videoActions","useVideoActions","useVideoMixin","videos","hasLoadedPreferences","preferredSubjectIds","subject","VideoActionsContext","value","banner","url","find","toString","Breadcrumbs","VideoList","getVideoAppLink","presentationAudiences","getPreviewQuestionsAppLink","interactive","InteractiveHelper","mtv","flightNamespace","sharedPlaylist","isPlugin","u","setFavourite","canFavourite","hasTopicDirectories","isLoadingSettings","hasLoadedPermissions","isLoaded","hasStudentExperience","config","yearGroups","isAuthenticated","customerId","hasCommonVideoPropsCompleted","subTextType","getSubTextAppLink","video","series","imageCdnUrl","getClassroomGuideAppLink","getInteractiveGuidanceAppLink","getResourceGuidanceAppLink","showNewVideoIndicator","companyLogoFallbackUrl","redirectOnError","activePresentation","getFallbackPresentation","presentation","objects","videoIds","Array","isArray","filter","o","getValidObjects","v","ids"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[8630],{94644:(e,t,i)=>{i.d(t,{r:()=>u});var n=i(50242),r=i(81886),a=i(67058),o=i(14553),s=i(49267),l=i(49075),c={notFound:a.d,forbidden:{rating:o.q,yearLevel:o.q,region:s.a,privacy:o.q},badRequest:l._,internalServerError:l._};function u(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e){var a;a="number"==typeof e?e:e.status;var o=Object.assign(Object.assign({},c),t);a&&r.Q.Ry.isStatusCodeError(a)&&(a!==n.o.InternalServer?a!==n.o.NotFound?a!==n.o.Forbidden?i.badRequest||r.Q.Ry.throw(new o.badRequest):i.forbidden||r.Q.Ry.throw(new o.forbidden.privacy):i.notFound||r.Q.Ry.throw(new o.notFound):i.internalServerError||r.Q.Ry.throw(new l._))}}},60115:(e,t,i)=>{i.d(t,{K:()=>c});var n=i(32735),r=i(50242),a=i(91967),o=400,s=i(45719);function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var i=0,n=Array(t);i<t;i++)n[i]=e[i];return n}function c(e,t,i,c,u,d){var v,p,m,h,f=(v=(0,n.useState)(0),p=2,function(e){if(Array.isArray(e))return e}(v)||function(e,t){var i=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=i){var n,r,a,o,s=[],l=!0,c=!1;try{if(a=(i=i.call(e)).next,0===t){if(Object(i)!==i)return;l=!1}else for(;!(l=(n=a.call(i)).done)&&(s.push(n.value),s.length!==t);l=!0);}catch(e){c=!0,r=e}finally{try{if(!l&&null!=i.return&&(o=i.return(),Object(o)!==o))return}finally{if(c)throw r}}return s}}(v,p)||function(e,t){if(e){if("string"==typeof e)return l(e,t);var i={}.toString.call(e).slice(8,-1);return"Object"===i&&e.constructor&&(i=e.constructor.name),"Map"===i||"Set"===i?Array.from(e):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?l(e,t):void 0}}(v,p)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),g=f[0],C=f[1],b=t,y=(0,s.P)((function(t){if(!e)return null;var i=e(t);return i?i.key:null}),c,u);return m={fetchNextPage:function(){if(t&&e&&y)return C((function(e){return e+1})),b(y.nextCursor)},hasMore:!!(null==y?void 0:y.nextCursor),isFetching:null==y?void 0:y.isFetching,scrollContainer:d},h=function(){if(!m.isFetching){if(m.scrollContainer){var e=m.scrollContainer;if(e.getBoundingClientRect().height+e.scrollTop<e.scrollHeight-o)return}else if(window.innerHeight+document.documentElement.scrollTop<document.documentElement.scrollHeight-o)return;m.fetchNextPage()}},(0,n.useEffect)((function(){var e=a.q.throttle(h,200),t=m.scrollContainer||window;return m.hasMore&&t.addEventListener("scroll",e),function(){return t.removeEventListener("scroll",e)}}),[m.hasMore,m.fetchNextPage,m.scrollContainer]),(0,n.useEffect)((function(){y&&y.shouldInitialFetch&&t&&(b(),C((function(e){return e+1})))}),[null==y?void 0:y.shouldInitialFetch,t]),(0,n.useEffect)((function(){var e,t;if((null==y?void 0:y.statusCode)&&a.q.isFunction(i)){var n=+(null===(t=null===(e=y.statusCode)||void 0===e?void 0:e.toString())||void 0===t?void 0:t.substr(0,1));n!==r.k.ClientError&&n!==r.k.ServerError||i(g,y.statusCode)}}),[null==y?void 0:y.statusCode]),{items:null==y?void 0:y.items,hasMore:!!(null==y?void 0:y.nextCursor),nextCursor:null==y?void 0:y.nextCursor,isFetching:null==y?void 0:y.isFetching,totalItems:null==y?void 0:y.totalItems,hasFirstPageCompleted:null==y?void 0:y.hasFirstPageCompleted}}},58321:(e,t,i)=>{i.d(t,{U:()=>m});var n=i(20354),r=i(16714),a=i(39151),o=i(1666),s=i(31949),l=i(22902),c=i(37802),u=i(22490),d=i(82431),v=i(46390),p=i(27638);function m(e){var t,i,m,h=e||{},f=h.locationContext,g=h.mtv,C=h.flightNamespace,b=h.sharedPlaylist,y=(0,v.G)().isPlugin,w=(0,p.u)(f,C),V=w.setFavourite,P=w.canFavourite,E=(0,c.r)(null),F=E.hasTopicDirectories,I=E.isLoadingSettings,L=(0,l.T)(),A=L.hasPermissions,k=L.isLoaded,x=A(r.C.StudentExperience),S=n.a.useBasicFetch(a.L.config()),O=n.a.useBasicFetch(s.N.currentUser()),N=n.a.useBasicFetch((null===(t=O.data)||void 0===t?void 0:t.isAuthenticated)&&o.h.yearGroups(O.data.customerId));return{hasCommonVideoPropsCompleted:!I&&k&&S.hasCompleted&&O.hasCompleted&&(!(null===(i=O.data)||void 0===i?void 0:i.isAuthenticated)||N.hasCompleted),commonVideoProps:{subTextType:"series",getSubTextAppLink:function(e){var t;return"series"in e?b&&!(null===(t=O.data)||void 0===t?void 0:t.isAuthenticated)?null:d.j.getSeriesAppLink(e.series,{mtv:g}):null},isPlugin:y,canFavourite:P,setFavourite:V,imageCdnUrl:null===(m=S.data)||void 0===m?void 0:m.imageCdnUrl,yearGroups:N.data,getClassroomGuideAppLink:u.W.getClassroomGuideAppLink,getInteractiveGuidanceAppLink:u.W.getInteractiveGuidanceAppLink,getResourceGuidanceAppLink:u.W.getResourceGuidanceAppLink,showNewVideoIndicator:F,companyLogoFallbackUrl:null,hasStudentExperience:x}}}},44110:(e,t,i)=>{i.d(t,{i:()=>o});var n=i(20354),r=i(89454),a=i(86698),o=function(){var e=(0,a.y)({redirectOnError:!0}),t=e.activePresentation,i=e.getFallbackPresentation,o=t||i();return n.a.useBasicFetch(!!o&&r.O.presentationAudiences(o.id))}},35014:(e,t,i)=>{i.d(t,{I:()=>v});var n=i(20354),r=i(55171),a=i(16714),o=i(12754),s=i(31949),l=i(22902),c=i(15311),u=i(37802),d=i(11387);function v(e){var t=(0,l.T)(),i=t.hasPermissions,v=t.hasLocalPermissions,p=(0,c.r)().hasProduct,m=n.a.useBasicFetch(s.N.currentUser()),h=(0,u.r)(null).hasPlayPageTranscript,f=p(o.x.Primary);return{canViewGlance:i(a.C.ViewVideoGlance),canViewResources:!0,canViewInteractives:f&&i(a.C.ViewVideoInteractives),canViewClips:f&&i(a.C.ViewVideoClips),canViewCurriculumLinks:i(a.C.ViewCurriculums),canUseActions:v(a.E.UseVideoActions),canViewPublicLayout:!v(a.E.WatchVideos)&&d.C.hasRegionPrefix(),canViewResourceItems:v(a.E.ViewVideoResourceItems),canNavigate:f,canViewTranscript:function(e){var t;return(null===(t=m.data)||void 0===t?void 0:t.isAuthenticated)?h:!!e&&r.e.PublicTranscriptVideoIds.includes(e)}(e)}}},78630:(e,t,i)=>{i.r(t),i.d(t,{ClipClipsView:()=>O});var n=i(32735),r=i(81886),a=i(23481),o=i(20354),s=i(28400),l=i(65858),c=i(49935),u=i(87801),d=i(75100),v=i(51365),p=i(183),m=i(94644),h=i(43012),f=i(31949),g=i(69883),C=i(60115),b=i(22902),y=i(79612),w=i(14070),V=i(97291),P=i(10671),E=i(58321),F=i(44110),I=i(35014),L=i(22490),A=i(98620),k=i(9212),x="shared.videoMedia",S=a.T.encloseNamespace(x);function O(e){var t,i,O,N,T,R,j=e.clipId,_=o.a.useGetFetch(),G=(0,g.Z)(),U=(0,E.U)({locationContext:l.LZ.VideoThumbnail}),M=U.commonVideoProps,q=U.hasCommonVideoPropsCompleted,B=(0,P._)({location:P.i.VideoItem}),Q=(0,I.I)(),H=o.a.useBasicFetch(f.N.currentUser()),W=o.a.useBasicFetch(h.e.clip(j)),Y=null===(i=null===(t=W.data)||void 0===t?void 0:t._parentVideo)||void 0===i?void 0:i.id;function D(e){return h.e.videoClips(Y,null,e)}function K(e){return _(D(e))}(0,y.M)({title:W.data?S("otherClipsViewPageTitle",{video:null===(O=W.data)||void 0===O?void 0:O.name}):""});var Z=(0,C.K)(!(!Q.canViewClips||!Y)&&D,K,(function(e,t){if(1===e)return(0,m.r)(t);G.error(a.T.getPhrase(x,"errorClips"))})),$=Z.items,z=Z.hasMore,J=Z.isFetching,X=S("otherClipsHeading"),ee=(0,F.i)(),te=(0,b.T)().hasPermissions,ie=[{name:null===(N=W.data)||void 0===N?void 0:N.name,appLink:Object.assign(Object.assign({},A.Y.playClip),{args:[j,s.m.slugify(null===(T=W.data)||void 0===T?void 0:T.name)]})},{name:X,appLink:{application:V.O.CLIPS,action:w.e.Clips.CLIP_CLIPS,args:[j,s.m.slugify(null===(R=W.data)||void 0===R?void 0:R.name)]},active:!0}];return n.useEffect((function(){Q.canViewClips||function(){var e;r.Q.C$.trigger(Object.assign(Object.assign({},A.Y.playClip),{args:[j,s.m.slugify(null===(e=W.data)||void 0===e?void 0:e.name)]}),{replace:!0})}()}),[Q.canViewClips]),W.data&&(null==$?void 0:$.length)&&q?n.createElement(v.M.Provider,{value:B},n.createElement("div",{className:"px-3"},n.createElement("h1",{className:"h2 mb-2"},X),n.createElement("div",{className:"mb-2"},n.createElement(c.Oo,{breadcrumbs:ie})),n.createElement(d.E4,{videos:$,getVideoAppLink:function(t,i){var n;return L.W.getAppLink(t,Object.assign(Object.assign({},i),{context:p.Q.Widget,contextId:e.clipId,includeContext:null===(n=H.data)||void 0===n?void 0:n.isAuthenticated}))},hasPermissions:te,presentationAudiences:ee.data,showOwner:!0,commonVideoProps:M}),(z||J)&&n.createElement(u._,{isFetching:J,fetchNext:K}))):n.createElement(k.l,null)}},98620:(e,t,i)=>{i.d(t,{Y:()=>a});var n=i(14070),r=i(97291),a={playVideo:{application:r.O.VIDEOS,action:n.e.Videos.PLAY_VIDEO},playClip:{application:r.O.CLIPS,action:n.e.Clips.PLAY_CLIP}}},9212:(e,t,i)=>{i.d(t,{l:()=>s});var n=i(32735),r=i(49935),a=i(1860);const o={partialHeading:"okxfx"};function s(){return n.createElement("div",{className:"px-3"},n.createElement("div",{className:"partial-loading-background mb-2 ".concat(o.partialHeading)}),n.createElement("div",{className:"mb-2"},n.createElement(r.b2,null)),n.createElement(a.S,null))}}}]);
2
- //# sourceMappingURL=8630-0945271ea2-lite.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/8630-0945271ea2-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteScroll.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteList.ts","file:///app/packages/projects/lite/src/shared/hooks/useCommonVideoProps.ts","file:///app/packages/projects/lite/src/shared/hooks/usePresentationAudiences.ts","file:///app/packages/projects/lite/src/shared/hooks/useVideoFeatureAccess.ts","file:///app/packages/projects/lite/src/shared/views/video-media/ClipClipsView.tsx","file:///app/packages/projects/lite/src/shared/views/video-media/VideoMediaAppLinks.ts","file:///app/packages/projects/lite/src/shared/views/video-media/partial-loading/partial-video-media-view.scss","file:///app/packages/projects/lite/src/shared/views/video-media/partial-loading/PartialVideoMediaView.tsx"],"sourcesContent":["import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n internalServerError?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError,\n internalServerError: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.InternalServer) {\n if (!ignoreMap.internalServerError)\n Core.ErrorHelper.throw(new UnspecifiedError());\n return;\n }\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import { useEffect } from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst SCROLL_TOLERANCE = 400; // value in px\n\ninterface UseInfiniteScrollOptions {\n fetchNextPage: () => void;\n hasMore: boolean;\n isFetching: boolean;\n scrollContainer?: HTMLElement;\n}\n\nexport function useInfiniteScroll(options: UseInfiniteScrollOptions): void {\n const handleScroll = (): void => {\n if (options.isFetching)\n return;\n\n if (!options.scrollContainer) {\n const currentScrollHeight = window.innerHeight + document.documentElement.scrollTop;\n \n const totalHeight = document.documentElement.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n } else {\n const { scrollContainer } = options;\n const currentScrollHeight = scrollContainer.getBoundingClientRect().height + scrollContainer.scrollTop;\n \n const totalHeight = scrollContainer.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n }\n\n options.fetchNextPage();\n };\n\n useEffect(() => {\n const onScroll = FunctionHelper.throttle(handleScroll, 200);\n\n const scrollContainer = options.scrollContainer || window;\n\n if (options.hasMore)\n scrollContainer.addEventListener('scroll', onScroll);\n\n return () => scrollContainer.removeEventListener('scroll', onScroll);\n }, [ options.hasMore, options.fetchNextPage, options.scrollContainer ]);\n}","import { useEffect, useState } from 'react';\n\nimport { HttpStatus, HttpStatusClass } from 'libs/common/backbone/enums/HttpStatus';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { BaseObject, BasePaginatedCollection } from 'libs/shared/interfaces';\n\nimport { useInfiniteScroll } from './UseInfiniteScroll';\nimport { useSelectAllPages } from './UseSelectAllPages';\n\nexport interface UseInfiniteListResult<T extends BaseObject> {\n items: T[];\n hasMore: boolean;\n isFetching: boolean;\n nextCursor: string;\n totalItems?: number;\n hasFirstPageCompleted: boolean;\n}\n\n/**\n * Hook to extract an infinite list from the application state,\n * save it locally in state and only update when new data\n * is fetched.\n * \n * @param getRequest - callback function to get the request for each page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n * \n * @param fetchNext - callback function to fetch a page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n */\nexport function useInfiniteList<TObject = BaseObject, TResponse = BasePaginatedCollection<TObject>>(\n getRequest: ((cursor?: string) => Flight.Request) | false,\n fetchNext: ((cursor?: string) => void) | false,\n onError?: (pageNumber: number, statusCode: HttpStatus) => void,\n getItems?: (responseData: TResponse) => TObject[],\n getCursor?: (responseData: TResponse) => string,\n scrollContainer?: HTMLElement\n): UseInfiniteListResult<TObject> {\n const [ pagesFetched, setPagesFetched ] = useState(0);\n\n const fetchNextFn = fetchNext as (cursor?: string) => void;\n\n function getKey(cursor?: string): string {\n if (!getRequest)\n return null;\n\n const request = getRequest(cursor);\n\n if (!request)\n return null;\n\n return request.key;\n }\n\n const response = useSelectAllPages<TObject, TResponse>(\n getKey,\n getItems,\n getCursor\n );\n\n function fetchNextPage(): void {\n if (!fetchNext || !getRequest || !response)\n return;\n\n setPagesFetched(currentVal => currentVal + 1);\n return fetchNextFn(response.nextCursor);\n }\n\n useInfiniteScroll({\n fetchNextPage,\n hasMore: !!response?.nextCursor,\n isFetching: response?.isFetching,\n scrollContainer\n });\n\n useEffect(() => {\n if (!response)\n return;\n\n if (response.shouldInitialFetch && fetchNext) {\n fetchNextFn();\n setPagesFetched(currentVal => currentVal + 1);\n }\n }, [ response?.shouldInitialFetch, fetchNext ]);\n\n useEffect(() => {\n if (!response?.statusCode || !FunctionHelper.isFunction(onError))\n return;\n\n const httpStatusClass: HttpStatusClass = +(response.statusCode?.toString()?.substr(0, 1));\n\n if (httpStatusClass !== HttpStatusClass.ClientError && httpStatusClass !== HttpStatusClass.ServerError)\n return;\n\n onError(pagesFetched, response.statusCode);\n }, [response?.statusCode]);\n\n return {\n items: response?.items,\n hasMore: !!response?.nextCursor,\n nextCursor: response?.nextCursor,\n isFetching: response?.isFetching,\n totalItems: response?.totalItems,\n hasFirstPageCompleted: response?.hasFirstPageCompleted\n };\n}","import { Core } from 'libs/common/backbone/index';\nimport { Flight } from 'libs/common/react/index';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, CurrentUser, VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\n\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { SeriesAppLinkHelper } from 'apps/series/SeriesAppLinkHelper';\n\nimport { usePluginHelper } from './use-plugin-helper/usePluginHelper';\nimport { useLiteFavourites } from './useLiteFavourites';\n\ninterface UseCommonVideoPropsResult {\n hasCommonVideoPropsCompleted: boolean;\n commonVideoProps: CommonVideoProps;\n}\n\ninterface UseCommonVideoPropsOptions {\n locationContext: LocationContext,\n mtv?: boolean;\n flightNamespace?: string;\n sharedPlaylist?: boolean;\n}\n\nexport function useCommonVideoProps(options: UseCommonVideoPropsOptions): UseCommonVideoPropsResult {\n const { locationContext, mtv, flightNamespace, sharedPlaylist } = options || {};\n\n const { isPlugin } = usePluginHelper();\n const { setFavourite, canFavourite } = useLiteFavourites(locationContext, flightNamespace);\n const { hasTopicDirectories, isLoadingSettings } = useSettings(null);\n const { hasPermissions, isLoaded: hasLoadedPermissions } = usePermissions();\n const hasStudentExperience = hasPermissions(PermissionName.StudentExperience);\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n function getSubTextAppLink(video: VideoTypes): Core.AppLink {\n if (!('series' in video))\n return null;\n\n /**\n * We do not allow navigating to series on shared playlists when the user is not signed in\n * because most series are customer created and will be empty for public users\n * \n * We do not have to do this for shared series, because all the series links are self referencing\n * - Sha\n */\n if (sharedPlaylist && !currentUser.data?.isAuthenticated)\n return null;\n \n return SeriesAppLinkHelper.getSeriesAppLink(video.series, { mtv });\n }\n\n const hasCommonVideoPropsCompleted = (\n !isLoadingSettings &&\n hasLoadedPermissions &&\n config.hasCompleted &&\n currentUser.hasCompleted &&\n (!currentUser.data?.isAuthenticated || yearGroups.hasCompleted)\n );\n\n return {\n hasCommonVideoPropsCompleted,\n commonVideoProps: {\n subTextType: 'series',\n getSubTextAppLink,\n isPlugin,\n canFavourite,\n setFavourite,\n imageCdnUrl: config.data?.imageCdnUrl,\n yearGroups: yearGroups.data,\n getClassroomGuideAppLink: VideoAppLinkHelper.getClassroomGuideAppLink,\n getInteractiveGuidanceAppLink: VideoAppLinkHelper.getInteractiveGuidanceAppLink,\n getResourceGuidanceAppLink: VideoAppLinkHelper.getResourceGuidanceAppLink,\n showNewVideoIndicator: hasTopicDirectories,\n companyLogoFallbackUrl: null,\n hasStudentExperience\n }\n };\n}","import { Flight } from 'libs/common/react/index';\n\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\nimport { usePresentation } from 'shared/hooks/usePresentation';\n\nexport const usePresentationAudiences = () => {\n const { activePresentation, getFallbackPresentation } = usePresentation({ redirectOnError: true });\n\n const presentation = activePresentation || getFallbackPresentation();\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n !!presentation &&\n AudienceRequests.presentationAudiences(presentation.id)\n );\n\n return audiences;\n};","import { Flight } from 'libs/common/react/index';\n\nimport { HardCoded } from 'libs/shared/constants/HardCoded';\nimport { LocalPermissionName, PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { CurrentUser } from 'libs/shared/interfaces';\n\nimport { LiteRouteHelper } from 'shared/utils/LiteRouteHelper';\n\nexport interface VideoFeaturesHash {\n canViewGlance: boolean;\n canViewResources: boolean;\n canViewInteractives: boolean;\n canViewClips: boolean;\n canUseActions: boolean;\n canViewPublicLayout: boolean;\n canNavigate: boolean;\n canViewCurriculumLinks: boolean;\n canViewResourceItems: boolean;\n canViewTranscript: boolean;\n}\n\nexport function useVideoFeatureAccess(videoId?: string) {\n const { hasPermissions, hasLocalPermissions } = usePermissions();\n const { hasProduct } = useProducts();\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const { hasPlayPageTranscript } = useSettings(null);\n\n const hasNP = hasProduct(ProductId.Primary);\n\n function showPublicLayout(): boolean {\n /**\n * Authenticated users should never see the placeholder\n */\n if (hasLocalPermissions(LocalPermissionName.WatchVideos))\n return false;\n\n /**\n * Accessing a play page unathenticated will have different contextual behabviours:\n * - For a share page, the user should see the video and never the placeholder\n * - For a public browsing page (ie. using a route-prefix) they should see the placeholder\n */\n return LiteRouteHelper.hasRegionPrefix();\n }\n\n function shouldShowTranscript(videoId: string): boolean {\n if (currentUser.data?.isAuthenticated)\n return hasPlayPageTranscript;\n\n if (!videoId)\n return false;\n\n return HardCoded.PublicTranscriptVideoIds.includes(videoId);\n }\n\n return {\n canViewGlance: hasPermissions(PermissionName.ViewVideoGlance),\n canViewResources: true,\n canViewInteractives: hasNP && hasPermissions(PermissionName.ViewVideoInteractives),\n canViewClips: hasNP && hasPermissions(PermissionName.ViewVideoClips),\n canViewCurriculumLinks: hasPermissions(PermissionName.ViewCurriculums),\n canUseActions: hasLocalPermissions(LocalPermissionName.UseVideoActions),\n canViewPublicLayout: showPublicLayout(),\n canViewResourceItems: hasLocalPermissions(LocalPermissionName.ViewVideoResourceItems),\n canNavigate: hasNP,\n canViewTranscript: shouldShowTranscript(videoId)\n };\n}","import React from 'react';\n\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { Breadcrumb, Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { VideoList } from 'libs/shared/components/video-list/VideoList';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { RelatedVideosContext } from 'libs/shared/enums/RelatedVideosContext';\nimport { handleHttpError } from 'libs/shared/errors/handlers/HttpErrorHandlers';\nimport { ClipRequests } from 'libs/shared/flight-requests/ClipRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useInfiniteList } from 'libs/shared/hooks/UseInfiniteList';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Clip, CurrentUser } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { useCommonVideoProps } from 'shared/hooks/useCommonVideoProps';\nimport { usePresentationAudiences } from 'shared/hooks/usePresentationAudiences';\nimport { useVideoFeatureAccess } from 'shared/hooks/useVideoFeatureAccess';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\nimport { VideoMediaAppLinks } from 'shared/views/video-media/VideoMediaAppLinks';\n\nimport { PartialVideoMediaView } from './partial-loading/PartialVideoMediaView';\n\nconst namespace = 'shared.videoMedia';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ClipClipsViewProps {\n clipId: string;\n}\n\nexport function ClipClipsView(props: ClipClipsViewProps): JSX.Element {\n const { clipId } = props;\n const fetch = Flight.useGetFetch();\n const alerts = useAlerts();\n\n const {\n commonVideoProps,\n hasCommonVideoPropsCompleted\n } = useCommonVideoProps({ locationContext: LocationContext.VideoThumbnail });\n \n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem });\n const featureAccess = useVideoFeatureAccess();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const clip = Flight.useBasicFetch<Clip>(ClipRequests.clip(clipId));\n const parentVideoId = clip.data?._parentVideo?.id;\n\n useSetPageMetadata({\n title: clip.data ? getPhrase('otherClipsViewPageTitle', { video: clip.data?.name }) : ''\n });\n\n function getClipsRequest(cursor?: string) {\n return ClipRequests.videoClips(parentVideoId, null, cursor);\n }\n\n function fetchNext(cursor?: string) {\n return fetch(getClipsRequest(cursor));\n }\n\n function onError(pageNumber: number, httpStatus: HttpStatus): void {\n if (pageNumber === 1)\n return handleHttpError(httpStatus);\n\n alerts.error(LanguageService.getPhrase(namespace, 'errorClips'));\n }\n\n const { items: clips, hasMore, isFetching } = useInfiniteList<Clip>(\n featureAccess.canViewClips && parentVideoId ? getClipsRequest : false,\n fetchNext,\n onError\n );\n\n const title = getPhrase('otherClipsHeading');\n\n const audiences = usePresentationAudiences();\n const { hasPermissions } = usePermissions();\n\n const breadcrumbs: Breadcrumb[] = [{\n name: clip.data?.name,\n appLink: {\n ...VideoMediaAppLinks.playClip,\n args: [ clipId, TextHelper.slugify(clip.data?.name) ]\n }\n }, {\n name: title,\n appLink: {\n application: AppChannels.CLIPS,\n action: Actions.Clips.CLIP_CLIPS,\n args: [ clipId, TextHelper.slugify(clip.data?.name) ]\n },\n active: true\n }];\n\n function redirectToPlaypage(): void {\n Core.AppLinkHelper.trigger({\n ...VideoMediaAppLinks.playClip,\n args: [ clipId, TextHelper.slugify(clip.data?.name) ]\n }, { replace: true });\n }\n\n React.useEffect(() => {\n if (!featureAccess.canViewClips) {\n redirectToPlaypage();\n }\n }, [featureAccess.canViewClips]);\n\n if (!clip.data || !clips?.length || !hasCommonVideoPropsCompleted)\n return <PartialVideoMediaView />;\n\n return (\n <VideoActionsContext.Provider value={videoActions}>\n <div className='px-3'>\n <h1 className='h2 mb-2'>{title}</h1>\n \n <div className='mb-2'>\n <Breadcrumbs breadcrumbs={breadcrumbs}/>\n </div>\n\n <VideoList\n videos={clips}\n getVideoAppLink={(video, opts) => VideoAppLinkHelper.getAppLink(video, {\n ...opts,\n context: RelatedVideosContext.Widget,\n contextId: props.clipId,\n includeContext: currentUser.data?.isAuthenticated\n })}\n hasPermissions={hasPermissions}\n presentationAudiences={audiences.data}\n showOwner\n commonVideoProps={commonVideoProps}\n />\n {(hasMore || isFetching) && (\n <InfiniteScrollFooter isFetching={isFetching} fetchNext={fetchNext} />\n )}\n </div>\n </VideoActionsContext.Provider>\n );\n}","\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nexport const VideoMediaAppLinks = {\n playVideo: {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PLAY_VIDEO\n },\n playClip: {\n application: AppChannels.CLIPS,\n action: Actions.Clips.PLAY_CLIP\n }\n};","// extracted by mini-css-extract-plugin\nexport default {\"partialHeading\":\"okxfx\"};","import React from 'react';\n\nimport { PartialBreadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { PartialVideoList } from 'libs/shared/components/video-list/partial-loading/PartialVideoList';\n\nimport styles from './partial-video-media-view.scss';\n\n// eslint-disable-next-line rulesdir/require-view-title\nexport function PartialVideoMediaView(): JSX.Element {\n return (\n <div className='px-3'>\n <div className={`partial-loading-background mb-2 ${styles.partialHeading}`} />\n <div className='mb-2'>\n <PartialBreadcrumbs/>\n </div>\n <PartialVideoList />\n </div>\n );\n}"],"names":["defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","internalServerError","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","SCROLL_TOLERANCE","useInfiniteList","getRequest","fetchNext","onError","getItems","getCursor","scrollContainer","options","handleScroll","useState","pagesFetched","setPagesFetched","fetchNextFn","response","cursor","request","key","fetchNextPage","currentVal","nextCursor","hasMore","isFetching","getBoundingClientRect","height","scrollTop","scrollHeight","window","innerHeight","document","documentElement","useEffect","onScroll","FunctionHelper","addEventListener","removeEventListener","shouldInitialFetch","httpStatusClass","toString","substr","HttpStatus","items","totalItems","hasFirstPageCompleted","useCommonVideoProps","locationContext","mtv","flightNamespace","sharedPlaylist","isPlugin","u","setFavourite","canFavourite","hasTopicDirectories","isLoadingSettings","hasPermissions","hasLoadedPermissions","isLoaded","hasStudentExperience","config","currentUser","yearGroups","data","isAuthenticated","customerId","hasCommonVideoPropsCompleted","hasCompleted","commonVideoProps","subTextType","getSubTextAppLink","video","series","imageCdnUrl","getClassroomGuideAppLink","getInteractiveGuidanceAppLink","getResourceGuidanceAppLink","showNewVideoIndicator","companyLogoFallbackUrl","usePresentationAudiences","redirectOnError","activePresentation","getFallbackPresentation","presentation","id","useVideoFeatureAccess","videoId","hasLocalPermissions","hasProduct","hasPlayPageTranscript","hasNP","canViewGlance","canViewResources","canViewInteractives","canViewClips","canViewCurriculumLinks","canUseActions","canViewPublicLayout","canViewResourceItems","canNavigate","canViewTranscript","shouldShowTranscript","namespace","getPhrase","ClipClipsView","props","clipId","fetch","alerts","videoActions","location","featureAccess","clip","parentVideoId","_parentVideo","getClipsRequest","title","name","pageNumber","httpStatus","error","clips","audiences","breadcrumbs","appLink","args","application","action","active","replace","redirectToPlaypage","length","value","className","videos","getVideoAppLink","opts","context","contextId","includeContext","presentationAudiences","showOwner","VideoMediaAppLinks","playVideo","playClip","PartialVideoMediaView","PartialVideoList"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[8891],{94644:(e,t,n)=>{n.d(t,{r:()=>u});var i=n(50242),r=n(81886),a=n(67058),o=n(14553),s=n(49267),l=n(49075),c={notFound:a.d,forbidden:{rating:o.q,yearLevel:o.q,region:s.a,privacy:o.q},badRequest:l._,internalServerError:l._};function u(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e){var a;a="number"==typeof e?e:e.status;var o=Object.assign(Object.assign({},c),t);a&&r.Q.Ry.isStatusCodeError(a)&&(a!==i.o.InternalServer?a!==i.o.NotFound?a!==i.o.Forbidden?n.badRequest||r.Q.Ry.throw(new o.badRequest):n.forbidden||r.Q.Ry.throw(new o.forbidden.privacy):n.notFound||r.Q.Ry.throw(new o.notFound):n.internalServerError||r.Q.Ry.throw(new l._))}}},60115:(e,t,n)=>{n.d(t,{K:()=>c});var i=n(32735),r=n(50242),a=n(91967),o=400,s=n(45719);function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,i=Array(t);n<t;n++)i[n]=e[n];return i}function c(e,t,n,c,u,d){var v,p,m,h,f=(v=(0,i.useState)(0),p=2,function(e){if(Array.isArray(e))return e}(v)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var i,r,a,o,s=[],l=!0,c=!1;try{if(a=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(i=a.call(n)).done)&&(s.push(i.value),s.length!==t);l=!0);}catch(e){c=!0,r=e}finally{try{if(!l&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(c)throw r}}return s}}(v,p)||function(e,t){if(e){if("string"==typeof e)return l(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?l(e,t):void 0}}(v,p)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),g=f[0],C=f[1],b=t,w=(0,s.P)((function(t){if(!e)return null;var n=e(t);return n?n.key:null}),c,u);return m={fetchNextPage:function(){if(t&&e&&w)return C((function(e){return e+1})),b(w.nextCursor)},hasMore:!!(null==w?void 0:w.nextCursor),isFetching:null==w?void 0:w.isFetching,scrollContainer:d},h=function(){if(!m.isFetching){if(m.scrollContainer){var e=m.scrollContainer;if(e.getBoundingClientRect().height+e.scrollTop<e.scrollHeight-o)return}else if(window.innerHeight+document.documentElement.scrollTop<document.documentElement.scrollHeight-o)return;m.fetchNextPage()}},(0,i.useEffect)((function(){var e=a.q.throttle(h,200),t=m.scrollContainer||window;return m.hasMore&&t.addEventListener("scroll",e),function(){return t.removeEventListener("scroll",e)}}),[m.hasMore,m.fetchNextPage,m.scrollContainer]),(0,i.useEffect)((function(){w&&w.shouldInitialFetch&&t&&(b(),C((function(e){return e+1})))}),[null==w?void 0:w.shouldInitialFetch,t]),(0,i.useEffect)((function(){var e,t;if((null==w?void 0:w.statusCode)&&a.q.isFunction(n)){var i=+(null===(t=null===(e=w.statusCode)||void 0===e?void 0:e.toString())||void 0===t?void 0:t.substr(0,1));i!==r.k.ClientError&&i!==r.k.ServerError||n(g,w.statusCode)}}),[null==w?void 0:w.statusCode]),{items:null==w?void 0:w.items,hasMore:!!(null==w?void 0:w.nextCursor),nextCursor:null==w?void 0:w.nextCursor,isFetching:null==w?void 0:w.isFetching,totalItems:null==w?void 0:w.totalItems,hasFirstPageCompleted:null==w?void 0:w.hasFirstPageCompleted}}},58321:(e,t,n)=>{n.d(t,{U:()=>m});var i=n(20354),r=n(16714),a=n(39151),o=n(1666),s=n(31949),l=n(22902),c=n(37802),u=n(22490),d=n(82431),v=n(46390),p=n(27638);function m(e){var t,n,m,h=e||{},f=h.locationContext,g=h.mtv,C=h.flightNamespace,b=h.sharedPlaylist,w=(0,v.G)().isPlugin,y=(0,p.u)(f,C),V=y.setFavourite,P=y.canFavourite,E=(0,c.r)(null),I=E.hasTopicDirectories,F=E.isLoadingSettings,L=(0,l.T)(),A=L.hasPermissions,k=L.isLoaded,x=A(r.C.StudentExperience),S=i.a.useBasicFetch(a.L.config()),O=i.a.useBasicFetch(s.N.currentUser()),N=i.a.useBasicFetch((null===(t=O.data)||void 0===t?void 0:t.isAuthenticated)&&o.h.yearGroups(O.data.customerId));return{hasCommonVideoPropsCompleted:!F&&k&&S.hasCompleted&&O.hasCompleted&&(!(null===(n=O.data)||void 0===n?void 0:n.isAuthenticated)||N.hasCompleted),commonVideoProps:{subTextType:"series",getSubTextAppLink:function(e){var t;return"series"in e?b&&!(null===(t=O.data)||void 0===t?void 0:t.isAuthenticated)?null:d.j.getSeriesAppLink(e.series,{mtv:g}):null},isPlugin:w,canFavourite:P,setFavourite:V,imageCdnUrl:null===(m=S.data)||void 0===m?void 0:m.imageCdnUrl,yearGroups:N.data,getClassroomGuideAppLink:u.W.getClassroomGuideAppLink,getInteractiveGuidanceAppLink:u.W.getInteractiveGuidanceAppLink,getResourceGuidanceAppLink:u.W.getResourceGuidanceAppLink,showNewVideoIndicator:I,companyLogoFallbackUrl:null,hasStudentExperience:x}}}},44110:(e,t,n)=>{n.d(t,{i:()=>o});var i=n(20354),r=n(89454),a=n(86698),o=function(){var e=(0,a.y)({redirectOnError:!0}),t=e.activePresentation,n=e.getFallbackPresentation,o=t||n();return i.a.useBasicFetch(!!o&&r.O.presentationAudiences(o.id))}},35014:(e,t,n)=>{n.d(t,{I:()=>v});var i=n(20354),r=n(55171),a=n(16714),o=n(12754),s=n(31949),l=n(22902),c=n(15311),u=n(37802),d=n(11387);function v(e){var t=(0,l.T)(),n=t.hasPermissions,v=t.hasLocalPermissions,p=(0,c.r)().hasProduct,m=i.a.useBasicFetch(s.N.currentUser()),h=(0,u.r)(null).hasPlayPageTranscript,f=p(o.x.Primary);return{canViewGlance:n(a.C.ViewVideoGlance),canViewResources:!0,canViewInteractives:f&&n(a.C.ViewVideoInteractives),canViewClips:f&&n(a.C.ViewVideoClips),canViewCurriculumLinks:n(a.C.ViewCurriculums),canUseActions:v(a.E.UseVideoActions),canViewPublicLayout:!v(a.E.WatchVideos)&&d.C.hasRegionPrefix(),canViewResourceItems:v(a.E.ViewVideoResourceItems),canNavigate:f,canViewTranscript:function(e){var t;return(null===(t=m.data)||void 0===t?void 0:t.isAuthenticated)?h:!!e&&r.e.PublicTranscriptVideoIds.includes(e)}(e)}}},28891:(e,t,n)=>{n.r(t),n.d(t,{ClipInteractivesView:()=>T});var i=n(32735),r=n(81886),a=n(23481),o=n(20354),s=n(28400),l=n(65858),c=n(49935),u=n(87801),d=n(75100),v=n(51365),p=n(183),m=n(94644),h=n(43012),f=n(20768),g=n(31949),C=n(69883),b=n(60115),w=n(22902),y=n(79612),V=n(14070),P=n(97291),E=n(10671),I=n(58321),F=n(44110),L=n(35014),A=n(10741),k=n(22490),x=n(98620),S=n(9212),O="shared.videoMedia",N=a.T.encloseNamespace(O);function T(e){var t,n,T,R,j=e.clipId,G=o.a.useGetFetch(),_=(0,C.Z)(),U=(0,I.U)({locationContext:l.LZ.VideoThumbnail}),M=U.commonVideoProps,Q=U.hasCommonVideoPropsCompleted,q=(0,E._)({location:E.i.VideoItem}),B=(0,L.I)(),H=(0,F.i)(),W=(0,w.T)().hasPermissions,Y=o.a.useBasicFetch(g.N.currentUser()),D=o.a.useBasicFetch(B.canViewClips&&h.e.clip(j));function K(e){return f.b.videoInteractives(j,null,e)}function Z(e){return G(K(e))}(0,y.M)({title:D.data?N("clipInteractiveViewPageTitle",{video:null===(t=D.data)||void 0===t?void 0:t.name}):""});var $=(0,b.K)(!!B.canViewInteractives&&K,Z,(function(e,t){if(1===e)return(0,m.r)(t);_.error(a.T.getPhrase(O,"errorInteractives"))})),z=$.items,J=$.hasMore,X=$.isFetching,ee=N("interactivesHeading"),te=[{name:null===(n=D.data)||void 0===n?void 0:n.name,appLink:Object.assign(Object.assign({},x.Y.playClip),{args:[j,s.m.slugify(null===(T=D.data)||void 0===T?void 0:T.name)]})},{name:ee,appLink:{application:P.O.CLIPS,action:V.e.Clips.CLIP_INTERACTIVES,args:[j,s.m.slugify(null===(R=D.data)||void 0===R?void 0:R.name)]},active:!0}];return i.useEffect((function(){B.canViewInteractives||function(){var e;r.Q.C$.trigger(Object.assign(Object.assign({},x.Y.playClip),{args:[j,s.m.slugify(null===(e=D.data)||void 0===e?void 0:e.name)]}),{replace:!0})}()}),[B.canViewInteractives]),D.data&&(null==z?void 0:z.length)&&Q?i.createElement(v.M.Provider,{value:q},i.createElement("div",{className:"px-3"},i.createElement("h1",{className:"h2 mb-2"},ee),i.createElement("div",{className:"mb-2"},i.createElement(c.Oo,{breadcrumbs:te})),i.createElement(d.E4,{videos:z,getVideoAppLink:function(t,n){var i;return k.W.getAppLink(t,Object.assign(Object.assign({},n),{context:p.Q.Widget,contextId:e.clipId,includeContext:null===(i=Y.data)||void 0===i?void 0:i.isAuthenticated}))},hasPermissions:W,presentationAudiences:H.data,getPreviewQuestionsAppLink:function(e){return A.j.getPreviewQuestionsAppLink(e)},showOwner:!0,commonVideoProps:M}),(J||X)&&i.createElement(u._,{isFetching:X,fetchNext:Z}))):i.createElement(S.l,null)}},98620:(e,t,n)=>{n.d(t,{Y:()=>a});var i=n(14070),r=n(97291),a={playVideo:{application:r.O.VIDEOS,action:i.e.Videos.PLAY_VIDEO},playClip:{application:r.O.CLIPS,action:i.e.Clips.PLAY_CLIP}}},9212:(e,t,n)=>{n.d(t,{l:()=>s});var i=n(32735),r=n(49935),a=n(1860);const o={partialHeading:"okxfx"};function s(){return i.createElement("div",{className:"px-3"},i.createElement("div",{className:"partial-loading-background mb-2 ".concat(o.partialHeading)}),i.createElement("div",{className:"mb-2"},i.createElement(r.b2,null)),i.createElement(a.S,null))}}}]);
2
- //# sourceMappingURL=8891-393bb5bdaf-lite.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/8891-393bb5bdaf-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteScroll.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteList.ts","file:///app/packages/projects/lite/src/shared/hooks/useCommonVideoProps.ts","file:///app/packages/projects/lite/src/shared/hooks/usePresentationAudiences.ts","file:///app/packages/projects/lite/src/shared/hooks/useVideoFeatureAccess.ts","file:///app/packages/projects/lite/src/shared/views/video-media/ClipInteractivesView.tsx","file:///app/packages/projects/lite/src/shared/views/video-media/VideoMediaAppLinks.ts","file:///app/packages/projects/lite/src/shared/views/video-media/partial-loading/partial-video-media-view.scss","file:///app/packages/projects/lite/src/shared/views/video-media/partial-loading/PartialVideoMediaView.tsx"],"sourcesContent":["import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n internalServerError?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError,\n internalServerError: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.InternalServer) {\n if (!ignoreMap.internalServerError)\n Core.ErrorHelper.throw(new UnspecifiedError());\n return;\n }\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import { useEffect } from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst SCROLL_TOLERANCE = 400; // value in px\n\ninterface UseInfiniteScrollOptions {\n fetchNextPage: () => void;\n hasMore: boolean;\n isFetching: boolean;\n scrollContainer?: HTMLElement;\n}\n\nexport function useInfiniteScroll(options: UseInfiniteScrollOptions): void {\n const handleScroll = (): void => {\n if (options.isFetching)\n return;\n\n if (!options.scrollContainer) {\n const currentScrollHeight = window.innerHeight + document.documentElement.scrollTop;\n \n const totalHeight = document.documentElement.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n } else {\n const { scrollContainer } = options;\n const currentScrollHeight = scrollContainer.getBoundingClientRect().height + scrollContainer.scrollTop;\n \n const totalHeight = scrollContainer.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n }\n\n options.fetchNextPage();\n };\n\n useEffect(() => {\n const onScroll = FunctionHelper.throttle(handleScroll, 200);\n\n const scrollContainer = options.scrollContainer || window;\n\n if (options.hasMore)\n scrollContainer.addEventListener('scroll', onScroll);\n\n return () => scrollContainer.removeEventListener('scroll', onScroll);\n }, [ options.hasMore, options.fetchNextPage, options.scrollContainer ]);\n}","import { useEffect, useState } from 'react';\n\nimport { HttpStatus, HttpStatusClass } from 'libs/common/backbone/enums/HttpStatus';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { BaseObject, BasePaginatedCollection } from 'libs/shared/interfaces';\n\nimport { useInfiniteScroll } from './UseInfiniteScroll';\nimport { useSelectAllPages } from './UseSelectAllPages';\n\nexport interface UseInfiniteListResult<T extends BaseObject> {\n items: T[];\n hasMore: boolean;\n isFetching: boolean;\n nextCursor: string;\n totalItems?: number;\n hasFirstPageCompleted: boolean;\n}\n\n/**\n * Hook to extract an infinite list from the application state,\n * save it locally in state and only update when new data\n * is fetched.\n * \n * @param getRequest - callback function to get the request for each page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n * \n * @param fetchNext - callback function to fetch a page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n */\nexport function useInfiniteList<TObject = BaseObject, TResponse = BasePaginatedCollection<TObject>>(\n getRequest: ((cursor?: string) => Flight.Request) | false,\n fetchNext: ((cursor?: string) => void) | false,\n onError?: (pageNumber: number, statusCode: HttpStatus) => void,\n getItems?: (responseData: TResponse) => TObject[],\n getCursor?: (responseData: TResponse) => string,\n scrollContainer?: HTMLElement\n): UseInfiniteListResult<TObject> {\n const [ pagesFetched, setPagesFetched ] = useState(0);\n\n const fetchNextFn = fetchNext as (cursor?: string) => void;\n\n function getKey(cursor?: string): string {\n if (!getRequest)\n return null;\n\n const request = getRequest(cursor);\n\n if (!request)\n return null;\n\n return request.key;\n }\n\n const response = useSelectAllPages<TObject, TResponse>(\n getKey,\n getItems,\n getCursor\n );\n\n function fetchNextPage(): void {\n if (!fetchNext || !getRequest || !response)\n return;\n\n setPagesFetched(currentVal => currentVal + 1);\n return fetchNextFn(response.nextCursor);\n }\n\n useInfiniteScroll({\n fetchNextPage,\n hasMore: !!response?.nextCursor,\n isFetching: response?.isFetching,\n scrollContainer\n });\n\n useEffect(() => {\n if (!response)\n return;\n\n if (response.shouldInitialFetch && fetchNext) {\n fetchNextFn();\n setPagesFetched(currentVal => currentVal + 1);\n }\n }, [ response?.shouldInitialFetch, fetchNext ]);\n\n useEffect(() => {\n if (!response?.statusCode || !FunctionHelper.isFunction(onError))\n return;\n\n const httpStatusClass: HttpStatusClass = +(response.statusCode?.toString()?.substr(0, 1));\n\n if (httpStatusClass !== HttpStatusClass.ClientError && httpStatusClass !== HttpStatusClass.ServerError)\n return;\n\n onError(pagesFetched, response.statusCode);\n }, [response?.statusCode]);\n\n return {\n items: response?.items,\n hasMore: !!response?.nextCursor,\n nextCursor: response?.nextCursor,\n isFetching: response?.isFetching,\n totalItems: response?.totalItems,\n hasFirstPageCompleted: response?.hasFirstPageCompleted\n };\n}","import { Core } from 'libs/common/backbone/index';\nimport { Flight } from 'libs/common/react/index';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, CurrentUser, VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\n\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { SeriesAppLinkHelper } from 'apps/series/SeriesAppLinkHelper';\n\nimport { usePluginHelper } from './use-plugin-helper/usePluginHelper';\nimport { useLiteFavourites } from './useLiteFavourites';\n\ninterface UseCommonVideoPropsResult {\n hasCommonVideoPropsCompleted: boolean;\n commonVideoProps: CommonVideoProps;\n}\n\ninterface UseCommonVideoPropsOptions {\n locationContext: LocationContext,\n mtv?: boolean;\n flightNamespace?: string;\n sharedPlaylist?: boolean;\n}\n\nexport function useCommonVideoProps(options: UseCommonVideoPropsOptions): UseCommonVideoPropsResult {\n const { locationContext, mtv, flightNamespace, sharedPlaylist } = options || {};\n\n const { isPlugin } = usePluginHelper();\n const { setFavourite, canFavourite } = useLiteFavourites(locationContext, flightNamespace);\n const { hasTopicDirectories, isLoadingSettings } = useSettings(null);\n const { hasPermissions, isLoaded: hasLoadedPermissions } = usePermissions();\n const hasStudentExperience = hasPermissions(PermissionName.StudentExperience);\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n function getSubTextAppLink(video: VideoTypes): Core.AppLink {\n if (!('series' in video))\n return null;\n\n /**\n * We do not allow navigating to series on shared playlists when the user is not signed in\n * because most series are customer created and will be empty for public users\n * \n * We do not have to do this for shared series, because all the series links are self referencing\n * - Sha\n */\n if (sharedPlaylist && !currentUser.data?.isAuthenticated)\n return null;\n \n return SeriesAppLinkHelper.getSeriesAppLink(video.series, { mtv });\n }\n\n const hasCommonVideoPropsCompleted = (\n !isLoadingSettings &&\n hasLoadedPermissions &&\n config.hasCompleted &&\n currentUser.hasCompleted &&\n (!currentUser.data?.isAuthenticated || yearGroups.hasCompleted)\n );\n\n return {\n hasCommonVideoPropsCompleted,\n commonVideoProps: {\n subTextType: 'series',\n getSubTextAppLink,\n isPlugin,\n canFavourite,\n setFavourite,\n imageCdnUrl: config.data?.imageCdnUrl,\n yearGroups: yearGroups.data,\n getClassroomGuideAppLink: VideoAppLinkHelper.getClassroomGuideAppLink,\n getInteractiveGuidanceAppLink: VideoAppLinkHelper.getInteractiveGuidanceAppLink,\n getResourceGuidanceAppLink: VideoAppLinkHelper.getResourceGuidanceAppLink,\n showNewVideoIndicator: hasTopicDirectories,\n companyLogoFallbackUrl: null,\n hasStudentExperience\n }\n };\n}","import { Flight } from 'libs/common/react/index';\n\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\nimport { usePresentation } from 'shared/hooks/usePresentation';\n\nexport const usePresentationAudiences = () => {\n const { activePresentation, getFallbackPresentation } = usePresentation({ redirectOnError: true });\n\n const presentation = activePresentation || getFallbackPresentation();\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n !!presentation &&\n AudienceRequests.presentationAudiences(presentation.id)\n );\n\n return audiences;\n};","import { Flight } from 'libs/common/react/index';\n\nimport { HardCoded } from 'libs/shared/constants/HardCoded';\nimport { LocalPermissionName, PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { CurrentUser } from 'libs/shared/interfaces';\n\nimport { LiteRouteHelper } from 'shared/utils/LiteRouteHelper';\n\nexport interface VideoFeaturesHash {\n canViewGlance: boolean;\n canViewResources: boolean;\n canViewInteractives: boolean;\n canViewClips: boolean;\n canUseActions: boolean;\n canViewPublicLayout: boolean;\n canNavigate: boolean;\n canViewCurriculumLinks: boolean;\n canViewResourceItems: boolean;\n canViewTranscript: boolean;\n}\n\nexport function useVideoFeatureAccess(videoId?: string) {\n const { hasPermissions, hasLocalPermissions } = usePermissions();\n const { hasProduct } = useProducts();\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const { hasPlayPageTranscript } = useSettings(null);\n\n const hasNP = hasProduct(ProductId.Primary);\n\n function showPublicLayout(): boolean {\n /**\n * Authenticated users should never see the placeholder\n */\n if (hasLocalPermissions(LocalPermissionName.WatchVideos))\n return false;\n\n /**\n * Accessing a play page unathenticated will have different contextual behabviours:\n * - For a share page, the user should see the video and never the placeholder\n * - For a public browsing page (ie. using a route-prefix) they should see the placeholder\n */\n return LiteRouteHelper.hasRegionPrefix();\n }\n\n function shouldShowTranscript(videoId: string): boolean {\n if (currentUser.data?.isAuthenticated)\n return hasPlayPageTranscript;\n\n if (!videoId)\n return false;\n\n return HardCoded.PublicTranscriptVideoIds.includes(videoId);\n }\n\n return {\n canViewGlance: hasPermissions(PermissionName.ViewVideoGlance),\n canViewResources: true,\n canViewInteractives: hasNP && hasPermissions(PermissionName.ViewVideoInteractives),\n canViewClips: hasNP && hasPermissions(PermissionName.ViewVideoClips),\n canViewCurriculumLinks: hasPermissions(PermissionName.ViewCurriculums),\n canUseActions: hasLocalPermissions(LocalPermissionName.UseVideoActions),\n canViewPublicLayout: showPublicLayout(),\n canViewResourceItems: hasLocalPermissions(LocalPermissionName.ViewVideoResourceItems),\n canNavigate: hasNP,\n canViewTranscript: shouldShowTranscript(videoId)\n };\n}","import React from 'react';\n\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { Breadcrumb, Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { VideoList } from 'libs/shared/components/video-list/VideoList';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { RelatedVideosContext } from 'libs/shared/enums/RelatedVideosContext';\nimport { handleHttpError } from 'libs/shared/errors/handlers/HttpErrorHandlers';\nimport { ClipRequests } from 'libs/shared/flight-requests/ClipRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useInfiniteList } from 'libs/shared/hooks/UseInfiniteList';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Clip, CurrentUser, InteractiveMetadata } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { useCommonVideoProps } from 'shared/hooks/useCommonVideoProps';\nimport { usePresentationAudiences } from 'shared/hooks/usePresentationAudiences';\nimport { useVideoFeatureAccess } from 'shared/hooks/useVideoFeatureAccess';\nimport { InteractiveHelpers } from 'shared/utils/InteractiveHelper';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\nimport { VideoMediaAppLinks } from 'shared/views/video-media/VideoMediaAppLinks';\n\nimport { PartialVideoMediaView } from './partial-loading/PartialVideoMediaView';\n\nconst namespace = 'shared.videoMedia';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ClipInteractivesViewProps {\n clipId: string;\n}\n\nexport function ClipInteractivesView(props: ClipInteractivesViewProps): JSX.Element {\n const { clipId } = props;\n const fetch = Flight.useGetFetch();\n const alerts = useAlerts();\n\n const {\n commonVideoProps,\n hasCommonVideoPropsCompleted\n } = useCommonVideoProps({ locationContext: LocationContext.VideoThumbnail });\n \n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem });\n const featureAccess = useVideoFeatureAccess();\n const audiences = usePresentationAudiences();\n const { hasPermissions } = usePermissions();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const clip = Flight.useBasicFetch<Clip>(featureAccess.canViewClips && ClipRequests.clip(clipId));\n\n useSetPageMetadata({\n title: clip.data ? getPhrase('clipInteractiveViewPageTitle', { video: clip.data?.name }) : ''\n });\n \n function getInteractivesRequest(cursor?: string) {\n return InteractiveRequests.videoInteractives(clipId, null, cursor);\n }\n\n function fetchNext(cursor?: string) {\n return fetch(getInteractivesRequest(cursor));\n }\n\n function onError(pageNumber: number, httpStatus: HttpStatus): void {\n if (pageNumber === 1)\n return handleHttpError(httpStatus);\n\n alerts.error(LanguageService.getPhrase(namespace, 'errorInteractives'));\n }\n\n const { items: interactives, hasMore, isFetching } = useInfiniteList<InteractiveMetadata>(\n featureAccess.canViewInteractives ? getInteractivesRequest : false,\n fetchNext,\n onError\n );\n\n const title = getPhrase('interactivesHeading');\n\n const breadcrumbs: Breadcrumb[] = [{\n name: clip.data?.name,\n appLink: {\n ...VideoMediaAppLinks.playClip,\n args: [ clipId, TextHelper.slugify(clip.data?.name) ]\n }\n }, {\n name: title,\n appLink: {\n application: AppChannels.CLIPS,\n action: Actions.Clips.CLIP_INTERACTIVES,\n args: [ clipId, TextHelper.slugify(clip.data?.name) ]\n },\n active: true\n }];\n\n function redirectToPlaypage(): void {\n Core.AppLinkHelper.trigger({\n ...VideoMediaAppLinks.playClip,\n args: [ clipId, TextHelper.slugify(clip.data?.name) ]\n }, { replace: true });\n }\n\n React.useEffect(() => {\n if (!featureAccess.canViewInteractives) {\n redirectToPlaypage();\n }\n }, [featureAccess.canViewInteractives]);\n\n if (!clip.data || !interactives?.length || !hasCommonVideoPropsCompleted)\n return <PartialVideoMediaView />;\n\n return (\n <VideoActionsContext.Provider value={videoActions}>\n <div className='px-3'>\n <h1 className='h2 mb-2'>{title}</h1>\n \n <div className='mb-2'>\n <Breadcrumbs breadcrumbs={breadcrumbs}/>\n </div>\n\n <VideoList\n videos={interactives}\n getVideoAppLink={(video, opts) => VideoAppLinkHelper.getAppLink(video, {\n ...opts,\n context: RelatedVideosContext.Widget,\n contextId: props.clipId,\n includeContext: currentUser.data?.isAuthenticated\n })}\n hasPermissions={hasPermissions}\n presentationAudiences={audiences.data}\n getPreviewQuestionsAppLink={interactive => InteractiveHelpers.getPreviewQuestionsAppLink(interactive)}\n showOwner\n commonVideoProps={commonVideoProps}\n />\n {(hasMore || isFetching) && (\n <InfiniteScrollFooter isFetching={isFetching} fetchNext={fetchNext} />\n )}\n </div>\n </VideoActionsContext.Provider>\n );\n}","\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nexport const VideoMediaAppLinks = {\n playVideo: {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PLAY_VIDEO\n },\n playClip: {\n application: AppChannels.CLIPS,\n action: Actions.Clips.PLAY_CLIP\n }\n};","// extracted by mini-css-extract-plugin\nexport default {\"partialHeading\":\"okxfx\"};","import React from 'react';\n\nimport { PartialBreadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { PartialVideoList } from 'libs/shared/components/video-list/partial-loading/PartialVideoList';\n\nimport styles from './partial-video-media-view.scss';\n\n// eslint-disable-next-line rulesdir/require-view-title\nexport function PartialVideoMediaView(): JSX.Element {\n return (\n <div className='px-3'>\n <div className={`partial-loading-background mb-2 ${styles.partialHeading}`} />\n <div className='mb-2'>\n <PartialBreadcrumbs/>\n </div>\n <PartialVideoList />\n </div>\n );\n}"],"names":["defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","internalServerError","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","SCROLL_TOLERANCE","useInfiniteList","getRequest","fetchNext","onError","getItems","getCursor","scrollContainer","options","handleScroll","useState","pagesFetched","setPagesFetched","fetchNextFn","response","cursor","request","key","fetchNextPage","currentVal","nextCursor","hasMore","isFetching","getBoundingClientRect","height","scrollTop","scrollHeight","window","innerHeight","document","documentElement","useEffect","onScroll","FunctionHelper","addEventListener","removeEventListener","shouldInitialFetch","httpStatusClass","toString","substr","HttpStatus","items","totalItems","hasFirstPageCompleted","useCommonVideoProps","locationContext","mtv","flightNamespace","sharedPlaylist","isPlugin","u","setFavourite","canFavourite","hasTopicDirectories","isLoadingSettings","hasPermissions","hasLoadedPermissions","isLoaded","hasStudentExperience","config","currentUser","yearGroups","data","isAuthenticated","customerId","hasCommonVideoPropsCompleted","hasCompleted","commonVideoProps","subTextType","getSubTextAppLink","video","series","imageCdnUrl","getClassroomGuideAppLink","getInteractiveGuidanceAppLink","getResourceGuidanceAppLink","showNewVideoIndicator","companyLogoFallbackUrl","usePresentationAudiences","redirectOnError","activePresentation","getFallbackPresentation","presentation","id","useVideoFeatureAccess","videoId","hasLocalPermissions","hasProduct","hasPlayPageTranscript","hasNP","canViewGlance","canViewResources","canViewInteractives","canViewClips","canViewCurriculumLinks","canUseActions","canViewPublicLayout","canViewResourceItems","canNavigate","canViewTranscript","shouldShowTranscript","namespace","getPhrase","ClipInteractivesView","props","clipId","fetch","alerts","videoActions","location","featureAccess","audiences","clip","getInteractivesRequest","title","name","pageNumber","httpStatus","error","interactives","breadcrumbs","appLink","args","application","action","active","replace","redirectToPlaypage","length","value","className","videos","getVideoAppLink","opts","context","contextId","includeContext","presentationAudiences","getPreviewQuestionsAppLink","interactive","showOwner","VideoMediaAppLinks","playVideo","playClip","PartialVideoMediaView","PartialVideoList"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[8982],{81803:(e,t,n)=>{n.d(t,{d:()=>f});var r=n(32735),a=n(81886),i=n(23481),c=n(49935),s=n(22902),l=n(14070),o=n(97291),u=n(96368);function m(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var p="settings.settingsLayout",d=function(e){var t=(0,s.T)().hasPermissions,n=(0,u.e)();if(e)return t(e);var r=a.Q.C$.getCurrentAppLink();return r.application!==o.O.SETTINGS||n.some((function(e){return e.modules.some((function(e){return"appLink"in e&&e.appLink.action===r.action}))}))};function f(e){var t,n=d(e.requiredPermissions);if(r.useEffect((function(){n||a.Q.C$.trigger({application:o.O.SETTINGS,action:l.e.Settings.HOME},{replace:!0})}),[n]),!n)return r.createElement(r.Fragment,null);var s,u=e.breadcrumbs.map((function(t,n){return{name:t,appLink:{application:o.O.SETTINGS,action:l.e.Settings.HOME},active:n===e.breadcrumbs.length-1}}));return r.createElement("div",{className:"px-3"},r.createElement("div",{className:"d-flex align-items-center justify-content-between"},r.createElement("h1",{className:"h2"},e.heading),null===(t=e.headingButton)||void 0===t?void 0:t.call(e)),r.createElement("div",{className:"pb-3"},r.createElement(c.Oo,{breadcrumbs:[{name:i.T.getPhrase(p,"settingsBreadcrumb"),appLink:{application:o.O.SETTINGS,action:l.e.Settings.HOME}}].concat((s=u,function(e){if(Array.isArray(e))return m(e)}(s)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(s)||function(e,t){if(e){if("string"==typeof e)return m(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?m(e,t):void 0}}(s)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()))})),e.description&&r.createElement(r.Fragment,null,r.createElement("p",null,e.description),r.createElement("hr",null)),e.children)}},58982:(e,t,n)=>{n.r(t),n.d(t,{SearchSettingsView:()=>v});var r=n(32735),a=n(23481),i=n(20354),c=n(65858),s=n(83345),l=n(83523),o=n(77963),u=n(65728),m=n(39151),p=n(31949),d=n(69883),f=n(79612),g=n(37802),h=n(81803),E="settings.searchSettings",b=a.T.encloseNamespace(E);function v(){(0,f.M)({title:b("pageTitle")});var e=i.a.useBasicFetch(m.L.config()),t=i.a.useBasicFetch(p.N.currentUser()),n=(0,g.r)(c.LZ.Settings),a=n.showExchangeSearchResults,v=n.isLoadingSettings,S=n.updateSetting,y=(0,d.Z)();return t.data&&e.data&&!v?r.createElement(h.d,{heading:b("heading"),breadcrumbs:[b("heading")]},r.createElement("div",{className:"w-50"},r.createElement("div",{className:"d-flex justify-content-between"},r.createElement("p",{className:"fw-semibold mb-1"},r.createElement(s.x,{namespace:E,phrase:"label"})),r.createElement(l.Z,{onClick:function(){var e={name:u.E.ShowExchangeSearchResultsUser,value:!a,kind:o.g.Temporary};S(t.data.id,e,(function(){y.success(b("success"))}),(function(){y.error(b("error"))}))},on:a})),r.createElement("p",{className:"mb-2"},r.createElement(s.x,{namespace:E,phrase:"description"})))):r.createElement(r.Fragment,null)}}}]);
2
- //# sourceMappingURL=8982-8c21fab48a-lite.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/8982-8c21fab48a-lite.chunk.js","mappings":"sUAcA,IAAMA,EAAY,0BAKLC,EAAuB,SAACC,GACnC,IAAQC,GAAmB,SAAnBA,eACFC,GAAiB,SAOvB,GAAIF,EACF,OAAOC,EAAeD,GAExB,IAAMG,EAAe,2BAOrB,OAAIA,EAAaC,cAAgB,cAG1BF,EAAeG,MAAK,SAAAC,GACzB,OAAOA,EAAMC,QAAQF,MAAK,SAAAG,GACxB,MAAI,YAAaA,GACRA,EAAeC,QAAQC,SAAWP,EAAaO,MAI1D,GACF,GACF,EAUM,SAAUC,EAAeC,G,MACvBC,EAAYd,EAAqBa,EAAMZ,qBAW7C,GATA,aAAgB,WACTa,GACH,eAA2B,CACzBT,YAAa,aACbM,OAAQ,mBACP,CAAEI,SAAS,GAElB,GAAG,CAACD,KAECA,EACH,OAAO,iCAET,I,EAAME,EAAcH,EAAMG,YAAYC,KAAI,SAACC,EAAMC,GAAC,MAAM,CACtDD,KAAAA,EACAR,QAAS,CACPL,YAAa,aACbM,OAAQ,mBAEVS,OAAQD,IAAMN,EAAMG,YAAYK,OAAS,EAC1C,IAED,OACE,uBAAKC,UAAU,QACb,uBAAKA,UAAU,qDACb,sBAAIA,UAAU,MAAMT,EAAMU,SACN,QAAnB,EAAAV,EAAMW,qBAAa,wBAEtB,uBAAKF,UAAU,QACb,gBAAC,KAAW,CACVN,YAAW,CACT,CACEE,KAAM,cAA0BnB,EAAW,sBAC3CW,QAAS,CACPL,YAAa,aACbM,OAAQ,qBAEX,Q,EACEK,E,wmBAIRH,EAAMY,aACL,gCACE,yBAAIZ,EAAMY,aACV,4BAIHZ,EAAMa,SAGb,C,yNC9FM3B,EAAY,0BACZ4B,EAAY,qBAAiC5B,GAE7C,SAAU6B,KACd,OAAmB,CAAEC,MAAOF,EAAU,eAEtC,IAAMG,EAAS,kBAA6B,cACtCC,EAAc,kBAAkC,mBACtD,GAAwE,OAAY,eAA5EC,EAAyB,EAAzBA,0BAA2BC,EAAiB,EAAjBA,kBAAmBC,EAAa,EAAbA,cAEhDC,GAAS,SAqBf,OACGJ,EAAYK,MACZN,EAAOM,OACRH,EAKA,gBAAC,IAAc,CACbV,QAASI,EAAU,WACnBX,YAAa,CAACW,EAAU,aAExB,uBAAKL,UAAU,QACb,uBAAKA,UAAU,kCACb,qBAAGA,UAAU,oBAAmB,gBAAC,IAAI,CAACvB,UAAWA,EAAWsC,OAAO,WAEnE,gBAAC,IAAY,CACXC,QApCV,WACE,IAAMC,EAAa,CACjBrB,KAAM,kCACNsB,OAAQR,EACRS,KAAM,eAGRP,EACEH,EAAYK,KAAKM,GACjBH,GACA,WACEJ,EAAOQ,QAAQhB,EAAU,WAC3B,IACA,WACEQ,EAAOS,MAAMjB,EAAU,SACzB,GAEJ,EAoBUkB,GAAIb,KAIR,qBAAGV,UAAU,QAAO,gBAAC,IAAI,CAACvB,UAAWA,EAAWsC,OAAO,mBAjBpD,gCAsBX,C","sources":["file:///app/packages/projects/lite/src/apps/settings/components/settings-layout/SettingsLayout.tsx","file:///app/packages/projects/lite/src/apps/settings/views/search-settings/SearchSettingsView.tsx"],"sourcesContent":["import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { useGetSettingsGroups } from 'apps/settings/hooks/useGetSettingsGroups';\n\nconst namespace = 'settings.settingsLayout';\n\n/**\n * Checks if the current user has permission to access the settings module\n */\nexport const useCanAccessSettings = (requiredPermissions: PermissionName | PermissionName[]): boolean => {\n const { hasPermissions } = usePermissions();\n const settingsGroups = useGetSettingsGroups();\n\n /**\n * TODO: Update all settings pages to pasas required permissions, because checking the \n * `useGetSettingsGroups()` values clearly doesnt work for settings pages with multiple\n * applinks inside of them. - Sha\n */\n if (requiredPermissions)\n return hasPermissions(requiredPermissions);\n\n const currentRoute = Core.AppLinkHelper.getCurrentAppLink();\n\n /**\n * Allows us to have popups sitting in other locations be used\n * by our settings pages. For example the manage video access popup\n * in the \"videos with restricted access\" page - Sha\n */\n if (currentRoute.application !== AppChannels.SETTINGS)\n return true;\n\n return settingsGroups.some(group => {\n return group.modules.some(settingsModule => {\n if ('appLink' in settingsModule) {\n return settingsModule.appLink.action === currentRoute.action;\n }\n\n return false;\n });\n });\n};\n\ninterface SettingsLayoutProps {\n heading: string;\n breadcrumbs: string[];\n description?: string;\n requiredPermissions?: PermissionName | PermissionName[];\n headingButton?: () => JSX.Element;\n}\n\nexport function SettingsLayout(props: React.PropsWithChildren<SettingsLayoutProps>): JSX.Element {\n const canAccess = useCanAccessSettings(props.requiredPermissions);\n\n React.useEffect(() => {\n if (!canAccess) {\n Core.AppLinkHelper.trigger({\n application: AppChannels.SETTINGS,\n action: Actions.Settings.HOME\n }, { replace: true });\n }\n }, [canAccess]);\n\n if (!canAccess)\n return <></>;\n\n const breadcrumbs = props.breadcrumbs.map((name, i) => ({\n name,\n appLink: {\n application: AppChannels.SETTINGS,\n action: Actions.Settings.HOME\n },\n active: i === props.breadcrumbs.length - 1\n }));\n\n return (\n <div className='px-3'>\n <div className='d-flex align-items-center justify-content-between'>\n <h1 className='h2'>{props.heading}</h1>\n {props.headingButton?.()}\n </div>\n <div className='pb-3'>\n <Breadcrumbs\n breadcrumbs={[\n {\n name: LanguageService.getPhrase(namespace, 'settingsBreadcrumb'),\n appLink: {\n application: AppChannels.SETTINGS,\n action: Actions.Settings.HOME\n }\n },\n ...breadcrumbs\n ]}\n />\n </div>\n {props.description &&\n <>\n <p>{props.description}</p>\n <hr />\n </>\n }\n\n {props.children}\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\nimport { SettingKind } from 'libs/shared/enums/SettingKind';\nimport { SettingName } from 'libs/shared/enums/SettingName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, CurrentUser } from 'libs/shared/interfaces';\n\nimport { SettingsLayout } from 'apps/settings/components/settings-layout/SettingsLayout';\n\nconst namespace = 'settings.searchSettings';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function SearchSettingsView(): React.ReactElement {\n useSetPageMetadata({ title: getPhrase('pageTitle') });\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const { showExchangeSearchResults, isLoadingSettings, updateSetting } = useSettings(LocationContext.Settings);\n\n const alerts = useAlerts();\n\n function onToggle() {\n const newSetting = {\n name: SettingName.ShowExchangeSearchResultsUser,\n value: !showExchangeSearchResults,\n kind: SettingKind.Temporary\n };\n\n updateSetting(\n currentUser.data.id,\n newSetting,\n () => {\n alerts.success(getPhrase('success'));\n },\n () => {\n alerts.error(getPhrase('error'));\n }\n );\n }\n\n if (\n !currentUser.data ||\n !config.data ||\n isLoadingSettings\n )\n return <></>;\n\n return (\n <SettingsLayout\n heading={getPhrase('heading')}\n breadcrumbs={[getPhrase('heading')]}\n >\n <div className='w-50'>\n <div className='d-flex justify-content-between'>\n <p className='fw-semibold mb-1'><Text namespace={namespace} phrase='label' /></p>\n \n <ToggleSwitch\n onClick={onToggle}\n on={showExchangeSearchResults}\n />\n </div>\n\n <p className='mb-2'><Text namespace={namespace} phrase='description' /></p>\n </div>\n \n </SettingsLayout>\n );\n}"],"names":["namespace","useCanAccessSettings","requiredPermissions","hasPermissions","settingsGroups","currentRoute","application","some","group","modules","settingsModule","appLink","action","SettingsLayout","props","canAccess","replace","breadcrumbs","map","name","i","active","length","className","heading","headingButton","description","children","getPhrase","SearchSettingsView","title","config","currentUser","showExchangeSearchResults","isLoadingSettings","updateSetting","alerts","data","phrase","onClick","newSetting","value","kind","id","success","error","on"],"sourceRoot":""}