@clickview/lite 0.84.0 → 0.84.1-rc.1

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 (123) hide show
  1. package/dist/bundles.json +2 -2
  2. package/dist/css/4945-lite-72ae59fcab.chunk.css +2 -0
  3. package/dist/css/8852-lite-84d6357a79.chunk.css +1 -0
  4. package/dist/css/{lite-app-b4540a3be1.css → lite-app-084c45f90e.css} +2 -0
  5. package/dist/languages/en.json +1 -1
  6. package/dist/scripts/{1202-d96ad80884-lite.chunk.js → 1202-5473d9962d-lite.chunk.js} +2 -2
  7. package/dist/scripts/{1202-d96ad80884-lite.chunk.js.map → 1202-5473d9962d-lite.chunk.js.map} +1 -1
  8. package/dist/scripts/171-acb1ef0ae4-lite.chunk.js +2 -0
  9. package/dist/scripts/171-acb1ef0ae4-lite.chunk.js.map +1 -0
  10. package/dist/scripts/1726-b08dde1407-lite.chunk.js +2 -0
  11. package/dist/scripts/1726-b08dde1407-lite.chunk.js.map +1 -0
  12. package/dist/scripts/1912-52e57d9f16-lite.chunk.js +2 -0
  13. package/dist/scripts/1912-52e57d9f16-lite.chunk.js.map +1 -0
  14. package/dist/scripts/{289-669c0c8222-lite.chunk.js → 289-190caa6455-lite.chunk.js} +2 -2
  15. package/dist/scripts/{289-669c0c8222-lite.chunk.js.map → 289-190caa6455-lite.chunk.js.map} +1 -1
  16. package/dist/scripts/{3249-0b55dec380-lite.chunk.js → 3249-08a22f8aaf-lite.chunk.js} +2 -2
  17. package/dist/scripts/3249-08a22f8aaf-lite.chunk.js.map +1 -0
  18. package/dist/scripts/3840-df2873e349-lite.chunk.js +2 -0
  19. package/dist/scripts/3840-df2873e349-lite.chunk.js.map +1 -0
  20. package/dist/scripts/4006-5078eb2c01-lite.chunk.js +3 -0
  21. package/dist/scripts/4006-5078eb2c01-lite.chunk.js.map +1 -0
  22. package/dist/scripts/4525-2ade147f5d-lite.chunk.js +2 -0
  23. package/dist/scripts/4525-2ade147f5d-lite.chunk.js.map +1 -0
  24. package/dist/scripts/4945-fbbb21cf54-lite.chunk.js +2 -0
  25. package/dist/scripts/4945-fbbb21cf54-lite.chunk.js.map +1 -0
  26. package/dist/scripts/4985-6bdacf82c1-lite.chunk.js +2 -0
  27. package/dist/scripts/4985-6bdacf82c1-lite.chunk.js.map +1 -0
  28. package/dist/scripts/5002-c0f45922c6-lite.chunk.js +2 -0
  29. package/dist/scripts/5002-c0f45922c6-lite.chunk.js.map +1 -0
  30. package/dist/scripts/516-94eeca32e7-lite.chunk.js +2 -0
  31. package/dist/scripts/516-94eeca32e7-lite.chunk.js.map +1 -0
  32. package/dist/scripts/5270-55334d53e9-lite.chunk.js +2 -0
  33. package/dist/scripts/5270-55334d53e9-lite.chunk.js.map +1 -0
  34. package/dist/scripts/5579-7d9081e134-lite.chunk.js +2 -0
  35. package/dist/scripts/{5579-a9c152057f-lite.chunk.js.map → 5579-7d9081e134-lite.chunk.js.map} +1 -1
  36. package/dist/scripts/5712-37a97adc65-lite.chunk.js +2 -0
  37. package/dist/scripts/5712-37a97adc65-lite.chunk.js.map +1 -0
  38. package/dist/scripts/639-0bf7cc53f9-lite.chunk.js +2 -0
  39. package/dist/scripts/639-0bf7cc53f9-lite.chunk.js.map +1 -0
  40. package/dist/scripts/6909-b5717e92e8-lite.chunk.js +2 -0
  41. package/dist/scripts/6909-b5717e92e8-lite.chunk.js.map +1 -0
  42. package/dist/scripts/7459-c1882c6f0d-lite.chunk.js +3 -0
  43. package/dist/scripts/7459-c1882c6f0d-lite.chunk.js.map +1 -0
  44. package/dist/scripts/7604-5d2ba346e2-lite.chunk.js +3 -0
  45. package/dist/scripts/7604-5d2ba346e2-lite.chunk.js.map +1 -0
  46. package/dist/scripts/{7617-9d34c841e6-lite.chunk.js → 7617-899a1d0cb1-lite.chunk.js} +2 -2
  47. package/dist/scripts/7617-899a1d0cb1-lite.chunk.js.map +1 -0
  48. package/dist/scripts/7742-95097c976d-lite.chunk.js +2 -0
  49. package/dist/scripts/7742-95097c976d-lite.chunk.js.map +1 -0
  50. package/dist/scripts/{7843-f6033528ce-lite.chunk.js → 7843-fc9ddb3b52-lite.chunk.js} +2 -2
  51. package/dist/scripts/7843-fc9ddb3b52-lite.chunk.js.map +1 -0
  52. package/dist/scripts/{7867-14c692e69c-lite.chunk.js → 7867-589c7bd788-lite.chunk.js} +3 -3
  53. package/dist/scripts/7867-589c7bd788-lite.chunk.js.map +1 -0
  54. package/dist/scripts/{787-dcb3a0a26c-lite.chunk.js → 787-5c7976e8cb-lite.chunk.js} +2 -2
  55. package/dist/scripts/{787-dcb3a0a26c-lite.chunk.js.map → 787-5c7976e8cb-lite.chunk.js.map} +1 -1
  56. package/dist/scripts/8056-a3d8fa8728-lite.chunk.js +2 -0
  57. package/dist/scripts/8056-a3d8fa8728-lite.chunk.js.map +1 -0
  58. package/dist/scripts/{8672-6967ce8a23-lite.chunk.js → 8672-5637204ae3-lite.chunk.js} +2 -2
  59. package/dist/scripts/{8672-6967ce8a23-lite.chunk.js.map → 8672-5637204ae3-lite.chunk.js.map} +1 -1
  60. package/dist/scripts/8852-c39595da59-lite.chunk.js +2 -0
  61. package/dist/scripts/8852-c39595da59-lite.chunk.js.map +1 -0
  62. package/dist/scripts/8944-022dbd6a0b-lite.chunk.js +2 -0
  63. package/dist/scripts/8944-022dbd6a0b-lite.chunk.js.map +1 -0
  64. package/dist/scripts/9742-c839ec5abb-lite.chunk.js +2 -0
  65. package/dist/scripts/9742-c839ec5abb-lite.chunk.js.map +1 -0
  66. package/dist/scripts/{8133-ffcff3b7fc-lite.chunk.js → 9803-9a666cfdef-lite.chunk.js} +3 -3
  67. package/dist/scripts/9803-9a666cfdef-lite.chunk.js.map +1 -0
  68. package/dist/scripts/bundle-375332cf3f.min.js +3 -0
  69. package/dist/scripts/{bundle-2bbba2aa8b.min.js.map → bundle-375332cf3f.min.js.map} +1 -1
  70. package/package.json +1 -1
  71. package/dist/scripts/171-36c7520c9c-lite.chunk.js +0 -2
  72. package/dist/scripts/171-36c7520c9c-lite.chunk.js.map +0 -1
  73. package/dist/scripts/1726-c79cf77a51-lite.chunk.js +0 -2
  74. package/dist/scripts/1726-c79cf77a51-lite.chunk.js.map +0 -1
  75. package/dist/scripts/1912-1f78dc635a-lite.chunk.js +0 -2
  76. package/dist/scripts/1912-1f78dc635a-lite.chunk.js.map +0 -1
  77. package/dist/scripts/2074-39b86b9a22-lite.chunk.js +0 -2
  78. package/dist/scripts/2074-39b86b9a22-lite.chunk.js.map +0 -1
  79. package/dist/scripts/3249-0b55dec380-lite.chunk.js.map +0 -1
  80. package/dist/scripts/3840-98c79fc0d8-lite.chunk.js +0 -2
  81. package/dist/scripts/3840-98c79fc0d8-lite.chunk.js.map +0 -1
  82. package/dist/scripts/3893-2856933742-lite.chunk.js +0 -2
  83. package/dist/scripts/3893-2856933742-lite.chunk.js.map +0 -1
  84. package/dist/scripts/4006-9dfe9cec1b-lite.chunk.js +0 -3
  85. package/dist/scripts/4006-9dfe9cec1b-lite.chunk.js.map +0 -1
  86. package/dist/scripts/4985-bdfa839f8f-lite.chunk.js +0 -2
  87. package/dist/scripts/4985-bdfa839f8f-lite.chunk.js.map +0 -1
  88. package/dist/scripts/5002-7514146621-lite.chunk.js +0 -2
  89. package/dist/scripts/5002-7514146621-lite.chunk.js.map +0 -1
  90. package/dist/scripts/5270-d407e1ae84-lite.chunk.js +0 -2
  91. package/dist/scripts/5270-d407e1ae84-lite.chunk.js.map +0 -1
  92. package/dist/scripts/5579-a9c152057f-lite.chunk.js +0 -2
  93. package/dist/scripts/5712-e784cfe89c-lite.chunk.js +0 -2
  94. package/dist/scripts/5712-e784cfe89c-lite.chunk.js.map +0 -1
  95. package/dist/scripts/6909-a9b8930e37-lite.chunk.js +0 -2
  96. package/dist/scripts/6909-a9b8930e37-lite.chunk.js.map +0 -1
  97. package/dist/scripts/7401-833bc4a088-lite.chunk.js +0 -2
  98. package/dist/scripts/7401-833bc4a088-lite.chunk.js.map +0 -1
  99. package/dist/scripts/7604-f664281904-lite.chunk.js +0 -3
  100. package/dist/scripts/7604-f664281904-lite.chunk.js.map +0 -1
  101. package/dist/scripts/7617-9d34c841e6-lite.chunk.js.map +0 -1
  102. package/dist/scripts/7742-342db3ce4f-lite.chunk.js +0 -2
  103. package/dist/scripts/7742-342db3ce4f-lite.chunk.js.map +0 -1
  104. package/dist/scripts/7843-f6033528ce-lite.chunk.js.map +0 -1
  105. package/dist/scripts/7867-14c692e69c-lite.chunk.js.map +0 -1
  106. package/dist/scripts/8056-eec7c2fda0-lite.chunk.js +0 -2
  107. package/dist/scripts/8056-eec7c2fda0-lite.chunk.js.map +0 -1
  108. package/dist/scripts/8133-ffcff3b7fc-lite.chunk.js.map +0 -1
  109. package/dist/scripts/8364-ff63447d36-lite.chunk.js +0 -3
  110. package/dist/scripts/8364-ff63447d36-lite.chunk.js.map +0 -1
  111. package/dist/scripts/8944-b56c3e61fc-lite.chunk.js +0 -2
  112. package/dist/scripts/8944-b56c3e61fc-lite.chunk.js.map +0 -1
  113. package/dist/scripts/9742-5f99d74bb0-lite.chunk.js +0 -2
  114. package/dist/scripts/9742-5f99d74bb0-lite.chunk.js.map +0 -1
  115. package/dist/scripts/bundle-2bbba2aa8b.min.js +0 -3
  116. /package/dist/css/{2074-lite-ac8da6c78b.chunk.css → 4525-lite-ac8da6c78b.chunk.css} +0 -0
  117. /package/dist/css/{8364-lite-db31e36b79.chunk.css → 7459-lite-db31e36b79.chunk.css} +0 -0
  118. /package/dist/scripts/{4006-9dfe9cec1b-lite.chunk.js.LICENSE.txt → 4006-5078eb2c01-lite.chunk.js.LICENSE.txt} +0 -0
  119. /package/dist/scripts/{7604-f664281904-lite.chunk.js.LICENSE.txt → 7459-c1882c6f0d-lite.chunk.js.LICENSE.txt} +0 -0
  120. /package/dist/scripts/{7867-14c692e69c-lite.chunk.js.LICENSE.txt → 7604-5d2ba346e2-lite.chunk.js.LICENSE.txt} +0 -0
  121. /package/dist/scripts/{8133-ffcff3b7fc-lite.chunk.js.LICENSE.txt → 7867-589c7bd788-lite.chunk.js.LICENSE.txt} +0 -0
  122. /package/dist/scripts/{8364-ff63447d36-lite.chunk.js.LICENSE.txt → 9803-9a666cfdef-lite.chunk.js.LICENSE.txt} +0 -0
  123. /package/dist/scripts/{bundle-2bbba2aa8b.min.js.LICENSE.txt → bundle-375332cf3f.min.js.LICENSE.txt} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/3840-df2873e349-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/calendar/components/coming-soon-tag/coming-soon-tag.scss","file:///app/packages/libs/shared/src/apps/calendar/components/coming-soon-tag/ComingSoonTag.tsx","file:///app/packages/libs/shared/src/apps/calendar/components/generic-calendar-date/generic-calendar-date.scss","file:///app/packages/libs/shared/src/apps/calendar/components/generic-calendar-date/GenericCalendarDate.tsx","file:///app/packages/libs/shared/src/apps/playlists/utils/PlaylistHelper.ts","file:///app/packages/libs/shared/src/components/back-button/BackButton.tsx","file:///app/packages/libs/shared/src/components/banner-header/banner-header.scss","file:///app/packages/libs/shared/src/components/banner-header/BannerHeader.tsx","file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/hooks/UseBatchFetch.ts","file:///app/packages/libs/shared/src/hooks/UseHandleObjectError.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteScroll.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteList.ts","file:///app/packages/libs/shared/src/hooks/useBreadcrumbs.ts","file:///app/packages/libs/shared/src/apps/playlists/components/playlist-header-details/PlaylistHeaderDetails.tsx","file:///app/packages/projects/lite/src/apps/playlists/components/playlist-header/partial-loading/partial-playlist-header.scss","file:///app/packages/projects/lite/src/apps/playlists/components/playlist-header/partial-loading/PartialPlaylistHeader.tsx","file:///app/packages/projects/lite/src/apps/playlists/components/playlist-header/PlaylistHeaderUtils.ts","file:///app/packages/projects/lite/src/apps/playlists/components/playlist-header/playlist-header.scss","file:///app/packages/projects/lite/src/apps/playlists/components/playlist-header/PlaylistHeader.tsx","file:///app/packages/projects/lite/src/apps/playlists/components/video-list/SortableVideoListContainer.tsx","file:///app/packages/projects/lite/src/apps/playlists/views/playlist/empty-state/PlaylistEmptyState.tsx","file:///app/packages/projects/lite/src/apps/playlists/views/playlist/PlaylistViewUtils.ts","file:///app/packages/projects/lite/src/apps/playlists/views/playlist/PlaylistView.tsx","file:///app/packages/libs/shared/src/hooks/UseReorderedItems.ts","file:///app/packages/projects/lite/src/apps/sign-up/components/soft-gate-banner/GateBanner.tsx","file:///app/packages/projects/lite/src/shared/components/hard-gate-empty-state/HardGateEmptyState.tsx","file:///app/packages/projects/lite/src/shared/hooks/useCommonVideoProps.ts","file:///app/packages/projects/lite/src/shared/hooks/useVideoMixin.ts"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"tag\":\"XRj8d\",\"tooltip\":\"X6mLk\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './coming-soon-tag.scss';\n\nconst namespace = 'specialEventCalendar.comingSoonTag';\n\ninterface ComingSoonProps {\n className?: string;\n onlyIcon?: boolean;\n}\n\nexport function ComingSoonTag(props: ComingSoonProps): JSX.Element {\n return (\n <Tooltip title={LanguageService.getPhrase(namespace, 'tooltip')} spanHackClassName={`d-block ${styles.tooltip}`} spanHack>\n <div className={`d-flex text-dark align-items-center ${styles.tag} ${props.className}`}>\n <SvgContainer svgName={cvSvgLibrary.Timer} />\n {!props.onlyIcon && LanguageService.getPhrase(namespace, 'comingSoon')}\n </div>\n </Tooltip>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"dateItem\":\"I3SBm\",\"label\":\"PRORs\",\"body\":\"RfiM_\",\"bodyDay\":\"ZOVny\",\"bodyRange\":\"vYhXN\",\"bodyMonth\":\"mYslO\",\"month\":\"EPkkQ\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { CalendarTheme } from 'libs/shared/apps/calendar/interfaces/CalendarTheme';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\n\nimport styles from './generic-calendar-date.scss';\n\nexport interface GenericCalendarDateProps {\n label?: string;\n body: {\n type: 'month' | 'range' | 'day';\n text: string;\n };\n month?: string;\n getAppLink?: () => Core.AppLink;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n className?: string;\n theme?: CalendarTheme;\n}\n\nexport function GenericCalendarDate(props: GenericCalendarDateProps): JSX.Element {\n function getBodyClass(): string {\n switch (props.body.type) {\n case 'range':\n return styles.bodyRange;\n case 'day':\n return styles.bodyDay;\n case 'month':\n return styles.bodyMonth;\n }\n }\n\n return (\n <AppLink\n appLink={props.getAppLink?.()}\n className={`text-decoration-none text-center bg-white text-dark border border-3 ${props.theme?.border} rounded-3 d-block fw-semibold ${props.className}`}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n >\n <div className={`position-relative ${styles.dateItem}`}>\n <div className={`${props.theme?.background} py-1 ${styles.label} d-flex align-items-center justify-content-center`}>\n {props.label ? props.label : <>&nbsp;</>}\n </div>\n <div className={`${getBodyClass()} ${styles.body} my-2`}>\n {props.body.text}\n </div>\n <div className={`mb-0 ${styles.month}`}>\n {props.month}\n </div>\n </div>\n </AppLink>\n );\n}","import { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { BaseObject, CurrentUser, Playlist } from 'libs/shared/interfaces';\n\nexport const PlaylistHelper = {\n isPlaylist(obj: BaseObject): obj is Playlist {\n return obj?.typeId === MasterType.Playlist;\n },\n\n isOwner(playlist: Playlist, currentUser: CurrentUser): boolean {\n if (!currentUser || !playlist || ObjectHelper.isEmpty(playlist._liteOwner))\n return false;\n\n return playlist._liteOwner.id.toString() === currentUser.id?.toString();\n },\n\n getVideoCount(playlist: Playlist): number {\n if (!playlist)\n return;\n\n let count = 0;\n\n if (playlist.videos?.count)\n count += playlist.videos.count;\n\n if (playlist.clips?.count)\n count += playlist.clips.count;\n\n if (playlist.interactives?.count)\n count += playlist.interactives.count;\n\n return count;\n }\n};","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 { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.backButton';\n\ninterface BackButtonProps {\n appLink: Core.AppLink;\n backToName?: string;\n color?: 'black' | 'white';\n extraClasses?: string;\n /**\n * Whether or not the button text has a text shadow. Defaults to true\n */\n textShadow?: boolean;\n}\n\nBackButton.defaultProps = {\n color: 'black',\n extraClasses: ''\n};\n\nexport function BackButton(props: BackButtonProps): React.ReactElement {\n const { backToName, appLink, color, extraClasses, textShadow } = {\n textShadow: true,\n ...props\n };\n\n const backPhrase = backToName\n ? LanguageService.getPhrase(namespace, 'backTo', { backToName })\n : LanguageService.getPhrase(namespace, 'back');\n\n const colorClass = color === 'black' ? '' : 'text-white';\n const textShadowClass = textShadow ? 'text-shadow' : '';\n\n return (\n <AppLink\n appLink={appLink}\n className={`d-inline-flex align-items-center h5 mb-0 ${extraClasses} ${colorClass} ${textShadowClass}`}\n >\n <SvgContainer svgName={cvSvgLibrary.ChevronLeft} size={SvgContainerSize.Medium} />\n <span className='ms-1'>{backPhrase}</span>\n </AppLink>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"bannerContent\":\"sSCTB\",\"actionsContainer\":\"Z5WI2\",\"bannerContentWithLogo\":\"rgs7Q\",\"container\":\"M51HJ\",\"logoContainer\":\"vkeJk\",\"logoContainerLeft\":\"M3U9B\",\"logoHeading\":\"EtRwC\",\"specialEventContainer\":\"rOxDc\",\"headingLarge\":\"_8pnV\",\"heading\":\"JXVBH\"};","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\nimport { PortalHelper } from 'libs/common/react/utils/PortalHelper';\n\nimport { ComingSoonTag } from 'libs/shared/apps/calendar/components/coming-soon-tag/ComingSoonTag';\nimport { GenericCalendarDate } from 'libs/shared/apps/calendar/components/generic-calendar-date/GenericCalendarDate';\nimport { CalendarTheme } from 'libs/shared/apps/calendar/interfaces/CalendarTheme';\nimport { ActionOptions, Actions } from 'libs/shared/components/actions/Actions';\nimport { BackButton } from 'libs/shared/components/back-button/BackButton';\nimport { LazyImage } from 'libs/shared/components/lazy-image/LazyImage';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { ImageMinDimensions } from 'libs/shared/constants/ImageSizes';\nimport { BannerPortalContext } from 'libs/shared/context/BannerPortalContext';\nimport { ImageSize, ImageType, ResizeType } from 'libs/shared/enums/Images';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Banner, CalendarEvent, Logo } from 'libs/shared/interfaces';\nimport { getBgColorClass } from 'libs/shared/utils/getBgColorClass';\nimport { ImageHelper, ImageOptions } from 'libs/shared/utils/ImageHelper';\n\nimport styles from './banner-header.scss';\n\nconst RATIO = `${ImageMinDimensions[ImageType.Banners].width}:${ImageMinDimensions[ImageType.Banners].height}`;\nconst DEFAULT_WIDTH = 1200; // This is ImageSize.Large for a Banner.\nconst LARGE_SCREEN_WIDTH = 1920;\n\nfunction useGetImageWidth(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xxl)\n return LARGE_SCREEN_WIDTH;\n\n return DEFAULT_WIDTH;\n}\n\nfunction getSizeClass(heading: string): string {\n if (heading.length < 160)\n return 'h1';\n\n return styles.headingLarge;\n}\n\ninterface BannerHeaderProps {\n heading: string;\n banner?: Banner;\n bannerClassName?: string;\n imageCdnUrl?: string;\n logo?: Logo;\n logoBgColour?: string;\n actions?: ActionOptions[];\n specialEvent?: CalendarEvent;\n backButtonAppLink?: Core.AppLink;\n backButtonText?: string;\n backButtonClasses?: string;\n sortComponent?: JSX.Element;\n blockColourClass?: string;\n actionsDropdownClassName?: string;\n detailsComponent?: () => React.ReactElement;\n imageOptions?: ImageOptions;\n showComingSoon?: boolean;\n alignLogoLeft?: boolean;\n calendarTheme?: CalendarTheme;\n}\n\nconst namespace = 'shared.bannerHeader';\n\nexport const BannerHeader = React.memo(function(props: React.PropsWithChildren<BannerHeaderProps>): React.ReactElement {\n const { heading, banner, imageCdnUrl, actions, sortComponent, blockColourClass, specialEvent } = props;\n\n const portalContainerContext = React.useContext(BannerPortalContext);\n\n const imageWidth = useGetImageWidth();\n\n const specialEventIsToday = React.useMemo(() => {\n if (!specialEvent || props.showComingSoon)\n return false;\n\n const today = DateHelper.format(new Date(), 'YYYY-MM-DD');\n\n if (!specialEvent.endDate)\n return specialEvent.startDate === today;\n\n return specialEvent.startDate <= today && specialEvent.endDate >= today;\n }, [specialEvent]);\n\n function getSpecialEventMonthText(specialEvent: CalendarEvent): string {\n if (!specialEvent.endDate)\n return DateHelper.format(specialEvent.startDate, 'MMMM');\n\n if (DateHelper.isSame(specialEvent.startDate, specialEvent.endDate, 'month'))\n return DateHelper.format(specialEvent.startDate, 'MMMM');\n\n return `${DateHelper.format(specialEvent.startDate, 'MMM')} - ${DateHelper.format(specialEvent.endDate, 'MMM')}`;\n }\n\n const imageOptions = props.imageOptions || {\n width: imageWidth,\n ratio: RATIO,\n resizeType: ResizeType.Cover\n };\n\n const url = !!banner && !!imageCdnUrl && ImageHelper.createBannerUrl(banner, {\n fallbackBaseUrl: imageCdnUrl,\n fallbackCategoryName: heading,\n type: ImageType.Banners\n }, imageOptions);\n\n const containerProps: React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement> = {\n className: `banner banner-header ${props.bannerClassName}`,\n style: url ? { backgroundImage: `url('${url}')` } : {}\n };\n\n if (!banner && blockColourClass) {\n delete containerProps.style;\n containerProps.className += ` ${blockColourClass}`;\n }\n\n const DetailsComponent = props.detailsComponent;\n\n const logoFallbackBgClassName = getBgColorClass(props.heading, BG_COLOUR_CLASS_NAMES);\n\n return PortalHelper.renderInPortalIfExists(\n // \"banner\" is used in playlists in Online. banner-header is used by all other projects\n <header {...containerProps}>\n <div className={`container ${styles.container} position-relative inner-banner`}>\n {props.backButtonAppLink && (\n <div className='pt-3'>\n <BackButton\n appLink={props.backButtonAppLink}\n backToName={props.backButtonText}\n extraClasses={props.backButtonClasses}\n color='white'\n />\n </div>\n )}\n \n <div className={`${props.alignLogoLeft ? 'position-absolute top-50 start-0 translate-middle-y w-100 ps-4' : `${styles.bannerContent} px-2 ${props.logo?.url ? styles.bannerContentWithLogo : ''}`}`}>\n {!!specialEvent && (\n <div className={`position-relative ${styles.specialEventContainer}`}>\n <GenericCalendarDate\n body={{\n type: specialEvent.endDate ? 'range' : 'day',\n text: specialEvent.endDate\n ? `${DateHelper.format(specialEvent.startDate, 'DD')}-${DateHelper.format(specialEvent.endDate, 'DD')}`\n : DateHelper.format(specialEvent.startDate, 'DD')\n }}\n month={getSpecialEventMonthText(specialEvent)}\n theme={props.calendarTheme}\n />\n </div>\n )}\n <div>\n {specialEventIsToday && (\n <div className='rounded-pill py-1 px-2 my-1 me-1 fw-semibold bg-light-blue lh-1 d-inline-block'>\n <Text namespace={namespace} phrase='onToday' />\n </div>\n )}\n {props.showComingSoon && (\n <ComingSoonTag className='pe-2 fw-semibold mb-1 rounded-pill justify-content-start text-nowrap' />\n )}\n <div className='d-flex align-items-center'>\n {props.alignLogoLeft && props.logo?.url &&\n <div className={`${styles.logoContainerLeft} d-none d-md-block rounded-circle overflow-hidden me-3 ${logoFallbackBgClassName}`}>\n <LazyImage\n src={ImageHelper.createUrl(props.logo?.url, { size: ImageSize.Medium })}\n style={{ backgroundColor: props.logoBgColour }}\n />\n </div>\n }\n <h1 className={`text-white text-shadow pe-3 position-static ${styles.heading} ${getSizeClass(heading)} ${props.alignLogoLeft ? 'w-50' : ''}`}>\n {heading}\n {DetailsComponent && <DetailsComponent />}\n </h1>\n </div>\n </div>\n {!!actions && (\n <div className={styles.actionsContainer}>\n <Actions\n actions={actions}\n sortComponent={sortComponent}\n actionsDropdownClassName={props.actionsDropdownClassName}\n />\n </div>\n )}\n </div>\n {!props.alignLogoLeft && !!props.logo?.url &&\n <div className={styles.logoContainer}>\n <img\n src={ImageHelper.createUrl(props.logo.url, { size: ImageSize.Medium })}\n className='rounded-circle'\n />\n </div>\n }\n </div>\n </header>,\n portalContainerContext?.container\n );\n}, (prevProps, nextProps): boolean => (\n prevProps.actions === nextProps.actions\n && prevProps.heading === nextProps.heading\n && prevProps.logo?.url === nextProps.logo?.url\n));\n\nexport function PartialBannerHeader(): JSX.Element {\n const portalContainerContext = React.useContext(BannerPortalContext);\n\n return PortalHelper.renderInPortalIfExists(\n <div className={`partial-banner partial-loading-background ${styles.banner}`} />,\n portalContainerContext?.container\n );\n}","import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n internalServerError?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError,\n internalServerError: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.InternalServer) {\n if (!ignoreMap.internalServerError)\n Core.ErrorHelper.throw(new UnspecifiedError());\n return;\n }\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import React from 'react';\n\nimport { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { BaseObject } from 'libs/shared/interfaces';\n\nconst CHUNK_SIZE = 50;\n\nexport interface UseBatchFetchResult<T extends BaseObject> {\n itemsArr: T[];\n items: { [key: string]: T} | null;\n isFetching: boolean;\n hasCompleted: boolean;\n}\n\n/**\n * Used to fetch multiple items by id with Flight. Will fetch 25 items at a time firing off multiple\n * requests if there are more than 25 items.\n * This will return items as null until we have all our items. Items will be returned as an object with\n * their ids as they key for easy mapping\n * \n * @param itemIds \n * @param getRequest \n */\nexport function useBatchFetch<T extends BaseObject>(\n itemIds: string[],\n getRequest: (ids: string[]) => Flight.Request\n): UseBatchFetchResult<T> {\n const chunks = ArrayHelper.chunk<string>(itemIds, CHUNK_SIZE);\n\n const requests = chunks.map(chunk => getRequest(ArrayHelper.uniq(chunk)));\n\n const responses = Flight.useBasicFetchAll<T[]>(requests);\n\n const itemsArr = ArrayHelper.flatten(responses.data);\n const items = responses.data.length\n ? itemsArr.reduce((acc, item) => ({ ...acc, [item.id]: item }), {})\n : null;\n\n return {\n itemsArr,\n items,\n isFetching: responses.isFetching,\n hasCompleted: responses.hasCompleted\n };\n}\n\n/**\n * When you need the useBatchFetch() behavior, but your list of objects to hydrate\n * will grow, such as on a scrolling page. useGrowingBatchFetch() will use local state\n * to determine what we've already built a request for and what items are new\n * as to not re-fetch items - Sha\n */\nexport function useGrowingBatchFetch<TResponse, TObjects = string>(\n objs: TObjects[],\n getRequest: (items: TObjects[]) => Flight.Request,\n _getKey?: (obj: TObjects) => string\n) {\n const getKey = _getKey ?? ((obj: any) => {\n if (typeof obj === 'object')\n return obj.id;\n\n return obj;\n });\n\n const { fetchItems, ...data } = useGrowingBatchFetchFunc<TResponse, TObjects>({ getRequest, _getKey });\n\n React.useEffect(() => {\n if (!objs?.length)\n return;\n\n fetchItems(objs);\n }, [objs?.map(getKey).join(',')]);\n\n return data;\n}\n\ninterface UseGrowingBatchFetchFuncOptions<TObjects> {\n getRequest: (items: TObjects[]) => Flight.Request;\n _getKey?: (obj: TObjects) => string;\n}\n\n/**\n * When you need the useGrowingBatchFetch() behaviour, but need to trigger the\n * fetch manually and update the objects - Nish \n */\nexport function useGrowingBatchFetchFunc<TResponse, TObjects = string>(\n options: UseGrowingBatchFetchFuncOptions<TObjects>\n) {\n const getKey = options._getKey ?? ((obj: any) => {\n if (typeof obj === 'object')\n return obj.id;\n\n return obj;\n });\n\n const fetchedItems = React.useRef<Set<string>>(new Set<string>());\n const [ requests, setRequests ] = React.useState<Flight.Request[]>([]);\n\n function fetchItems(objs: TObjects[]) {\n if (!objs?.length)\n return;\n\n const unfetchedItems: TObjects[] = [];\n \n objs.forEach(obj => {\n const key = getKey(obj);\n\n if (fetchedItems.current.has(key))\n return;\n\n unfetchedItems.push(obj);\n fetchedItems.current.add(key);\n });\n \n if (!unfetchedItems.length)\n return;\n \n setRequests(r => ([ ...r, ...ArrayHelper.chunk<TObjects>(unfetchedItems, CHUNK_SIZE).map(options.getRequest) ]));\n }\n\n const responses = Flight.useBasicFetchAll<TResponse[]>(requests);\n const itemsArr = ArrayHelper.flatten(responses.data);\n const items = responses.data.length\n ? itemsArr.reduce<Record<string, TResponse>>((acc, item) => ({ ...acc, [getKey(item)]: item }), {})\n : null;\n\n return {\n hasFirstRequestCompleted: !!responses.responses?.[0]?.hasCompleted,\n itemsArr,\n items,\n isFetching: responses.isFetching,\n fetchItems\n };\n}\n","import { useEffect } from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { handleHttpError, HttpErrorMap, IgnoreHttpErrorMap } from 'libs/shared/errors/handlers/HttpErrorHandlers';\n\nfunction generateCacheKey(flightObjs: Array<Flight.Response<any>>): string {\n return flightObjs.map(obj => obj.statusCode).join(':');\n}\n\n// TODO: Change this to just `useHandleHttpError` and only accept a status code.\nexport function useHandleObjectError(\n _flightObjs: Flight.Response<any> | Array<Flight.Response<any>>,\n customErrors?: HttpErrorMap,\n ignoreErrors?: IgnoreHttpErrorMap\n): void {\n const flightObjs = Array.isArray(_flightObjs) ? _flightObjs : [_flightObjs];\n\n useEffect(() => {\n flightObjs.forEach(obj => {\n handleHttpError(obj.statusCode, customErrors, ignoreErrors);\n });\n }, [ generateCacheKey(flightObjs), customErrors, ignoreErrors ]);\n}","import { useEffect } from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst SCROLL_TOLERANCE = 400; // value in px\n\ninterface UseInfiniteScrollOptions {\n fetchNextPage: () => void;\n hasMore: boolean;\n isFetching: boolean;\n scrollContainer?: HTMLElement;\n}\n\nexport function useInfiniteScroll(options: UseInfiniteScrollOptions): void {\n const handleScroll = (): void => {\n if (options.isFetching)\n return;\n\n if (!options.scrollContainer) {\n const currentScrollHeight = window.innerHeight + document.documentElement.scrollTop;\n \n const totalHeight = document.documentElement.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n } else {\n const { scrollContainer } = options;\n const currentScrollHeight = scrollContainer.getBoundingClientRect().height + scrollContainer.scrollTop;\n \n const totalHeight = scrollContainer.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n }\n\n options.fetchNextPage();\n };\n\n useEffect(() => {\n const onScroll = FunctionHelper.throttle(handleScroll, 200);\n\n const scrollContainer = options.scrollContainer || window;\n\n if (options.hasMore)\n scrollContainer.addEventListener('scroll', onScroll);\n\n return () => scrollContainer.removeEventListener('scroll', onScroll);\n }, [ options.hasMore, options.fetchNextPage, options.scrollContainer ]);\n}","import { useEffect, useState } from 'react';\n\nimport { HttpStatus, HttpStatusClass } from 'libs/common/backbone/enums/HttpStatus';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { BaseObject, BasePaginatedCollection } from 'libs/shared/interfaces';\n\nimport { useInfiniteScroll } from './UseInfiniteScroll';\nimport { useSelectAllPages } from './UseSelectAllPages';\n\nexport interface UseInfiniteListResult<T extends BaseObject> {\n items: T[];\n hasMore: boolean;\n isFetching: boolean;\n nextCursor: string;\n totalItems?: number;\n hasFirstPageCompleted: boolean;\n}\n\n/**\n * Hook to extract an infinite list from the application state,\n * save it locally in state and only update when new data\n * is fetched.\n * \n * @param getRequest - callback function to get the request for each page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n * \n * @param fetchNext - callback function to fetch a page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n */\nexport function useInfiniteList<TObject = BaseObject, TResponse = BasePaginatedCollection<TObject>>(\n getRequest: ((cursor?: string) => Flight.Request) | false,\n fetchNext: ((cursor?: string) => void) | false,\n onError?: (pageNumber: number, statusCode: HttpStatus) => void,\n getItems?: (responseData: TResponse) => TObject[],\n getCursor?: (responseData: TResponse) => string,\n scrollContainer?: HTMLElement\n): UseInfiniteListResult<TObject> {\n const [ pagesFetched, setPagesFetched ] = useState(0);\n\n const fetchNextFn = fetchNext as (cursor?: string) => void;\n\n function getKey(cursor?: string): string {\n if (!getRequest)\n return null;\n\n const request = getRequest(cursor);\n\n if (!request)\n return null;\n\n return request.key;\n }\n\n const response = useSelectAllPages<TObject, TResponse>(\n getKey,\n getItems,\n getCursor\n );\n\n function fetchNextPage(): void {\n if (!fetchNext || !getRequest || !response)\n return;\n\n setPagesFetched(currentVal => currentVal + 1);\n return fetchNextFn(response.nextCursor);\n }\n\n useInfiniteScroll({\n fetchNextPage,\n hasMore: !!response?.nextCursor,\n isFetching: response?.isFetching,\n scrollContainer\n });\n\n useEffect(() => {\n if (!response)\n return;\n\n if (response.shouldInitialFetch && fetchNext) {\n fetchNextFn();\n setPagesFetched(currentVal => currentVal + 1);\n }\n }, [ response?.shouldInitialFetch, fetchNext ]);\n\n useEffect(() => {\n if (!response?.statusCode || !FunctionHelper.isFunction(onError))\n return;\n\n const httpStatusClass: HttpStatusClass = +(response.statusCode?.toString()?.substr(0, 1));\n\n if (httpStatusClass !== HttpStatusClass.ClientError && httpStatusClass !== HttpStatusClass.ServerError)\n return;\n\n onError(pagesFetched, response.statusCode);\n }, [response?.statusCode]);\n\n return {\n items: response?.items,\n hasMore: !!response?.nextCursor,\n nextCursor: response?.nextCursor,\n isFetching: response?.isFetching,\n totalItems: response?.totalItems,\n hasFirstPageCompleted: response?.hasFirstPageCompleted\n };\n}","import React from 'react';\n\nimport { Breadcrumb } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { BreadcrumbService } from 'libs/shared/services/BreadcrumbService';\n\nexport function useBreadcrumbs(current: Breadcrumb): Breadcrumb[] {\n const [ match, useBuilder ] = React.useMemo(() => BreadcrumbService.getBuilder(), []);\n\n const breadcrumbs = useBuilder(match);\n\n if (!breadcrumbs || !current)\n return breadcrumbs;\n\n return [ ...breadcrumbs, { ...current, active: true }];\n}\n\n","import React from 'react';\n\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { PlaylistHelper } from 'libs/shared/apps/playlists/utils/PlaylistHelper';\nimport { ClickViewAvatar } from 'libs/shared/components/clickview-avatar/ClickViewAvatar';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { CurrentUser, Playlist } from 'libs/shared/interfaces';\n\nconst namespace = 'playlists.playlistHeaderDetails';\n\nconst Separator = ({ className }: { className: string }) =>\n <span className={className}>&bull;</span>;\n\nfunction getPlaylistOwnerName(playlist: Playlist): string {\n const { _liteOwner } = playlist;\n\n if (!_liteOwner)\n return;\n\n if (_liteOwner.name && _liteOwner.surname)\n return TextHelper.toTitleCase(_liteOwner.name + ' ' + _liteOwner.surname.substring(0, 1));\n\n if (_liteOwner.name)\n return _liteOwner.name.split(' ')[0];\n}\n\nfunction getLastUpdated(playlist: Playlist): string {\n if (!playlist.contentModifiedDate)\n return '';\n\n const now = new Date();\n const lastUpdated = DateHelper.convertUTCToLocal(playlist.contentModifiedDate);\n\n // Don't show if last updated over a month ago\n if (DateHelper.isBefore(lastUpdated, DateHelper.subtract(now, 1, 'month')))\n return '';\n\n return DateHelper.fromNow(lastUpdated);\n}\n\ninterface PlaylistHeaderDetailsProps {\n playlist: Playlist;\n currentUser: CurrentUser;\n totalVideos: number;\n \n hideOwnerName?: boolean;\n\n // Custom classes for everything as online and lite use different styles\n detailsClassName: string;\n clickViewAvatarClassName: string;\n separatorClassName: string;\n}\n\nexport function PlaylistHeaderDetails(props: PlaylistHeaderDetailsProps): React.ReactElement {\n const currentUserIsOwner = PlaylistHelper.isOwner(props.playlist, props.currentUser);\n\n const followerCount = props.playlist.followers?.count;\n\n const lastUpdated = getLastUpdated(props.playlist);\n\n return (\n <div className={props.detailsClassName}>\n {/* Owner name */}\n {(!props.hideOwnerName && !currentUserIsOwner) && (\n <>\n {props.playlist._isClickViewCurated?.value ? (\n <>\n <div className={props.clickViewAvatarClassName}>\n <ClickViewAvatar />\n </div>\n <span>ClickView</span>\n </>\n ) : (\n <Text namespace={namespace} phrase='createdBy' options={{ user: getPlaylistOwnerName(props.playlist) }} />\n )}\n\n <Separator className={props.separatorClassName} />\n </>\n )}\n\n {/* Video count */}\n {typeof props.totalVideos === 'number' && (\n <Text namespace={namespace} phrase='videos' options={{ smartCount: props.totalVideos }} />\n )}\n\n {/* Follower count */}\n {followerCount > 0 && (\n <>\n <Separator className={props.separatorClassName} />\n <Text namespace={namespace} phrase='followers' options={{ smartCount: followerCount }} />\n </>\n )}\n\n {/* Last updated */}\n {!!lastUpdated && (\n <>\n <Separator className={props.separatorClassName} />\n <Text namespace={namespace} phrase='lastUpdated' options={{ timeAgo: lastUpdated }} />\n </>\n )}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialDescription\":\"vDX0m\"};","import React from 'react';\n\nimport { PartialBannerHeader } from 'libs/shared/components/banner-header/BannerHeader';\n\nimport styles from './partial-playlist-header.scss';\n\nexport function PartialPlaylistHeader(): JSX.Element {\n return (\n <>\n <PartialBannerHeader />\n <div className='mb-2'>\n <div className={`partial-loading-background my-2 border-bottom ${styles.partialDescription}`} />\n </div>\n </>\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, EntityType, EventVersion, LocationContext, ToggleDescriptor, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { PlaylistHelper } from 'libs/shared/apps/playlists/utils/PlaylistHelper';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { getOpenInCurationStudioLabel } from 'libs/shared/hooks/useCurationStudio';\nimport { AssignHelper } from 'libs/shared/utils/AssignHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { AssignAppLinkHelper } from 'apps/assign/utils/AssignAppLinkHelper';\n\nimport { PlaylistHeaderProps } from './PlaylistHeader';\n\nconst namespace = 'playlists.playlistHeader';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface GetPlaylistActionsArgs {\n isAuthenticated: boolean;\n isPlugin: boolean;\n isMobile: boolean;\n setIsFollowing: (val: boolean) => void;\n isFollowing: boolean;\n setShowFollowSpinner: (val: boolean) => void;\n showFollowSpinner: boolean;\n isUserCurator: boolean;\n openInCuratorLink: string;\n hasShareFlowV2: boolean;\n isStudent: boolean;\n isGuest: boolean;\n}\n\nexport const PlaylistHeaderUtils = {\n getPlaylistActions(headerProps: PlaylistHeaderProps, args: GetPlaylistActionsArgs): ActionOptions[] {\n const {\n isAuthenticated,\n isPlugin,\n isMobile,\n setIsFollowing,\n isFollowing,\n setShowFollowSpinner,\n showFollowSpinner,\n isUserCurator,\n openInCuratorLink\n } = args;\n\n const analyticsData = {\n id: headerProps.playlist.id,\n name: headerProps.playlist.name,\n followerCount: headerProps.playlist.followers?.count,\n videoCount: headerProps.playlist.videos?.count,\n interactiveCount: headerProps.playlist.interactives?.count,\n clipCount: headerProps.playlist.clips?.count,\n isClickViewPlaylist: headerProps.playlist._isClickViewCurated?.value\n };\n\n const analyticsOptions: AnalyticsOptions = {\n location: LocationContext.Banner,\n entity: EntityType.Playlist,\n workflowPhase: WorkflowPhase.Start\n };\n\n const actions: ActionOptions[] = [];\n\n if (!isAuthenticated)\n return actions;\n\n if (args.isGuest)\n return actions;\n\n const isOwner = PlaylistHelper.isOwner(headerProps.playlist, headerProps.currentUser);\n const hideAssignButton = AssignHelper.hideAssignButtonOnVideoActions(headerProps.currentUser);\n const hasAssignActionButton = args.hasShareFlowV2 && !args.isStudent && !hideAssignButton;\n\n if (!isPlugin) {\n if (headerProps.playAllAppLink) {\n actions.push({\n label: getPhrase('playAll'),\n appLink: headerProps.playAllAppLink,\n svgName: cvSvgLibrary.Play,\n className: !isMobile ? 'btn btn-outline-dark me-2' : '',\n button: !isMobile,\n analyticsData,\n analyticsOptions: {\n ...analyticsOptions,\n actionType: UserAction.Play\n }\n });\n }\n\n if (hasAssignActionButton) {\n actions.push({\n label: getPhrase('assign'),\n appLink: AssignAppLinkHelper.flowSelector({\n entityType: 'playlist',\n objectId: headerProps.playlist.id\n }),\n svgName: cvSvgLibrary.Classrooms,\n className: !isMobile ? 'btn btn-outline-dark me-2' : '',\n button: !isMobile,\n analyticsData,\n analyticsOptions: {\n ...analyticsOptions,\n actionType: UserAction.Share,\n entity: EntityType.Assign\n }\n });\n }\n \n if (isUserCurator)\n actions.push({\n label: getOpenInCurationStudioLabel(),\n href: openInCuratorLink,\n openInNewTab: true\n });\n\n actions.push({\n label: !hasAssignActionButton && getPhrase('share'),\n tooltip: hasAssignActionButton && getPhrase('share'),\n appLink: {\n application: AppChannels.SHARE,\n action: Actions.Share.SHARE,\n args: [headerProps.playlist.id],\n params: { entityType: 'playlist' }\n },\n svgName: args.hasShareFlowV2 ? cvSvgLibrary.Link : cvSvgLibrary.Share,\n className: !isMobile ? 'btn btn-outline-dark me-2 align-self-stretch' : '',\n button: !isMobile,\n analyticsData,\n analyticsOptions: {\n ...analyticsOptions,\n actionType: UserAction.Share,\n eventVersion: EventVersion.V3\n }\n });\n }\n\n if (!isOwner) {\n actions.push({\n label: getPhrase(isFollowing ? 'following' : 'follow'),\n onClick: () => {\n setIsFollowing(!isFollowing);\n setShowFollowSpinner(true);\n headerProps.follow(\n !isFollowing,\n () => {\n setShowFollowSpinner(false);\n AnalyticsHelper.logUserAction(analyticsData, {\n ...analyticsOptions,\n actionType: UserAction.Follow,\n descriptor: isFollowing ? ToggleDescriptor.Off : ToggleDescriptor.On,\n workflowPhase: WorkflowPhase.Complete\n });\n },\n () => {\n setShowFollowSpinner(false);\n setIsFollowing(isFollowing);\n }\n );\n },\n svgName: isFollowing ? cvSvgLibrary.BellFilled : cvSvgLibrary.Bell,\n className: !isMobile\n ? `btn follow-btn btn-${isFollowing ? 'outline-dark' : 'dark'} me-2`\n : '',\n button: !isMobile,\n showSpinner: showFollowSpinner\n });\n }\n\n if (isOwner) {\n actions.push({\n label: getPhrase('edit'),\n appLink: {\n application: AppChannels.PLAYLISTS,\n action: Actions.Playlists.EDIT_PLAYLIST,\n args: [headerProps.playlist.id]\n },\n svgName: cvSvgLibrary.Edit,\n button: false,\n analyticsData,\n analyticsOptions: {\n ...analyticsOptions,\n actionType: UserAction.Edit\n }\n });\n\n actions.push({\n label: getPhrase('delete'),\n appLink: {\n application: AppChannels.PLAYLISTS,\n action: Actions.Playlists.DELETE_PLAYLIST,\n args: [headerProps.playlist.id]\n },\n svgName: cvSvgLibrary.Delete,\n className: 'text-danger',\n button: false,\n analyticsData,\n analyticsOptions: {\n ...analyticsOptions,\n actionType: UserAction.Delete\n }\n });\n }\n\n if (headerProps.playlist._isClickViewCurated?.value) {\n actions.push({\n label: getPhrase('copy'),\n appLink: {\n application: AppChannels.PLAYLISTS,\n action: Actions.Playlists.COPY_PLAYLIST,\n args: [headerProps.playlist.id]\n },\n button: false,\n analyticsData,\n analyticsOptions: {\n ...analyticsOptions,\n actionType: UserAction.Copy\n }\n });\n }\n\n return actions;\n }\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"clickViewAvatar\":\"PHe9c\"};","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { PlaylistHeaderDetails } from 'libs/shared/apps/playlists/components/playlist-header-details/PlaylistHeaderDetails';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { BannerHeader } from 'libs/shared/components/banner-header/BannerHeader';\nimport { Breadcrumb, Breadcrumbs, PartialBreadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Classification, CurrentUser, Playlist } from 'libs/shared/interfaces';\nimport { getBgColorClass } from 'libs/shared/utils/getBgColorClass';\n\nimport { usePluginHelper } from 'shared/hooks/use-plugin-helper/usePluginHelper';\n\nimport { GateBanner } from 'apps/sign-up/components/soft-gate-banner/GateBanner';\n\nimport { PartialPlaylistHeader } from './partial-loading/PartialPlaylistHeader';\nimport { PlaylistHeaderUtils } from './PlaylistHeaderUtils';\n\nimport styles from './playlist-header.scss';\n\nexport interface PlaylistHeaderProps {\n playlist: Playlist;\n currentUser: CurrentUser;\n isFollowing: boolean;\n follow: (shouldFollow: boolean, onSuccess: () => void, onError: () => void) => void;\n imageCdnUrl: string;\n showPartialLoading: boolean;\n playAllAppLink: Core.AppLink;\n isUserCurator: boolean;\n openInCuratorLink: string;\n\n // For breadcrumbs\n getBreadcrumbs: () => Breadcrumb[];\n topicPath: Classification[];\n moviesAndTv: boolean;\n classificationId: string;\n totalVideos: number;\n}\n\nexport function PlaylistHeader(props: PlaylistHeaderProps): JSX.Element {\n const { isPlugin } = usePluginHelper();\n const { hasPermissions, getGatedPermission } = usePermissions();\n const { hasShareFlowV2 } = useSettings(null);\n\n // Store isFollowing in local state so that it updates immediately.\n const [ isFollowing, setIsFollowing ] = React.useState(props.isFollowing);\n const [ showFollowSpinner, setShowFollowSpinner ] = React.useState(false);\n\n React.useEffect(() => setIsFollowing(props.isFollowing), [props.isFollowing]);\n\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n\n if (props.showPartialLoading)\n return <PartialPlaylistHeader />;\n\n const description = props.playlist.description;\n\n const actions: ActionOptions[] = PlaylistHeaderUtils.getPlaylistActions(props, {\n isAuthenticated: props.currentUser.isAuthenticated,\n isPlugin,\n isMobile,\n setIsFollowing,\n isFollowing,\n setShowFollowSpinner,\n showFollowSpinner,\n isUserCurator: props.isUserCurator,\n openInCuratorLink: props.openInCuratorLink,\n hasShareFlowV2,\n isStudent: hasPermissions(PermissionName.StudentExperience),\n isGuest: hasPermissions(PermissionName.GuestExperience)\n });\n\n const breadcrumbs = props.getBreadcrumbs();\n\n return (\n <>\n <BannerHeader\n heading={props.playlist.name}\n banner={props.playlist.banner}\n imageCdnUrl={props.imageCdnUrl}\n actions={actions.length && actions}\n actionsDropdownClassName='btn btn-outline-dark'\n blockColourClass={getBgColorClass(props.playlist.name, BG_COLOUR_CLASS_NAMES)}\n detailsComponent={() => (\n <PlaylistHeaderDetails\n playlist={props.playlist}\n currentUser={props.currentUser}\n detailsClassName='mb-n1 font-size-normal fw-normal mt-1'\n clickViewAvatarClassName={styles.clickViewAvatar}\n separatorClassName='mx-1'\n totalVideos={props.totalVideos}\n />\n )}\n />\n {(!!description || !!breadcrumbs?.length) && (\n <div className='border-bottom py-3'>\n {(() => {\n if (!props.playlist || (props.classificationId && !props.topicPath))\n return <PartialBreadcrumbs />;\n\n return (\n <div className='pb-2'>\n {getGatedPermission(PermissionName.CreatePlaylist) === 'soft-gate' && <GateBanner />}\n <Breadcrumbs breadcrumbs={breadcrumbs} />\n </div>\n );\n })()}\n {!!description && <p className='mb-0'>{description}</p>}\n </div>\n )}\n </>\n );\n}\n","import * as React from 'react';\nimport { DragEndEvent, DragStartEvent } from '@dnd-kit/core';\n\nimport { DevError } from 'libs/common/backbone/errors/DevError';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Core } from 'libs/common/core';\n\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { PartialVideoList } from 'libs/shared/components/video-list/partial-loading/PartialVideoList';\nimport { SortableVideoList, VideoList, VideoListProps } from 'libs/shared/components/video-list/VideoList';\nimport { YearGroup } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\ninterface SortableVideoListContainerProps extends VideoListProps {\n playlistId: string;\n yearGroups: YearGroup[];\n onSortComplete: (oldIdx: number, newIdx: number) => void;\n onSortStart?: (index: number) => void;\n canEdit?: boolean;\n showPartialLoading?: boolean;\n fetchRestrictions?: () => void;\n showSignIn?: boolean;\n}\n\nexport function SortableVideoListContainer(props: SortableVideoListContainerProps): React.ReactElement {\n const { onSortComplete, onSortStart, showPartialLoading, ...videoListProps } = props;\n\n const [ currentSortingIndex, setCurrentSortingIndex ] = React.useState<number>();\n\n const onSortStartHandler = (event: DragStartEvent) => {\n const index = props.videos.findIndex(v => v.id.toString() === event.active.id.toString());\n\n setCurrentSortingIndex(index);\n\n if (FunctionHelper.isFunction(onSortStart))\n onSortStart(index);\n };\n\n const onSortEnd = (event: DragEndEvent) => {\n setCurrentSortingIndex(null);\n\n const { active, over } = event;\n \n const oldIndex = props.videos.findIndex(v => v.id.toString() === active.id.toString());\n const newIndex = props.videos.findIndex(v => v.id.toString() === over.id.toString());\n\n if (!FunctionHelper.isFunction(onSortComplete)) {\n Core.ErrorHelper.throw(new DevError('An onSortComplete callback function must be passed to SortableVideoListComponent'));\n return;\n }\n \n onSortComplete(oldIndex, newIndex);\n };\n\n if (showPartialLoading)\n return <PartialVideoList withReordering={props.canEdit || props.showIndexes} />;\n\n if (!props.canEdit)\n return <VideoList {...videoListProps} />;\n\n return (\n <SortableVideoList\n {...videoListProps}\n currentSortingIndex={currentSortingIndex}\n onSortStart={onSortStartHandler}\n onSortEnd={onSortEnd}\n dragHandleIcon={cvSvgLibrary.Hamburger}\n dragHandleIconSize={SvgContainerSize.XXL}\n presentationAudiences={props.presentationAudiences}\n />\n );\n}","import React from 'react';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nconst namespace = 'playlists.playlistEmptyState';\n\nexport function PlaylistEmptyState(): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.Playlists.PLAYLIST_VIDEOS} />\n\n <EmptyState.Heading><Text phrase='heading' /></EmptyState.Heading>\n\n <EmptyState.Info><Text phrase='info' /></EmptyState.Info>\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AssocDescriptor, EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { PlaylistHelper } from 'libs/shared/apps/playlists/utils/PlaylistHelper';\nimport { VideoActionsOptions } from 'libs/shared/context/VideoActionsContext';\nimport { CurrentUser, Playlist, Video, VideoTypes } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { PlaylistNotFoundError } from 'shared/errors/playlists/playlist-not-found/LitePlaylistNotFoundError';\nimport { PlaylistPrivateError } from 'shared/errors/playlists/playlist-private/PlaylistPrivateError';\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\n\nconst getPhrase = LanguageService.encloseNamespace('playlists.playlist');\n\n/**\n * NOTE:\n * This will be wrong if we increase the playlist limit from 100, or\n * stop fetching all 100 videos at once.\n */\nexport function getLastUpdatedDate(videos: Video[]): string {\n const videoLastUpdatedDates: string[] = videos && videos.length && videos.map(v => v.dateAssociated);\n\n return (videoLastUpdatedDates && videoLastUpdatedDates.length)\n ? ArrayHelper.max<string, number>(videoLastUpdatedDates, (date: string) => new Date(date).getTime())\n : null;\n}\n\nexport function usePlaylistViewVideoActions(\n playlist: Playlist,\n currentUser: CurrentUser,\n shareId: string\n) {\n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem, shareId });\n\n if (!PlaylistHelper.isOwner(playlist, currentUser))\n return videoActions;\n\n const getVideoActions = (video: VideoTypes, options?: VideoActionsOptions) => {\n const { canConsume } = VideoHelper.getCanBeConsumed(video);\n\n const removeFromPlaylistAction = {\n label: getPhrase('removeFromPlaylist'),\n button: false,\n svgName: cvSvgLibrary.Delete,\n appLink: {\n application: AppChannels.PLAYLISTS,\n action: Actions.Playlists.REMOVE_VIDEO_FROM_PLAYLIST,\n args: [ video.id, playlist.id ],\n params: { typeId: video.typeId }\n },\n className: 'text-danger',\n analyticsOptions: {\n entity: EntityType.Video,\n actionType: UserAction.Dissociate,\n location: LocationContext.VideoListItem,\n workflowPhase: WorkflowPhase.Start,\n descriptor: AssocDescriptor.Playlist\n },\n analyticsData: {\n id: video.id,\n playlistId: playlist.id\n },\n group: 'delete'\n };\n\n if (!canConsume)\n return [removeFromPlaylistAction];\n\n return [ ...videoActions.getVideoActions(video, options), removeFromPlaylistAction ];\n };\n\n return {\n ...videoActions,\n getVideoActions\n };\n}\n\nexport function logSortAction(playlistId: string, videoId: string, workflowPhase: WorkflowPhase): void {\n AnalyticsHelper.logUserAction({ id: videoId, playlistId }, {\n location: LocationContext.VideoList,\n entity: EntityType.Video,\n actionType: UserAction.Move,\n workflowPhase\n });\n}\n\nexport const playlistErrors = {\n notFound: PlaylistNotFoundError,\n forbidden: {\n privacy: PlaylistPrivateError\n }\n};","import * as React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\n\nimport { LocationContext, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { PlaylistHelper } from 'libs/shared/apps/playlists/utils/PlaylistHelper';\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { RelatedVideosContext } from 'libs/shared/enums/RelatedVideosContext';\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { PlaylistRequests } from 'libs/shared/flight-requests/PlaylistRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useBreadcrumbs } from 'libs/shared/hooks/useBreadcrumbs';\nimport { useCurationStudio } from 'libs/shared/hooks/useCurationStudio';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { useInfiniteList } from 'libs/shared/hooks/UseInfiniteList';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useReorderedItems } from 'libs/shared/hooks/UseReorderedItems';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Classification, Config, Following, OnlineCurrentUser, Playlist, Presentation, PresentationAudience, VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\nimport { ReorderHelper } from 'libs/shared/utils/ReorderHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { HardGateEmptyState } from 'shared/components/hard-gate-empty-state/HardGateEmptyState';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { useCommonVideoProps } from 'shared/hooks/useCommonVideoProps';\nimport { useDeepLinks } from 'shared/hooks/useDeepLinks';\nimport { useVideoMixin } from 'shared/hooks/useVideoMixin';\nimport { InteractiveHelpers } from 'shared/utils/InteractiveHelper';\nimport { SeoHelper } from 'shared/utils/SeoHelper';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { PlaylistHeader } from 'apps/playlists/components/playlist-header/PlaylistHeader';\nimport { SortableVideoListContainer } from 'apps/playlists/components/video-list/SortableVideoListContainer';\n\nimport { PlaylistEmptyState } from './empty-state/PlaylistEmptyState';\nimport { logSortAction, playlistErrors, usePlaylistViewVideoActions } from './PlaylistViewUtils';\n\nconst namespace = 'playlists.playlist';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface PlaylistViewProps {\n playlistId: string;\n shareId?: string;\n classificationId?: string;\n moviesAndTv?: boolean;\n hideBreadCrumbs?: boolean;\n}\n\nexport function PlaylistView(props: PlaylistViewProps): React.ReactElement {\n const dispatch = useDispatch();\n const alerts = useAlerts();\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const currentUser = Flight.useBasicFetch<OnlineCurrentUser>(UserRequests.currentUser());\n const { isUserCurator, getOpenInCurationStudioLink } = useCurationStudio();\n const { hasPermissions, getGatedPermission } = usePermissions();\n\n const playlistGatedPermission = getGatedPermission(PermissionName.CreatePlaylist);\n\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const topicPath = Flight.useBasicFetch<Classification[]>(\n props.classificationId &&\n ClassificationRequests.path(props.classificationId)\n );\n\n const classification = Flight.useBasicFetch<Classification>(\n props.classificationId &&\n ClassificationRequests.classification(props.classificationId, currentUser.data?.id)\n );\n\n const classificationPresentation = Flight.useBasicFetch<Presentation>(\n classification.hasCompleted &&\n ClassificationRequests.presentationById(classification.data?.presentationId)\n );\n\n const shouldFetchAudiences = !currentUser.data?.isAuthenticated\n ? !!classificationPresentation.data?.id\n : !props.classificationId || classificationPresentation.hasCompleted;\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n shouldFetchAudiences &&\n AudienceRequests.presentationAudiences(classificationPresentation.data?.id)\n );\n\n const { commonVideoProps } = useCommonVideoProps({\n locationContext: LocationContext.VideoThumbnail,\n mtv: props.moviesAndTv,\n sharedPlaylist: !!props.shareId\n });\n\n const playlistRequest = props.shareId\n ? PlaylistRequests.getSharedPlaylist(props.playlistId, props.shareId)\n : PlaylistRequests.getPlaylist(props.playlistId);\n\n const playlistItemCountRequest = props.shareId\n ? PlaylistRequests.getSharedPlaylistVideosCount(props.playlistId, props.shareId)\n : PlaylistRequests.getPlaylistVideosCount(props.playlistId);\n\n const playlist = Flight.useBasicFetch<Playlist>(playlistRequest);\n const playlistWithCounts = Flight.useBasicFetch<Playlist>(playlistItemCountRequest);\n\n const getVideoItemActions = usePlaylistViewVideoActions(playlist.data, currentUser.data, props.shareId);\n\n useHandleObjectError(playlist, playlistErrors);\n\n const getVideosRequest = (cursor?: string) => {\n return props.shareId\n ? PlaylistRequests.getSharedPlaylistVideos(props.playlistId, props.shareId, cursor)\n : PlaylistRequests.getPlaylistVideos(props.playlistId, cursor);\n };\n\n const following = Flight.useBasicFetch<Following>(\n currentUser.data?.id &&\n PlaylistRequests.getIsFollowingPlaylist(props.playlistId, currentUser.data?.id)\n );\n\n const fetchNext = (cursor?: string) => {\n Flight.getFetch(dispatch)(getVideosRequest(cursor));\n };\n\n const { items: videos, hasMore, isFetching } = useInfiniteList<VideoTypes>(getVideosRequest, fetchNext);\n\n useVideoMixin(videos);\n\n // Locally stored array of videos used to immediately reflect changes in order.\n const [ reorderedVideos, setReorderedVideos ] = useReorderedItems(videos);\n\n useDeepLinks({ id: props.playlistId, app: 'playlists', shareId: props.shareId });\n useSetPageMetadata(PageMetadataHelper.getPlaylistMetadata({\n content: playlist.data,\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n },\n canonicalLink: SeoHelper.getCanonicalLink({ stripPresentationSlug: true }),\n allowIndexing: false\n }));\n\n const onSortStart = (index: number) => {\n const video = videos[index];\n\n if (video)\n logSortAction(props.playlistId, video.id, WorkflowPhase.Start);\n };\n\n const onSortComplete = (oldIdx: number, newIdx: number) => {\n if (oldIdx === newIdx)\n return;\n\n const video = videos[oldIdx];\n\n if (!video)\n return;\n\n const { reorderedItems, reorderRequest } = ReorderHelper.reorder(videos, oldIdx, newIdx);\n setReorderedVideos(reorderedItems);\n\n logSortAction(props.playlistId, video.id, WorkflowPhase.Complete);\n\n const onError = () => {\n setReorderedVideos(null);\n };\n\n Flight.fetch(dispatch, PlaylistRequests.reorderVideos(props.playlistId, reorderRequest, null, onError));\n };\n\n const follow = (shouldFollow: boolean, onSuccess: () => void, onError: () => void) => {\n const req = shouldFollow\n ? PlaylistRequests.followPlaylist\n : PlaylistRequests.unfollowPlaylist;\n\n const error = () => {\n onError();\n alerts.error(getPhrase(shouldFollow ? 'followError' : 'unfollowError'));\n };\n\n Flight.fetch(dispatch, req(props.playlistId, currentUser.data?.id, onSuccess, error));\n };\n\n const playlistIsEmpty = !!videos && videos.length === 0;\n\n const getVideoAppLink = (\n video: VideoTypes,\n playNext: boolean,\n options: GetVideoAppLinkOptions = {}\n ) => {\n return VideoAppLinkHelper.getAppLink(video, {\n ...options,\n contextId: props.playlistId,\n context: RelatedVideosContext.Playlist,\n shareId: props.shareId,\n moviesAndTv: props.moviesAndTv,\n playNext,\n includeContext: currentUser.data?.isAuthenticated || !!props.shareId\n });\n };\n\n const isFollowingComplete = !currentUser.data?.isAuthenticated || !!following.hasCompleted;\n\n // The play all applink should start from the first consumable video\n const firstPlayAllVideo = videos?.find(v => VideoHelper.getCanBeConsumed(v)?.canConsume);\n const canEdit = PlaylistHelper.isOwner(playlist.data, currentUser.data);\n\n const videoDataLoaded = (\n videos && currentUser.data && config.data\n );\n\n const getSignInAppLink = (appLink: Core.AppLink): Core.AppLink => {\n const redirectUrl = Core.AppLinkHelper.getHref(appLink);\n const params = redirectUrl !== '/' ? { redirectUrl } : {};\n \n return {\n application: AppChannels.DEFAULT,\n action: Actions.Default.CHALLENGE,\n params\n };\n };\n\n const breadcrumbs = useBreadcrumbs({ name: playlist.data?.name });\n\n if (playlistGatedPermission === 'hard-gate') {\n return (\n <div className='bg-white px-3'>\n <HardGateEmptyState feature='playlists' />\n </div>\n );\n }\n\n return (\n <VideoActionsContext.Provider value={currentUser.data?.isAuthenticated && getVideoItemActions}>\n <div className='bg-white px-3'>\n <PlaylistHeader\n playlist={playlist.data}\n currentUser={currentUser.data}\n isFollowing={following.data?.isFollowing}\n follow={follow}\n playAllAppLink={firstPlayAllVideo && getVideoAppLink(firstPlayAllVideo, true)}\n showPartialLoading={!playlist.data || !videoDataLoaded || !isFollowingComplete}\n imageCdnUrl={!!config.data && config.data.imageCdnUrl}\n getBreadcrumbs={() => props.hideBreadCrumbs ? null : breadcrumbs}\n topicPath={topicPath.data}\n moviesAndTv={props.moviesAndTv}\n classificationId={props.classificationId}\n isUserCurator={isUserCurator}\n openInCuratorLink={getOpenInCurationStudioLink(playlist.data?.typeId, playlist.data?.id)}\n totalVideos={PlaylistHelper.getVideoCount(playlistWithCounts.data)}\n />\n <div className='mt-2'>\n {!playlistIsEmpty\n ? (\n <SortableVideoListContainer\n videos={reorderedVideos || videos}\n yearGroups={yearGroups.data}\n playlistId={!!playlist.data && playlist.data.id}\n onSortStart={onSortStart}\n onSortComplete={onSortComplete}\n canEdit={canEdit}\n showPartialLoading={!videoDataLoaded}\n getVideoAppLink={(v, opts) => getVideoAppLink(v, false, opts)}\n showSignIn={!currentUser.data?.isAuthenticated}\n getSignInAppLink={getSignInAppLink}\n canRemovePrivateVideos={canEdit}\n presentationAudiences={props.moviesAndTv ? null : audiences.data}\n showIndexes={true}\n hasPermissions={hasPermissions}\n getPreviewQuestionsAppLink={interactive => InteractiveHelpers.getPreviewQuestionsAppLink(interactive)}\n commonVideoProps={commonVideoProps}\n />\n ) : <PlaylistEmptyState />\n }\n </div>\n {(hasMore || isFetching) && <InfiniteScrollFooter isFetching={isFetching} fetchNext={fetchNext} />}\n </div>\n </VideoActionsContext.Provider>\n );\n}\n","import { useEffect, useState } from 'react';\n\nimport { BaseObject } from 'libs/shared/interfaces';\n\nfunction isOrderEqual(arr1: BaseObject[], arr2: BaseObject[]): boolean {\n let isEqual = true;\n\n if (arr1.length !== arr2.length)\n return false;\n\n for (let i = 0; i < arr1.length; i++) {\n if (arr1[i].id !== arr2[i].id) {\n isEqual = false;\n break;\n }\n }\n\n return isEqual;\n}\n\n/**\n * This function can be used to temporarily store an array of reordered objects\n * until the array obtained from the application store updates to the new order.\n * \n * @param items array of objects from application store.\n */\nexport function useReorderedItems<T extends BaseObject>(\n items: T[]\n): [ T[], React.Dispatch<React.SetStateAction<T[]>> ] {\n const [ reorderedItems, setReorderedItems ] = useState<T[]>();\n\n useEffect(() => {\n if (!reorderedItems)\n return;\n\n if (items.length !== reorderedItems.length || isOrderEqual(items, reorderedItems))\n setReorderedItems(null);\n }, [items]);\n\n return [ reorderedItems, setReorderedItems ];\n}","import React from 'react';\n\nimport { EntityType, LocationContext, SignUpDescriptors, UserAction } from 'libs/analytics/interfaces';\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 { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'signUp.gateBanner';\n\nexport function GateBanner(): JSX.Element {\n return (\n <div role='alert' className='bg-light-indigo text-indigo rounded p-2 mb-4 d-flex align-items-center'>\n <SvgContainer svgName={cvSvgLibrary.StarOutline} size={SvgContainerSize.Large} />\n <Text namespace={namespace} phrase='softGate' />&nbsp;\n <AppLink\n appLink={{\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.PREMIUM_FEATURES\n }}\n className='indigo-link text-indigo text-underline d-inline'\n analyticsData={{}}\n analyticsOptions={{\n actionType: UserAction.Click,\n location: LocationContext.GatedBanner,\n entity: EntityType.AppLink,\n descriptor: SignUpDescriptors.PremiumFeatures\n }}\n >\n <Text namespace={namespace} phrase='learnMore' />\n </AppLink>\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType, LocationContext, SignUpDescriptors, UserAction } from 'libs/analytics/interfaces';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'shared.hardGateEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ntype Feature = 'insights' | 'my-videos' | 'playlists' | 'clip';\n\ninterface FeatureConfig {\n headingPhrase: string;\n descriptionPhrase: string;\n ctaPhrase: string;\n imageUrl: string;\n}\n\nconst featureConfigMap: Record<Feature, FeatureConfig> = {\n 'insights': {\n headingPhrase: 'insightsHeading',\n descriptionPhrase: 'insightsDescription',\n ctaPhrase: 'insightsCta',\n imageUrl: ImageUrls.ReverseTrial.INTERACTIVE\n },\n 'my-videos': {\n headingPhrase: 'myVideosHeading',\n descriptionPhrase: 'myVideosDescription',\n ctaPhrase: 'myVideosCta',\n imageUrl: ImageUrls.EmptyStates.MY_VIDEOS_PUBLIC\n },\n 'playlists': {\n headingPhrase: 'playlistsHeading',\n descriptionPhrase: 'playlistsDescription',\n ctaPhrase: 'playlistsCta',\n imageUrl: ImageUrls.EmptyStates.Playlists.PLAYLISTS_PUBLIC\n },\n 'clip': {\n headingPhrase: 'clipHeading',\n descriptionPhrase: 'clipDescription',\n ctaPhrase: 'clipCta',\n imageUrl: ImageUrls.ReverseTrial.CLIP\n }\n};\n\ninterface HardGateEmptyStateProps {\n feature: Feature;\n extraCta?: React.ReactNode;\n}\n\nexport function HardGateEmptyState(props: HardGateEmptyStateProps) {\n const config = featureConfigMap[props.feature];\n\n return (\n <EmptyState>\n <EmptyState.Image src={config.imageUrl} />\n <EmptyState.Heading>\n <Text namespace={namespace} phrase={config.headingPhrase} />\n </EmptyState.Heading>\n <EmptyState.Info className='w-75'>\n <Text namespace={namespace} phrase={config.descriptionPhrase} />&nbsp;\n </EmptyState.Info>\n <EmptyState.Cta\n text={getPhrase(config.ctaPhrase)}\n appLink={{\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.PREMIUM_FEATURES\n }}\n analyticsData={{}}\n analyticsOptions={{\n actionType: UserAction.Click,\n location: LocationContext.GatedEmptyState,\n entity: EntityType.AppLink,\n descriptor: SignUpDescriptors.PremiumFeatures\n }}\n className='btn btn-dark mb-3'\n />\n {props.extraCta}\n </EmptyState>\n );\n}\n\n","import { Core } from 'libs/common/backbone/index';\nimport { Flight } from 'libs/common/react/index';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, CurrentUser, VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\n\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { SeriesAppLinkHelper } from 'apps/series/SeriesAppLinkHelper';\n\nimport { usePluginHelper } from './use-plugin-helper/usePluginHelper';\nimport { useLiteFavourites } from './useLiteFavourites';\n\ninterface UseCommonVideoPropsResult {\n hasCommonVideoPropsCompleted: boolean;\n commonVideoProps: CommonVideoProps;\n}\n\ninterface UseCommonVideoPropsOptions {\n locationContext: LocationContext,\n mtv?: boolean;\n flightNamespace?: string;\n sharedPlaylist?: boolean;\n}\n\nexport function useCommonVideoProps(options: UseCommonVideoPropsOptions): UseCommonVideoPropsResult {\n const { locationContext, mtv, flightNamespace, sharedPlaylist } = options || {};\n\n const { isPlugin, params } = usePluginHelper();\n const { setFavourite, canFavourite } = useLiteFavourites(locationContext, flightNamespace);\n const { hasTopicDirectories, isLoadingSettings } = useSettings(null);\n const { hasPermissions, isLoaded: hasLoadedPermissions } = usePermissions();\n const hasStudentExperience = hasPermissions(PermissionName.StudentExperience);\n const hasGuestExperience = hasPermissions(PermissionName.GuestExperience);\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n function getSubTextAppLink(video: VideoTypes): Core.AppLink {\n if (!('series' in video))\n return null;\n\n /**\n * We do not allow navigating to series on shared playlists when the user is not signed in\n * because most series are customer created and will be empty for public users\n * \n * We do not have to do this for shared series, because all the series links are self referencing\n * - Sha\n */\n if (sharedPlaylist && !currentUser.data?.isAuthenticated)\n return null;\n \n return SeriesAppLinkHelper.getSeriesAppLink(video.series, { mtv });\n }\n\n const hasCommonVideoPropsCompleted = (\n !isLoadingSettings &&\n hasLoadedPermissions &&\n config.hasCompleted &&\n currentUser.hasCompleted &&\n (!currentUser.data?.isAuthenticated || yearGroups.hasCompleted)\n );\n\n return {\n hasCommonVideoPropsCompleted,\n commonVideoProps: {\n subTextType: 'series',\n getSubTextAppLink,\n isPlugin,\n isPluginPopup: !!params?.popup,\n canFavourite,\n setFavourite,\n imageCdnUrl: config.data?.imageCdnUrl,\n yearGroups: yearGroups.data,\n getClassroomGuideAppLink: VideoAppLinkHelper.getClassroomGuideAppLink,\n getInteractiveGuidanceAppLink: VideoAppLinkHelper.getInteractiveGuidanceAppLink,\n getResourceGuidanceAppLink: VideoAppLinkHelper.getResourceGuidanceAppLink,\n showNewVideoIndicator: hasTopicDirectories,\n companyLogoFallbackUrl: null,\n hasStudentExperience,\n hasGuestExperience\n }\n };\n}","import { Flight } from 'libs/common/react/index';\n\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useGrowingBatchFetch, useGrowingBatchFetchFunc } from 'libs/shared/hooks/UseBatchFetch';\nimport { Clip, ClipCollection, Video, VideoCollection } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\ntype Types = Video[] | VideoCollection | Clip[] | ClipCollection;\n\nfunction getValidObjects(objects: Types): (Video | Clip)[] {\n if (!objects)\n return [];\n\n if (Array.isArray(objects))\n return objects.filter(o => !!o && (VideoHelper.isVideo(o) || VideoHelper.isClip(o)));\n\n if ('data' in objects)\n return objects.data.filter(o => !!o && (VideoHelper.isVideo(o) || VideoHelper.isClip(o)));\n\n return [];\n}\n\ninterface VideoMixinOptions {\n /**\n * If the videos that are having new data mixed into are sitting on an explicit Flight namespace,\n * providing that namespace here is required\n */\n flightNamespace?: string;\n}\n\nexport function useVideoMixin(objects: Types, options: VideoMixinOptions = {}) {\n const videoIds = getValidObjects(objects).map(v => v.id);\n\n useGrowingBatchFetch(\n videoIds,\n ids => VideoRequests.videoMixinAssocs(ids, options.flightNamespace),\n null\n );\n}\n\nexport function useVideoMixinFunc(options: VideoMixinOptions = {}) {\n function getRequest(ids: string[]): Flight.Request {\n return VideoRequests.videoMixinAssocs(ids, options.flightNamespace);\n }\n \n function fetchObjects(items: Types) {\n return fetchItems(getValidObjects(items).map(v => v.id));\n }\n\n const { fetchItems } = useGrowingBatchFetchFunc({ getRequest });\n\n return { fetchObjects };\n}"],"names":["namespace","ComingSoonTag","props","Tooltip","title","LanguageService","spanHackClassName","spanHack","className","SvgContainer","svgName","onlyIcon","GenericCalendarDate","AppLink","appLink","getAppLink","theme","border","analyticsData","analyticsOptions","background","label","body","type","getBodyClass","text","month","PlaylistHelper","isPlaylist","obj","typeId","isOwner","playlist","currentUser","_liteOwner","id","toString","getVideoCount","count","videos","clips","interactives","BackButton","textShadow","backToName","color","extraClasses","backPhrase","colorClass","textShadowClass","size","S","defaultProps","RATIO","width","height","getSizeClass","heading","length","BannerHeader","banner","imageCdnUrl","actions","sortComponent","blockColourClass","specialEvent","portalContainerContext","BannerPortalContext","imageWidth","useBreakpoints","xxl","specialEventIsToday","showComingSoon","today","DateHelper","Date","endDate","startDate","imageOptions","ratio","resizeType","url","ImageHelper","fallbackBaseUrl","fallbackCategoryName","containerProps","bannerClassName","style","backgroundImage","DetailsComponent","detailsComponent","logoFallbackBgClassName","getBgColorClass","PortalHelper","backButtonAppLink","backButtonText","backButtonClasses","alignLogoLeft","logo","getSpecialEventMonthText","calendarTheme","Text","phrase","LazyImage","src","backgroundColor","logoBgColour","Actions","actionsDropdownClassName","container","prevProps","nextProps","PartialBannerHeader","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","internalServerError","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","CHUNK_SIZE","useBatchFetch","itemIds","getRequest","requests","map","chunk","responses","itemsArr","data","items","reduce","acc","item","isFetching","hasCompleted","useGrowingBatchFetch","objs","_getKey","getKey","useGrowingBatchFetchFunc","fetchItems","join","options","fetchedItems","Set","setRequests","hasFirstRequestCompleted","unfetchedItems","forEach","key","current","has","push","add","r","generateCacheKey","flightObjs","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","Array","isArray","useEffect","SCROLL_TOLERANCE","useInfiniteList","fetchNext","onError","getItems","getCursor","scrollContainer","handleScroll","useState","pagesFetched","setPagesFetched","fetchNextFn","response","cursor","request","fetchNextPage","currentVal","nextCursor","hasMore","getBoundingClientRect","scrollTop","scrollHeight","window","innerHeight","document","documentElement","onScroll","FunctionHelper","addEventListener","removeEventListener","shouldInitialFetch","httpStatusClass","substr","HttpStatus","totalItems","hasFirstPageCompleted","useBreadcrumbs","match","breadcrumbs","useBuilder","active","Separator","getPlaylistOwnerName","name","surname","TextHelper","substring","split","PlaylistHeaderDetails","currentUserIsOwner","followerCount","followers","lastUpdated","contentModifiedDate","now","getLastUpdated","detailsClassName","hideOwnerName","_isClickViewCurated","value","clickViewAvatarClassName","ClickViewAvatar","user","separatorClassName","totalVideos","smartCount","timeAgo","PartialPlaylistHeader","getPhrase","PlaylistHeaderUtils","getPlaylistActions","headerProps","args","isAuthenticated","isPlugin","isMobile","setIsFollowing","isFollowing","setShowFollowSpinner","showFollowSpinner","isUserCurator","openInCuratorLink","videoCount","interactiveCount","clipCount","isClickViewPlaylist","location","entity","workflowPhase","isGuest","hideAssignButton","AssignHelper","hasAssignActionButton","hasShareFlowV2","isStudent","playAllAppLink","button","actionType","AssignAppLinkHelper","entityType","objectId","href","openInNewTab","tooltip","application","action","params","eventVersion","onClick","follow","AnalyticsHelper","descriptor","showSpinner","PlaylistHeader","usePluginHelper","usePermissions","hasPermissions","getGatedPermission","useSettings","showPartialLoading","description","PermissionName","getBreadcrumbs","classificationId","topicPath","GateBanner","Breadcrumbs","SortableVideoListContainer","onSortComplete","onSortStart","videoListProps","currentSortingIndex","setCurrentSortingIndex","PartialVideoList","withReordering","canEdit","showIndexes","event","index","findIndex","v","onSortEnd","over","oldIndex","newIndex","DevError","dragHandleIcon","dragHandleIconSize","presentationAudiences","VideoList","PlaylistEmptyState","EmptyState","ImageUrls","logSortAction","playlistId","videoId","playlistErrors","PlaylistPrivateError","PlaylistView","dispatch","alerts","config","ConfigRequests","UserRequests","useCurationStudio","getOpenInCurationStudioLink","playlistGatedPermission","yearGroups","CustomerRequests","customerId","ClassificationRequests","classification","classificationPresentation","presentationId","shouldFetchAudiences","audiences","AudienceRequests","commonVideoProps","useCommonVideoProps","locationContext","mtv","moviesAndTv","sharedPlaylist","shareId","playlistRequest","PlaylistRequests","playlistItemCountRequest","playlistWithCounts","getVideoItemActions","videoActions","useVideoActions","getVideoActions","video","canConsume","VideoHelper","removeFromPlaylistAction","group","usePlaylistViewVideoActions","getVideosRequest","following","useVideoMixin","reorderedItems","setReorderedItems","arr1","arr2","isEqual","i","isOrderEqual","reorderedVideos","setReorderedVideos","useDeepLinks","app","useSetPageMetadata","PageMetadataHelper","content","phraseContext","phraseHandler","titlePhrase","descriptionPhrase","canonicalLink","SeoHelper","stripPresentationSlug","allowIndexing","playlistIsEmpty","playNext","VideoAppLinkHelper","contextId","context","RelatedVideosContext","includeContext","isFollowingComplete","firstPlayAllVideo","find","videoDataLoaded","HardGateEmptyState","feature","VideoActionsContext","shouldFollow","onSuccess","req","error","hideBreadCrumbs","oldIdx","newIdx","ReorderHelper","reorderRequest","getVideoAppLink","opts","showSignIn","getSignInAppLink","redirectUrl","canRemovePrivateVideos","getPreviewQuestionsAppLink","interactive","InteractiveHelper","InfiniteScrollFooter","role","featureConfigMap","headingPhrase","ctaPhrase","imageUrl","extraCta","flightNamespace","u","setFavourite","canFavourite","hasTopicDirectories","isLoadingSettings","hasLoadedPermissions","isLoaded","hasStudentExperience","hasGuestExperience","hasCommonVideoPropsCompleted","subTextType","getSubTextAppLink","series","isPluginPopup","popup","getClassroomGuideAppLink","getInteractiveGuidanceAppLink","getResourceGuidanceAppLink","showNewVideoIndicator","companyLogoFallbackUrl","getValidObjects","objects","filter","o","videoIds","ids","useVideoMixinFunc","fetchObjects"],"sourceRoot":""}
@@ -0,0 +1,3 @@
1
+ /*! For license information please see 4006-5078eb2c01-lite.chunk.js.LICENSE.txt */
2
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[4006],{8233:(e,t,n)=>{n.d(t,{R:()=>m});var r=n(23481),i=n(110),a=n(33518),o=n(4594),s=n(49080),c=n(26361),l=n(35223),u=n(31908);function d(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var g=r.T.encloseNamespace("sharev2.utils"),m={getPrivateIconAndText:function(e){var t=e.entityTypeId,n=e.privacy,r=e.hasStudentExp,i=e.entity,s=e.yearGroups;if(t===o.E.Topic||t===o.E.Series)return{icon:l.vn.VisibleOn,text:g(r?"justMySchoolTeachers":"justMySchoolDescription")};if(!Array.isArray(n))switch(n){case a.e.Public:return{icon:l.vn.VisibleOn,text:g("publicDescription")};case a.e.ProtectedOverrideRestriction:return{icon:l.vn.VisibleOn,text:g("clickViewOnly")};case a.e.Protected:return{icon:l.vn.Lock,text:m.getRespectRatingText(i,s,r)};case a.e.JustMySchoolOverrideRestriction:return{icon:l.vn.Lock,text:g(r?"justMySchoolTeachers":"justMySchoolDescription")};case a.e.JustMySchool:return{icon:l.vn.Lock,text:m.getRespectRatingText(i,s,r)};case a.e.PinCode:return{icon:l.vn.Lock,text:g("pinDescription")};case a.e.PasswordProtected:return{icon:l.vn.Lock,text:g("password")};default:return{}}},getIconAndText:function(e){var t=e.linkExpireDate,n=e.isPasswordProtected,r=e.status;if(!t&&!n)return m.getPrivateIconAndText(e);if(!t)return{icon:l.vn.Lock,text:g("password")};var a=i.O.isToday(t),o=i.O.diffBetween(t,new Date,"day");if(!n){var c=a?g("expiryToday"):g("expiry",{days:o});return r===s.F.Expired&&(c=g("expired")),{icon:l.vn.Timer,text:c}}var u=a?g("passwordExpiryToday"):g("passwordExpiry",{days:o});return r===s.F.Expired&&(u=g("passwordExpired")),{icon:l.vn.Lock,text:u}},getRespectRatingText:function(e,t,n){var r;if(!e||!t)return null;if(n)return g("justMySchoolTeachers");if(!u.M.isVideoType(e))return g("collectionRating");var i=c.l.getWeightedRestriction(null===(r=e._restrictions)||void 0===r?void 0:r.value);if(i&&!i.yearGroup)return g("onlyAdmins");var a,o,s,l=u.M.getRating(e),m=function(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return d(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?d(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,i=function(){};return{s:i,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,o=!0,s=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return o=e.done,e},e:function(e){s=!0,a=e},f:function(){try{o||null==n.return||n.return()}finally{if(s)throw a}}}}(t);try{for(m.s();!(s=m.n()).done;){var p=s.value;(!a||p.value>a.value)&&(a=p),i&&p.value<=i.yearGroup||l&&p.rating.value<l.value||(!o||p.value<o.value)&&(o=p)}}catch(e){m.e(e)}finally{m.f()}return o?1===t.length?g("clickViewOnly"):o.value===a.value?g("maxYearGroup",{yearGroup:a.name}):g("yearGroupRange",{yearGroup:o.name}):g("onlyStaff")},getShareLinkAccessType:function(e){return e.isTvContent||e.isClickViewContent?"protected":e.canManageAccess?"owner":"private"}}},53172:(e,t,n)=>{n.d(t,{l:()=>l});var r=n(32735),i=n(31453),a=n(83914),o=n(83345),s=n(35223),c="shared.premiumBadge";function l(e){return r.createElement("span",{className:(0,i.A)("badge badge-wrapper rounded-pill d-flex align-items-center justify-content-center","fw-medium text-indigo","sm"===e.size?"badge-sm":"badge-std",e.invert?"bg-white":"bg-light-indigo",e.className)},r.createElement(a.x,{svgName:s.vn.StarOutline,size:a.S.Medium}),r.createElement(o.x,{phrase:"premium",namespace:c}))}},14006:(e,t,n)=>{n.r(t),n.d(t,{OpenClassroomFlowView:()=>$});var r=n(32735),i=n(89067),a=n(64695),o=n(83351);function s(e){return r.createElement(a.q,{feature:"assign",animate:e.animate,closePopup:e.closePopup,extraContent:r.createElement(o.P,{onClickBack:e.goToFlowSelector,hideNextButton:!0,hideCreateClassroomButton:!0})})}var c=n(82664),l=n(37241),u=n(23481),d=n(65858),g=n(9111),m=n(53172),p=n(99998),f=n(7786),h=n(8233),v=n(32781),y=n(91693),b=n(12528),S=n(83914),T=n(83345),E=n(35223),w="assign.openClassroomFlowInfoHeader";function x(e){return r.createElement(T.D.Provider,{value:w},r.createElement("div",{className:"p-3 bg-light-blue rounded rounded-2 gap-3 d-flex flex-row"},r.createElement("div",{className:"d-none d-md-block"},r.createElement("div",null,r.createElement(b.f,{svgName:E.vn.Classrooms,svgSize:S.S.Standard,variant:"blue",textVariant:"white",svgWrapperClassName:"p-1"}))),r.createElement("div",{className:"position-relative w-100"},r.createElement("h3",{className:"h6"},r.createElement(T.x,{phrase:"title"})),r.createElement("p",{className:"mb-0"},r.createElement(T.x,{phrase:"description"})),r.createElement("div",{className:"position-absolute top-0 end-0"},r.createElement(y.h,{svgName:E.vn.Close,onClick:e.onClose,className:"btn-close p-2"})))))}var R=u.T.encloseNamespace("assign.openClassroomFlowSettings");function I(e){var t=h.R.getRespectRatingText(e.entity,e.yearGroups,e.hasStudentExp);return r.createElement("div",{className:"d-flex flex-column gap-4"},e.showHeader&&r.createElement(x,{onClose:e.closeHeader}),r.createElement(v.m,null,r.createElement(v.m.Input,{title:R("openClassroomNameTitle"),className:"col-lg-6",value:e.openClassroomName,onChange:e.onChangeOpenClassroomName,placeholder:R("openClassroomNamePlaceholder"),error:e.error.name})),r.createElement(v.m.Divider,{hide:e.hidePreventScrubbing&&e.hideImmediateFeedback}),r.createElement(v.m,{name:R("videoSettingsTitle"),hide:e.hidePreventScrubbing&&e.hideImmediateFeedback},r.createElement(v.m.Toggle,{hide:e.hidePreventScrubbing,title:R("preventScrubbingTitle"),description:R("preventScrubbingDescription"),onClick:e.onTogglePreventScrubbing,toggled:e.preventScrubbing,disabled:e.disablePreventScrubbing}),r.createElement(v.m.Toggle,{hide:e.hideImmediateFeedback,title:R("immediateFeedbackTitle"),description:R("immediateFeedbackDescription"),onClick:e.onToggleImmediateFeedback,toggled:e.immediateFeedback,disabled:e.disableImmediateFeedback})),r.createElement(v.m.Divider,{hide:e.hideRequiresStudentSignIn&&e.hideRespectRatingsAndRestrictions}),r.createElement(v.m,{name:R("studentAccessTitle"),hide:e.hideRequiresStudentSignIn&&e.hideRespectRatingsAndRestrictions},r.createElement(v.m.Toggle,{hide:e.hideRequiresStudentSignIn,title:R("requiresStudentSignInTitle"),description:R("requiresStudentSignInDescription"),onClick:e.onToggleRequiresStudentSignIn,toggled:e.toggleRequiresStudentSignIn,disabled:e.disableRequiresStudentSignIn}),r.createElement(v.m.Toggle,{hide:e.hideRespectRatingsAndRestrictions,title:R("respectRatingsAndRestrictionsTitle"),description:t,onClick:e.onToggleRespectRatingsAndRestrictions,toggled:e.toggleRespectRatingsAndRestrictions,disabled:e.disableRespectRatingsAndRestrictions})),r.createElement(v.m.Divider,{hide:e.hideRequiresStudentSignIn&&e.hideRespectRatingsAndRestrictions||e.hideMessage}),r.createElement(v.m,{name:R("moreOptionsTitle"),hide:e.hideMessage,childContainerClassName:"d-flex flex-column gap-2"},r.createElement(v.m.Toggle,{hide:e.hideMessage,title:R("messageTitle"),description:R("messageDescription"),onClick:e.onToggleMessage,toggled:e.toggleMessage,disabled:e.disableMessage},r.createElement(v.m.TextArea,{hide:!e.toggleMessage,placeholder:R("messagePlaceholder"),onChange:e.onChangeMessage,value:e.message}))))}var P=n(57900),k=n(2948),C=n(20354),A=n(80687),N=n(1666),j=n(69883),O=n(95890);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 G(){var e,t,n="function"==typeof Symbol?Symbol:{},r=n.iterator||"@@iterator",i=n.toStringTag||"@@toStringTag";function a(n,r,i,a){var c=r&&r.prototype instanceof s?r:s,l=Object.create(c.prototype);return M(l,"_invoke",function(n,r,i){var a,s,c,l=0,u=i||[],d=!1,g={p:0,n:0,v:e,a:m,f:m.bind(e,4),d:function(t,n){return a=t,s=0,c=e,g.n=n,o}};function m(n,r){for(s=n,c=r,t=0;!d&&l&&!i&&t<u.length;t++){var i,a=u[t],m=g.p,p=a[2];n>3?(i=p===r)&&(c=a[(s=a[4])?5:(s=3,3)],a[4]=a[5]=e):a[0]<=m&&((i=n<2&&m<a[1])?(s=0,g.v=r,g.n=a[1]):m<p&&(i=n<3||a[0]>r||r>p)&&(a[4]=n,a[5]=r,g.n=p,s=0))}if(i||n>1)return o;throw d=!0,r}return function(i,u,p){if(l>1)throw TypeError("Generator is already running");for(d&&1===u&&m(u,p),s=u,c=p;(t=s<2?e:c)||!d;){a||(s?s<3?(s>1&&(g.n=-1),m(s,c)):g.n=c:g.v=c);try{if(l=2,a){if(s||(i="next"),t=a[i]){if(!(t=t.call(a,c)))throw TypeError("iterator result is not an object");if(!t.done)return t;c=t.value,s<2&&(s=0)}else 1===s&&(t=a.return)&&t.call(a),s<2&&(c=TypeError("The iterator does not provide a '"+i+"' method"),s=1);a=e}else if((t=(d=g.n<0)?c:n.call(r,g))!==o)break}catch(t){a=e,s=1,c=t}finally{l=1}}return{value:t,done:d}}}(n,i,a),!0),l}var o={};function s(){}function c(){}function l(){}t=Object.getPrototypeOf;var u=[][r]?t(t([][r]())):(M(t={},r,function(){return this}),t),d=l.prototype=s.prototype=Object.create(u);function g(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,l):(e.__proto__=l,M(e,i,"GeneratorFunction")),e.prototype=Object.create(d),e}return c.prototype=l,M(d,"constructor",l),M(l,"constructor",c),c.displayName="GeneratorFunction",M(l,i,"GeneratorFunction"),M(d),M(d,i,"Generator"),M(d,r,function(){return this}),M(d,"toString",function(){return"[object Generator]"}),(G=function(){return{w:a,m:g}})()}function M(e,t,n,r){var i=Object.defineProperty;try{i({},"",{})}catch(e){i=0}M=function(e,t,n,r){if(t)i?i(e,t,{value:n,enumerable:!r,configurable:!r,writable:!r}):e[t]=n;else{var a=function(t,n){M(e,t,function(e){return this._invoke(t,n,e)})};a("next",0),a("throw",1),a("return",2)}},M(e,t,n,r)}function q(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,i,a,o,s=[],c=!0,l=!1;try{if(a=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=a.call(n)).done)&&(s.push(r.value),s.length!==t);c=!0);}catch(e){l=!0,i=e}finally{try{if(!c&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(l)throw i}}return s}}(e,t)||function(e,t){if(e){if("string"==typeof e)return D(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?D(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 D(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var B=function(e,t,n,r){return new(n||(n=Promise))(function(i,a){function o(e){try{c(r.next(e))}catch(e){a(e)}}function s(e){try{c(r.throw(e))}catch(e){a(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n(function(e){e(t)})).then(o,s)}c((r=r.apply(e,t||[])).next())})},L=u.T.encloseNamespace("assign.useOpenClassroomFlowData"),H={immediateFeedback:!1,preventScrubbing:!1,message:!1,requiresStudentSignIn:!1,respectRatingsAndRestrictions:!1},V=128,_="assign:open:classroom:flow:settings:header";function U(e){var t,n,i,a=(0,j.Z)(),o=q((0,k.D)(_,!0,{storage:P.Z1.LocalStorage}),2),s=o[0],c=o[1],l=(0,O._)({entityType:e.entityType,objectId:e.objectId}),u=C.a.useBasicFetch(N.h.yearGroups(null===(t=l.currentUser.data)||void 0===t?void 0:t.customerId)),d=(0,A.t)(e.objectId).createOpenSession,g=q(r.useState(Object.assign(Object.assign({},H),{preventScrubbing:(null===(n=l.interactive.data)||void 0===n?void 0:n.preventScrubbing)||!1,immediateFeedback:(null===(i=l.interactive.data)||void 0===i?void 0:i.immediateFeedback)||!1})),2),m=g[0],p=g[1],f=q(r.useState(""),2),h=f[0],v=f[1],y=q(r.useState(""),2),b=y[0],S=y[1],T=q(r.useState(!1),2),E=T[0],w=T[1],x=q(r.useState({}),2),R=x[0],I=x[1],M=0===Object.keys(R).length;return{data:{loaded:l.loaded&&!!u.data,entity:l.entity,yearGroups:u},showHeader:s,hasStudentExp:l.hasStudentExp,shouldShowSpinner:E,nextButtonText:L("nextButton"),name:h,message:b,settings:m,setMessage:S,setShowHeader:c,toggleSetting:function(e){!function(e,t){var n,r,i,a=(n={},i=t,(r=function(e){var t=function(e){if("object"!=F(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=F(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==F(t)?t:t+""}(r=e))in n?Object.defineProperty(n,r,{value:i,enumerable:!0,configurable:!0,writable:!0}):n[r]=i,n);"respectRatingsAndRestrictions"===e&&(a.requiresStudentSignIn=t),p(function(e){return Object.assign(Object.assign({},e),a)})}(e,!m[e])},setOpenClassroomName:function(e){e.length>V?I(function(e){return Object.assign(Object.assign({},e),{name:L("errorNameTooLong")})}):I(function(e){return delete e.name,e}),v(e)},onShare:function(t){return B(this,void 0,void 0,G().m(function n(){var r;return G().w(function(n){for(;;)switch(n.n){case 0:if(M){n.n=1;break}return n.a(2);case 1:return w(!0),n.p=2,n.n=3,d({name:h,objectId:e.objectId,immediateFeedback:m.immediateFeedback,preventScrubbing:m.preventScrubbing,requireSignIn:m.requiresStudentSignIn,respectRatingsAndRestrictions:m.respectRatingsAndRestrictions});case 3:r=n.v,"function"==typeof t&&t(r),w(!1),n.n=5;break;case 4:n.p=4,n.v,a.error(L("createError"));case 5:return n.p=5,w(!1),n.f(5);case 6:return n.a(2)}},n,null,[[2,4,5,6]])}))},error:R,setError:I,isValid:M,openClassroomGatedPermission:l.openClassroomGatedPermission}}var Z=u.T.encloseNamespace("assign.openClassroomFlowSettingsView");function z(e){var t=U({entityType:e.entityType,objectId:e.objectId}),n=(0,p.R)(),i=n.experience,a=n.loading,s=t.data,c=s.loaded,u=s.entity,h=s.yearGroups,v=(0,f.y)({data:{entity:{id:e.objectId,type:e.entityType}},analyticsOptions:{location:d.LZ.Popup}}).log,y=!c||a||e.loading;return r.createElement(g.G,{size:"lg",title:Z("title"),showLoadingSpinner:y,closePopup:e.closePopup,bodyClassName:"d-flex flex-column gap-3",animation:e.animate,hideTitle:"soft-gate"===t.openClassroomGatedPermission},"soft-gate"===t.openClassroomGatedPermission&&r.createElement(l.Z.Header,{className:"d-flex align-items-center justify-content-between bg-white mx-n3 mt-n3 mb-3",closeButton:!0},r.createElement(l.Z.Title,{as:"h2",className:"h4 flex-grow-1 d-flex justify-content-between align-items-center"},Z("title"),r.createElement("span",{className:"d-inline-block me-2"},r.createElement(m.l,{size:"std"})))),r.createElement(I,{entity:u.data,error:t.error,showHeader:t.showHeader,openClassroomName:t.name,onChangeOpenClassroomName:t.setOpenClassroomName,message:t.message,yearGroups:h.data,hasStudentExp:t.hasStudentExp,toggleMessage:t.settings.message,immediateFeedback:t.settings.immediateFeedback,preventScrubbing:t.settings.preventScrubbing,toggleRequiresStudentSignIn:t.settings.requiresStudentSignIn,toggleRespectRatingsAndRestrictions:t.settings.respectRatingsAndRestrictions,hideMessage:!0,onChangeMessage:t.setMessage,onToggleMessage:function(){return t.toggleSetting("message")},hidePreventScrubbing:"interactive"!==e.entityType,hideImmediateFeedback:"interactive"!==e.entityType,hideRequiresStudentSignIn:"full"!==i,hideRespectRatingsAndRestrictions:"full"!==i,onTogglePreventScrubbing:function(){return t.toggleSetting("preventScrubbing")},onToggleImmediateFeedback:function(){return t.toggleSetting("immediateFeedback")},onToggleRequiresStudentSignIn:function(){return t.toggleSetting("requiresStudentSignIn")},onToggleRespectRatingsAndRestrictions:function(){return t.toggleSetting("respectRatingsAndRestrictions")},closeHeader:function(){return t.setShowHeader(!1)},disableRequiresStudentSignIn:t.settings.respectRatingsAndRestrictions}),r.createElement(o.P,{hideCreateClassroomButton:!0,hideBackButton:e.hideBackButton||"soft-gate"===t.openClassroomGatedPermission,onClickBack:e.goToFlowSelector,onClickNext:function(){t.onShare(function(t){v({type:"create-open-classroom",share:t}),v({type:"share-open-classroom",id:t.objectId,shareId:t.shareId,shareType:t.type}),e.setShare(t),e.goToAssignDetails()})},nextButtonText:t.nextButtonText,showSpinner:t.shouldShowSpinner,disableNextButton:!t.isValid}))}function W(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,i,a,o,s=[],c=!0,l=!1;try{if(a=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=a.call(n)).done)&&(s.push(r.value),s.length!==t);c=!0);}catch(e){l=!0,i=e}finally{try{if(!c&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(l)throw i}}return s}}(e,t)||function(e,t){if(e){if("string"==typeof e)return Y(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Y(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 Y(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function $(e){var t=W(r.useState(e.openClassroomInitialStep),2),n=t[0],a=t[1],o=W(r.useState(),2),l=o[0],u=o[1],d={objectId:e.objectId,entityType:e.entityType,closePopup:e.closePopup,goToFlowSelector:e.goToFlowSelector,shareId:null==l?void 0:l.shareId,initialDetailsScreen:"share-link",goToAssignDetails:function(){return a("assign-details")},setShare:u};return r.createElement(i.r,{data:d,animate:!1,step:n,setStep:a,closePopup:e.closePopup,steps:{settings:{view:z},"assign-details":{view:c.AssignDetailsView},"hard-gate":{view:s}}})}},64695:(e,t,n)=>{n.d(t,{q:()=>y});var r=n(32735),i=n(37241),a=n(68050),o=n(23481),s=n(65858),c=n(97958),l=n(9111),u=n(53172),d=n(83345),g=n(99742),m=n(14070),p=n(97291),f="shared.hardGatePopup",h=o.T.encloseNamespace(f),v={assign:{titlePhrase:"assignTitle",headingPhrase:"assignHeading",imageUrl:g.W.ReverseTrial.ASSIGN},playlists:{titlePhrase:"playlistsTitle",headingPhrase:"playlistsHeading",imageUrl:g.W.ReverseTrial.PLAYLIST},interactive:{titlePhrase:"interactiveTitle",headingPhrase:"interactiveHeading",imageUrl:g.W.ReverseTrial.INTERACTIVE},"copy-interactives":{titlePhrase:"copyInteractiveTitle",headingPhrase:"copyInteractiveHeading",imageUrl:g.W.ReverseTrial.INTERACTIVE},integrations:{titlePhrase:"integrationsTitle",headingPhrase:"integrationsHeading",imageUrl:g.W.ReverseTrial.INTEGRATIONS}};function y(e){var t=v[e.feature];return r.createElement(l.G,{size:"lg",animation:e.animate,closePopup:e.closePopup,hideTitle:!0},r.createElement(i.Z.Header,{className:"d-flex align-items-center justify-content-between bg-white mx-n3 mt-n3",closeButton:!0},r.createElement(i.Z.Title,{as:"h2",className:"h4 flex-grow-1 d-flex justify-content-between align-items-center"},h(t.titlePhrase),r.createElement("span",{className:"d-inline-block me-2"},r.createElement(u.l,{size:"std"})))),r.createElement(a.Z,{className:"mb-3"},r.createElement(c.u,{className:"pt-3"},r.createElement(c.u.Image,{src:t.imageUrl,altText:h(t.titlePhrase)}),r.createElement(c.u.Heading,{className:"h6"},r.createElement(d.x,{namespace:f,phrase:t.headingPhrase})),r.createElement(c.u.Info,null,r.createElement(d.x,{namespace:f,phrase:"description"})),r.createElement(c.u.Cta,{appLink:{application:p.O.SIGN_UP,action:m.e.SignUp.INVITE_COLLEAGUE},text:h("cta"),analyticsData:{},analyticsOptions:{actionType:s.Vw.Click,location:s.LZ.GatedPopup,entity:s.py.AppLink,descriptor:s.Yu.PremiumFeatures}}))),e.extraContent)}}}]);
3
+ //# sourceMappingURL=4006-5078eb2c01-lite.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/4006-5078eb2c01-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/share-v2/utils/ShareLinkHelper.ts","file:///app/packages/libs/shared/src/components/premium-badge/PremiumBadge.tsx","file:///app/packages/projects/lite/src/apps/assign/views/hard-gate-open-classroom-view/HardGateOpenClassroomView.tsx","file:///app/packages/projects/lite/src/apps/assign/views/open-classroom-flow-settings-view/components/open-classroom-flow-info-header/OpenClassroomFlowInfoHeader.tsx","file:///app/packages/projects/lite/src/apps/assign/views/open-classroom-flow-settings-view/components/open-classroom-flow-settings/OpenClassroomFlowSettings.tsx","file:///app/packages/projects/lite/src/apps/assign/views/open-classroom-flow-settings-view/hooks/use-open-classroom-flow-settings-data/useOpenClassroomFlowSettingsData.ts","file:///app/packages/projects/lite/src/apps/assign/views/open-classroom-flow-settings-view/OpenClassroomFlowSettingsView.tsx","file:///app/packages/projects/lite/src/apps/assign/views/open-classroom-flow-view/OpenClassroomFlowView.tsx","file:///app/packages/projects/lite/src/shared/components/hard-gate-popup/HardGatePopup.tsx"],"sourcesContent":["import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { SharePrivacy } from 'libs/shared/apps/share-v2/enums/SharePrivacy';\nimport type { SharePrivacyResponse } from 'libs/shared/apps/share-v2/interfaces/SharePrivacyResponse';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ShareLinkStatus } from 'libs/shared/enums/ShareLinkStatus';\nimport type { BaseObject, YearGroup } from 'libs/shared/interfaces';\nimport { RestrictionHelper } from 'libs/shared/utils/RestrictionHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nconst namespace = 'sharev2.utils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface GetIconAndTextOptions {\n linkExpireDate: string;\n isPasswordProtected: boolean;\n privacy: SharePrivacy;\n status: ShareLinkStatus;\n entityTypeId: MasterType;\n hasStudentExp: boolean;\n entity: BaseObject;\n yearGroups: YearGroup[];\n}\n\ninterface GetPrivateIconAndTextOptions {\n privacy: SharePrivacy;\n entityTypeId: MasterType;\n hasStudentExp: boolean;\n entity: BaseObject;\n yearGroups: YearGroup[];\n}\n\nexport const ShareLinkHelper = {\n getPrivateIconAndText: (options: GetPrivateIconAndTextOptions) => {\n const { entityTypeId, privacy, hasStudentExp, entity, yearGroups } = options;\n \n if (entityTypeId === MasterType.Topic || entityTypeId === MasterType.Series)\n return { icon: cvSvgLibrary.VisibleOn, text: getPhrase(hasStudentExp ? 'justMySchoolTeachers' : 'justMySchoolDescription') };\n \n /**\n * This is mainly for typescript, privacy will be an array for playlists\n * but that is handled above\n */\n if (Array.isArray(privacy))\n return;\n \n switch (privacy) {\n case SharePrivacy.Public:\n return { icon: cvSvgLibrary.VisibleOn, text: getPhrase('publicDescription') };\n case SharePrivacy.ProtectedOverrideRestriction:\n return { icon: cvSvgLibrary.VisibleOn, text: getPhrase('clickViewOnly') };\n case SharePrivacy.Protected:\n return {\n icon: cvSvgLibrary.Lock,\n text: ShareLinkHelper.getRespectRatingText(entity, yearGroups, hasStudentExp)\n };\n case SharePrivacy.JustMySchoolOverrideRestriction:\n return { icon: cvSvgLibrary.Lock, text: getPhrase(hasStudentExp ? 'justMySchoolTeachers' : 'justMySchoolDescription') };\n case SharePrivacy.JustMySchool:\n return {\n icon: cvSvgLibrary.Lock,\n text: ShareLinkHelper.getRespectRatingText(entity, yearGroups, hasStudentExp)\n };\n case SharePrivacy.PinCode:\n return { icon: cvSvgLibrary.Lock, text: getPhrase('pinDescription') };\n case SharePrivacy.PasswordProtected:\n return { icon: cvSvgLibrary.Lock, text: getPhrase('password') };\n default:\n return {};\n }\n },\n\n getIconAndText: (options: GetIconAndTextOptions) => {\n const { linkExpireDate, isPasswordProtected, status } = options;\n if (!linkExpireDate && !isPasswordProtected)\n return ShareLinkHelper.getPrivateIconAndText(options);\n \n if (!linkExpireDate)\n return { icon: cvSvgLibrary.Lock, text: getPhrase('password') };\n \n const isToday = DateHelper.isToday(linkExpireDate);\n const dayDifference = DateHelper.diffBetween(linkExpireDate, new Date(), 'day');\n \n if (!isPasswordProtected) {\n let text = isToday\n ? getPhrase('expiryToday')\n : getPhrase('expiry', { days: dayDifference });\n \n if (status === ShareLinkStatus.Expired)\n text = getPhrase('expired');\n \n return { icon: cvSvgLibrary.Timer, text };\n }\n \n let text = isToday\n ? getPhrase('passwordExpiryToday')\n : getPhrase('passwordExpiry', { days: dayDifference });\n \n if (status === ShareLinkStatus.Expired)\n text = getPhrase('passwordExpired');\n \n return { icon: cvSvgLibrary.Lock, text };\n },\n\n getRespectRatingText(video: BaseObject, yearGroups: YearGroup[], hasStudentExp: boolean) {\n if (!video || !yearGroups)\n return null;\n \n if (hasStudentExp)\n return getPhrase('justMySchoolTeachers');\n \n if (!VideoHelper.isVideoType(video))\n return getPhrase('collectionRating');\n \n const restriction = RestrictionHelper.getWeightedRestriction(video._restrictions?.value);\n \n /**\n * Restrictions without a year level are teacher restricitons, which means only admins can see it.\n */\n if (restriction && !restriction.yearGroup)\n return getPhrase('onlyAdmins');\n \n const rating = VideoHelper.getRating(video);\n \n let maxYearGroup: YearGroup;\n let minAllowedYearGroup: YearGroup;\n \n for (const yearGroup of yearGroups) {\n /**\n * If our year level is our new highest so far, save it\n */\n if (!maxYearGroup || yearGroup.value > maxYearGroup.value)\n maxYearGroup = yearGroup;\n \n /**\n * If the restriction is higher than this year level, skip it.\n */\n if (restriction && yearGroup.value <= restriction.yearGroup)\n continue;\n \n /**\n * If therating is higher than this year level's rating value, skip it.\n */\n if (rating && yearGroup.rating.value < rating.value)\n continue;\n \n /**\n * If our year level is the new lowest so far, save it\n */\n if (!minAllowedYearGroup || yearGroup.value < minAllowedYearGroup.value)\n minAllowedYearGroup = yearGroup;\n }\n \n /**\n * If no year levels are allowed, then it's staff only.\n */\n if (!minAllowedYearGroup)\n return getPhrase('onlyStaff');\n \n \n /**\n * If there's only one year level, and it's allowed, then we can just\n * say that everyone in your school can access it.\n */\n if (yearGroups.length === 1)\n return getPhrase('clickViewOnly');\n \n /**\n * We differentiate the copy if it's the highest year level or not. \n * Basically if we need to say \"X and above\" or not.\n */\n if (minAllowedYearGroup.value === maxYearGroup.value)\n return getPhrase('maxYearGroup', { yearGroup: maxYearGroup.name });\n \n return getPhrase('yearGroupRange', { yearGroup: minAllowedYearGroup.name });\n },\n\n getShareLinkAccessType(privacy: SharePrivacyResponse): 'private' | 'owner' | 'protected' {\n /**\n * If an entity is not a ClickView content and they cannot manage access\n * settings of the entity (which they can if its their private entity)\n * it means that its a TV content\n */\n if (privacy.isTvContent || privacy.isClickViewContent)\n return 'protected';\n\n if (privacy.canManageAccess)\n return 'owner';\n\n return 'private';\n }\n};","import React from 'react';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.premiumBadge';\n\ninterface PremiumBadgeProps {\n invert?: boolean;\n size: 'sm' | 'std';\n className?: string;\n}\n\nexport function PremiumBadge(props: PremiumBadgeProps): JSX.Element {\n return (\n <span className={classNames(\n 'badge badge-wrapper rounded-pill d-flex align-items-center justify-content-center',\n 'fw-medium text-indigo',\n props.size === 'sm' ? 'badge-sm' : 'badge-std',\n props.invert ? 'bg-white' : 'bg-light-indigo',\n props.className\n )}>\n <SvgContainer svgName={cvSvgLibrary.StarOutline} size={SvgContainerSize.Medium} />\n <Text phrase='premium' namespace={namespace} />\n </span>\n );\n}","import React from 'react';\n\nimport { SharableEntityType } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { MultiStepPopupViewProps } from 'libs/shared/components/multistep-popup/MultiStepPopup';\n\nimport { HardGatePopup } from 'shared/components/hard-gate-popup/HardGatePopup';\n\nimport { FlowControls } from 'apps/assign/components/flow-controls/FlowControls';\n\nexport interface HardGateOpenClassroomViewProps extends MultiStepPopupViewProps {\n objectId: string;\n entityType: SharableEntityType;\n goToFlowSelector: () => void;\n}\n\n// eslint-disable-next-line rulesdir/require-view-title -- Title is rendered by HardGatePopup\nexport function HardGateOpenClassroomView(props: HardGateOpenClassroomViewProps): JSX.Element {\n return (\n <HardGatePopup\n feature='assign'\n animate={props.animate}\n closePopup={props.closePopup}\n extraContent={(\n <FlowControls\n onClickBack={props.goToFlowSelector}\n hideNextButton\n hideCreateClassroomButton\n />\n )}\n />\n );\n}","import React from 'react';\n\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { IconCircle } from 'libs/shared/components/icon-circle/IconCircle';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'assign.openClassroomFlowInfoHeader';\n\ninterface OpenClassroomFlowInfoHeaderProps {\n onClose: () => void;\n}\n\nexport function OpenClassroomFlowInfoHeader(props: OpenClassroomFlowInfoHeaderProps): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <div className='p-3 bg-light-blue rounded rounded-2 gap-3 d-flex flex-row'>\n <div className='d-none d-md-block'>\n <div>\n <IconCircle\n svgName={cvSvgLibrary.Classrooms}\n svgSize={SvgContainerSize.Standard}\n variant='blue'\n textVariant='white'\n svgWrapperClassName='p-1'\n />\n </div>\n </div>\n <div className='position-relative w-100'>\n <h3 className='h6'><Text phrase='title' /></h3>\n <p className='mb-0'><Text phrase='description' /></p>\n <div className='position-absolute top-0 end-0'>\n <IconButton svgName={cvSvgLibrary.Close} onClick={props.onClose} className='btn-close p-2' />\n </div>\n </div>\n </div>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { ShareLinkHelper } from 'libs/shared/apps/share-v2/utils/ShareLinkHelper';\nimport { SharableEntity } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { YearGroup } from 'libs/shared/interfaces';\n\nimport { FlowSettings } from 'apps/assign/components/flow-settings/FlowSettings';\n\nimport { OpenClassroomFlowSettingsError } from '../../hooks/use-open-classroom-flow-settings-data/useOpenClassroomFlowSettingsData';\nimport { OpenClassroomFlowInfoHeader } from '../open-classroom-flow-info-header/OpenClassroomFlowInfoHeader';\n\nconst namespace = 'assign.openClassroomFlowSettings';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SettingsFieldProps {\n // Open classroom name field\n openClassroomName: string;\n onChangeOpenClassroomName: (name: string) => void;\n \n // Prevent scrubbing field\n hidePreventScrubbing?: boolean;\n disablePreventScrubbing?: boolean;\n onTogglePreventScrubbing: () => void;\n preventScrubbing: boolean;\n \n // Immediate feedback field\n hideImmediateFeedback?: boolean;\n disableImmediateFeedback?: boolean;\n onToggleImmediateFeedback: () => void;\n immediateFeedback: boolean;\n\n // Require student sign in field\n hideRequiresStudentSignIn?: boolean;\n disableRequiresStudentSignIn?: boolean;\n onToggleRequiresStudentSignIn: () => void;\n toggleRequiresStudentSignIn: boolean;\n\n // Respect ratings and restrictions field\n hideRespectRatingsAndRestrictions?: boolean;\n disableRespectRatingsAndRestrictions?: boolean;\n onToggleRespectRatingsAndRestrictions: () => void;\n toggleRespectRatingsAndRestrictions: boolean;\n \n // Message field\n hideMessage?: boolean;\n disableMessage?: boolean;\n message: string;\n onChangeMessage: (message: string) => void;\n onToggleMessage: () => void;\n toggleMessage: boolean;\n}\n\ninterface OpenClassroomFlowSettingsProps extends SettingsFieldProps {\n hasStudentExp: boolean;\n entity: SharableEntity;\n yearGroups: YearGroup[];\n closeHeader: () => void;\n showHeader: boolean;\n error: OpenClassroomFlowSettingsError;\n}\n\nexport function OpenClassroomFlowSettings(props: OpenClassroomFlowSettingsProps): JSX.Element {\n const respectRatingText = ShareLinkHelper.getRespectRatingText(\n props.entity,\n props.yearGroups,\n props.hasStudentExp\n );\n \n return (\n <div className='d-flex flex-column gap-4'>\n {props.showHeader &&\n <OpenClassroomFlowInfoHeader onClose={props.closeHeader} />\n }\n \n <FlowSettings>\n <FlowSettings.Input\n title={getPhrase('openClassroomNameTitle')}\n className='col-lg-6'\n value={props.openClassroomName}\n onChange={props.onChangeOpenClassroomName}\n placeholder={getPhrase('openClassroomNamePlaceholder')}\n error={props.error.name}\n />\n </FlowSettings>\n \n <FlowSettings.Divider hide={props.hidePreventScrubbing && props.hideImmediateFeedback} />\n \n <FlowSettings\n name={getPhrase('videoSettingsTitle')}\n hide={props.hidePreventScrubbing && props.hideImmediateFeedback}\n >\n <FlowSettings.Toggle\n hide={props.hidePreventScrubbing}\n title={getPhrase('preventScrubbingTitle')}\n description={getPhrase('preventScrubbingDescription')}\n onClick={props.onTogglePreventScrubbing}\n toggled={props.preventScrubbing}\n disabled={props.disablePreventScrubbing}\n />\n <FlowSettings.Toggle\n hide={props.hideImmediateFeedback}\n title={getPhrase('immediateFeedbackTitle')}\n description={getPhrase('immediateFeedbackDescription')}\n onClick={props.onToggleImmediateFeedback}\n toggled={props.immediateFeedback}\n disabled={props.disableImmediateFeedback}\n />\n </FlowSettings>\n\n <FlowSettings.Divider hide={props.hideRequiresStudentSignIn && props.hideRespectRatingsAndRestrictions} />\n\n <FlowSettings\n name={getPhrase('studentAccessTitle')}\n hide={props.hideRequiresStudentSignIn && props.hideRespectRatingsAndRestrictions}\n >\n <FlowSettings.Toggle\n hide={props.hideRequiresStudentSignIn}\n title={getPhrase('requiresStudentSignInTitle')}\n description={getPhrase('requiresStudentSignInDescription')}\n onClick={props.onToggleRequiresStudentSignIn}\n toggled={props.toggleRequiresStudentSignIn}\n disabled={props.disableRequiresStudentSignIn}\n />\n <FlowSettings.Toggle\n hide={props.hideRespectRatingsAndRestrictions}\n title={getPhrase('respectRatingsAndRestrictionsTitle')}\n description={respectRatingText}\n onClick={props.onToggleRespectRatingsAndRestrictions}\n toggled={props.toggleRespectRatingsAndRestrictions}\n disabled={props.disableRespectRatingsAndRestrictions}\n />\n </FlowSettings>\n \n <FlowSettings.Divider hide={\n (props.hideRequiresStudentSignIn && props.hideRespectRatingsAndRestrictions)\n || props.hideMessage}\n />\n \n <FlowSettings\n name={getPhrase('moreOptionsTitle')}\n hide={props.hideMessage}\n childContainerClassName='d-flex flex-column gap-2'\n >\n <FlowSettings.Toggle\n hide={props.hideMessage}\n title={getPhrase('messageTitle')}\n description={getPhrase('messageDescription')}\n onClick={props.onToggleMessage}\n toggled={props.toggleMessage}\n disabled={props.disableMessage}\n >\n <FlowSettings.TextArea\n hide={!props.toggleMessage}\n placeholder={getPhrase('messagePlaceholder')}\n onChange={props.onChangeMessage}\n value={props.message}\n />\n </FlowSettings.Toggle>\n </FlowSettings>\n \n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { StorageType } from 'libs/common/backbone/utils/LocalStorageHelper';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { useCreateShare } from 'libs/shared/apps/share-v2/hooks/useCreateShare';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { SharableEntityType } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { YearGroup } from 'libs/shared/interfaces';\n\nimport { useAssignSharedData } from 'apps/assign/hooks/useAssignSharedData';\n\nconst namespace = 'assign.useOpenClassroomFlowData';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface UseOpenClassroomFlowDataOptions {\n objectId: string;\n entityType: SharableEntityType;\n}\n\ntype OpenClassroomFlowSettings = 'preventScrubbing' | 'immediateFeedback' | 'requiresStudentSignIn' | 'respectRatingsAndRestrictions' | 'message';\ntype OpenClassroomFlowSettingsMap = {[key in OpenClassroomFlowSettings]: boolean};\nexport type OpenClassroomFlowSettingsError = {\n name?: string\n};\n\nconst initialSettings: OpenClassroomFlowSettingsMap = {\n immediateFeedback: false,\n preventScrubbing: false,\n message: false,\n requiresStudentSignIn: false,\n respectRatingsAndRestrictions: false\n};\n\nconst MAX_OPEN_CLASSROOM_NAME_LENGTH = 128;\n\nconst VIEW_MODEL_KEY = 'assign:open:classroom:flow:settings:header';\n\nexport function useOpenClassroomFlowSettingsData(options: UseOpenClassroomFlowDataOptions) {\n const alert = useAlerts();\n\n /**\n * We store this in Local storage so that if they user deliberatly\n * closes this we dont show this again\n */\n const [ showHeader, setShowHeader ] = useViewModel(VIEW_MODEL_KEY, true, { storage: StorageType.LocalStorage });\n \n const sharedData = useAssignSharedData({\n entityType: options.entityType,\n objectId: options.objectId\n });\n\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n CustomerRequests.yearGroups(sharedData.currentUser.data?.customerId)\n );\n\n const { createOpenSession } = useCreateShare(options.objectId);\n \n const [ settings, setSettings ] = React.useState<OpenClassroomFlowSettingsMap>({\n ...initialSettings,\n preventScrubbing: sharedData.interactive.data?.preventScrubbing || false,\n immediateFeedback: sharedData.interactive.data?.immediateFeedback || false\n });\n const [ name, setName ] = React.useState('');\n const [ message, setMessage ] = React.useState('');\n const [ loading, setLoading ] = React.useState(false);\n const [ error, setError ] = React.useState<OpenClassroomFlowSettingsError>({});\n\n const isValid = Object.keys(error).length === 0;\n\n function onChangeSetting(setting: OpenClassroomFlowSettings, value: boolean) {\n const newSettings: Partial<OpenClassroomFlowSettingsMap> = {\n [setting]: value\n };\n /*\n * If respect ratings and restrictions is toggled\n * we always toggle requires student sign in option too\n * - Nish\n */\n if (setting === 'respectRatingsAndRestrictions') {\n newSettings['requiresStudentSignIn'] = value;\n }\n \n setSettings(prev => ({\n ...prev,\n ...newSettings\n }));\n }\n\n async function onShare(onSuccess?: (share: Share) => void) {\n if (!isValid) {\n return;\n }\n\n setLoading(true);\n try {\n const share = await createOpenSession({\n name,\n objectId: options.objectId,\n immediateFeedback: settings.immediateFeedback,\n preventScrubbing: settings.preventScrubbing,\n requireSignIn: settings.requiresStudentSignIn,\n respectRatingsAndRestrictions: settings.respectRatingsAndRestrictions\n });\n\n typeof onSuccess === 'function' && onSuccess(share);\n \n setLoading(false);\n } catch (ex: unknown) {\n alert.error(getPhrase('createError'));\n } finally {\n setLoading(false);\n }\n }\n\n function toggleSetting(setting: OpenClassroomFlowSettings) {\n onChangeSetting(setting, !settings[setting]);\n }\n\n function setOpenClassroomName(name: string) {\n if (name.length > MAX_OPEN_CLASSROOM_NAME_LENGTH) {\n setError(prev => ({\n ...prev,\n name: getPhrase('errorNameTooLong')\n }));\n } else {\n setError(prev => {\n delete prev.name;\n return prev;\n });\n }\n setName(name);\n }\n\n const loaded = sharedData.loaded\n && !!yearGroups.data;\n\n return {\n data: {\n loaded,\n entity: sharedData.entity,\n yearGroups: yearGroups\n },\n showHeader,\n hasStudentExp: sharedData.hasStudentExp,\n shouldShowSpinner: loading,\n nextButtonText: getPhrase('nextButton'),\n name,\n message,\n settings,\n setMessage,\n setShowHeader,\n toggleSetting,\n setOpenClassroomName,\n onShare,\n error,\n setError,\n isValid,\n openClassroomGatedPermission: sharedData.openClassroomGatedPermission\n };\n}","import React from 'react';\nimport { Modal } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { SharableEntityType } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { MultiStepPopupViewProps } from 'libs/shared/components/multistep-popup/MultiStepPopup';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PremiumBadge } from 'libs/shared/components/premium-badge/PremiumBadge';\n\nimport { useClassroomExperience } from 'shared/hooks/useClassroomExperience';\n\nimport { FlowControls } from 'apps/assign/components/flow-controls/FlowControls';\nimport { getAssignEventLogger } from 'apps/assign/utils/get-assign-event-logger/getAssignEventLogger';\n\nimport { OpenClassroomFlowSettings } from './components/open-classroom-flow-settings/OpenClassroomFlowSettings';\nimport { useOpenClassroomFlowSettingsData } from './hooks/use-open-classroom-flow-settings-data/useOpenClassroomFlowSettingsData';\n\nconst namespace = 'assign.openClassroomFlowSettingsView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface OpenClassroomFlowSettingsViewProps extends MultiStepPopupViewProps {\n objectId: string;\n entityType: SharableEntityType;\n\n setShare: (share: Share) => void;\n goToFlowSelector: () => void;\n goToAssignDetails: () => void;\n hideBackButton?: boolean;\n}\n\nexport function OpenClassroomFlowSettingsView(props: OpenClassroomFlowSettingsViewProps): JSX.Element {\n const viewModel = useOpenClassroomFlowSettingsData({\n entityType: props.entityType,\n objectId: props.objectId\n });\n\n const { experience, loading: isLoadingExperience } = useClassroomExperience();\n\n const {\n loaded,\n entity,\n yearGroups\n } = viewModel.data;\n\n const { log } = getAssignEventLogger({\n data: {\n entity: {\n id: props.objectId,\n type: props.entityType\n }\n },\n analyticsOptions: {\n location: LocationContext.Popup\n }\n });\n\n function onClickNext() {\n viewModel.onShare(share => {\n // Create event is logged for EventAggregator to send emails - Sha\n log({\n type: 'create-open-classroom',\n share\n });\n // Share event is logged for continuity with the V1 share analytics - Sha\n log({\n type: 'share-open-classroom',\n id: share.objectId,\n shareId: share.shareId,\n shareType: share.type\n });\n \n props.setShare(share);\n props.goToAssignDetails();\n });\n }\n\n const loading = !loaded || isLoadingExperience || props.loading;\n\n return (\n <Popup\n size='lg'\n title={getPhrase('title')}\n showLoadingSpinner={loading}\n closePopup={props.closePopup}\n bodyClassName='d-flex flex-column gap-3'\n animation={props.animate}\n hideTitle={viewModel.openClassroomGatedPermission === 'soft-gate'}\n >\n {viewModel.openClassroomGatedPermission === 'soft-gate' &&\n <Modal.Header className='d-flex align-items-center justify-content-between bg-white mx-n3 mt-n3 mb-3' closeButton>\n <Modal.Title as='h2' className='h4 flex-grow-1 d-flex justify-content-between align-items-center'>\n {getPhrase('title')}\n <span className='d-inline-block me-2'><PremiumBadge size='std' /></span>\n </Modal.Title>\n </Modal.Header>\n }\n <OpenClassroomFlowSettings\n entity={entity.data}\n error={viewModel.error}\n showHeader={viewModel.showHeader}\n openClassroomName={viewModel.name}\n onChangeOpenClassroomName={viewModel.setOpenClassroomName}\n message={viewModel.message}\n yearGroups={yearGroups.data}\n hasStudentExp={viewModel.hasStudentExp}\n toggleMessage={viewModel.settings.message}\n immediateFeedback={viewModel.settings.immediateFeedback}\n preventScrubbing={viewModel.settings.preventScrubbing}\n toggleRequiresStudentSignIn={viewModel.settings.requiresStudentSignIn}\n toggleRespectRatingsAndRestrictions={viewModel.settings.respectRatingsAndRestrictions}\n hideMessage={true} // Message field does nothing atm for open classroom\n onChangeMessage={viewModel.setMessage}\n onToggleMessage={() => viewModel.toggleSetting('message')}\n hidePreventScrubbing={props.entityType !== 'interactive'}\n hideImmediateFeedback={props.entityType !== 'interactive'}\n hideRequiresStudentSignIn={experience !== 'full'}\n hideRespectRatingsAndRestrictions={experience !== 'full'}\n onTogglePreventScrubbing={() => viewModel.toggleSetting('preventScrubbing')}\n onToggleImmediateFeedback={() => viewModel.toggleSetting('immediateFeedback')}\n onToggleRequiresStudentSignIn={() => viewModel.toggleSetting('requiresStudentSignIn')}\n onToggleRespectRatingsAndRestrictions={() => viewModel.toggleSetting('respectRatingsAndRestrictions')}\n closeHeader={() => viewModel.setShowHeader(false)}\n disableRequiresStudentSignIn={viewModel.settings.respectRatingsAndRestrictions}\n />\n <FlowControls\n hideCreateClassroomButton\n hideBackButton={props.hideBackButton || viewModel.openClassroomGatedPermission === 'soft-gate'}\n onClickBack={props.goToFlowSelector}\n onClickNext={onClickNext}\n nextButtonText={viewModel.nextButtonText}\n showSpinner={viewModel.shouldShowSpinner}\n disableNextButton={!viewModel.isValid}\n />\n </Popup>\n );\n}","import React from 'react';\n\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { SharableEntityType } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { MultiStepPopup, MultiStepPopupViewProps } from 'libs/shared/components/multistep-popup/MultiStepPopup';\n\nimport { OpenClassroomFlowSteps } from 'apps/assign/interfaces/Assign';\nimport { HardGateOpenClassroomView } from 'apps/assign/views/hard-gate-open-classroom-view/HardGateOpenClassroomView';\n\nimport { AssignDetailsView, AssignDetailsViewProps } from '../assign-details-view/AssignDetailsView';\nimport { OpenClassroomFlowSettingsView, OpenClassroomFlowSettingsViewProps } from '../open-classroom-flow-settings-view/OpenClassroomFlowSettingsView';\n\ntype AllOpenClassroomFlowViewProps =\n & OpenClassroomFlowSettingsViewProps\n & AssignDetailsViewProps;\nexport interface OpenClassroomFlowViewProps extends MultiStepPopupViewProps {\n objectId: string;\n entityType: SharableEntityType;\n goToFlowSelector: () => void;\n openClassroomInitialStep: 'settings' | 'hard-gate';\n isEntry?: boolean;\n}\n\nexport function OpenClassroomFlowView(props: OpenClassroomFlowViewProps): JSX.Element {\n const [ flowStep, setFlowStep ] = React.useState<OpenClassroomFlowSteps>(props.openClassroomInitialStep);\n const [ share, setShare ] = React.useState<Share>();\n\n const data: AllOpenClassroomFlowViewProps = {\n objectId: props.objectId,\n entityType: props.entityType,\n closePopup: props.closePopup,\n goToFlowSelector: props.goToFlowSelector,\n \n shareId: share?.shareId,\n initialDetailsScreen: 'share-link',\n goToAssignDetails: () => setFlowStep('assign-details'),\n setShare\n };\n\n return (\n <MultiStepPopup<AllOpenClassroomFlowViewProps, OpenClassroomFlowSteps>\n data={data}\n animate={false}\n step={flowStep}\n setStep={setFlowStep}\n closePopup={props.closePopup}\n steps={{\n 'settings': { view: OpenClassroomFlowSettingsView },\n 'assign-details': { view: AssignDetailsView },\n 'hard-gate': { view: HardGateOpenClassroomView }\n }}\n />\n );\n}","import React from 'react';\nimport { Modal, Row } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType, LocationContext, SignUpDescriptors, UserAction } from 'libs/analytics/interfaces';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { MultiStepPopupViewProps } from 'libs/shared/components/multistep-popup/MultiStepPopup';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PremiumBadge } from 'libs/shared/components/premium-badge/PremiumBadge';\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'shared.hardGatePopup';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ntype Feature = 'assign' | 'playlists' | 'interactive' | 'copy-interactives' | 'integrations';\n\ninterface FeatureConfig {\n titlePhrase: string;\n headingPhrase: string;\n imageUrl: string;\n}\n\nconst featureConfigMap: Record<Feature, FeatureConfig> = {\n 'assign': {\n titlePhrase: 'assignTitle',\n headingPhrase: 'assignHeading',\n imageUrl: ImageUrls.ReverseTrial.ASSIGN\n },\n 'playlists': {\n titlePhrase: 'playlistsTitle',\n headingPhrase: 'playlistsHeading',\n imageUrl: ImageUrls.ReverseTrial.PLAYLIST\n },\n 'interactive': {\n titlePhrase: 'interactiveTitle',\n headingPhrase: 'interactiveHeading',\n imageUrl: ImageUrls.ReverseTrial.INTERACTIVE\n },\n 'copy-interactives': {\n titlePhrase: 'copyInteractiveTitle',\n headingPhrase: 'copyInteractiveHeading',\n imageUrl: ImageUrls.ReverseTrial.INTERACTIVE\n },\n 'integrations': {\n titlePhrase: 'integrationsTitle',\n headingPhrase: 'integrationsHeading',\n imageUrl: ImageUrls.ReverseTrial.INTEGRATIONS\n }\n};\n\nexport interface HardGatePopupProps extends MultiStepPopupViewProps {\n feature: Feature;\n extraContent?: React.ReactNode;\n}\n\nexport function HardGatePopup(props: HardGatePopupProps): JSX.Element {\n const config = featureConfigMap[props.feature];\n\n return (\n <Popup\n size='lg'\n animation={props.animate}\n closePopup={props.closePopup}\n hideTitle\n >\n <Modal.Header className='d-flex align-items-center justify-content-between bg-white mx-n3 mt-n3' closeButton>\n <Modal.Title as='h2' className='h4 flex-grow-1 d-flex justify-content-between align-items-center'>\n {getPhrase(config.titlePhrase)}\n <span className='d-inline-block me-2'><PremiumBadge size='std' /></span>\n </Modal.Title>\n </Modal.Header>\n <Row className='mb-3'>\n <EmptyState className='pt-3'>\n <EmptyState.Image src={config.imageUrl} altText={getPhrase(config.titlePhrase)} />\n <EmptyState.Heading className='h6'>\n <Text namespace={namespace} phrase={config.headingPhrase} />\n </EmptyState.Heading>\n <EmptyState.Info>\n <Text namespace={namespace} phrase='description' />\n </EmptyState.Info>\n <EmptyState.Cta\n appLink={{\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.INVITE_COLLEAGUE\n }}\n text={getPhrase('cta')}\n analyticsData={{}}\n analyticsOptions={{\n actionType: UserAction.Click,\n location: LocationContext.GatedPopup,\n entity: EntityType.AppLink,\n descriptor: SignUpDescriptors.PremiumFeatures\n }}\n />\n </EmptyState>\n </Row>\n \n {props.extraContent}\n </Popup>\n );\n}\n\n"],"names":["getPhrase","ShareLinkHelper","getPrivateIconAndText","options","entityTypeId","privacy","hasStudentExp","entity","yearGroups","icon","text","Array","isArray","getRespectRatingText","getIconAndText","linkExpireDate","isPasswordProtected","status","isToday","dayDifference","Date","days","video","restriction","_restrictions","value","yearGroup","maxYearGroup","minAllowedYearGroup","rating","length","name","getShareLinkAccessType","isTvContent","isClickViewContent","canManageAccess","namespace","PremiumBadge","props","className","size","invert","svgName","S","phrase","HardGateOpenClassroomView","HardGatePopup","feature","animate","closePopup","extraContent","FlowControls","onClickBack","goToFlowSelector","hideNextButton","hideCreateClassroomButton","OpenClassroomFlowInfoHeader","IconCircle","svgSize","SvgContainer","variant","textVariant","svgWrapperClassName","Text","IconButton","onClick","onClose","LanguageService","OpenClassroomFlowSettings","respectRatingText","showHeader","closeHeader","FlowSettings","title","openClassroomName","onChange","onChangeOpenClassroomName","placeholder","error","hide","hidePreventScrubbing","hideImmediateFeedback","description","onTogglePreventScrubbing","toggled","preventScrubbing","disabled","disablePreventScrubbing","onToggleImmediateFeedback","immediateFeedback","disableImmediateFeedback","hideRequiresStudentSignIn","hideRespectRatingsAndRestrictions","onToggleRequiresStudentSignIn","toggleRequiresStudentSignIn","disableRequiresStudentSignIn","onToggleRespectRatingsAndRestrictions","toggleRespectRatingsAndRestrictions","disableRespectRatingsAndRestrictions","hideMessage","childContainerClassName","onToggleMessage","toggleMessage","disableMessage","onChangeMessage","message","initialSettings","requiresStudentSignIn","respectRatingsAndRestrictions","MAX_OPEN_CLASSROOM_NAME_LENGTH","VIEW_MODEL_KEY","useOpenClassroomFlowSettingsData","alert","storage","setShowHeader","sharedData","useAssignSharedData","entityType","objectId","CustomerRequests","currentUser","data","customerId","createOpenSession","useCreateShare","interactive","settings","setSettings","setName","setMessage","loading","setLoading","setError","isValid","Object","keys","loaded","shouldShowSpinner","nextButtonText","toggleSetting","setting","newSettings","prev","onChangeSetting","setOpenClassroomName","onShare","onSuccess","requireSignIn","share","openClassroomGatedPermission","OpenClassroomFlowSettingsView","viewModel","useClassroomExperience","experience","isLoadingExperience","log","getAssignEventLogger","id","type","analyticsOptions","location","Popup","showLoadingSpinner","bodyClassName","animation","hideTitle","Modal","closeButton","as","hideBackButton","onClickNext","shareId","shareType","setShare","goToAssignDetails","showSpinner","disableNextButton","OpenClassroomFlowView","openClassroomInitialStep","flowStep","setFlowStep","initialDetailsScreen","MultiStepPopup","step","setStep","steps","view","AssignDetailsView","featureConfigMap","titlePhrase","headingPhrase","imageUrl","config","src","altText","appLink","application","action","analyticsData","actionType","descriptor"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[4525],{8375:(e,a,t)=>{t.r(a),t.d(a,{HardGateInsightsView:()=>U});var s=t(32735),i=t(23481),r=t(20354),n=t(18488),c=t(21789),l=t(97958),d=t(16714),h=t(39151),o=t(1666),p=t(31949),m=t(93322),u=t(22902),g=t(79612),y=t(31908),E=t(47430),P=t(14070),I=t(97291),C=t(88630),v=t(9540),S=t(10447),T=i.T.encloseNamespace("insights.hardGateInsights");function U(e){var a,t;(0,m.F)();var i=(0,u.T)(),U=i.hasPermissions,V=i.getGatedPermission,b=r.a.useBasicFetch(h.L.config()),k=r.a.useBasicFetch(p.N.currentUser()),_=r.a.useBasicFetch(k.data&&o.h.yearGroups(k.data.customerId)),f=r.a.useBasicFetch(n.o.getShare(e.shareId)),w=c.x.getClassroomIdFromShare(f.data),F=r.a.useBasicFetch(w&&C.F.getClassroom(w)),L=f.data&&y.M.getVideoRequest(f.data.objectId,f.data.objectTypeId),N=r.a.useBasicFetch(L);return(0,g.M)({title:N.data?T("pageTitle",{video:null===(a=N.data)||void 0===a?void 0:a.name}):null}),s.createElement("div",{className:"px-3"},s.createElement(v.j,{video:N.data,classroom:F.data,tabs:(0,S.$6)(f.data,"insights"),hasAnalytics:U(d.C.ViewCustomerAnalytics),analyticsWebUrl:null===(t=b.data)||void 0===t?void 0:t.analyticsWebUrl,share:f.data,yearGroups:_.data,hasData:!1,viewInsightsGatedPermission:V(d.C.ViewInsights)}),s.createElement(E.f,{feature:"insights",extraCta:s.createElement(l.u.Cta,{text:T("viewData"),appLink:{application:I.O.MY_SHARES,action:P.e.MyShares.INTERACTIVE_OVERVIEW_DEMO},className:"btn btn-link text-info py-0"})}))}},47430:(e,a,t)=>{t.d(a,{f:()=>u});var s=t(32735),i=t(23481),r=t(65858),n=t(97958),c=t(83345),l=t(99742),d=t(14070),h=t(97291),o="shared.hardGateEmptyState",p=i.T.encloseNamespace(o),m={insights:{headingPhrase:"insightsHeading",descriptionPhrase:"insightsDescription",ctaPhrase:"insightsCta",imageUrl:l.W.ReverseTrial.INTERACTIVE},"my-videos":{headingPhrase:"myVideosHeading",descriptionPhrase:"myVideosDescription",ctaPhrase:"myVideosCta",imageUrl:l.W.EmptyStates.MY_VIDEOS_PUBLIC},playlists:{headingPhrase:"playlistsHeading",descriptionPhrase:"playlistsDescription",ctaPhrase:"playlistsCta",imageUrl:l.W.EmptyStates.Playlists.PLAYLISTS_PUBLIC},clip:{headingPhrase:"clipHeading",descriptionPhrase:"clipDescription",ctaPhrase:"clipCta",imageUrl:l.W.ReverseTrial.CLIP}};function u(e){var a=m[e.feature];return s.createElement(n.u,null,s.createElement(n.u.Image,{src:a.imageUrl}),s.createElement(n.u.Heading,null,s.createElement(c.x,{namespace:o,phrase:a.headingPhrase})),s.createElement(n.u.Info,{className:"w-75"},s.createElement(c.x,{namespace:o,phrase:a.descriptionPhrase})," "),s.createElement(n.u.Cta,{text:p(a.ctaPhrase),appLink:{application:h.O.SIGN_UP,action:d.e.SignUp.PREMIUM_FEATURES},analyticsData:{},analyticsOptions:{actionType:r.Vw.Click,location:r.LZ.GatedEmptyState,entity:r.py.AppLink,descriptor:r.Yu.PremiumFeatures},className:"btn btn-dark mb-3"}),e.extraCta)}}}]);
2
+ //# sourceMappingURL=4525-2ade147f5d-lite.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/4525-2ade147f5d-lite.chunk.js","mappings":"2XA4BMA,EAAY,qBADA,6BAOZ,SAAUC,EAAqBC,G,SACnC,SAEA,OAA+C,SAAvCC,EAAc,EAAdA,eAAgBC,EAAkB,EAAlBA,mBAElBC,EAAS,kBAA6B,cACtCC,EAAc,kBAAkC,mBAChDC,EAAa,kBACjBD,EAAYE,MAAQ,eAA4BF,EAAYE,KAAKC,aAG7DC,EAAQ,kBAA4B,aAAuBR,EAAMS,UAEjEC,EAAc,4BAAoCF,EAAMF,MACxDK,EAAY,kBAAgCD,GAAe,iBAA+BA,IAE1FE,EAAeJ,EAAMF,MAAQ,oBAA4BE,EAAMF,KAAKO,SAAUL,EAAMF,KAAKQ,cACzFC,EAAQ,kBAAiCH,GAI/C,OAFA,OAAmB,CAAEI,MAAOD,EAAMT,KAAOR,EAAU,YAAa,CAAEiB,MAAiB,QAAV,EAAAA,EAAMT,YAAI,eAAEW,OAAU,OAG7F,uBAAKC,UAAU,QACb,gBAAC,IAAc,CACbH,MAAOA,EAAMT,KACbK,UAAWA,EAAUL,KACrBa,MAAM,QAAqBX,EAAMF,KAAM,YACvCc,aAAcnB,EAAe,2BAC7BoB,gBAA4B,QAAX,EAAAlB,EAAOG,YAAI,eAAEe,gBAC9Bb,MAAOA,EAAMF,KACbD,WAAYA,EAAWC,KACvBgB,SAAS,EACTC,4BAA6BrB,EAAmB,oBAElD,gBAAC,IAAkB,CACjBsB,QAAQ,WACRC,SACE,gBAAC,QAAc,CACbC,KAAM5B,EAAU,YAChB6B,QAAS,CACPC,YAAa,cACbC,OAAQ,wCAEVX,UAAU,kCAMtB,C,+HCtEMY,EAAY,4BACZhC,EAAY,qBAAiCgC,GAW7CC,EAAmD,CACvD,SAAY,CACVC,cAAe,kBACfC,kBAAmB,sBACnBC,UAAW,cACXC,SAAU,8BAEZ,YAAa,CACXH,cAAe,kBACfC,kBAAmB,sBACnBC,UAAW,cACXC,SAAU,kCAEZ,UAAa,CACXH,cAAe,mBACfC,kBAAmB,uBACnBC,UAAW,eACXC,SAAU,4CAEZ,KAAQ,CACNH,cAAe,cACfC,kBAAmB,kBACnBC,UAAW,UACXC,SAAU,wBASR,SAAUC,EAAmBpC,GACjC,IAAMG,EAAS4B,EAAiB/B,EAAMwB,SAEtC,OACE,gBAAC,IAAU,KACT,gBAAC,UAAgB,CAACa,IAAKlC,EAAOgC,WAC9B,gBAAC,YAAkB,KACjB,gBAAC,IAAI,CAACL,UAAWA,EAAWQ,OAAQnC,EAAO6B,iBAE7C,gBAAC,SAAe,CAACd,UAAU,QACzB,gBAAC,IAAI,CAACY,UAAWA,EAAWQ,OAAQnC,EAAO8B,oBAAqB,KAElE,gBAAC,QAAc,CACbP,KAAM5B,EAAUK,EAAO+B,WACvBP,QAAS,CACPC,YAAa,YACbC,OAAQ,6BAEVU,cAAe,CAAC,EAChBC,iBAAkB,CAChBC,WAAY,WACZC,SAAU,qBACVC,OAAQ,aACRC,WAAY,sBAEd1B,UAAU,sBAEXlB,EAAMyB,SAGb,C","sources":["file:///app/packages/projects/lite/src/apps/my-shares/views/hard-gate-insights/HardGateInsightsView.tsx","file:///app/packages/projects/lite/src/shared/components/hard-gate-empty-state/HardGateEmptyState.tsx"],"sourcesContent":["import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { ShareRequests } from 'libs/shared/apps/share-v2/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { ShareHelper } from 'libs/shared/apps/share-v2/utils/ShareHelper';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useLockContentWidth } from 'libs/shared/hooks/useLockContentWidth';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Classroom, Config, CurrentUser, VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { HardGateEmptyState } from 'shared/components/hard-gate-empty-state/HardGateEmptyState';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { InsightsHeader } from 'apps/my-shares/components/insights-header/InsightsHeader';\nimport { getInsightsVideoTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\n\nconst namespace = 'insights.hardGateInsights';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface HardGateInsightsViewProps {\n shareId: string;\n}\n\nexport function HardGateInsightsView(props: HardGateInsightsViewProps) {\n useLockContentWidth();\n\n const { hasPermissions, getGatedPermission } = usePermissions();\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const share = Flight.useBasicFetch<Share>(ShareRequests.getShare(props.shareId));\n\n const classroomId = ShareHelper.getClassroomIdFromShare(share.data);\n const classroom = Flight.useBasicFetch<Classroom>(classroomId && ClassroomRequests.getClassroom(classroomId));\n\n const videoRequest = share.data && VideoHelper.getVideoRequest(share.data.objectId, share.data.objectTypeId);\n const video = Flight.useBasicFetch<VideoTypes>(videoRequest);\n\n useSetPageMetadata({ title: video.data ? getPhrase('pageTitle', { video: video.data?.name }) : null });\n\n return (\n <div className='px-3'>\n <InsightsHeader\n video={video.data}\n classroom={classroom.data}\n tabs={getInsightsVideoTabs(share.data, 'insights')}\n hasAnalytics={hasPermissions(PermissionName.ViewCustomerAnalytics)}\n analyticsWebUrl={config.data?.analyticsWebUrl}\n share={share.data}\n yearGroups={yearGroups.data}\n hasData={false}\n viewInsightsGatedPermission={getGatedPermission(PermissionName.ViewInsights)}\n />\n <HardGateEmptyState\n feature='insights'\n extraCta={(\n <EmptyState.Cta\n text={getPhrase('viewData')}\n appLink={{\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_OVERVIEW_DEMO\n }}\n className='btn btn-link text-info py-0'\n />\n )}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType, LocationContext, SignUpDescriptors, UserAction } from 'libs/analytics/interfaces';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'shared.hardGateEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ntype Feature = 'insights' | 'my-videos' | 'playlists' | 'clip';\n\ninterface FeatureConfig {\n headingPhrase: string;\n descriptionPhrase: string;\n ctaPhrase: string;\n imageUrl: string;\n}\n\nconst featureConfigMap: Record<Feature, FeatureConfig> = {\n 'insights': {\n headingPhrase: 'insightsHeading',\n descriptionPhrase: 'insightsDescription',\n ctaPhrase: 'insightsCta',\n imageUrl: ImageUrls.ReverseTrial.INTERACTIVE\n },\n 'my-videos': {\n headingPhrase: 'myVideosHeading',\n descriptionPhrase: 'myVideosDescription',\n ctaPhrase: 'myVideosCta',\n imageUrl: ImageUrls.EmptyStates.MY_VIDEOS_PUBLIC\n },\n 'playlists': {\n headingPhrase: 'playlistsHeading',\n descriptionPhrase: 'playlistsDescription',\n ctaPhrase: 'playlistsCta',\n imageUrl: ImageUrls.EmptyStates.Playlists.PLAYLISTS_PUBLIC\n },\n 'clip': {\n headingPhrase: 'clipHeading',\n descriptionPhrase: 'clipDescription',\n ctaPhrase: 'clipCta',\n imageUrl: ImageUrls.ReverseTrial.CLIP\n }\n};\n\ninterface HardGateEmptyStateProps {\n feature: Feature;\n extraCta?: React.ReactNode;\n}\n\nexport function HardGateEmptyState(props: HardGateEmptyStateProps) {\n const config = featureConfigMap[props.feature];\n\n return (\n <EmptyState>\n <EmptyState.Image src={config.imageUrl} />\n <EmptyState.Heading>\n <Text namespace={namespace} phrase={config.headingPhrase} />\n </EmptyState.Heading>\n <EmptyState.Info className='w-75'>\n <Text namespace={namespace} phrase={config.descriptionPhrase} />&nbsp;\n </EmptyState.Info>\n <EmptyState.Cta\n text={getPhrase(config.ctaPhrase)}\n appLink={{\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.PREMIUM_FEATURES\n }}\n analyticsData={{}}\n analyticsOptions={{\n actionType: UserAction.Click,\n location: LocationContext.GatedEmptyState,\n entity: EntityType.AppLink,\n descriptor: SignUpDescriptors.PremiumFeatures\n }}\n className='btn btn-dark mb-3'\n />\n {props.extraCta}\n </EmptyState>\n );\n}\n\n"],"names":["getPhrase","HardGateInsightsView","props","hasPermissions","getGatedPermission","config","currentUser","yearGroups","data","customerId","share","shareId","classroomId","classroom","videoRequest","objectId","objectTypeId","video","title","name","className","tabs","hasAnalytics","analyticsWebUrl","hasData","viewInsightsGatedPermission","feature","extraCta","text","appLink","application","action","namespace","featureConfigMap","headingPhrase","descriptionPhrase","ctaPhrase","imageUrl","HardGateEmptyState","src","phrase","analyticsData","analyticsOptions","actionType","location","entity","descriptor"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ (self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[4945],{66257:(e,t,n)=>{"use strict";n.d(t,{k:()=>y});var r=n(32735),o=n(80130),a=n(59087),i=n(23481),l=n(31453),c=n(35223),u=n(91693);const s={normal:"Q1UGv",copyBtn:"J3fBx",embedHtmlInput:"RcwAD"};function p(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var f=i.T.encloseNamespace("shared.copyInput");function y(e){var t,n,i=(t=r.useState(e.showCopiedText||!1),n=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,a,i,l=[],c=!0,u=!1;try{if(a=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=a.call(n)).done)&&(l.push(r.value),l.length!==t);c=!0);}catch(e){u=!0,o=e}finally{try{if(!c&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(u)throw o}}return l}}(t,n)||function(e,t){if(e){if("string"==typeof e)return p(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?p(e,t):void 0}}(t,n)||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.")}()),y=i[0],d=i[1];function m(){setTimeout(function(){return d(!1)},2e3)}function v(){e.onCopy&&e.onCopy(),y||(d(!0),m())}r.useEffect(function(){e.showCopiedText&&m()},[e.showCopiedText]);var b=r.createElement("div",{className:"normal-v2"===e.styling?"d-flex flex-row gap-2 position-relative w-100":"input-group"},e.textarea?r.createElement("textarea",{className:(0,l.A)("form-control rounded w-100 h-100",!e.hasInputBg&&s.embedHtmlInput,e.textAreaClassName),spellCheck:!1,value:e.value,rows:e.rows||7,readOnly:!0}):r.createElement("input",{type:"text",autoComplete:"off",className:(0,l.A)("form-control","normal"===e.styling&&e.styling),spellCheck:!1,value:e.value,readOnly:!0}),r.createElement(function(){return"normal-v2"===e.styling?r.createElement(a.CopyToClipboard,{text:e.value,onCopy:v},r.createElement(u.h,{role:y?"status":"",svgName:y?c.vn.Check:c.vn.Copy,className:(0,l.A)(s.copyBtn,"btn py-0 text-nowrap",y?"btn-success text-white":"btn-outline-dark border-secondary",e.extraButtonClassNames)},y?e.copiedText||f("copiedLink"):e.copyText||f("copy"))):r.createElement(a.CopyToClipboard,{text:e.value,onCopy:v},r.createElement("button",{role:y?"status":"",className:(0,l.A)("btn btn-outline-dark border border-secondary py-0 text-nowrap",e.extraButtonClassNames)},y?e.copiedText||f("copied"):e.copyText||f("copy")))},null));return e.label?r.createElement(o.Z.Group,{className:"form-group"},r.createElement(o.Z.Label,null,e.label),b):b}y.defaultProps={styling:"normal"}},72183:(e,t,n)=>{"use strict";n.d(t,{P:()=>o});var r=n(99940),o={invite:function(e){return{url:"{gateway}/v1/users/invites",key:"invites:colleague",normalize:!1,type:r.k.POST,data:e,invalidationKeys:["invites"]}},inviteByType:function(){return{key:"invites",url:"{gateway}/v1/users/invites?type=link&type=direct",normalize:!1}},deleteInvite:function(e){return{key:"invites:delete",url:"{gateway}/v1/users/invites/".concat(e),type:r.k.DELETE,normalize:!1,invalidationKeys:["invites"]}},resendInvite:function(e){return{key:"invites:".concat(e,":resend"),url:"{gateway}/v1/users/invites/email?id=".concat(e),type:r.k.POST,normalize:!1}},createInviteLink:function(){return{key:"invites:create",url:"{gateway}/v1/users/invites/links",type:r.k.POST,normalize:!1,invalidationKeys:["invites"]}}}},64945:(e,t,n)=>{"use strict";n.r(t),n.d(t,{EmailRecommendationPopupView:()=>w});var r=n(32735),o=n(81886),a=n(23481),i=n(20354),l=n(31453),c=n(49985),u=n(65858),s=n(66257),p=n(9111),f=n(13876),y=n(83345),d=n(20470),m=n(72183),v=n(43391);const b={copyBtnContainer:"cT8F4"};function h(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var g="signUp.emailRecommendation",C=a.T.encloseNamespace(g);function w(e){var t,n,a=(t=r.useState(!1),n=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,a,i,l=[],c=!0,u=!1;try{if(a=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=a.call(n)).done)&&(l.push(r.value),l.length!==t);c=!0);}catch(e){u=!0,o=e}finally{try{if(!c&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(u)throw o}}return l}}(t,n)||function(e,t){if(e){if("string"==typeof e)return h(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?h(e,t):void 0}}(t,n)||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.")}()),w=a[0],x=a[1],E=i.a.useGetFetchAsync(),k=i.a.useBasicFetch(m.P.inviteByType()),O=(0,v.C)(k.data).links,T=null==O?void 0:O[0];r.useEffect(function(){k.hasCompleted&&!T&&E(m.P.createInviteLink()).catch(function(){return o.Q.Ry.throw(new d.x)})},[k.hasCompleted,T]);var P=C("emailSubject"),j=C("emailBody",{inviteUrl:(null==T?void 0:T.inviteUrl)||""}),S="mailto:?subject=".concat(encodeURIComponent(P),"&body=").concat(encodeURIComponent(j));return r.createElement(y.D.Provider,{value:g},r.createElement(p.G,{title:C("title"),closePopup:e.closePopup,size:"lg",showLoadingSpinner:!T},T&&r.createElement("div",{className:"d-flex flex-column gap-3"},r.createElement("div",null,r.createElement("p",{className:"mb-2"},r.createElement(y.x,{phrase:"description"})),r.createElement("p",{className:"mb-0"},r.createElement(y.x,{phrase:"instructions"}))),r.createElement("div",null,r.createElement("p",{className:"mb-3"},r.createElement(y.x,{phrase:"copyOrEmail"}),r.createElement("a",{href:S,className:"text-info text-decoration-underline",onClick:function(){c.k.logUserAction({},{entity:u.py.User,actionType:u.Vw.Click,descriptor:u._S.OpenRecommendationMailTo,location:u.LZ.PremiumFeatures})}},r.createElement(y.x,{phrase:"openEmailAppLink"}))),r.createElement("div",null,r.createElement(s.k,{value:j,onCopy:function(){x(!0),setTimeout(function(){return x(!1)},2e3),c.k.logUserAction({},{entity:u.py.User,actionType:u.Vw.Click,descriptor:u._S.CopyRecommendationEmail,location:u.LZ.PremiumFeatures})},copiedText:C("copied"),copyText:C("copy"),showCopiedText:w,styling:"normal-v2",extraButtonClassNames:(0,l.A)("position-absolute bottom-0 end-0",b.copyBtnContainer),label:C("emailTemplate"),textarea:!0,rows:22,textAreaClassName:"bg-light"})))),r.createElement(f.u,null,r.createElement(f.u.Cancel,{variant:"link",onClick:e.closePopup,text:C("close")}))))}},43391:(e,t,n)=>{"use strict";n.d(t,{C:()=>a});var r,o=n(32735);function a(e){return o.useMemo(function(){return e?e.reduce(function(e,t){return t.type===r.Direct?(e.directInvites.push(t),e):(e.links.push(t),e)},{directInvites:[],links:[]}):{directInvites:null,links:null}},[e])}!function(e){e.Link="link",e.Direct="direct"}(r||(r={}))},91969:(e,t,n)=>{"use strict";var r=n(47033),o={"text/plain":"Text","text/html":"Url",default:"Text"};e.exports=function(e,t){var n,a,i,l,c,u,s=!1;t||(t={}),n=t.debug||!1;try{if(i=r(),l=document.createRange(),c=document.getSelection(),(u=document.createElement("span")).textContent=e,u.ariaHidden="true",u.style.all="unset",u.style.position="fixed",u.style.top=0,u.style.clip="rect(0, 0, 0, 0)",u.style.whiteSpace="pre",u.style.webkitUserSelect="text",u.style.MozUserSelect="text",u.style.msUserSelect="text",u.style.userSelect="text",u.addEventListener("copy",function(r){if(r.stopPropagation(),t.format)if(r.preventDefault(),void 0===r.clipboardData){n&&console.warn("unable to use e.clipboardData"),n&&console.warn("trying IE specific stuff"),window.clipboardData.clearData();var a=o[t.format]||o.default;window.clipboardData.setData(a,e)}else r.clipboardData.clearData(),r.clipboardData.setData(t.format,e);t.onCopy&&(r.preventDefault(),t.onCopy(r.clipboardData))}),document.body.appendChild(u),l.selectNodeContents(u),c.addRange(l),!document.execCommand("copy"))throw new Error("copy command was unsuccessful");s=!0}catch(r){n&&console.error("unable to copy using execCommand: ",r),n&&console.warn("trying IE specific stuff");try{window.clipboardData.setData(t.format||"text",e),t.onCopy&&t.onCopy(window.clipboardData),s=!0}catch(r){n&&console.error("unable to copy using clipboardData: ",r),n&&console.error("falling back to prompt"),a=function(e){var t=(/mac os x/i.test(navigator.userAgent)?"⌘":"Ctrl")+"+C";return e.replace(/#{\s*key\s*}/g,t)}("message"in t?t.message:"Copy to clipboard: #{key}, Enter"),window.prompt(a,e)}}finally{c&&("function"==typeof c.removeRange?c.removeRange(l):c.removeAllRanges()),u&&document.body.removeChild(u),i()}return s}},44818:(e,t,n)=>{"use strict";function r(e){return r="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},r(e)}Object.defineProperty(t,"__esModule",{value:!0}),t.CopyToClipboard=void 0;var o=l(n(32735)),a=l(n(91969)),i=["text","onCopy","options","children"];function l(e){return e&&e.__esModule?e:{default:e}}function c(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function u(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?c(Object(n),!0).forEach(function(t){d(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):c(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function s(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function p(e,t){return p=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},p(e,t)}function f(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function y(e){return y=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},y(e)}function d(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var m=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&p(e,t)}(v,e);var t,n,l,c,m=(l=v,c=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}(),function(){var e,t=y(l);if(c){var n=y(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return function(e,t){if(t&&("object"===r(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return f(e)}(this,e)});function v(){var e;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,v);for(var t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];return d(f(e=m.call.apply(m,[this].concat(n))),"onClick",function(t){var n=e.props,r=n.text,i=n.onCopy,l=n.children,c=n.options,u=o.default.Children.only(l),s=(0,a.default)(r,c);i&&i(r,s),u&&u.props&&"function"==typeof u.props.onClick&&u.props.onClick(t)}),e}return t=v,(n=[{key:"render",value:function(){var e=this.props,t=(e.text,e.onCopy,e.options,e.children),n=function(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(e,i),r=o.default.Children.only(t);return o.default.cloneElement(r,u(u({},n),{},{onClick:this.onClick}))}}])&&s(t.prototype,n),Object.defineProperty(t,"prototype",{writable:!1}),v}(o.default.PureComponent);t.CopyToClipboard=m,d(m,"defaultProps",{onCopy:void 0,options:void 0})},59087:(e,t,n)=>{"use strict";var r=n(44818).CopyToClipboard;r.CopyToClipboard=r,e.exports=r},47033:e=>{e.exports=function(){var e=document.getSelection();if(!e.rangeCount)return function(){};for(var t=document.activeElement,n=[],r=0;r<e.rangeCount;r++)n.push(e.getRangeAt(r));switch(t.tagName.toUpperCase()){case"INPUT":case"TEXTAREA":t.blur();break;default:t=null}return e.removeAllRanges(),function(){"Caret"===e.type&&e.removeAllRanges(),e.rangeCount||n.forEach(function(t){e.addRange(t)}),t&&t.focus()}}}}]);
2
+ //# sourceMappingURL=4945-fbbb21cf54-lite.chunk.js.map