@clickview/lite 0.59.0-rc.7 → 0.59.0-rc.8

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 (119) hide show
  1. package/dist/bundles.json +1 -1
  2. package/dist/scripts/1041-e67122b7dc-lite.chunk.js +2 -0
  3. package/dist/scripts/1041-e67122b7dc-lite.chunk.js.map +1 -0
  4. package/dist/scripts/{1080-aebdd2fd94-lite.chunk.js → 1080-db39a50a32-lite.chunk.js} +2 -2
  5. package/dist/scripts/1080-db39a50a32-lite.chunk.js.map +1 -0
  6. package/dist/scripts/{1169-b84be13a05-lite.chunk.js → 1169-394baed329-lite.chunk.js} +2 -2
  7. package/dist/scripts/1169-394baed329-lite.chunk.js.map +1 -0
  8. package/dist/scripts/{143-e8df681adb-lite.chunk.js → 143-851fefbbc8-lite.chunk.js} +2 -2
  9. package/dist/scripts/143-851fefbbc8-lite.chunk.js.map +1 -0
  10. package/dist/scripts/{170-edaa4055be-lite.chunk.js → 170-6dda8ec96e-lite.chunk.js} +3 -3
  11. package/dist/scripts/170-6dda8ec96e-lite.chunk.js.map +1 -0
  12. package/dist/scripts/2015-0cb7aead83-lite.chunk.js +2 -0
  13. package/dist/scripts/2015-0cb7aead83-lite.chunk.js.map +1 -0
  14. package/dist/scripts/204-67566b75e7-lite.chunk.js +2 -0
  15. package/dist/scripts/204-67566b75e7-lite.chunk.js.map +1 -0
  16. package/dist/scripts/2215-c47eb22183-lite.chunk.js +2 -0
  17. package/dist/scripts/2215-c47eb22183-lite.chunk.js.map +1 -0
  18. package/dist/scripts/{2340-16e28533f3-lite.chunk.js → 2340-6179f12db3-lite.chunk.js} +2 -2
  19. package/dist/scripts/2340-6179f12db3-lite.chunk.js.map +1 -0
  20. package/dist/scripts/2571-70477f279b-lite.chunk.js +2 -0
  21. package/dist/scripts/2571-70477f279b-lite.chunk.js.map +1 -0
  22. package/dist/scripts/{2581-bf3d282cb9-lite.chunk.js → 2581-f21f1ac71e-lite.chunk.js} +3 -3
  23. package/dist/scripts/2581-f21f1ac71e-lite.chunk.js.map +1 -0
  24. package/dist/scripts/3731-eeabea3393-lite.chunk.js +3 -0
  25. package/dist/scripts/3731-eeabea3393-lite.chunk.js.map +1 -0
  26. package/dist/scripts/{4013-3070636adb-lite.chunk.js → 4013-9e41670948-lite.chunk.js} +3 -3
  27. package/dist/scripts/4013-9e41670948-lite.chunk.js.map +1 -0
  28. package/dist/scripts/{4205-cf817cce7b-lite.chunk.js → 4205-2d3c5f264f-lite.chunk.js} +2 -2
  29. package/dist/scripts/4205-2d3c5f264f-lite.chunk.js.map +1 -0
  30. package/dist/scripts/{490-9b7a10c66a-lite.chunk.js → 490-f8e5bbb09c-lite.chunk.js} +2 -2
  31. package/dist/scripts/490-f8e5bbb09c-lite.chunk.js.map +1 -0
  32. package/dist/scripts/4944-c5ba3ff091-lite.chunk.js +2 -0
  33. package/dist/scripts/4944-c5ba3ff091-lite.chunk.js.map +1 -0
  34. package/dist/scripts/{5220-85356e2ed6-lite.chunk.js → 5220-0cca67a7e7-lite.chunk.js} +3 -3
  35. package/dist/scripts/5220-0cca67a7e7-lite.chunk.js.map +1 -0
  36. package/dist/scripts/{5224-6e7208837b-lite.chunk.js → 5224-ebdead7925-lite.chunk.js} +2 -2
  37. package/dist/scripts/5224-ebdead7925-lite.chunk.js.map +1 -0
  38. package/dist/scripts/{5836-27add12a78-lite.chunk.js → 5836-921d683eb5-lite.chunk.js} +2 -2
  39. package/dist/scripts/5836-921d683eb5-lite.chunk.js.map +1 -0
  40. package/dist/scripts/{5936-e61ae32ed3-lite.chunk.js → 5936-d1117ce842-lite.chunk.js} +2 -2
  41. package/dist/scripts/5936-d1117ce842-lite.chunk.js.map +1 -0
  42. package/dist/scripts/{6118-857c2f6b97-lite.chunk.js → 6118-3dbd569840-lite.chunk.js} +2 -2
  43. package/dist/scripts/6118-3dbd569840-lite.chunk.js.map +1 -0
  44. package/dist/scripts/{6263-dcc4cb4933-lite.chunk.js → 6263-d084bdb444-lite.chunk.js} +2 -2
  45. package/dist/scripts/6263-d084bdb444-lite.chunk.js.map +1 -0
  46. package/dist/scripts/{6368-d33570d16d-lite.chunk.js → 6368-c296821dd9-lite.chunk.js} +2 -2
  47. package/dist/scripts/6368-c296821dd9-lite.chunk.js.map +1 -0
  48. package/dist/scripts/{6741-5bf7ea5363-lite.chunk.js → 6741-9799a705b8-lite.chunk.js} +3 -3
  49. package/dist/scripts/6741-9799a705b8-lite.chunk.js.map +1 -0
  50. package/dist/scripts/{6934-11a3f3e147-lite.chunk.js → 6934-5647e18a41-lite.chunk.js} +2 -2
  51. package/dist/scripts/6934-5647e18a41-lite.chunk.js.map +1 -0
  52. package/dist/scripts/7234-fecb9339e5-lite.chunk.js +2 -0
  53. package/dist/scripts/7234-fecb9339e5-lite.chunk.js.map +1 -0
  54. package/dist/scripts/{7709-fb358991a1-lite.chunk.js → 7709-18e41d81b8-lite.chunk.js} +2 -2
  55. package/dist/scripts/7709-18e41d81b8-lite.chunk.js.map +1 -0
  56. package/dist/scripts/{9139-63b528ce93-lite.chunk.js → 9139-251b1d5a38-lite.chunk.js} +2 -2
  57. package/dist/scripts/9139-251b1d5a38-lite.chunk.js.map +1 -0
  58. package/dist/scripts/{9173-c164578a27-lite.chunk.js → 9173-1cb2d7c045-lite.chunk.js} +2 -2
  59. package/dist/scripts/9173-1cb2d7c045-lite.chunk.js.map +1 -0
  60. package/dist/scripts/9284-ca348ab523-lite.chunk.js +2 -0
  61. package/dist/scripts/9284-ca348ab523-lite.chunk.js.map +1 -0
  62. package/dist/scripts/{9395-7aa400f517-lite.chunk.js → 9395-10f1a8adfe-lite.chunk.js} +3 -3
  63. package/dist/scripts/{9395-7aa400f517-lite.chunk.js.map → 9395-10f1a8adfe-lite.chunk.js.map} +1 -1
  64. package/dist/scripts/{953-4e10bd618b-lite.chunk.js → 953-279b3b79cd-lite.chunk.js} +3 -3
  65. package/dist/scripts/{953-4e10bd618b-lite.chunk.js.map → 953-279b3b79cd-lite.chunk.js.map} +1 -1
  66. package/dist/scripts/bundle-55d31077c4.min.js +3 -0
  67. package/dist/scripts/bundle-55d31077c4.min.js.map +1 -0
  68. package/package.json +1 -1
  69. package/dist/scripts/1080-aebdd2fd94-lite.chunk.js.map +0 -1
  70. package/dist/scripts/1169-b84be13a05-lite.chunk.js.map +0 -1
  71. package/dist/scripts/143-e8df681adb-lite.chunk.js.map +0 -1
  72. package/dist/scripts/170-edaa4055be-lite.chunk.js.map +0 -1
  73. package/dist/scripts/204-abf7907929-lite.chunk.js +0 -2
  74. package/dist/scripts/204-abf7907929-lite.chunk.js.map +0 -1
  75. package/dist/scripts/2215-69d4d628e5-lite.chunk.js +0 -2
  76. package/dist/scripts/2215-69d4d628e5-lite.chunk.js.map +0 -1
  77. package/dist/scripts/2340-16e28533f3-lite.chunk.js.map +0 -1
  78. package/dist/scripts/2581-bf3d282cb9-lite.chunk.js.map +0 -1
  79. package/dist/scripts/3525-36cfbbfcf2-lite.chunk.js +0 -2
  80. package/dist/scripts/3525-36cfbbfcf2-lite.chunk.js.map +0 -1
  81. package/dist/scripts/4013-3070636adb-lite.chunk.js.map +0 -1
  82. package/dist/scripts/4205-cf817cce7b-lite.chunk.js.map +0 -1
  83. package/dist/scripts/490-9b7a10c66a-lite.chunk.js.map +0 -1
  84. package/dist/scripts/4944-44f59087ce-lite.chunk.js +0 -2
  85. package/dist/scripts/4944-44f59087ce-lite.chunk.js.map +0 -1
  86. package/dist/scripts/5220-85356e2ed6-lite.chunk.js.map +0 -1
  87. package/dist/scripts/5224-6e7208837b-lite.chunk.js.map +0 -1
  88. package/dist/scripts/5836-27add12a78-lite.chunk.js.map +0 -1
  89. package/dist/scripts/5886-13395190b8-lite.chunk.js +0 -3
  90. package/dist/scripts/5886-13395190b8-lite.chunk.js.map +0 -1
  91. package/dist/scripts/5936-e61ae32ed3-lite.chunk.js.map +0 -1
  92. package/dist/scripts/6118-857c2f6b97-lite.chunk.js.map +0 -1
  93. package/dist/scripts/6263-dcc4cb4933-lite.chunk.js.map +0 -1
  94. package/dist/scripts/6368-d33570d16d-lite.chunk.js.map +0 -1
  95. package/dist/scripts/6741-5bf7ea5363-lite.chunk.js.map +0 -1
  96. package/dist/scripts/6934-11a3f3e147-lite.chunk.js.map +0 -1
  97. package/dist/scripts/7234-ef069e6013-lite.chunk.js +0 -2
  98. package/dist/scripts/7234-ef069e6013-lite.chunk.js.map +0 -1
  99. package/dist/scripts/7709-fb358991a1-lite.chunk.js.map +0 -1
  100. package/dist/scripts/8813-887868f687-lite.chunk.js +0 -2
  101. package/dist/scripts/8813-887868f687-lite.chunk.js.map +0 -1
  102. package/dist/scripts/9139-63b528ce93-lite.chunk.js.map +0 -1
  103. package/dist/scripts/9173-c164578a27-lite.chunk.js.map +0 -1
  104. package/dist/scripts/9284-7f6bbe012f-lite.chunk.js +0 -2
  105. package/dist/scripts/9284-7f6bbe012f-lite.chunk.js.map +0 -1
  106. package/dist/scripts/bundle-403f576ace.min.js +0 -3
  107. package/dist/scripts/bundle-403f576ace.min.js.map +0 -1
  108. /package/dist/css/{3525-lite-52288b11e5.chunk.css → 1041-lite-52288b11e5.chunk.css} +0 -0
  109. /package/dist/css/{8813-lite-52288b11e5.chunk.css → 2015-lite-52288b11e5.chunk.css} +0 -0
  110. /package/dist/css/{5886-lite-3633cd9770.chunk.css → 3731-lite-3633cd9770.chunk.css} +0 -0
  111. /package/dist/scripts/{170-edaa4055be-lite.chunk.js.LICENSE.txt → 170-6dda8ec96e-lite.chunk.js.LICENSE.txt} +0 -0
  112. /package/dist/scripts/{2581-bf3d282cb9-lite.chunk.js.LICENSE.txt → 2581-f21f1ac71e-lite.chunk.js.LICENSE.txt} +0 -0
  113. /package/dist/scripts/{4013-3070636adb-lite.chunk.js.LICENSE.txt → 3731-eeabea3393-lite.chunk.js.LICENSE.txt} +0 -0
  114. /package/dist/scripts/{5220-85356e2ed6-lite.chunk.js.LICENSE.txt → 4013-9e41670948-lite.chunk.js.LICENSE.txt} +0 -0
  115. /package/dist/scripts/{5886-13395190b8-lite.chunk.js.LICENSE.txt → 5220-0cca67a7e7-lite.chunk.js.LICENSE.txt} +0 -0
  116. /package/dist/scripts/{6741-5bf7ea5363-lite.chunk.js.LICENSE.txt → 6741-9799a705b8-lite.chunk.js.LICENSE.txt} +0 -0
  117. /package/dist/scripts/{9395-7aa400f517-lite.chunk.js.LICENSE.txt → 9395-10f1a8adfe-lite.chunk.js.LICENSE.txt} +0 -0
  118. /package/dist/scripts/{953-4e10bd618b-lite.chunk.js.LICENSE.txt → 953-279b3b79cd-lite.chunk.js.LICENSE.txt} +0 -0
  119. /package/dist/scripts/{bundle-403f576ace.min.js.LICENSE.txt → bundle-55d31077c4.min.js.LICENSE.txt} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/5836-27add12a78-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/UseHandleObjectError.ts","file:///app/packages/projects/lite/src/shared/components/play-clip/PlayClip.tsx","file:///app/packages/projects/lite/src/shared/hooks/usePresentationAudiences.ts","file:///app/packages/projects/lite/src/shared/views/play-clip/PlayClipView.tsx"],"sourcesContent":["import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n}\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};\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.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import { useEffect } from 'react';\n\nimport { 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';\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 { SignUpDescriptors, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoAtAGlance } from 'libs/shared/components/video-at-a-glance/VideoAtAGlance';\nimport { hasGlanceData } from 'libs/shared/components/video-at-a-glance/VideoAtAGlanceUtils';\nimport { VideoDetailsWithScrollbar } from 'libs/shared/components/video-details/VideoDetails';\nimport { VideoDetailsPartial } from 'libs/shared/components/video-details/VideoDetailsPartial';\nimport { VideoList } from 'libs/shared/components/video-list/VideoList';\nimport { FixedWidget } from 'libs/shared/components/widgets/fixed-widget';\nimport { ClipWidgetItem, ClipWidgetItemProps } from 'libs/shared/components/widgets/items/clip-widget-item/ClipWidgetItem';\nimport { InteractiveWidgetItem, InteractiveWidgetItemProps } from 'libs/shared/components/widgets/items/interactive-widget-item/InteractiveWidgetItem';\nimport { ResourceWidgetItem, ResourceWidgetItemProps } from 'libs/shared/components/widgets/items/resource-widget-item/ResourceWidgetItem';\nimport { GlobalPlayerConsumer } from 'libs/shared/context/player-context/components/GlobalPlayerConsumer';\nimport { usePlayerContext } from 'libs/shared/context/player-context/PlayerContext';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { HasProductFunc } from 'libs/shared/hooks/UseProducts';\nimport { useTableOfContentsScroll } from 'libs/shared/hooks/useTableOfContentsScroll';\nimport { CanFavouriteFunc, Clip, CurrentUser, FavouriteFunc, Interactive, InteractiveMetadata, Link, PointOfInterest, PresentationAudience, Resource, Theme, Video, YearGroup } from 'libs/shared/interfaces';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\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 { PlayPageTitleAndActions } from 'shared/components/play-page/components/title-and-actions/PlayPageTitleAndActions';\nimport { getResources } from 'shared/components/play-page/PlayPageUtils';\nimport { RestrictionBanner } from 'shared/components/play-page/RestrictionBanner';\nimport { PlayerPlaceholder } from 'shared/components/player-placeholder/PlayerPlaceholder';\nimport { RelatedVideos } from 'shared/components/related-videos/RelatedVideos';\nimport { ImageUrls } from 'shared/constants/ImageUrls';\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 { VideoFeaturesHash } from 'shared/hooks/useVideoFeatureAccess';\nimport { InteractiveHelpers } from 'shared/utils/InteractiveHelper';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nconst getResourceAppLink = (videoId: string, shareId: string, canViewResource: boolean) =>\n (resource: Resource | Link) => {\n if (!canViewResource) {\n return {\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.SIGN_UP\n };\n }\n\n return {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PREVIEW_PDF,\n args: [resource.id],\n params: {\n videoId: videoId,\n shareId: shareId\n }\n };\n };\n\nconst namespace = 'shared.playClip';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ntype DetailsViewType = {\n view: 'v@g' | 'details' | 'loading';\n referrer: 'v@g' | 'details';\n};\n\ninterface PlayClipProps {\n clip: Clip;\n interactives: InteractiveMetadata[];\n clips: Clip[];\n originalVideo: Video;\n currentUser: CurrentUser;\n yearGroups: YearGroup[];\n relatedVideos: RelatedVideosHash;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n queryParams: PlayViewQueryParams;\n hasProduct: HasProductFunc;\n audiences: PresentationAudience[];\n imageCdnUrl: string;\n shareId?: string;\n canManageVideoAccess: boolean;\n pointsOfInterest?: PointOfInterest[];\n featureAccess: VideoFeaturesHash;\n glanceTheme?: Theme;\n glanceLoaded: boolean;\n tableOfContentsId: string;\n isPlugin: boolean;\n}\n\nexport function PlayClip(props: PlayClipProps): JSX.Element {\n const playerContext = usePlayerContext();\n\n const { hasPermissions } = usePermissions();\n const { canConsume } = VideoHelper.getCanBeConsumed(props.clip);\n \n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem });\n\n const resourcesRef = React.useRef<HTMLDivElement>(null);\n const interactivesRef = React.useRef<HTMLDivElement>(null);\n\n useTableOfContentsScroll([\n resourcesRef.current,\n interactivesRef.current\n ], props.tableOfContentsId);\n\n const isArchived = VideoHelper.isVideoTypeArchived(props.clip);\n const hasStudentExperience = hasPermissions(PermissionName.StudentExperience);\n /**\n * Need to use a ref because if we use state, onExitImmersiveReader will have a stale\n * reference of the state. This is because the state is changed in onLaunchImmersiveReader\n * which is passed in at the same time as onExitImmersiveReader\n */\n const shouldPlayOnExitImmersiveReader = React.useRef(false);\n\n const hasGlance = hasGlanceData(props.clip, props.glanceTheme) && props.featureAccess.canViewGlance;\n\n const [ detailsView, setDetailsView ] = React.useState<DetailsViewType>({\n view: 'loading',\n referrer: null\n });\n\n React.useEffect(() => {\n if (!props.glanceLoaded)\n return;\n\n setDetailsView({\n view: props.glanceTheme ? 'v@g' : 'details',\n referrer: null\n });\n }, [ props.glanceLoaded, props.glanceTheme ]);\n\n function onLaunchImmersiveReader(): void {\n shouldPlayOnExitImmersiveReader.current = !playerContext?.playerRef?.current?.isPaused();\n playerContext?.playerRef?.current?.pause();\n }\n\n function onExitImmersiveReader(): void {\n if (!shouldPlayOnExitImmersiveReader.current)\n return;\n\n playerContext?.playerRef?.current?.play();\n }\n\n function limitAccess(): boolean {\n if (!props.currentUser?.isAuthenticated)\n return true;\n\n if (!props.hasProduct(ProductId.Primary))\n return true;\n\n if (hasStudentExperience)\n return true;\n\n return false;\n }\n\n const canAccessOriginal = props.originalVideo && !limitAccess() && !!props.clip._canBeConsumed?.value;\n\n function getOriginalVideoAppLink(): Core.AppLink {\n if (!canAccessOriginal)\n return null;\n \n return {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PLAY_VIDEO,\n args: [ props.originalVideo.id, TextHelper.slugify(props.originalVideo.name) ]\n };\n }\n\n const showPlayerPlaceholder = playerContext.mode === 'picture-in-picture' || props.featureAccess.canViewPublicLayout;\n\n const resourcesWidget = getResources(props.clip, hasStudentExperience);\n\n const otherClips = props.clips?.filter(c => c.id.toString() !== props.clip.id.toString()) ?? [];\n\n return (\n <div className='px-4'>\n <RestrictionBanner\n restrictions={props.clip._restrictions}\n yearGroups={props.yearGroups}\n objectId={props.clip.id}\n objectTypeId={MasterType.Clip}\n canManageVideoAccess={props.canManageVideoAccess}\n />\n\n {isArchived && (\n <ArchivedBanner\n typeId={props.clip.typeId}\n hasStudentExperience={hasStudentExperience}\n />\n )}\n\n <section className={`mb-2`}>\n {canConsume &&\n <GlobalPlayerConsumer\n key={props.clip.id}\n objectId={props.clip.id}\n objectTypeId={props.clip.typeId}\n shareId={props.shareId}\n context={props.queryParams?.context}\n contextId={props.queryParams?.contextId}\n moviesAndTv={props.queryParams?.mtv}\n playNext={props.queryParams?.playNext}\n startTime={props.queryParams?.t ?? props.queryParams?.startTime}\n mode='default'\n location='play-page'\n />\n }\n <div className={showPlayerPlaceholder ? '' : 'd-none'}>\n <PlayerPlaceholder\n video={props.clip}\n type='pip'\n />\n </div>\n </section>\n\n <PlayPageTitleAndActions\n media={props.clip}\n yearGroups={props.yearGroups}\n audiences={props.audiences}\n originalVideoAppLink={getOriginalVideoAppLink()}\n featureAccess={props.featureAccess}\n shareId={props.shareId}\n />\n\n {/* \n * Toggling between display 'block' and 'none' is *deliberate* done here to facilitate exposure of our content to bots for SEO.\n * The markup of all 3 components should be available in the DOM from the first render. If you're going to refactor,\n * please don't neglect this usecase - Mike\n */}\n <section className={`${detailsView.view === 'v@g' ? 'd-block' : 'd-none'}`}>\n <VideoAtAGlance\n theme={props.glanceTheme}\n video={props.clip}\n pointsOfInterest={props.pointsOfInterest}\n onClickShowDescription={() => setDetailsView({ view: 'details', referrer: 'v@g' })}\n setStartTime={(time: number) => playerContext.playerRef.current?.currentTime(time)}\n getTagAppLink={tag => ({\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n params: { tagOrClassification: tag.name }\n })}\n suppressInteractivity={props.featureAccess.canViewPublicLayout}\n />\n </section>\n\n <section className={`${detailsView.view === 'details' ? 'd-block' : 'd-none'}`}>\n <VideoDetailsWithScrollbar\n video={props.clip}\n currentUser={props.currentUser}\n onLaunchImmersiveReader={onLaunchImmersiveReader}\n onExitImmersiveReader={onExitImmersiveReader}\n onClickClose={hasGlance && (() => setDetailsView({ view: 'v@g', referrer: 'details' }))}\n getTagAppLink={tag => ({\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n params: { tagOrClassification: tag.name }\n })}\n hideTags={hasGlance}\n suppressInteractivity={props.featureAccess.canViewPublicLayout}\n />\n </section>\n\n <section className={`${detailsView.view === 'loading' ? 'd-block' : 'd-none'}`}>\n <VideoDetailsPartial />\n </section>\n\n {!!resourcesWidget?.length && (\n <section className='pb-3' id={PlayPageAnchor.Resources} ref={resourcesRef}>\n <FixedWidget<ResourceWidgetItemProps>\n name={getPhrase('resources', { count: resourcesWidget.length })}\n contents={WidgetContents.PlayPageResources}\n collection={resourcesWidget}\n prefetched\n childComponent={ResourceWidgetItem}\n extraChildComponentProps={{\n imageCdnUrl: props.imageCdnUrl,\n imageErrorFallbackUrl: ImageUrls.Fallbacks.RESOURCE_THUMBNAIL,\n actionBehaviour: props.featureAccess.canViewResourceItems ? 'normal' : 'public',\n location: 'play-page',\n titlePosition: 'above',\n hideTypeBadge: true\n }}\n getChildAppLink={getResourceAppLink(\n props.clip?.id,\n props.shareId,\n props.featureAccess.canViewResourceItems\n )}\n analyticsOptions={(() => {\n if (props.featureAccess.canViewResourceItems)\n return {};\n\n return {\n workflowPhase: WorkflowPhase.Start,\n descriptor: SignUpDescriptors.SignUp\n };\n })()}\n analyticsData={{ widgetId: 'resources' }}\n />\n </section>\n )}\n\n {!!(otherClips?.length && !limitAccess()) && (\n <div className='pb-3'>\n <FixedWidget<ClipWidgetItemProps>\n name={getPhrase('otherClips', { count: otherClips.length })}\n contents={WidgetContents.Clips}\n collection={otherClips}\n prefetched\n getChildAppLink={(clip: Clip) => {\n return {\n application: AppChannels.CLIPS,\n action: Actions.Clips.PLAY_CLIP,\n args: [ clip.id, TextHelper.slugify(clip.name) ]\n };\n }}\n childComponent={ClipWidgetItem}\n extraChildComponentProps={{ video: props.originalVideo, imageCdnUrl: props.imageCdnUrl }}\n analyticsData={{ widgetId: 'clips' }}\n />\n </div>\n )}\n\n {!!(props.interactives?.length && !limitAccess()) && (\n <div className='pb-3' id={PlayPageAnchor.Interactives} ref={interactivesRef}>\n <FixedWidget<InteractiveWidgetItemProps>\n name={getPhrase('interactives', { count: props.interactives.length })}\n contents={WidgetContents.Interactives}\n collection={props.interactives}\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 video: props.clip,\n questionsAppLink: {\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.PREVIEW_QUESTIONS\n },\n imageCdnUrl: props.imageCdnUrl\n }}\n analyticsData={{ widgetId: 'interactives' }}\n />\n </div>\n )}\n\n {!!canAccessOriginal && (\n <section className='pb-2 pt-1'>\n <h2 className='h4 mb-0'><Text namespace={namespace} phrase='clippedFrom' /></h2>\n <VideoActionsContext.Provider value={videoActions}>\n <VideoList\n videos={[props.originalVideo]}\n yearGroups={props.yearGroups}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\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 })}\n hasPermissions={hasPermissions}\n presentationAudiences={props.audiences}\n getPreviewQuestionsAppLink={interactive => InteractiveHelpers.getPreviewQuestionsAppLink(interactive)}\n isPlugin={props.isPlugin}\n getClassroomGuideAppLink={VideoAppLinkHelper.getClassroomGuideAppLink}\n getInteractiveGuidanceAppLink={VideoAppLinkHelper.getInteractiveGuidanceAppLink}\n getResourceGuidanceAppLink={VideoAppLinkHelper.getResourceGuidanceAppLink}\n />\n </VideoActionsContext.Provider>\n </section>\n )}\n\n <section>\n <RelatedVideos\n currentVideo={props.clip}\n yearGroups={props.yearGroups}\n relatedVideos={props.relatedVideos}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n currentUser={props.currentUser}\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.shareId,\n moviesAndTv: props.queryParams.mtv\n })}\n moviesAndTv={props.queryParams.mtv}\n isPlugin={props.isPlugin}\n />\n </section>\n </div>\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 * as React from 'react';\n\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { PermissionFilterOption } from 'libs/shared/enums/PermissionFilterOption';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { VideoPrivateError } from 'libs/shared/errors/videos/video-private/VideoPrivateError';\nimport { ClipRequests } from 'libs/shared/flight-requests/ClipRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { ThemeRequests } from 'libs/shared/flight-requests/ThemeRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useCannotConsumeError } from 'libs/shared/hooks/useCannotConsumeError';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Clip, ClipCollection, Config, CurrentUser, InteractiveCollection, Theme, Video, YearGroup } from 'libs/shared/interfaces';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { PlayClip } from 'shared/components/play-clip/PlayClip';\nimport { usePluginHelper } from 'shared/hooks/use-plugin-helper/usePluginHelper';\nimport { useDeepLinks } from 'shared/hooks/useDeepLinks';\nimport { useFetchPointsOfInterest } from 'shared/hooks/useFetchPointsOfInterest';\nimport { useGetRelatedVideos } from 'shared/hooks/useGetRelatedVideos';\nimport { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\nimport { usePresentationAudiences } from 'shared/hooks/usePresentationAudiences';\nimport { useVideoFeatureAccess } from 'shared/hooks/useVideoFeatureAccess';\nimport { useVideoMixin } from 'shared/hooks/useVideoMixin';\n\nimport { PlayViewProps } from './PlayClipViewContainer';\n\nconst namespace = 'shared.playClip';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst clipErrors = {\n notFound: NotFoundError,\n forbidden: {\n privacy: VideoPrivateError\n }\n};\n\nPlayClipView.defaultProps = {\n queryParams: {}\n};\n\nexport function PlayClipView(props: PlayViewProps): JSX.Element {\n const { context, contextId, mtv } = props.queryParams;\n\n const { hasProduct } = useProducts();\n const { setFavourite, canFavourite } = useLiteFavourites(LocationContext.PlayClip);\n const { isPlugin } = usePluginHelper();\n const { hasPermissions } = usePermissions();\n\n const featureAccess = useVideoFeatureAccess();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const clip = Flight.useBasicFetch<Clip>(ClipRequests.clip(props.id));\n\n const interactives = Flight.useBasicFetch<InteractiveCollection>(\n featureAccess.canViewInteractives && InteractiveRequests.videoInteractives(props.id)\n );\n const video = Flight.useBasicFetch<Video>(\n !!clip.data?._parentVideo && VideoRequests.video(clip.data._parentVideo.id)\n );\n useVideoMixin([video.data]);\n\n const childClips = Flight.useBasicFetch<ClipCollection>(\n !!clip.data?._parentVideo && featureAccess.canViewClips && ClipRequests.videoClips(clip.data._parentVideo.id)\n );\n\n const strippedClip = Flight.useBasicFetch<Clip>(clip.statusCode === HttpStatus.Forbidden &&\n ClipRequests.clip(props.id, PermissionFilterOption.StripMetadata));\n const relatedVideos = useGetRelatedVideos({\n video: video.data,\n context,\n contextId,\n moviesAndTv: mtv,\n currentUser: currentUser.data\n });\n const audiences = usePresentationAudiences();\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const shouldFetchTheme = hasPermissions(PermissionName.ViewVideoGlance) &&\n clip.data?.glance?.theme;\n \n const glanceTheme = Flight.useBasicFetch<Theme>(\n shouldFetchTheme &&\n ThemeRequests.themeImages(clip.data.glance.theme, clip.data.glance.type)\n );\n const pointsOfInterest = useFetchPointsOfInterest(props.id, true);\n\n useSetPageMetadata(PageMetadataHelper.getClipMetadata({\n content: clip.data,\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n }\n }));\n\n useHandleObjectError(clip, clipErrors, { forbidden: true });\n useVideoMixin(relatedVideos.videos ?? []);\n useCannotConsumeError(strippedClip);\n useDeepLinks({ id: props.id, app: 'clips' });\n\n const hasLoaded = (\n clip.data &&\n currentUser.hasCompleted &&\n config.hasCompleted &&\n pointsOfInterest.hasCompleted\n );\n\n if (!hasLoaded)\n return <></>;\n\n return (\n <PlayClip\n clip={clip.data}\n interactives={interactives.data?.data}\n clips={childClips.data?.data}\n originalVideo={video.data}\n currentUser={currentUser.data}\n yearGroups={yearGroups.data}\n // we only show up next videos for clips in a playlist\n relatedVideos={context === 'playlist' ? relatedVideos : { ...relatedVideos, videos: []}}\n canFavourite={canFavourite}\n setFavourite={setFavourite}\n hasProduct={hasProduct}\n queryParams={props.queryParams}\n audiences={audiences.data}\n imageCdnUrl={config.data.imageCdnUrl}\n canManageVideoAccess={hasPermissions(PermissionName.ManageVideoAccess)}\n pointsOfInterest={pointsOfInterest.items}\n glanceTheme={glanceTheme.data}\n glanceLoaded={!shouldFetchTheme || glanceTheme.hasCompleted}\n featureAccess={featureAccess}\n tableOfContentsId={props.queryParams?.tocId}\n isPlugin={isPlugin}\n />\n );\n}"],"names":["defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","generateCacheKey","flightObjs","map","obj","join","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","Array","isArray","useEffect","forEach","getResourceAppLink","videoId","shareId","canViewResource","resource","application","action","args","id","params","namespace","getPhrase","PlayClip","props","playerContext","hasPermissions","canConsume","clip","videoActions","location","resourcesRef","interactivesRef","current","tableOfContentsId","isArchived","hasStudentExperience","shouldPlayOnExitImmersiveReader","hasGlance","glanceTheme","featureAccess","canViewGlance","view","referrer","detailsView","setDetailsView","limitAccess","currentUser","isAuthenticated","hasProduct","glanceLoaded","canAccessOriginal","originalVideo","_canBeConsumed","value","showPlayerPlaceholder","mode","canViewPublicLayout","resourcesWidget","otherClips","clips","filter","c","toString","className","restrictions","_restrictions","yearGroups","objectId","objectTypeId","canManageVideoAccess","typeId","key","context","queryParams","contextId","moviesAndTv","mtv","playNext","startTime","t","video","type","media","audiences","originalVideoAppLink","name","theme","pointsOfInterest","onClickShowDescription","setStartTime","time","playerRef","currentTime","getTagAppLink","tag","tagOrClassification","suppressInteractivity","onLaunchImmersiveReader","isPaused","pause","onExitImmersiveReader","play","onClickClose","hideTags","length","ref","count","contents","collection","prefetched","childComponent","R","extraChildComponentProps","imageCdnUrl","imageErrorFallbackUrl","actionBehaviour","canViewResourceItems","titlePosition","hideTypeBadge","getChildAppLink","analyticsOptions","workflowPhase","descriptor","SignUp","analyticsData","widgetId","C","interactives","interactive","questionsAppLink","phrase","videos","setFavourite","canFavourite","getVideoAppLink","v","opts","presentationAudiences","getPreviewQuestionsAppLink","isPlugin","getClassroomGuideAppLink","getInteractiveGuidanceAppLink","getResourceGuidanceAppLink","currentVideo","relatedVideos","usePresentationAudiences","redirectOnError","activePresentation","getFallbackPresentation","presentation","clipErrors","PlayClipView","u","config","canViewInteractives","data","_parentVideo","childClips","canViewClips","strippedClip","customerId","shouldFetchTheme","glance","content","phraseContext","phraseHandler","titlePhrase","descriptionPhrase","app","hasCompleted","items","tocId","defaultProps"],"sourceRoot":""}
@@ -1,3 +0,0 @@
1
- /*! For license information please see 5886-13395190b8-lite.chunk.js.LICENSE.txt */
2
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[5886],{49935:(e,t,r)=>{r.d(t,{Oo:()=>h,b2:()=>y});var n=r(32735),a=r(23481),i=r(36848),o=r(86764),c=r(3747),l=r(5859),u=r(35223),s=r(83914);function f(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,i,o,c=[],l=!0,u=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;l=!1}else for(;!(l=(n=i.call(r)).done)&&(c.push(n.value),c.length!==t);l=!0);}catch(e){u=!0,a=e}finally{try{if(!l&&null!=r.return&&(o=r.return(),Object(o)!==o))return}finally{if(u)throw a}}return c}}(e,t)||function(e,t){if(e){if("string"==typeof e)return m(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?m(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function m(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}var p=a.T.encloseNamespace("shared.breadcrumbComponent"),d=n.forwardRef((function(e,t){var r=e.breadcrumb,a=r.name,o=r.appLink,c=r.active,l=e.withBackIcon,f=a,m=null;return f.length>48&&(f=a.slice(0,48)+"...",m=a),n.createElement("li",{className:"breadcrumb-item".concat(c?" active":""),title:m},c?n.createElement("strong",null,f):n.createElement(i.F,{appLink:o,ref:t},l&&n.createElement(s.x,{svgName:u.vn.ChevronLeft,size:s.S.Small}),n.createElement("span",{className:l?"ms-2":""},f)))})),h=function(e){var t=e.breadcrumbs,r=(0,c.a)(o.r.XS),a=(null==t?void 0:t.length)||0,i=f(n.useState(!1),2),l=i[0],u=i[1],s=f(n.useState(!1),2),m=s[0],h=s[1],y=n.useRef();if(n.useEffect((function(){var e,r=null!==(e=null==t?void 0:t.reduce((function(e,t){return e+t.name.length}),0))&&void 0!==e?e:0;a>4&&r>64&&u(!0)}),[null==t?void 0:t.length]),n.useLayoutEffect((function(){var e;m&&(null===(e=y.current)||void 0===e||e.focus())}),[y.current,m]),!a||r&&a<2)return n.createElement(n.Fragment,null);if(r)return n.createElement("nav",{"aria-label":"breadcrumb"},n.createElement("ol",{className:"breadcrumb m-0 p-0"},n.createElement(d,{breadcrumb:t[a-2],withBackIcon:!0})));var g=n.createElement(d,{breadcrumb:t[0]}),v=a>2?n.createElement(d,{breadcrumb:t[1]}):n.createElement(n.Fragment,null),b=a>3?n.createElement(d,{breadcrumb:t[a-2]}):n.createElement(n.Fragment,null),E=a>1?n.createElement(d,{breadcrumb:t[a-1]}):n.createElement(n.Fragment,null),w=t.slice(2,a-2);return n.createElement("nav",{"aria-label":"breadcrumb"},n.createElement("ol",{className:"breadcrumb m-0 p-0"},g,v,l?n.createElement("li",{className:"breadcrumb-item"},n.createElement("button",{className:"btn-link",onClick:function(){u(!1),h(!0)},"aria-label":p("expand")},"...")):w.map((function(e,t){return n.createElement(d,{key:t,breadcrumb:e,ref:0===t?y:null})})),b,E))},y=n.memo((function(e){var t=e.numItems,r=void 0===t?3:t;return(0,c.a)(o.r.XS)?n.createElement("div",{className:"partial-loading-background",style:{height:"1.3125rem",width:"6rem"}}):n.createElement("nav",{"aria-label":"breadcrumb"},n.createElement("ol",{className:"breadcrumb m-0 p-0"},l.u.getPartialLoadingItems({numItems:r}).map((function(e,t){var r=e.width;return n.createElement("li",{key:t,className:"breadcrumb-item"},n.createElement("span",{className:"d-inline-block partial-loading-background",style:{width:r},dangerouslySetInnerHTML:{__html:"&nbsp"}}))}))))}))},5859:(e,t,r)=>{function n(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}r.d(t,{u:()=>i});var a={numItems:5,minWidth:50,maxWidth:100},i={getPartialLoadingItems:function(){var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=Object.assign(Object.assign({},a),t);return(e=Array(r.numItems),function(e){if(Array.isArray(e))return n(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return n(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?n(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()).map((function(){return{width:"".concat(Math.max(Math.floor(Math.random()*r.maxWidth),r.minWidth),"px")}}))}}},81803:(e,t,r)=>{r.d(t,{d:()=>d});var n=r(32735),a=r(81886),i=r(23481),o=r(49935),c=r(22902),l=r(14070),u=r(97291),s=r(96368);function f(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}var m="settings.settingsLayout",p=function(e){var t=(0,c.T)().hasPermissions,r=(0,s.e)();if(e)return t(e);var n=a.Q.C$.getCurrentAppLink();return n.application!==u.O.SETTINGS||r.some((function(e){return e.modules.some((function(e){return"appLink"in e&&e.appLink.action===n.action}))}))};function d(e){var t,r=p(e.requiredPermissions);if(n.useEffect((function(){r||a.Q.C$.trigger({application:u.O.SETTINGS,action:l.e.Settings.HOME},{replace:!0})}),[r]),!r)return n.createElement(n.Fragment,null);var c,s=e.breadcrumbs.map((function(t,r){return{name:t,appLink:{application:u.O.SETTINGS,action:l.e.Settings.HOME},active:r===e.breadcrumbs.length-1}}));return n.createElement("div",{className:"px-3"},n.createElement("div",{className:"d-flex align-items-center justify-content-between"},n.createElement("h1",{className:"h2"},e.heading),null===(t=e.headingButton)||void 0===t?void 0:t.call(e)),n.createElement("div",{className:"pb-3"},n.createElement(o.Oo,{breadcrumbs:[{name:i.T.getPhrase(m,"settingsBreadcrumb"),appLink:{application:u.O.SETTINGS,action:l.e.Settings.HOME}}].concat((c=s,function(e){if(Array.isArray(e))return f(e)}(c)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(c)||function(e,t){if(e){if("string"==typeof e)return f(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?f(e,t):void 0}}(c)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()))})),e.description&&n.createElement(n.Fragment,null,n.createElement("p",null,e.description),n.createElement("hr",null)),e.children)}},5886:(e,t,r)=>{r.r(t),r.d(t,{NotificationSettingsView:()=>M});var n=r(32735),a=r(23481),i=r(20354),o=r(65858),c=r(36848),l=r(83345),u=r(77963),s=r(65728),f=r(31949),m=r(69883),p=r(79612),d=r(37802),h=r(14070),y=r(97291);const g={images:"lgrLY",group:"oDj7s",groupContainer:"uAqY0",description:"fDHV0",title:"Z91M9",content:"KvFr1",pill:"_Nl44"};function v(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}var b=["anytime","weekly","monthly","snooze"],E="settings.messageFrequency",w=a.T.encloseNamespace(E);function S(e){var t,r,a=e.currentFrequency||"anytime",i=(t=n.useState(a),r=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,i,o,c=[],l=!0,u=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;l=!1}else for(;!(l=(n=i.call(r)).done)&&(c.push(n.value),c.length!==t);l=!0);}catch(e){u=!0,a=e}finally{try{if(!l&&null!=r.return&&(o=r.return(),Object(o)!==o))return}finally{if(u)throw a}}return c}}(t,r)||function(e,t){if(e){if("string"==typeof e)return v(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?v(e,t):void 0}}(t,r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],c=i[1];return n.createElement(n.Fragment,null,n.createElement("h4",{className:"mt-3"},w("messageFrequency")),n.createElement(l.x,{namespace:E,phrase:"messageFrequencyDescription"}),n.createElement("div",{className:"py-3 text-center d-flex justify-content-start"},n.createElement("div",{className:"btn-group mb-1 d-flex flex-wrap ".concat(g.pill)},b.map((function(t){return n.createElement("button",{key:t,className:(r=t,a="btn border",(a+=r===o?" btn-dark":" btn-outline-dark")+" px-5 col-12 col-md-3"),onClick:function(r){return function(t,r){t.preventDefault(),c(r),e.updateMessageFrequency(r.toLowerCase())}(r,t)},type:"button"},w(t));var r,a})))))}var N=r(83523),x=r(99742);function k(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}var L=a.T.encloseNamespace("settings.notificationSettings"),O={"account-updates":{title:L("accountUpdates"),description:L("accountUpdatesDescription"),note:L("accountUpdatesNote"),tooltip:L("tooltip"),imageUrl:x.W.Notifications.ACCOUNT_UPDATES,colour:"bg-light-orange",disabled:!0,active:!0},"product-news":{title:L("productNews"),description:L("productNewsDescription"),imageUrl:x.W.Notifications.PRODUCT_NEWS,colour:"bg-light-purple",disabled:!1},"content-updates":{title:L("contentUpdates"),description:L("contentUpdatesDescription"),imageUrl:x.W.Notifications.CONTENT_UPDATES,colour:"bg-light-teal",disabled:!1},recommendations:{title:L("recommendations"),description:L("recommendationsDescription"),imageUrl:x.W.Notifications.RECOMMENDATIONS,colour:"bg-light-orange",disabled:!1},"product-tips":{title:L("productTips"),description:L("productTipsDescription"),imageUrl:x.W.Notifications.PRODUCT_TIPS,colour:"bg-light-pink",disabled:!1}};function T(e){var t,r,a=O[e.type],i=(t=n.useState(e.toggled),r=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,i,o,c=[],l=!0,u=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;l=!1}else for(;!(l=(n=i.call(r)).done)&&(c.push(n.value),c.length!==t);l=!0);}catch(e){u=!0,a=e}finally{try{if(!l&&null!=r.return&&(o=r.return(),Object(o)!==o))return}finally{if(u)throw a}}return c}}(t,r)||function(e,t){if(e){if("string"==typeof e)return k(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?k(e,t):void 0}}(t,r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],c=i[1];return a?n.createElement("div",{className:"col-md-6 p-0"},n.createElement("div",{className:"".concat(g.groupContainer," d-flex flex-row h-100")},n.createElement("div",{className:"row border border-light m-0 w-100 rounded-3"},n.createElement("div",{className:"col-3 d-flex justify-content-center align-items-center h-100 rounded-start-3 ".concat(a.colour)},n.createElement("img",{src:a.imageUrl,alt:a.title,role:"presentation",className:"img-fluid ".concat(g.images," w-50")})),n.createElement("div",{className:"py-3 ".concat(g.content),style:{width:"64%"}},n.createElement("p",{className:"fw-medium ".concat(g.title)},a.title),n.createElement("p",{className:"".concat(g.description)},a.description),a.note&&n.createElement("small",null,a.note)),n.createElement("div",{className:"py-3 d-flex justify-content-end align-items-start",style:{width:"11%"}},n.createElement(N.Z,{onClick:function(){return function(t){c(!o),e.setToggle(t,!o)}(a.title)},disabled:a.disabled,on:o||a.active,showStateWhenDisabled:!0,tooltipText:a.tooltip}))))):n.createElement(n.Fragment,null)}var A=r(81803),j=r(99940),I={getSubscriptionPreferences:function(){return{key:"current:subscriptions",url:"/api/notifications/v1/subscription-groups",type:j.k.GET}},setSubscriptionPreference:function(e){return{key:"set:subscriptions",url:"/api/notifications/v1/subscription-groups",data:e,type:j.k.PUT,invalidationKeys:["current:subscriptions"]}}};function F(e){return F="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},F(e)}function C(){C=function(){return t};var e,t={},r=Object.prototype,n=r.hasOwnProperty,a=Object.defineProperty||function(e,t,r){e[t]=r.value},i="function"==typeof Symbol?Symbol:{},o=i.iterator||"@@iterator",c=i.asyncIterator||"@@asyncIterator",l=i.toStringTag||"@@toStringTag";function u(e,t,r){return Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{u({},"")}catch(e){u=function(e,t,r){return e[t]=r}}function s(e,t,r,n){var i=t&&t.prototype instanceof g?t:g,o=Object.create(i.prototype),c=new j(n||[]);return a(o,"_invoke",{value:L(e,r,c)}),o}function f(e,t,r){try{return{type:"normal",arg:e.call(t,r)}}catch(e){return{type:"throw",arg:e}}}t.wrap=s;var m="suspendedStart",p="suspendedYield",d="executing",h="completed",y={};function g(){}function v(){}function b(){}var E={};u(E,o,(function(){return this}));var w=Object.getPrototypeOf,S=w&&w(w(I([])));S&&S!==r&&n.call(S,o)&&(E=S);var N=b.prototype=g.prototype=Object.create(E);function x(e){["next","throw","return"].forEach((function(t){u(e,t,(function(e){return this._invoke(t,e)}))}))}function k(e,t){function r(a,i,o,c){var l=f(e[a],e,i);if("throw"!==l.type){var u=l.arg,s=u.value;return s&&"object"==F(s)&&n.call(s,"__await")?t.resolve(s.__await).then((function(e){r("next",e,o,c)}),(function(e){r("throw",e,o,c)})):t.resolve(s).then((function(e){u.value=e,o(u)}),(function(e){return r("throw",e,o,c)}))}c(l.arg)}var i;a(this,"_invoke",{value:function(e,n){function a(){return new t((function(t,a){r(e,n,t,a)}))}return i=i?i.then(a,a):a()}})}function L(t,r,n){var a=m;return function(i,o){if(a===d)throw Error("Generator is already running");if(a===h){if("throw"===i)throw o;return{value:e,done:!0}}for(n.method=i,n.arg=o;;){var c=n.delegate;if(c){var l=O(c,n);if(l){if(l===y)continue;return l}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(a===m)throw a=h,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);a=d;var u=f(t,r,n);if("normal"===u.type){if(a=n.done?h:p,u.arg===y)continue;return{value:u.arg,done:n.done}}"throw"===u.type&&(a=h,n.method="throw",n.arg=u.arg)}}}function O(t,r){var n=r.method,a=t.iterator[n];if(a===e)return r.delegate=null,"throw"===n&&t.iterator.return&&(r.method="return",r.arg=e,O(t,r),"throw"===r.method)||"return"!==n&&(r.method="throw",r.arg=new TypeError("The iterator does not provide a '"+n+"' method")),y;var i=f(a,t.iterator,r.arg);if("throw"===i.type)return r.method="throw",r.arg=i.arg,r.delegate=null,y;var o=i.arg;return o?o.done?(r[t.resultName]=o.value,r.next=t.nextLoc,"return"!==r.method&&(r.method="next",r.arg=e),r.delegate=null,y):o:(r.method="throw",r.arg=new TypeError("iterator result is not an object"),r.delegate=null,y)}function T(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function A(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function j(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(T,this),this.reset(!0)}function I(t){if(t||""===t){var r=t[o];if(r)return r.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var a=-1,i=function r(){for(;++a<t.length;)if(n.call(t,a))return r.value=t[a],r.done=!1,r;return r.value=e,r.done=!0,r};return i.next=i}}throw new TypeError(F(t)+" is not iterable")}return v.prototype=b,a(N,"constructor",{value:b,configurable:!0}),a(b,"constructor",{value:v,configurable:!0}),v.displayName=u(b,l,"GeneratorFunction"),t.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===v||"GeneratorFunction"===(t.displayName||t.name))},t.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,b):(e.__proto__=b,u(e,l,"GeneratorFunction")),e.prototype=Object.create(N),e},t.awrap=function(e){return{__await:e}},x(k.prototype),u(k.prototype,c,(function(){return this})),t.AsyncIterator=k,t.async=function(e,r,n,a,i){void 0===i&&(i=Promise);var o=new k(s(e,r,n,a),i);return t.isGeneratorFunction(r)?o:o.next().then((function(e){return e.done?e.value:o.next()}))},x(N),u(N,l,"Generator"),u(N,o,(function(){return this})),u(N,"toString",(function(){return"[object Generator]"})),t.keys=function(e){var t=Object(e),r=[];for(var n in t)r.push(n);return r.reverse(),function e(){for(;r.length;){var n=r.pop();if(n in t)return e.value=n,e.done=!1,e}return e.done=!0,e}},t.values=I,j.prototype={constructor:j,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=e,this.done=!1,this.delegate=null,this.method="next",this.arg=e,this.tryEntries.forEach(A),!t)for(var r in this)"t"===r.charAt(0)&&n.call(this,r)&&!isNaN(+r.slice(1))&&(this[r]=e)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var r=this;function a(n,a){return c.type="throw",c.arg=t,r.next=n,a&&(r.method="next",r.arg=e),!!a}for(var i=this.tryEntries.length-1;i>=0;--i){var o=this.tryEntries[i],c=o.completion;if("root"===o.tryLoc)return a("end");if(o.tryLoc<=this.prev){var l=n.call(o,"catchLoc"),u=n.call(o,"finallyLoc");if(l&&u){if(this.prev<o.catchLoc)return a(o.catchLoc,!0);if(this.prev<o.finallyLoc)return a(o.finallyLoc)}else if(l){if(this.prev<o.catchLoc)return a(o.catchLoc,!0)}else{if(!u)throw Error("try statement without catch or finally");if(this.prev<o.finallyLoc)return a(o.finallyLoc)}}}},abrupt:function(e,t){for(var r=this.tryEntries.length-1;r>=0;--r){var a=this.tryEntries[r];if(a.tryLoc<=this.prev&&n.call(a,"finallyLoc")&&this.prev<a.finallyLoc){var i=a;break}}i&&("break"===e||"continue"===e)&&i.tryLoc<=t&&t<=i.finallyLoc&&(i=null);var o=i?i.completion:{};return o.type=e,o.arg=t,i?(this.method="next",this.next=i.finallyLoc,y):this.complete(o)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),y},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),A(r),y}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if("throw"===n.type){var a=n.arg;A(r)}return a}}throw Error("illegal catch attempt")},delegateYield:function(t,r,n){return this.delegate={iterator:I(t),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=e),y}},t}var _=function(e,t,r,n){return new(r||(r=Promise))((function(a,i){function o(e){try{l(n.next(e))}catch(e){i(e)}}function c(e){try{l(n.throw(e))}catch(e){i(e)}}function l(e){var t;e.done?a(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(o,c)}l((n=n.apply(e,t||[])).next())}))},P="settings.notificationSettings",U=a.T.encloseNamespace(P);function M(){var e,t=i.a.useBasicFetch(f.N.currentUser()),r=(0,d.r)(o.LZ.Settings),a=r.messageFrequencyOption,g=r.updateSetting,v=(0,m.Z)();(0,p.M)({title:"Notification Settings"});var b=i.a.useBasicFetch(I.getSubscriptionPreferences()),E=i.a.useGetFetchAsync();return(null===(e=b.data)||void 0===e?void 0:e.length)&&t.data?n.createElement(A.d,{heading:U("heading"),breadcrumbs:[U("heading")]},n.createElement("div",{className:"w-100 d-flex justify-content-center flex-column"},n.createElement("h4",null,U("label")),n.createElement("p",null,U("description")),n.createElement("p",null,n.createElement(l.x,{namespace:P,phrase:"updateEmailStart"})," ",n.createElement(c.F,{appLink:{application:y.O.SETTINGS,action:h.e.Settings.ACCOUNT},className:"text-decoration-underline"},U("updateEmailHref"))," ",n.createElement(l.x,{namespace:P,phrase:"updateEmailEnding"}))),n.createElement("div",{className:"row"},n.createElement(T,{type:"account-updates"}),b.data.map((function(e){return n.createElement(T,{key:e.id,type:e.type,toggled:e.subscribed,setToggle:function(t,r){return function(e,t,r){return _(this,void 0,void 0,C().mark((function n(){return C().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return n.prev=0,n.next=3,E(I.setSubscriptionPreference({subscriptionGroupId:e,subscribed:r}));case 3:v.success(U(r?"alert-subscribed":"alert-unsubscribed",{name:t.toLowerCase()})),n.next=9;break;case 6:n.prev=6,n.t0=n.catch(0),v.error("Could not update subscription preference");case 9:case"end":return n.stop()}}),n,null,[[0,6]])})))}(e.id,t,r)}})}))),n.createElement(S,{updateMessageFrequency:function(e){if(e!==a){var r={name:s.E.MessageFrequencyOption,value:e,kind:u.g.Permanent};g(t.data.id,r)}},currentFrequency:a})):n.createElement(n.Fragment,null)}}}]);
3
- //# sourceMappingURL=5886-13395190b8-lite.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/5886-13395190b8-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/breadcrumbs/Breadcrumbs.tsx","file:///app/packages/libs/shared/src/utils/PartialLoadingHelper.ts","file:///app/packages/projects/lite/src/apps/settings/components/settings-layout/SettingsLayout.tsx","file:///app/packages/projects/lite/src/apps/settings/components/notification-settings/notification-settings.scss","file:///app/packages/projects/lite/src/apps/settings/components/notification-settings/MessageFrequency.tsx","file:///app/packages/projects/lite/src/apps/settings/components/notification-settings/SubscriptionCard.tsx","file:///app/packages/projects/lite/src/apps/settings/flight-requests/SubscriptionRequests.ts","file:///app/packages/projects/lite/src/apps/settings/views/notification-settings/NotificationSettingsView.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { PartialLoadingHelper } from 'libs/shared/utils/PartialLoadingHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { SvgContainer, SvgContainerSize } from '../svg-container/SvgContainer';\n\nconst namespace = 'shared.breadcrumbComponent';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst COLLAPSE_CHARACTER_COUNT = 64;\nconst MAX_SEGMENT_LENGTH = 48;\n\nexport interface Breadcrumb {\n name: string;\n appLink?: Core.AppLink;\n active?: boolean;\n}\n\ninterface BreadcrumbItemProps {\n breadcrumb: Breadcrumb;\n withBackIcon?: boolean;\n}\n\nexport const BreadcrumbItem = React.forwardRef((\n props: BreadcrumbItemProps,\n ref: React.ForwardedRef<HTMLElement>\n) => {\n const { breadcrumb: { name, appLink, active }, withBackIcon } = props;\n\n let trimmedName = name;\n let title: string = null;\n\n if (trimmedName.length > MAX_SEGMENT_LENGTH) {\n trimmedName = name.slice(0, MAX_SEGMENT_LENGTH) + '...';\n\n // Only setting the title when we trim, because otherwise it's really not needed - Sha\n title = name;\n }\n\n return (\n <li\n className={`breadcrumb-item${active ? ' active' : ''}`}\n title={title}\n >\n {active\n ? <strong>{trimmedName}</strong>\n : <AppLink appLink={appLink} ref={ref}>\n {withBackIcon && <SvgContainer svgName={cvSvgLibrary.ChevronLeft} size={SvgContainerSize.Small} />}\n <span className={withBackIcon ? 'ms-2' : ''}>{trimmedName}</span>\n </AppLink>\n }\n </li>\n );\n});\n\ninterface BreadcrumbsProps {\n breadcrumbs: Breadcrumb[];\n}\n\nexport const Breadcrumbs = ({ breadcrumbs }: BreadcrumbsProps) => {\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n\n const length = breadcrumbs?.length || 0;\n \n const [ collapse, setCollapse ] = React.useState(false);\n const [ shouldFocus, setShouldFocus ] = React.useState(false);\n const expandRef = React.useRef<HTMLElement>();\n\n React.useEffect(() => {\n const characterLength = breadcrumbs?.reduce((prev, next) => prev + next.name.length, 0) ?? 0;\n\n if (length > 4 && characterLength > COLLAPSE_CHARACTER_COUNT)\n setCollapse(true);\n }, [breadcrumbs?.length]);\n\n /**\n * Focus our first expanded item the first time it appears.\n */\n React.useLayoutEffect(() => {\n if (shouldFocus)\n expandRef.current?.focus();\n }, [ expandRef.current, shouldFocus ]);\n\n function onClickExpand() {\n setCollapse(false);\n setShouldFocus(true);\n }\n\n if (!length || (isMobile && length < 2))\n return <></>;\n\n if (isMobile)\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n <BreadcrumbItem breadcrumb={breadcrumbs[length - 2]} withBackIcon />\n </ol>\n </nav>\n );\n\n const first = <BreadcrumbItem breadcrumb={breadcrumbs[0]} />;\n const second = length > 2 ? <BreadcrumbItem breadcrumb={breadcrumbs[1]} /> : <></>;\n const secondLast = length > 3 ? <BreadcrumbItem breadcrumb={breadcrumbs[length - 2]} /> : <></>;\n const last = length > 1 ? <BreadcrumbItem breadcrumb={breadcrumbs[length - 1]} /> : <></>;\n const rest = breadcrumbs.slice(2, length - 2);\n\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n {first}\n {second}\n {collapse ?\n <li className='breadcrumb-item'>\n <button\n className='btn-link'\n onClick={onClickExpand}\n aria-label={getPhrase('expand')}\n >\n ...\n </button>\n </li> :\n rest.map((breadcrumb, idx) => (\n <BreadcrumbItem\n key={idx}\n breadcrumb={breadcrumb}\n ref={idx === 0 ? expandRef : null}\n />\n ))\n }\n {secondLast}\n {last}\n </ol>\n </nav>\n );\n};\n\nexport const PartialBreadcrumbs = React.memo(function({ numItems = 3 }: { numItems?: number; }) {\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n\n if (isMobile) {\n return (\n <div className='partial-loading-background' style={{ height: '1.3125rem', width: '6rem' }} />\n );\n }\n\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n {PartialLoadingHelper.getPartialLoadingItems({ numItems }).map(({ width }, idx) => (\n <li key={idx} className='breadcrumb-item'>\n <span className='d-inline-block partial-loading-background' style={{ width }} dangerouslySetInnerHTML={{ __html: '&nbsp' }} />\n </li>\n ))}\n </ol>\n </nav>\n );\n});","const DEFAULT_PARTIAL_LOADING_OPTIONS: PartialLoadingOptions = {\n numItems: 5,\n minWidth: 50, // px\n maxWidth: 100 // px\n};\n\nexport interface PartialLoadingOptions {\n numItems?: number;\n minWidth?: number;\n maxWidth?: number;\n}\n\ninterface PartialLoadingItem {\n width: string;\n}\n\nexport const PartialLoadingHelper = {\n getPartialLoadingItems(options: PartialLoadingOptions = {}): PartialLoadingItem[] {\n const opts = {\n ...DEFAULT_PARTIAL_LOADING_OPTIONS,\n ...options\n };\n\n const getRandomFilterWidth = () => Math.max(Math.floor(Math.random() * opts.maxWidth), opts.minWidth);\n\n return [...Array(opts.numItems)].map(() => ({ width: `${getRandomFilterWidth()}px` }));\n }\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 {\"images\":\"lgrLY\",\"group\":\"oDj7s\",\"groupContainer\":\"uAqY0\",\"description\":\"fDHV0\",\"title\":\"Z91M9\",\"content\":\"KvFr1\",\"pill\":\"_Nl44\"};","\nimport React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { MessageFrequencyOption } from 'libs/shared/interfaces/models/MessageFrequencyOption';\n\nimport styles from './notification-settings.scss';\n\nconst messageFrequencies: MessageFrequencyOption[] = [ 'anytime', 'weekly', 'monthly', 'snooze' ];\n\ninterface MessageFrequencyProps {\n updateMessageFrequency: (frequency: string) => void;\n currentFrequency: MessageFrequencyOption\n}\n\nconst namespace = 'settings.messageFrequency';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport default function MessageFrequency(props: MessageFrequencyProps) {\n const defaultFrequency: string = props.currentFrequency || 'anytime';\n const [ activePill, setActivePill ] = React.useState(defaultFrequency);\n\n function onClick(e: React.MouseEvent, frequency: MessageFrequencyOption): void {\n e.preventDefault();\n setActivePill(frequency);\n props.updateMessageFrequency(frequency.toLowerCase());\n }\n\n function getButtonClassName(option: string): string {\n let className = 'btn border';\n \n if (option === activePill)\n className += ' btn-dark';\n else\n className += ' btn-outline-dark';\n \n return className + ' px-5 col-12 col-md-3';\n }\n\n return (\n <>\n <h4 className='mt-3'>{getPhrase('messageFrequency')}</h4>\n <Text namespace={namespace} phrase='messageFrequencyDescription' />\n <div className='py-3 text-center d-flex justify-content-start'>\n <div className={`btn-group mb-1 d-flex flex-wrap ${styles.pill}`}>\n {messageFrequencies.map((frequency: MessageFrequencyOption) => (\n <button\n key={frequency}\n className={getButtonClassName(frequency)}\n onClick={e => onClick(e, frequency)}\n type='button'\n >\n {getPhrase(frequency)}\n </button>\n ))}\n </div>\n </div>\n </>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport { Subscriptions } from 'apps/settings/interfaces/SubscriptionGroups';\n\nimport styles from './notification-settings.scss';\n\ninterface Subscription {\n title: string,\n description: string,\n note?: string,\n tooltip?: string,\n disabled?: boolean,\n imageUrl: string,\n colour: string,\n active?: boolean\n}\n\nconst namespace = 'settings.notificationSettings';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst subscriptionGroupLookup = {\n 'account-updates': {\n title: getPhrase('accountUpdates'),\n description: getPhrase('accountUpdatesDescription'),\n note: getPhrase('accountUpdatesNote'),\n tooltip: getPhrase('tooltip'),\n imageUrl: ImageUrls.Notifications.ACCOUNT_UPDATES,\n colour: 'bg-light-orange',\n disabled: true,\n active: true\n },\n 'product-news': {\n title: getPhrase('productNews'),\n description: getPhrase('productNewsDescription'),\n imageUrl: ImageUrls.Notifications.PRODUCT_NEWS,\n colour: 'bg-light-purple',\n disabled: false\n },\n 'content-updates': {\n title: getPhrase('contentUpdates'),\n description: getPhrase('contentUpdatesDescription'),\n imageUrl: ImageUrls.Notifications.CONTENT_UPDATES,\n colour: 'bg-light-teal',\n disabled: false\n },\n 'recommendations': {\n title: getPhrase('recommendations'),\n description: getPhrase('recommendationsDescription'),\n imageUrl: ImageUrls.Notifications.RECOMMENDATIONS,\n colour: 'bg-light-orange',\n disabled: false\n },\n 'product-tips': {\n title: getPhrase('productTips'),\n description: getPhrase('productTipsDescription'),\n imageUrl: ImageUrls.Notifications.PRODUCT_TIPS,\n colour: 'bg-light-pink',\n disabled: false\n }\n};\n\ninterface SubscriptionPreferencesProps {\n type: Subscriptions;\n setToggle?: (subscription: string, value: boolean) => void;\n toggled?: boolean;\n}\n\nexport function SubscriptionCard(props: SubscriptionPreferencesProps): JSX.Element {\n const subscription: Subscription = subscriptionGroupLookup[props.type];\n\n const [ toggled, setToggle ] = React.useState(props.toggled);\n\n function toggle(subscription: string): void {\n setToggle(!toggled);\n props.setToggle(subscription, !toggled);\n }\n\n if (!subscription)\n return <></>;\n\n return (\n <div className='col-md-6 p-0'>\n <div className={`${styles.groupContainer} d-flex flex-row h-100`}>\n <div className={`row border border-light m-0 w-100 rounded-3`}>\n\n <div className={`col-3 d-flex justify-content-center align-items-center h-100 rounded-start-3 ${subscription.colour}`}>\n <img\n src={subscription.imageUrl}\n alt={subscription.title}\n role='presentation'\n className={`img-fluid ${styles.images} w-50`}\n />\n </div>\n\n <div className={`py-3 ${styles.content}`} style={{ width: '64%' }}>\n <p className={`fw-medium ${styles.title}`}>{subscription.title}</p>\n <p className={`${styles.description}`}>{subscription.description}</p>\n {subscription.note && <small>{subscription.note}</small>}\n </div>\n\n <div className='py-3 d-flex justify-content-end align-items-start' style={{ width: '11%' }}>\n <ToggleSwitch\n onClick={() => toggle(subscription.title)}\n disabled={subscription.disabled}\n on={toggled || subscription.active}\n showStateWhenDisabled\n tooltipText={subscription.tooltip}\n />\n </div>\n\n </div>\n </div>\n </div>\n );\n}","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Flight } from 'libs/common/flight';\n\nexport const SubscriptionRequests = {\n getSubscriptionPreferences(): Flight.Request {\n return {\n key: 'current:subscriptions',\n url: '/api/notifications/v1/subscription-groups',\n type: HttpVerbs.GET\n };\n },\n\n setSubscriptionPreference(data: { subscriptionGroupId: string; subscribed: boolean }): Flight.Request {\n return {\n key: 'set:subscriptions',\n url: '/api/notifications/v1/subscription-groups',\n data: data,\n type: HttpVerbs.PUT,\n invalidationKeys: [\n 'current:subscriptions'\n ]\n };\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 { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\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';\nimport { MessageFrequencyOption } from 'libs/shared/interfaces/models/MessageFrequencyOption';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport MessageFrequency from 'apps/settings/components/notification-settings/MessageFrequency';\nimport { SubscriptionCard } from 'apps/settings/components/notification-settings/SubscriptionCard';\nimport { SettingsLayout } from 'apps/settings/components/settings-layout/SettingsLayout';\nimport { SubscriptionRequests } from 'apps/settings/flight-requests/SubscriptionRequests';\nimport { SubscriptionGroup } from 'apps/settings/interfaces/SubscriptionGroups';\n\nconst namespace = 'settings.notificationSettings';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function NotificationSettingsView(): React.ReactElement {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const { messageFrequencyOption, updateSetting } = useSettings(LocationContext.Settings);\n\n const alerts = useAlerts();\n useSetPageMetadata({ title: 'Notification Settings' });\n\n const subscriptions = Flight.useBasicFetch<SubscriptionGroup[]>(SubscriptionRequests.getSubscriptionPreferences());\n const fetchAsync = Flight.useGetFetchAsync();\n\n async function updateSubscriptionPreference(id: string, subscriptionName: string, isSubscribed: boolean) {\n try {\n await fetchAsync(SubscriptionRequests.setSubscriptionPreference({\n subscriptionGroupId: id,\n subscribed: isSubscribed\n }));\n alerts.success(getPhrase(isSubscribed ? 'alert-subscribed' : 'alert-unsubscribed', { name: subscriptionName.toLowerCase() }));\n } catch {\n alerts.error('Could not update subscription preference');\n }\n }\n\n function updateMessgeFrequency(frequency: MessageFrequencyOption) {\n if (frequency === messageFrequencyOption)\n return;\n\n const newSetting = {\n name: SettingName.MessageFrequencyOption,\n value: frequency,\n kind: SettingKind.Permanent\n };\n\n updateSetting(\n currentUser.data.id,\n newSetting\n );\n }\n\n if (!subscriptions.data?.length || !currentUser.data)\n return <></>;\n\n return (\n <SettingsLayout\n heading={getPhrase('heading')}\n breadcrumbs={[getPhrase('heading')]}\n >\n <div className='w-100 d-flex justify-content-center flex-column'>\n <h4>{getPhrase('label')}</h4>\n <p>{getPhrase('description')}</p>\n <p>\n <Text namespace={namespace} phrase='updateEmailStart' />&nbsp;\n <AppLink\n appLink={{\n application: AppChannels.SETTINGS,\n action: Actions.Settings.ACCOUNT\n }}\n className='text-decoration-underline'\n >\n {getPhrase('updateEmailHref')}\n </AppLink>\n &nbsp;<Text namespace={namespace} phrase='updateEmailEnding' />\n </p>\n </div>\n\n <div className='row'>\n {/* Account updates is the only one that cannot be toggled and does not have an ID passed in by the backend so render it seperately */}\n <SubscriptionCard\n type={'account-updates'}\n />\n {subscriptions.data.map(subscription => {\n return (\n <SubscriptionCard\n key={subscription.id}\n type={subscription.type}\n toggled={subscription.subscribed}\n setToggle={\n (subscriptionName, isSubscribed) =>\n updateSubscriptionPreference(subscription.id, subscriptionName, isSubscribed)\n }\n />\n );\n })}\n </div>\n \n <MessageFrequency\n updateMessageFrequency={updateMessgeFrequency}\n currentFrequency={messageFrequencyOption}\n />\n \n </SettingsLayout>\n );\n}"],"names":["getPhrase","BreadcrumbItem","props","ref","breadcrumb","name","appLink","active","withBackIcon","trimmedName","title","length","slice","className","svgName","size","S","Breadcrumbs","breadcrumbs","isMobile","collapse","setCollapse","shouldFocus","setShouldFocus","expandRef","characterLength","reduce","prev","next","current","focus","first","second","secondLast","last","rest","onClick","map","idx","key","PartialBreadcrumbs","numItems","style","height","width","dangerouslySetInnerHTML","__html","DEFAULT_PARTIAL_LOADING_OPTIONS","minWidth","maxWidth","PartialLoadingHelper","getPartialLoadingItems","options","opts","Array","Math","max","floor","random","namespace","useCanAccessSettings","requiredPermissions","hasPermissions","settingsGroups","currentRoute","application","some","group","modules","settingsModule","action","SettingsLayout","canAccess","replace","i","heading","headingButton","description","children","messageFrequencies","LanguageService","MessageFrequency","defaultFrequency","currentFrequency","activePill","setActivePill","Text","phrase","frequency","option","e","preventDefault","updateMessageFrequency","toLowerCase","type","subscriptionGroupLookup","note","tooltip","imageUrl","ImageUrls","colour","disabled","SubscriptionCard","subscription","toggled","setToggle","src","alt","role","ToggleSwitch","toggle","on","showStateWhenDisabled","tooltipText","SubscriptionRequests","getSubscriptionPreferences","url","HttpVerbs","setSubscriptionPreference","data","invalidationKeys","NotificationSettingsView","currentUser","UserRequests","useSettings","messageFrequencyOption","updateSetting","alerts","useSetPageMetadata","subscriptions","fetchAsync","AppLink","id","subscribed","subscriptionName","isSubscribed","subscriptionGroupId","success","error","updateSubscriptionPreference","newSetting","SettingName","value","kind","SettingKind"],"sourceRoot":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/5936-e61ae32ed3-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/breadcrumbs/Breadcrumbs.tsx","file:///app/packages/libs/shared/src/components/expandable-text/expandable-text.scss","file:///app/packages/libs/shared/src/components/expandable-text/ExpandableText.tsx","file:///app/packages/libs/shared/src/hooks/useExpandableTextButton.ts","file:///app/packages/libs/shared/src/components/infinite-scroll-footer/infinite-scroll-footer.scss","file:///app/packages/libs/shared/src/components/infinite-scroll-footer/InfiniteScrollFooter.tsx","file:///app/packages/libs/shared/src/components/play-page-v2/interactives-widget/InteractiveWidgetItemV2.tsx","file:///app/packages/libs/shared/src/components/video-list/partial-loading/partial-video-list.scss","file:///app/packages/libs/shared/src/components/video-list/partial-loading/PartialVideoList.tsx","file:///app/packages/libs/shared/src/components/video-owner-text/video-owner-text.scss","file:///app/packages/libs/shared/src/components/video-owner-text/VideoOwnerText.tsx","file:///app/packages/libs/shared/src/components/widgets/items/interactive-widget-item/InteractiveWidgetItem.tsx","file:///app/packages/libs/shared/src/components/widgets/items/interactive-widget-item/interactive-widget-item.scss","file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/hooks/UseHandleObjectError.ts","file:///app/packages/libs/shared/src/interfaces/PlayPageAnchor.ts","file:///app/packages/libs/shared/src/utils/PartialLoadingHelper.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/components/play-page/ArchivedBanner.tsx","file:///app/packages/projects/lite/src/shared/components/play-page/RestrictionBanner.tsx","file:///app/packages/projects/lite/src/shared/components/related-videos/RelatedVideos.tsx","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","file:///app/node_modules/react-bootstrap/esm/Row.js"],"sourcesContent":["import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { PartialLoadingHelper } from 'libs/shared/utils/PartialLoadingHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { SvgContainer, SvgContainerSize } from '../svg-container/SvgContainer';\n\nconst namespace = 'shared.breadcrumbComponent';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst COLLAPSE_CHARACTER_COUNT = 64;\nconst MAX_SEGMENT_LENGTH = 48;\n\nexport interface Breadcrumb {\n name: string;\n appLink?: Core.AppLink;\n active?: boolean;\n}\n\ninterface BreadcrumbItemProps {\n breadcrumb: Breadcrumb;\n withBackIcon?: boolean;\n}\n\nexport const BreadcrumbItem = React.forwardRef((\n props: BreadcrumbItemProps,\n ref: React.ForwardedRef<HTMLElement>\n) => {\n const { breadcrumb: { name, appLink, active }, withBackIcon } = props;\n\n let trimmedName = name;\n let title: string = null;\n\n if (trimmedName.length > MAX_SEGMENT_LENGTH) {\n trimmedName = name.slice(0, MAX_SEGMENT_LENGTH) + '...';\n\n // Only setting the title when we trim, because otherwise it's really not needed - Sha\n title = name;\n }\n\n return (\n <li\n className={`breadcrumb-item${active ? ' active' : ''}`}\n title={title}\n >\n {active\n ? <strong>{trimmedName}</strong>\n : <AppLink appLink={appLink} ref={ref}>\n {withBackIcon && <SvgContainer svgName={cvSvgLibrary.ChevronLeft} size={SvgContainerSize.Small} />}\n <span className={withBackIcon ? 'ms-2' : ''}>{trimmedName}</span>\n </AppLink>\n }\n </li>\n );\n});\n\ninterface BreadcrumbsProps {\n breadcrumbs: Breadcrumb[];\n}\n\nexport const Breadcrumbs = ({ breadcrumbs }: BreadcrumbsProps) => {\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n\n const length = breadcrumbs?.length || 0;\n \n const [ collapse, setCollapse ] = React.useState(false);\n const [ shouldFocus, setShouldFocus ] = React.useState(false);\n const expandRef = React.useRef<HTMLElement>();\n\n React.useEffect(() => {\n const characterLength = breadcrumbs?.reduce((prev, next) => prev + next.name.length, 0) ?? 0;\n\n if (length > 4 && characterLength > COLLAPSE_CHARACTER_COUNT)\n setCollapse(true);\n }, [breadcrumbs?.length]);\n\n /**\n * Focus our first expanded item the first time it appears.\n */\n React.useLayoutEffect(() => {\n if (shouldFocus)\n expandRef.current?.focus();\n }, [ expandRef.current, shouldFocus ]);\n\n function onClickExpand() {\n setCollapse(false);\n setShouldFocus(true);\n }\n\n if (!length || (isMobile && length < 2))\n return <></>;\n\n if (isMobile)\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n <BreadcrumbItem breadcrumb={breadcrumbs[length - 2]} withBackIcon />\n </ol>\n </nav>\n );\n\n const first = <BreadcrumbItem breadcrumb={breadcrumbs[0]} />;\n const second = length > 2 ? <BreadcrumbItem breadcrumb={breadcrumbs[1]} /> : <></>;\n const secondLast = length > 3 ? <BreadcrumbItem breadcrumb={breadcrumbs[length - 2]} /> : <></>;\n const last = length > 1 ? <BreadcrumbItem breadcrumb={breadcrumbs[length - 1]} /> : <></>;\n const rest = breadcrumbs.slice(2, length - 2);\n\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n {first}\n {second}\n {collapse ?\n <li className='breadcrumb-item'>\n <button\n className='btn-link'\n onClick={onClickExpand}\n aria-label={getPhrase('expand')}\n >\n ...\n </button>\n </li> :\n rest.map((breadcrumb, idx) => (\n <BreadcrumbItem\n key={idx}\n breadcrumb={breadcrumb}\n ref={idx === 0 ? expandRef : null}\n />\n ))\n }\n {secondLast}\n {last}\n </ol>\n </nav>\n );\n};\n\nexport const PartialBreadcrumbs = React.memo(function({ numItems = 3 }: { numItems?: number; }) {\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n\n if (isMobile) {\n return (\n <div className='partial-loading-background' style={{ height: '1.3125rem', width: '6rem' }} />\n );\n }\n\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n {PartialLoadingHelper.getPartialLoadingItems({ numItems }).map(({ width }, idx) => (\n <li key={idx} className='breadcrumb-item'>\n <span className='d-inline-block partial-loading-background' style={{ width }} dangerouslySetInnerHTML={{ __html: '&nbsp' }} />\n </li>\n ))}\n </ol>\n </nav>\n );\n});","// extracted by mini-css-extract-plugin\nexport default {\"text\":\"wLJpg\",\"collapsed\":\"ZxMAG\",\"seeMore\":\"x5t0p\"};","import React from 'react';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { useExpandableTextButton } from 'libs/shared/hooks/useExpandableTextButton';\n\nimport styles from './expandable-text.scss';\n\ninterface ExpandableTextProps {\n children: (props: {expanded: boolean}) => JSX.Element;\n lines?: number;\n}\n\nconst namespace = 'shared.expandableText';\n\nexport function ExpandableText(props: ExpandableTextProps): JSX.Element {\n const { lines = 2 } = props;\n const [ expanded, setExpanded ] = React.useState(false);\n\n const { containerRef, showButton } = useExpandableTextButton();\n const TextComponent = props.children;\n\n return (\n <div className='d-flex overflow-hidden'>\n <div\n style={{ '--lines': lines } as unknown as React.CSSProperties}\n className={`${expanded ? '' : styles.collapsed} ${styles.text}`} ref={containerRef}>\n {(!expanded && showButton) && (\n <DivButton\n onClick={() => setExpanded(true)}\n className={`ms-1 text-info hover-text-underline ${styles.seeMore}`}\n >\n <Text namespace={namespace} phrase='seeMore' />\n </DivButton>\n )}\n\n <TextComponent expanded={expanded} />\n\n {expanded && (\n <DivButton\n onClick={() => setExpanded(false)}\n className={`ms-1 text-info hover-text-underline d-inline`}\n >\n <Text namespace={namespace} phrase='seeLess' />\n </DivButton>\n )}\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { useResizeListener } from 'libs/shared/hooks/UseResizeListener';\n\nexport function useExpandableTextButton() {\n const containerRef = React.useRef<HTMLDivElement>(null);\n\n const memoClientHeight = React.useRef<number>(0);\n\n React.useEffect(() => {\n if (containerRef.current?.clientHeight)\n // memo the initial clientHeight, cuz after expand and collapse the clientHeight will change\n memoClientHeight.current = containerRef.current.clientHeight;\n }, []);\n\n const [ showButton, setShowButton ] = React.useState(containerRef.current?.scrollHeight > memoClientHeight.current);\n\n useResizeListener(() => {\n if (containerRef.current?.clientHeight) {\n // update memo value on resize\n memoClientHeight.current = containerRef.current.clientHeight;\n setShowButton(containerRef.current?.scrollHeight > memoClientHeight.current);\n }\n });\n\n React.useEffect(() => {\n if (containerRef.current?.scrollHeight) {\n setShowButton(containerRef.current?.scrollHeight > memoClientHeight.current);\n }\n }, [ containerRef.current?.scrollHeight, memoClientHeight.current ]);\n\n return { containerRef, showButton };\n}","// extracted by mini-css-extract-plugin\nexport default {\"container\":\"VwD1b\",\"spinner\":\"eJ85e\"};","import * as React from 'react';\nimport { Spinner } from 'react-bootstrap';\nimport { useInView } from 'react-intersection-observer';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './infinite-scroll-footer.scss';\n\ninterface InfiniteScrollFooterProps {\n isFetching: boolean;\n fetchNext?: (nextCursor: string) => void;\n nextCursor?: string;\n fetchOnScroll?: boolean;\n}\n\nInfiniteScrollFooter.defaultProps = {\n fetchOnScroll: false\n};\n\nexport function InfiniteScrollFooter(props: InfiniteScrollFooterProps): React.ReactElement {\n const [ ref, inView ] = useInView();\n\n React.useEffect(() => {\n if (!props.fetchOnScroll)\n return;\n\n if (!inView || props.isFetching)\n return;\n\n props.fetchNext?.(props.nextCursor);\n }, [ inView, props.isFetching ]);\n\n return (\n <div className={`p-3 text-center ${styles.container}`} ref={ref}>\n {props.isFetching\n ? <Spinner as='span' animation='border' role='status' className={styles.spinner} />\n : (\n <SvgContainer\n svgName={cvSvgLibrary.ChevronDown}\n className='svg-container cursor-pointer'\n size={SvgContainerSize.Large}\n onClick={() => props.fetchNext?.(props.nextCursor)}\n />\n )\n }\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ThumbnailText } from 'libs/shared/components/thumbnails/thumbnail-text/ThumbnailText';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { FixedWidgetItemProps } from 'libs/shared/components/widgets/items/FixedWidgetItemProps';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { CanFavouriteFunc, FavouriteFunc, InteractiveMetadata, YearGroup } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.interactiveWidgetItemV2';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface InteractiveWidgetItemV2Props extends FixedWidgetItemProps<InteractiveMetadata> {\n imageCdnUrl: string;\n questionsAppLink: Core.AppLink;\n setFavourite?: FavouriteFunc;\n canFavourite?: CanFavouriteFunc;\n yearGroups: YearGroup[];\n isPlugin: boolean;\n showOwner?: boolean;\n}\n\nexport const InteractiveWidgetItemV2 = React.memo(function(props: InteractiveWidgetItemV2Props): JSX.Element {\n const { data: interactive, thumbnailSize, preloadImage } = props;\n\n const questionsAppLink: Core.AppLink = {\n ...props.questionsAppLink,\n args: [props.data.id]\n };\n\n const questionsNumber = interactive._timepoints?.value?.length;\n\n return (\n <div className={`flex-shrink-0 px-1 col-6 col-sm-4`}>\n <VideoThumbnail\n type='static'\n textPosition={ThumbnailTextPosition.Independent}\n video={interactive}\n appLink={props.getAppLink(interactive)}\n imageOptions={{ size: thumbnailSize }}\n preload={preloadImage}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n hideDuration={false}\n imageCdnUrl={props.imageCdnUrl}\n isPlugin={props.isPlugin}\n showOwner={props.showOwner}\n />\n\n <div className='mt-2'>\n <ThumbnailText\n {...props}\n video={interactive}\n appLink={props.getAppLink(interactive)}\n />\n </div>\n\n <AppLink\n appLink={questionsAppLink}\n className='cursor-pointer hover-text-underline'\n ariaLabel={`${getPhrase('previewQuestions', { count: questionsNumber, smartCount: questionsNumber })} ${getPhrase('ariaPreview', { name: interactive.name })}`}\n >\n {questionsNumber\n ? (\n <Text namespace={namespace} phrase='previewQuestions' options={{ count: questionsNumber, smartCount: questionsNumber }}/>\n ) : (\n // handling a rare case: add a fallback phrase if we don't get the question number\n <Text namespace={namespace} phrase='previewQuestionsFallback' />\n )}\n </AppLink>\n </div>\n );\n});\n","// extracted by mini-css-extract-plugin\nexport default {\"partialOptions\":\"Gufgq\",\"partialName\":\"SicQQ\",\"partialDescription\":\"dPGMq\",\"partialThumbnail\":\"vZrnb\",\"partialDragHandle\":\"iq73R\"};","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { VideoListHelper } from 'libs/shared/components/video-list/VideoListHelper';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\n\nimport styles from './partial-video-list.scss';\n\ninterface PartialVideoListProps {\n withReordering?: boolean;\n numVideos?: number;\n allowBulkActions?: boolean;\n}\n\nPartialVideoList.defaultProps = {\n numVideos: 15\n};\n\nexport function PartialVideoList(props: PartialVideoListProps): JSX.Element {\n return (\n <div className='mx-2'>\n {Array(props.numVideos).fill(null).map((_, i) => (\n <div className='d-flex' key={i}>\n {props.allowBulkActions && <div className='form-check pe-3 pe-sm-2 mx-0 mx-md-2' />}\n <PartialVideoItem {...props} />\n </div>\n ))}\n </div>\n );\n}\n\nexport function PartialVideoItem(props: PartialVideoListProps): JSX.Element {\n const breakpoints = useBreakpoints();\n\n const size = VideoListHelper.getSize(breakpoints, 'md');\n const isSmall = size === 'sm';\n\n const withDragHandle = props.withReordering && !breakpoints.xs;\n\n return (\n <Row className={`${isSmall ? '' : 'py-2'} flex-grow-1`}>\n <Col {...VideoListHelper.getThumbnailColumns()} className={`flex-column align-items-flex-start ${isSmall ? `pb-2 pe-1` : 'mb-1 pe-3 pe-md-2'}`}>\n <Row>\n {!!withDragHandle && (\n <div className='d-flex align-items-center justify-content-center col-2'>\n <div className={`partial-loading-background ${styles.partialDragHandle}`} />\n </div>\n )}\n <Col xs={VideoListHelper.getThumbnailColSize(withDragHandle)}>\n <div className={`partial-loading-background ${isSmall ? 'rounded' : 'rounded-3'} ${styles.partialThumbnail}`} />\n </Col>\n </Row>\n </Col>\n <Col {...VideoListHelper.getDetailsColumns()} className={isSmall ? 'pb-2' : 'px-2'}>\n <div className={`partial-loading-background mb-1 ${styles.partialName}`} />\n <div className={`partial-loading-background ${styles.partialDescription}`} />\n </Col>\n </Row>\n );\n}\n\n","// extracted by mini-css-extract-plugin\nexport default {\"avatarContainer\":\"kd18L\",\"cvIcon\":\"smUBc\"};","import React from 'react';\n\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { SvgContainer2 } from 'libs/shared/components/svg-container/SvgContainer2';\nimport { ClickViewPlayLogo } from 'libs/shared/components/svgs/clickview-logo/ClickViewLogo';\nimport { User } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from './video-owner-text.scss';\n\ninterface VideoOwnerTextProps {\n owner: User;\n isClickViewCurated: boolean;\n imageCdnUrl: string;\n}\n\nexport function VideoOwnerText(props: VideoOwnerTextProps): JSX.Element {\n if (!props.owner && !props.isClickViewCurated)\n return <></>;\n\n if (props.isClickViewCurated) {\n return (\n <div className='clamp-1 d-flex align-items-center'>\n <div className={`${styles.avatarContainer} me-1 border rounded-circle position-relative`}>\n <SvgContainer2 className={`me-1 ${styles.cvIcon}`}>\n <ClickViewPlayLogo />\n </SvgContainer2>\n </div>\n ClickView\n </div>\n );\n }\n\n const name = UserHelper.getCommunityName(props.owner);\n\n if (!name)\n return <></>;\n\n return (\n <div className='d-flex align-items-center'>\n <div className={`${styles.avatarContainer} me-1`}>\n <Avatar\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(props.owner.name, props.owner.surname)}\n imageUrl={props.owner.avatar?.url}\n />\n </div>\n <div className='clamp-1'>\n {name}\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { VideoOwnerText } from 'libs/shared/components/video-owner-text/VideoOwnerText';\nimport { FixedWidgetItemProps } from 'libs/shared/components/widgets/items/FixedWidgetItemProps';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { Clip, InteractiveMetadata, Video } from 'libs/shared/interfaces';\n\nimport styles from './interactive-widget-item.scss';\n\nconst namespace = 'shared.interactiveWidgetItem';\n\nexport interface InteractiveWidgetItemProps extends FixedWidgetItemProps<InteractiveMetadata> {\n video: Video | Clip;\n questionsAppLink: Core.AppLink;\n imageCdnUrl: string;\n}\n\nexport const InteractiveWidgetItem = React.memo(function(props: InteractiveWidgetItemProps): JSX.Element {\n const questionsAppLink: Core.AppLink = {\n ...props.questionsAppLink,\n args: [props.data.id]\n };\n\n return (\n <div className={`flex-shrink-0 px-1 ${styles.item}`}>\n <div className='row m-0 border rounded p-2 h-100'>\n <div className='col-6 p-0'>\n <VideoThumbnail\n video={props.data}\n appLink={props.getAppLink(props.data)}\n type='cosmetic'\n imageOptions={{ size: ImageSize.Small }}\n textPosition={ThumbnailTextPosition.Independent}\n preload\n analyticsOptions={{ location: LocationContext.SlidingListItem }}\n />\n </div>\n\n <div className='col-6 p-0'>\n <div className='ps-2'>\n <AppLink appLink={props.getAppLink(props.data)}>\n <h3 className='h6 mb-1'><span className='clamp-2'>{props.data.name}</span></h3>\n </AppLink>\n\n <VideoOwnerText\n owner={props.data.owner}\n isClickViewCurated={props.data._isClickViewCurated?.value}\n imageCdnUrl={props.imageCdnUrl}\n />\n\n <AppLink className='cursor-pointer hover-text-underline' appLink={questionsAppLink}>\n <Text namespace={namespace} phrase='previewQuestions' />\n </AppLink>\n </div>\n </div>\n </div>\n </div>\n );\n});\n","// extracted by mini-css-extract-plugin\nexport default {\"item\":\"rXatl\"};","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}\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};\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.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import { useEffect } from 'react';\n\nimport { 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}","export enum PlayPageAnchor {\n Resources = 'resources',\n Interactives = 'interactives',\n Video = 'video',\n Clips = 'clips',\n CurriculumLinks = 'curriculum-links',\n VideoDetails = 'video-details',\n RelatedVideos = 'related-videos',\n ClippedFrom='clipped-from'\n}","const DEFAULT_PARTIAL_LOADING_OPTIONS: PartialLoadingOptions = {\n numItems: 5,\n minWidth: 50, // px\n maxWidth: 100 // px\n};\n\nexport interface PartialLoadingOptions {\n numItems?: number;\n minWidth?: number;\n maxWidth?: number;\n}\n\ninterface PartialLoadingItem {\n width: string;\n}\n\nexport const PartialLoadingHelper = {\n getPartialLoadingItems(options: PartialLoadingOptions = {}): PartialLoadingItem[] {\n const opts = {\n ...DEFAULT_PARTIAL_LOADING_OPTIONS,\n ...options\n };\n\n const getRandomFilterWidth = () => Math.max(Math.floor(Math.random() * opts.maxWidth), opts.minWidth);\n\n return [...Array(opts.numItems)].map(() => ({ width: `${getRandomFilterWidth()}px` }));\n }\n};","import React from 'react';\nimport { createHtmlPortalNode, OutPortal } from 'react-reverse-portal';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\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 { 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 { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\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?: number;\n endTime?: number;\n\n // Share view only\n shareLink?: UnionShareObject;\n sharerInstanceRegion?: string;\n checkMarkStatus?: CheckMarkStatus;\n relatedVideos: RelatedVideosHash;\n isPlugin: boolean;\n\n publicName?: string;\n profileId?: string;\n}\n\nexport function PlayInteractive(props: PlayInteractiveProps): JSX.Element {\n const locationContext = props.shareLink ?\n LocationContext.PlaySharedInteractive :\n LocationContext.PlayInteractive;\n\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 { setFavourite, canFavourite } = useLiteFavourites(locationContext);\n const { hasPermissions } = usePermissions();\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 <RestrictionPadlock\n tooltipPlacement='right'\n className='ps-1'\n video={props.interactive}\n yearGroups={props.yearGroups}\n />\n </h1>\n }\n </div>\n <OutPortal node={summaryPortalNode}></OutPortal>\n\n {!hasPermissions(PermissionName.StudentExperience) && (\n <RelatedVideos\n currentVideo={props.interactive}\n yearGroups={props.yearGroups}\n currentUser={props.currentUser}\n setFavourite={setFavourite}\n canFavourite={canFavourite}\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 })}\n moviesAndTv={props.queryParams.mtv}\n isPlugin={props.isPlugin}\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 { LocationContext } from 'libs/analytics/interfaces';\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 { InteractiveWidgetItemV2, InteractiveWidgetItemV2Props } from 'libs/shared/components/play-page-v2/interactives-widget/InteractiveWidgetItemV2';\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 { InteractiveWidgetItem, InteractiveWidgetItemProps } from 'libs/shared/components/widgets/items/interactive-widget-item/InteractiveWidgetItem';\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 { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Clip, Config, CurrentUser, Interactive, InteractiveMetadata, PresentationAudience, Video, YearGroup } from 'libs/shared/interfaces';\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 { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\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 yearGroups: YearGroup[];\n config: Config;\n token?: AuthToken;\n currentUser: CurrentUser;\n queryParams: PlayViewQueryParams;\n audiences: PresentationAudience[];\n isPreviewPreventScrubbingEnabled: boolean;\n relatedVideos: RelatedVideosHash;\n canManageVideoAccess: boolean;\n isPlugin: boolean;\n breadcrumbs?: Breadcrumb[];\n\n // Share view only\n shareId?: string;\n}\n\nexport function PreviewInteractive(props: PreviewInteractiveProps): JSX.Element {\n const locationContext = props.shareId ? LocationContext.PreviewSharedInteractive : LocationContext.PreviewInteractive;\n\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 const { setFavourite, canFavourite } = useLiteFavourites(locationContext);\n const { hasPlayPageV2 } = useSettings(null);\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.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.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 {!hasPlayPageV2 ? (\n <FixedWidget<InteractiveWidgetItemProps>\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 video: props.sourceVideo,\n questionsAppLink: {\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.PREVIEW_QUESTIONS\n },\n imageCdnUrl: props.config.imageCdnUrl\n }}\n analyticsData={{ widgetId: 'interactives' }}\n />\n ) : (\n <FixedWidget<InteractiveWidgetItemV2Props>\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={InteractiveWidgetItemV2}\n extraChildComponentProps={{\n yearGroups: props.yearGroups,\n questionsAppLink: {\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.PREVIEW_QUESTIONS\n },\n imageCdnUrl: props.config.imageCdnUrl,\n isPlugin: props.isPlugin\n }}\n analyticsData={{ widgetId: 'interactives' }}\n />\n )}\n </div>\n )}\n\n <RelatedVideos\n currentVideo={props.interactive}\n yearGroups={props.yearGroups}\n setFavourite={setFavourite}\n canFavourite={canFavourite}\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 })}\n moviesAndTv={props.queryParams.mtv}\n isPlugin={props.isPlugin}\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 React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType } from 'libs/analytics/interfaces';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.playPage';\n\ninterface ArchivedBannerProps {\n typeId: MasterType;\n hasStudentExperience: boolean;\n}\n\nfunction mapTypeId(typeId: MasterType): string {\n switch (typeId) {\n case MasterType.Video:\n return 'video';\n case MasterType.Clip:\n return 'clip';\n case MasterType.Interactive:\n return 'interactive';\n default:\n return '';\n }\n}\n\nexport function ArchivedBanner(props: ArchivedBannerProps): JSX.Element {\n const getPhrase = LanguageService.encloseNamespace(namespace);\n const type = mapTypeId(props.typeId);\n\n return (\n <div className='alert bg-light-blue p-3 rounded-3 d-flex justify-content-between 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', { type })}</p>\n {(!props.hasStudentExperience || type === EntityType.Video) && (\n <p className='mb-1'>{getPhrase('archivedInfo', { type: `${type}s` })}</p>\n )}\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { RestrictionType } from 'libs/shared/enums/RestrictionType';\nimport { Restrictions, YearGroup } from 'libs/shared/interfaces';\nimport { RestrictionHelper } from 'libs/shared/utils/RestrictionHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'shared.playPage';\n\ninterface RestrictionBannerProps {\n restrictions: Restrictions;\n yearGroups: YearGroup[];\n objectId: string;\n objectTypeId: MasterType;\n canManageVideoAccess: boolean;\n}\n\nexport function RestrictionBanner(props: RestrictionBannerProps): JSX.Element {\n if (!props.restrictions?.value?.length || !props.yearGroups || !props.canManageVideoAccess)\n return <></>;\n\n const restriction = RestrictionHelper.getWeightedRestriction(props.restrictions.value);\n\n if (restriction.type !== RestrictionType.Custom)\n return <></>;\n\n const baseClassName = RestrictionHelper.mapRestrictionToClass(props.restrictions);\n const className = `${baseClassName} fw-semibold p-2 rounded mb-3 d-flex justify-content-between align-items-center`;\n\n return (\n <div className={className}>\n <div className='d-flex align-items-center'>\n <SvgContainer\n svgName={RestrictionHelper.mapRestrictionToSvg(props.restrictions)}\n size={SvgContainerSize.Large}\n />\n <span className='ps-1'>\n {RestrictionHelper.mapRestrictionToText(props.restrictions, props.yearGroups)}\n </span>\n </div>\n \n <AppLink\n appLink={{\n application: AppChannels.DEFAULT,\n action: Actions.Default.APPROVE_VIDEO,\n params: {\n objectId: props.objectId,\n objectTypeId: props.objectTypeId\n }\n }}\n className='btn btn-outline-dark'\n >\n <Text namespace={namespace} phrase='approve' />\n </AppLink>\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PartialVideoList } from 'libs/shared/components/video-list/partial-loading/PartialVideoList';\nimport { VideoList } from 'libs/shared/components/video-list/VideoList';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { CanFavouriteFunc, CurrentUser, FavouriteFunc, PresentationAudience, VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { RelatedVideosHash } from 'shared/hooks/useGetRelatedVideos';\nimport { InteractiveHelpers } from 'shared/utils/InteractiveHelper';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { SeriesAppLinkHelper } from 'apps/series/SeriesAppLinkHelper';\n\nconst namespace = 'shared.relatedVideos';\n\ninterface RelatedVideosProps {\n currentVideo: VideoTypes;\n yearGroups: YearGroup[];\n relatedVideos: RelatedVideosHash;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n currentUser: CurrentUser;\n audiences: PresentationAudience[];\n getVideoAppLink: (video: VideoTypes, opts: GetVideoAppLinkOptions) => Core.AppLink;\n moviesAndTv: boolean;\n isPlugin: boolean;\n headingRef?: React.MutableRefObject<Map<PlayPageAnchor, HTMLElement>>;\n}\n\nexport function RelatedVideos(props: RelatedVideosProps): JSX.Element {\n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem });\n const { hasPermissions } = usePermissions();\n\n if (!props.currentUser?.isAuthenticated) // Don't render if user is unauthenticated\n return <></>;\n\n if (props.relatedVideos.hasError) // Don't render if request has errored\n return <></>;\n\n if (props.relatedVideos.hasCompleted && !props.relatedVideos.videos?.length) // Don't render if response is empty\n return <></>;\n\n if (!props.relatedVideos.isFetching && !props.relatedVideos.hasCompleted) // Don't render if request is never made\n return <></>;\n\n // We don't support autoplaying from interactives. This means the related videos heading won't say \"Up next\"\n const canAutoplay = !VideoHelper.isInteractive(props.currentVideo);\n\n return (\n <section\n id={PlayPageAnchor.RelatedVideos}\n className='play-page-section'\n ref={el => {\n (el && props.headingRef?.current\n && !!props.relatedVideos.videos?.length)\n && props.headingRef.current.set(PlayPageAnchor.RelatedVideos, el);\n }}\n >\n <VideoActionsContext.Provider value={videoActions}>\n <h2 className='h4 mb-0'>\n <Text namespace={namespace} phrase={canAutoplay ? 'upNext' : 'relatedVideos'} />\n </h2>\n {props.relatedVideos.hasCompleted ? (\n <VideoList\n videos={props.relatedVideos.videos}\n yearGroups={props.yearGroups}\n getSubTextAppLink={video => {\n return SeriesAppLinkHelper.getSeriesAppLink(video.series, props.moviesAndTv ? { mtv: true } : null);\n }}\n getVideoAppLink={props.getVideoAppLink}\n hasPermissions={hasPermissions}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n presentationAudiences={props.audiences}\n getPreviewQuestionsAppLink={interactive => InteractiveHelpers.getPreviewQuestionsAppLink(interactive)}\n isPlugin={props.isPlugin}\n getClassroomGuideAppLink={VideoAppLinkHelper.getClassroomGuideAppLink}\n getInteractiveGuidanceAppLink={VideoAppLinkHelper.getInteractiveGuidanceAppLink}\n getResourceGuidanceAppLink={VideoAppLinkHelper.getResourceGuidanceAppLink}\n />\n ) : <PartialVideoList />\n }\n {props.relatedVideos.hasMore && (\n <InfiniteScrollFooter\n isFetching={props.relatedVideos.isFetching}\n fetchNext={props.relatedVideos.fetchNext}\n />\n )}\n </VideoActionsContext.Provider>\n </section>\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 React from 'react';\n\nimport { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { Clip, ClipCollection, CurrentUser, Video, VideoCollection } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nconst CHUNK_SIZE = 50;\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 currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const hydratedVideos = React.useRef<Set<string>>(new Set<string>());\n\n const videos = getValidObjects(objects);\n\n const videoIds = videos.map(v => v.id);\n\n const [ request, setRequest ] = React.useState<Flight.Request[]>([]);\n\n React.useEffect(() => {\n if (!videoIds?.length || !currentUser.hasCompleted)\n return;\n\n const unhydratedVideos: string[] = [];\n\n videoIds.forEach(id => {\n if (!hydratedVideos.current.has(id)) {\n unhydratedVideos.push(id);\n hydratedVideos.current.add(id);\n }\n });\n \n if (!unhydratedVideos.length)\n return;\n\n setRequest(r => {\n const newRequests = [...r] ;\n\n ArrayHelper.chunk<string>(unhydratedVideos, CHUNK_SIZE).forEach(chunk => {\n newRequests.push(VideoRequests.videoMixinAssocs(chunk, options.flightNamespace));\n\n if (currentUser.data?.isAuthenticated)\n newRequests.push(ClassificationRequests.hasCurriculumLinks(chunk, null, options.flightNamespace));\n });\n\n return newRequests;\n });\n }, [ videoIds?.length, currentUser.hasCompleted ]);\n\n Flight.useBasicFetchAll(request);\n}","\"use client\";\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { useBootstrapPrefix, useBootstrapBreakpoints, useBootstrapMinBreakpoint } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst Row = /*#__PURE__*/React.forwardRef(({\n bsPrefix,\n className,\n // Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n as: Component = 'div',\n ...props\n}, ref) => {\n const decoratedBsPrefix = useBootstrapPrefix(bsPrefix, 'row');\n const breakpoints = useBootstrapBreakpoints();\n const minBreakpoint = useBootstrapMinBreakpoint();\n const sizePrefix = `${decoratedBsPrefix}-cols`;\n const classes = [];\n breakpoints.forEach(brkPoint => {\n const propValue = props[brkPoint];\n delete props[brkPoint];\n let cols;\n if (propValue != null && typeof propValue === 'object') {\n ({\n cols\n } = propValue);\n } else {\n cols = propValue;\n }\n const infix = brkPoint !== minBreakpoint ? `-${brkPoint}` : '';\n if (cols != null) classes.push(`${sizePrefix}${infix}-${cols}`);\n });\n return /*#__PURE__*/_jsx(Component, {\n ref: ref,\n ...props,\n className: classNames(className, decoratedBsPrefix, ...classes)\n });\n});\nRow.displayName = 'Row';\nexport default Row;"],"names":["getPhrase","BreadcrumbItem","props","ref","breadcrumb","name","appLink","active","withBackIcon","trimmedName","title","length","slice","className","svgName","size","S","Breadcrumbs","breadcrumbs","isMobile","collapse","setCollapse","shouldFocus","setShouldFocus","expandRef","characterLength","reduce","prev","next","current","focus","first","second","secondLast","last","rest","onClick","map","idx","key","PartialBreadcrumbs","numItems","style","height","width","dangerouslySetInnerHTML","__html","namespace","ExpandableText","lines","expanded","setExpanded","containerRef","memoClientHeight","clientHeight","scrollHeight","showButton","setShowButton","useExpandableTextButton","TextComponent","children","DivButton","Text","phrase","InfiniteScrollFooter","inView","fetchOnScroll","isFetching","fetchNext","nextCursor","Spinner","as","animation","role","SvgContainer","defaultProps","InteractiveWidgetItemV2","interactive","data","thumbnailSize","preloadImage","questionsAppLink","args","id","questionsNumber","_timepoints","value","type","textPosition","video","getAppLink","imageOptions","preload","analyticsData","analyticsOptions","setFavourite","canFavourite","hideDuration","imageCdnUrl","isPlugin","showOwner","ariaLabel","count","smartCount","options","PartialVideoList","Array","numVideos","fill","_","i","allowBulkActions","PartialVideoItem","breakpoints","useBreakpoints","isSmall","VideoListHelper","withDragHandle","withReordering","xs","Row","Col","VideoOwnerText","owner","isClickViewCurated","SvgContainer2","UserHelper","Avatar","initials","surname","imageUrl","avatar","url","InteractiveWidgetItem","VideoThumbnail","ThumbnailTextPosition","location","AppLink","_isClickViewCurated","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","generateCacheKey","flightObjs","obj","join","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","isArray","useEffect","forEach","PlayPageAnchor","DEFAULT_PARTIAL_LOADING_OPTIONS","minWidth","maxWidth","PartialLoadingHelper","getPartialLoadingItems","opts","Math","max","floor","random","PlayInteractive","locationContext","shareLink","showHeading","setShowHeading","isArchived","summaryPortalNode","u","hasPermissions","typeId","hasStudentExperience","config","currentUser","viewKey","startTime","onShowSummary","showing","token","publicName","profileId","tooltipPlacement","yearGroups","node","currentVideo","relatedVideos","audiences","getVideoAppLink","v","context","queryParams","contextId","playNext","shareId","moviesAndTv","mtv","LanguageService","InteractiveAlertBanner","isPreviewPreventScrubbingEnabled","Tooltip","trigger","spanHack","ToggleSwitch","on","isPreviewingPreventScrubbing","toggleStudentMode","PreviewInteractive","previewPreventInteractive","togglePreviewPreventInteractive","otherInteractives","backToName","backAppLink","playerContext","setIsPreviewingPreventScrubbing","canConsume","VideoHelper","videoActions","useVideoActions","useLiteFavourites","hasPlayPageV2","useSettings","playerRef","togglePreviewPreventScrubbing","sourceVideo","interactives","filter","toString","application","action","TextHelper","isDraft","CurationStatus","RestrictionBanner","restrictions","_restrictions","objectId","objectTypeId","MasterType","canManageVideoAccess","GlobalPlayerConsumer","t","mode","Actions","actions","getVideoActions","actionsDropdownClassName","fetchMore","fetchMoreActions","RestrictionPadlock","description","questionListPortalNode","contents","WidgetContents","collection","prefetched","getChildAppLink","childComponent","extraChildComponentProps","widgetId","RelatedVideos","VideoAppLinkHelper","ArchivedBanner","mapTypeId","baseClassName","params","isAuthenticated","hasError","hasCompleted","videos","canAutoplay","el","headingRef","set","getSubTextAppLink","series","presentationAudiences","getPreviewQuestionsAppLink","getClassroomGuideAppLink","getInteractiveGuidanceAppLink","getResourceGuidanceAppLink","hasMore","usePresentationAudiences","redirectOnError","activePresentation","getFallbackPresentation","presentation","useShouldPreviewInteractive","hasProduct","CHUNK_SIZE","useVideoMixin","objects","hydratedVideos","Set","o","getValidObjects","videoIds","request","setRequest","unhydratedVideos","has","push","add","r","newRequests","chunk","flightNamespace","bsPrefix","Component","decoratedBsPrefix","minBreakpoint","sizePrefix","classes","brkPoint","propValue","cols","infix","displayName"],"sourceRoot":""}