@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/5135-864055ab0b-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/UseBatchFetch.ts","file:///app/packages/libs/shared/src/hooks/UseHandleObjectError.ts","file:///app/packages/projects/lite/src/apps/interactives/components/play-interactive/PlayInteractive.tsx","file:///app/packages/projects/lite/src/apps/interactives/components/preview-interactive/InteractiveAlertBanner.tsx","file:///app/packages/projects/lite/src/apps/interactives/components/preview-interactive/PreviewInteractive.tsx","file:///app/packages/projects/lite/src/apps/interactives/hooks/interactiveHooks.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/useShouldPreviewInteractive.ts","file:///app/packages/projects/lite/src/shared/hooks/useVideoMixin.ts"],"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 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 { useEffect } from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { handleHttpError, HttpErrorMap, IgnoreHttpErrorMap } from 'libs/shared/errors/handlers/HttpErrorHandlers';\n\nfunction generateCacheKey(flightObjs: Array<Flight.Response<any>>): string {\n return flightObjs.map(obj => obj.statusCode).join(':');\n}\n\n// TODO: Change this to just `useHandleHttpError` and only accept a status code.\nexport function useHandleObjectError(\n _flightObjs: Flight.Response<any> | Array<Flight.Response<any>>,\n customErrors?: HttpErrorMap,\n ignoreErrors?: IgnoreHttpErrorMap\n): void {\n const flightObjs = Array.isArray(_flightObjs) ? _flightObjs : [_flightObjs];\n\n useEffect(() => {\n flightObjs.forEach(obj => {\n handleHttpError(obj.statusCode, customErrors, ignoreErrors);\n });\n }, [ generateCacheKey(flightObjs), customErrors, ignoreErrors ]);\n}","import React from 'react';\nimport { createHtmlPortalNode, OutPortal } from 'react-reverse-portal';\n\nimport { CheckMarkStatus } from 'libs/shared/components/check-mark-button/CheckMarkButton';\nimport { RestrictionPadlock } from 'libs/shared/components/video-list/components/restriction-padlock/RestrictionPadlock';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { Config, CurrentUser, InteractiveMetadata, PlayerViewKey, PresentationAudience, UnionShareObject, YearGroup } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { AuthToken } from 'libs/shared/interfaces/models/AuthToken';\nimport { PlayViewQueryParams } from 'libs/shared/interfaces/query-params/PlayViewQueryParams';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { ArchivedBanner } from 'shared/components/play-page/ArchivedBanner';\nimport { RelatedVideos } from 'shared/components/related-videos/RelatedVideos';\nimport { RelatedVideosHash } from 'shared/hooks/useGetRelatedVideos';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\nimport { LitePlayerView } from 'shared/views/lite-player/LitePlayerView';\n\ninterface PlayInteractiveProps {\n interactive: InteractiveMetadata;\n yearGroups: YearGroup[];\n currentUser: CurrentUser;\n token: AuthToken;\n config: Config;\n audiences: PresentationAudience[];\n queryParams: PlayViewQueryParams;\n viewKey: PlayerViewKey;\n startTime?: string;\n endTime?: string;\n relatedVideos: RelatedVideosHash;\n commonVideoProps: CommonVideoProps;\n\n // Share view only\n shareLink?: UnionShareObject;\n sharerInstanceRegion?: string;\n checkMarkStatus?: CheckMarkStatus;\n\n publicName?: string;\n profileId?: string;\n}\n\nexport function PlayInteractive(props: PlayInteractiveProps): JSX.Element {\n const [ showHeading, setShowHeading ] = React.useState(true);\n\n const isArchived = VideoHelper.isVideoTypeArchived(props.interactive);\n\n const summaryPortalNode = React.useMemo(() => createHtmlPortalNode(), []);\n\n const { hasPermissions } = usePermissions();\n\n const hasStudentExperience = hasPermissions(PermissionName.StudentExperience);\n\n function onShowSummary(showing: boolean): void {\n setShowHeading(!showing);\n }\n\n return (\n <div className='px-3'>\n {isArchived && <ArchivedBanner typeId={props.interactive.typeId} hasStudentExperience />}\n\n <div className='mb-3'>\n <LitePlayerView\n config={props.config}\n video={props.interactive}\n currentUser={props.currentUser}\n shareLink={props.shareLink}\n viewKey={props.viewKey}\n startTime={props.startTime}\n onShowSummary={onShowSummary}\n summaryPortalNode={summaryPortalNode}\n token={props.token}\n publicName={props.publicName}\n profileId={props.profileId}\n />\n </div>\n {/* This wrapping div is here because react seems to not want to play nice\n with adding or removing a node just ahead of an OutPortal */}\n <div>\n {showHeading &&\n <h1 className='h3 d-flex'>\n {props.interactive.name}\n {!hasStudentExperience && (\n <RestrictionPadlock\n tooltipPlacement='right'\n className='ps-1'\n video={props.interactive}\n yearGroups={props.yearGroups}\n />\n )}\n </h1>\n }\n </div>\n <OutPortal node={summaryPortalNode}></OutPortal>\n\n {!hasPermissions(PermissionName.StudentExperience) && (\n <RelatedVideos\n currentVideo={props.interactive}\n currentUser={props.currentUser}\n relatedVideos={props.relatedVideos}\n audiences={props.audiences}\n getVideoAppLink={(v, opts) => VideoAppLinkHelper.getAppLink(v, {\n ...opts,\n context: props.queryParams.context,\n contextId: props.queryParams.contextId,\n playNext: props.queryParams.playNext,\n shareId: props.shareLink?.id,\n moviesAndTv: props.queryParams.mtv,\n includeContext: props.currentUser?.isAuthenticated\n })}\n moviesAndTv={props.queryParams.mtv}\n commonVideoProps={props.commonVideoProps}\n />\n )}\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'interactives.previewInteractive';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InteractiveAlertBannerProps {\n isPreviewPreventScrubbingEnabled: boolean;\n isPreviewingPreventScrubbing: boolean;\n toggleStudentMode: () => void;\n isArchived: boolean;\n}\n\nexport function InteractiveAlertBanner(props: InteractiveAlertBannerProps): JSX.Element {\n return (\n <div className='alert text-dark bg-light-blue px-2 rounded d-flex flex-column flex-lg-row justify-content-between mb-3 align-items-center' role='alert'>\n {!props.isArchived ? <Text phrase='alert' /> : (\n <div className='d-flex align-items-center'>\n <SvgContainer\n svgName={cvSvgLibrary.Archive}\n size={SvgContainerSize.Standard}\n className='me-2 svg-container'\n />\n \n <div className='w-100'>\n <p className='fw-semibold mb-0'>{getPhrase('archivedInfoTitle')}</p>\n <p className='mb-1'>{getPhrase('archivedInfo')}</p>\n </div>\n </div>\n )}\n {props.isPreviewPreventScrubbingEnabled && (\n <Tooltip\n title={getPhrase('previewPreventScrubbingExplain')}\n trigger='hover'\n spanHack\n >\n <div className='d-flex mt-1 mt-lg-0'>\n <div className='me-2'><Text phrase='previewPreventScrubbing'/></div>\n <ToggleSwitch on={props.isPreviewingPreventScrubbing} onClick={props.toggleStudentMode} />\n </div>\n </Tooltip>\n )}\n </div>\n );\n}","import * as React from 'react';\nimport { OutPortal } from 'react-reverse-portal';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { Actions as ActionsComponent } from 'libs/shared/components/actions/Actions';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Breadcrumb, Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { ExpandableText } from 'libs/shared/components/expandable-text/ExpandableText';\nimport { InteractiveWidgetItem } from 'libs/shared/components/play-page/interactives-widget/InteractiveWidgetItem';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { RestrictionPadlock } from 'libs/shared/components/video-list/components/restriction-padlock/RestrictionPadlock';\nimport { FixedWidget } from 'libs/shared/components/widgets/fixed-widget';\nimport { GlobalPlayerConsumer } from 'libs/shared/context/player-context/components/GlobalPlayerConsumer';\nimport { usePlayerContext } from 'libs/shared/context/player-context/PlayerContext';\nimport { CurationStatus } from 'libs/shared/enums/CurationStatus';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { Clip, CurrentUser, Interactive, InteractiveMetadata, PresentationAudience, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { AuthToken } from 'libs/shared/interfaces/models/AuthToken';\nimport { PlayViewQueryParams } from 'libs/shared/interfaces/query-params/PlayViewQueryParams';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { RestrictionBanner } from 'shared/components/play-page/RestrictionBanner';\nimport { RelatedVideos } from 'shared/components/related-videos/RelatedVideos';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { RelatedVideosHash } from 'shared/hooks/useGetRelatedVideos';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { InteractiveAlertBanner } from 'apps/interactives/components/preview-interactive/InteractiveAlertBanner';\nimport { usePreviewPreventInteractive } from 'apps/interactives/hooks/interactiveHooks';\n\nconst namespace = 'interactives.previewInteractive';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface PreviewInteractiveProps {\n sourceVideo: Clip | Video;\n interactive: InteractiveMetadata;\n interactives: InteractiveMetadata[];\n token?: AuthToken;\n currentUser: CurrentUser;\n queryParams: PlayViewQueryParams;\n audiences: PresentationAudience[];\n isPreviewPreventScrubbingEnabled: boolean;\n relatedVideos: RelatedVideosHash;\n canManageVideoAccess: boolean;\n breadcrumbs?: Breadcrumb[];\n commonVideoProps: CommonVideoProps;\n\n // Share view only\n shareId?: string;\n}\n\nexport function PreviewInteractive(props: PreviewInteractiveProps): JSX.Element {\n const playerContext = usePlayerContext();\n\n const [ isPreviewingPreventScrubbing, setIsPreviewingPreventScrubbing ] = React.useState(false);\n\n const { canConsume } = VideoHelper.getCanBeConsumed(props.interactive);\n\n const videoActions = useVideoActions({\n location: VideoActionsLocation.PlayPage,\n shareId: props.shareId\n });\n\n usePreviewPreventInteractive(isPreviewingPreventScrubbing, togglePreviewPreventScrubbing);\n\n function togglePreviewPreventScrubbing() {\n playerContext.playerRef?.current?.togglePreviewPreventScrubbing?.();\n }\n\n function toggleStudentMode() {\n setIsPreviewingPreventScrubbing(!isPreviewingPreventScrubbing);\n }\n \n let otherInteractives: InteractiveMetadata[];\n let backToName: string;\n let backAppLink: Core.AppLink;\n\n if (VideoHelper.isClip(props.sourceVideo)) {\n otherInteractives = props.interactives?.filter(i => {\n return i.id.toString() !== props.interactive.id.toString();\n });\n backToName = props.sourceVideo.name;\n backAppLink = {\n application: AppChannels.CLIPS,\n action: Actions.Clips.PLAY_CLIP,\n args: [ props.sourceVideo.id, TextHelper.slugify(props.sourceVideo.name) ]\n };\n } else {\n otherInteractives = props.interactives?.filter(i => {\n return i.id.toString() !== props.interactive.id.toString();\n });\n backToName = props.sourceVideo.name;\n backAppLink = {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PLAY_VIDEO,\n args: [ props.sourceVideo.id, TextHelper.slugify(props.sourceVideo.name) ]\n };\n }\n\n const isDraft = props.interactive.status === CurationStatus.Draft;\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <div className='px-4'>\n {props.breadcrumbs?.length &&\n <div className='mb-2'>\n <Breadcrumbs breadcrumbs={props.breadcrumbs} />\n </div>\n }\n\n <RestrictionBanner\n restrictions={props.interactive._restrictions}\n yearGroups={props.commonVideoProps.yearGroups}\n objectId={props.interactive.id}\n objectTypeId={MasterType.Interactive}\n canManageVideoAccess={props.canManageVideoAccess}\n />\n\n <InteractiveAlertBanner\n isPreviewPreventScrubbingEnabled={props.isPreviewPreventScrubbingEnabled}\n isPreviewingPreventScrubbing={isPreviewingPreventScrubbing}\n toggleStudentMode={toggleStudentMode}\n isArchived={VideoHelper.isVideoTypeArchived(props.interactive)}\n />\n\n <div className='mb-3'>\n {canConsume && (\n <GlobalPlayerConsumer\n key={props.interactive.id}\n objectId={props.interactive.id}\n objectTypeId={props.interactive.typeId}\n shareId={props.shareId}\n startTime={props.queryParams.t ?? props.queryParams.startTime}\n mode='default'\n location='play-page'\n token={props.token}\n />\n )}\n </div>\n <div className='d-flex justify-content-between align-items-center'>\n <div className='inline-block w-100'>\n <div className='ms-2 float-end'>\n <ActionsComponent\n actions={videoActions.getVideoActions(props.interactive)}\n actionsDropdownClassName='btn btn-outline-dark'\n fetchMore={() => videoActions.fetchMoreActions(props.interactive)}\n />\n </div>\n\n <h1 className='h3 mb-2'>\n {isDraft && (\n <div className={`badge draft-badge me-2 align-bottom flex-shrink-0 h-auto lh-base`}>\n <Text phrase='draft' />\n </div>\n )}\n {props.interactive.name}\n <RestrictionPadlock\n tooltipPlacement='right'\n className='ps-1'\n video={props.interactive}\n yearGroups={props.commonVideoProps.yearGroups}\n />\n </h1>\n {VideoHelper.canViewOriginalVideo(props.interactive) &&\n <div className='mb-1 me-3 clamp-1'>\n <Text phrase='viewOriginal' />&nbsp;<AppLink appLink={backAppLink} className='text-info'>{backToName}</AppLink>\n </div>\n }\n </div>\n </div>\n\n {props.interactive.description && (\n <ExpandableText lines={5}>\n {() => <p className='mb-0 d-inline'>{props.interactive.description}</p>}\n </ExpandableText>\n )}\n\n <div className='mb-3'>\n <OutPortal node={playerContext.questionListPortalNode}></OutPortal>\n </div>\n\n {!!otherInteractives?.length && (\n <div className='pb-3'>\n \n <FixedWidget\n name={getPhrase('otherInteractives', { count: otherInteractives.length })}\n contents={WidgetContents.Interactives}\n collection={otherInteractives}\n prefetched\n getChildAppLink={(interactive: Interactive) => {\n return {\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.VIEW_INTERACTIVE,\n args: [ interactive.id, TextHelper.slugify(interactive.name) ]\n };\n }}\n childComponent={InteractiveWidgetItem}\n extraChildComponentProps={{\n questionsAppLink: {\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.PREVIEW_QUESTIONS\n },\n commonVideoProps: props.commonVideoProps\n }}\n analyticsData={{ widgetId: 'interactives' }}\n />\n </div>\n )}\n\n <RelatedVideos\n currentVideo={props.interactive}\n currentUser={props.currentUser}\n audiences={props.audiences}\n relatedVideos={props.relatedVideos}\n getVideoAppLink={(v, opts) => VideoAppLinkHelper.getAppLink(v, {\n ...opts,\n context: props.queryParams.context,\n contextId: props.queryParams.contextId,\n playNext: props.queryParams.playNext,\n shareId: props.shareId,\n moviesAndTv: props.queryParams.mtv,\n includeContext: props.currentUser?.isAuthenticated\n })}\n moviesAndTv={props.queryParams.mtv}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\n\nexport function usePreviewPreventInteractive(\n previewPreventInteractive: boolean,\n togglePreviewPreventInteractive: () => void\n): void {\n React.useEffect(() => {\n togglePreviewPreventInteractive();\n }, [previewPreventInteractive]);\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/flight';\n\nimport { 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 { CurrentUser } from 'libs/shared/interfaces';\n\nexport function useShouldPreviewInteractive() {\n const { hasPermissions } = usePermissions();\n const { hasProduct } = useProducts();\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n return !hasPermissions(PermissionName.StudentExperience) &&\n hasProduct(ProductId.Primary) &&\n currentUser.data.isAuthenticated;\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":["defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","internalServerError","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","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","generateCacheKey","flightObjs","join","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","Array","isArray","useEffect","PlayInteractive","props","showHeading","setShowHeading","isArchived","interactive","summaryPortalNode","hasPermissions","hasStudentExperience","className","typeId","config","video","currentUser","shareLink","viewKey","startTime","onShowSummary","showing","token","publicName","profileId","name","tooltipPlacement","yearGroups","node","currentVideo","relatedVideos","audiences","getVideoAppLink","v","opts","context","queryParams","contextId","playNext","shareId","moviesAndTv","mtv","includeContext","isAuthenticated","commonVideoProps","getPhrase","LanguageService","InteractiveAlertBanner","role","SvgContainer","svgName","size","S","Text","phrase","isPreviewPreventScrubbingEnabled","Tooltip","title","trigger","spanHack","ToggleSwitch","on","isPreviewingPreventScrubbing","onClick","toggleStudentMode","PreviewInteractive","previewPreventInteractive","togglePreviewPreventInteractive","otherInteractives","backToName","backAppLink","playerContext","setIsPreviewingPreventScrubbing","canConsume","VideoHelper","videoActions","useVideoActions","location","playerRef","togglePreviewPreventScrubbing","sourceVideo","interactives","filter","i","toString","application","action","args","TextHelper","isDraft","CurationStatus","value","breadcrumbs","Breadcrumbs","RestrictionBanner","restrictions","_restrictions","objectId","objectTypeId","MasterType","canManageVideoAccess","GlobalPlayerConsumer","t","mode","Actions","actions","getVideoActions","actionsDropdownClassName","fetchMore","fetchMoreActions","RestrictionPadlock","AppLink","appLink","description","ExpandableText","lines","questionListPortalNode","count","contents","WidgetContents","collection","prefetched","getChildAppLink","childComponent","InteractiveWidgetItem","extraChildComponentProps","questionsAppLink","analyticsData","widgetId","RelatedVideos","VideoAppLinkHelper","useCommonVideoProps","options","locationContext","flightNamespace","sharedPlaylist","isPlugin","u","setFavourite","canFavourite","hasTopicDirectories","isLoadingSettings","hasLoadedPermissions","isLoaded","customerId","hasCommonVideoPropsCompleted","subTextType","getSubTextAppLink","series","imageCdnUrl","getClassroomGuideAppLink","getInteractiveGuidanceAppLink","getResourceGuidanceAppLink","showNewVideoIndicator","companyLogoFallbackUrl","usePresentationAudiences","redirectOnError","activePresentation","getFallbackPresentation","presentation","useShouldPreviewInteractive","hasProduct","useVideoMixin","objects","videoIds","o","getValidObjects","ids"],"sourceRoot":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/5143-286c66de2b-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/domain-settings/domain-settings-tabs/DomainSettingsTabs.tsx","file:///app/packages/libs/shared/src/components/pill-tab-selector/PillTabSelector.tsx","file:///app/packages/libs/shared/src/enums/AccessSettingsGroup.ts","file:///app/packages/projects/lite/src/apps/settings/components/settings-layout/SettingsLayout.tsx","file:///app/packages/projects/lite/src/apps/settings/constants/AccessSettingsAppLinks.ts","file:///app/packages/projects/lite/src/apps/settings/hooks/useDomainSettingsSwitch.ts","file:///app/packages/libs/shared/src/apps/domain-settings/domain-settings-invites-toggle/DomainSettingsInvitesToggle.tsx","file:///app/packages/projects/lite/src/apps/settings/views/teacher-invites/TeacherInvitesView.tsx","file:///app/packages/libs/shared/src/components/pill-tab-selector/pill-tab-selector.scss"],"sourcesContent":["import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { PillTabSelector } from 'libs/shared/components/pill-tab-selector/PillTabSelector';\nimport { AccessSettingAppLinks } from 'libs/shared/interfaces/domains/AccessSettingAppLinks';\n\nconst namespace = 'settings.domainSettingsTabs';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface DomainSettingsTabsProps {\n active: 'requesting-access' | 'teacher-invites' | 'automatic-access',\n appLinks: AccessSettingAppLinks\n}\n\nexport function DomainSettingsTabs(props: DomainSettingsTabsProps): JSX.Element {\n const { active, appLinks } = props;\n \n return (\n <div className='mb-3'>\n <PillTabSelector\n tabs={[{\n name: getPhrase('requestingAccess'),\n appLink: appLinks.requestingAccess,\n active: active === 'requesting-access',\n analyticsData: {\n name: getPhrase('requestingAccess'),\n url: Core.AppLinkHelper.getHref(appLinks.requestingAccess)\n },\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.Url,\n location: LocationContext.MagicTabs\n }\n }, {\n name: getPhrase('teacherInvites'),\n appLink: appLinks.teacherInvites,\n active: active === 'teacher-invites',\n analyticsData: {\n name: LanguageService.getPhrase(namespace, 'teacherInvites'),\n url: Core.AppLinkHelper.getHref(appLinks.teacherInvites)\n },\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.Url,\n location: LocationContext.MagicTabs\n }\n }, {\n name: getPhrase('automaticAccess'),\n appLink: appLinks.automaticAccess,\n active: active === 'automatic-access',\n analyticsData: {\n name: LanguageService.getPhrase(namespace, 'automaticAccess'),\n url: Core.AppLinkHelper.getHref(appLinks.automaticAccess)\n },\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.Url,\n location: LocationContext.MagicTabs\n }\n }]}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\n\nimport { SvgContainer } from '../svg-container/SvgContainer';\n\nimport styles from './pill-tab-selector.scss';\n\ninterface TabContentsProps {\n tab: PillTab;\n}\n\nfunction TabContents(props: TabContentsProps): JSX.Element {\n return (\n <>\n {!!props.tab.svgName && (\n <div className={props.tab.name ? 'pe-1' : ''}>\n <SvgContainer svgName={props.tab.svgName} />\n </div>\n )}\n\n {props.tab.name}\n\n {typeof (props.tab.count) === 'number' && (\n <div className='ps-2'>\n <Badge type={BadgeType.Count} data={props.tab.count} />\n </div>\n )}\n </>\n );\n}\n\nexport interface PillTab {\n name: string;\n active: boolean;\n svgName?: string;\n\n className?: string;\n\n appLink?: Core.AppLink;\n onSelect?: () => void;\n\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n\n count?: number;\n}\n\ninterface PillTabSelectorProps {\n tabs: PillTab[];\n containerRef?: (el: HTMLElement) => void;\n listClassName?: string;\n className?: string;\n borderRadius?: 'sm' | 'lg'\n}\n\nPillTabSelector.defaultProps = {\n borderRadius: 'lg'\n};\n\nexport function PillTabSelector(props: PillTabSelectorProps): JSX.Element {\n function onSelectTab(tab: PillTab): void {\n if (tab.active || !tab.onSelect)\n return;\n\n tab.onSelect();\n\n if (tab.analyticsData && tab.analyticsOptions)\n AnalyticsHelper.logUserAction(tab.analyticsData, tab.analyticsOptions);\n }\n\n return (\n <nav className={props.className ?? ''} ref={props.containerRef}>\n <ul className={`\n list-unstyled d-inline-block m-0 ${styles.pillTabSelector}\n ${props.borderRadius ? styles.radiusSmall : ''}\n ${props.listClassName}\n `}>\n {props.tabs.map((tab, index) => {\n return (\n <li\n className={`\n p-0 ${styles.tab} ${tab.active ? 'btn btn-dark' : 'btn btn-outline-dark'}\n ${tab.name ? styles.minWidth : ''} ${tab.className}\n `}\n key={index}\n >\n {tab.appLink ? (\n <AppLink\n appLink={tab.appLink}\n analyticsData={tab.analyticsData}\n analyticsOptions={tab.analyticsOptions}\n className={`\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ${styles.tabLink}\n `}\n >\n <TabContents tab={tab} />\n </AppLink>\n ) : (\n <DivButton\n className={`\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ${styles.tabLink}\n `}\n onClick={() => onSelectTab(tab)}\n >\n <TabContents tab={tab} />\n </DivButton>\n )}\n </li>\n );\n })}\n </ul>\n </nav>\n );\n}\n","export enum AccessSettingsGroup {\n RequestingAccess = 'requestingAccess',\n TeacherInvites = 'teacherInvites',\n AutomaticAccess = 'automaticAccess'\n}","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 { Core } from 'libs/common/backbone/index';\n\nimport { AccessSettingsGroup } from 'libs/shared/enums/AccessSettingsGroup';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nexport const AccessSettingsAppLinks: { [key in AccessSettingsGroup]: Core.AppLink } = {\n [AccessSettingsGroup.RequestingAccess]: {\n application: AppChannels.SETTINGS,\n action: Actions.Settings.REQUESTING_ACCESS\n },\n [AccessSettingsGroup.TeacherInvites]: {\n application: AppChannels.SETTINGS,\n action: Actions.Settings.TEACHER_INVITES\n },\n [AccessSettingsGroup.AutomaticAccess]: {\n application: AppChannels.SETTINGS,\n action: Actions.Settings.AUTOMATIC_ACCESS\n }\n};\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { useSettings } from 'libs/shared/hooks/useSettings';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nexport function useDomainSettingsSwitch() {\n const { isLoadingSettings, domainSettings } = useSettings(LocationContext.Settings);\n\n React.useEffect(() => {\n if (isLoadingSettings)\n return;\n\n if (!domainSettings) {\n Core.AppLinkHelper.trigger({\n application: AppChannels.SETTINGS,\n action: Actions.Settings.HOME\n }, { replace: true });\n }\n }, [ domainSettings, isLoadingSettings ]);\n}\n","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\n\nconst namespace = 'settings.domainSettingsInvitesToggle';\n\ninterface DomainSettingsInvitesToggleProps {\n allowInvites: boolean,\n onToggleInvites: () => void\n}\n\nexport function DomainSettingsInvitesToggle(props: DomainSettingsInvitesToggleProps) {\n const { allowInvites, onToggleInvites } = props;\n\n return (\n <div className='col-12 col-md-7 card p-3'>\n <div className='d-flex justify-content-between'>\n <p className='fw-semibold'>\n <Text namespace={namespace} phrase='invitesLabel' />\n </p>\n <ToggleSwitch\n onClick={onToggleInvites}\n on={allowInvites}\n ></ToggleSwitch>\n </div>\n\n <p>\n <Text namespace={namespace} phrase='invitesDescription' />\n </p>\n\n <div className='d-flex'>\n <div className='rounded p-2 bg-light-blue text-info fw-semibold'>\n <Text namespace={namespace} phrase={allowInvites ? 'invitesInfoMessage' : 'noInvitesInfoMessage'} />\n </div>\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { DomainSettingsInvitesToggle } from 'libs/shared/apps/domain-settings/domain-settings-invites-toggle/DomainSettingsInvitesToggle';\nimport { DomainSettingsTabs } from 'libs/shared/apps/domain-settings/domain-settings-tabs/DomainSettingsTabs';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { SettingKind } from 'libs/shared/enums/SettingKind';\nimport { SettingName } from 'libs/shared/enums/SettingName';\nimport { UpdateSettingRequest } from 'libs/shared/flight-requests/SettingRequests';\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 { CurrentUser } from 'libs/shared/interfaces';\n\nimport { SettingsLayout } from 'apps/settings/components/settings-layout/SettingsLayout';\nimport { AccessSettingsAppLinks } from 'apps/settings/constants/AccessSettingsAppLinks';\nimport { useDomainSettingsSwitch } from 'apps/settings/hooks/useDomainSettingsSwitch';\n\nconst namespace = 'settings.teacherInvites';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function TeacherInvitesView() {\n useDomainSettingsSwitch();\n\n useSetPageMetadata({ title: getPhrase('pageTitle') });\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const { customerId } = currentUser.data;\n const { inviteColleague, updateSetting, isLoadingSettings } = useSettings(LocationContext.Settings);\n const alerts = useAlerts();\n const [ allowInvites, setAllowInvites ] = React.useState(inviteColleague);\n\n React.useEffect(() => {\n if (isLoadingSettings)\n return;\n\n setAllowInvites(inviteColleague);\n }, [ inviteColleague, isLoadingSettings ]);\n\n function onToggleInvites() {\n const newSetting: UpdateSettingRequest<boolean> = {\n name: SettingName.InviteColleague,\n value: !allowInvites,\n kind: SettingKind.Permanent\n };\n\n updateSetting(\n customerId,\n newSetting,\n () => {\n alerts.success(getPhrase('successAlert'));\n setAllowInvites(!allowInvites);\n },\n () => alerts.error(getPhrase('errorAlert'))\n );\n }\n\n if (isLoadingSettings) {\n return <></>;\n }\n\n return (\n <SettingsLayout\n heading={getPhrase('heading')}\n breadcrumbs={[getPhrase('breadcrumb')]}\n requiredPermissions={PermissionName.ManageUsers}\n >\n <DomainSettingsTabs active='teacher-invites' appLinks={AccessSettingsAppLinks}/>\n\n <p>\n <Text namespace={namespace} phrase='description' />\n </p>\n\n <DomainSettingsInvitesToggle\n allowInvites={allowInvites}\n onToggleInvites={onToggleInvites}\n />\n </SettingsLayout>\n );\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"pillTabSelector\":\"Hdi6o\",\"tab\":\"RvNxr\",\"minWidth\":\"GHSz9\",\"radiusSmall\":\"VhJJa\",\"tabLink\":\"WFyvo\"};"],"names":["namespace","getPhrase","DomainSettingsTabs","props","active","appLinks","className","tabs","name","appLink","requestingAccess","analyticsData","url","analyticsOptions","actionType","entity","location","teacherInvites","automaticAccess","TabContents","tab","svgName","count","type","data","PillTabSelector","ref","containerRef","borderRadius","listClassName","map","index","key","onClick","onSelect","onSelectTab","defaultProps","AccessSettingsGroup","useCanAccessSettings","requiredPermissions","hasPermissions","settingsGroups","currentRoute","application","some","group","modules","settingsModule","action","SettingsLayout","canAccess","replace","breadcrumbs","i","length","heading","headingButton","description","children","AccessSettingsAppLinks","useDomainSettingsSwitch","isLoadingSettings","domainSettings","DomainSettingsInvitesToggle","allowInvites","onToggleInvites","Text","phrase","ToggleSwitch","on","LanguageService","TeacherInvitesView","useSetPageMetadata","title","customerId","UserRequests","useSettings","inviteColleague","updateSetting","alerts","setAllowInvites","PermissionName","newSetting","SettingName","value","kind","SettingKind","success","error"],"sourceRoot":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/5743-a764171a6d-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/subjects/components/preferences/topic-preferences/subject-preference-grid/SubjectPreferenceGrid.tsx","file:///app/packages/libs/shared/src/apps/subjects/components/preferences/topic-preferences/subject-preference-item/SubjectPreferenceItem.tsx","file:///app/packages/libs/shared/src/apps/subjects/components/preferences/preference-item/preference-item.scss","file:///app/packages/libs/shared/src/apps/subjects/components/preferences/preference-item/PreferenceItemStatus.tsx","file:///app/packages/libs/shared/src/apps/subjects/components/preferences/preference-item/PreferenceItem.tsx","file:///app/packages/libs/shared/src/apps/subjects/components/preferences/topic-preferences/subject-preference-item/partial-loading/partial-topic-preferences.scss","file:///app/packages/libs/shared/src/apps/subjects/components/preferences/topic-preferences/subject-preference-item/partial-loading/PartialTopicPreferences.tsx","file:///app/packages/libs/shared/src/apps/subjects/contexts/TopicPreferencesContext.ts","file:///app/packages/libs/shared/src/hooks/UseOnSaveAll.tsx","file:///app/packages/libs/shared/src/apps/subjects/components/preferences/topic-preferences/TopicPreferences.tsx","file:///app/packages/projects/lite/src/apps/settings/views/preferences/topics/TopicPreferencesView.tsx","file:///app/packages/libs/shared/src/apps/subjects/hooks/useGetPreferredSubjects.ts","file:///app/packages/libs/shared/src/apps/subjects/components/preferences/topic-preferences/subject-preference-grid/subject-preference-grid.scss"],"sourcesContent":["import * as React from 'react';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { SubjectPreferenceItem } from 'libs/shared/apps/subjects/components/preferences';\nimport { TopicPreferencesContext } from 'libs/shared/apps/subjects/contexts/TopicPreferencesContext';\nimport { ClassificationPreference } from 'libs/shared/apps/subjects/interfaces/ClassificationPreference';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useGetMediaQueryString } from 'libs/shared/hooks/UseGetMediaQueryString';\nimport { Classification } from 'libs/shared/interfaces';\n\nimport styles from './subject-preference-grid.scss';\n\nfunction useGetRowItemCapacity(): number {\n const viewportWidth = useGetMediaQueryString();\n\n switch (viewportWidth) {\n case MediaQueryStrings.LG:\n default:\n return 5;\n\n case MediaQueryStrings.MD:\n return 4;\n\n case MediaQueryStrings.SM:\n return 3;\n\n case MediaQueryStrings.XS:\n return 2;\n }\n}\n\nfunction isDisabled(subject: ClassificationPreference, expandedSubject: ClassificationPreference): boolean {\n if (!expandedSubject || subject.id === expandedSubject.id)\n return false;\n\n if (expandedSubject.children.find(child => child.id === subject.id))\n return false;\n\n return true;\n}\n\ninterface SubjectPreferenceGridRowProps extends SubjectPreferenceGridProps {}\n\nfunction SubjectPreferenceGridRow(props: SubjectPreferenceGridRowProps): JSX.Element {\n const { expandedSubject, selectedSubjects: selections } = React.useContext(TopicPreferencesContext);\n\n return (\n <>\n {props.subjects.map(subject => {\n const itemDisabled = isDisabled(subject, expandedSubject);\n\n let clickHandler = props.onSelect;\n\n if (subject.isExpandableOption)\n clickHandler = props.onExpand;\n\n if (itemDisabled)\n clickHandler = props.onCollapse;\n\n if (props.hasSelectedBulk)\n clickHandler = () => {};\n\n return (\n <SubjectPreferenceItem\n key={subject.id}\n subject={subject}\n selected={!props.hasSelectedBulk && selections.includes(subject.id)}\n disabled={props.hasSelectedBulk || itemDisabled}\n onClick={() => clickHandler(subject)}\n hasSelectedBulk={props.hasSelectedBulk}\n />\n );\n })}\n </>\n );\n}\n\ninterface SubjectPreferenceGridProps {\n subjects: ClassificationPreference[];\n onSelect: (subject: Classification) => void;\n onExpand: (subject: Classification) => void;\n onCollapse: (subject: Classification) => void;\n hasSelectedBulk?: boolean;\n}\n\nexport function SubjectPreferenceGrid(props: SubjectPreferenceGridProps): JSX.Element {\n const { subjects, hasSelectedBulk, ...eventHandlers } = props;\n const { expandedSubject } = React.useContext(TopicPreferencesContext);\n\n const itemsPerRow = useGetRowItemCapacity();\n\n /**\n * This is an array of arrays, where each sub-array is a row of classifications.\n * We do this to make sure any sub-grid's of child preference options get rendered in the row\n * directly beneath their parent's row.\n */\n const subjectRows = subjects.reduce((\n acc: ClassificationPreference[][],\n subject: ClassificationPreference,\n index: number\n ) => {\n index % itemsPerRow === 0\n ? acc.push([subject]) // Start a new row\n : ArrayHelper.last(acc).push(subject); // Fill up an existing row\n\n return acc;\n }, []);\n\n return (\n <ul className={styles.grid}>\n {subjectRows.map((row, i) => {\n const isExpanded = expandedSubject && !!row.find(subject => {\n return expandedSubject.id === subject.id && subject.isExpandableOption;\n });\n\n return (\n <React.Fragment key={i}>\n <SubjectPreferenceGridRow\n subjects={row}\n hasSelectedBulk={hasSelectedBulk}\n {...eventHandlers}\n />\n\n {isExpanded && (\n <li className={`${styles.subgrid} m-0`}>\n <SubjectPreferenceGrid\n subjects={expandedSubject.children as ClassificationPreference[]}\n hasSelectedBulk={hasSelectedBulk}\n {...eventHandlers}\n />\n </li>\n )}\n </React.Fragment>\n );\n })}\n </ul>\n );\n}","import * as React from 'react';\n\nimport { PreferenceItem } from 'libs/shared/apps/subjects/components/preferences/preference-item/PreferenceItem';\nimport { TopicPreferencesContext } from 'libs/shared/apps/subjects/contexts/TopicPreferencesContext';\nimport { ClassificationPreference } from 'libs/shared/apps/subjects/interfaces/ClassificationPreference';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\n\ninterface SubjectPreferenceItemProps {\n subject: ClassificationPreference;\n selected: boolean;\n disabled?: boolean;\n onClick?: (event: React.MouseEvent<HTMLLIElement, MouseEvent>) => void;\n extraClasses?: string;\n hideStatus?: boolean;\n hasSelectedBulk?: boolean;\n}\n\nexport function SubjectPreferenceItem(props: SubjectPreferenceItemProps): JSX.Element {\n const context = React.useContext(TopicPreferencesContext);\n\n const coverUrl = props.subject.cover ? ImageHelper.createUrl(props.subject.cover.url, { size: ImageSize.Small }) : '';\n\n const childIds = props.subject.isExpandableOption ? props.subject.children.map(child => child.id) : [];\n const selectedChildCount = !props.hasSelectedBulk\n ? context?.selectedSubjects?.filter(selection => childIds.includes(selection)).length\n : 0;\n\n const component = (\n <PreferenceItem\n name={props.subject.name}\n imageUrl={coverUrl}\n onClick={props.onClick}\n isSelected={props.selected}\n isDisabled={props.disabled}\n isExpandable={props.subject.isExpandableOption}\n expand={context?.expandedSubject?.id === props.subject.id}\n selectedChildCount={selectedChildCount}\n extraClasses={props.extraClasses}\n hideStatus={props.hideStatus}\n />\n );\n\n return props.disabled\n ? <span>{component}</span>\n : <Tooltip title={props.subject.name}><span>{component}</span></Tooltip>;\n}","// extracted by mini-css-extract-plugin\nexport default {\"preferenceItem\":\"PSWHa\",\"expandCaret\":\"CCsqs\",\"up\":\"w7N1R\",\"down\":\"mO0Kn\",\"disabled\":\"Oyw2x\",\"selected\":\"Czk2N\",\"noBorder\":\"_e7oe\",\"textBox\":\"pfksF\",\"itemStatus\":\"H4u81\",\"unchecked\":\"iYkPv\",\"green\":\"w5g0e\"};","import * as React from 'react';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './preference-item.scss';\n\ninterface ExpandableItemStatusProps {\n selectedChildrenCount: number;\n}\n\nexport const ExpandableItemStatus = (props: ExpandableItemStatusProps): JSX.Element => {\n if (!props.selectedChildrenCount)\n return <></>;\n\n return (\n <div className={`${styles.itemStatus} ${styles.green}`}>\n {props.selectedChildrenCount}\n </div>\n );\n};\n\ninterface SelectableItemStatusProps {\n selected: boolean;\n radioButton?: boolean;\n}\n\nexport const SelectableItemStatus = (props: SelectableItemStatusProps): JSX.Element => {\n let svg;\n\n if (props.selected)\n svg = <SvgContainer svgName={cvSvgLibrary.Check} />;\n else if (!props.radioButton)\n svg = <SvgContainer svgName={cvSvgLibrary.Plus} />;\n else\n svg = <>&nbsp;</>;\n\n return (\n <div className={`${styles.itemStatus} ${props.selected ? styles.green : styles.unchecked}`}>\n {svg}\n </div>\n );\n};\n","import React from 'react';\n\nimport { ExpandableItemStatus, SelectableItemStatus } from './PreferenceItemStatus';\n\nimport styles from './preference-item.scss';\n\ninterface PreferenceItemProps {\n name: string;\n imageUrl: string;\n\n onClick?: (event: React.MouseEvent<HTMLLIElement, MouseEvent>) => void;\n isDisabled?: boolean;\n isSelected: boolean;\n hideStatus?: boolean;\n radioButton?: boolean;\n\n isExpandable?: boolean;\n expand?: boolean;\n selectedChildCount?: number;\n\n extraClasses?: string;\n}\n\nexport function PreferenceItem(props: PreferenceItemProps): JSX.Element {\n function getContainerClass(): string {\n let baseClass = `rounded-3 ${styles.preferenceItem}`;\n\n if (props.extraClasses)\n baseClass += ' ' + props.extraClasses;\n\n if (props.isDisabled)\n baseClass += ' ' + styles.disabled;\n\n if (props.isSelected && !props.isExpandable)\n baseClass += ' ' + styles.selected;\n\n if (props.hideStatus)\n baseClass += ' ' + styles.noBorder;\n\n return baseClass;\n }\n\n const caretClass = `${styles.expandCaret} ${props.expand ? styles.up : styles.down}`;\n\n return (\n <li\n className={getContainerClass()}\n onClick={props.onClick}\n aria-checked={props.isSelected}\n aria-haspopup={props.isExpandable}\n role={props.isExpandable ? 'button' : 'checkbox'}\n style={{ backgroundImage: `url(${props.imageUrl})` }}\n tabIndex={0}\n title={props.name}\n >\n <div className={`${styles.textBox} p-2`}>\n <p className='clamp-2 mb-0'>\n {props.name}\n <span className={props.isExpandable ? caretClass : ''} />\n </p>\n\n {!props.hideStatus && (\n <>{props.isExpandable\n ? <ExpandableItemStatus selectedChildrenCount={props.selectedChildCount} />\n : <SelectableItemStatus selected={props.isSelected} radioButton={props.radioButton} />\n }</>\n )}\n </div>\n </li>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialSubject\":\"KQYyH\",\"lg\":\"KiWap\",\"partialSubjectList\":\"Ng80C\"};","import * as React from 'react';\n\nimport gridStyles from '../../subject-preference-grid/subject-preference-grid.scss';\nimport styles from './partial-topic-preferences.scss';\n\ninterface PartialTopicPreferencesProps {\n count: number;\n style: 'grid' | 'list';\n size?: 'sm' | 'lg';\n center?: boolean;\n}\n\nPartialTopicPreferences.defaultProps = {\n size: 'sm'\n};\n\nexport function PartialTopicPreferences(props: PartialTopicPreferencesProps): JSX.Element {\n const className = props.style === 'grid' ? gridStyles.grid : styles.partialSubjectList;\n\n return (\n <div className='p-3'>\n <ul className={`${className} ${props.center ? 'justify-content-center' : ''}`}>\n {Array(props.count).fill(null).map((item, i) => (\n <li\n key={i}\n className={`${styles.partialSubject} partial-loading-background rounded-3 ${props.size === 'lg' ? styles.lg : ''}`}\n />\n ))}\n </ul>\n </div>\n );\n}","import { createContext } from 'react';\n\nimport { ClassificationPreference } from '../interfaces/ClassificationPreference';\n\ninterface TopicPreferencesContextFields {\n selectedSubjects: string[];\n expandedSubject: ClassificationPreference;\n}\n\nexport const TopicPreferencesContext = createContext<TopicPreferencesContextFields>(undefined);","import React from 'react';\n\ntype ReturnValue = [\n () => void,\n React.Dispatch<React.SetStateAction<number>>\n];\n\n/**\n * This hook solves a problem where you want to trigger an \"onSuccess\" callback function\n * only after the last of multiple API calls have completed.\n * \n * Example: the user clicks a \"Save\" button, which triggers 2 API calls. You have a callback function\n * that you want to run after both API calls have succeeded. This hook will help you do that of you pass it\n * the callback function and set the counter to 2.\n */\nexport const useOnSaveAll = (onDone: () => void): ReturnValue => {\n const [ counter, setCounter ] = React.useState(1);\n\n function onSave(): void {\n setCounter(val => val - 1);\n }\n\n React.useEffect(() => {\n if (counter > 0)\n return;\n \n onDone();\n }, [counter]);\n\n return [ onSave, setCounter ];\n};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { OnboardingFooter, SubjectPreferenceGrid } from 'libs/shared/apps/subjects/components/preferences';\nimport { TopicPreferencesContext } from 'libs/shared/apps/subjects/contexts/TopicPreferencesContext';\nimport { ClassificationPreference } from 'libs/shared/apps/subjects/interfaces/ClassificationPreference';\nimport { OnboardingHelper } from 'libs/shared/apps/subjects/utils/OnboardingHelper';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SpinnerButton } from 'libs/shared/components/spinner-button/SpinnerButton';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\nimport { BulkOnboardingPreferencesState } from 'libs/shared/enums/BulkOnboardingPreferencesState';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useOnSaveAll } from 'libs/shared/hooks/UseOnSaveAll';\nimport { Classification } from 'libs/shared/interfaces';\n\nconst namespace = 'subjects.topicPreferences';\n\nfunction structurePreferencesGrid(rawPreferenceOptions: ClassificationPreference[]): ClassificationPreference[] {\n if (!rawPreferenceOptions?.length)\n return [];\n\n const preferenceOptions: ClassificationPreference[] = [];\n\n rawPreferenceOptions.forEach(option => {\n if (!option.children || !option.children.length) {\n preferenceOptions.push({ ...option });\n return;\n }\n\n preferenceOptions.push({\n ...option,\n isExpandableOption: true,\n children: [{ ...option }, ...option.children ]\n });\n });\n\n return preferenceOptions;\n}\n\ninterface TopicPreferencesProps {\n options: ClassificationPreference[];\n preselections: Classification[];\n bulkPreferencesState: BulkOnboardingPreferencesState;\n saveChanges: (\n addedSubjects: string[],\n removedSubjects: Classification[],\n bulkState: BulkOnboardingPreferencesState,\n onSuccess: () => void,\n onError: () => void\n ) => void;\n\n isOnboarding?: boolean;\n backButtonAppLink?: Core.AppLink;\n nextAppLink?: Core.AppLink;\n}\n\nexport function TopicPreferences(props: TopicPreferencesProps): JSX.Element {\n const [ selectedTopics, setSelectedTopics ] = React.useState<string[]>([]);\n const [ expandedSubject, setExpandedSubject ] = React.useState<ClassificationPreference>(null);\n\n const [ bulkPreferencesState, setBulkPreferencesState ] = React.useState<BulkOnboardingPreferencesState>(\n props.bulkPreferencesState\n );\n\n const [ showSpinner, setShowSpinner ] = React.useState(false);\n\n const alerts = useAlerts();\n\n const hasBulkSelectedTopics = OnboardingHelper.hasBulkSelectedTopics(bulkPreferencesState);\n\n /**\n * Set initial selections\n */\n React.useEffect(() => {\n if (!props.preselections?.length) {\n setSelectedTopics([]);\n return;\n }\n\n setSelectedTopics(ArrayHelper.uniq([ ...selectedTopics, ...props.preselections.map(p => p.id) ]));\n }, [props.preselections?.length]);\n\n const [ onSuccess, setCounter ] = useOnSaveAll(() => {\n setShowSpinner(false);\n\n if (!props.isOnboarding)\n alerts.success(LanguageService.getPhrase(namespace, 'success'));\n\n if (props.nextAppLink)\n Core.AppLinkHelper.trigger(props.nextAppLink);\n });\n\n /**\n * Event handlers\n */\n function onSelect(subject: ClassificationPreference): void {\n const newSelections = ArrayHelper.addOrRemoveImmutable(selectedTopics, subject.id);\n setSelectedTopics(newSelections);\n }\n\n function onExpand(subject: ClassificationPreference): void {\n setExpandedSubject(expandedSubject && expandedSubject.id === subject.id ? null : subject);\n }\n\n function onCollapse(): void {\n setExpandedSubject(null);\n }\n\n function hasChangedTopics(selectedTopics: string[]): boolean {\n if (!props.preselections)\n return false;\n\n const preselectedIds = props.preselections.map(p => p.id);\n return preselectedIds.sort().toString() !== selectedTopics.sort().toString();\n }\n\n function hasChangedBulkState(): boolean {\n return props.bulkPreferencesState !== bulkPreferencesState;\n }\n\n function isValid(): boolean {\n if (!selectedTopics.length && !hasBulkSelectedTopics)\n return false;\n\n const hasChanged = hasChangedBulkState() || hasChangedTopics(selectedTopics);\n\n if (!props.isOnboarding && !hasChanged)\n return false;\n\n return true;\n }\n\n function onSave(): void {\n if (!isValid())\n return;\n\n // If they have selected the bulk option, we do not want to clear their preferences or save any changes.\n if ((!hasChangedTopics(selectedTopics) && !hasChangedBulkState())) {\n if (props.nextAppLink)\n Core.AppLinkHelper.trigger(props.nextAppLink);\n\n return;\n }\n\n setShowSpinner(true);\n\n const addedSubjects = selectedTopics.filter(id => !props.preselections.find(p => p.id === id));\n const removedSubjects = props.preselections.filter(p => !selectedTopics.includes(p.id));\n\n let onSaveCounter = 0;\n\n if (addedSubjects.length)\n onSaveCounter++;\n\n if (removedSubjects.length)\n onSaveCounter++;\n\n if (hasChangedBulkState())\n onSaveCounter++;\n\n setCounter(onSaveCounter);\n\n props.saveChanges(\n addedSubjects,\n removedSubjects,\n bulkPreferencesState,\n onSuccess,\n () => {\n alerts.error(LanguageService.getPhrase(namespace, 'error'));\n setShowSpinner(false);\n }\n );\n }\n\n function onToggleSelectAll(): void {\n const newBulkState = OnboardingHelper.getNextBulkState(bulkPreferencesState, 'topics');\n\n setExpandedSubject(null);\n setBulkPreferencesState(newBulkState);\n }\n\n const optionsGrid = structurePreferencesGrid(props.options);\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <form className='p-3 pb-5'>\n <div className='position-relative'>\n <TopicPreferencesContext.Provider value={{ selectedSubjects: selectedTopics, expandedSubject }}>\n <SubjectPreferenceGrid\n subjects={optionsGrid}\n onSelect={onSelect}\n onExpand={onExpand}\n onCollapse={onCollapse}\n hasSelectedBulk={hasBulkSelectedTopics}\n />\n </TopicPreferencesContext.Provider>\n </div>\n\n <OnboardingFooter>\n <div>\n {!!props.backButtonAppLink && (\n <AppLink appLink={props.backButtonAppLink} className='btn btn-outline-dark'>\n <Text phrase='back' />\n </AppLink>\n )}\n </div>\n\n <div className='d-flex align-items-center justify-content-end'>\n <div className='d-flex me-3'>\n <p onClick={onToggleSelectAll} className='me-2 mb-0 fw-bold'>\n <Text phrase='allSubjects' />\n </p>\n <ToggleSwitch\n onClick={onToggleSelectAll}\n on={hasBulkSelectedTopics}\n hideOutline\n />\n </div>\n <SpinnerButton\n variant='dark'\n disabled={!isValid()}\n onClick={onSave}\n showSpinner={showSpinner}\n >\n <Text phrase={props.isOnboarding ? 'next' : 'save'} />\n </SpinnerButton>\n </div>\n </OnboardingFooter>\n </form>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { PartialTopicPreferences } from 'libs/shared/apps/subjects/components/preferences/topic-preferences/subject-preference-item/partial-loading/PartialTopicPreferences';\nimport { TopicPreferences } from 'libs/shared/apps/subjects/components/preferences/topic-preferences/TopicPreferences';\nimport { useGetPreferredSubjects } from 'libs/shared/apps/subjects/hooks/useGetPreferredSubjects';\nimport { ClassificationPreference } from 'libs/shared/apps/subjects/interfaces/ClassificationPreference';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { BulkOnboardingPreferencesState } from 'libs/shared/enums/BulkOnboardingPreferencesState';\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 { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Classification, CurrentUser, Presentation, PresentationAudience } from 'libs/shared/interfaces';\n\nimport { PreferencesLayout } from 'apps/settings/components/preferences/PreferencesLayout';\n\nconst namespace = 'settings.topicPreferences';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function TopicPreferencesView(): JSX.Element {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n useSetPageMetadata({ title: getPhrase('pageTitle') });\n\n const availablePresentations = Flight.useBasicFetch<Presentation[]>(PreferenceRequests.availablePresentations());\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(PreferenceRequests.allLevelPreferences());\n\n const preselections = useGetPreferredSubjects();\n const topics = Flight.useBasicFetch<ClassificationPreference[]>(PreferenceRequests.allSubjectPreferences());\n\n const {\n bulkOnboardingPreferencesState, isLoadingSettings, updateSetting\n } = useSettings(LocationContext.PreferencesSettings);\n\n const dispatch = useDispatch();\n\n function onSave(\n addedSubjects: string[],\n removedSubjects: Classification[],\n bulkState: BulkOnboardingPreferencesState,\n onSuccess: () => void,\n onError: () => void\n ): void {\n if (bulkState !== bulkOnboardingPreferencesState) {\n const newSetting = {\n name: SettingName.BulkOnboardingPreferencesState,\n value: bulkState,\n kind: SettingKind.Permanent\n };\n\n updateSetting(\n currentUser.data.id,\n newSetting,\n onSuccess,\n onError\n );\n }\n\n if (addedSubjects?.length)\n Flight.fetch(dispatch, PreferenceRequests.followSubjects(addedSubjects, onSuccess, onError));\n\n if (removedSubjects?.length)\n Flight.fetch(dispatch, PreferenceRequests.unfollowSubjects(removedSubjects.map(s => s.id), onSuccess, onError));\n }\n\n const dataLoaded = (\n !!topics.hasCompleted &&\n !!preselections.hasCompleted &&\n !isLoadingSettings\n );\n\n return (\n <PreferencesLayout\n availablePresentations={availablePresentations.data}\n audiences={audiences.data}\n >\n <p className='mt-3'><Text namespace={namespace} phrase='info' /></p>\n\n {dataLoaded ? (\n <TopicPreferences\n options={topics.data}\n preselections={preselections.data}\n bulkPreferencesState={bulkOnboardingPreferencesState}\n saveChanges={onSave}\n />\n ) : <PartialTopicPreferences count={7} style='grid' />}\n </PreferencesLayout>\n );\n}","import { Flight } from 'libs/common/flight';\n\nimport { PreferenceRequests } from 'libs/shared/flight-requests/PreferenceRequests';\nimport { Classification } from 'libs/shared/interfaces';\n\n/**\n * Fetches all followed subjects, then returns\n * the flight response object with only the subjects\n * that are marked as `canBePreferred`.\n * \n * We do this instead of using `formatData` on the request,\n * as some areas of the product that make this request\n * do not need to be filtered.\n * \n * This is intended to be used for onboarding / preference\n * selections only.\n */\nexport function useGetPreferredSubjects(\n onSuccess?: (classifications: Classification[]) => void\n): Flight.Response<Classification[]> {\n const filterSubjects = (subjects: Classification[]) => {\n if (!subjects)\n return [];\n\n return subjects.filter(s => s.canBePreferred);\n };\n\n const followedSubjects = Flight.useBasicFetch<Classification[]>(\n PreferenceRequests.mySubjectPreferences(followedSubjects => {\n onSuccess && onSuccess(filterSubjects(followedSubjects));\n })\n );\n\n return {\n ...followedSubjects,\n isFetching: followedSubjects.isFetching,\n data: filterSubjects(followedSubjects.data)\n };\n}","// extracted by mini-css-extract-plugin\nexport default {\"grid\":\"X9r1Y\",\"subgrid\":\"TgYhp\"};"],"names":["SubjectPreferenceGridRow","props","TopicPreferencesContext","expandedSubject","selections","selectedSubjects","subjects","map","subject","itemDisabled","id","children","find","child","isDisabled","clickHandler","onSelect","isExpandableOption","onExpand","onCollapse","hasSelectedBulk","SubjectPreferenceItem","key","selected","includes","disabled","onClick","SubjectPreferenceGrid","eventHandlers","itemsPerRow","useGetRowItemCapacity","subjectRows","reduce","acc","index","push","ArrayHelper","className","row","i","isExpanded","context","coverUrl","cover","ImageHelper","url","size","childIds","selectedChildCount","filter","selection","length","component","PreferenceItem","name","imageUrl","isSelected","isExpandable","expand","extraClasses","hideStatus","Tooltip","title","ExpandableItemStatus","selectedChildrenCount","SelectableItemStatus","svg","SvgContainer","svgName","radioButton","baseClass","caretClass","role","style","backgroundImage","tabIndex","PartialTopicPreferences","grid","center","Array","count","fill","item","defaultProps","createContext","undefined","useOnSaveAll","onDone","counter","setCounter","val","namespace","TopicPreferences","selectedTopics","setSelectedTopics","setExpandedSubject","bulkPreferencesState","setBulkPreferencesState","showSpinner","setShowSpinner","alerts","hasBulkSelectedTopics","OnboardingHelper","preselections","p","isOnboarding","success","LanguageService","nextAppLink","onSuccess","hasChangedTopics","sort","toString","hasChangedBulkState","isValid","hasChanged","onToggleSelectAll","newBulkState","optionsGrid","rawPreferenceOptions","preferenceOptions","forEach","option","structurePreferencesGrid","options","value","newSelections","backButtonAppLink","AppLink","appLink","Text","phrase","ToggleSwitch","on","hideOutline","SpinnerButton","variant","addedSubjects","removedSubjects","onSaveCounter","saveChanges","error","getPhrase","TopicPreferencesView","currentUser","UserRequests","useSetPageMetadata","filterSubjects","followedSubjects","availablePresentations","PreferenceRequests","audiences","s","canBePreferred","isFetching","data","topics","useSettings","bulkOnboardingPreferencesState","isLoadingSettings","updateSetting","dispatch","dataLoaded","hasCompleted","PreferencesLayout","bulkState","onError","newSetting","SettingName","kind","SettingKind"],"sourceRoot":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/6030-5db8cc1bc4-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/forms/form-buttons/FormButtons.tsx","file:///app/packages/libs/shared/src/components/forms/form-wrapper/FormWrapper.tsx","file:///app/packages/projects/lite/src/apps/settings/components/settings-layout/SettingsLayout.tsx","file:///app/packages/projects/lite/src/apps/settings/components/video-playback/default-video-quality-selector/default-video-quality-selector.scss","file:///app/packages/projects/lite/src/apps/settings/components/video-playback/default-video-quality-selector/DefaultVideoQualitySelector.tsx","file:///app/packages/projects/lite/src/apps/settings/components/video-playback/local-cache-quality-settings/LocalCacheQualitySettings.tsx","file:///app/packages/projects/lite/src/apps/settings/components/video-playback/playback-quality-settings/PlaybackQualitySettings.tsx","file:///app/packages/projects/lite/src/apps/settings/components/video-playback/subtitle-settings/SubtitleSettings.tsx","file:///app/packages/projects/lite/src/apps/settings/views/video-playback/partial-loading/partial-video-playback-settings.scss","file:///app/packages/projects/lite/src/apps/settings/views/video-playback/partial-loading/PartialVideoPlaybackSettings.tsx","file:///app/packages/projects/lite/src/apps/settings/views/video-playback/video-playback-settings.scss","file:///app/packages/projects/lite/src/apps/settings/views/video-playback/VideoPlaybackSettingsView.tsx"],"sourcesContent":["import * as React from 'react';\nimport { ButtonProps } from 'react-bootstrap';\nimport { useFormikContext } from 'formik';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { FormSize } from 'libs/shared/components/forms/form-field/FormField';\nimport { SpinnerButton } from 'libs/shared/components/spinner-button/SpinnerButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { useCanSubmitForm } from 'libs/shared/hooks/UseCanSubmitForm';\n\nconst namespace = 'shared.formButtons';\n\ninterface FormButtonsProps {\n isNew?: boolean;\n submitText?: string;\n variant?: ButtonProps['variant'];\n size?: FormSize;\n className?: string;\n}\n\nexport function FormButtons<Values extends HashObject>(props: FormButtonsProps): JSX.Element {\n const formikProps = useFormikContext<Values>();\n\n const canSubmit = useCanSubmitForm(formikProps);\n\n return (\n <SpinnerButton\n variant={props.variant || 'primary'}\n type='submit'\n disabled={!canSubmit}\n size={props.size}\n className={props.className ? props.className : ''}\n showSpinner={formikProps.isSubmitting}\n >\n {props.submitText\n ? <>{props.submitText}</>\n : <Text namespace={namespace} phrase={props.isNew ? 'create' : 'save'} />}\n </SpinnerButton>\n );\n}\n","import * as React from 'react';\nimport { Formik, FormikConfig, FormikContextType, FormikErrors, FormikHelpers, FormikProps, FormikValues, useFormikContext } from 'formik';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\n/**\n * Note: This currently doesn't support arrays, but the need for arrays as initial\n * form data has not yet come up\n */\nfunction omitNullInitialValues<Values extends FormikValues>(initialValues: Values): Values {\n if (!initialValues)\n return {} as Values;\n\n const values = ObjectHelper.deepClone(initialValues);\n\n function omitChildValues(child: Values): void {\n Object.keys(values).forEach((key: keyof Values) => {\n if (!values.hasOwnProperty(key))\n return;\n \n if (ObjectHelper.isObject(child[key]))\n omitChildValues(child[key]);\n else if (values[key] === null)\n delete values[key];\n });\n }\n\n omitChildValues(values);\n return values;\n}\n\n// Omit attributes from FormikConfig that are defined in FormWrapperProps.\ntype ModifiedFormikConfig<Values extends FormikValues> = Omit<FormikConfig<Values>, 'initialValues' | 'onSubmit'>;\n\ninterface InitialStatus {\n allowInitialSubmit: boolean;\n}\n\nexport type FormSubmissionOptions<FormValues = FormikValues> = {\n reset?: boolean;\n errors?: FormikErrors<FormValues>;\n};\n\ninterface FormWrapperProps<FormValues extends FormikValues, ApiValues extends FormikValues> {\n initialValues: Partial<FormValues | ApiValues>;\n onSubmit: (data: FormValues, onDone: (options?: FormSubmissionOptions<FormValues>) => void) => void;\n castInitialValues?: boolean; // cast to validationSchema\n castValuesOnSubmit?: boolean; // cast to validationSchema\n allowInitialSubmit?: boolean; // if true, useCanSubmitForm will allow submit without any user changes.\n}\n\nFormWrapper.defaultProps = {\n castInitialValues: true,\n castValuesOnSubmit: true\n};\n\nexport function FormWrapper<\n FormValues extends FormikValues = FormikValues,\n ApiValues extends FormikValues = FormValues,\n ExtraProps = HashObject\n>(props: ModifiedFormikConfig<FormValues> & ExtraProps & FormWrapperProps<FormValues, ApiValues>): JSX.Element {\n const { castInitialValues, castValuesOnSubmit, initialValues, onSubmit, ...formikProps } = props;\n\n /**\n * If castInitialValues is true, cast initialValues to the validationSchema.\n * This will ensure that any data fetched from the api conforms to the expected form data shape.\n */\n const formattedInitialValues: FormValues = castInitialValues && props.validationSchema\n ? props.validationSchema.cast(omitNullInitialValues(initialValues))\n : initialValues;\n\n const onSubmitHandler = (\n values: FormValues,\n { setSubmitting, resetForm, setFieldError }: FormikHelpers<FormValues>\n ) => {\n /**\n * validationSchema.cast will coerce the values to the types defined in validationSchema.\n * This is useful for trimming inputs:\n * e.g. if a value field has type Yup.string().trim(), it will be automatically trimmed.\n */\n const formattedData = castValuesOnSubmit && props.validationSchema\n ? props.validationSchema.cast(values)\n : values;\n\n onSubmit(formattedData, (options: FormSubmissionOptions<FormValues> = {}) => {\n options.reset && resetForm();\n\n if (options.errors) {\n for (const [ key, value ] of Object.entries(options.errors)) {\n setFieldError(key, value);\n }\n }\n\n setSubmitting(false);\n });\n };\n\n const initialStatus: InitialStatus = {\n allowInitialSubmit: props.allowInitialSubmit\n };\n\n return (\n <Formik<FormValues, ExtraProps>\n enableReinitialize\n {...(formikProps as ModifiedFormikConfig<FormValues> & ExtraProps)}\n initialValues={formattedInitialValues}\n onSubmit={onSubmitHandler}\n initialStatus={initialStatus}\n >\n {FunctionHelper.isFunction(props.children)\n ? (f: FormikProps<FormValues>) => (props.children as (f: FormikProps<FormValues>) => React.ReactNode)(f)\n : React.Children.count(props.children) ? props.children : null\n }\n </Formik>\n );\n}\n\nexport function useFormikContextWrapper<T>(): FormikContextType<T> {\n return useFormikContext<T>();\n}","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}","// extracted by mini-css-extract-plugin\nexport default {\"radioButton\":\"JKFf9\",\"description\":\"aVBqv\"};","import React from 'react';\nimport { Form } from 'react-bootstrap';\n\nimport { DefaultPlaybackQuality } from 'libs/shared/interfaces';\n\nimport styles from './default-video-quality-selector.scss';\n\ninterface VideoQualityOptionProps {\n id: string;\n name: string;\n description: string;\n selected: boolean;\n value: DefaultPlaybackQuality;\n onSelect: (quality: DefaultPlaybackQuality) => void;\n}\n\nexport function VideoQualityOption(props: VideoQualityOptionProps): JSX.Element {\n return (\n <div>\n <Form.Check\n type='radio'\n id={props.id}\n label={props.name}\n value={props.value}\n onChange={() => props.onSelect(props.value)}\n checked={props.selected}\n className={styles.radioButton}\n />\n <p className={styles.description}>{props.description}</p>\n </div>\n );\n}","import React from 'react';\nimport { Form, useFormikContext } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { FormButtons } from 'libs/shared/components/forms/form-buttons/FormButtons';\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { DefaultPlaybackQuality } from 'libs/shared/interfaces';\n\nimport { VideoQualityOption } from 'apps/settings/components/video-playback/default-video-quality-selector/DefaultVideoQualitySelector';\n\ninterface QualityModel {\n quality: DefaultPlaybackQuality;\n}\n\nconst namespace = 'settings.localCacheQualitySettings';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction LocalCacheQualityForm(): JSX.Element {\n const formikProps = useFormikContext<QualityModel>();\n\n function onSelectValue(value: DefaultPlaybackQuality): void {\n formikProps.setFieldValue('quality', value);\n }\n\n return (\n <Form>\n <VideoQualityOption\n id='local-cache-480'\n name={getPhrase('lowName')}\n description={getPhrase('lowDescription')}\n value={480}\n selected={formikProps.values.quality === 480}\n onSelect={onSelectValue}\n />\n <VideoQualityOption\n id='local-cache-720'\n name={getPhrase('standardName')}\n description={getPhrase('standardDescription')}\n value={720}\n selected={formikProps.values.quality === 720}\n onSelect={onSelectValue}\n />\n <VideoQualityOption\n id='local-cache-1080'\n name={getPhrase('highName')}\n description={getPhrase('highDescription')}\n value={1080}\n selected={formikProps.values.quality === 1080}\n onSelect={onSelectValue}\n />\n\n <FormButtons\n isNew={false}\n variant='outline-dark'\n />\n </Form>\n );\n}\n\ninterface LocalCacheQualitySettingsProps {\n initialValue: DefaultPlaybackQuality;\n onSubmit: (data: QualityModel, onDone: () => void) => void;\n}\n\nexport function LocalCacheQualitySettings(props: LocalCacheQualitySettingsProps): JSX.Element {\n return (\n <>\n <h2 className='h4'><Text namespace={namespace} phrase='heading' /></h2>\n <p><Text namespace={namespace} phrase='description' /></p>\n\n <FormWrapper<QualityModel>\n initialValues={{ quality: props.initialValue }}\n onSubmit={props.onSubmit}\n >\n <LocalCacheQualityForm />\n </FormWrapper>\n </>\n );\n}","import React from 'react';\nimport { Form, useFormikContext } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { FormButtons } from 'libs/shared/components/forms/form-buttons/FormButtons';\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { DefaultPlaybackQuality } from 'libs/shared/interfaces';\n\nimport { VideoQualityOption } from 'apps/settings/components/video-playback/default-video-quality-selector/DefaultVideoQualitySelector';\n\ninterface QualityModel {\n quality: DefaultPlaybackQuality;\n}\n\nconst namespace = 'settings.playbackQualitySettings';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction PlaybackQualityForm(): JSX.Element {\n const formikProps = useFormikContext<QualityModel>();\n\n function onSelectValue(value: DefaultPlaybackQuality): void {\n formikProps.setFieldValue('quality', value);\n }\n\n return (\n <Form>\n <VideoQualityOption\n id='playback-480'\n name={getPhrase('lowName')}\n description={getPhrase('lowDescription')}\n value={480}\n selected={formikProps.values.quality === 480}\n onSelect={onSelectValue}\n />\n <VideoQualityOption\n id='playback-720'\n name={getPhrase('standardName')}\n description={getPhrase('standardDescription')}\n value={720}\n selected={formikProps.values.quality === 720}\n onSelect={onSelectValue}\n />\n <VideoQualityOption\n id='playback-1080'\n name={getPhrase('highName')}\n description={getPhrase('highDescription')}\n value={1080}\n selected={formikProps.values.quality === 1080}\n onSelect={onSelectValue}\n />\n\n <FormButtons<QualityModel>\n isNew={false}\n variant='outline-dark'\n />\n </Form>\n );\n}\n\ninterface PlaybackQualitySettingsProps {\n initialValue: DefaultPlaybackQuality;\n onSubmit: (data: QualityModel, onDone: () => void) => void;\n}\n\nexport function PlaybackQualitySettings(props: PlaybackQualitySettingsProps): JSX.Element {\n return (\n <>\n <h2 className='h4'><Text namespace={namespace} phrase='heading' /></h2>\n <p><Text namespace={namespace} phrase='description' /></p>\n\n <FormWrapper<QualityModel>\n initialValues={{ quality: props.initialValue }}\n onSubmit={props.onSubmit}\n >\n <PlaybackQualityForm />\n </FormWrapper>\n </>\n );\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\n\nconst namespace = 'settings.subtitleSettings';\n\ninterface SubtitleSettingsProps {\n initialValue: boolean;\n onChange: (value: boolean) => void;\n}\n\nexport function SubtitleSettings(props: SubtitleSettingsProps): JSX.Element {\n const [ enabled, setEnabled ] = React.useState(props.initialValue);\n\n function onChange(): void {\n const newValue = !enabled;\n\n props.onChange(newValue);\n setEnabled(newValue);\n }\n \n return (\n <>\n <h2 className='h4'><Text namespace={namespace} phrase='heading' /></h2>\n <div className='d-flex'>\n <p className='fw-semibold me-3'>\n <Text namespace={namespace} phrase='alwaysShowCaptions' />\n </p>\n <ToggleSwitch on={enabled} onClick={onChange} />\n </div>\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialHeading\":\"p1Wlx\",\"partialDescription\":\"BUF8M\",\"partialQualityOption\":\"vKxI0\",\"partialLabel\":\"ZPM9b\",\"partialSaveButton\":\"bS4wu\",\"partialToggle\":\"mVsyW\"};","import React from 'react';\n\nimport styles from './partial-video-playback-settings.scss';\n\nfunction PartialQualityOption(): JSX.Element {\n return (\n <div className={styles.partialQualityOption}>\n <div className={`${styles.partialLabel} mb-1 partial-loading-background`} />\n <div className={`${styles.partialDescription} partial-loading-background`} />\n </div>\n );\n}\n\nexport function PartialVideoPlaybackSettings(): JSX.Element {\n return (\n <>\n <div className={`${styles.partialHeading} mb-2 partial-loading-background`} />\n <div className={`${styles.partialDescription} partial-loading-background`} />\n\n <PartialQualityOption />\n <PartialQualityOption />\n <PartialQualityOption />\n\n <div className={`${styles.partialSaveButton} partial-loading-background`} />\n \n <hr className='my-4' />\n\n <div className={`${styles.partialHeading} mb-2 partial-loading-background`} />\n <div className={`${styles.partialDescription} partial-loading-background`} />\n\n <PartialQualityOption />\n <PartialQualityOption />\n <PartialQualityOption />\n \n <div className={`${styles.partialSaveButton} partial-loading-background`} />\n\n <hr className='my-4' />\n\n <div className={`${styles.partialHeading} mb-2 partial-loading-background`} />\n <div className={`${styles.partialToggle} partial-loading-background`} />\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"container\":\"oqAZz\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { SettingKind } from 'libs/shared/enums/SettingKind';\nimport { SettingName } from 'libs/shared/enums/SettingName';\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 { CurrentUser } from 'libs/shared/interfaces';\n\nimport { SettingsLayout } from 'apps/settings/components/settings-layout/SettingsLayout';\nimport { LocalCacheQualitySettings } from 'apps/settings/components/video-playback/local-cache-quality-settings/LocalCacheQualitySettings';\nimport { PlaybackQualitySettings } from 'apps/settings/components/video-playback/playback-quality-settings/PlaybackQualitySettings';\nimport { SubtitleSettings } from 'apps/settings/components/video-playback/subtitle-settings/SubtitleSettings';\n\nimport { PartialVideoPlaybackSettings } from './partial-loading/PartialVideoPlaybackSettings';\n\nimport styles from './video-playback-settings.scss';\n\nconst namespace = 'settings.videoPlayback';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function VideoPlaybackSettingsView(): JSX.Element {\n useSetPageMetadata({ title: getPhrase('pageTitle') });\n\n const alerts = useAlerts();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const {\n defaultPlaybackQuality,\n defaultLocalCachePlaybackQuality,\n enableSubtitlesDefault,\n isLoadingSettings,\n updateSetting\n } = useSettings(LocationContext.Settings);\n\n function onSavePlaybackQuality({ quality }: HashObject, onDone: () => void): void {\n if (quality === defaultPlaybackQuality)\n return;\n\n const newSetting = {\n name: SettingName.DefaultPlaybackQuality,\n value: quality,\n kind: SettingKind.Permanent\n };\n\n updateSetting(\n currentUser.data.customerId,\n newSetting,\n () => alerts.success(getPhrase('playbackSuccess')),\n () => alerts.error(getPhrase('playbackError')),\n onDone\n );\n }\n\n function onSaveLocalCacheQuality({ quality }: HashObject, onDone: () => void): void {\n if (quality === defaultLocalCachePlaybackQuality)\n return;\n\n const newSetting = {\n name: SettingName.DefaultLocalCachePlaybackQuality,\n value: quality,\n kind: SettingKind.Permanent\n };\n\n updateSetting(\n currentUser.data.customerId,\n newSetting,\n () => alerts.success(getPhrase('lcSuccess')),\n () => alerts.error(getPhrase('lcError')),\n onDone\n );\n }\n\n function onSaveDefaultSubtitleState(value: boolean): void {\n const newSetting = {\n name: SettingName.EnableSubtitlesDefault,\n value,\n kind: SettingKind.Permanent\n };\n\n updateSetting(\n currentUser.data.customerId,\n newSetting,\n () => alerts.success(getPhrase(value ? 'subtitleEnableSuccess' : 'subtitleDisableSuccess')),\n () => alerts.error(getPhrase('subtitleError'))\n );\n }\n\n return (\n <SettingsLayout\n heading={getPhrase('heading')}\n breadcrumbs={[getPhrase('breadcrumb')]}\n >\n {!isLoadingSettings\n ? (\n <div className={styles.container}>\n <PlaybackQualitySettings\n initialValue={defaultPlaybackQuality}\n onSubmit={onSavePlaybackQuality}\n />\n\n <hr className='my-4' />\n\n <LocalCacheQualitySettings\n initialValue={defaultLocalCachePlaybackQuality}\n onSubmit={onSaveLocalCacheQuality}\n />\n\n <hr className='my-4' />\n\n <SubtitleSettings\n initialValue={enableSubtitlesDefault}\n onChange={onSaveDefaultSubtitleState}\n />\n </div>\n ) : (\n <PartialVideoPlaybackSettings />\n )\n }\n </SettingsLayout>\n );\n}"],"names":["namespace","FormButtons","props","formikProps","canSubmit","variant","type","disabled","size","className","showSpinner","isSubmitting","submitText","phrase","isNew","FormWrapper","castInitialValues","castValuesOnSubmit","initialValues","onSubmit","formattedInitialValues","validationSchema","cast","values","omitChildValues","child","Object","keys","forEach","key","hasOwnProperty","omitNullInitialValues","initialStatus","allowInitialSubmit","enableReinitialize","setSubmitting","resetForm","setFieldError","formattedData","options","reset","errors","entries","value","children","f","useFormikContextWrapper","defaultProps","useCanAccessSettings","requiredPermissions","hasPermissions","settingsGroups","currentRoute","application","some","group","modules","settingsModule","appLink","action","SettingsLayout","canAccess","replace","breadcrumbs","map","name","i","active","length","heading","headingButton","description","VideoQualityOption","Form","id","label","onChange","onSelect","checked","selected","getPhrase","LanguageService","LocalCacheQualityForm","onSelectValue","setFieldValue","quality","LocalCacheQualitySettings","Text","initialValue","PlaybackQualityForm","PlaybackQualitySettings","SubtitleSettings","enabled","setEnabled","ToggleSwitch","on","onClick","newValue","PartialQualityOption","PartialVideoPlaybackSettings","VideoPlaybackSettingsView","useSetPageMetadata","title","alerts","currentUser","UserRequests","useSettings","defaultPlaybackQuality","defaultLocalCachePlaybackQuality","enableSubtitlesDefault","isLoadingSettings","updateSetting","onDone","newSetting","SettingName","kind","SettingKind","data","customerId","success","error"],"sourceRoot":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/618-4334f9451b-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/dashboard/views/dashboard-widget/partial-loading/partial-dashboard-widget.scss","file:///app/packages/projects/lite/src/apps/dashboard/views/dashboard-widget/partial-loading/PartialDashboardWidget.tsx","file:///app/packages/projects/lite/src/apps/dashboard/views/dashboard-widget/CuratedDashboardWidgetView.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 {\"partialHeading\":\"yLlYt\"};","import React from 'react';\n\nimport { PartialVideoList } from 'libs/shared/components/video-list/partial-loading/PartialVideoList';\n\nimport styles from './partial-dashboard-widget.scss';\n\nexport function PartialDashboardWidget(): JSX.Element {\n return (\n <div className='px-3'>\n <div className={`partial-loading-background mb-2 ${styles.partialHeading}`} />\n <PartialVideoList />\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 { Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { VideoList } from 'libs/shared/components/video-list/VideoList';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { RelatedVideosContext } from 'libs/shared/enums/RelatedVideosContext';\nimport { DashboardRequests } from 'libs/shared/flight-requests/DashboardRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useBreadcrumbs } from 'libs/shared/hooks/useBreadcrumbs';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { CuratedWidget, CuratedWidgetData, CurrentUser, Video } 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';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { PartialDashboardWidget } from './partial-loading/PartialDashboardWidget';\n\nconst namespace = 'dashboard.dashboardWidget';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface CuratedDashboardWidgetViewQueryParams {\n widgetId?: string;\n}\n\nexport function CuratedDashboardWidgetView(props: CuratedDashboardWidgetViewQueryParams): JSX.Element {\n const { widgetId } = props;\n\n const { commonVideoProps } = useCommonVideoProps({ locationContext: LocationContext.VideoThumbnail });\n \n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem });\n\n const widget = Flight.useBasicFetch<CuratedWidget<CuratedWidgetData, Video[]>>(\n widgetId && DashboardRequests.dashboardWidgetContent(widgetId)\n );\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const videos = widget.data?.content;\n useVideoMixin(videos);\n\n useSetPageMetadata(PageMetadataHelper.getDefaultMetadata({\n title: widget.data?.name,\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n },\n canonicalLink: SeoHelper.getCanonicalLink({ stripPresentationSlug: true }),\n allowIndexing: SeoHelper.allowIndexing()\n }));\n\n const audiences = usePresentationAudiences();\n const { hasPermissions } = usePermissions();\n\n const breadcrumbs = useBreadcrumbs({ name: widget.data?.name });\n\n if (!widget.data || !videos?.length)\n return <PartialDashboardWidget />;\n\n return (\n <VideoActionsContext.Provider value={videoActions}>\n <div className='px-3'>\n <h1 className='h2 mb-2'>{widget.data.name}</h1>\n <Breadcrumbs breadcrumbs={breadcrumbs} />\n <VideoList\n videos={videos}\n getVideoAppLink={(video, opts) => VideoAppLinkHelper.getAppLink(video, {\n ...opts,\n context: RelatedVideosContext.Widget,\n contextId: props.widgetId,\n includeContext: currentUser.data?.isAuthenticated\n })}\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","PartialDashboardWidget","className","PartialVideoList","getPhrase","LanguageService","CuratedDashboardWidgetView","props","widgetId","commonVideoProps","useCommonVideoProps","locationContext","videoActions","useVideoActions","location","widget","DashboardRequests","currentUser","UserRequests","videos","content","useVideoMixin","useSetPageMetadata","PageMetadataHelper","title","name","phraseContext","phraseHandler","titlePhrase","descriptionPhrase","canonicalLink","SeoHelper","stripPresentationSlug","allowIndexing","audiences","usePresentationAudiences","hasPermissions","usePermissions","VideoActionsContext","value","Breadcrumbs","VideoList","getVideoAppLink","video","opts","VideoAppLinkHelper","context","RelatedVideosContext","contextId","includeContext","isAuthenticated","presentationAudiences","getPreviewQuestionsAppLink","interactive","InteractiveHelper","options","mtv","flightNamespace","sharedPlaylist","isPlugin","u","setFavourite","canFavourite","hasTopicDirectories","isLoadingSettings","hasLoadedPermissions","isLoaded","hasStudentExperience","config","yearGroups","customerId","hasCommonVideoPropsCompleted","subTextType","getSubTextAppLink","series","imageCdnUrl","getClassroomGuideAppLink","getInteractiveGuidanceAppLink","getResourceGuidanceAppLink","showNewVideoIndicator","companyLogoFallbackUrl","redirectOnError","activePresentation","getFallbackPresentation","presentation","objects","videoIds","Array","isArray","filter","o","getValidObjects","v","ids"],"sourceRoot":""}