@clickview/lite 0.104.0-rc.0 → 0.104.0-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 (86) hide show
  1. package/dist/.vite/manifest.json +686 -686
  2. package/dist/bundles.json +1 -1
  3. package/dist/en.json +1 -1
  4. package/dist/scripts/{BYC-9gzd.chunk.js → 6BvA1WyF.chunk.js} +2 -2
  5. package/dist/scripts/{BYC-9gzd.chunk.js.map → 6BvA1WyF.chunk.js.map} +1 -1
  6. package/dist/scripts/B1hsuVfV2.chunk.js +2 -0
  7. package/dist/scripts/{BwBWuxjr2.chunk.js.map → B1hsuVfV2.chunk.js.map} +1 -1
  8. package/dist/scripts/{CFxoQ45v.chunk.js → B4GpjPP-.chunk.js} +2 -2
  9. package/dist/scripts/{CFxoQ45v.chunk.js.map → B4GpjPP-.chunk.js.map} +1 -1
  10. package/dist/scripts/{HyBCRhmv2.chunk.js → BAYtWmRb2.chunk.js} +3 -3
  11. package/dist/scripts/{HyBCRhmv2.chunk.js.map → BAYtWmRb2.chunk.js.map} +1 -1
  12. package/dist/scripts/{CVEuWE2q2.chunk.js → BBAIRd3r2.chunk.js} +2 -2
  13. package/dist/scripts/{CVEuWE2q2.chunk.js.map → BBAIRd3r2.chunk.js.map} +1 -1
  14. package/dist/scripts/{C2Hgija5.chunk.js → BGH3t983.chunk.js} +2 -2
  15. package/dist/scripts/{C2Hgija5.chunk.js.map → BGH3t983.chunk.js.map} +1 -1
  16. package/dist/scripts/{DsSd-eh2.chunk.js → BIjzNf4b.chunk.js} +2 -2
  17. package/dist/scripts/{DsSd-eh2.chunk.js.map → BIjzNf4b.chunk.js.map} +1 -1
  18. package/dist/scripts/{D20SeFH5.chunk.js → BLad2z5b.chunk.js} +2 -2
  19. package/dist/scripts/{D20SeFH5.chunk.js.map → BLad2z5b.chunk.js.map} +1 -1
  20. package/dist/scripts/{BklRyGO0.chunk.js → BMZNQKEe.chunk.js} +2 -2
  21. package/dist/scripts/{BklRyGO0.chunk.js.map → BMZNQKEe.chunk.js.map} +1 -1
  22. package/dist/scripts/{BOuzZEkK2.chunk.js → BPjqerK42.chunk.js} +2 -2
  23. package/dist/scripts/BPjqerK42.chunk.js.map +1 -0
  24. package/dist/scripts/{fjQ026Rz2.chunk.js → BQS6kDvJ2.chunk.js} +2 -2
  25. package/dist/scripts/{fjQ026Rz2.chunk.js.map → BQS6kDvJ2.chunk.js.map} +1 -1
  26. package/dist/scripts/{CnfcodVE2.chunk.js → BeOS0_E02.chunk.js} +2 -2
  27. package/dist/scripts/{CnfcodVE2.chunk.js.map → BeOS0_E02.chunk.js.map} +1 -1
  28. package/dist/scripts/{kz-JIHlB2.chunk.js → Bnyn-It62.chunk.js} +2 -2
  29. package/dist/scripts/{kz-JIHlB2.chunk.js.map → Bnyn-It62.chunk.js.map} +1 -1
  30. package/dist/scripts/{BbKY_Dwq.chunk.js → CJCh1Gq6.chunk.js} +2 -2
  31. package/dist/scripts/{BbKY_Dwq.chunk.js.map → CJCh1Gq6.chunk.js.map} +1 -1
  32. package/dist/scripts/{CoUj6M-_.chunk.js → CKGiikBV.chunk.js} +2 -2
  33. package/dist/scripts/{CoUj6M-_.chunk.js.map → CKGiikBV.chunk.js.map} +1 -1
  34. package/dist/scripts/{B8t1n8_x2.chunk.js → CL5P1KMy2.chunk.js} +2 -2
  35. package/dist/scripts/{B8t1n8_x2.chunk.js.map → CL5P1KMy2.chunk.js.map} +1 -1
  36. package/dist/scripts/{Bz-3cXSL.chunk.js → CMKTpGri.chunk.js} +2 -2
  37. package/dist/scripts/{Bz-3cXSL.chunk.js.map → CMKTpGri.chunk.js.map} +1 -1
  38. package/dist/scripts/{ByMZucv2.chunk.js → CgL1gDuH.chunk.js} +2 -2
  39. package/dist/scripts/{ByMZucv2.chunk.js.map → CgL1gDuH.chunk.js.map} +1 -1
  40. package/dist/scripts/{VDqAyMTi2.chunk.js → ClMXRZea2.chunk.js} +2 -2
  41. package/dist/scripts/{VDqAyMTi2.chunk.js.map → ClMXRZea2.chunk.js.map} +1 -1
  42. package/dist/scripts/{Bw2cauzs2.chunk.js → Cm6SLr7W2.chunk.js} +3 -3
  43. package/dist/scripts/{Bw2cauzs2.chunk.js.map → Cm6SLr7W2.chunk.js.map} +1 -1
  44. package/dist/scripts/{gF9PGTMC.chunk.js → Cmjtel65.chunk.js} +2 -2
  45. package/dist/scripts/{gF9PGTMC.chunk.js.map → Cmjtel65.chunk.js.map} +1 -1
  46. package/dist/scripts/{DwLSTi6C.chunk.js → CnYpIR5V.chunk.js} +2 -2
  47. package/dist/scripts/{DwLSTi6C.chunk.js.map → CnYpIR5V.chunk.js.map} +1 -1
  48. package/dist/scripts/{BpFyfI-52.chunk.js → D2vAOC7r2.chunk.js} +2 -2
  49. package/dist/scripts/{BpFyfI-52.chunk.js.map → D2vAOC7r2.chunk.js.map} +1 -1
  50. package/dist/scripts/{29-YRbOp.chunk.js → D4uneRs9.chunk.js} +2 -2
  51. package/dist/scripts/{29-YRbOp.chunk.js.map → D4uneRs9.chunk.js.map} +1 -1
  52. package/dist/scripts/{DbQFpTve.chunk.js → DIeIfhGe.chunk.js} +2 -2
  53. package/dist/scripts/{DbQFpTve.chunk.js.map → DIeIfhGe.chunk.js.map} +1 -1
  54. package/dist/scripts/{CrGWZr2R2.chunk.js → DRHbASmP2.chunk.js} +2 -2
  55. package/dist/scripts/{CrGWZr2R2.chunk.js.map → DRHbASmP2.chunk.js.map} +1 -1
  56. package/dist/scripts/{n4utAY5E2.chunk.js → DTnfO2MH2.chunk.js} +2 -2
  57. package/dist/scripts/{n4utAY5E2.chunk.js.map → DTnfO2MH2.chunk.js.map} +1 -1
  58. package/dist/scripts/{BcMb1XKL.chunk.js → DUJvtd00.chunk.js} +2 -2
  59. package/dist/scripts/{BcMb1XKL.chunk.js.map → DUJvtd00.chunk.js.map} +1 -1
  60. package/dist/scripts/{B0DGioRk.chunk.js → DWz2oR7C.chunk.js} +2 -2
  61. package/dist/scripts/{B0DGioRk.chunk.js.map → DWz2oR7C.chunk.js.map} +1 -1
  62. package/dist/scripts/{CTUTwtJp.chunk.js → DZD8iLCw.chunk.js} +2 -2
  63. package/dist/scripts/{CTUTwtJp.chunk.js.map → DZD8iLCw.chunk.js.map} +1 -1
  64. package/dist/scripts/{C-gsezmj.chunk.js → D_foXB2p.chunk.js} +2 -2
  65. package/dist/scripts/{C-gsezmj.chunk.js.map → D_foXB2p.chunk.js.map} +1 -1
  66. package/dist/scripts/{Br8WvETm.chunk.js → Dhv7zSEB.chunk.js} +2 -2
  67. package/dist/scripts/{Br8WvETm.chunk.js.map → Dhv7zSEB.chunk.js.map} +1 -1
  68. package/dist/scripts/{B6p7xJj9.chunk.js → DpHKtTzO.chunk.js} +2 -2
  69. package/dist/scripts/{B6p7xJj9.chunk.js.map → DpHKtTzO.chunk.js.map} +1 -1
  70. package/dist/scripts/{DynqFaq92.chunk.js → GcexF25w2.chunk.js} +2 -2
  71. package/dist/scripts/{DynqFaq92.chunk.js.map → GcexF25w2.chunk.js.map} +1 -1
  72. package/dist/scripts/{DYN56vJ6.chunk.js → _XhYAc8v.chunk.js} +2 -2
  73. package/dist/scripts/{DYN56vJ6.chunk.js.map → _XhYAc8v.chunk.js.map} +1 -1
  74. package/dist/scripts/{app-4vEzpLow.js → app-DamRTcio.js} +4 -4
  75. package/dist/scripts/{app-4vEzpLow.js.map → app-DamRTcio.js.map} +1 -1
  76. package/dist/scripts/{B2PLlkVH.chunk.js → dZhIkfV6.chunk.js} +3 -3
  77. package/dist/scripts/{B2PLlkVH.chunk.js.map → dZhIkfV6.chunk.js.map} +1 -1
  78. package/dist/scripts/{DZQhE4mm.chunk.js → eSX6I2aK.chunk.js} +2 -2
  79. package/dist/scripts/{DZQhE4mm.chunk.js.map → eSX6I2aK.chunk.js.map} +1 -1
  80. package/dist/scripts/{DnogtDGY2.chunk.js → gTfMMiRw2.chunk.js} +2 -2
  81. package/dist/scripts/{DnogtDGY2.chunk.js.map → gTfMMiRw2.chunk.js.map} +1 -1
  82. package/dist/scripts/{DYW8v4_j2.chunk.js → xUmhnDE42.chunk.js} +2 -2
  83. package/dist/scripts/{DYW8v4_j2.chunk.js.map → xUmhnDE42.chunk.js.map} +1 -1
  84. package/package.json +1 -1
  85. package/dist/scripts/BOuzZEkK2.chunk.js.map +0 -1
  86. package/dist/scripts/BwBWuxjr2.chunk.js +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"fjQ026Rz2.chunk.js","names":[],"sources":["../../src/shared/views/play/hooks/useShouldShowTableOfContents.ts","../../../../libs/shared/src/components/copyright-disclaimer/copyright-disclaimer.module.scss","../../../../libs/shared/src/components/copyright-disclaimer/CopyrightDisclaimer.tsx","../../../../libs/shared/src/components/play-page/details/video-description/VideoDescription.tsx","../../../../libs/shared/src/components/play-page/details/video-details.module.scss","../../../../libs/shared/src/components/play-page/details/VideoDetailsV2.tsx","../../../../libs/common/src/react/hooks/UseEventsServiceSubscribe.ts","../../../../libs/shared/src/components/play-page/glance/video-at-a-glance.module.scss","../../../../libs/shared/src/components/play-page/glance/VideoAtAGlanceUtilsV2.ts","../../../../libs/shared/src/components/play-page/glance/points-of-interest-list/points-of-interest-list.module.scss","../../../../libs/shared/src/components/play-page/glance/points-of-interest-list/PointsOfInterestList.tsx","../../../../libs/shared/src/components/play-page/glance/VideoAtAGlanceV2.tsx","../../../../libs/shared/src/components/play-page/clips-widget/ClipWidgetItemV2.tsx","../../src/shared/components/play-page/components/play-page-clips/PlayPageClips.tsx","../../src/shared/components/play-page/components/play-page-interactives/PlayPageInteractives.tsx","../../../../libs/shared/src/images/svg/arrows/CollapseRightSvg.tsx","../../../../libs/shared/src/images/svg/arrows/ExpandLeftSvg.tsx","../../src/shared/components/play-page/components/table-of-contents/table-of-contents.module.scss","../../src/shared/components/play-page/components/table-of-contents/TableOfContents.tsx","../../src/shared/components/play-page/components/title-and-actions/title-and-actions.module.scss","../../src/shared/components/play-page/components/title-and-actions/PlayPageTitleAndActions.tsx","../../src/shared/components/player-placeholder/player-placeholder.module.scss","../../src/shared/components/player-placeholder/PlayerPlaceholder.tsx","../../src/shared/views/play/components/play-page/hooks/useResourcePopup.ts","../../src/shared/views/play/components/play-page/play-page.module.scss","../../src/shared/views/play/components/play-page/PlayPageUtils.ts","../../src/shared/views/play/hooks/usePlayPageTableOfContent.ts","../../../../libs/shared/src/utils/ObservableTypesHelper.ts","../../src/shared/constants/PlayPageSectionsOrder.ts","../../src/shared/views/play/hooks/useSectionHeadings.ts","../../src/shared/views/play/hooks/useTheatreStyle.ts","../../src/shared/views/play/PlayPageUtil.tsx"],"sourcesContent":["import { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\n\n// returns boolean value for if we should show the TOC on the side\nexport function useShouldShowSideTableOfContents(): boolean {\n const breakpoints = useBreakpoints();\n const shouldShowSideTableOfContents = breakpoints.lg || breakpoints.xl || breakpoints.xxl;\n return shouldShowSideTableOfContents;\n}\n",":local {\n .copyrightDisclaimer {\n color: $gray-500;\n }\n .overlayContainer {\n z-index: 1100;\n width: 31.25rem;\n }\n}","import React from 'react';\nimport { Overlay } from 'react-bootstrap';\nimport { Placement } from 'react-bootstrap/esm/types';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { useHoverIntent } from 'libs/shared/hooks/UseHover';\n\nimport styles from './copyright-disclaimer.module.scss';\n\nconst namespace = 'shared.copyrightDisclaimer';\n\nconst CONTAINER_HEIGHT = 150; // px\n\ninterface CopyrightDisclaimerProps {\n placement: Placement;\n overflowPlacement?: Placement;\n className?: string;\n phraseClassName?: string;\n}\n\nexport function CopyrightDisclaimer(props: CopyrightDisclaimerProps) {\n const [ ref, isHovering ] = useHoverIntent<HTMLDivElement>({});\n\n function preventOverflow() {\n const spaceBelow = document.documentElement.clientHeight - ref.current?.getBoundingClientRect().bottom;\n\n return spaceBelow < CONTAINER_HEIGHT;\n }\n\n return (\n <div ref={ref} className={props.className}>\n <p className={`${styles.copyrightDisclaimer} ${props.phraseClassName ?? 'mb-1'}`}><Text namespace={namespace} phrase='copyrightDisclaimer' /></p>\n <Overlay\n target={ref.current}\n show={isHovering}\n placement={props.overflowPlacement && preventOverflow() ? props.overflowPlacement : props.placement}\n >\n <div className={`${styles.overlayContainer} mw-100 bg-white border rounded-3 p-2`}>\n <p><Text namespace={namespace} phrase='warning' /></p>\n <p className='fw-semibold mb-0'><Text namespace={namespace} phrase='sharing' /></p>\n </div>\n </Overlay>\n </div>\n );\n}\n","import React from 'react';\n\nimport { LinkifyHelper } from 'libs/common/react/utils/LinkifyHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { ExpandableText } from 'libs/shared/components/expandable-text/ExpandableText';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\ninterface VideoDescriptionProps {\n video: VideoTypes;\n}\n\nexport function VideoDescription(props: VideoDescriptionProps): React.ReactElement {\n return (\n <ExpandableText lines={12}>\n {() => (\n <p\n className='mb-0'\n dangerouslySetInnerHTML={{\n __html: TextHelper.sanitize(LinkifyHelper.linkifyText(props.video.description, { nl2br: true }))\n }}\n />\n )}\n </ExpandableText>\n );\n}\n",":local {\n @media (min-width: #{map-get($grid-breakpoints, md)}) {\n .descriptionBorder {\n border-right: 1px solid $gray-300;\n }\n }\n}","import * as React from 'react';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Breadcrumb, Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { CopyrightDisclaimer } from 'libs/shared/components/copyright-disclaimer/CopyrightDisclaimer';\nimport { ImmersiveReader } from 'libs/shared/components/immersive-reader/ImmersiveReader';\nimport { VideoDescription } from 'libs/shared/components/play-page/details/video-description/VideoDescription';\nimport { TagHelper } from 'libs/shared/components/tags/TagHelper';\nimport { TagList } from 'libs/shared/components/tags/TagList';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { hasPPDD } from 'libs/shared/components/video-details/VideoDetailsUtils';\nimport { WidgetHeader } from 'libs/shared/components/widgets/curated-widgets/components/header/WidgetHeader';\nimport { MINIMUM_GLANCE_HEIGHT } from 'libs/shared/constants/MinimumGlanceHeight';\nimport { MasterObjectTypes } from 'libs/shared/enums/MasterObjectTypes';\nimport { TagType } from 'libs/shared/enums/TagType';\nimport { BaseObject, BasePaginatedCollection, Category, Company, CurrentUser, Library, PartnerProfile, Person, Tag, VideoTypes } from 'libs/shared/interfaces';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './video-details.module.scss';\n\nconst namespace = 'shared.videoDetailsV2';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface CommaListProps<T extends BaseObject> {\n label: string;\n items: BasePaginatedCollection<T>;\n getItemAppLink?: (item: T) => Core.AppLink;\n className?: string;\n}\n\nfunction CommaList<T extends BaseObject>(props: CommaListProps<T>): React.ReactElement {\n const { label, items, className } = props;\n\n const hasItems = items && items.data && items.data.length;\n\n if (!hasItems)\n return <></>;\n\n if (typeof props.getItemAppLink !== 'function') {\n const commaSeperated = items.data.map(i => i.name?.trim()).join(', ');\n return (\n <div className={className}>{label}: {commaSeperated}</div>\n );\n }\n\n return (\n <div className={className}>\n <span>{label}: </span>\n {items.data.map((item, index) => (\n <React.Fragment key={item.id}>\n <AppLink key={item.id} appLink={props.getItemAppLink(item)}>\n {item.name?.trim()}\n </AppLink>\n {index < items.data.length - 1 && <span>, </span>}\n </React.Fragment>\n ))}\n </div>\n );\n}\n\ninterface LibraryCategoryPair {\n library: Library;\n category: Category;\n}\n\nfunction getCustomLibraryCategoryPairs(video: VideoTypes): LibraryCategoryPair[] {\n const categories = video.categories?.data;\n if (!categories?.length)\n return [];\n\n return categories.filter(category => category.libraries?.data?.[0]?.type === MasterObjectTypes.CustomLibrary)\n .map(category => ({ library: category.libraries?.data?.[0], category }));\n}\n\ninterface CreateLibraryBreadcrumbsOptions {\n pair: LibraryCategoryPair;\n getLibraryAppLink: (library: Library) => Core.AppLink;\n getFolderAppLink: (library: Library, folder: Category) => Core.AppLink;\n}\n\nfunction createLibraryBreadcrumbs(options: CreateLibraryBreadcrumbsOptions): Breadcrumb[] {\n const breadcrumbs: Breadcrumb[] = [\n {\n name: options.pair.library.name,\n appLink: options.getLibraryAppLink?.(options.pair.library)\n },\n { name: '...' },\n {\n name: options.pair.category.name,\n appLink: options.getFolderAppLink?.(options.pair.library, options.pair.category)\n }\n ];\n\n return breadcrumbs;\n}\n\nfunction DetailsSection(props: VideoDetailsWithScrollbarV2Props): React.ReactElement {\n const { video } = props;\n\n if (!VideoHelper.isVideo(video) && !VideoHelper.isClip(video))\n return <></>;\n\n const parentVideo = VideoHelper.getParentVideo(video);\n const libraryPairs = getCustomLibraryCategoryPairs(video);\n\n function getPartnerProfileAppLink(company: Company) {\n if (!company.partnerProfiles || !company.partnerProfiles?.data?.length)\n return;\n\n if (company.partnerProfiles?.count > 1 && typeof props.getPartnerDashboardHubAppLink === 'function')\n return props.getPartnerDashboardHubAppLink(company);\n\n if (typeof props.getPartnerProfileAppLink === 'function')\n return props.getPartnerProfileAppLink(company.partnerProfiles?.data?.[0]);\n\n return;\n }\n\n return (\n <div className={video.description ? 'col-md-5 ps-md-3 pt-3 pt-md-0' : 'col-12'}>\n <h2 className='h6 mb-1'><Text phrase='details' /></h2>\n {!!parentVideo.productionYear && (\n <div className='mb-1'>\n <Text phrase='productionYear' options={{ year: parentVideo.productionYear }} />\n </div>\n )}\n <CommaList<Company>\n label={getPhrase('productionCompanies', { smartCount: parentVideo.productionCompanies?.data?.length })}\n items={parentVideo.productionCompanies}\n getItemAppLink={getPartnerProfileAppLink}\n className='mb-1'\n />\n <CommaList<Company>\n label={getPhrase('distributors', { smartCount: parentVideo.distributors?.data?.length })}\n items={parentVideo.distributors}\n getItemAppLink={getPartnerProfileAppLink}\n className='mb-1'\n />\n <CommaList\n label={getPhrase('producers', { smartCount: parentVideo.producers?.data?.length })}\n items={parentVideo.producers}\n className='mb-1'\n />\n <CommaList\n label={getPhrase('directors', { smartCount: parentVideo.directors?.data?.length })}\n items={parentVideo.directors}\n className='mb-1'\n />\n {!!parentVideo.dateBroadcast && (\n <div className='mb-1'>\n <Text phrase='dateBroadcast' options={{ date: DateHelper.format(parentVideo.dateBroadcast, 'DD/MM/YYYY') }} />\n </div>\n )}\n {!!parentVideo.channel && (\n <div className='mb-1'>\n <Text phrase='channel' options={{ channel: parentVideo.channel.name }} />\n </div>\n )}\n {VideoHelper.canViewUploadDate(props.video) && (\n <div className='mb-1'>\n <Text phrase='dateUploaded' options={{ date: DateHelper.format(video.dateCreated, 'DD/MM/YYYY') }} />\n </div>\n )}\n {!!(libraryPairs.length && props.getLibraryAppLink && props.getFolderAppLink) && (\n <div className='mb-1'>\n <div>{getPhrase('libraries', { smartCount: libraryPairs.length })}:</div>\n {libraryPairs.map((pair, index) => (\n <div key={index}>\n <Breadcrumbs\n breadcrumbs={createLibraryBreadcrumbs({\n pair,\n getLibraryAppLink: props.getLibraryAppLink,\n getFolderAppLink: props.getFolderAppLink\n })}\n linkClassName='text-info'\n />\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n\ninterface VideoDetailsWithScrollbarV2Props {\n video: VideoTypes;\n currentUser: CurrentUser;\n getTagAppLink?: (tag: Tag) => Core.AppLink;\n onLaunchImmersiveReader?: () => void;\n onExitImmersiveReader?: () => void;\n maxHeight?: number;\n suppressInteractivity?: boolean;\n hideTags?: boolean;\n headingRef?: React.MutableRefObject<Map<PlayPageAnchor, HTMLElement>>;\n showHeading?: boolean;\n getPartnerProfileAppLink?: (partnerProfile: PartnerProfile) => Core.AppLink;\n getPartnerDashboardHubAppLink?: (company: Company | Person) => Core.AppLink;\n getLibraryAppLink?: (library: Library) => Core.AppLink;\n getFolderAppLink?: (library: Library, folder: Category) => Core.AppLink;\n}\n\nexport function VideoDetailsWithScrollbarV2(props: VideoDetailsWithScrollbarV2Props): React.ReactElement {\n const { video, maxHeight = MINIMUM_GLANCE_HEIGHT } = props;\n\n const parentVideo = VideoHelper.getParentVideo(video);\n\n const showDescription = !!props.video.description;\n\n const showDetails = (\n hasPPDD(props.video) ||\n !!parentVideo.productionYear ||\n !!parentVideo.dateBroadcast ||\n !!parentVideo.channel ||\n VideoHelper.canViewUploadDate(props.video)\n );\n\n if (!showDescription && !showDetails)\n return <></>;\n\n function getTags(): Tag[] {\n if (props.hideTags || VideoHelper.isInteractive(props.video) || !props.video.tags?.data?.length)\n return null;\n\n return props.video.tags?.data?.filter(tag => tag.tagType === TagType.Normal);\n }\n const tags = getTags();\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <section\n id={PlayPageAnchor.VideoDetails}\n ref={el => {\n (el && props.headingRef?.current) && props.headingRef.current.set(PlayPageAnchor.VideoDetails, el);\n }}\n className='play-page-section'\n >\n {props.showHeading && <WidgetHeader name={getPhrase('heading')} />}\n <div className='rounded border p-3 position-relative'>\n <Scrollbars autoHeight autoHeightMax={maxHeight} hideTracksWhenNotNeeded>\n <div className='row g-0'>\n {showDescription && (\n <div className={showDetails ? `${styles.descriptionBorder} pe-3 col-md-7` : 'col-12'}>\n <div className='d-flex align-items-center'>\n <h2 className='h6 mb-1'>\n <Text phrase='description' />\n </h2>\n <ImmersiveReader\n text={video.description}\n title={video.name}\n className='ps-2'\n onLaunch={props.onLaunchImmersiveReader}\n onExit={props.onExitImmersiveReader}\n analyticsOptions={{\n location: LocationContext.PlayPage,\n entity: EntityType.Video,\n actionType: UserAction.Click,\n descriptor: ClickDescriptor.LaunchImmersiveReader\n }}\n analyticsData={{ id: video.id, type: 'description' }}\n />\n </div>\n\n <VideoDescription video={props.video} />\n </div>\n )}\n\n {showDetails && (\n <DetailsSection {...props} />\n )}\n </div>\n\n {!!tags?.length && (\n <div className='mt-3'>\n <h2 className='h6 mb-1'><Text phrase='normalTags' /></h2>\n <TagList\n tags={tags}\n {...TagHelper.getTagActionProps(props.getTagAppLink, null, props.suppressInteractivity)}\n className='mt-1'\n />\n </div>\n )}\n\n {VideoHelper.isBroadcast(props.video) && (\n <CopyrightDisclaimer\n placement='bottom-start'\n className='d-flex justify-content-start mt-2'\n phraseClassName='mb-0'\n overflowPlacement='top-start'\n />\n )}\n\n </Scrollbars>\n </div>\n </section>\n </LanguageNamespaceContext.Provider>\n );\n}\n","import { useEffect } from 'react';\n\nimport { EventsService } from 'libs/common/react/services/EventsService';\n\n/**\n * \n * @param event the event to subscribe to\n * @param callback the callback function\n * @param once whether to subscribe once\n * @param shouldSubscribe conditionally determine whether to subscribe to events\n * @returns unsubscribe function\n */\nexport function useEventsServiceSubscribe(\n event: string,\n callback: (...args: any[]) => void,\n once?: boolean,\n shouldSubscribe?: boolean\n): () => void {\n const unsubscribe = () => {\n EventsService.unsubscribe(event, callback);\n };\n\n useEffect(() => {\n if (!shouldSubscribe)\n return;\n\n once ? EventsService.subscribeOnce(event, callback) : EventsService.subscribe(event, callback);\n\n return () => {\n unsubscribe();\n };\n }, []);\n\n return unsubscribe;\n}\n",":local{\n .learningIntention p:last-child {\n margin-bottom: -1rem !important; //offset last p element margin \n }\n\n .learningIntention p:not(:last-child) {\n margin-bottom: 0.5rem !important; \n }\n\n .highlightPoi {\n text-decoration: underline;\n }\n\n .icon {\n float:left;\n clear:both;\n }\n}","import { MutableRefObject, useEffect, useRef, useState } from 'react';\nimport { marked } from 'marked';\n\nimport { useEventsServiceSubscribe } from 'libs/common/react/hooks/UseEventsServiceSubscribe';\nimport { EventsService } from 'libs/common/react/services/EventsService';\n\nimport { Clip, Glance, PointOfInterest, Video } from 'libs/shared/interfaces';\n\nimport styles from './video-at-a-glance.module.scss';\n\nconst POI_LINK_LINE = /\\[\\]\\(cv:\\/\\/poi\\?id=\\d+\\)\\n*/g;\n\nfunction stripPoisFromGlanceContent(glanceContent: string): string {\n return glanceContent.replace(POI_LINK_LINE, '');\n}\n\nfunction getLearningIntentionHTML(glance: Glance): string {\n const learningIntention = stripPoisFromGlanceContent(glance.content);\n\n return marked(learningIntention, { async: false });\n}\n\nexport function useLearningIntentionMarkdown(\n video: Video,\n hasGlanceData?: boolean\n): string {\n const [ markdownHTML, setMarkdownHTML ] = useState('');\n\n useEffect(() => {\n if (!hasGlanceData || !video.glance?.content)\n return;\n\n const content = getLearningIntentionHTML(video.glance);\n\n setMarkdownHTML(content);\n }, [ video.glance?.content, hasGlanceData ]);\n\n return markdownHTML;\n}\n\nexport function hasGlanceData(video: Video | Clip): boolean {\n return video.glance?.content && video.glance?.format === 'text/markdown';\n}\n\nexport function useHighlightPointOfInterest(\n pointOfInterest: PointOfInterest,\n shouldHighlight: boolean\n): MutableRefObject<HTMLDivElement> {\n const ref = useRef<HTMLDivElement>(null);\n\n useEventsServiceSubscribe('player:poi:mouseover', onPlayerPoiMouseOver, null, shouldHighlight);\n useEventsServiceSubscribe('player:poi:mouseleave', onPlayerPoiMouseLeave, null, shouldHighlight);\n\n useEffect(() => {\n if (!ref.current || !shouldHighlight)\n return;\n\n ref.current?.addEventListener('mouseover', onGlancePoiMouseOver);\n ref.current?.addEventListener('mouseleave', onGlancePoiMouseLeave);\n\n return () => {\n ref.current?.removeEventListener('mouseover', onGlancePoiMouseOver);\n ref.current?.removeEventListener('mouseleave', onGlancePoiMouseLeave);\n };\n }, [ref.current]);\n\n function onPlayerPoiMouseOver(hoveredPoi: PointOfInterest): void {\n if (!hoveredPoi?.id || pointOfInterest?.id?.toString() !== hoveredPoi?.id?.toString())\n return;\n\n ref.current?.classList.add(styles.highlightPoi);\n }\n\n function onPlayerPoiMouseLeave(): void {\n ref.current?.classList.remove(styles.highlightPoi);\n }\n\n /**\n * `this` will be the element to which the eventListener is bound.\n */\n function onGlancePoiMouseOver(): void {\n if (pointOfInterest)\n EventsService.trigger('glance:poi:mouseover', pointOfInterest);\n }\n\n function onGlancePoiMouseLeave(): void {\n EventsService.trigger('glance:poi:mouseleave');\n }\n\n return ref;\n}\n",":local {\n .poiEntry {\n flex-wrap: nowrap;\n align-items: start;\n &:hover {\n .poiText:not(.public) {\n text-decoration: underline;\n }\n } \n }\n\n .public {\n margin-top: 0.125rem;\n }\n\n .poiText {\n margin-top: 0.125rem;\n }\n\n .poiTimeStamp {\n height: 1.5rem;\n min-width: 3.5625rem;\n &.wideBadge {\n min-width: 4.375rem;\n }\n }\n}","import React from 'react';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PointOfInterest } from 'libs/shared/interfaces';\nimport { DurationHelper } from 'libs/shared/utils/DurationHelper';\n\nimport { useHighlightPointOfInterest } from '../VideoAtAGlanceUtilsV2';\n\nimport styles from './points-of-interest-list.module.scss';\n\ninterface PointOfInterestProps {\n poi: PointOfInterest;\n suppressInteractivity?: boolean;\n onClickPoiItem: (time: number) => void;\n wideBadge?: boolean;\n}\n\nfunction PointOfInterestItem(props: PointOfInterestProps): JSX.Element {\n const timeStamp = DurationHelper.ToDisplayDuration(props.poi.startTime * 1000);\n\n const ref = useHighlightPointOfInterest(props.poi, !props.suppressInteractivity);\n\n if (props.suppressInteractivity) {\n return (\n <div className={`d-flex ${styles.poiEntry} mb-2`}>\n <span className={`d-flex rounded-pill justify-content-center align-items-center text-info bg-light-blue ${styles.poiTimeStamp} ${props.wideBadge ? styles.wideBadge : ''}`}>{timeStamp}</span>\n <div className={`${styles.public} ms-2`}>{props.poi.description}</div>\n </div>\n );\n }\n\n return (\n <DivButton\n key={props.poi.startTime}\n className={`d-flex ${styles.poiEntry} mb-2 cursor-pointer`}\n onClick={() => props.onClickPoiItem(props.poi.startTime)}\n ref={ref}\n >\n <div className={`d-flex rounded-pill justify-content-center align-items-center text-info bg-light-blue ${styles.poiTimeStamp} ${props.wideBadge ? styles.wideBadge : ''}`}>{timeStamp}</div>\n <div className={`ms-2 ${styles.poiText}`}>{props.poi.description}</div>\n </DivButton>\n );\n}\n\ninterface PointOfInterestListProps {\n pointsOfInterest: PointOfInterest[];\n suppressInteractivity?: boolean;\n onClickPoiItem: (time: number) => void;\n}\n\nconst namespace = 'shared.pointsOfInterestList';\n\nexport function PointOfInterestList(props: PointOfInterestListProps) {\n const sortedPointsOfInterest = props.pointsOfInterest.sort((a, b) => a.startTime - b.startTime);\n const hasTimePointOverHours = sortedPointsOfInterest.some(poi => poi.startTime >= 3600);\n\n return (\n <div>\n <h2 className='h6 my-2'><Text namespace={namespace} phrase='heading' /></h2>\n\n <div>\n {sortedPointsOfInterest.map(poi => {\n return (\n <PointOfInterestItem\n key={poi.startTime}\n poi={poi}\n suppressInteractivity={props.suppressInteractivity}\n onClickPoiItem={props.onClickPoiItem}\n wideBadge={hasTimePointOverHours}\n />\n );\n })}\n\n </div>\n </div>\n );\n}\n","import * as React from 'react';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\n\nimport { Core } from 'libs/common/core';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { CopyContentIconButton } from 'libs/shared/components/play-page/copy-content-icon-button/CopyContentIconButton';\nimport { PointOfInterestList } from 'libs/shared/components/play-page/glance/points-of-interest-list/PointsOfInterestList';\nimport { TagHelper } from 'libs/shared/components/tags/TagHelper';\nimport { TagList } from 'libs/shared/components/tags/TagList';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { TagType } from 'libs/shared/enums/TagType';\nimport { PointOfInterest, Tag, Video } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { useLearningIntentionMarkdown } from './VideoAtAGlanceUtilsV2';\n\nimport styles from './video-at-a-glance.module.scss';\n\nconst namespace = 'shared.videoAtAGlanceV2';\n\n// Pixel value selected to try and make it so that when there are more\n// POIs below the fold, that the user can see some of the next one so\n// they know they can scroll. E.g. https://imgur.com/TQyL0Bq\nconst SCROLL_HEIGHT_MAX = 365; // in px\n\ninterface ScrollbarWrapperProps {\n hideScrollbar?: boolean;\n}\n\nfunction ScrollbarWrapper(props: React.PropsWithChildren<ScrollbarWrapperProps>): JSX.Element {\n if (props.hideScrollbar)\n return <>{props.children}</>;\n\n return (\n <div className='rounded border mb-4 bg-white'>\n <Scrollbars\n autoHeight\n autoHeightMax={SCROLL_HEIGHT_MAX}\n >\n <div className='px-3 pt-3 pb-2'>\n {props.children}\n </div>\n </Scrollbars>\n </div>\n );\n}\n\ninterface VideoAtAGlanceV2Props {\n video: Video;\n pointsOfInterest?: PointOfInterest[];\n suppressInteractivity?: boolean;\n setStartTime?: (time: number) => void;\n getTagAppLink?: (tag: Tag) => Core.AppLink;\n onClickTag?: () => void;\n hideScrollbar?: boolean;\n canViewGlance: boolean;\n}\n\nexport function VideoAtAGlanceV2(props: VideoAtAGlanceV2Props): JSX.Element {\n const learningIntentionMarkdownHTML = useLearningIntentionMarkdown(props.video, props.canViewGlance);\n const [ textToCopy, setTextToCopy ] = React.useState('');\n\n function logUserAction(): void {\n const analyticsData = {\n id: props.video.glance.id,\n name: props.video.glance.name,\n videoId: props.video.id,\n videoName: props.video.name,\n learningIntention: textToCopy\n };\n\n const analyticsOptions = {\n actionType: UserAction.Copy,\n entity: EntityType.Glance,\n location: LocationContext.PlayPage\n };\n AnalyticsHelper.logUserAction(analyticsData, analyticsOptions);\n }\n\n function getTags(): Tag[] {\n if (VideoHelper.isInteractive(props.video) || !props.video.tags?.data?.length)\n return null;\n\n return props.video.tags?.data?.filter(tag => tag.tagType === TagType.Pedagogy || tag.tagType === TagType.Skill);\n }\n const tags = getTags();\n\n const ref = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n if (ref.current?.innerText)\n setTextToCopy(ref.current.innerText);\n }, [ref.current?.innerText]);\n\n if (!props.canViewGlance)\n return <></>;\n\n function onClickPoiItem(time: number) {\n props.setStartTime(time);\n }\n\n return (\n <section className='play-page-section'>\n <ScrollbarWrapper hideScrollbar={props.hideScrollbar}>\n <h2 className='h6 mb-2'><Text namespace={namespace} phrase='learningIntention' /></h2>\n \n <div className={`mb-3 ${styles.learningIntention}`}>\n <CopyContentIconButton\n copyableContent={textToCopy}\n tooltipClassName={styles.icon}\n onClick={logUserAction}\n visible\n />\n <div\n dangerouslySetInnerHTML={{ __html: TextHelper.sanitize(learningIntentionMarkdownHTML) }}\n className='d-inline'\n ref={ref}\n >\n </div>\n </div>\n\n {!!tags?.length && (\n <div>\n <TagList\n tags={tags}\n {...TagHelper.getTagActionProps(props.getTagAppLink, props.onClickTag, props.suppressInteractivity)}\n className='mt-2'\n />\n </div>\n )}\n\n {!!props.pointsOfInterest?.length && (\n <div className='mt-3'>\n <PointOfInterestList\n pointsOfInterest={props.pointsOfInterest}\n suppressInteractivity={props.suppressInteractivity}\n onClickPoiItem={onClickPoiItem}\n />\n </div>\n )}\n </ScrollbarWrapper>\n </section>\n );\n}\n","import React from 'react';\n\nimport { ThumbnailText } from 'libs/shared/components/thumbnails/thumbnail-text/ThumbnailText';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { FixedWidgetItemProps } from 'libs/shared/components/widgets/items/FixedWidgetItemProps';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { Clip, PresentationAudience } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\n\nexport interface ClipWidgetItemV2Props extends FixedWidgetItemProps<Clip> {\n audiences: PresentationAudience[];\n commonVideoProps: CommonVideoProps;\n showOwner?: boolean;\n}\n\nexport const ClipWidgetItemV2 = React.memo(function(props: ClipWidgetItemV2Props): JSX.Element {\n const { data: clip, thumbnailSize, preloadImage, getAppLink } = props;\n const mergedAudience = useMergeAudiences(clip.subjectPresentationAudiences?.data, props.audiences);\n\n return (\n <div className='flex-shrink-0 px-1 col-6 col-sm-4'>\n <VideoThumbnail\n type='static'\n textPosition={ThumbnailTextPosition.Independent}\n video={clip}\n appLink={getAppLink(clip)}\n imageOptions={{ size: thumbnailSize }}\n preload={preloadImage}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n audience={mergedAudience}\n hideDuration={false}\n commonVideoProps={props.commonVideoProps}\n />\n\n <div className='mt-2'>\n <ThumbnailText\n {...props}\n video={clip}\n appLink={props.getAppLink(clip)}\n />\n </div>\n </div>\n );\n});\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { ClipWidgetItemV2 } from 'libs/shared/components/play-page/clips-widget/ClipWidgetItemV2';\nimport { FixedWidget } from 'libs/shared/components/widgets/fixed-widget';\nimport { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { Clip, PresentationAudience, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'shared.playPageClips';\n\ninterface PlayPageClipsProps {\n presentationSlug: string | null;\n video: Video | Clip;\n clips: Clip[];\n canViewClips: boolean;\n audiences: PresentationAudience[];\n analyticsData: HashObject;\n headingRef?: React.MutableRefObject<Map<PlayPageAnchor, HTMLElement>>;\n commonVideoProps: CommonVideoProps;\n}\n\nexport function PlayPageClips(props: PlayPageClipsProps): JSX.Element {\n if (!props.canViewClips || !props.clips?.length)\n return <></>;\n\n const parentIsVideo = VideoHelper.isVideo(props.video);\n\n function getAppLink() {\n if (VideoHelper.isVideo(props.video)) {\n return {\n action: Actions.Videos.VIDEO_CLIPS,\n application: AppChannels.VIDEOS,\n args: [\n props.presentationSlug,\n props.video.id,\n TextHelper.slugify(props.video.name)\n ]\n };\n }\n return {\n action: Actions.Clips.CLIP_CLIPS,\n application: AppChannels.CLIPS,\n args: [ props.video.id, TextHelper.slugify(props.video.name) ]\n };\n }\n\n const title = LanguageService.getPhrase(\n namespace,\n parentIsVideo ? 'clips' : 'otherClips',\n { count: props.clips.length }\n );\n\n return (\n <section\n className='play-page-section'\n id={PlayPageAnchor.Clips}\n ref={el => {\n (el && props.headingRef?.current) && props.headingRef.current.set(PlayPageAnchor.Clips, el);\n }}\n >\n <FixedWidget\n name={title}\n contents={WidgetContents.ClipsV2}\n collection={props.clips}\n prefetched\n getChildAppLink={(clip: Clip) => {\n return {\n application: AppChannels.CLIPS,\n action: Actions.Clips.PLAY_CLIP,\n args: [ clip.id, TextHelper.slugify(clip.name) ]\n };\n }}\n appLink={getAppLink()}\n childComponent={ClipWidgetItemV2}\n extraChildComponentProps={{\n audiences: props.audiences,\n showOwner: true,\n commonVideoProps: props.commonVideoProps\n }}\n analyticsData={props.analyticsData}\n />\n </section>\n );\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { InteractiveWidgetItem } from 'libs/shared/components/play-page/interactives-widget/InteractiveWidgetItem';\nimport { FixedWidget } from 'libs/shared/components/widgets/fixed-widget';\nimport { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { Clip, Interactive, InteractiveMetadata, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'shared.playPageInteractives';\n\ninterface PlayPageInteractivesProps {\n presentationSlug: string | null;\n canViewInteractives: boolean;\n video: Video | Clip;\n interactives: InteractiveMetadata[];\n analyticsData: HashObject;\n headingRef?: React.MutableRefObject<Map<PlayPageAnchor, HTMLElement>>;\n commonVideoProps: CommonVideoProps;\n}\n\nexport function PlayPageInteractives(props: PlayPageInteractivesProps): JSX.Element {\n if (!props.canViewInteractives || !props.interactives?.length)\n return <></>;\n\n function getAppLink() {\n if (VideoHelper.isVideo(props.video))\n return {\n action: Actions.Videos.VIDEO_INTERACTIVES,\n application: AppChannels.VIDEOS,\n args: [\n props.presentationSlug,\n props.video.id,\n TextHelper.slugify(props.video.name)\n ]\n };\n\n return {\n action: Actions.Clips.CLIP_INTERACTIVES,\n application: AppChannels.CLIPS,\n args: [ props.video.id, TextHelper.slugify(props.video.name) ]\n };\n }\n\n const title = LanguageService.getPhrase(namespace, 'interactives', { count: props.interactives.length });\n \n return (\n <section className='play-page-section'\n id={PlayPageAnchor.Interactives}\n ref={el => {\n (el && props.headingRef?.current) && props.headingRef.current.set(PlayPageAnchor.Interactives, el);\n }}\n >\n <FixedWidget\n name={title}\n contents={WidgetContents.InteractivesV2}\n collection={props.interactives}\n prefetched\n getChildAppLink={(interactive: Interactive) => {\n return {\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.VIEW_INTERACTIVE,\n args: [ interactive.id, TextHelper.slugify(interactive.name) ]\n };\n }}\n appLink={getAppLink()}\n childComponent={InteractiveWidgetItem}\n extraChildComponentProps={{\n questionsAppLink: {\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.PREVIEW_QUESTIONS\n },\n showOwner: true,\n commonVideoProps: props.commonVideoProps\n }}\n analyticsData={props.analyticsData}\n />\n </section>\n );\n}\n","import React from 'react';\n\nexport function CollapseRightSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n d='M5.455 12c0 .401.325.727.727.727h9.88l-3.849 3.85a.728.728 0 0 0 1.029 1.028l5.09-5.091a.73.73 0 0 0 .213-.514v7.272a.727.727 0 0 0 1.455 0V4.727a.727.727 0 0 0-1.455 0V12a.73.73 0 0 0-.213-.515l-5.09-5.09a.727.727 0 1 0-1.029 1.028l3.85 3.85H6.181a.727.727 0 0 0-.727.727'\n fill='currentColor'\n />\n </svg>\n );\n}\n","import React from 'react';\n\nexport function ExpandLeftSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n d='M20 12a.727.727 0 0 0-.727-.728h-9.88l3.848-3.849a.727.727 0 1 0-1.028-1.029l-5.091 5.091a.73.73 0 0 0-.213.514V4.727a.727.727 0 0 0-1.454 0v14.545a.727.727 0 0 0 1.454 0V12c0 .186.071.373.213.515l5.091 5.09a.727.727 0 0 0 1.029-1.028l-3.85-3.85h9.88A.727.727 0 0 0 20 12'\n fill='currentColor'\n />\n </svg>\n );\n}\n",":local{\n .showInSide {\n position: sticky;\n top: 5.4375rem;\n height: 100%;\n z-index: 80;\n }\n\n .container {\n padding-right: 0;\n height: fit-content;\n }\n\n .aside {\n .container {\n min-width: 10rem; // make enough space for the collapse icon\n }\n .collapse {\n display: none;\n right: 0;\n top: 0;\n }\n &:hover {\n .collapse {\n display: block;\n }\n }\n }\n\n .iconContainer {\n .arrowIcon {\n display: none;\n }\n .listIcon {\n display: block;\n }\n &:hover {\n .listIcon {\n display: none;\n }\n .arrowIcon {\n display: block;\n }\n }\n }\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { PortalHelper } from 'libs/common/react/utils/PortalHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, HashObject, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { TableOfContentsList } from 'libs/shared/components/table-of-contents-list/TableOfContentsList';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { CollapseRightSvg } from 'libs/shared/images/svg/arrows/CollapseRightSvg';\nimport { ExpandLeftSvg } from 'libs/shared/images/svg/arrows/ExpandLeftSvg';\nimport { TableOfContentsSvg } from 'libs/shared/images/svg/objects/TableOfContentsSvg';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { ContextService } from 'libs/shared/services/ContextService';\n\nimport { PLAY_PAGE_TOC_PORTAL_ID } from 'shared/layouts/teacher-layout/TeacherLayoutComponent';\n\nimport styles from './table-of-contents.module.scss';\n\nconst namespace = 'shared.playPage';\n\nexport const TOC_IGNORE_BOUNDARY = 3;\n\nexport interface TableOfContentsItem {\n name: string;\n id: PlayPageAnchor;\n}\n\ninterface TableOfContentsProps {\n items: TableOfContentsItem[];\n activeId: string;\n appLink?: Core.AppLink;\n analyticsData?: HashObject;\n setControlledId: (arg: string) => void;\n isExpanded: boolean;\n setIsExpanded: (arg: boolean) => void;\n toggleTheatreMode?: (value: boolean) => void;\n showInSide: boolean;\n isTheatreMode: boolean;\n hasTranscription: boolean;\n shouldShow: boolean;\n}\n\nfunction TableOfContentsIcon(props: TableOfContentsProps) {\n function logUserAction() {\n const analyticsOptions = {\n actionType: !props.isExpanded ? UserAction.Open : UserAction.Hide,\n entity: EntityType.TableOfContents,\n location: LocationContext.PlayPage\n };\n\n AnalyticsHelper.logUserAction(props.analyticsData, analyticsOptions);\n }\n\n function onClickIcon() {\n const shouldExpand = !props.isExpanded;\n props.setIsExpanded(shouldExpand);\n\n if (shouldExpand) {\n props.toggleTheatreMode?.(false);\n // users has not transcription mode should still abel to collapse\n if (!props.toggleTheatreMode) {\n props.setIsExpanded(false);\n }\n } else {\n props.toggleTheatreMode?.(true);\n if (!props.toggleTheatreMode) {\n props.setIsExpanded(true);\n }\n }\n logUserAction();\n }\n\n return (\n <div className='d-flex justify-content-end'>\n <div className={styles.container}>\n <div className={`${styles.iconContainer}`} >\n <IconButton\n className={`btn btn-outline-dark ${styles.listIcon}`}\n svg={TableOfContentsSvg}\n onClick={onClickIcon}\n />\n \n <IconButton\n className={`btn btn-outline-dark ${styles.arrowIcon}`}\n svg={!props.isExpanded ? ExpandLeftSvg : CollapseRightSvg}\n onClick={onClickIcon}\n />\n </div>\n </div>\n </div>\n );\n}\n\nfunction TableOfContents(props: TableOfContentsProps) {\n function logUserAction() {\n const analyticsOptions = {\n actionType: UserAction.Hide,\n entity: EntityType.TableOfContents,\n location: LocationContext.PlayPage\n };\n\n AnalyticsHelper.logUserAction(props.analyticsData, analyticsOptions);\n }\n\n function getAppLink(item: any): Core.AppLink {\n const currentAppLink = ContextService.getCurrentRoute().appLink;\n\n const params: HashObject = currentAppLink.params ?\n { ...(currentAppLink.params as HashObject) } :\n {};\n\n params.tocId = item.id;\n\n return {\n ...currentAppLink,\n params\n };\n }\n\n function onClickTableOfContentsHeading() {\n if (!props.showInSide) {\n // in mobile version, collapse once user hit the TOC item\n props.setIsExpanded(false);\n }\n }\n\n return (\n <div className={!props.showInSide ? 'd-inline-flex gap-1' : `col ms-2 ps-4 ${styles.showInSide}`}>\n <aside className={`${styles.aside} position-relative ${!props.showInSide ? 'px-3 pt-3 pb-2 border border-dark rounded-1 bg-white' : 'pe-1 pt-1 '}`}>\n <div className={`${styles.container}`}>\n {/* keep this for customers has no transcription turned on */}\n {props.showInSide && !props.hasTranscription && (\n <IconButton\n className={`btn position-absolute ${styles.collapse}`}\n svg={CollapseRightSvg}\n onClick={() => {\n props.setIsExpanded(false);\n props.toggleTheatreMode?.(true);\n logUserAction();\n }}\n />\n )}\n <h2 className='h5'><Text namespace={namespace} phrase='tocHeading' /></h2>\n \n <TableOfContentsList\n items={props.items}\n activeId={props.activeId}\n getAppLink={getAppLink}\n setControlledId={props.setControlledId}\n analyticsData={props.analyticsData}\n onItemClick={() => onClickTableOfContentsHeading()}\n />\n </div>\n \n </aside>\n {/* in mobile version, always show icon on the right */}\n {!props.showInSide && <TableOfContentsIcon {...props}/>}\n </div>\n );\n}\n\nexport function TableOfContentsContainer(props: TableOfContentsProps): JSX.Element {\n if (!props.shouldShow)\n return <></>;\n \n return (\n <>\n {/* web version show table of contents next to player */}\n {props.isExpanded && props.showInSide && <TableOfContents {...props}/>}\n\n {/* web version show icon in portal (RHS of window) */}\n {PortalHelper.renderInPortalIfExists(\n !props.isExpanded && <TableOfContentsIcon {...props}/>,\n document.getElementById(PLAY_PAGE_TOC_PORTAL_ID)\n )}\n\n {/* mobile version show in portal */}\n {PortalHelper.renderInPortalIfExists(\n !props.showInSide && props.isExpanded && <TableOfContents {...props}/>,\n document.getElementById(PLAY_PAGE_TOC_PORTAL_ID)\n )}\n </>\n );\n}\n",":local {\n .series {\n font-size: 0.75rem;\n font-weight: 500;\n }\n\n .badgeListContainer {\n :global(.badge) {\n height: 1.25rem;\n display: flex;\n align-items: center;\n }\n }\n\n .clipOriginInfo:not(:last-child) {\n margin-bottom: 0.5rem !important;\n }\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { Actions } from 'libs/shared/components/actions/Actions';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { AudienceLabel } from 'libs/shared/components/audience-label/AudienceLabel';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BadgeListContainer } from 'libs/shared/components/badges/BadgeListContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { RestrictionPadlock } from 'libs/shared/components/video-list/components/restriction-padlock/RestrictionPadlock';\nimport { VideoSubText, VideoSubTextType } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { Clip, PresentationAudience, Video, YearGroup } from 'libs/shared/interfaces';\nimport { DurationHelper } from 'libs/shared/utils/DurationHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { VideoFeaturesHash } from 'shared/hooks/useVideoFeatureAccess';\n\nimport styles from './title-and-actions.module.scss';\n\nconst namespace = 'shared.playPage';\n\ninterface PlayPageTitleAndActionsProps {\n presentationSlug: string | null;\n media: Clip | Video;\n yearGroups: YearGroup[];\n audiences: PresentationAudience[];\n featureAccess: VideoFeaturesHash;\n originalVideoAppLink?: Core.AppLink;\n shareId: string;\n showTitlePadlock: boolean;\n subTextType?: VideoSubTextType;\n subtextAppLink?: Core.AppLink;\n}\n\nexport function PlayPageTitleAndActions(props: PlayPageTitleAndActionsProps): JSX.Element {\n const mergedAudience = useMergeAudiences(props.media.subjectPresentationAudiences?.data, props.audiences);\n\n const containerRef = React.useRef<HTMLDivElement>(null);\n const titleContainerRef = React.useRef<HTMLDivElement>(null);\n\n const hasBadges = (\n (VideoHelper.isVideo(props.media) && !!VideoHelper.getRating(props.media)?.value) ||\n (VideoHelper.isVideo(props.media) && !!props.media.productionYear) ||\n !!props.media.subjectPresentationAudiences?.data?.length\n );\n\n const videoActions = useVideoActions({\n location: VideoActionsLocation.PlayPage,\n shareId: props.shareId,\n presentationSlug: props.presentationSlug\n });\n\n const canViewOriginal = !!props.originalVideoAppLink &&\n VideoHelper.isClip(props.media) &&\n VideoHelper.canViewOriginalVideo(props.media);\n\n return (\n <section className='mb-3 position-relative' ref={containerRef}>\n <div className='d-inline-block w-100' ref={titleContainerRef}>\n {props.featureAccess.canNavigate &&\n <div className='ms-2 float-end'>\n <Actions\n actions={videoActions.getVideoActions(props.media)}\n actionsDropdownClassName='btn btn-outline-dark'\n fetchMore={() => videoActions.fetchMoreActions(props.media)}\n />\n </div>\n }\n\n {!!VideoHelper.isVideo(props.media) && (\n <VideoSubText\n type={props.subTextType}\n video={props.media}\n appLink={props.subtextAppLink}\n className={`${styles.series} text-truncate mw-100`}\n analyticsOptions={{ location: LocationContext.PlayPage }}\n />\n )}\n <h1 className='h4 mb-2 mw-100'>\n <span className='align-self-center'>{props.media.name}</span>\n {props.showTitlePadlock && (\n <RestrictionPadlock\n tooltipPlacement='right'\n className='d-inline-block ps-1'\n video={props.media}\n yearGroups={props.yearGroups}\n />\n )}\n </h1>\n \n {VideoHelper.isClip(props.media) && canViewOriginal && (\n <p className={`clamp-1 ${styles.clipOriginInfo}`}>\n <Text namespace={namespace} phrase='viewOriginal' />\n &nbsp;\n <AppLink className='info-link' appLink={props.originalVideoAppLink}>\n {props.media._parentVideo?.name}\n </AppLink>\n &nbsp;\n <Text\n namespace={namespace}\n phrase='timestamp'\n options={{\n timeRange: `${DurationHelper.ToDisplayTimeRange(props.media.startTime * 1000, props.media.endTime * 1000)}`\n }}\n />\n </p>\n )}\n\n {hasBadges && (\n <BadgeListContainer className={styles.badgeListContainer}>\n <AudienceLabel\n audience={mergedAudience}\n className='bg-white text-dark'\n border='dark'\n />\n {VideoHelper.isVideo(props.media) && (\n <Badge type={BadgeType.Rating} data={VideoHelper.getRating(props.media)} />\n )}\n {VideoHelper.isVideo(props.media) && (\n <Badge type={BadgeType.ProductionYear} data={props.media.productionYear} />\n )}\n </BadgeListContainer>\n )}\n </div>\n </section>\n );\n}\n",":local {\n .mask {\n position: absolute;\n width: 100%;\n height: 100%;\n z-index: 5;\n background-color: $black;\n opacity: 0.5;\n transition: opacity 100ms ease-in-out;\n }\n\n .centeredIcon {\n position: absolute;\n left: 50%;\n top: 50%;\n z-index: 10;\n transform: translate(-50%, -50%);\n color: $white;\n opacity: 1;\n width: 6.25rem;\n height: 6.25rem;\n }\n\n .bgImage {\n background-size: cover;\n }\n\n .centeredOverlay {\n position: absolute;\n left: 50%;\n top: 50%;\n z-index: 10;\n transform: translate(-50%, -50%);\n color: $white;\n opacity: 1;\n }\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { EntityType, LocationContext, SignUpDescriptors, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { PlayCircleSvg } from 'libs/shared/images/svg/actions/PlayCircleSvg';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './player-placeholder.module.scss';\n\nconst namespace = 'shared.playerPlaceholder';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface PlayerPlaceholderProps {\n video: VideoTypes;\n type: 'pip' | 'public';\n appLink?: Core.AppLink;\n}\n\nexport function PlayerPlaceholder(props: PlayerPlaceholderProps): JSX.Element {\n switch (props.type) {\n case 'pip':\n return <PipPlaceholder {...props} />;\n case 'public':\n return <PublicPlaceholder {...props} />;\n default:\n return <></>;\n }\n}\n\nconst PipPlaceholder = (props: PlayerPlaceholderProps) => (\n <div\n className={`position-relative responsive-img ${styles.bgImage}`}\n style={{ backgroundImage: `url('${VideoHelper.getThumbnail(props.video)?.url ?? ''}')` }}\n >\n <p className={`m-0 text-white h3 ${styles.centeredOverlay}`}>{getPhrase('playingPiP')}</p>\n <div className={styles.mask} />\n </div>\n);\n\nconst PublicPlaceholder = (props: PlayerPlaceholderProps) => {\n const thumbnailUrl = ImageHelper.createUrl(VideoHelper.getThumbnail(props.video)?.url ?? '', {\n // IMPORTANT: This should be consistent with the size used in `PublicRegionController.cs` in the backend.\n size: ImageSize.Large\n });\n\n return (\n <div\n className={`position-relative responsive-img ${styles.bgImage}`}\n style={{ backgroundImage: `url('${thumbnailUrl}')` }}\n >\n <AppLink\n appLink={props.appLink}\n analyticsOptions={{\n actionType: UserAction.Click,\n location: LocationContext.PlayPage,\n entity: EntityType.AppLink,\n workflowPhase: WorkflowPhase.Start,\n descriptor: SignUpDescriptors.SignUp\n }}\n analyticsData={{}}\n >\n <SvgContainer\n svg={PlayCircleSvg}\n className={styles.centeredIcon}\n />\n <div className={styles.mask} />\n </AppLink>\n </div>\n );\n};\n","import React from 'react';\n\nimport { AppLink } from 'libs/common/backbone/core';\nimport { Core } from 'libs/common/backbone/index';\n\nimport { Resource } from 'libs/shared/interfaces';\n\ninterface UseResourcePopupParams {\n resourcePopupId: string | undefined;\n resources: Resource[] | undefined;\n getResourceAppLink: (resource: Resource) => AppLink;\n}\n\nexport function useResourcePopup({\n resourcePopupId,\n resources,\n getResourceAppLink\n}: UseResourcePopupParams): void {\n React.useEffect(() => {\n if (!resourcePopupId)\n return;\n\n const resource = resources?.find(\n r => r.id.toString() === resourcePopupId.toString()\n );\n\n if (!resource)\n return;\n\n Core.AppLinkHelper.trigger(getResourceAppLink(resource));\n }, [resourcePopupId]);\n}\n","@import '~styles/utils/include-media';\n:local {\n .main.expandedToc {\n width: calc(100% - 15rem); //minus sidebar toc width and margin\n }\n\n .main.theatreMode {\n width: 100% !important;\n }\n\n .theatreModeContent {\n display: flex;\n margin: auto !important;\n\n @include media('<=xl') {\n max-width: 100%;\n }\n }\n\n .theatreModePlayPageContainer {\n //override TeacherLayoutComponent container style\n @media (min-width: 1200px) {\n max-width: none !important;\n }\n }\n\n .theatreModeLeftContent {\n width: calc(100% - 15rem);\n @include media('<=lg') {\n width: 100%;\n }\n }\n}","import { PlayerContextValues } from 'libs/shared/context/player-context/PlayerContext';\n\nimport styles from './play-page.module.scss';\n\ninterface GetMainClassNameProps {\n hasTheatreMode: boolean;\n shouldShowSideTableOfContents: boolean;\n tableOfContentsExpanded: boolean;\n theatreMode: boolean;\n}\n\nexport function getMainClassName(props: GetMainClassNameProps): string {\n // TOC is floating no impact on main\n if (!props.shouldShowSideTableOfContents) {\n return '';\n }\n \n // Theatre mode takes precedence\n if (props.hasTheatreMode && props.theatreMode) {\n return styles.theatreMode;\n }\n \n // Expanded TOC case\n if (props.tableOfContentsExpanded) {\n return `${styles.expandedToc} col-9`;\n }\n \n // Collapsed TOC case\n return 'pe-4';\n}\n\nexport function getContentClassName(props: GetMainClassNameProps): string {\n if (!props.hasTheatreMode) {\n return '';\n }\n\n if (props.theatreMode || !props.shouldShowSideTableOfContents) {\n return `container ${styles.theatreModeContent}`;\n }\n\n return '';\n}\n\nexport function getIsTheatreMode(hasTheatreMode: boolean, playerContext: PlayerContextValues): boolean {\n return hasTheatreMode && playerContext.defaultDisplayMode === 'theatre' && playerContext.mode === 'default';\n}\n","import React from 'react';\n\nimport { LocalStorageHelper } from 'projects/player/utils/local-storage-helper';\n\nimport { useShouldShowSideTableOfContents } from 'shared/views/play/hooks/useShouldShowTableOfContents';\n\nconst PLAY_PAGE_TOC_EXPANDED = 'play-page-toc-expanded';\n\nexport function usePlayPageTableOfContent(tocId: string, hasTheatreMode: boolean, theatreModeOn: boolean) {\n const showInSide = useShouldShowSideTableOfContents();\n const localValue = LocalStorageHelper.get(PLAY_PAGE_TOC_EXPANDED) !== 'false';\n const tocDefaultExpanded = !hasTheatreMode ? localValue : (theatreModeOn || showInSide);\n\n const [ controlledId, setControlledId ] = React.useState(tocId || '');\n const [ tableOfContentsActiveId, setTableOfContentsActiveId ] = React.useState<string>('');\n const [ tableOfContentsExpanded, setTableOfContentsExpanded ] = React.useState(tocDefaultExpanded);\n\n React.useEffect(() => {\n // Always collapse when in mobile view\n if (!showInSide) {\n setTableOfContentsExpanded(false);\n return;\n }\n\n // if has theatre mode, always expanded\n if (hasTheatreMode) {\n setTableOfContentsExpanded(true);\n return;\n }\n\n // reset to default\n setTableOfContentsExpanded(tocDefaultExpanded);\n }, [ showInSide, theatreModeOn ]);\n\n function onToggleTableOfContents() {\n if (hasTheatreMode && showInSide)\n return;\n\n setTableOfContentsExpanded(!tableOfContentsExpanded);\n LocalStorageHelper.set(PLAY_PAGE_TOC_EXPANDED, (!tableOfContentsExpanded).toString());\n }\n\n return {\n controlledId,\n setControlledId,\n tableOfContentsExpanded,\n tableOfContentsActiveId,\n setTableOfContentsActiveId,\n onToggleTableOfContents\n };\n}\n","export const ObservableTypesHelper = {\n map<K, V>(onChange: () => void): Map<K, V> {\n const map = new Map<K, V>();\n const proxy = new Proxy(map, {\n get(target: Map<K, V>, prop: string) {\n if (prop === 'set') {\n return (k: K, v: V) => {\n if (target.get(k) !== v) {\n target.set(k, v);\n onChange();\n }\n return proxy;\n };\n }\n\n const val = Reflect.get(target, prop);\n return typeof val === 'function' ? val.bind(target) : val;\n }\n });\n\n return proxy;\n }\n};\n","import { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\n\nexport const PLAY_PAGE_SECTIONS_ORDER = [\n PlayPageAnchor.Video,\n PlayPageAnchor.CurriculumLinks,\n PlayPageAnchor.Resources,\n PlayPageAnchor.Interactives,\n PlayPageAnchor.Clips,\n PlayPageAnchor.VideoDetails,\n PlayPageAnchor.ClippedFrom,\n PlayPageAnchor.Transcript,\n PlayPageAnchor.ReferenceVideo,\n PlayPageAnchor.RelatedVideos\n];\n\nexport const PLAY_PAGE_SECTIONS_ORDER_NO_GLANCE = [\n PlayPageAnchor.Video,\n PlayPageAnchor.VideoDetails,\n PlayPageAnchor.CurriculumLinks,\n PlayPageAnchor.Resources,\n PlayPageAnchor.Interactives,\n PlayPageAnchor.Clips,\n PlayPageAnchor.ClippedFrom,\n PlayPageAnchor.Transcript,\n PlayPageAnchor.ReferenceVideo,\n PlayPageAnchor.RelatedVideos\n];\n","import React from 'react';\n\nimport { useForceUpdate } from 'libs/shared/hooks/useForceUpdate';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { ObservableTypesHelper } from 'libs/shared/utils/ObservableTypesHelper';\n\nimport { PLAY_PAGE_SECTIONS_ORDER, PLAY_PAGE_SECTIONS_ORDER_NO_GLANCE } from 'shared/constants/PlayPageSectionsOrder';\n\nexport function useSectionHeadings(hasGlance: boolean) {\n const forceUpdate = useForceUpdate();\n\n // heading elements must be a live mapping of the elements on the DOM\n // there has to be a force update to recalculate heading element\n const headingRef = React.useRef<Map<PlayPageAnchor, HTMLElement>>(ObservableTypesHelper.map(forceUpdate));\n\n const headingElements = (hasGlance ? PLAY_PAGE_SECTIONS_ORDER : PLAY_PAGE_SECTIONS_ORDER_NO_GLANCE)\n .map(id => headingRef.current.get(id))\n .filter(Boolean) as HTMLElement[];\n\n return { headingRef, headingElements };\n}\n","import { DefaultDisplayMode } from 'libs/shared/context/player-context/interfaces/PlayerContextAction';\nimport { PlayerMode } from 'libs/shared/context/player-context/interfaces/PlayerMode';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\n\nexport function useTheatreModeStyle(\n hasTheatreMode: boolean,\n playerMode: PlayerMode,\n defaultDisplayMode: DefaultDisplayMode\n): boolean {\n const breakpoints = useBreakpoints();\n\n if (playerMode !== 'default') {\n return false;\n }\n\n const theatreModeOn = defaultDisplayMode === 'theatre';\n // on a smaller screen, override theatre mode style when theatre mode is on\n const overrideTheatreModeStyle = breakpoints.sm || breakpoints.md;\n const theatreMode = hasTheatreMode && theatreModeOn;\n const shouldUseTheatreModeStyle = !overrideTheatreModeStyle && theatreMode;\n return shouldUseTheatreModeStyle;\n}\n","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Clip, InteractiveMetadata, Link, Resource } from 'libs/shared/interfaces';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\n\ninterface SectionHeadingOptions {\n clips: Clip[];\n interactives: InteractiveMetadata[];\n resources: Resource[] | Link[];\n isPlayClipPage?: boolean;\n}\n\nconst namespace = 'shared.play';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const PlayPageUtils = {\n getSectionHeading(id: PlayPageAnchor, options: SectionHeadingOptions) {\n switch (id) {\n case PlayPageAnchor.Resources:\n return getPhrase('resourcesHeading', { count: options.resources?.length });\n\n case PlayPageAnchor.Clips:\n if (options.isPlayClipPage)\n return getPhrase('otherClipsHeading', { count: options.clips?.length - 1 });\n return getPhrase('clipsHeading', { count: options.clips?.length });\n\n case PlayPageAnchor.Interactives:\n return getPhrase('interactivesHeading', { count: options.interactives?.length });\n\n case PlayPageAnchor.Video:\n return getPhrase('videoHeading');\n\n case PlayPageAnchor.VideoDetails:\n return getPhrase('videoDetailsHeading');\n\n case PlayPageAnchor.RelatedVideos:\n return getPhrase('upNextHeading');\n\n case PlayPageAnchor.CurriculumLinks:\n return getPhrase('curriculumLinksHeading');\n\n case PlayPageAnchor.ClippedFrom:\n return getPhrase('clippedFromHeading');\n \n case PlayPageAnchor.ReferenceVideo:\n return getPhrase('referenceVideoHeading');\n\n case PlayPageAnchor.Transcript:\n return getPhrase('transcriptHeading');\n\n default:\n return '';\n }\n }\n\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"BQS6kDvJ2.chunk.js","names":[],"sources":["../../src/shared/views/play/hooks/useShouldShowTableOfContents.ts","../../../../libs/shared/src/components/copyright-disclaimer/copyright-disclaimer.module.scss","../../../../libs/shared/src/components/copyright-disclaimer/CopyrightDisclaimer.tsx","../../../../libs/shared/src/components/play-page/details/video-description/VideoDescription.tsx","../../../../libs/shared/src/components/play-page/details/video-details.module.scss","../../../../libs/shared/src/components/play-page/details/VideoDetailsV2.tsx","../../../../libs/common/src/react/hooks/UseEventsServiceSubscribe.ts","../../../../libs/shared/src/components/play-page/glance/video-at-a-glance.module.scss","../../../../libs/shared/src/components/play-page/glance/VideoAtAGlanceUtilsV2.ts","../../../../libs/shared/src/components/play-page/glance/points-of-interest-list/points-of-interest-list.module.scss","../../../../libs/shared/src/components/play-page/glance/points-of-interest-list/PointsOfInterestList.tsx","../../../../libs/shared/src/components/play-page/glance/VideoAtAGlanceV2.tsx","../../../../libs/shared/src/components/play-page/clips-widget/ClipWidgetItemV2.tsx","../../src/shared/components/play-page/components/play-page-clips/PlayPageClips.tsx","../../src/shared/components/play-page/components/play-page-interactives/PlayPageInteractives.tsx","../../../../libs/shared/src/images/svg/arrows/CollapseRightSvg.tsx","../../../../libs/shared/src/images/svg/arrows/ExpandLeftSvg.tsx","../../src/shared/components/play-page/components/table-of-contents/table-of-contents.module.scss","../../src/shared/components/play-page/components/table-of-contents/TableOfContents.tsx","../../src/shared/components/play-page/components/title-and-actions/title-and-actions.module.scss","../../src/shared/components/play-page/components/title-and-actions/PlayPageTitleAndActions.tsx","../../src/shared/components/player-placeholder/player-placeholder.module.scss","../../src/shared/components/player-placeholder/PlayerPlaceholder.tsx","../../src/shared/views/play/components/play-page/hooks/useResourcePopup.ts","../../src/shared/views/play/components/play-page/play-page.module.scss","../../src/shared/views/play/components/play-page/PlayPageUtils.ts","../../src/shared/views/play/hooks/usePlayPageTableOfContent.ts","../../../../libs/shared/src/utils/ObservableTypesHelper.ts","../../src/shared/constants/PlayPageSectionsOrder.ts","../../src/shared/views/play/hooks/useSectionHeadings.ts","../../src/shared/views/play/hooks/useTheatreStyle.ts","../../src/shared/views/play/PlayPageUtil.tsx"],"sourcesContent":["import { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\n\n// returns boolean value for if we should show the TOC on the side\nexport function useShouldShowSideTableOfContents(): boolean {\n const breakpoints = useBreakpoints();\n const shouldShowSideTableOfContents = breakpoints.lg || breakpoints.xl || breakpoints.xxl;\n return shouldShowSideTableOfContents;\n}\n",":local {\n .copyrightDisclaimer {\n color: $gray-500;\n }\n .overlayContainer {\n z-index: 1100;\n width: 31.25rem;\n }\n}","import React from 'react';\nimport { Overlay } from 'react-bootstrap';\nimport { Placement } from 'react-bootstrap/esm/types';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { useHoverIntent } from 'libs/shared/hooks/UseHover';\n\nimport styles from './copyright-disclaimer.module.scss';\n\nconst namespace = 'shared.copyrightDisclaimer';\n\nconst CONTAINER_HEIGHT = 150; // px\n\ninterface CopyrightDisclaimerProps {\n placement: Placement;\n overflowPlacement?: Placement;\n className?: string;\n phraseClassName?: string;\n}\n\nexport function CopyrightDisclaimer(props: CopyrightDisclaimerProps) {\n const [ ref, isHovering ] = useHoverIntent<HTMLDivElement>({});\n\n function preventOverflow() {\n const spaceBelow = document.documentElement.clientHeight - ref.current?.getBoundingClientRect().bottom;\n\n return spaceBelow < CONTAINER_HEIGHT;\n }\n\n return (\n <div ref={ref} className={props.className}>\n <p className={`${styles.copyrightDisclaimer} ${props.phraseClassName ?? 'mb-1'}`}><Text namespace={namespace} phrase='copyrightDisclaimer' /></p>\n <Overlay\n target={ref.current}\n show={isHovering}\n placement={props.overflowPlacement && preventOverflow() ? props.overflowPlacement : props.placement}\n >\n <div className={`${styles.overlayContainer} mw-100 bg-white border rounded-3 p-2`}>\n <p><Text namespace={namespace} phrase='warning' /></p>\n <p className='fw-semibold mb-0'><Text namespace={namespace} phrase='sharing' /></p>\n </div>\n </Overlay>\n </div>\n );\n}\n","import React from 'react';\n\nimport { LinkifyHelper } from 'libs/common/react/utils/LinkifyHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { ExpandableText } from 'libs/shared/components/expandable-text/ExpandableText';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\ninterface VideoDescriptionProps {\n video: VideoTypes;\n}\n\nexport function VideoDescription(props: VideoDescriptionProps): React.ReactElement {\n return (\n <ExpandableText lines={12}>\n {() => (\n <p\n className='mb-0'\n dangerouslySetInnerHTML={{\n __html: TextHelper.sanitize(LinkifyHelper.linkifyText(props.video.description, { nl2br: true }))\n }}\n />\n )}\n </ExpandableText>\n );\n}\n",":local {\n @media (min-width: #{map-get($grid-breakpoints, md)}) {\n .descriptionBorder {\n border-right: 1px solid $gray-300;\n }\n }\n}","import * as React from 'react';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Breadcrumb, Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { CopyrightDisclaimer } from 'libs/shared/components/copyright-disclaimer/CopyrightDisclaimer';\nimport { ImmersiveReader } from 'libs/shared/components/immersive-reader/ImmersiveReader';\nimport { VideoDescription } from 'libs/shared/components/play-page/details/video-description/VideoDescription';\nimport { TagHelper } from 'libs/shared/components/tags/TagHelper';\nimport { TagList } from 'libs/shared/components/tags/TagList';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { hasPPDD } from 'libs/shared/components/video-details/VideoDetailsUtils';\nimport { WidgetHeader } from 'libs/shared/components/widgets/curated-widgets/components/header/WidgetHeader';\nimport { MINIMUM_GLANCE_HEIGHT } from 'libs/shared/constants/MinimumGlanceHeight';\nimport { MasterObjectTypes } from 'libs/shared/enums/MasterObjectTypes';\nimport { TagType } from 'libs/shared/enums/TagType';\nimport { BaseObject, BasePaginatedCollection, Category, Company, CurrentUser, Library, PartnerProfile, Person, Tag, VideoTypes } from 'libs/shared/interfaces';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './video-details.module.scss';\n\nconst namespace = 'shared.videoDetailsV2';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface CommaListProps<T extends BaseObject> {\n label: string;\n items: BasePaginatedCollection<T>;\n getItemAppLink?: (item: T) => Core.AppLink;\n className?: string;\n}\n\nfunction CommaList<T extends BaseObject>(props: CommaListProps<T>): React.ReactElement {\n const { label, items, className } = props;\n\n const hasItems = items && items.data && items.data.length;\n\n if (!hasItems)\n return <></>;\n\n if (typeof props.getItemAppLink !== 'function') {\n const commaSeperated = items.data.map(i => i.name?.trim()).join(', ');\n return (\n <div className={className}>{label}: {commaSeperated}</div>\n );\n }\n\n return (\n <div className={className}>\n <span>{label}: </span>\n {items.data.map((item, index) => (\n <React.Fragment key={item.id}>\n <AppLink key={item.id} appLink={props.getItemAppLink(item)}>\n {item.name?.trim()}\n </AppLink>\n {index < items.data.length - 1 && <span>, </span>}\n </React.Fragment>\n ))}\n </div>\n );\n}\n\ninterface LibraryCategoryPair {\n library: Library;\n category: Category;\n}\n\nfunction getCustomLibraryCategoryPairs(video: VideoTypes): LibraryCategoryPair[] {\n const categories = video.categories?.data;\n if (!categories?.length)\n return [];\n\n return categories.filter(category => category.libraries?.data?.[0]?.type === MasterObjectTypes.CustomLibrary)\n .map(category => ({ library: category.libraries?.data?.[0], category }));\n}\n\ninterface CreateLibraryBreadcrumbsOptions {\n pair: LibraryCategoryPair;\n getLibraryAppLink: (library: Library) => Core.AppLink;\n getFolderAppLink: (library: Library, folder: Category) => Core.AppLink;\n}\n\nfunction createLibraryBreadcrumbs(options: CreateLibraryBreadcrumbsOptions): Breadcrumb[] {\n const breadcrumbs: Breadcrumb[] = [\n {\n name: options.pair.library.name,\n appLink: options.getLibraryAppLink?.(options.pair.library)\n },\n { name: '...' },\n {\n name: options.pair.category.name,\n appLink: options.getFolderAppLink?.(options.pair.library, options.pair.category)\n }\n ];\n\n return breadcrumbs;\n}\n\nfunction DetailsSection(props: VideoDetailsWithScrollbarV2Props): React.ReactElement {\n const { video } = props;\n\n if (!VideoHelper.isVideo(video) && !VideoHelper.isClip(video))\n return <></>;\n\n const parentVideo = VideoHelper.getParentVideo(video);\n const libraryPairs = getCustomLibraryCategoryPairs(video);\n\n function getPartnerProfileAppLink(company: Company) {\n if (!company.partnerProfiles || !company.partnerProfiles?.data?.length)\n return;\n\n if (company.partnerProfiles?.count > 1 && typeof props.getPartnerDashboardHubAppLink === 'function')\n return props.getPartnerDashboardHubAppLink(company);\n\n if (typeof props.getPartnerProfileAppLink === 'function')\n return props.getPartnerProfileAppLink(company.partnerProfiles?.data?.[0]);\n\n return;\n }\n\n return (\n <div className={video.description ? 'col-md-5 ps-md-3 pt-3 pt-md-0' : 'col-12'}>\n <h2 className='h6 mb-1'><Text phrase='details' /></h2>\n {!!parentVideo.productionYear && (\n <div className='mb-1'>\n <Text phrase='productionYear' options={{ year: parentVideo.productionYear }} />\n </div>\n )}\n <CommaList<Company>\n label={getPhrase('productionCompanies', { smartCount: parentVideo.productionCompanies?.data?.length })}\n items={parentVideo.productionCompanies}\n getItemAppLink={getPartnerProfileAppLink}\n className='mb-1'\n />\n <CommaList<Company>\n label={getPhrase('distributors', { smartCount: parentVideo.distributors?.data?.length })}\n items={parentVideo.distributors}\n getItemAppLink={getPartnerProfileAppLink}\n className='mb-1'\n />\n <CommaList\n label={getPhrase('producers', { smartCount: parentVideo.producers?.data?.length })}\n items={parentVideo.producers}\n className='mb-1'\n />\n <CommaList\n label={getPhrase('directors', { smartCount: parentVideo.directors?.data?.length })}\n items={parentVideo.directors}\n className='mb-1'\n />\n {!!parentVideo.dateBroadcast && (\n <div className='mb-1'>\n <Text phrase='dateBroadcast' options={{ date: DateHelper.format(parentVideo.dateBroadcast, 'DD/MM/YYYY') }} />\n </div>\n )}\n {!!parentVideo.channel && (\n <div className='mb-1'>\n <Text phrase='channel' options={{ channel: parentVideo.channel.name }} />\n </div>\n )}\n {VideoHelper.canViewUploadDate(props.video) && (\n <div className='mb-1'>\n <Text phrase='dateUploaded' options={{ date: DateHelper.format(video.dateCreated, 'DD/MM/YYYY') }} />\n </div>\n )}\n {!!(libraryPairs.length && props.getLibraryAppLink && props.getFolderAppLink) && (\n <div className='mb-1'>\n <div>{getPhrase('libraries', { smartCount: libraryPairs.length })}:</div>\n {libraryPairs.map((pair, index) => (\n <div key={index}>\n <Breadcrumbs\n breadcrumbs={createLibraryBreadcrumbs({\n pair,\n getLibraryAppLink: props.getLibraryAppLink,\n getFolderAppLink: props.getFolderAppLink\n })}\n linkClassName='text-info'\n />\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n\ninterface VideoDetailsWithScrollbarV2Props {\n video: VideoTypes;\n currentUser: CurrentUser;\n getTagAppLink?: (tag: Tag) => Core.AppLink;\n onLaunchImmersiveReader?: () => void;\n onExitImmersiveReader?: () => void;\n maxHeight?: number;\n suppressInteractivity?: boolean;\n hideTags?: boolean;\n headingRef?: React.MutableRefObject<Map<PlayPageAnchor, HTMLElement>>;\n showHeading?: boolean;\n getPartnerProfileAppLink?: (partnerProfile: PartnerProfile) => Core.AppLink;\n getPartnerDashboardHubAppLink?: (company: Company | Person) => Core.AppLink;\n getLibraryAppLink?: (library: Library) => Core.AppLink;\n getFolderAppLink?: (library: Library, folder: Category) => Core.AppLink;\n}\n\nexport function VideoDetailsWithScrollbarV2(props: VideoDetailsWithScrollbarV2Props): React.ReactElement {\n const { video, maxHeight = MINIMUM_GLANCE_HEIGHT } = props;\n\n const parentVideo = VideoHelper.getParentVideo(video);\n\n const showDescription = !!props.video.description;\n\n const showDetails = (\n hasPPDD(props.video) ||\n !!parentVideo.productionYear ||\n !!parentVideo.dateBroadcast ||\n !!parentVideo.channel ||\n VideoHelper.canViewUploadDate(props.video)\n );\n\n if (!showDescription && !showDetails)\n return <></>;\n\n function getTags(): Tag[] {\n if (props.hideTags || VideoHelper.isInteractive(props.video) || !props.video.tags?.data?.length)\n return null;\n\n return props.video.tags?.data?.filter(tag => tag.tagType === TagType.Normal);\n }\n const tags = getTags();\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <section\n id={PlayPageAnchor.VideoDetails}\n ref={el => {\n (el && props.headingRef?.current) && props.headingRef.current.set(PlayPageAnchor.VideoDetails, el);\n }}\n className='play-page-section'\n >\n {props.showHeading && <WidgetHeader name={getPhrase('heading')} />}\n <div className='rounded border p-3 position-relative'>\n <Scrollbars autoHeight autoHeightMax={maxHeight} hideTracksWhenNotNeeded>\n <div className='row g-0'>\n {showDescription && (\n <div className={showDetails ? `${styles.descriptionBorder} pe-3 col-md-7` : 'col-12'}>\n <div className='d-flex align-items-center'>\n <h2 className='h6 mb-1'>\n <Text phrase='description' />\n </h2>\n <ImmersiveReader\n text={video.description}\n title={video.name}\n className='ps-2'\n onLaunch={props.onLaunchImmersiveReader}\n onExit={props.onExitImmersiveReader}\n analyticsOptions={{\n location: LocationContext.PlayPage,\n entity: EntityType.Video,\n actionType: UserAction.Click,\n descriptor: ClickDescriptor.LaunchImmersiveReader\n }}\n analyticsData={{ id: video.id, type: 'description' }}\n />\n </div>\n\n <VideoDescription video={props.video} />\n </div>\n )}\n\n {showDetails && (\n <DetailsSection {...props} />\n )}\n </div>\n\n {!!tags?.length && (\n <div className='mt-3'>\n <h2 className='h6 mb-1'><Text phrase='normalTags' /></h2>\n <TagList\n tags={tags}\n {...TagHelper.getTagActionProps(props.getTagAppLink, null, props.suppressInteractivity)}\n className='mt-1'\n />\n </div>\n )}\n\n {VideoHelper.isBroadcast(props.video) && (\n <CopyrightDisclaimer\n placement='bottom-start'\n className='d-flex justify-content-start mt-2'\n phraseClassName='mb-0'\n overflowPlacement='top-start'\n />\n )}\n\n </Scrollbars>\n </div>\n </section>\n </LanguageNamespaceContext.Provider>\n );\n}\n","import { useEffect } from 'react';\n\nimport { EventsService } from 'libs/common/react/services/EventsService';\n\n/**\n * \n * @param event the event to subscribe to\n * @param callback the callback function\n * @param once whether to subscribe once\n * @param shouldSubscribe conditionally determine whether to subscribe to events\n * @returns unsubscribe function\n */\nexport function useEventsServiceSubscribe(\n event: string,\n callback: (...args: any[]) => void,\n once?: boolean,\n shouldSubscribe?: boolean\n): () => void {\n const unsubscribe = () => {\n EventsService.unsubscribe(event, callback);\n };\n\n useEffect(() => {\n if (!shouldSubscribe)\n return;\n\n once ? EventsService.subscribeOnce(event, callback) : EventsService.subscribe(event, callback);\n\n return () => {\n unsubscribe();\n };\n }, []);\n\n return unsubscribe;\n}\n",":local{\n .learningIntention p:last-child {\n margin-bottom: -1rem !important; //offset last p element margin \n }\n\n .learningIntention p:not(:last-child) {\n margin-bottom: 0.5rem !important; \n }\n\n .highlightPoi {\n text-decoration: underline;\n }\n\n .icon {\n float:left;\n clear:both;\n }\n}","import { MutableRefObject, useEffect, useRef, useState } from 'react';\nimport { marked } from 'marked';\n\nimport { useEventsServiceSubscribe } from 'libs/common/react/hooks/UseEventsServiceSubscribe';\nimport { EventsService } from 'libs/common/react/services/EventsService';\n\nimport { Clip, Glance, PointOfInterest, Video } from 'libs/shared/interfaces';\n\nimport styles from './video-at-a-glance.module.scss';\n\nconst POI_LINK_LINE = /\\[\\]\\(cv:\\/\\/poi\\?id=\\d+\\)\\n*/g;\n\nfunction stripPoisFromGlanceContent(glanceContent: string): string {\n return glanceContent.replace(POI_LINK_LINE, '');\n}\n\nfunction getLearningIntentionHTML(glance: Glance): string {\n const learningIntention = stripPoisFromGlanceContent(glance.content);\n\n return marked(learningIntention, { async: false });\n}\n\nexport function useLearningIntentionMarkdown(\n video: Video,\n hasGlanceData?: boolean\n): string {\n const [ markdownHTML, setMarkdownHTML ] = useState('');\n\n useEffect(() => {\n if (!hasGlanceData || !video.glance?.content)\n return;\n\n const content = getLearningIntentionHTML(video.glance);\n\n setMarkdownHTML(content);\n }, [ video.glance?.content, hasGlanceData ]);\n\n return markdownHTML;\n}\n\nexport function hasGlanceData(video: Video | Clip): boolean {\n return video.glance?.content && video.glance?.format === 'text/markdown';\n}\n\nexport function useHighlightPointOfInterest(\n pointOfInterest: PointOfInterest,\n shouldHighlight: boolean\n): MutableRefObject<HTMLDivElement> {\n const ref = useRef<HTMLDivElement>(null);\n\n useEventsServiceSubscribe('player:poi:mouseover', onPlayerPoiMouseOver, null, shouldHighlight);\n useEventsServiceSubscribe('player:poi:mouseleave', onPlayerPoiMouseLeave, null, shouldHighlight);\n\n useEffect(() => {\n if (!ref.current || !shouldHighlight)\n return;\n\n ref.current?.addEventListener('mouseover', onGlancePoiMouseOver);\n ref.current?.addEventListener('mouseleave', onGlancePoiMouseLeave);\n\n return () => {\n ref.current?.removeEventListener('mouseover', onGlancePoiMouseOver);\n ref.current?.removeEventListener('mouseleave', onGlancePoiMouseLeave);\n };\n }, [ref.current]);\n\n function onPlayerPoiMouseOver(hoveredPoi: PointOfInterest): void {\n if (!hoveredPoi?.id || pointOfInterest?.id?.toString() !== hoveredPoi?.id?.toString())\n return;\n\n ref.current?.classList.add(styles.highlightPoi);\n }\n\n function onPlayerPoiMouseLeave(): void {\n ref.current?.classList.remove(styles.highlightPoi);\n }\n\n /**\n * `this` will be the element to which the eventListener is bound.\n */\n function onGlancePoiMouseOver(): void {\n if (pointOfInterest)\n EventsService.trigger('glance:poi:mouseover', pointOfInterest);\n }\n\n function onGlancePoiMouseLeave(): void {\n EventsService.trigger('glance:poi:mouseleave');\n }\n\n return ref;\n}\n",":local {\n .poiEntry {\n flex-wrap: nowrap;\n align-items: start;\n &:hover {\n .poiText:not(.public) {\n text-decoration: underline;\n }\n } \n }\n\n .public {\n margin-top: 0.125rem;\n }\n\n .poiText {\n margin-top: 0.125rem;\n }\n\n .poiTimeStamp {\n height: 1.5rem;\n min-width: 3.5625rem;\n &.wideBadge {\n min-width: 4.375rem;\n }\n }\n}","import React from 'react';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PointOfInterest } from 'libs/shared/interfaces';\nimport { DurationHelper } from 'libs/shared/utils/DurationHelper';\n\nimport { useHighlightPointOfInterest } from '../VideoAtAGlanceUtilsV2';\n\nimport styles from './points-of-interest-list.module.scss';\n\ninterface PointOfInterestProps {\n poi: PointOfInterest;\n suppressInteractivity?: boolean;\n onClickPoiItem: (time: number) => void;\n wideBadge?: boolean;\n}\n\nfunction PointOfInterestItem(props: PointOfInterestProps): JSX.Element {\n const timeStamp = DurationHelper.ToDisplayDuration(props.poi.startTime * 1000);\n\n const ref = useHighlightPointOfInterest(props.poi, !props.suppressInteractivity);\n\n if (props.suppressInteractivity) {\n return (\n <div className={`d-flex ${styles.poiEntry} mb-2`}>\n <span className={`d-flex rounded-pill justify-content-center align-items-center text-info bg-light-blue ${styles.poiTimeStamp} ${props.wideBadge ? styles.wideBadge : ''}`}>{timeStamp}</span>\n <div className={`${styles.public} ms-2`}>{props.poi.description}</div>\n </div>\n );\n }\n\n return (\n <DivButton\n key={props.poi.startTime}\n className={`d-flex ${styles.poiEntry} mb-2 cursor-pointer`}\n onClick={() => props.onClickPoiItem(props.poi.startTime)}\n ref={ref}\n >\n <div className={`d-flex rounded-pill justify-content-center align-items-center text-info bg-light-blue ${styles.poiTimeStamp} ${props.wideBadge ? styles.wideBadge : ''}`}>{timeStamp}</div>\n <div className={`ms-2 ${styles.poiText}`}>{props.poi.description}</div>\n </DivButton>\n );\n}\n\ninterface PointOfInterestListProps {\n pointsOfInterest: PointOfInterest[];\n suppressInteractivity?: boolean;\n onClickPoiItem: (time: number) => void;\n}\n\nconst namespace = 'shared.pointsOfInterestList';\n\nexport function PointOfInterestList(props: PointOfInterestListProps) {\n const sortedPointsOfInterest = props.pointsOfInterest.sort((a, b) => a.startTime - b.startTime);\n const hasTimePointOverHours = sortedPointsOfInterest.some(poi => poi.startTime >= 3600);\n\n return (\n <div>\n <h2 className='h6 my-2'><Text namespace={namespace} phrase='heading' /></h2>\n\n <div>\n {sortedPointsOfInterest.map(poi => {\n return (\n <PointOfInterestItem\n key={poi.startTime}\n poi={poi}\n suppressInteractivity={props.suppressInteractivity}\n onClickPoiItem={props.onClickPoiItem}\n wideBadge={hasTimePointOverHours}\n />\n );\n })}\n\n </div>\n </div>\n );\n}\n","import * as React from 'react';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\n\nimport { Core } from 'libs/common/core';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { CopyContentIconButton } from 'libs/shared/components/play-page/copy-content-icon-button/CopyContentIconButton';\nimport { PointOfInterestList } from 'libs/shared/components/play-page/glance/points-of-interest-list/PointsOfInterestList';\nimport { TagHelper } from 'libs/shared/components/tags/TagHelper';\nimport { TagList } from 'libs/shared/components/tags/TagList';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { TagType } from 'libs/shared/enums/TagType';\nimport { PointOfInterest, Tag, Video } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { useLearningIntentionMarkdown } from './VideoAtAGlanceUtilsV2';\n\nimport styles from './video-at-a-glance.module.scss';\n\nconst namespace = 'shared.videoAtAGlanceV2';\n\n// Pixel value selected to try and make it so that when there are more\n// POIs below the fold, that the user can see some of the next one so\n// they know they can scroll. E.g. https://imgur.com/TQyL0Bq\nconst SCROLL_HEIGHT_MAX = 365; // in px\n\ninterface ScrollbarWrapperProps {\n hideScrollbar?: boolean;\n}\n\nfunction ScrollbarWrapper(props: React.PropsWithChildren<ScrollbarWrapperProps>): JSX.Element {\n if (props.hideScrollbar)\n return <>{props.children}</>;\n\n return (\n <div className='rounded border mb-4 bg-white'>\n <Scrollbars\n autoHeight\n autoHeightMax={SCROLL_HEIGHT_MAX}\n >\n <div className='px-3 pt-3 pb-2'>\n {props.children}\n </div>\n </Scrollbars>\n </div>\n );\n}\n\ninterface VideoAtAGlanceV2Props {\n video: Video;\n pointsOfInterest?: PointOfInterest[];\n suppressInteractivity?: boolean;\n setStartTime?: (time: number) => void;\n getTagAppLink?: (tag: Tag) => Core.AppLink;\n onClickTag?: () => void;\n hideScrollbar?: boolean;\n canViewGlance: boolean;\n}\n\nexport function VideoAtAGlanceV2(props: VideoAtAGlanceV2Props): JSX.Element {\n const learningIntentionMarkdownHTML = useLearningIntentionMarkdown(props.video, props.canViewGlance);\n const [ textToCopy, setTextToCopy ] = React.useState('');\n\n function logUserAction(): void {\n const analyticsData = {\n id: props.video.glance.id,\n name: props.video.glance.name,\n videoId: props.video.id,\n videoName: props.video.name,\n learningIntention: textToCopy\n };\n\n const analyticsOptions = {\n actionType: UserAction.Copy,\n entity: EntityType.Glance,\n location: LocationContext.PlayPage\n };\n AnalyticsHelper.logUserAction(analyticsData, analyticsOptions);\n }\n\n function getTags(): Tag[] {\n if (VideoHelper.isInteractive(props.video) || !props.video.tags?.data?.length)\n return null;\n\n return props.video.tags?.data?.filter(tag => tag.tagType === TagType.Pedagogy || tag.tagType === TagType.Skill);\n }\n const tags = getTags();\n\n const ref = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n if (ref.current?.innerText)\n setTextToCopy(ref.current.innerText);\n }, [ref.current?.innerText]);\n\n if (!props.canViewGlance)\n return <></>;\n\n function onClickPoiItem(time: number) {\n props.setStartTime(time);\n }\n\n return (\n <section className='play-page-section'>\n <ScrollbarWrapper hideScrollbar={props.hideScrollbar}>\n <h2 className='h6 mb-2'><Text namespace={namespace} phrase='learningIntention' /></h2>\n \n <div className={`mb-3 ${styles.learningIntention}`}>\n <CopyContentIconButton\n copyableContent={textToCopy}\n tooltipClassName={styles.icon}\n onClick={logUserAction}\n visible\n />\n <div\n dangerouslySetInnerHTML={{ __html: TextHelper.sanitize(learningIntentionMarkdownHTML) }}\n className='d-inline'\n ref={ref}\n >\n </div>\n </div>\n\n {!!tags?.length && (\n <div>\n <TagList\n tags={tags}\n {...TagHelper.getTagActionProps(props.getTagAppLink, props.onClickTag, props.suppressInteractivity)}\n className='mt-2'\n />\n </div>\n )}\n\n {!!props.pointsOfInterest?.length && (\n <div className='mt-3'>\n <PointOfInterestList\n pointsOfInterest={props.pointsOfInterest}\n suppressInteractivity={props.suppressInteractivity}\n onClickPoiItem={onClickPoiItem}\n />\n </div>\n )}\n </ScrollbarWrapper>\n </section>\n );\n}\n","import React from 'react';\n\nimport { ThumbnailText } from 'libs/shared/components/thumbnails/thumbnail-text/ThumbnailText';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { FixedWidgetItemProps } from 'libs/shared/components/widgets/items/FixedWidgetItemProps';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { Clip, PresentationAudience } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\n\nexport interface ClipWidgetItemV2Props extends FixedWidgetItemProps<Clip> {\n audiences: PresentationAudience[];\n commonVideoProps: CommonVideoProps;\n showOwner?: boolean;\n}\n\nexport const ClipWidgetItemV2 = React.memo(function(props: ClipWidgetItemV2Props): JSX.Element {\n const { data: clip, thumbnailSize, preloadImage, getAppLink } = props;\n const mergedAudience = useMergeAudiences(clip.subjectPresentationAudiences?.data, props.audiences);\n\n return (\n <div className='flex-shrink-0 px-1 col-6 col-sm-4'>\n <VideoThumbnail\n type='static'\n textPosition={ThumbnailTextPosition.Independent}\n video={clip}\n appLink={getAppLink(clip)}\n imageOptions={{ size: thumbnailSize }}\n preload={preloadImage}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n audience={mergedAudience}\n hideDuration={false}\n commonVideoProps={props.commonVideoProps}\n />\n\n <div className='mt-2'>\n <ThumbnailText\n {...props}\n video={clip}\n appLink={props.getAppLink(clip)}\n />\n </div>\n </div>\n );\n});\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { ClipWidgetItemV2 } from 'libs/shared/components/play-page/clips-widget/ClipWidgetItemV2';\nimport { FixedWidget } from 'libs/shared/components/widgets/fixed-widget';\nimport { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { Clip, PresentationAudience, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'shared.playPageClips';\n\ninterface PlayPageClipsProps {\n presentationSlug: string | null;\n video: Video | Clip;\n clips: Clip[];\n canViewClips: boolean;\n audiences: PresentationAudience[];\n analyticsData: HashObject;\n headingRef?: React.MutableRefObject<Map<PlayPageAnchor, HTMLElement>>;\n commonVideoProps: CommonVideoProps;\n}\n\nexport function PlayPageClips(props: PlayPageClipsProps): JSX.Element {\n if (!props.canViewClips || !props.clips?.length)\n return <></>;\n\n const parentIsVideo = VideoHelper.isVideo(props.video);\n\n function getAppLink() {\n if (VideoHelper.isVideo(props.video)) {\n return {\n action: Actions.Videos.VIDEO_CLIPS,\n application: AppChannels.VIDEOS,\n args: [\n props.presentationSlug,\n props.video.id,\n TextHelper.slugify(props.video.name)\n ]\n };\n }\n return {\n action: Actions.Clips.CLIP_CLIPS,\n application: AppChannels.CLIPS,\n args: [ props.video.id, TextHelper.slugify(props.video.name) ]\n };\n }\n\n const title = LanguageService.getPhrase(\n namespace,\n parentIsVideo ? 'clips' : 'otherClips',\n { count: props.clips.length }\n );\n\n return (\n <section\n className='play-page-section'\n id={PlayPageAnchor.Clips}\n ref={el => {\n (el && props.headingRef?.current) && props.headingRef.current.set(PlayPageAnchor.Clips, el);\n }}\n >\n <FixedWidget\n name={title}\n contents={WidgetContents.ClipsV2}\n collection={props.clips}\n prefetched\n getChildAppLink={(clip: Clip) => {\n return {\n application: AppChannels.CLIPS,\n action: Actions.Clips.PLAY_CLIP,\n args: [ clip.id, TextHelper.slugify(clip.name) ]\n };\n }}\n appLink={getAppLink()}\n childComponent={ClipWidgetItemV2}\n extraChildComponentProps={{\n audiences: props.audiences,\n showOwner: true,\n commonVideoProps: props.commonVideoProps\n }}\n analyticsData={props.analyticsData}\n />\n </section>\n );\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { InteractiveWidgetItem } from 'libs/shared/components/play-page/interactives-widget/InteractiveWidgetItem';\nimport { FixedWidget } from 'libs/shared/components/widgets/fixed-widget';\nimport { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { Clip, Interactive, InteractiveMetadata, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'shared.playPageInteractives';\n\ninterface PlayPageInteractivesProps {\n presentationSlug: string | null;\n canViewInteractives: boolean;\n video: Video | Clip;\n interactives: InteractiveMetadata[];\n analyticsData: HashObject;\n headingRef?: React.MutableRefObject<Map<PlayPageAnchor, HTMLElement>>;\n commonVideoProps: CommonVideoProps;\n}\n\nexport function PlayPageInteractives(props: PlayPageInteractivesProps): JSX.Element {\n if (!props.canViewInteractives || !props.interactives?.length)\n return <></>;\n\n function getAppLink() {\n if (VideoHelper.isVideo(props.video))\n return {\n action: Actions.Videos.VIDEO_INTERACTIVES,\n application: AppChannels.VIDEOS,\n args: [\n props.presentationSlug,\n props.video.id,\n TextHelper.slugify(props.video.name)\n ]\n };\n\n return {\n action: Actions.Clips.CLIP_INTERACTIVES,\n application: AppChannels.CLIPS,\n args: [ props.video.id, TextHelper.slugify(props.video.name) ]\n };\n }\n\n const title = LanguageService.getPhrase(namespace, 'interactives', { count: props.interactives.length });\n \n return (\n <section className='play-page-section'\n id={PlayPageAnchor.Interactives}\n ref={el => {\n (el && props.headingRef?.current) && props.headingRef.current.set(PlayPageAnchor.Interactives, el);\n }}\n >\n <FixedWidget\n name={title}\n contents={WidgetContents.InteractivesV2}\n collection={props.interactives}\n prefetched\n getChildAppLink={(interactive: Interactive) => {\n return {\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.VIEW_INTERACTIVE,\n args: [ interactive.id, TextHelper.slugify(interactive.name) ]\n };\n }}\n appLink={getAppLink()}\n childComponent={InteractiveWidgetItem}\n extraChildComponentProps={{\n questionsAppLink: {\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.PREVIEW_QUESTIONS\n },\n showOwner: true,\n commonVideoProps: props.commonVideoProps\n }}\n analyticsData={props.analyticsData}\n />\n </section>\n );\n}\n","import React from 'react';\n\nexport function CollapseRightSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n d='M5.455 12c0 .401.325.727.727.727h9.88l-3.849 3.85a.728.728 0 0 0 1.029 1.028l5.09-5.091a.73.73 0 0 0 .213-.514v7.272a.727.727 0 0 0 1.455 0V4.727a.727.727 0 0 0-1.455 0V12a.73.73 0 0 0-.213-.515l-5.09-5.09a.727.727 0 1 0-1.029 1.028l3.85 3.85H6.181a.727.727 0 0 0-.727.727'\n fill='currentColor'\n />\n </svg>\n );\n}\n","import React from 'react';\n\nexport function ExpandLeftSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n d='M20 12a.727.727 0 0 0-.727-.728h-9.88l3.848-3.849a.727.727 0 1 0-1.028-1.029l-5.091 5.091a.73.73 0 0 0-.213.514V4.727a.727.727 0 0 0-1.454 0v14.545a.727.727 0 0 0 1.454 0V12c0 .186.071.373.213.515l5.091 5.09a.727.727 0 0 0 1.029-1.028l-3.85-3.85h9.88A.727.727 0 0 0 20 12'\n fill='currentColor'\n />\n </svg>\n );\n}\n",":local{\n .showInSide {\n position: sticky;\n top: 5.4375rem;\n height: 100%;\n z-index: 80;\n }\n\n .container {\n padding-right: 0;\n height: fit-content;\n }\n\n .aside {\n .container {\n min-width: 10rem; // make enough space for the collapse icon\n }\n .collapse {\n display: none;\n right: 0;\n top: 0;\n }\n &:hover {\n .collapse {\n display: block;\n }\n }\n }\n\n .iconContainer {\n .arrowIcon {\n display: none;\n }\n .listIcon {\n display: block;\n }\n &:hover {\n .listIcon {\n display: none;\n }\n .arrowIcon {\n display: block;\n }\n }\n }\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { PortalHelper } from 'libs/common/react/utils/PortalHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, HashObject, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { TableOfContentsList } from 'libs/shared/components/table-of-contents-list/TableOfContentsList';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { CollapseRightSvg } from 'libs/shared/images/svg/arrows/CollapseRightSvg';\nimport { ExpandLeftSvg } from 'libs/shared/images/svg/arrows/ExpandLeftSvg';\nimport { TableOfContentsSvg } from 'libs/shared/images/svg/objects/TableOfContentsSvg';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { ContextService } from 'libs/shared/services/ContextService';\n\nimport { PLAY_PAGE_TOC_PORTAL_ID } from 'shared/layouts/teacher-layout/TeacherLayoutComponent';\n\nimport styles from './table-of-contents.module.scss';\n\nconst namespace = 'shared.playPage';\n\nexport const TOC_IGNORE_BOUNDARY = 3;\n\nexport interface TableOfContentsItem {\n name: string;\n id: PlayPageAnchor;\n}\n\ninterface TableOfContentsProps {\n items: TableOfContentsItem[];\n activeId: string;\n appLink?: Core.AppLink;\n analyticsData?: HashObject;\n setControlledId: (arg: string) => void;\n isExpanded: boolean;\n setIsExpanded: (arg: boolean) => void;\n toggleTheatreMode?: (value: boolean) => void;\n showInSide: boolean;\n isTheatreMode: boolean;\n hasTranscription: boolean;\n shouldShow: boolean;\n}\n\nfunction TableOfContentsIcon(props: TableOfContentsProps) {\n function logUserAction() {\n const analyticsOptions = {\n actionType: !props.isExpanded ? UserAction.Open : UserAction.Hide,\n entity: EntityType.TableOfContents,\n location: LocationContext.PlayPage\n };\n\n AnalyticsHelper.logUserAction(props.analyticsData, analyticsOptions);\n }\n\n function onClickIcon() {\n const shouldExpand = !props.isExpanded;\n props.setIsExpanded(shouldExpand);\n\n if (shouldExpand) {\n props.toggleTheatreMode?.(false);\n // users has not transcription mode should still abel to collapse\n if (!props.toggleTheatreMode) {\n props.setIsExpanded(false);\n }\n } else {\n props.toggleTheatreMode?.(true);\n if (!props.toggleTheatreMode) {\n props.setIsExpanded(true);\n }\n }\n logUserAction();\n }\n\n return (\n <div className='d-flex justify-content-end'>\n <div className={styles.container}>\n <div className={`${styles.iconContainer}`} >\n <IconButton\n className={`btn btn-outline-dark ${styles.listIcon}`}\n svg={TableOfContentsSvg}\n onClick={onClickIcon}\n />\n \n <IconButton\n className={`btn btn-outline-dark ${styles.arrowIcon}`}\n svg={!props.isExpanded ? ExpandLeftSvg : CollapseRightSvg}\n onClick={onClickIcon}\n />\n </div>\n </div>\n </div>\n );\n}\n\nfunction TableOfContents(props: TableOfContentsProps) {\n function logUserAction() {\n const analyticsOptions = {\n actionType: UserAction.Hide,\n entity: EntityType.TableOfContents,\n location: LocationContext.PlayPage\n };\n\n AnalyticsHelper.logUserAction(props.analyticsData, analyticsOptions);\n }\n\n function getAppLink(item: any): Core.AppLink {\n const currentAppLink = ContextService.getCurrentRoute().appLink;\n\n const params: HashObject = currentAppLink.params ?\n { ...(currentAppLink.params as HashObject) } :\n {};\n\n params.tocId = item.id;\n\n return {\n ...currentAppLink,\n params\n };\n }\n\n function onClickTableOfContentsHeading() {\n if (!props.showInSide) {\n // in mobile version, collapse once user hit the TOC item\n props.setIsExpanded(false);\n }\n }\n\n return (\n <div className={!props.showInSide ? 'd-inline-flex gap-1' : `col ms-2 ps-4 ${styles.showInSide}`}>\n <aside className={`${styles.aside} position-relative ${!props.showInSide ? 'px-3 pt-3 pb-2 border border-dark rounded-1 bg-white' : 'pe-1 pt-1 '}`}>\n <div className={`${styles.container}`}>\n {/* keep this for customers has no transcription turned on */}\n {props.showInSide && !props.hasTranscription && (\n <IconButton\n className={`btn position-absolute ${styles.collapse}`}\n svg={CollapseRightSvg}\n onClick={() => {\n props.setIsExpanded(false);\n props.toggleTheatreMode?.(true);\n logUserAction();\n }}\n />\n )}\n <h2 className='h5'><Text namespace={namespace} phrase='tocHeading' /></h2>\n \n <TableOfContentsList\n items={props.items}\n activeId={props.activeId}\n getAppLink={getAppLink}\n setControlledId={props.setControlledId}\n analyticsData={props.analyticsData}\n onItemClick={() => onClickTableOfContentsHeading()}\n />\n </div>\n \n </aside>\n {/* in mobile version, always show icon on the right */}\n {!props.showInSide && <TableOfContentsIcon {...props}/>}\n </div>\n );\n}\n\nexport function TableOfContentsContainer(props: TableOfContentsProps): JSX.Element {\n if (!props.shouldShow)\n return <></>;\n \n return (\n <>\n {/* web version show table of contents next to player */}\n {props.isExpanded && props.showInSide && <TableOfContents {...props}/>}\n\n {/* web version show icon in portal (RHS of window) */}\n {PortalHelper.renderInPortalIfExists(\n !props.isExpanded && <TableOfContentsIcon {...props}/>,\n document.getElementById(PLAY_PAGE_TOC_PORTAL_ID)\n )}\n\n {/* mobile version show in portal */}\n {PortalHelper.renderInPortalIfExists(\n !props.showInSide && props.isExpanded && <TableOfContents {...props}/>,\n document.getElementById(PLAY_PAGE_TOC_PORTAL_ID)\n )}\n </>\n );\n}\n",":local {\n .series {\n font-size: 0.75rem;\n font-weight: 500;\n }\n\n .badgeListContainer {\n :global(.badge) {\n height: 1.25rem;\n display: flex;\n align-items: center;\n }\n }\n\n .clipOriginInfo:not(:last-child) {\n margin-bottom: 0.5rem !important;\n }\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { Actions } from 'libs/shared/components/actions/Actions';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { AudienceLabel } from 'libs/shared/components/audience-label/AudienceLabel';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BadgeListContainer } from 'libs/shared/components/badges/BadgeListContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { RestrictionPadlock } from 'libs/shared/components/video-list/components/restriction-padlock/RestrictionPadlock';\nimport { VideoSubText, VideoSubTextType } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { Clip, PresentationAudience, Video, YearGroup } from 'libs/shared/interfaces';\nimport { DurationHelper } from 'libs/shared/utils/DurationHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { VideoFeaturesHash } from 'shared/hooks/useVideoFeatureAccess';\n\nimport styles from './title-and-actions.module.scss';\n\nconst namespace = 'shared.playPage';\n\ninterface PlayPageTitleAndActionsProps {\n presentationSlug: string | null;\n media: Clip | Video;\n yearGroups: YearGroup[];\n audiences: PresentationAudience[];\n featureAccess: VideoFeaturesHash;\n originalVideoAppLink?: Core.AppLink;\n shareId: string;\n showTitlePadlock: boolean;\n subTextType?: VideoSubTextType;\n subtextAppLink?: Core.AppLink;\n}\n\nexport function PlayPageTitleAndActions(props: PlayPageTitleAndActionsProps): JSX.Element {\n const mergedAudience = useMergeAudiences(props.media.subjectPresentationAudiences?.data, props.audiences);\n\n const containerRef = React.useRef<HTMLDivElement>(null);\n const titleContainerRef = React.useRef<HTMLDivElement>(null);\n\n const hasBadges = (\n (VideoHelper.isVideo(props.media) && !!VideoHelper.getRating(props.media)?.value) ||\n (VideoHelper.isVideo(props.media) && !!props.media.productionYear) ||\n !!props.media.subjectPresentationAudiences?.data?.length\n );\n\n const videoActions = useVideoActions({\n location: VideoActionsLocation.PlayPage,\n shareId: props.shareId,\n presentationSlug: props.presentationSlug\n });\n\n const canViewOriginal = !!props.originalVideoAppLink &&\n VideoHelper.isClip(props.media) &&\n VideoHelper.canViewOriginalVideo(props.media);\n\n return (\n <section className='mb-3 position-relative' ref={containerRef}>\n <div className='d-inline-block w-100' ref={titleContainerRef}>\n {props.featureAccess.canNavigate &&\n <div className='ms-2 float-end'>\n <Actions\n actions={videoActions.getVideoActions(props.media)}\n actionsDropdownClassName='btn btn-outline-dark'\n fetchMore={() => videoActions.fetchMoreActions(props.media)}\n />\n </div>\n }\n\n {!!VideoHelper.isVideo(props.media) && (\n <VideoSubText\n type={props.subTextType}\n video={props.media}\n appLink={props.subtextAppLink}\n className={`${styles.series} text-truncate mw-100`}\n analyticsOptions={{ location: LocationContext.PlayPage }}\n />\n )}\n <h1 className='h4 mb-2 mw-100'>\n <span className='align-self-center'>{props.media.name}</span>\n {props.showTitlePadlock && (\n <RestrictionPadlock\n tooltipPlacement='right'\n className='d-inline-block ps-1'\n video={props.media}\n yearGroups={props.yearGroups}\n />\n )}\n </h1>\n \n {VideoHelper.isClip(props.media) && canViewOriginal && (\n <p className={`clamp-1 ${styles.clipOriginInfo}`}>\n <Text namespace={namespace} phrase='viewOriginal' />\n &nbsp;\n <AppLink className='info-link' appLink={props.originalVideoAppLink}>\n {props.media._parentVideo?.name}\n </AppLink>\n &nbsp;\n <Text\n namespace={namespace}\n phrase='timestamp'\n options={{\n timeRange: `${DurationHelper.ToDisplayTimeRange(props.media.startTime * 1000, props.media.endTime * 1000)}`\n }}\n />\n </p>\n )}\n\n {hasBadges && (\n <BadgeListContainer className={styles.badgeListContainer}>\n <AudienceLabel\n audience={mergedAudience}\n className='bg-white text-dark'\n border='dark'\n />\n {VideoHelper.isVideo(props.media) && (\n <Badge type={BadgeType.Rating} data={VideoHelper.getRating(props.media)} />\n )}\n {VideoHelper.isVideo(props.media) && (\n <Badge type={BadgeType.ProductionYear} data={props.media.productionYear} />\n )}\n </BadgeListContainer>\n )}\n </div>\n </section>\n );\n}\n",":local {\n .mask {\n position: absolute;\n width: 100%;\n height: 100%;\n z-index: 5;\n background-color: $black;\n opacity: 0.5;\n transition: opacity 100ms ease-in-out;\n }\n\n .centeredIcon {\n position: absolute;\n left: 50%;\n top: 50%;\n z-index: 10;\n transform: translate(-50%, -50%);\n color: $white;\n opacity: 1;\n width: 6.25rem;\n height: 6.25rem;\n }\n\n .bgImage {\n background-size: cover;\n }\n\n .centeredOverlay {\n position: absolute;\n left: 50%;\n top: 50%;\n z-index: 10;\n transform: translate(-50%, -50%);\n color: $white;\n opacity: 1;\n }\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { EntityType, LocationContext, SignUpDescriptors, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { PlayCircleSvg } from 'libs/shared/images/svg/actions/PlayCircleSvg';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './player-placeholder.module.scss';\n\nconst namespace = 'shared.playerPlaceholder';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface PlayerPlaceholderProps {\n video: VideoTypes;\n type: 'pip' | 'public';\n appLink?: Core.AppLink;\n}\n\nexport function PlayerPlaceholder(props: PlayerPlaceholderProps): JSX.Element {\n switch (props.type) {\n case 'pip':\n return <PipPlaceholder {...props} />;\n case 'public':\n return <PublicPlaceholder {...props} />;\n default:\n return <></>;\n }\n}\n\nconst PipPlaceholder = (props: PlayerPlaceholderProps) => (\n <div\n className={`position-relative responsive-img ${styles.bgImage}`}\n style={{ backgroundImage: `url('${VideoHelper.getThumbnail(props.video)?.url ?? ''}')` }}\n >\n <p className={`m-0 text-white h3 ${styles.centeredOverlay}`}>{getPhrase('playingPiP')}</p>\n <div className={styles.mask} />\n </div>\n);\n\nconst PublicPlaceholder = (props: PlayerPlaceholderProps) => {\n const thumbnailUrl = ImageHelper.createUrl(VideoHelper.getThumbnail(props.video)?.url ?? '', {\n // IMPORTANT: This should be consistent with the size used in `PublicRegionController.cs` in the backend.\n size: ImageSize.Large\n });\n\n return (\n <div\n className={`position-relative responsive-img ${styles.bgImage}`}\n style={{ backgroundImage: `url('${thumbnailUrl}')` }}\n >\n <AppLink\n appLink={props.appLink}\n analyticsOptions={{\n actionType: UserAction.Click,\n location: LocationContext.PlayPage,\n entity: EntityType.AppLink,\n workflowPhase: WorkflowPhase.Start,\n descriptor: SignUpDescriptors.SignUp\n }}\n analyticsData={{}}\n >\n <SvgContainer\n svg={PlayCircleSvg}\n className={styles.centeredIcon}\n />\n <div className={styles.mask} />\n </AppLink>\n </div>\n );\n};\n","import React from 'react';\n\nimport { AppLink } from 'libs/common/backbone/core';\nimport { Core } from 'libs/common/backbone/index';\n\nimport { Resource } from 'libs/shared/interfaces';\n\ninterface UseResourcePopupParams {\n resourcePopupId: string | undefined;\n resources: Resource[] | undefined;\n getResourceAppLink: (resource: Resource) => AppLink;\n}\n\nexport function useResourcePopup({\n resourcePopupId,\n resources,\n getResourceAppLink\n}: UseResourcePopupParams): void {\n React.useEffect(() => {\n if (!resourcePopupId)\n return;\n\n const resource = resources?.find(\n r => r.id.toString() === resourcePopupId.toString()\n );\n\n if (!resource)\n return;\n\n Core.AppLinkHelper.trigger(getResourceAppLink(resource));\n }, [resourcePopupId]);\n}\n","@import '~styles/utils/include-media';\n:local {\n .main.expandedToc {\n width: calc(100% - 15rem); //minus sidebar toc width and margin\n }\n\n .main.theatreMode {\n width: 100% !important;\n }\n\n .theatreModeContent {\n display: flex;\n margin: auto !important;\n\n @include media('<=xl') {\n max-width: 100%;\n }\n }\n\n .theatreModePlayPageContainer {\n //override TeacherLayoutComponent container style\n @media (min-width: 1200px) {\n max-width: none !important;\n }\n }\n\n .theatreModeLeftContent {\n width: calc(100% - 15rem);\n @include media('<=lg') {\n width: 100%;\n }\n }\n}","import { PlayerContextValues } from 'libs/shared/context/player-context/PlayerContext';\n\nimport styles from './play-page.module.scss';\n\ninterface GetMainClassNameProps {\n hasTheatreMode: boolean;\n shouldShowSideTableOfContents: boolean;\n tableOfContentsExpanded: boolean;\n theatreMode: boolean;\n}\n\nexport function getMainClassName(props: GetMainClassNameProps): string {\n // TOC is floating no impact on main\n if (!props.shouldShowSideTableOfContents) {\n return '';\n }\n \n // Theatre mode takes precedence\n if (props.hasTheatreMode && props.theatreMode) {\n return styles.theatreMode;\n }\n \n // Expanded TOC case\n if (props.tableOfContentsExpanded) {\n return `${styles.expandedToc} col-9`;\n }\n \n // Collapsed TOC case\n return 'pe-4';\n}\n\nexport function getContentClassName(props: GetMainClassNameProps): string {\n if (!props.hasTheatreMode) {\n return '';\n }\n\n if (props.theatreMode || !props.shouldShowSideTableOfContents) {\n return `container ${styles.theatreModeContent}`;\n }\n\n return '';\n}\n\nexport function getIsTheatreMode(hasTheatreMode: boolean, playerContext: PlayerContextValues): boolean {\n return hasTheatreMode && playerContext.defaultDisplayMode === 'theatre' && playerContext.mode === 'default';\n}\n","import React from 'react';\n\nimport { LocalStorageHelper } from 'projects/player/utils/local-storage-helper';\n\nimport { useShouldShowSideTableOfContents } from 'shared/views/play/hooks/useShouldShowTableOfContents';\n\nconst PLAY_PAGE_TOC_EXPANDED = 'play-page-toc-expanded';\n\nexport function usePlayPageTableOfContent(tocId: string, hasTheatreMode: boolean, theatreModeOn: boolean) {\n const showInSide = useShouldShowSideTableOfContents();\n const localValue = LocalStorageHelper.get(PLAY_PAGE_TOC_EXPANDED) !== 'false';\n const tocDefaultExpanded = !hasTheatreMode ? localValue : (theatreModeOn || showInSide);\n\n const [ controlledId, setControlledId ] = React.useState(tocId || '');\n const [ tableOfContentsActiveId, setTableOfContentsActiveId ] = React.useState<string>('');\n const [ tableOfContentsExpanded, setTableOfContentsExpanded ] = React.useState(tocDefaultExpanded);\n\n React.useEffect(() => {\n // Always collapse when in mobile view\n if (!showInSide) {\n setTableOfContentsExpanded(false);\n return;\n }\n\n // if has theatre mode, always expanded\n if (hasTheatreMode) {\n setTableOfContentsExpanded(true);\n return;\n }\n\n // reset to default\n setTableOfContentsExpanded(tocDefaultExpanded);\n }, [ showInSide, theatreModeOn ]);\n\n function onToggleTableOfContents() {\n if (hasTheatreMode && showInSide)\n return;\n\n setTableOfContentsExpanded(!tableOfContentsExpanded);\n LocalStorageHelper.set(PLAY_PAGE_TOC_EXPANDED, (!tableOfContentsExpanded).toString());\n }\n\n return {\n controlledId,\n setControlledId,\n tableOfContentsExpanded,\n tableOfContentsActiveId,\n setTableOfContentsActiveId,\n onToggleTableOfContents\n };\n}\n","export const ObservableTypesHelper = {\n map<K, V>(onChange: () => void): Map<K, V> {\n const map = new Map<K, V>();\n const proxy = new Proxy(map, {\n get(target: Map<K, V>, prop: string) {\n if (prop === 'set') {\n return (k: K, v: V) => {\n if (target.get(k) !== v) {\n target.set(k, v);\n onChange();\n }\n return proxy;\n };\n }\n\n const val = Reflect.get(target, prop);\n return typeof val === 'function' ? val.bind(target) : val;\n }\n });\n\n return proxy;\n }\n};\n","import { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\n\nexport const PLAY_PAGE_SECTIONS_ORDER = [\n PlayPageAnchor.Video,\n PlayPageAnchor.CurriculumLinks,\n PlayPageAnchor.Resources,\n PlayPageAnchor.Interactives,\n PlayPageAnchor.Clips,\n PlayPageAnchor.VideoDetails,\n PlayPageAnchor.ClippedFrom,\n PlayPageAnchor.Transcript,\n PlayPageAnchor.ReferenceVideo,\n PlayPageAnchor.RelatedVideos\n];\n\nexport const PLAY_PAGE_SECTIONS_ORDER_NO_GLANCE = [\n PlayPageAnchor.Video,\n PlayPageAnchor.VideoDetails,\n PlayPageAnchor.CurriculumLinks,\n PlayPageAnchor.Resources,\n PlayPageAnchor.Interactives,\n PlayPageAnchor.Clips,\n PlayPageAnchor.ClippedFrom,\n PlayPageAnchor.Transcript,\n PlayPageAnchor.ReferenceVideo,\n PlayPageAnchor.RelatedVideos\n];\n","import React from 'react';\n\nimport { useForceUpdate } from 'libs/shared/hooks/useForceUpdate';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { ObservableTypesHelper } from 'libs/shared/utils/ObservableTypesHelper';\n\nimport { PLAY_PAGE_SECTIONS_ORDER, PLAY_PAGE_SECTIONS_ORDER_NO_GLANCE } from 'shared/constants/PlayPageSectionsOrder';\n\nexport function useSectionHeadings(hasGlance: boolean) {\n const forceUpdate = useForceUpdate();\n\n // heading elements must be a live mapping of the elements on the DOM\n // there has to be a force update to recalculate heading element\n const headingRef = React.useRef<Map<PlayPageAnchor, HTMLElement>>(ObservableTypesHelper.map(forceUpdate));\n\n const headingElements = (hasGlance ? PLAY_PAGE_SECTIONS_ORDER : PLAY_PAGE_SECTIONS_ORDER_NO_GLANCE)\n .map(id => headingRef.current.get(id))\n .filter(Boolean) as HTMLElement[];\n\n return { headingRef, headingElements };\n}\n","import { DefaultDisplayMode } from 'libs/shared/context/player-context/interfaces/PlayerContextAction';\nimport { PlayerMode } from 'libs/shared/context/player-context/interfaces/PlayerMode';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\n\nexport function useTheatreModeStyle(\n hasTheatreMode: boolean,\n playerMode: PlayerMode,\n defaultDisplayMode: DefaultDisplayMode\n): boolean {\n const breakpoints = useBreakpoints();\n\n if (playerMode !== 'default') {\n return false;\n }\n\n const theatreModeOn = defaultDisplayMode === 'theatre';\n // on a smaller screen, override theatre mode style when theatre mode is on\n const overrideTheatreModeStyle = breakpoints.sm || breakpoints.md;\n const theatreMode = hasTheatreMode && theatreModeOn;\n const shouldUseTheatreModeStyle = !overrideTheatreModeStyle && theatreMode;\n return shouldUseTheatreModeStyle;\n}\n","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Clip, InteractiveMetadata, Link, Resource } from 'libs/shared/interfaces';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\n\ninterface SectionHeadingOptions {\n clips: Clip[];\n interactives: InteractiveMetadata[];\n resources: Resource[] | Link[];\n isPlayClipPage?: boolean;\n}\n\nconst namespace = 'shared.play';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const PlayPageUtils = {\n getSectionHeading(id: PlayPageAnchor, options: SectionHeadingOptions) {\n switch (id) {\n case PlayPageAnchor.Resources:\n return getPhrase('resourcesHeading', { count: options.resources?.length });\n\n case PlayPageAnchor.Clips:\n if (options.isPlayClipPage)\n return getPhrase('otherClipsHeading', { count: options.clips?.length - 1 });\n return getPhrase('clipsHeading', { count: options.clips?.length });\n\n case PlayPageAnchor.Interactives:\n return getPhrase('interactivesHeading', { count: options.interactives?.length });\n\n case PlayPageAnchor.Video:\n return getPhrase('videoHeading');\n\n case PlayPageAnchor.VideoDetails:\n return getPhrase('videoDetailsHeading');\n\n case PlayPageAnchor.RelatedVideos:\n return getPhrase('upNextHeading');\n\n case PlayPageAnchor.CurriculumLinks:\n return getPhrase('curriculumLinksHeading');\n\n case PlayPageAnchor.ClippedFrom:\n return getPhrase('clippedFromHeading');\n \n case PlayPageAnchor.ReferenceVideo:\n return getPhrase('referenceVideoHeading');\n\n case PlayPageAnchor.Transcript:\n return getPhrase('transcriptHeading');\n\n default:\n return '';\n }\n }\n\n};\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import"./DAXXjFlN.chunk.js";import{t as e}from"./CQyJ7YGa.chunk.js";import{t}from"./C2w0pmFW.chunk.js";import{t as n}from"./wrLrTezN.chunk.js";import{u as r}from"./BX0wDJmp.chunk.js";import{t as i}from"./CqrjHjAN.chunk.js";import{t as a}from"./CgCqPbjJ.chunk.js";import{t as o}from"./D_gWf2lC.chunk.js";import{t as s}from"./dLd5d3X22.chunk.js";import{t as c}from"./C6-aC3vu.chunk.js";import{n as l,t as u}from"./BGhJ8TEx.chunk.js";import{c as d}from"./BDsN9PWe2.chunk.js";import{t as f}from"./D1LXi_Ni.chunk.js";import"./B-cF1RO-.chunk.js";import{t as p}from"./DpIVDfRB2.chunk.js";import{i as m,o as h}from"./yme6Tx6K2.chunk.js";import{t as g}from"./DDmUhpUA.chunk.js";import{i as _,t as v}from"./dybVDI_D.chunk.js";import{t as y}from"./ByMZucv2.chunk.js";t();var b=n(),x=e.encloseNamespace(`shared.insightsHeatmap`);function S(e){let[t]=s(a.ANONYMISE_USERS);g();let n=r(i.currentUser()),S=r(p.interactiveMetadata()),C=r(o.config()),w=d.getAudienceAppLinkParams(),T=d.getDateRangeAppLinkParams(),E=r(p.aggregateHeatmap()),D=r(p.individualHeatmap()),O=r(p.users()),k=r(p.videoViews()),A=r(S.data&&u.createViewKey(`GRWx6w`,l.Share));c({title:S.data?x(`pageTitle`,{video:S.data?.name}):null});let j=!!n.data&&!!k.data&&!!S.data&&!!E.data&&!!A.data&&!!O.data,M=!!D.data;if(!j)return(0,b.jsx)(b.Fragment,{});let N={...w,...T},P=e.type===f.Open?m:h;return(0,b.jsxs)(`div`,{className:`px-3`,children:[(0,b.jsx)(_,{video:S.data,tabs:v(S.data?.id,`heatmap`,N,e.type),dateRangeAppLinkParams:T,share:{...P,objectId:S.data?.id},yearGroups:[],markingRequired:e.type!==f.Open,isDemo:!0,hasData:!0}),(0,b.jsx)(y,{aggregateEngagement:E.data,individualEngagement:D.data?.data,yearGroups:k.data?.yearGroupCount,config:C.data,users:O.data,viewKey:A.data,hasDataLoaded:j,tableDataLoaded:M,anonymiseUsers:t,hideStaffResults:!1})]})}export{S as InsightsHeatmapDemoView};
2
- //# sourceMappingURL=CnfcodVE2.chunk.js.map
1
+ import"./DAXXjFlN.chunk.js";import{t as e}from"./CQyJ7YGa.chunk.js";import{t}from"./C2w0pmFW.chunk.js";import{t as n}from"./wrLrTezN.chunk.js";import{u as r}from"./BX0wDJmp.chunk.js";import{t as i}from"./CqrjHjAN.chunk.js";import{t as a}from"./CgCqPbjJ.chunk.js";import{t as o}from"./D_gWf2lC.chunk.js";import{t as s}from"./dLd5d3X22.chunk.js";import{t as c}from"./C6-aC3vu.chunk.js";import{n as l,t as u}from"./BGhJ8TEx.chunk.js";import{c as d}from"./BDsN9PWe2.chunk.js";import{t as f}from"./D1LXi_Ni.chunk.js";import"./B-cF1RO-.chunk.js";import{t as p}from"./DpIVDfRB2.chunk.js";import{i as m,o as h}from"./yme6Tx6K2.chunk.js";import{t as g}from"./DDmUhpUA.chunk.js";import{i as _,t as v}from"./dybVDI_D.chunk.js";import{t as y}from"./CgL1gDuH.chunk.js";t();var b=n(),x=e.encloseNamespace(`shared.insightsHeatmap`);function S(e){let[t]=s(a.ANONYMISE_USERS);g();let n=r(i.currentUser()),S=r(p.interactiveMetadata()),C=r(o.config()),w=d.getAudienceAppLinkParams(),T=d.getDateRangeAppLinkParams(),E=r(p.aggregateHeatmap()),D=r(p.individualHeatmap()),O=r(p.users()),k=r(p.videoViews()),A=r(S.data&&u.createViewKey(`GRWx6w`,l.Share));c({title:S.data?x(`pageTitle`,{video:S.data?.name}):null});let j=!!n.data&&!!k.data&&!!S.data&&!!E.data&&!!A.data&&!!O.data,M=!!D.data;if(!j)return(0,b.jsx)(b.Fragment,{});let N={...w,...T},P=e.type===f.Open?m:h;return(0,b.jsxs)(`div`,{className:`px-3`,children:[(0,b.jsx)(_,{video:S.data,tabs:v(S.data?.id,`heatmap`,N,e.type),dateRangeAppLinkParams:T,share:{...P,objectId:S.data?.id},yearGroups:[],markingRequired:e.type!==f.Open,isDemo:!0,hasData:!0}),(0,b.jsx)(y,{aggregateEngagement:E.data,individualEngagement:D.data?.data,yearGroups:k.data?.yearGroupCount,config:C.data,users:O.data,viewKey:A.data,hasDataLoaded:j,tableDataLoaded:M,anonymiseUsers:t,hideStaffResults:!1})]})}export{S as InsightsHeatmapDemoView};
2
+ //# sourceMappingURL=BeOS0_E02.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CnfcodVE2.chunk.js","names":[],"sources":["../../src/apps/my-shares/views/demo/heatmap/InsightsHeatmapDemoView.tsx"],"sourcesContent":["import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { VideoViewEventResponse } from 'libs/shared/apps/analytics/interfaces/VideoViewEvent';\nimport { AnalyticsFilterHelper } from 'libs/shared/apps/analytics/utils/AnalyticsFilterUtils';\nimport { ShareType } from 'libs/shared/apps/share/enums/ShareType';\nimport { MediaIdType } from 'libs/shared/enums/MediaIdType';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { InsightsDemoRequests } from 'libs/shared/flight-requests/InsightsDemoRequests';\nimport { PlayerRequests } from 'libs/shared/flight-requests/PlayerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useLockContentWidth } from 'libs/shared/hooks/useLockContentWidth';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Config, CurrentUser, Engagement, IndividualEngagementResponse, InteractiveMetadata, PlayerViewKey } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport { ViewModelKeys } from 'shared/constants/LiteViewModels';\n\nimport { InsightsHeader } from 'apps/my-shares/components/insights-header/InsightsHeader';\nimport { InsightsHeatmap } from 'apps/my-shares/components/insights-heatmap/InsightsHeatmap';\nimport { DEMO_INTERACTIVE_ID } from 'apps/my-shares/constants/DemoInsights';\nimport { DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE, DEMO_INSIGHTS_SHARE } from 'apps/my-shares/constants/MySharesDemoInsights';\nimport { getInsightsDemoInteractiveTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\n\nconst namespace = 'shared.insightsHeatmap';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightsHeatmapDemoViewProps {\n type?: ShareType;\n}\n\nexport function InsightsHeatmapDemoView(props: InsightsHeatmapDemoViewProps) {\n const [anonymiseUsers] = useViewModel<boolean>(ViewModelKeys.ANONYMISE_USERS);\n\n useLockContentWidth();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const video = Flight.useBasicFetch<InteractiveMetadata>(\n InsightsDemoRequests.interactiveMetadata()\n );\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const audienceAppLinkParams = AnalyticsFilterHelper.getAudienceAppLinkParams();\n const dateRangeAppLinkParams = AnalyticsFilterHelper.getDateRangeAppLinkParams();\n\n const aggregateEngagement = Flight.useBasicFetch<Engagement>(\n InsightsDemoRequests.aggregateHeatmap()\n );\n\n const individualEngagement = Flight.useBasicFetch<IndividualEngagementResponse>(\n InsightsDemoRequests.individualHeatmap()\n );\n\n const users = Flight.useBasicFetch<AnonUser[]>(InsightsDemoRequests.users());\n\n const videoViews = Flight.useBasicFetch<VideoViewEventResponse>(InsightsDemoRequests.videoViews());\n\n const viewKey = Flight.useBasicFetch<PlayerViewKey>(video.data &&\n PlayerRequests.createViewKey(DEMO_INTERACTIVE_ID, MediaIdType.Share));\n\n useSetPageMetadata({ title: video.data ? getPhrase('pageTitle', { video: video.data?.name }) : null });\n\n const hasDataLoaded =\n !!currentUser.data &&\n !!videoViews.data &&\n !!video.data &&\n !!aggregateEngagement.data &&\n !!viewKey.data &&\n !!users.data;\n\n const tableDataLoaded = !!individualEngagement.data;\n\n if (!hasDataLoaded)\n return <></>;\n\n const params = {\n ...audienceAppLinkParams,\n ...dateRangeAppLinkParams\n };\n\n const share = props.type === ShareType.Open ? DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE : DEMO_INSIGHTS_SHARE;\n\n return (\n <div className='px-3'>\n <InsightsHeader\n video={video.data}\n tabs={getInsightsDemoInteractiveTabs(video.data?.id, 'heatmap', params, props.type)}\n dateRangeAppLinkParams={dateRangeAppLinkParams}\n share={{\n ...share,\n objectId: video.data?.id\n }}\n yearGroups={[]}\n markingRequired={props.type !== ShareType.Open}\n isDemo\n hasData\n />\n\n <InsightsHeatmap\n aggregateEngagement={aggregateEngagement.data}\n individualEngagement={individualEngagement.data?.data}\n yearGroups={videoViews.data?.yearGroupCount}\n config={config.data}\n users={users.data}\n viewKey={viewKey.data}\n hasDataLoaded={hasDataLoaded}\n tableDataLoaded={tableDataLoaded}\n anonymiseUsers={anonymiseUsers}\n hideStaffResults={false}\n />\n </div>\n );\n}\n"],"mappings":"kwBA4BM,EAAY,EAAgB,iBAAiB,wBAAS,EAM5D,SAAgB,EAAwB,EAAqC,CAC3E,GAAM,CAAC,GAAkB,EAAsB,EAAc,eAAe,EAE5E,EAAoB,EAEpB,IAAM,EAAc,EAAkC,EAAa,YAAY,CAAC,EAC1E,EAAQ,EACZ,EAAqB,oBAAoB,CAC3C,EAEM,EAAS,EAA6B,EAAe,OAAO,CAAC,EAE7D,EAAwB,EAAsB,yBAAyB,EACvE,EAAyB,EAAsB,0BAA0B,EAEzE,EAAsB,EAC1B,EAAqB,iBAAiB,CACxC,EAEM,EAAuB,EAC3B,EAAqB,kBAAkB,CACzC,EAEM,EAAQ,EAAiC,EAAqB,MAAM,CAAC,EAErE,EAAa,EAA6C,EAAqB,WAAW,CAAC,EAE3F,EAAU,EAAoC,EAAM,MACxD,EAAe,cAAA,SAAmC,EAAY,KAAK,CAAC,EAEtE,EAAmB,CAAE,MAAO,EAAM,KAAO,EAAU,YAAa,CAAE,MAAO,EAAM,MAAM,IAAK,CAAC,EAAI,IAAK,CAAC,EAErG,IAAM,EACJ,CAAC,CAAC,EAAY,MACd,CAAC,CAAC,EAAW,MACb,CAAC,CAAC,EAAM,MACR,CAAC,CAAC,EAAoB,MACtB,CAAC,CAAC,EAAQ,MACV,CAAC,CAAC,EAAM,KAEJ,EAAkB,CAAC,CAAC,EAAqB,KAE/C,GAAI,CAAC,EACH,OAAO,EAAA,EAAA,IAAA,CAAA,EAAA,SAAA,CAAI,CAAA,EAEb,IAAM,EAAS,CACb,GAAG,EACH,GAAG,CACL,EAEM,EAAQ,EAAM,OAAS,EAAU,KAAO,EAAqC,EAEnF,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,gBAAf,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,MAAO,EAAM,KACb,KAAM,EAA+B,EAAM,MAAM,GAAI,UAAW,EAAQ,EAAM,IAAI,EAC1D,yBACxB,MAAO,CACL,GAAG,EACH,SAAU,EAAM,MAAM,EACxB,EACA,WAAY,CAAC,EACb,gBAAiB,EAAM,OAAS,EAAU,KAC1C,OAAA,GACA,QAAA,EACD,CAAA,GAED,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,oBAAqB,EAAoB,KACzC,qBAAsB,EAAqB,MAAM,KACjD,WAAY,EAAW,MAAM,eAC7B,OAAQ,EAAO,KACf,MAAO,EAAM,KACb,QAAS,EAAQ,KACF,gBACE,kBACD,iBAChB,iBAAkB,EACnB,CAAA,CACE,GAET"}
1
+ {"version":3,"file":"BeOS0_E02.chunk.js","names":[],"sources":["../../src/apps/my-shares/views/demo/heatmap/InsightsHeatmapDemoView.tsx"],"sourcesContent":["import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { VideoViewEventResponse } from 'libs/shared/apps/analytics/interfaces/VideoViewEvent';\nimport { AnalyticsFilterHelper } from 'libs/shared/apps/analytics/utils/AnalyticsFilterUtils';\nimport { ShareType } from 'libs/shared/apps/share/enums/ShareType';\nimport { MediaIdType } from 'libs/shared/enums/MediaIdType';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { InsightsDemoRequests } from 'libs/shared/flight-requests/InsightsDemoRequests';\nimport { PlayerRequests } from 'libs/shared/flight-requests/PlayerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useLockContentWidth } from 'libs/shared/hooks/useLockContentWidth';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Config, CurrentUser, Engagement, IndividualEngagementResponse, InteractiveMetadata, PlayerViewKey } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport { ViewModelKeys } from 'shared/constants/LiteViewModels';\n\nimport { InsightsHeader } from 'apps/my-shares/components/insights-header/InsightsHeader';\nimport { InsightsHeatmap } from 'apps/my-shares/components/insights-heatmap/InsightsHeatmap';\nimport { DEMO_INTERACTIVE_ID } from 'apps/my-shares/constants/DemoInsights';\nimport { DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE, DEMO_INSIGHTS_SHARE } from 'apps/my-shares/constants/MySharesDemoInsights';\nimport { getInsightsDemoInteractiveTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\n\nconst namespace = 'shared.insightsHeatmap';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightsHeatmapDemoViewProps {\n type?: ShareType;\n}\n\nexport function InsightsHeatmapDemoView(props: InsightsHeatmapDemoViewProps) {\n const [anonymiseUsers] = useViewModel<boolean>(ViewModelKeys.ANONYMISE_USERS);\n\n useLockContentWidth();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const video = Flight.useBasicFetch<InteractiveMetadata>(\n InsightsDemoRequests.interactiveMetadata()\n );\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const audienceAppLinkParams = AnalyticsFilterHelper.getAudienceAppLinkParams();\n const dateRangeAppLinkParams = AnalyticsFilterHelper.getDateRangeAppLinkParams();\n\n const aggregateEngagement = Flight.useBasicFetch<Engagement>(\n InsightsDemoRequests.aggregateHeatmap()\n );\n\n const individualEngagement = Flight.useBasicFetch<IndividualEngagementResponse>(\n InsightsDemoRequests.individualHeatmap()\n );\n\n const users = Flight.useBasicFetch<AnonUser[]>(InsightsDemoRequests.users());\n\n const videoViews = Flight.useBasicFetch<VideoViewEventResponse>(InsightsDemoRequests.videoViews());\n\n const viewKey = Flight.useBasicFetch<PlayerViewKey>(video.data &&\n PlayerRequests.createViewKey(DEMO_INTERACTIVE_ID, MediaIdType.Share));\n\n useSetPageMetadata({ title: video.data ? getPhrase('pageTitle', { video: video.data?.name }) : null });\n\n const hasDataLoaded =\n !!currentUser.data &&\n !!videoViews.data &&\n !!video.data &&\n !!aggregateEngagement.data &&\n !!viewKey.data &&\n !!users.data;\n\n const tableDataLoaded = !!individualEngagement.data;\n\n if (!hasDataLoaded)\n return <></>;\n\n const params = {\n ...audienceAppLinkParams,\n ...dateRangeAppLinkParams\n };\n\n const share = props.type === ShareType.Open ? DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE : DEMO_INSIGHTS_SHARE;\n\n return (\n <div className='px-3'>\n <InsightsHeader\n video={video.data}\n tabs={getInsightsDemoInteractiveTabs(video.data?.id, 'heatmap', params, props.type)}\n dateRangeAppLinkParams={dateRangeAppLinkParams}\n share={{\n ...share,\n objectId: video.data?.id\n }}\n yearGroups={[]}\n markingRequired={props.type !== ShareType.Open}\n isDemo\n hasData\n />\n\n <InsightsHeatmap\n aggregateEngagement={aggregateEngagement.data}\n individualEngagement={individualEngagement.data?.data}\n yearGroups={videoViews.data?.yearGroupCount}\n config={config.data}\n users={users.data}\n viewKey={viewKey.data}\n hasDataLoaded={hasDataLoaded}\n tableDataLoaded={tableDataLoaded}\n anonymiseUsers={anonymiseUsers}\n hideStaffResults={false}\n />\n </div>\n );\n}\n"],"mappings":"kwBA4BM,EAAY,EAAgB,iBAAiB,wBAAS,EAM5D,SAAgB,EAAwB,EAAqC,CAC3E,GAAM,CAAC,GAAkB,EAAsB,EAAc,eAAe,EAE5E,EAAoB,EAEpB,IAAM,EAAc,EAAkC,EAAa,YAAY,CAAC,EAC1E,EAAQ,EACZ,EAAqB,oBAAoB,CAC3C,EAEM,EAAS,EAA6B,EAAe,OAAO,CAAC,EAE7D,EAAwB,EAAsB,yBAAyB,EACvE,EAAyB,EAAsB,0BAA0B,EAEzE,EAAsB,EAC1B,EAAqB,iBAAiB,CACxC,EAEM,EAAuB,EAC3B,EAAqB,kBAAkB,CACzC,EAEM,EAAQ,EAAiC,EAAqB,MAAM,CAAC,EAErE,EAAa,EAA6C,EAAqB,WAAW,CAAC,EAE3F,EAAU,EAAoC,EAAM,MACxD,EAAe,cAAA,SAAmC,EAAY,KAAK,CAAC,EAEtE,EAAmB,CAAE,MAAO,EAAM,KAAO,EAAU,YAAa,CAAE,MAAO,EAAM,MAAM,IAAK,CAAC,EAAI,IAAK,CAAC,EAErG,IAAM,EACJ,CAAC,CAAC,EAAY,MACd,CAAC,CAAC,EAAW,MACb,CAAC,CAAC,EAAM,MACR,CAAC,CAAC,EAAoB,MACtB,CAAC,CAAC,EAAQ,MACV,CAAC,CAAC,EAAM,KAEJ,EAAkB,CAAC,CAAC,EAAqB,KAE/C,GAAI,CAAC,EACH,OAAO,EAAA,EAAA,IAAA,CAAA,EAAA,SAAA,CAAI,CAAA,EAEb,IAAM,EAAS,CACb,GAAG,EACH,GAAG,CACL,EAEM,EAAQ,EAAM,OAAS,EAAU,KAAO,EAAqC,EAEnF,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,gBAAf,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,MAAO,EAAM,KACb,KAAM,EAA+B,EAAM,MAAM,GAAI,UAAW,EAAQ,EAAM,IAAI,EAC1D,yBACxB,MAAO,CACL,GAAG,EACH,SAAU,EAAM,MAAM,EACxB,EACA,WAAY,CAAC,EACb,gBAAiB,EAAM,OAAS,EAAU,KAC1C,OAAA,GACA,QAAA,EACD,CAAA,GAED,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,oBAAqB,EAAoB,KACzC,qBAAsB,EAAqB,MAAM,KACjD,WAAY,EAAW,MAAM,eAC7B,OAAQ,EAAO,KACf,MAAO,EAAM,KACb,QAAS,EAAQ,KACF,gBACE,kBACD,iBAChB,iBAAkB,EACnB,CAAA,CACE,GAET"}
@@ -1,2 +1,2 @@
1
- import{o as e}from"./DAXXjFlN.chunk.js";import{t}from"./CQyJ7YGa.chunk.js";import{t as n}from"./C2w0pmFW.chunk.js";import{t as r}from"./wrLrTezN.chunk.js";import{r as i,u as a,v as o}from"./BX0wDJmp.chunk.js";import{U as s,l as c,y as l,z as u}from"./NlCAcBdo.chunk.js";import{t as d}from"./CqrjHjAN.chunk.js";import{t as f}from"./_GCZ-60i.chunk.js";import{t as p}from"./C6-aC3vu.chunk.js";import{n as m,t as h}from"./CpFtf-tI2.chunk.js";import{t as g}from"./CXnhm0VS2.chunk.js";import{t as _}from"./DS3e-Ht4.chunk.js";import{i as v}from"./CXVBjdpb.chunk.js";import{t as y}from"./C7HU4huj.chunk.js";import{t as b}from"./9kSpxveW.chunk.js";import{t as x}from"./BINRgRNJ2.chunk.js";import{n as S}from"./DduFT_FA.chunk.js";import{t as C}from"./D5WAilZl.chunk.js";import{t as w}from"./B_HsEzOv.chunk.js";import{t as T}from"./D1aO6GEr.chunk.js";import{t as E}from"./DSl2uxYA.chunk.js";import{t as D}from"./BOuzZEkK2.chunk.js";import{t as O}from"./CKVnoNsX2.chunk.js";import{t as k}from"./Bh0cxa0U2.chunk.js";var A=e(n(),1),j=e(w(),1),M=`settings.emailSettings`,N=(0,j.object)().shape({email:(0,j.string)().required(()=>t.getPhrase(M,`emailRequired`)).email(()=>t.getPhrase(M,`emailInvalid`)).trim().default(``)}),P=r();function F(){return(0,P.jsx)(x,{children:(0,P.jsx)(`svg`,{viewBox:`0 0 24 24`,children:(0,P.jsx)(`path`,{d:`M10.407 12.368l-1.22-1.22a.49.49 0 0 0-.698.004l-.583.583a.494.494 0 0 0-.004.697l2.135 2.135c.107.108.25.154.388.142a.488.488 0 0 0 .352-.143l4.362-4.362a.494.494 0 0 0-.004-.698l-.582-.582a.495.495 0 0 0-.698-.004l-3.448 3.448zm7.922-.37l1.437 1.406c.208.194.277.437.208.728a.716.716 0 0 1-.541.531l-1.957.5.551 1.936a.671.671 0 0 1-.197.729.671.671 0 0 1-.73.198l-1.935-.552-.5 1.957a.716.716 0 0 1-.53.541 1.28 1.28 0 0 1-.199.021.686.686 0 0 1-.53-.229L12 18.328l-1.405 1.436c-.195.208-.437.278-.729.208a.696.696 0 0 1-.53-.541l-.5-1.957-1.937.552a.671.671 0 0 1-.728-.198.671.671 0 0 1-.198-.729l.551-1.936-1.957-.5a.716.716 0 0 1-.54-.53c-.07-.292 0-.535.207-.73l1.437-1.405-1.437-1.405c-.208-.194-.277-.437-.208-.729a.716.716 0 0 1 .541-.53l1.957-.5-.551-1.936a.671.671 0 0 1 .198-.73.671.671 0 0 1 .728-.197l1.936.552.5-1.957a.675.675 0 0 1 .531-.531.671.671 0 0 1 .729.198L12 5.68l1.405-1.447a.697.697 0 0 1 .73-.198c.284.07.46.246.53.53l.5 1.958L17.1 5.97a.671.671 0 0 1 .729.198.671.671 0 0 1 .197.729l-.551 1.936 1.957.5a.715.715 0 0 1 .541.53c.07.292 0 .535-.208.73l-1.437 1.404z`})})})}var I=`settings.emailSettings`,L=t.encloseNamespace(I);function R(e){let t=y(b.MDDown),[n,r]=A.useState(!t),i=e.currentUser.emailVerified;return A.useEffect(()=>{!t&&!n&&r(!0)},[t,n]),(0,P.jsxs)(h.Provider,{value:I,children:[(0,P.jsxs)(`h2`,{className:`h4 d-flex align-items-center`,children:[(0,P.jsx)(m,{phrase:`heading`}),i&&(0,P.jsxs)(`span`,{className:`font-size-normal fw-semibold text-primary d-flex align-items-center mb-0 ms-2`,children:[(0,P.jsx)(m,{phrase:`verified`}),(0,P.jsx)(F,{})]})]}),i&&(0,P.jsx)(`p`,{children:(0,P.jsx)(m,{phrase:`info`,options:{email:e.currentUser.email}})}),n?(0,P.jsx)(C,{initialValues:{email:e.currentUser.email||``},onSubmit:e.onChangeEmail,validationSchema:N,children:(0,P.jsxs)(v,{children:[(0,P.jsx)(S,{className:`w-75`,name:`email`,placeholder:L(`emailPlaceholder`),autoComplete:`email`}),(0,P.jsxs)(`div`,{className:`d-flex justify-content-end w-75 ${t?`ms-n2`:``}`,children:[t&&(0,P.jsx)(`button`,{type:`button`,className:`btn btn-link me-2`,onClick:()=>r(!1),children:(0,P.jsx)(m,{phrase:`cancel`})}),(0,P.jsx)(E,{isNew:!1,submitText:L(i?`updateEmail`:`verifyEmail`),variant:i?`outline-dark`:`dark`})]})]})}):(0,P.jsx)(P.Fragment,{children:(0,P.jsx)(`div`,{className:`d-flex`,children:(0,P.jsx)(`button`,{className:`btn btn-outline-dark me-2`,onClick:()=>r(!0),children:(0,P.jsx)(m,{phrase:`change`})})})})]})}var z={partialLabel:`_partialLabel_1h6pk_1`,partialInfo:`_partialInfo_1h6pk_5`,partialInput:`_partialInput_1h6pk_10`,partialSubmit:`_partialSubmit_1h6pk_14`,partialNote:`_partialNote_1h6pk_18`};function B(){return(0,P.jsxs)(`div`,{className:`w-50`,children:[(0,P.jsx)(`div`,{className:`partial-loading-background mb-2 ${z.partialLabel}`}),(0,P.jsx)(`div`,{className:`partial-loading-background ${z.partialInfo}`}),(0,P.jsx)(`div`,{className:`form-group`,children:(0,P.jsx)(`div`,{className:`partial-loading-background ${z.partialInput}`})}),(0,P.jsx)(`div`,{className:`partial-loading-background ${z.partialSubmit}`}),(0,P.jsx)(`div`,{className:`partial-loading-background mt-2 ${z.partialNote}`})]})}var V=t.encloseNamespace(`settings.passwordSettings`),H=e=>(0,j.object)().shape({currentPassword:(0,j.string)().required(()=>V(`currentPasswordRequired`)).trim().default(``),newPassword:(0,j.string)().required(()=>V(`newPasswordRequired`)).min(e,()=>V(`newPasswordMinLength`,{minLen:e})).trim().default(``),confirmPassword:(0,j.string)().required(()=>V(`confirmPasswordRequired`)).oneOf([(0,j.ref)(`newPassword`),null],()=>V(`passwordsDontMatch`)).trim().default(``)}),U=`settings.passwordSettings`,W={currentPassword:``,newPassword:``,confirmPassword:``};function G(e){let n=y(b.MDDown),[r,i]=A.useState(!n);A.useEffect(()=>{!n&&!r&&i(!0)},[n,r]);function a(t,n){e.onChangePassword(t,n,()=>n({reset:!0}))}return(0,P.jsxs)(h.Provider,{value:U,children:[(0,P.jsx)(`h2`,{className:`h4`,children:(0,P.jsx)(m,{phrase:`heading`})}),r?(0,P.jsxs)(P.Fragment,{children:[(0,P.jsx)(`p`,{children:(0,P.jsx)(m,{phrase:`info`})}),(0,P.jsx)(C,{initialValues:W,onSubmit:a,validationSchema:H(e.minPasswordLength),children:(0,P.jsx)(D,{onClickCancel:()=>i(!1),hideCancelButton:!n,submitText:t.getPhrase(U,`savePassword`),buttonContainerClass:n?`d-flex justify-content-end ms-n2 w-75`:`d-flex justify-content-end w-75`,inputWidthClass:`w-75`,minLength:e.minPasswordLength,passwordStrengthClassName:`w-75`})})]}):(0,P.jsx)(`button`,{className:`btn btn-outline-dark `,onClick:()=>i(!0),children:(0,P.jsx)(m,{phrase:`change`})})]})}var K=t.encloseNamespace(`settings.accountSettings`);function q(){p({title:K(`pageTitle`)});let e=o(),t=g(),n=y(b.MDDown),r=a(d.currentUser()),m=a(r.data&&T.getUser(r.data.id)),h=a(r.data&&k.getCustomerSecuritySettings(r.data.customerId));function v(n,a){i(e,T.changeEmail(n.email,()=>{f.logUserAction({id:r.data.id,oldEmail:r.data.email,newEmail:n.email},{actionType:u.VerifyEmail,entity:c.User,location:l.Settings,workflowPhase:s.Start}),t.success(K(`changeEmailRequestSuccess`,{email:n.email,escapeText:!0}))},()=>{t.error(K(`changeEmailRequestError`))},a))}function x(n,a,o){i(e,T.changePassword(n,()=>{f.logUserAction({id:r.data.id,oldPassword:n.currentPassword,newPassword:n.newPassword},{actionType:u.ChangePassword,entity:c.User,location:l.Settings,workflowPhase:s.Complete}),t.success(K(`changePasswordSuccess`)),o()},({responseJSON:e})=>{e.errorCode===`user.password-too-short`?t.error(K(`changePasswordRequirementsError`)):e.errorCode===`user.invalid-password`?t.error(K(`changePasswordInvalid`)):e.errorCode===`user.same-password`?t.error(K(`changePasswordSame`)):e.errorCode===`user.locked-out`?t.error(K(`changePasswordLockedOut`)):t.error(K(`changePasswordError`))},a))}let S=_.getMinimumPasswordLength(h.data,m.data?.userType,r.data.role);return(0,P.jsxs)(O,{heading:K(`heading`),breadcrumbs:[K(`breadcrumb`)],children:[(0,P.jsx)(`div`,{className:n?`w-100`:`w-50`,children:r.data?(0,P.jsx)(R,{currentUser:r.data,onChangeEmail:v}):(0,P.jsx)(B,{})}),(0,P.jsx)(`hr`,{}),(0,P.jsx)(`div`,{className:n?`w-100`:`w-50`,children:h.data&&(0,P.jsx)(G,{onChangePassword:x,minPasswordLength:S})})]})}export{q as AccountSettingsView};
2
- //# sourceMappingURL=kz-JIHlB2.chunk.js.map
1
+ import{o as e}from"./DAXXjFlN.chunk.js";import{t}from"./CQyJ7YGa.chunk.js";import{t as n}from"./C2w0pmFW.chunk.js";import{t as r}from"./wrLrTezN.chunk.js";import{r as i,u as a,v as o}from"./BX0wDJmp.chunk.js";import{U as s,l as c,y as l,z as u}from"./NlCAcBdo.chunk.js";import{t as d}from"./CqrjHjAN.chunk.js";import{t as f}from"./_GCZ-60i.chunk.js";import{t as p}from"./C6-aC3vu.chunk.js";import{n as m,t as h}from"./CpFtf-tI2.chunk.js";import{t as g}from"./CXnhm0VS2.chunk.js";import{t as _}from"./DS3e-Ht4.chunk.js";import{i as v}from"./CXVBjdpb.chunk.js";import{t as y}from"./C7HU4huj.chunk.js";import{t as b}from"./9kSpxveW.chunk.js";import{t as x}from"./BINRgRNJ2.chunk.js";import{n as S}from"./DduFT_FA.chunk.js";import{t as C}from"./D5WAilZl.chunk.js";import{t as w}from"./B_HsEzOv.chunk.js";import{t as T}from"./D1aO6GEr.chunk.js";import{t as E}from"./DSl2uxYA.chunk.js";import{t as D}from"./BPjqerK42.chunk.js";import{t as O}from"./CKVnoNsX2.chunk.js";import{t as k}from"./Bh0cxa0U2.chunk.js";var A=e(n(),1),j=e(w(),1),M=`settings.emailSettings`,N=(0,j.object)().shape({email:(0,j.string)().required(()=>t.getPhrase(M,`emailRequired`)).email(()=>t.getPhrase(M,`emailInvalid`)).trim().default(``)}),P=r();function F(){return(0,P.jsx)(x,{children:(0,P.jsx)(`svg`,{viewBox:`0 0 24 24`,children:(0,P.jsx)(`path`,{d:`M10.407 12.368l-1.22-1.22a.49.49 0 0 0-.698.004l-.583.583a.494.494 0 0 0-.004.697l2.135 2.135c.107.108.25.154.388.142a.488.488 0 0 0 .352-.143l4.362-4.362a.494.494 0 0 0-.004-.698l-.582-.582a.495.495 0 0 0-.698-.004l-3.448 3.448zm7.922-.37l1.437 1.406c.208.194.277.437.208.728a.716.716 0 0 1-.541.531l-1.957.5.551 1.936a.671.671 0 0 1-.197.729.671.671 0 0 1-.73.198l-1.935-.552-.5 1.957a.716.716 0 0 1-.53.541 1.28 1.28 0 0 1-.199.021.686.686 0 0 1-.53-.229L12 18.328l-1.405 1.436c-.195.208-.437.278-.729.208a.696.696 0 0 1-.53-.541l-.5-1.957-1.937.552a.671.671 0 0 1-.728-.198.671.671 0 0 1-.198-.729l.551-1.936-1.957-.5a.716.716 0 0 1-.54-.53c-.07-.292 0-.535.207-.73l1.437-1.405-1.437-1.405c-.208-.194-.277-.437-.208-.729a.716.716 0 0 1 .541-.53l1.957-.5-.551-1.936a.671.671 0 0 1 .198-.73.671.671 0 0 1 .728-.197l1.936.552.5-1.957a.675.675 0 0 1 .531-.531.671.671 0 0 1 .729.198L12 5.68l1.405-1.447a.697.697 0 0 1 .73-.198c.284.07.46.246.53.53l.5 1.958L17.1 5.97a.671.671 0 0 1 .729.198.671.671 0 0 1 .197.729l-.551 1.936 1.957.5a.715.715 0 0 1 .541.53c.07.292 0 .535-.208.73l-1.437 1.404z`})})})}var I=`settings.emailSettings`,L=t.encloseNamespace(I);function R(e){let t=y(b.MDDown),[n,r]=A.useState(!t),i=e.currentUser.emailVerified;return A.useEffect(()=>{!t&&!n&&r(!0)},[t,n]),(0,P.jsxs)(h.Provider,{value:I,children:[(0,P.jsxs)(`h2`,{className:`h4 d-flex align-items-center`,children:[(0,P.jsx)(m,{phrase:`heading`}),i&&(0,P.jsxs)(`span`,{className:`font-size-normal fw-semibold text-primary d-flex align-items-center mb-0 ms-2`,children:[(0,P.jsx)(m,{phrase:`verified`}),(0,P.jsx)(F,{})]})]}),i&&(0,P.jsx)(`p`,{children:(0,P.jsx)(m,{phrase:`info`,options:{email:e.currentUser.email}})}),n?(0,P.jsx)(C,{initialValues:{email:e.currentUser.email||``},onSubmit:e.onChangeEmail,validationSchema:N,children:(0,P.jsxs)(v,{children:[(0,P.jsx)(S,{className:`w-75`,name:`email`,placeholder:L(`emailPlaceholder`),autoComplete:`email`}),(0,P.jsxs)(`div`,{className:`d-flex justify-content-end w-75 ${t?`ms-n2`:``}`,children:[t&&(0,P.jsx)(`button`,{type:`button`,className:`btn btn-link me-2`,onClick:()=>r(!1),children:(0,P.jsx)(m,{phrase:`cancel`})}),(0,P.jsx)(E,{isNew:!1,submitText:L(i?`updateEmail`:`verifyEmail`),variant:i?`outline-dark`:`dark`})]})]})}):(0,P.jsx)(P.Fragment,{children:(0,P.jsx)(`div`,{className:`d-flex`,children:(0,P.jsx)(`button`,{className:`btn btn-outline-dark me-2`,onClick:()=>r(!0),children:(0,P.jsx)(m,{phrase:`change`})})})})]})}var z={partialLabel:`_partialLabel_1h6pk_1`,partialInfo:`_partialInfo_1h6pk_5`,partialInput:`_partialInput_1h6pk_10`,partialSubmit:`_partialSubmit_1h6pk_14`,partialNote:`_partialNote_1h6pk_18`};function B(){return(0,P.jsxs)(`div`,{className:`w-50`,children:[(0,P.jsx)(`div`,{className:`partial-loading-background mb-2 ${z.partialLabel}`}),(0,P.jsx)(`div`,{className:`partial-loading-background ${z.partialInfo}`}),(0,P.jsx)(`div`,{className:`form-group`,children:(0,P.jsx)(`div`,{className:`partial-loading-background ${z.partialInput}`})}),(0,P.jsx)(`div`,{className:`partial-loading-background ${z.partialSubmit}`}),(0,P.jsx)(`div`,{className:`partial-loading-background mt-2 ${z.partialNote}`})]})}var V=t.encloseNamespace(`settings.passwordSettings`),H=e=>(0,j.object)().shape({currentPassword:(0,j.string)().required(()=>V(`currentPasswordRequired`)).trim().default(``),newPassword:(0,j.string)().required(()=>V(`newPasswordRequired`)).min(e,()=>V(`newPasswordMinLength`,{minLen:e})).trim().default(``),confirmPassword:(0,j.string)().required(()=>V(`confirmPasswordRequired`)).oneOf([(0,j.ref)(`newPassword`),null],()=>V(`passwordsDontMatch`)).trim().default(``)}),U=`settings.passwordSettings`,W={currentPassword:``,newPassword:``,confirmPassword:``};function G(e){let n=y(b.MDDown),[r,i]=A.useState(!n);A.useEffect(()=>{!n&&!r&&i(!0)},[n,r]);function a(t,n){e.onChangePassword(t,n,()=>n({reset:!0}))}return(0,P.jsxs)(h.Provider,{value:U,children:[(0,P.jsx)(`h2`,{className:`h4`,children:(0,P.jsx)(m,{phrase:`heading`})}),r?(0,P.jsxs)(P.Fragment,{children:[(0,P.jsx)(`p`,{children:(0,P.jsx)(m,{phrase:`info`})}),(0,P.jsx)(C,{initialValues:W,onSubmit:a,validationSchema:H(e.minPasswordLength),children:(0,P.jsx)(D,{onClickCancel:()=>i(!1),hideCancelButton:!n,submitText:t.getPhrase(U,`savePassword`),buttonContainerClass:n?`d-flex justify-content-end ms-n2 w-75`:`d-flex justify-content-end w-75`,inputWidthClass:`w-75`,minLength:e.minPasswordLength,passwordStrengthClassName:`w-75`})})]}):(0,P.jsx)(`button`,{className:`btn btn-outline-dark `,onClick:()=>i(!0),children:(0,P.jsx)(m,{phrase:`change`})})]})}var K=t.encloseNamespace(`settings.accountSettings`);function q(){p({title:K(`pageTitle`)});let e=o(),t=g(),n=y(b.MDDown),r=a(d.currentUser()),m=a(r.data&&T.getUser(r.data.id)),h=a(r.data&&k.getCustomerSecuritySettings(r.data.customerId));function v(n,a){i(e,T.changeEmail(n.email,()=>{f.logUserAction({id:r.data.id,oldEmail:r.data.email,newEmail:n.email},{actionType:u.VerifyEmail,entity:c.User,location:l.Settings,workflowPhase:s.Start}),t.success(K(`changeEmailRequestSuccess`,{email:n.email,escapeText:!0}))},()=>{t.error(K(`changeEmailRequestError`))},a))}function x(n,a,o){i(e,T.changePassword(n,()=>{f.logUserAction({id:r.data.id,oldPassword:n.currentPassword,newPassword:n.newPassword},{actionType:u.ChangePassword,entity:c.User,location:l.Settings,workflowPhase:s.Complete}),t.success(K(`changePasswordSuccess`)),o()},({responseJSON:e})=>{e.errorCode===`user.password-too-short`?t.error(K(`changePasswordRequirementsError`)):e.errorCode===`user.invalid-password`?t.error(K(`changePasswordInvalid`)):e.errorCode===`user.same-password`?t.error(K(`changePasswordSame`)):e.errorCode===`user.locked-out`?t.error(K(`changePasswordLockedOut`)):t.error(K(`changePasswordError`))},a))}let S=_.getMinimumPasswordLength(h.data,m.data?.userType,r.data.role);return(0,P.jsxs)(O,{heading:K(`heading`),breadcrumbs:[K(`breadcrumb`)],children:[(0,P.jsx)(`div`,{className:n?`w-100`:`w-50`,children:r.data?(0,P.jsx)(R,{currentUser:r.data,onChangeEmail:v}):(0,P.jsx)(B,{})}),(0,P.jsx)(`hr`,{}),(0,P.jsx)(`div`,{className:n?`w-100`:`w-50`,children:h.data&&(0,P.jsx)(G,{onChangePassword:x,minPasswordLength:S})})]})}export{q as AccountSettingsView};
2
+ //# sourceMappingURL=Bnyn-It62.chunk.js.map