@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":"ByMZucv2.chunk.js","names":[],"sources":["../../../../libs/shared/src/apps/analytics/components/engagement-table/engagement-table.module.scss","../../../../libs/shared/src/apps/analytics/components/engagement-table/EngagementTableUtils.tsx","../../../../libs/shared/src/apps/analytics/components/engagement-table/EngagementTable.tsx","../../../../libs/shared/src/components/percentage-indicator/PartialPercentageIndicator.tsx","../../../../libs/shared/src/apps/analytics/components/insights/amount-watched/InsightAmountWatched.tsx","../../../../libs/shared/src/apps/analytics/utils/ChartColourUtils.ts","../../../../libs/shared/src/apps/analytics/utils/SharedUserActivityPieChartUtils.ts","../../../../libs/shared/src/apps/analytics/components/insights/total-views/InsightTotalViews.tsx","../../src/apps/my-shares/components/insights-heatmap/partial-loading/partial-insights-heatmap.module.scss","../../src/apps/my-shares/components/insights-heatmap/partial-loading/PartialInsightsHeatmap.tsx","../../../player/src/plugins/engagement-overlay-plugin/components/engagement-overlay-menu-item/engagement-overlay-menu-item.ts","../../../player/src/plugins/engagement-overlay-plugin/components/timepoint-interactions/timepoint-interactions.tsx","../../../player/src/plugins/engagement-overlay-plugin/components/engagement-overlay/engagement-overlay-chart-options.tsx","../../../player/src/plugins/engagement-overlay-plugin/components/engagement-overlay/engagement-overlay.ts","../../../player/src/plugins/engagement-overlay-plugin/engagement-overlay-plugin.ts","../../../player/src/plugins/interactive-plugin/interactive-seek-bar-plugin.ts","../../../player/src/players/reports/reports-player.ts","../../../player/src/react/ReportsPlayer.tsx","../../src/apps/my-shares/components/video-engagement-overlay/video-engagement-overlay.module.scss","../../src/apps/my-shares/components/video-engagement-overlay/VideoEngagementOverlay.tsx","../../src/apps/my-shares/components/insights-heatmap/insights-heatmap.module.scss","../../src/apps/my-shares/components/insights-heatmap/InsightsHeatmap.tsx"],"sourcesContent":[":local {\n .heatMap {\n height: 1rem;\n }\n\n // use avatar width\n .avatarContainer {\n width: 2rem;\n height: 2rem;\n }\n\n .cogIcon {\n cursor: pointer;\n color: $gray-900;\n line-height: 1;\n }\n}","import React from 'react';\nimport { Column, ColumnInstance, Row } from 'react-table';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EngagementHeatMap } from 'libs/shared/apps/analytics/components/engagement-heat-map/EngagementHeatMap';\nimport { anonymiseUserName } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { EngagementAvatar } from 'libs/shared/components/engagement-avatar/EngagementAvatar';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { PercentageIndicator, PercentageIndicatorLayout } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { CogSvg } from 'libs/shared/images/svg/objects/CogSvg';\nimport { Engagement, EngagementType } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from './engagement-table.module.scss';\n\nconst namespace = 'shared.engagementTable';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst EMPTY_ENGAGEMENT: Partial<Engagement> = {\n heatMap: [],\n engagementRate: 0,\n viewCount: 0\n};\n\ninterface CellWrapperProps {\n className?: string;\n}\n\nfunction CellWrapper(props: React.PropsWithChildren<CellWrapperProps>): JSX.Element {\n return (\n <div className={`${props.className ?? ''}`}>\n {props.children}\n </div>\n );\n}\n\ninterface HeaderCellProps {\n column: ColumnInstance<EngagementTableData>;\n phraseKey: string;\n}\n\nfunction HeaderCell(props: HeaderCellProps): JSX.Element {\n return (\n <CellWrapper className={`d-inline-block ${props.column.isSorted ? 'fw-bold' : ''}`}>\n {getPhrase(props.phraseKey)}\n </CellWrapper>\n );\n}\n\nexport interface EngagementTableData extends Engagement {\n user: AnonUser;\n}\n\nfunction getMaxHeatMapValue(engagement: Engagement[]): number {\n let max = 0;\n\n engagement.forEach(e => {\n const localMax = Math.max(...e.heatMap);\n\n if (localMax > max)\n max = localMax;\n });\n\n return max;\n}\n\n/**\n * Resolves the engagement type, inferring 'anon' for legacy data\n * where type is not set but userId is null.\n */\nfunction resolveEngagementType(engagement: Engagement): EngagementType | undefined {\n if (engagement.type) return engagement.type;\n if (engagement.userId === null || engagement.userId === undefined) return 'anon';\n return undefined;\n}\n\nfunction getEngagementTypeLabel(type: EngagementType): string | null {\n switch (type) {\n case 'student-reach':\n return getPhrase('classroomViews');\n case 'anon':\n return getPhrase('anonymous');\n default:\n return null;\n }\n}\n\nfunction getUsersName(user: AnonUser, anonymiseUsers: boolean, type?: EngagementType) {\n if (type) {\n const label = getEngagementTypeLabel(type);\n if (label && !user?.name) return { name: label, surname: '' };\n }\n\n const fullName = anonymiseUserName(user, anonymiseUsers);\n const nameParts = fullName.split(' ').filter(n => !!n);\n\n return {\n name: nameParts[0],\n surname: nameParts.slice(1).join(' ')\n };\n}\n\ninterface EngagementColumnProps {\n engagement: Engagement[];\n imageCdnUrl: string;\n anonymiseUsers: boolean;\n showSeparateNameColumns?: boolean;\n classroomViewsAppLink?: Core.AppLink;\n classroomViewsTooltip?: string;\n}\n\nexport function useGetColumns(props: EngagementColumnProps): Column<EngagementTableData>[] {\n return React.useMemo(() => {\n const maxHeatMapValue = getMaxHeatMapValue(props.engagement);\n\n const nameColumns: Column<EngagementTableData>[] = props.showSeparateNameColumns ? [\n {\n id: 'firstName',\n Header: ({ column }: { column: ColumnInstance<EngagementTableData> }) => <HeaderCell column={column} phraseKey='firstName' />,\n accessor: 'user',\n width: 63,\n sortType: (rowA: Row<EngagementTableData>, rowB: Row<EngagementTableData>) => {\n const typeA = resolveEngagementType(rowA.original);\n const typeB = resolveEngagementType(rowB.original);\n const { name: nameA } = getUsersName(rowA.values.firstName, props.anonymiseUsers, typeA);\n const { name: nameB } = getUsersName(rowB.values.firstName, props.anonymiseUsers, typeB);\n return nameA > nameB ? 1 : -1;\n },\n Cell: ({ value, row: { original } }: { value: AnonUser, row: Row<EngagementTableData> }) => {\n const effectiveType = resolveEngagementType(original);\n const { name, surname } = getUsersName(value, props.anonymiseUsers, effectiveType);\n return (\n <CellWrapper className='d-flex align-items-center h-100'>\n <span className={styles.avatarContainer}>\n <EngagementAvatar\n type={effectiveType}\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(name, surname)}\n imageUrl={!props.anonymiseUsers && !effectiveType && value?.avatar?.url}\n anonymiseUsers={props.anonymiseUsers}\n />\n </span>\n <span className='ms-2 clamp-1'>\n {name}\n </span>\n {effectiveType === 'student-reach' && props.classroomViewsAppLink &&\n <IconButton\n customSize\n svg={CogSvg}\n svgSize={SvgContainerSize.Standard}\n appLink={props.classroomViewsAppLink}\n className={styles.cogIcon}\n tooltip={props.classroomViewsTooltip}\n tooltipTrigger={['hover']}\n ariaLabel={props.classroomViewsTooltip}\n />\n }\n </CellWrapper>\n );\n }\n },\n {\n id: 'surname',\n Header: ({ column }: { column: ColumnInstance<EngagementTableData> }) => <HeaderCell column={column} phraseKey='surname' />,\n accessor: 'user',\n width: 68,\n sortType: (rowA: Row<EngagementTableData>, rowB: Row<EngagementTableData>) => {\n const typeA = resolveEngagementType(rowA.original);\n const typeB = resolveEngagementType(rowB.original);\n const { surname: surnameA } = getUsersName(rowA.values.surname, props.anonymiseUsers, typeA);\n const { surname: surnameB } = getUsersName(rowB.values.surname, props.anonymiseUsers, typeB);\n return surnameA > surnameB ? 1 : -1;\n },\n Cell: ({ value, row: { original } }: { value: AnonUser, row: Row<EngagementTableData> }) => {\n const { surname } = getUsersName(value, props.anonymiseUsers, resolveEngagementType(original));\n return (\n <CellWrapper className='d-flex align-items-center h-100'>\n <span className='clamp-1'>\n {surname || ''}\n </span>\n </CellWrapper>\n );\n }\n }\n ] : [\n {\n id: 'name',\n Header: ({ column }: { column: ColumnInstance<EngagementTableData> }) => <HeaderCell column={column} phraseKey='name' />,\n accessor: 'user',\n width: 22,\n sortType: (rowA: Row<EngagementTableData>, rowB: Row<EngagementTableData>) => {\n const typeA = resolveEngagementType(rowA.original);\n const typeB = resolveEngagementType(rowB.original);\n const nameA = typeA ?\n getEngagementTypeLabel(typeA) :\n anonymiseUserName(rowA.values.user, props.anonymiseUsers);\n const nameB = typeB ?\n getEngagementTypeLabel(typeB) :\n anonymiseUserName(rowB.values.user, props.anonymiseUsers);\n\n return nameA > nameB ? 1 : -1;\n },\n Cell: ({ value, row: { original } }: { value: AnonUser, row: Row<EngagementTableData> }) => {\n const effectiveType = resolveEngagementType(original);\n const { name, surname } = getUsersName(value, props.anonymiseUsers, effectiveType);\n return (\n <CellWrapper className='d-flex align-items-center h-100'>\n <span className={styles.avatarContainer}>\n <EngagementAvatar\n type={effectiveType}\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(name, surname)}\n imageUrl={!props.anonymiseUsers && !effectiveType && value?.avatar?.url}\n anonymiseUsers={props.anonymiseUsers}\n />\n </span>\n <span className='ms-2 clamp-1 me-1'>\n {name} {surname}\n </span>\n {effectiveType === 'student-reach' && props.classroomViewsAppLink &&\n <IconButton\n customSize\n svg={CogSvg}\n svgSize={SvgContainerSize.Standard}\n appLink={props.classroomViewsAppLink}\n className={styles.cogIcon}\n tooltip={props.classroomViewsTooltip}\n tooltipTrigger={['hover']}\n ariaLabel={props.classroomViewsTooltip}\n />\n }\n </CellWrapper>\n );\n }\n }\n ];\n\n return [\n ...nameColumns,\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='views' />,\n accessor: 'viewCount',\n // React table uses flex ratios for widths. I've styled with 5 columns but didn't want to effect the sizing\n // for when it was 4 so we're keeping the new and old values - Sha\n width: props.showSeparateNameColumns ? 47 : 15,\n sortType: 'basic',\n sortDescFirst: true,\n Cell: ({ value }) => (\n <CellWrapper className='d-flex align-items-center h-100'>\n <div>{value}</div>\n </CellWrapper>\n )\n },\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='engagement' />,\n accessor: 'engagementRate',\n // React table uses flex ratios for widths. I've styled with 5 columns but didn't want to effect the sizing\n // for when it was 4 so we're keeping the new and old values - Sha\n width: props.showSeparateNameColumns ? 79 : 20,\n sortDescFirst: true,\n Cell: ({ value }) => (\n <CellWrapper className='w-33'>\n <PercentageIndicator\n percentage={value}\n layout={PercentageIndicatorLayout.LabelBefore}\n />\n </CellWrapper>\n )\n },\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='heatMap' />,\n accessor: 'heatMap',\n // React table uses flex ratios for widths. I've styled with 5 columns but didn't want to effect the sizing\n // for when it was 4 so we're keeping the new and old values - Sha\n width: props.showSeparateNameColumns ? 230 : 48,\n disableSortBy: true,\n Cell: ({ row: { original } }) => (\n <CellWrapper className='d-flex align-items-center h-100'>\n <EngagementHeatMap\n engagement={original}\n max={maxHeatMapValue}\n className={`${styles.heatMap} flex-grow-1`}\n />\n </CellWrapper>\n )\n }\n ];\n }, [ props.anonymiseUsers, props.showSeparateNameColumns ]);\n}\n\nexport function useGetTableData(\n engagement: Engagement[],\n users: AnonUser[],\n classroomStudents?: AnonUser[]\n): EngagementTableData[] {\n return React.useMemo(() => {\n const data: EngagementTableData[] = [];\n\n const userIdSet = new Set<string>();\n engagement?.forEach(e => {\n const user = users?.find(u => {\n if (u.id && u.id === e.userId) {\n userIdSet.add(u.id);\n return true;\n }\n\n if (u.sessionId && u.sessionId === e.sessionId)\n return true;\n\n return false;\n });\n\n data.push({ ...e, user });\n });\n\n if (classroomStudents?.length) {\n const students = classroomStudents\n .filter(s => !userIdSet.has(s.id))\n .map(user => ({ ...EMPTY_ENGAGEMENT, userId: user.id, user } as EngagementTableData));\n data.push(...students);\n }\n\n return data;\n }, [ engagement, users, classroomStudents ]);\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { Table, TableTheme } from 'libs/shared/components/table/Table';\nimport { Engagement } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport { useGetColumns, useGetTableData } from './EngagementTableUtils';\n\nconst theme: TableTheme = {\n table: 'bg-white rounded px-0',\n header: 'border-bottom',\n headerCell: 'm-3',\n cell: 'mx-3 my-2'\n};\n\ninterface EngagementTableProps {\n engagement: Engagement[];\n imageCdnUrl: string;\n users?: AnonUser[];\n classroomStudents?: AnonUser[];\n anonymiseUsers: boolean;\n border?: boolean;\n enableSort?: boolean;\n showSeparateNameColumns?: boolean;\n classroomViewsAppLink?: Core.AppLink;\n classroomViewsTooltip?: string;\n}\n\nexport function EngagementTable(props: EngagementTableProps): JSX.Element {\n const columns = useGetColumns({\n engagement: props.engagement,\n imageCdnUrl: props.imageCdnUrl,\n anonymiseUsers: props.anonymiseUsers,\n showSeparateNameColumns: props.showSeparateNameColumns,\n classroomViewsAppLink: props.classroomViewsAppLink,\n classroomViewsTooltip: props.classroomViewsTooltip\n });\n\n const data = useGetTableData(props.engagement, props.users, props.classroomStudents);\n\n if (!data.length)\n return <></>;\n\n return (\n <Table\n columns={columns}\n data={data}\n theme={{\n ...theme,\n table: props.border ? `${theme.table} border` : theme.table\n }}\n enableSort={props.enableSort}\n />\n );\n}\n","import React from 'react';\n\nimport { PercentageIndicator, PercentageIndicatorLayout } from './PercentageIndicator';\n\ninterface PartialPercentageIndicatorProps {\n layout: PercentageIndicatorLayout;\n className?: string;\n}\n\nexport function PartialPercentageIndicator(props: PartialPercentageIndicatorProps): JSX.Element {\n return (\n <PercentageIndicator\n layout={props.layout}\n className={props.className}\n percentage={0}\n customLabel='--%'\n />\n );\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { getEngagementRate } from 'libs/shared/apps/analytics/utils/EngagementUtils';\nimport { PartialPercentageIndicator } from 'libs/shared/components/percentage-indicator/PartialPercentageIndicator';\nimport { PercentageIndicator, PercentageIndicatorLayout } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { TimerSvg } from 'libs/shared/images/svg/status/TimerSvg';\nimport { Engagement } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.insightAmountWatched';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightAmountWatchedProps {\n engagement: Engagement[];\n}\n\nexport function InsightAmountWatched(props: InsightAmountWatchedProps) {\n const engagementRate = getEngagementRate(props.engagement);\n const percentage = Math.round(engagementRate * 100);\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svg={TimerSvg}\n svgClassName='bg-light-green text-green'\n >\n <div className='d-flex flex-column align-items-center my-auto gap-2'>\n {!!props.engagement &&\n <>\n <PercentageIndicator\n percentage={engagementRate}\n layout={PercentageIndicatorLayout.LabelInside}\n />\n <p className='text-center'>\n {typeof engagementRate === 'number' ?\n <Text namespace={namespace} phrase='everyoneWatched' options={{ percentage }} /> :\n <Text namespace={namespace} phrase='notWatched' />\n }\n </p>\n </>\n }\n {!props.engagement &&\n <>\n <PartialPercentageIndicator layout={PercentageIndicatorLayout.LabelInside} />\n </>\n }\n </div>\n </InsightCard>\n );\n}\n","const CHART_COLOURS = [\n '#FF9300', // Pizazz\n '#38A2E8', // Picton Blue\n '#7A76E8', // Portage\n '#B679C7', // East Side\n '#F7847B', // Froly\n '#D9584F', // Red (Not in the Primary palette)\n '#FFCD52', // Yellow (Not in the Primary Palette)\n '#5DC786', // Emerald\n '#40BCC3', // Perolous\n '#40C2BB' // Puerto rico\n];\n\nexport function mixinSeriesColours<T>(data: T[]): T[] {\n return data.map((d, idx) => ({\n ...d,\n color: CHART_COLOURS[idx % CHART_COLOURS.length]\n }));\n}\n","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport { BaseAnalyticsEventResponse, GroupedAnalyticsCount } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { UnionEventResponse } from 'libs/shared/apps/analytics/interfaces/UnionEvent';\nimport { VideoViewEventResponse } from 'libs/shared/apps/analytics/interfaces/VideoViewEvent';\nimport { mixinSeriesColours } from 'libs/shared/apps/analytics/utils/ChartColourUtils';\n\ntype EventResponseGroupByAttributes = keyof Pick<VideoViewEventResponse, 'contentTypeCount'> |\n keyof Pick<BaseAnalyticsEventResponse, 'userTypeCount' | 'yearGroupCount'>;\n\nexport function groupEvents(\n events: UnionEventResponse,\n groupBy: EventResponseGroupByAttributes,\n groupsToOmit?: string[],\n getSeriesName?: (group: string) => string\n): Highcharts.PointOptionsObject[] {\n const groups: HashObject<number> = {};\n\n const eventCounts = events[groupBy as keyof UnionEventResponse] as GroupedAnalyticsCount[];\n\n eventCounts?.forEach(ev => {\n const name = ev.name || 'Unknown';\n\n if (!name || groupsToOmit?.includes(name.toLowerCase()))\n return;\n\n groups[name] = groups[name] ?? 0;\n groups[name] += ev.count;\n });\n\n return mixinSeriesColours(ArrayHelper.sortBy(Object.keys(groups).map(group => ({\n name: getSeriesName ? getSeriesName(group) : group,\n y: groups[group],\n type: 'pie'\n })), 'name'));\n}\n\nexport function sortByYearGroup(data: Highcharts.PointOptionsObject[]) {\n const staffIndex = data.findIndex(group => group.name === 'Staff');\n\n // Move Staff to last index\n if (staffIndex > -1) {\n const [staffObject] = data.splice(staffIndex, 1);\n\n data.push(staffObject);\n }\n return data.sort((a, b) => {\n const numA = parseInt((a.name as string).match(/\\d+/)?.[0]);\n const numB = parseInt((b.name as string).match(/\\d+/)?.[0]);\n return numA - numB;\n });\n}\n\nexport function getTotalEventCount(data?: Highcharts.PointOptionsObject[]): number | null {\n return data?.reduce((a, b) => a + b.y, 0) ?? null;\n}\n","import React from 'react';\nimport Highcharts from 'highcharts';\nimport { HighchartsReact } from 'highcharts-react-official';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { CHART_FONT_STYLES } from 'libs/shared/apps/analytics/constants/ChartStyles';\nimport { VideoViewEventResponse } from 'libs/shared/apps/analytics/interfaces/VideoViewEvent';\nimport { getTotalEventCount, groupEvents, sortByYearGroup } from 'libs/shared/apps/analytics/utils/SharedUserActivityPieChartUtils';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VisibleOnSvg } from 'libs/shared/images/svg/actions/VisibleOnSvg';\n\nconst namespace = 'shared.insightTotalViews';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction mapUserTypeToChartLabel(type: string): string {\n if (type === 'Unknown')\n return getPhrase('anon');\n return type;\n}\n\nconst STATIC_CHART_OPTIONS: Highcharts.Options = {\n title: {\n text: null\n },\n credits: {\n enabled: false\n },\n chart: {\n backgroundColor: 'transparent',\n spacing: [ 0, 0, 0, 0 ]\n },\n legend: {\n itemStyle: CHART_FONT_STYLES,\n itemDistance: 8\n },\n plotOptions: {\n pie: {\n allowPointSelect: true,\n cursor: 'pointer',\n dataLabels: {\n enabled: false\n },\n showInLegend: true,\n borderWidth: 1,\n borderColor: '#ffffff',\n borderRadius: 0,\n size: '80%'\n }\n }\n};\n\ninterface InsightTotalViewsProps {\n events: VideoViewEventResponse;\n emptyStateImage: string;\n hideStaffResults: boolean;\n}\n\nexport function InsightTotalViews(props: InsightTotalViewsProps) {\n const grouped = groupEvents(\n props.events,\n 'yearGroupCount',\n props.hideStaffResults ? ['staff'] : [],\n mapUserTypeToChartLabel\n );\n const chartData = sortByYearGroup(grouped);\n const totalViews = getTotalEventCount(chartData);\n\n function getChartOptions(\n data: Highcharts.PointOptionsObject[]\n ): Highcharts.Options {\n return {\n ...STATIC_CHART_OPTIONS,\n series: [{\n type: 'pie',\n name: getPhrase('title'),\n data\n }]\n };\n }\n\n return (\n <InsightCard\n title={getPhrase('title')}\n // Replace with ultra marine + light colour\n svgClassName='bg-light-blue text-blue'\n // Add visibility icon \n svg={VisibleOnSvg}\n >\n {chartData?.length ? (\n <>\n <p className='mb-0'><Text namespace={namespace} phrase='totalViews' options={{ totalViews }} /></p>\n\n <div className='d-flex justify-content-center h-75'>\n <HighchartsReact\n highcharts={Highcharts}\n options={getChartOptions(chartData)}\n containerProps={{\n className: `w-100`\n }}\n />\n </div>\n </>\n ) : (\n <EmptyState className='pt-0 my-auto'>\n <EmptyState.Image src={props.emptyStateImage} className='w-75 h-auto'></EmptyState.Image>\n <EmptyState.Heading className='h4'><Text namespace={namespace} phrase='noViews' /></EmptyState.Heading>\n <EmptyState.Info className='w-100'><Text namespace={namespace} phrase='notWatched' /></EmptyState.Info>\n </EmptyState>\n )}\n </InsightCard>\n );\n}\n",":local {\n .partialInsights {\n height: 21.5rem;\n }\n\n .videoContainer {\n width: 44%;\n }\n}","import React from 'react';\n\nimport styles from './partial-insights-heatmap.module.scss';\n\nexport function PartialInsightsHeatmap() {\n return (\n <div>\n <div className='row g-3 mb-3'>\n <div className='col'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className={styles.videoContainer}>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n </div>\n\n <div className='row g-3 mb-5'>\n <div className='col-12'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n </div>\n </div>\n );\n}\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nconst MenuItem = videojs.getComponent('MenuItem');\n\ninterface EngagementOverlayMenuItemOptions extends videojs.MenuItemOptions {\n overlayVisible: boolean;\n}\n\nexport class EngagementOverlayMenuItem extends MenuItem {\n private toggleEl: Element;\n private overlayVisible: boolean;\n\n /**\n * Because we want to bind our listener in createEl\n * and createEl runs in super. We store if we've bounud\n * our handler, so we only call bind once and \n * the call to removeEventListener will still work\n */\n private handlerBound: boolean;\n\n constructor(player: VideoJsPlayer, options: EngagementOverlayMenuItemOptions) {\n super(player, options);\n\n this.overlayVisible = options.overlayVisible;\n this.toggle(this.overlayVisible);\n }\n\n public handleToggle(): void {\n this.toggle(!this.overlayVisible);\n }\n\n private toggle(state: boolean): void {\n state ? this.toggleOn() : this.toggleOff();\n }\n\n private toggleOn(): void {\n videojs.dom.addClass(this.toggleEl, 'on');\n this.overlayVisible = true;\n this.player().engagementOverlayPlugin().toggleOverlay(this.overlayVisible);\n this.player().addClass('cv-reports-player-overlay-visible');\n }\n\n private toggleOff(): void {\n videojs.dom.removeClass(this.toggleEl, 'on');\n this.overlayVisible = false;\n this.player().engagementOverlayPlugin().toggleOverlay(this.overlayVisible);\n this.player().removeClass('cv-reports-player-overlay-visible');\n }\n\n /**\n * Because we extend MenuItem which will close the menu by default\n * we need to halt the event propogation here\n */\n public handleClick(event: videojs.EventTarget.Event): void {\n event.stopImmediatePropagation();\n }\n\n public createEl(tagName?: string, properties?: any, attributes?: any): HTMLLIElement {\n /**\n * Bind our event listener only once\n * see the comment where handlerBound is defined\n */\n if (!this.handlerBound) {\n this.handleToggle = this.handleToggle.bind(this);\n this.handlerBound = true;\n }\n\n if (this.toggleEl)\n this.toggleEl.removeEventListener('click', this.handleToggle);\n\n this.toggleEl = videojs.dom.createEl('div', {\n className: `custom-toggle custom-toggle-info toggle-option float-end`,\n innerHTML: '<span class=\"handle\"></span></div>'\n });\n this.toggleEl.addEventListener('click', this.handleToggle);\n\n const innerHTML = `\n <span class=\"vjs-menu-item-text\">Heat Map</span>\n <span class=\"cv-toggle-container\"></span>`;\n\n const el = super.createEl(tagName, {\n className: 'vjs-menu-item cv-cog-menu-item',\n innerHTML\n }, attributes);\n\n /**\n * Indexing into the child this way is only safe to do because\n * we know that the el only has two children\n */\n el.children[1].appendChild(this.toggleEl);\n\n return el;\n }\n}\n\nvideojs.registerComponent('EngagementOverlayMenuItem', EngagementOverlayMenuItem);\n","import React from 'react';\n\nimport { InteractionLabel } from 'libs/shared/components/interactive-questions/InteractionLabel';\nimport { Interactive } from 'libs/shared/interfaces';\n\nconst MAX_INTERACTIONS_TO_SHOW = 3;\n\ninterface TimepointInteractionsProps {\n interactive: Interactive;\n time: number;\n}\n\nexport function TimepointInteractions(props: TimepointInteractionsProps): JSX.Element {\n const timepoint = props.interactive.timepoints.find(t => {\n const timepointTime = t.visibleAt / 1000;\n \n return Math.floor(props.time) === Math.floor(timepointTime)\n || Math.ceil(props.time) === Math.ceil(timepointTime);\n });\n\n if (!timepoint?.interactions?.length)\n return <></>;\n\n const interactions = timepoint.interactions.length > MAX_INTERACTIONS_TO_SHOW ?\n timepoint.interactions.slice(0, MAX_INTERACTIONS_TO_SHOW - 1) :\n timepoint.interactions;\n\n const hiddenInteractions = timepoint.interactions.length - interactions.length;\n\n return (\n <div className='d-flex justify-content-end ms-2'>\n {interactions.map((i, idx) => (\n <InteractionLabel\n key={idx}\n interaction={i}\n showQuestion={false}\n iconClassName='ms-1'\n />\n ))}\n {!!hiddenInteractions &&\n <div\n className={'interaction-type-icon d-flex justify-content-center' +\n ' align-items-center border border-dark text-body ms-1'}\n >\n {`+${hiddenInteractions}`}\n </div>\n }\n </div>\n );\n}\n","import React from 'react';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport Highcharts from 'highcharts';\n\nimport { Interactive } from 'libs/shared/interfaces';\n\nimport { TimepointInteractions } from 'projects/player/plugins/engagement-overlay-plugin/components/timepoint-interactions/timepoint-interactions';\nimport { formatTime } from 'projects/player/utils/formatTime';\n\nexport const STATIC_CHART_OPTIONS: Highcharts.Options = {\n title: {\n text: null\n },\n xAxis: {\n visible: false,\n minPadding: 0,\n maxPadding: 0\n },\n legend: {\n enabled: false\n },\n credits: {\n enabled: false\n },\n defs: {\n gradient: ({\n tagName: 'linearGradient',\n id: 'area-gradient',\n x1: 0,\n y1: 1,\n x2: 0,\n y2: 0,\n children: [\n ({\n tagName: 'stop',\n offset: 0\n } as Highcharts.ASTNode),\n ({\n tagName: 'stop',\n offset: 1\n } as Highcharts.ASTNode)\n ]\n } as Highcharts.ASTNode)\n }\n};\n\nexport function getChartOptions(width: number, height: number): Highcharts.ChartOptions {\n return {\n styledMode: true,\n spacing: [ 15, 0, 0, 0 ],\n width,\n height\n };\n}\n\nexport function getYAxisChartOptions(heatMap: number[]): Highcharts.YAxisOptions {\n const maxValue = Math.max(...heatMap);\n\n return {\n /**\n * To prevent max values from being cut off, we pad them relative to the chart scale.\n */\n max: maxValue * 1.05,\n min: 0,\n minPadding: 0,\n maxPadding: 0,\n allowDecimals: true,\n startOnTick: false,\n endOnTick: false,\n visible: false\n };\n}\n\nexport function getTooltipOptions(interactive?: Interactive): Highcharts.TooltipOptions {\n return {\n formatter: function () {\n const timepointInteractionsHtml = interactive ?\n getTimepointInteractionsHtml(interactive, this.x) :\n '';\n\n return (\n '<div class=\"cv-engagement-tooltip bg-white rounded\">' +\n '<div class=\"d-flex justify-content-between\">' +\n `<strong>${formatTime(this.x)}</strong>` +\n `${timepointInteractionsHtml}` +\n '</div>' +\n '<div class=\"d-flex justify-content-between rounded bg-light cv-view-count-container\">' +\n `<strong>Views</strong> <span class=\"cv-view-count\">${this.y}</span>` +\n '</div>' +\n '</div>'\n );\n },\n positioner: function (\n labelWidth: number,\n labelHeight: number,\n point: Highcharts.TooltipPositionerPointObject\n ) {\n const minX = 0;\n const maxX = this.chart.plotWidth - labelWidth;\n const x = point.plotX - labelWidth / 2;\n \n return {\n // Clamp x between min and max\n x: Math.min(Math.max(x, minX), maxX),\n y: this.chart.plotTop\n };\n },\n useHTML: true,\n padding: 0\n };\n}\n\nexport function getPlotOptions(moveTimepointIndicator: (x: number | null) => void): Highcharts.PlotOptions {\n return {\n area: {\n point: {\n events: {\n mouseOver: function () {\n moveTimepointIndicator(this.x);\n },\n mouseOut: function () {\n moveTimepointIndicator(null);\n }\n }\n }\n },\n series: {\n marker: {\n enabled: false\n }\n }\n };\n}\n\nfunction getTimepointInteractionsHtml(interactive: Interactive, time: number): string {\n return renderToStaticMarkup(\n <TimepointInteractions time={time} interactive={interactive} />\n );\n}\n","import Highcharts from 'highcharts';\nimport videojs, { VideoJsPlayer } from 'video.js';\n\nimport { Interactive } from 'libs/shared/interfaces';\n\nimport {\n getChartOptions,\n getPlotOptions,\n getTooltipOptions,\n getYAxisChartOptions,\n STATIC_CHART_OPTIONS\n} from './engagement-overlay-chart-options';\n\nimport './engagement-overlay.scss';\n\nconst Component = videojs.getComponent('Component');\n\nHighcharts.AST.allowedTags.push('g');\nHighcharts.AST.allowedAttributes.push('viewBox', 'transform');\n\ninterface ChartDimensions {\n width: number;\n height: number;\n}\n\ninterface EngagementOverlayOptions extends videojs.ComponentOptions {\n heatMap: number[];\n interactive?: Interactive;\n onTimepointHover?: (time: number | null) => void;\n}\n\nexport class EngagementOverlay extends Component {\n public options_: EngagementOverlayOptions;\n private chart: Highcharts.Chart;\n\n constructor(player: VideoJsPlayer, options: EngagementOverlayOptions) {\n super(player, options);\n\n this.initialize();\n this.bindListeners();\n }\n\n public initialize(): void {\n this.player().ready(() => this.buildChart());\n }\n\n public buildCSSClass(): string {\n return 'cv-engagement-overlay';\n }\n\n public createEl(tagName?: string, properties?: any, attributes?: any): Element {\n const innerHTML = '<div class=\"cv-engagement-chart\"></div>' +\n '<div class=\"cv-engagement-timepoint-indicator\"></div>';\n\n return super.createEl(tagName, {\n ...properties,\n className: this.buildCSSClass(),\n innerHTML\n }, attributes);\n }\n\n public toggleChart(show: boolean): void {\n if (show)\n this.buildChart();\n else\n this.destroyChart();\n }\n\n private bindListeners(): void {\n this.handleClick = this.handleClick.bind(this);\n this.resizeChart = this.resizeChart.bind(this);\n\n this.player().on('playerresize', this.resizeChart);\n\n this.on(this.el(), 'mouseup', this.handleClick);\n\n this.player().on('dispose', () => {\n this.player().off('playerresize', this.resizeChart);\n\n this.off(this.el(), 'mouseup', this.handleClick);\n });\n }\n\n private handleClick(event: videojs.EventTarget.Event): void {\n if (!videojs.dom.isSingleLeftClick(event))\n return;\n\n if (this.player().paused()) {\n this.player().play();\n return;\n }\n\n this.player().pause();\n }\n\n private buildChart(): void {\n if (this.chart)\n return;\n\n const chartDimensions = this.getChartDimensions();\n\n /**\n * The dimensions calculation relies on the control bar and progress control\n * being visible, so if it isn't, we wait for the play event.\n */\n if (!chartDimensions) {\n this.player().one('play', () => this.buildChart());\n return;\n }\n\n const container: HTMLElement = this.el().querySelector('.cv-engagement-chart');\n\n this.chart = Highcharts.chart(container, this.getHighchartOptions(chartDimensions));\n }\n\n private resizeChart(): void {\n const chartDimensions = this.getChartDimensions();\n\n if (!this.chart || !chartDimensions)\n return;\n\n this.chart.setSize(chartDimensions.width, chartDimensions.height);\n }\n\n private destroyChart(): void {\n this.chart?.destroy();\n this.chart = null;\n }\n\n private getChartDimensions(): ChartDimensions {\n const collapserator = this.player().getChild('collapserator');\n const collapseratorHeight = collapserator?.currentHeight();\n\n const width = this.el().clientWidth;\n\n if (!collapseratorHeight || !width)\n return null;\n\n const { height } = this.player().currentDimensions();\n \n return {\n width,\n height: height - collapseratorHeight\n };\n }\n\n private getHighchartOptions({ width, height }: ChartDimensions): Highcharts.Options {\n return {\n ...STATIC_CHART_OPTIONS,\n chart: getChartOptions(width, height),\n yAxis: getYAxisChartOptions(this.options_.heatMap),\n tooltip: getTooltipOptions(this.options_.interactive),\n plotOptions: getPlotOptions(this.moveTimepointIndicator.bind(this)),\n series: [{\n type: 'area',\n data: this.options_.heatMap\n }]\n };\n }\n\n private moveTimepointIndicator(x: number | null): void {\n if (this.options_.onTimepointHover)\n this.options_.onTimepointHover(x);\n\n const indicator: HTMLDivElement = this.el().querySelector('.cv-engagement-timepoint-indicator');\n\n if (x === null) {\n videojs.dom.removeClass(indicator, 'cv-engagement-timepoint-indicator-visible');\n return;\n }\n\n videojs.dom.addClass(indicator, 'cv-engagement-timepoint-indicator-visible');\n indicator.style.left = `${x / this.options_.heatMap.length * 100}%`;\n }\n}\n\nvideojs.registerComponent('EngagementOverlay', EngagementOverlay);\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport { Interactive } from 'libs/shared/interfaces';\n\nimport { CogButton } from 'projects/player/components/cog-button/cog-button';\nimport { EngagementOverlay } from 'projects/player/plugins/engagement-overlay-plugin/components/engagement-overlay/engagement-overlay';\nimport { EngagementOverlayMenuItem } from 'projects/player/plugins/engagement-overlay-plugin/components/engagement-overlay-menu-item/engagement-overlay-menu-item';\n\nimport 'projects/player/plugins/engagement-overlay-plugin/components/engagement-overlay/engagement-overlay';\n\nconst Plugin = videojs.getPlugin('plugin');\n\ninterface EngagementOverlayPluginOptions {\n heatMap: number[];\n interactive?: Interactive;\n onTimepointHover?: (time: number | null) => void;\n}\n\nclass EngagementOverlayPlugin extends Plugin {\n private options: EngagementOverlayPluginOptions;\n\n constructor(player: VideoJsPlayer, options: EngagementOverlayPluginOptions) {\n super(player, options);\n\n this.options = options;\n\n player.ready(() => {\n this.initialize();\n });\n }\n \n private initialize(): void {\n if (!this.hasHeatMapData())\n return;\n\n this.player.addChild('engagementOverlay', {\n heatMap: this.options.heatMap,\n interactive: this.options.interactive,\n onTimepointHover: this.options.onTimepointHover\n });\n\n /**\n * Check additionalItemOrder in cog-button.ts if you need to change the order. - Sha\n */\n const cogButton = this.player.getChild('collapserator')?.getChild('cogButton') as CogButton;\n cogButton.addItem({\n ctor: EngagementOverlayMenuItem,\n name: 'EngagementOverlayMenuItem',\n options: { overlayVisible: true }\n });\n }\n\n public toggleOverlay(show: boolean): void {\n const engagementOverlay = this.player.getChild('engagementOverlay') as EngagementOverlay;\n engagementOverlay?.toggleChart(show);\n }\n\n private hasHeatMapData(): boolean {\n return this.options.heatMap?.reduce((acc, val) => acc + val, 0) > 0;\n }\n}\n\nvideojs.registerPlugin('engagementOverlayPlugin', EngagementOverlayPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n engagementOverlayPlugin(options?: EngagementOverlayPluginOptions): EngagementOverlayPlugin;\n }\n}\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport { Interactive } from 'libs/shared/interfaces';\n\nimport { InteractiveBarItems } from 'projects/player/plugins/interactive-plugin/components/seek-bar/interactive-bar-items';\nimport { TrackHelper } from 'projects/player/utils/track-helper';\n\nimport './interactive-plugin-styles.scss';\n\nconst Plugin = videojs.getPlugin('plugin');\n\ninterface InteractiveSeekBarPluginOptions {\n interactive: Interactive;\n}\n\n/**\n * This plugin will just render the interactive seek bar (i.e. just the interaction markers).\n * The user won't be able to interact with any of the interactions.\n * Currently this is just used in reports-player\n */\nclass InteractiveSeekBarPlugin extends Plugin {\n private options: InteractiveSeekBarPluginOptions;\n\n constructor(player: VideoJsPlayer, options: InteractiveSeekBarPluginOptions) {\n super(player);\n\n this.options = options;\n\n this.player.one('loadedmetadata', () => this.player.ready(this.initialize.bind(this)));\n }\n\n private initialize(): void {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n TrackHelper.useMetadataTrack(this.player, 'interactive', this.onTrackLoaded.bind(this));\n\n this.player.addClass('cv-interactive-plugin');\n }\n\n private onTrackLoaded(track: TextTrack): void {\n this.addChildren(track);\n }\n\n private addChildren(track: TextTrack): void {\n const seekBar = this.player.controlBar.getChild('progressControl').getChild('SeekBar');\n\n seekBar.addChild(new InteractiveBarItems(this.player, {\n interactive: this.options.interactive,\n track\n }));\n }\n}\n\nvideojs.registerPlugin('interactiveSeekBarPlugin', InteractiveSeekBarPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n interactiveSeekBarPlugin(options?: InteractiveSeekBarPluginOptions): InteractiveSeekBarPlugin;\n }\n}\n","import { Interactive } from 'libs/shared/interfaces';\n\nimport { ClipData } from 'projects/player/interfaces/models/ClipData';\nimport { PlaybackObject } from 'projects/player/interfaces/models/PlaybackObject';\nimport { BasePlayer, BasePlayerOptions } from 'projects/player/players/base-player';\nimport { AnalyticsPlayerType } from 'projects/player/services/analytics-service';\nimport { InteractiveTrackHelper } from 'projects/player/utils/interactive-track-helper';\n\nimport './reports-player.scss';\n\nimport 'projects/player/plugins/engagement-overlay-plugin/engagement-overlay-plugin';\nimport 'projects/player/plugins/clip-plugin/clip-plugin';\nimport 'projects/player/plugins/interactive-plugin/interactive-seek-bar-plugin';\nimport 'projects/player/plugins/old-version-refresh-plugin/old-version-refresh-plugin';\n\nexport interface ReportsPlayerOptions extends BasePlayerOptions {\n heatMap: number[];\n onTimepointHover?: (time: number | null) => void;\n}\n\nexport class ReportsPlayer extends BasePlayer {\n declare protected options: ReportsPlayerOptions;\n private track: TextTrack;\n\n constructor(id: string | Element, options: ReportsPlayerOptions) {\n super(id, options);\n }\n\n protected getPlayerClassName(): string {\n return 'cv-reports-player';\n }\n\n protected getAnalyticsPlayerType(): AnalyticsPlayerType {\n return 'reports-player';\n }\n\n protected async additionalSetup(playbackObject: PlaybackObject): Promise<void> {\n super.additionalSetup(playbackObject);\n\n this.setupEngagementOverlayPlugin(playbackObject);\n this.setupUpClipPlugin(playbackObject);\n this.setupInteractiveSeekBarPlugin(playbackObject);\n }\n\n private setupEngagementOverlayPlugin(playbackObject: PlaybackObject): void {\n this.player.engagementOverlayPlugin({\n heatMap: this.options.heatMap,\n interactive: playbackObject.additionalData?.interactive as Interactive,\n onTimepointHover: this.options.onTimepointHover\n });\n }\n\n private setupUpClipPlugin(playbackObject: PlaybackObject): void {\n const isClip = playbackObject.mediaType === 'MasterClip';\n const isInteractive = playbackObject.mediaType === 'MasterInteractive';\n\n if (!isClip && !isInteractive)\n return;\n\n let clipData: ClipData;\n if (isClip)\n clipData = playbackObject.additionalData;\n \n if (isInteractive) {\n clipData = playbackObject.additionalData?.clipData;\n\n // Not all interactives will have clip data\n if (!clipData)\n return;\n }\n\n if (!clipData)\n throw Error('Invalid clip data');\n\n this.player.clipPlugin({\n startTime: clipData.startTime,\n endTime: clipData.endTime\n });\n }\n\n private setupInteractiveSeekBarPlugin(playbackObject: PlaybackObject): void {\n const interactive = playbackObject.additionalData?.interactive as Interactive;\n\n if (!playbackObject.additionalData?.interactive)\n return;\n\n this.track = InteractiveTrackHelper.getInteractiveTrack(this.player, playbackObject);\n\n this.player.interactiveSeekBarPlugin({ interactive });\n }\n\n protected getSeekBarOptions(): any {\n return {\n ignoreChapters: true\n };\n }\n}\n","import React from 'react';\n\nimport { ReportsPlayer, ReportsPlayerOptions } from 'projects/player/players/reports/reports-player';\n\nexport function ClickViewReportsPlayer(props: ReportsPlayerOptions): React.ReactElement {\n const ref = React.useRef(null);\n const playerRef = React.useRef<ReportsPlayer>(null);\n\n React.useEffect(() => {\n playerRef.current = new ReportsPlayer(ref.current, props);\n }, []);\n\n return (\n <div ref={ref}></div>\n );\n}\n",":local {\n .playerContainer {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n }\n\n .playerPlaceholder {\n width: 100%;\n padding-bottom: 56.25%;\n }\n\n .heatMap {\n height: 1rem;\n }\n\n .heatMapTimepointIndicator {\n border-left: 0.125rem dashed $info;\n margin-left: -0.0625rem;\n position: absolute;\n top: 0;\n bottom: 0;\n opacity: 0;\n visibility: hidden;\n\n &.heatMapTimepointIndicatorVisible {\n opacity: 1;\n visibility: visible;\n }\n }\n\n .partialLoadingContainer {\n height: 24.015625rem;\n }\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EngagementHeatMap, EngagementHeatMapLegend } from 'libs/shared/apps/analytics/components/engagement-heat-map/EngagementHeatMap';\nimport { getFullHeatMap } from 'libs/shared/apps/analytics/utils/EngagementUtils';\nimport { Engagement } from 'libs/shared/interfaces';\n\nimport { ClickViewReportsPlayer } from 'projects/player/react/ReportsPlayer';\n\nimport styles from './video-engagement-overlay.module.scss';\n\nconst namespace = 'shared.videoEngagementOverlay';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface VideoEngagementOverlayProps {\n engagement: Engagement;\n viewKey: string;\n imageCdnUrl: string;\n playerApiUrl: string;\n}\n\nexport function VideoEngagementOverlay(props: VideoEngagementOverlayProps): JSX.Element {\n const timepointIndicatorRef = React.useRef<HTMLDivElement>(null);\n\n const heatMap = getFullHeatMap(props.engagement);\n\n function setHoverTimepoint(time: number | null): void {\n const el = timepointIndicatorRef.current;\n\n if (!el)\n return;\n\n if (time === null) {\n el.classList.remove(styles.heatMapTimepointIndicatorVisible);\n return;\n }\n\n el.classList.add(styles.heatMapTimepointIndicatorVisible);\n el.style.left = `${time / heatMap.length * 100}%`;\n }\n\n return (\n <div className='bg-white border rounded overflow-hidden h-100'>\n <div className='position-relative'>\n {/**\n * The below div is an empty 16:9 rectangle which maintains this component's\n * height while the player is loading.\n */\n }\n <div className={styles.playerPlaceholder} />\n <div className={styles.playerContainer}>\n <ClickViewReportsPlayer\n viewKey={props.viewKey}\n playerApi={new URL(props.playerApiUrl)}\n hotkeyElQuerySelector='body'\n heatMap={heatMap}\n onTimepointHover={setHoverTimepoint}\n aspectRatio='16:9'\n />\n </div>\n </div>\n <div className='p-3'>\n <div className='position-relative'>\n <EngagementHeatMap\n engagement={props.engagement}\n className={styles.heatMap}\n />\n <div ref={timepointIndicatorRef} className={styles.heatMapTimepointIndicator} />\n </div>\n <div className='d-flex justify-content-between mt-2'>\n <strong>\n {getPhrase('heatmap')}\n </strong>\n <div className='w-33'>\n <EngagementHeatMapLegend />\n </div>\n </div>\n </div>\n </div>\n );\n}\n",":local {\n .videoContainer {\n width: 44%;\n }\n}","import React from 'react';\n\nimport { EngagementTable } from 'libs/shared/apps/analytics/components/engagement-table/EngagementTable';\nimport { InsightAmountWatched } from 'libs/shared/apps/analytics/components/insights/amount-watched/InsightAmountWatched';\nimport { InsightTotalViews } from 'libs/shared/apps/analytics/components/insights/total-views/InsightTotalViews';\nimport { GroupedAnalyticsCount } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { VideoViewEventResponse } from 'libs/shared/apps/analytics/interfaces/VideoViewEvent';\nimport { Config, Engagement, PlayerViewKey } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport { PartialInsightsHeatmap } from 'apps/my-shares/components/insights-heatmap/partial-loading/PartialInsightsHeatmap';\nimport { VideoEngagementOverlay } from 'apps/my-shares/components/video-engagement-overlay/VideoEngagementOverlay';\n\nimport styles from './insights-heatmap.module.scss';\n\ninterface InsightsHeatmapProps {\n hasDataLoaded: boolean;\n tableDataLoaded: boolean;\n yearGroups: GroupedAnalyticsCount[];\n aggregateEngagement: Engagement;\n individualEngagement: Engagement[];\n viewKey: PlayerViewKey;\n config: Config;\n users: AnonUser[];\n classroomStudents?: AnonUser[];\n anonymiseUsers: boolean;\n hideStaffResults: boolean;\n}\n\nexport function InsightsHeatmap(props: InsightsHeatmapProps) {\n return (\n <>\n {!props.hasDataLoaded && <PartialInsightsHeatmap />}\n\n <div className='row g-3 mb-3'>\n {props.hasDataLoaded &&\n <>\n <div className='col'>\n <InsightTotalViews\n events={{ yearGroupCount: props.yearGroups } as VideoViewEventResponse}\n emptyStateImage={ImageUrls.EmptyStates.MY_VIDEOS}\n hideStaffResults={props.hideStaffResults}\n />\n </div>\n <div className='col'>\n <InsightAmountWatched engagement={props.individualEngagement} />\n </div>\n <div className={styles.videoContainer}>\n <VideoEngagementOverlay\n engagement={props.aggregateEngagement}\n viewKey={props.viewKey.viewKey}\n playerApiUrl={props.config.playerApiUrl}\n imageCdnUrl={props.config.imageCdnUrl}\n />\n </div>\n </>\n }\n\n {props.tableDataLoaded &&\n <div className='col-12'>\n <EngagementTable\n engagement={props.individualEngagement}\n users={props.users}\n imageCdnUrl={props.config?.imageCdnUrl}\n anonymiseUsers={props.anonymiseUsers}\n classroomStudents={props.classroomStudents}\n border\n enableSort\n showSeparateNameColumns\n />\n </div>\n }\n </div>\n </>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"CgL1gDuH.chunk.js","names":[],"sources":["../../../../libs/shared/src/apps/analytics/components/engagement-table/engagement-table.module.scss","../../../../libs/shared/src/apps/analytics/components/engagement-table/EngagementTableUtils.tsx","../../../../libs/shared/src/apps/analytics/components/engagement-table/EngagementTable.tsx","../../../../libs/shared/src/components/percentage-indicator/PartialPercentageIndicator.tsx","../../../../libs/shared/src/apps/analytics/components/insights/amount-watched/InsightAmountWatched.tsx","../../../../libs/shared/src/apps/analytics/utils/ChartColourUtils.ts","../../../../libs/shared/src/apps/analytics/utils/SharedUserActivityPieChartUtils.ts","../../../../libs/shared/src/apps/analytics/components/insights/total-views/InsightTotalViews.tsx","../../src/apps/my-shares/components/insights-heatmap/partial-loading/partial-insights-heatmap.module.scss","../../src/apps/my-shares/components/insights-heatmap/partial-loading/PartialInsightsHeatmap.tsx","../../../player/src/plugins/engagement-overlay-plugin/components/engagement-overlay-menu-item/engagement-overlay-menu-item.ts","../../../player/src/plugins/engagement-overlay-plugin/components/timepoint-interactions/timepoint-interactions.tsx","../../../player/src/plugins/engagement-overlay-plugin/components/engagement-overlay/engagement-overlay-chart-options.tsx","../../../player/src/plugins/engagement-overlay-plugin/components/engagement-overlay/engagement-overlay.ts","../../../player/src/plugins/engagement-overlay-plugin/engagement-overlay-plugin.ts","../../../player/src/plugins/interactive-plugin/interactive-seek-bar-plugin.ts","../../../player/src/players/reports/reports-player.ts","../../../player/src/react/ReportsPlayer.tsx","../../src/apps/my-shares/components/video-engagement-overlay/video-engagement-overlay.module.scss","../../src/apps/my-shares/components/video-engagement-overlay/VideoEngagementOverlay.tsx","../../src/apps/my-shares/components/insights-heatmap/insights-heatmap.module.scss","../../src/apps/my-shares/components/insights-heatmap/InsightsHeatmap.tsx"],"sourcesContent":[":local {\n .heatMap {\n height: 1rem;\n }\n\n // use avatar width\n .avatarContainer {\n width: 2rem;\n height: 2rem;\n }\n\n .cogIcon {\n cursor: pointer;\n color: $gray-900;\n line-height: 1;\n }\n}","import React from 'react';\nimport { Column, ColumnInstance, Row } from 'react-table';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EngagementHeatMap } from 'libs/shared/apps/analytics/components/engagement-heat-map/EngagementHeatMap';\nimport { anonymiseUserName } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { EngagementAvatar } from 'libs/shared/components/engagement-avatar/EngagementAvatar';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { PercentageIndicator, PercentageIndicatorLayout } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { CogSvg } from 'libs/shared/images/svg/objects/CogSvg';\nimport { Engagement, EngagementType } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from './engagement-table.module.scss';\n\nconst namespace = 'shared.engagementTable';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst EMPTY_ENGAGEMENT: Partial<Engagement> = {\n heatMap: [],\n engagementRate: 0,\n viewCount: 0\n};\n\ninterface CellWrapperProps {\n className?: string;\n}\n\nfunction CellWrapper(props: React.PropsWithChildren<CellWrapperProps>): JSX.Element {\n return (\n <div className={`${props.className ?? ''}`}>\n {props.children}\n </div>\n );\n}\n\ninterface HeaderCellProps {\n column: ColumnInstance<EngagementTableData>;\n phraseKey: string;\n}\n\nfunction HeaderCell(props: HeaderCellProps): JSX.Element {\n return (\n <CellWrapper className={`d-inline-block ${props.column.isSorted ? 'fw-bold' : ''}`}>\n {getPhrase(props.phraseKey)}\n </CellWrapper>\n );\n}\n\nexport interface EngagementTableData extends Engagement {\n user: AnonUser;\n}\n\nfunction getMaxHeatMapValue(engagement: Engagement[]): number {\n let max = 0;\n\n engagement.forEach(e => {\n const localMax = Math.max(...e.heatMap);\n\n if (localMax > max)\n max = localMax;\n });\n\n return max;\n}\n\n/**\n * Resolves the engagement type, inferring 'anon' for legacy data\n * where type is not set but userId is null.\n */\nfunction resolveEngagementType(engagement: Engagement): EngagementType | undefined {\n if (engagement.type) return engagement.type;\n if (engagement.userId === null || engagement.userId === undefined) return 'anon';\n return undefined;\n}\n\nfunction getEngagementTypeLabel(type: EngagementType): string | null {\n switch (type) {\n case 'student-reach':\n return getPhrase('classroomViews');\n case 'anon':\n return getPhrase('anonymous');\n default:\n return null;\n }\n}\n\nfunction getUsersName(user: AnonUser, anonymiseUsers: boolean, type?: EngagementType) {\n if (type) {\n const label = getEngagementTypeLabel(type);\n if (label && !user?.name) return { name: label, surname: '' };\n }\n\n const fullName = anonymiseUserName(user, anonymiseUsers);\n const nameParts = fullName.split(' ').filter(n => !!n);\n\n return {\n name: nameParts[0],\n surname: nameParts.slice(1).join(' ')\n };\n}\n\ninterface EngagementColumnProps {\n engagement: Engagement[];\n imageCdnUrl: string;\n anonymiseUsers: boolean;\n showSeparateNameColumns?: boolean;\n classroomViewsAppLink?: Core.AppLink;\n classroomViewsTooltip?: string;\n}\n\nexport function useGetColumns(props: EngagementColumnProps): Column<EngagementTableData>[] {\n return React.useMemo(() => {\n const maxHeatMapValue = getMaxHeatMapValue(props.engagement);\n\n const nameColumns: Column<EngagementTableData>[] = props.showSeparateNameColumns ? [\n {\n id: 'firstName',\n Header: ({ column }: { column: ColumnInstance<EngagementTableData> }) => <HeaderCell column={column} phraseKey='firstName' />,\n accessor: 'user',\n width: 63,\n sortType: (rowA: Row<EngagementTableData>, rowB: Row<EngagementTableData>) => {\n const typeA = resolveEngagementType(rowA.original);\n const typeB = resolveEngagementType(rowB.original);\n const { name: nameA } = getUsersName(rowA.values.firstName, props.anonymiseUsers, typeA);\n const { name: nameB } = getUsersName(rowB.values.firstName, props.anonymiseUsers, typeB);\n return nameA > nameB ? 1 : -1;\n },\n Cell: ({ value, row: { original } }: { value: AnonUser, row: Row<EngagementTableData> }) => {\n const effectiveType = resolveEngagementType(original);\n const { name, surname } = getUsersName(value, props.anonymiseUsers, effectiveType);\n return (\n <CellWrapper className='d-flex align-items-center h-100'>\n <span className={styles.avatarContainer}>\n <EngagementAvatar\n type={effectiveType}\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(name, surname)}\n imageUrl={!props.anonymiseUsers && !effectiveType && value?.avatar?.url}\n anonymiseUsers={props.anonymiseUsers}\n />\n </span>\n <span className='ms-2 clamp-1'>\n {name}\n </span>\n {effectiveType === 'student-reach' && props.classroomViewsAppLink &&\n <IconButton\n customSize\n svg={CogSvg}\n svgSize={SvgContainerSize.Standard}\n appLink={props.classroomViewsAppLink}\n className={styles.cogIcon}\n tooltip={props.classroomViewsTooltip}\n tooltipTrigger={['hover']}\n ariaLabel={props.classroomViewsTooltip}\n />\n }\n </CellWrapper>\n );\n }\n },\n {\n id: 'surname',\n Header: ({ column }: { column: ColumnInstance<EngagementTableData> }) => <HeaderCell column={column} phraseKey='surname' />,\n accessor: 'user',\n width: 68,\n sortType: (rowA: Row<EngagementTableData>, rowB: Row<EngagementTableData>) => {\n const typeA = resolveEngagementType(rowA.original);\n const typeB = resolveEngagementType(rowB.original);\n const { surname: surnameA } = getUsersName(rowA.values.surname, props.anonymiseUsers, typeA);\n const { surname: surnameB } = getUsersName(rowB.values.surname, props.anonymiseUsers, typeB);\n return surnameA > surnameB ? 1 : -1;\n },\n Cell: ({ value, row: { original } }: { value: AnonUser, row: Row<EngagementTableData> }) => {\n const { surname } = getUsersName(value, props.anonymiseUsers, resolveEngagementType(original));\n return (\n <CellWrapper className='d-flex align-items-center h-100'>\n <span className='clamp-1'>\n {surname || ''}\n </span>\n </CellWrapper>\n );\n }\n }\n ] : [\n {\n id: 'name',\n Header: ({ column }: { column: ColumnInstance<EngagementTableData> }) => <HeaderCell column={column} phraseKey='name' />,\n accessor: 'user',\n width: 22,\n sortType: (rowA: Row<EngagementTableData>, rowB: Row<EngagementTableData>) => {\n const typeA = resolveEngagementType(rowA.original);\n const typeB = resolveEngagementType(rowB.original);\n const nameA = typeA ?\n getEngagementTypeLabel(typeA) :\n anonymiseUserName(rowA.values.user, props.anonymiseUsers);\n const nameB = typeB ?\n getEngagementTypeLabel(typeB) :\n anonymiseUserName(rowB.values.user, props.anonymiseUsers);\n\n return nameA > nameB ? 1 : -1;\n },\n Cell: ({ value, row: { original } }: { value: AnonUser, row: Row<EngagementTableData> }) => {\n const effectiveType = resolveEngagementType(original);\n const { name, surname } = getUsersName(value, props.anonymiseUsers, effectiveType);\n return (\n <CellWrapper className='d-flex align-items-center h-100'>\n <span className={styles.avatarContainer}>\n <EngagementAvatar\n type={effectiveType}\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(name, surname)}\n imageUrl={!props.anonymiseUsers && !effectiveType && value?.avatar?.url}\n anonymiseUsers={props.anonymiseUsers}\n />\n </span>\n <span className='ms-2 clamp-1 me-1'>\n {name} {surname}\n </span>\n {effectiveType === 'student-reach' && props.classroomViewsAppLink &&\n <IconButton\n customSize\n svg={CogSvg}\n svgSize={SvgContainerSize.Standard}\n appLink={props.classroomViewsAppLink}\n className={styles.cogIcon}\n tooltip={props.classroomViewsTooltip}\n tooltipTrigger={['hover']}\n ariaLabel={props.classroomViewsTooltip}\n />\n }\n </CellWrapper>\n );\n }\n }\n ];\n\n return [\n ...nameColumns,\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='views' />,\n accessor: 'viewCount',\n // React table uses flex ratios for widths. I've styled with 5 columns but didn't want to effect the sizing\n // for when it was 4 so we're keeping the new and old values - Sha\n width: props.showSeparateNameColumns ? 47 : 15,\n sortType: 'basic',\n sortDescFirst: true,\n Cell: ({ value }) => (\n <CellWrapper className='d-flex align-items-center h-100'>\n <div>{value}</div>\n </CellWrapper>\n )\n },\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='engagement' />,\n accessor: 'engagementRate',\n // React table uses flex ratios for widths. I've styled with 5 columns but didn't want to effect the sizing\n // for when it was 4 so we're keeping the new and old values - Sha\n width: props.showSeparateNameColumns ? 79 : 20,\n sortDescFirst: true,\n Cell: ({ value }) => (\n <CellWrapper className='w-33'>\n <PercentageIndicator\n percentage={value}\n layout={PercentageIndicatorLayout.LabelBefore}\n />\n </CellWrapper>\n )\n },\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='heatMap' />,\n accessor: 'heatMap',\n // React table uses flex ratios for widths. I've styled with 5 columns but didn't want to effect the sizing\n // for when it was 4 so we're keeping the new and old values - Sha\n width: props.showSeparateNameColumns ? 230 : 48,\n disableSortBy: true,\n Cell: ({ row: { original } }) => (\n <CellWrapper className='d-flex align-items-center h-100'>\n <EngagementHeatMap\n engagement={original}\n max={maxHeatMapValue}\n className={`${styles.heatMap} flex-grow-1`}\n />\n </CellWrapper>\n )\n }\n ];\n }, [ props.anonymiseUsers, props.showSeparateNameColumns ]);\n}\n\nexport function useGetTableData(\n engagement: Engagement[],\n users: AnonUser[],\n classroomStudents?: AnonUser[]\n): EngagementTableData[] {\n return React.useMemo(() => {\n const data: EngagementTableData[] = [];\n\n const userIdSet = new Set<string>();\n engagement?.forEach(e => {\n const user = users?.find(u => {\n if (u.id && u.id === e.userId) {\n userIdSet.add(u.id);\n return true;\n }\n\n if (u.sessionId && u.sessionId === e.sessionId)\n return true;\n\n return false;\n });\n\n data.push({ ...e, user });\n });\n\n if (classroomStudents?.length) {\n const students = classroomStudents\n .filter(s => !userIdSet.has(s.id))\n .map(user => ({ ...EMPTY_ENGAGEMENT, userId: user.id, user } as EngagementTableData));\n data.push(...students);\n }\n\n return data;\n }, [ engagement, users, classroomStudents ]);\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { Table, TableTheme } from 'libs/shared/components/table/Table';\nimport { Engagement } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport { useGetColumns, useGetTableData } from './EngagementTableUtils';\n\nconst theme: TableTheme = {\n table: 'bg-white rounded px-0',\n header: 'border-bottom',\n headerCell: 'm-3',\n cell: 'mx-3 my-2'\n};\n\ninterface EngagementTableProps {\n engagement: Engagement[];\n imageCdnUrl: string;\n users?: AnonUser[];\n classroomStudents?: AnonUser[];\n anonymiseUsers: boolean;\n border?: boolean;\n enableSort?: boolean;\n showSeparateNameColumns?: boolean;\n classroomViewsAppLink?: Core.AppLink;\n classroomViewsTooltip?: string;\n}\n\nexport function EngagementTable(props: EngagementTableProps): JSX.Element {\n const columns = useGetColumns({\n engagement: props.engagement,\n imageCdnUrl: props.imageCdnUrl,\n anonymiseUsers: props.anonymiseUsers,\n showSeparateNameColumns: props.showSeparateNameColumns,\n classroomViewsAppLink: props.classroomViewsAppLink,\n classroomViewsTooltip: props.classroomViewsTooltip\n });\n\n const data = useGetTableData(props.engagement, props.users, props.classroomStudents);\n\n if (!data.length)\n return <></>;\n\n return (\n <Table\n columns={columns}\n data={data}\n theme={{\n ...theme,\n table: props.border ? `${theme.table} border` : theme.table\n }}\n enableSort={props.enableSort}\n />\n );\n}\n","import React from 'react';\n\nimport { PercentageIndicator, PercentageIndicatorLayout } from './PercentageIndicator';\n\ninterface PartialPercentageIndicatorProps {\n layout: PercentageIndicatorLayout;\n className?: string;\n}\n\nexport function PartialPercentageIndicator(props: PartialPercentageIndicatorProps): JSX.Element {\n return (\n <PercentageIndicator\n layout={props.layout}\n className={props.className}\n percentage={0}\n customLabel='--%'\n />\n );\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { getEngagementRate } from 'libs/shared/apps/analytics/utils/EngagementUtils';\nimport { PartialPercentageIndicator } from 'libs/shared/components/percentage-indicator/PartialPercentageIndicator';\nimport { PercentageIndicator, PercentageIndicatorLayout } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { TimerSvg } from 'libs/shared/images/svg/status/TimerSvg';\nimport { Engagement } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.insightAmountWatched';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightAmountWatchedProps {\n engagement: Engagement[];\n}\n\nexport function InsightAmountWatched(props: InsightAmountWatchedProps) {\n const engagementRate = getEngagementRate(props.engagement);\n const percentage = Math.round(engagementRate * 100);\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svg={TimerSvg}\n svgClassName='bg-light-green text-green'\n >\n <div className='d-flex flex-column align-items-center my-auto gap-2'>\n {!!props.engagement &&\n <>\n <PercentageIndicator\n percentage={engagementRate}\n layout={PercentageIndicatorLayout.LabelInside}\n />\n <p className='text-center'>\n {typeof engagementRate === 'number' ?\n <Text namespace={namespace} phrase='everyoneWatched' options={{ percentage }} /> :\n <Text namespace={namespace} phrase='notWatched' />\n }\n </p>\n </>\n }\n {!props.engagement &&\n <>\n <PartialPercentageIndicator layout={PercentageIndicatorLayout.LabelInside} />\n </>\n }\n </div>\n </InsightCard>\n );\n}\n","const CHART_COLOURS = [\n '#FF9300', // Pizazz\n '#38A2E8', // Picton Blue\n '#7A76E8', // Portage\n '#B679C7', // East Side\n '#F7847B', // Froly\n '#D9584F', // Red (Not in the Primary palette)\n '#FFCD52', // Yellow (Not in the Primary Palette)\n '#5DC786', // Emerald\n '#40BCC3', // Perolous\n '#40C2BB' // Puerto rico\n];\n\nexport function mixinSeriesColours<T>(data: T[]): T[] {\n return data.map((d, idx) => ({\n ...d,\n color: CHART_COLOURS[idx % CHART_COLOURS.length]\n }));\n}\n","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport { BaseAnalyticsEventResponse, GroupedAnalyticsCount } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { UnionEventResponse } from 'libs/shared/apps/analytics/interfaces/UnionEvent';\nimport { VideoViewEventResponse } from 'libs/shared/apps/analytics/interfaces/VideoViewEvent';\nimport { mixinSeriesColours } from 'libs/shared/apps/analytics/utils/ChartColourUtils';\n\ntype EventResponseGroupByAttributes = keyof Pick<VideoViewEventResponse, 'contentTypeCount'> |\n keyof Pick<BaseAnalyticsEventResponse, 'userTypeCount' | 'yearGroupCount'>;\n\nexport function groupEvents(\n events: UnionEventResponse,\n groupBy: EventResponseGroupByAttributes,\n groupsToOmit?: string[],\n getSeriesName?: (group: string) => string\n): Highcharts.PointOptionsObject[] {\n const groups: HashObject<number> = {};\n\n const eventCounts = events[groupBy as keyof UnionEventResponse] as GroupedAnalyticsCount[];\n\n eventCounts?.forEach(ev => {\n const name = ev.name || 'Unknown';\n\n if (!name || groupsToOmit?.includes(name.toLowerCase()))\n return;\n\n groups[name] = groups[name] ?? 0;\n groups[name] += ev.count;\n });\n\n return mixinSeriesColours(ArrayHelper.sortBy(Object.keys(groups).map(group => ({\n name: getSeriesName ? getSeriesName(group) : group,\n y: groups[group],\n type: 'pie'\n })), 'name'));\n}\n\nexport function sortByYearGroup(data: Highcharts.PointOptionsObject[]) {\n const staffIndex = data.findIndex(group => group.name === 'Staff');\n\n // Move Staff to last index\n if (staffIndex > -1) {\n const [staffObject] = data.splice(staffIndex, 1);\n\n data.push(staffObject);\n }\n return data.sort((a, b) => {\n const numA = parseInt((a.name as string).match(/\\d+/)?.[0]);\n const numB = parseInt((b.name as string).match(/\\d+/)?.[0]);\n return numA - numB;\n });\n}\n\nexport function getTotalEventCount(data?: Highcharts.PointOptionsObject[]): number | null {\n return data?.reduce((a, b) => a + b.y, 0) ?? null;\n}\n","import React from 'react';\nimport Highcharts from 'highcharts';\nimport { HighchartsReact } from 'highcharts-react-official';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { CHART_FONT_STYLES } from 'libs/shared/apps/analytics/constants/ChartStyles';\nimport { VideoViewEventResponse } from 'libs/shared/apps/analytics/interfaces/VideoViewEvent';\nimport { getTotalEventCount, groupEvents, sortByYearGroup } from 'libs/shared/apps/analytics/utils/SharedUserActivityPieChartUtils';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VisibleOnSvg } from 'libs/shared/images/svg/actions/VisibleOnSvg';\n\nconst namespace = 'shared.insightTotalViews';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction mapUserTypeToChartLabel(type: string): string {\n if (type === 'Unknown')\n return getPhrase('anon');\n return type;\n}\n\nconst STATIC_CHART_OPTIONS: Highcharts.Options = {\n title: {\n text: null\n },\n credits: {\n enabled: false\n },\n chart: {\n backgroundColor: 'transparent',\n spacing: [ 0, 0, 0, 0 ]\n },\n legend: {\n itemStyle: CHART_FONT_STYLES,\n itemDistance: 8\n },\n plotOptions: {\n pie: {\n allowPointSelect: true,\n cursor: 'pointer',\n dataLabels: {\n enabled: false\n },\n showInLegend: true,\n borderWidth: 1,\n borderColor: '#ffffff',\n borderRadius: 0,\n size: '80%'\n }\n }\n};\n\ninterface InsightTotalViewsProps {\n events: VideoViewEventResponse;\n emptyStateImage: string;\n hideStaffResults: boolean;\n}\n\nexport function InsightTotalViews(props: InsightTotalViewsProps) {\n const grouped = groupEvents(\n props.events,\n 'yearGroupCount',\n props.hideStaffResults ? ['staff'] : [],\n mapUserTypeToChartLabel\n );\n const chartData = sortByYearGroup(grouped);\n const totalViews = getTotalEventCount(chartData);\n\n function getChartOptions(\n data: Highcharts.PointOptionsObject[]\n ): Highcharts.Options {\n return {\n ...STATIC_CHART_OPTIONS,\n series: [{\n type: 'pie',\n name: getPhrase('title'),\n data\n }]\n };\n }\n\n return (\n <InsightCard\n title={getPhrase('title')}\n // Replace with ultra marine + light colour\n svgClassName='bg-light-blue text-blue'\n // Add visibility icon \n svg={VisibleOnSvg}\n >\n {chartData?.length ? (\n <>\n <p className='mb-0'><Text namespace={namespace} phrase='totalViews' options={{ totalViews }} /></p>\n\n <div className='d-flex justify-content-center h-75'>\n <HighchartsReact\n highcharts={Highcharts}\n options={getChartOptions(chartData)}\n containerProps={{\n className: `w-100`\n }}\n />\n </div>\n </>\n ) : (\n <EmptyState className='pt-0 my-auto'>\n <EmptyState.Image src={props.emptyStateImage} className='w-75 h-auto'></EmptyState.Image>\n <EmptyState.Heading className='h4'><Text namespace={namespace} phrase='noViews' /></EmptyState.Heading>\n <EmptyState.Info className='w-100'><Text namespace={namespace} phrase='notWatched' /></EmptyState.Info>\n </EmptyState>\n )}\n </InsightCard>\n );\n}\n",":local {\n .partialInsights {\n height: 21.5rem;\n }\n\n .videoContainer {\n width: 44%;\n }\n}","import React from 'react';\n\nimport styles from './partial-insights-heatmap.module.scss';\n\nexport function PartialInsightsHeatmap() {\n return (\n <div>\n <div className='row g-3 mb-3'>\n <div className='col'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className={styles.videoContainer}>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n </div>\n\n <div className='row g-3 mb-5'>\n <div className='col-12'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n </div>\n </div>\n );\n}\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nconst MenuItem = videojs.getComponent('MenuItem');\n\ninterface EngagementOverlayMenuItemOptions extends videojs.MenuItemOptions {\n overlayVisible: boolean;\n}\n\nexport class EngagementOverlayMenuItem extends MenuItem {\n private toggleEl: Element;\n private overlayVisible: boolean;\n\n /**\n * Because we want to bind our listener in createEl\n * and createEl runs in super. We store if we've bounud\n * our handler, so we only call bind once and \n * the call to removeEventListener will still work\n */\n private handlerBound: boolean;\n\n constructor(player: VideoJsPlayer, options: EngagementOverlayMenuItemOptions) {\n super(player, options);\n\n this.overlayVisible = options.overlayVisible;\n this.toggle(this.overlayVisible);\n }\n\n public handleToggle(): void {\n this.toggle(!this.overlayVisible);\n }\n\n private toggle(state: boolean): void {\n state ? this.toggleOn() : this.toggleOff();\n }\n\n private toggleOn(): void {\n videojs.dom.addClass(this.toggleEl, 'on');\n this.overlayVisible = true;\n this.player().engagementOverlayPlugin().toggleOverlay(this.overlayVisible);\n this.player().addClass('cv-reports-player-overlay-visible');\n }\n\n private toggleOff(): void {\n videojs.dom.removeClass(this.toggleEl, 'on');\n this.overlayVisible = false;\n this.player().engagementOverlayPlugin().toggleOverlay(this.overlayVisible);\n this.player().removeClass('cv-reports-player-overlay-visible');\n }\n\n /**\n * Because we extend MenuItem which will close the menu by default\n * we need to halt the event propogation here\n */\n public handleClick(event: videojs.EventTarget.Event): void {\n event.stopImmediatePropagation();\n }\n\n public createEl(tagName?: string, properties?: any, attributes?: any): HTMLLIElement {\n /**\n * Bind our event listener only once\n * see the comment where handlerBound is defined\n */\n if (!this.handlerBound) {\n this.handleToggle = this.handleToggle.bind(this);\n this.handlerBound = true;\n }\n\n if (this.toggleEl)\n this.toggleEl.removeEventListener('click', this.handleToggle);\n\n this.toggleEl = videojs.dom.createEl('div', {\n className: `custom-toggle custom-toggle-info toggle-option float-end`,\n innerHTML: '<span class=\"handle\"></span></div>'\n });\n this.toggleEl.addEventListener('click', this.handleToggle);\n\n const innerHTML = `\n <span class=\"vjs-menu-item-text\">Heat Map</span>\n <span class=\"cv-toggle-container\"></span>`;\n\n const el = super.createEl(tagName, {\n className: 'vjs-menu-item cv-cog-menu-item',\n innerHTML\n }, attributes);\n\n /**\n * Indexing into the child this way is only safe to do because\n * we know that the el only has two children\n */\n el.children[1].appendChild(this.toggleEl);\n\n return el;\n }\n}\n\nvideojs.registerComponent('EngagementOverlayMenuItem', EngagementOverlayMenuItem);\n","import React from 'react';\n\nimport { InteractionLabel } from 'libs/shared/components/interactive-questions/InteractionLabel';\nimport { Interactive } from 'libs/shared/interfaces';\n\nconst MAX_INTERACTIONS_TO_SHOW = 3;\n\ninterface TimepointInteractionsProps {\n interactive: Interactive;\n time: number;\n}\n\nexport function TimepointInteractions(props: TimepointInteractionsProps): JSX.Element {\n const timepoint = props.interactive.timepoints.find(t => {\n const timepointTime = t.visibleAt / 1000;\n \n return Math.floor(props.time) === Math.floor(timepointTime)\n || Math.ceil(props.time) === Math.ceil(timepointTime);\n });\n\n if (!timepoint?.interactions?.length)\n return <></>;\n\n const interactions = timepoint.interactions.length > MAX_INTERACTIONS_TO_SHOW ?\n timepoint.interactions.slice(0, MAX_INTERACTIONS_TO_SHOW - 1) :\n timepoint.interactions;\n\n const hiddenInteractions = timepoint.interactions.length - interactions.length;\n\n return (\n <div className='d-flex justify-content-end ms-2'>\n {interactions.map((i, idx) => (\n <InteractionLabel\n key={idx}\n interaction={i}\n showQuestion={false}\n iconClassName='ms-1'\n />\n ))}\n {!!hiddenInteractions &&\n <div\n className={'interaction-type-icon d-flex justify-content-center' +\n ' align-items-center border border-dark text-body ms-1'}\n >\n {`+${hiddenInteractions}`}\n </div>\n }\n </div>\n );\n}\n","import React from 'react';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport Highcharts from 'highcharts';\n\nimport { Interactive } from 'libs/shared/interfaces';\n\nimport { TimepointInteractions } from 'projects/player/plugins/engagement-overlay-plugin/components/timepoint-interactions/timepoint-interactions';\nimport { formatTime } from 'projects/player/utils/formatTime';\n\nexport const STATIC_CHART_OPTIONS: Highcharts.Options = {\n title: {\n text: null\n },\n xAxis: {\n visible: false,\n minPadding: 0,\n maxPadding: 0\n },\n legend: {\n enabled: false\n },\n credits: {\n enabled: false\n },\n defs: {\n gradient: ({\n tagName: 'linearGradient',\n id: 'area-gradient',\n x1: 0,\n y1: 1,\n x2: 0,\n y2: 0,\n children: [\n ({\n tagName: 'stop',\n offset: 0\n } as Highcharts.ASTNode),\n ({\n tagName: 'stop',\n offset: 1\n } as Highcharts.ASTNode)\n ]\n } as Highcharts.ASTNode)\n }\n};\n\nexport function getChartOptions(width: number, height: number): Highcharts.ChartOptions {\n return {\n styledMode: true,\n spacing: [ 15, 0, 0, 0 ],\n width,\n height\n };\n}\n\nexport function getYAxisChartOptions(heatMap: number[]): Highcharts.YAxisOptions {\n const maxValue = Math.max(...heatMap);\n\n return {\n /**\n * To prevent max values from being cut off, we pad them relative to the chart scale.\n */\n max: maxValue * 1.05,\n min: 0,\n minPadding: 0,\n maxPadding: 0,\n allowDecimals: true,\n startOnTick: false,\n endOnTick: false,\n visible: false\n };\n}\n\nexport function getTooltipOptions(interactive?: Interactive): Highcharts.TooltipOptions {\n return {\n formatter: function () {\n const timepointInteractionsHtml = interactive ?\n getTimepointInteractionsHtml(interactive, this.x) :\n '';\n\n return (\n '<div class=\"cv-engagement-tooltip bg-white rounded\">' +\n '<div class=\"d-flex justify-content-between\">' +\n `<strong>${formatTime(this.x)}</strong>` +\n `${timepointInteractionsHtml}` +\n '</div>' +\n '<div class=\"d-flex justify-content-between rounded bg-light cv-view-count-container\">' +\n `<strong>Views</strong> <span class=\"cv-view-count\">${this.y}</span>` +\n '</div>' +\n '</div>'\n );\n },\n positioner: function (\n labelWidth: number,\n labelHeight: number,\n point: Highcharts.TooltipPositionerPointObject\n ) {\n const minX = 0;\n const maxX = this.chart.plotWidth - labelWidth;\n const x = point.plotX - labelWidth / 2;\n \n return {\n // Clamp x between min and max\n x: Math.min(Math.max(x, minX), maxX),\n y: this.chart.plotTop\n };\n },\n useHTML: true,\n padding: 0\n };\n}\n\nexport function getPlotOptions(moveTimepointIndicator: (x: number | null) => void): Highcharts.PlotOptions {\n return {\n area: {\n point: {\n events: {\n mouseOver: function () {\n moveTimepointIndicator(this.x);\n },\n mouseOut: function () {\n moveTimepointIndicator(null);\n }\n }\n }\n },\n series: {\n marker: {\n enabled: false\n }\n }\n };\n}\n\nfunction getTimepointInteractionsHtml(interactive: Interactive, time: number): string {\n return renderToStaticMarkup(\n <TimepointInteractions time={time} interactive={interactive} />\n );\n}\n","import Highcharts from 'highcharts';\nimport videojs, { VideoJsPlayer } from 'video.js';\n\nimport { Interactive } from 'libs/shared/interfaces';\n\nimport {\n getChartOptions,\n getPlotOptions,\n getTooltipOptions,\n getYAxisChartOptions,\n STATIC_CHART_OPTIONS\n} from './engagement-overlay-chart-options';\n\nimport './engagement-overlay.scss';\n\nconst Component = videojs.getComponent('Component');\n\nHighcharts.AST.allowedTags.push('g');\nHighcharts.AST.allowedAttributes.push('viewBox', 'transform');\n\ninterface ChartDimensions {\n width: number;\n height: number;\n}\n\ninterface EngagementOverlayOptions extends videojs.ComponentOptions {\n heatMap: number[];\n interactive?: Interactive;\n onTimepointHover?: (time: number | null) => void;\n}\n\nexport class EngagementOverlay extends Component {\n public options_: EngagementOverlayOptions;\n private chart: Highcharts.Chart;\n\n constructor(player: VideoJsPlayer, options: EngagementOverlayOptions) {\n super(player, options);\n\n this.initialize();\n this.bindListeners();\n }\n\n public initialize(): void {\n this.player().ready(() => this.buildChart());\n }\n\n public buildCSSClass(): string {\n return 'cv-engagement-overlay';\n }\n\n public createEl(tagName?: string, properties?: any, attributes?: any): Element {\n const innerHTML = '<div class=\"cv-engagement-chart\"></div>' +\n '<div class=\"cv-engagement-timepoint-indicator\"></div>';\n\n return super.createEl(tagName, {\n ...properties,\n className: this.buildCSSClass(),\n innerHTML\n }, attributes);\n }\n\n public toggleChart(show: boolean): void {\n if (show)\n this.buildChart();\n else\n this.destroyChart();\n }\n\n private bindListeners(): void {\n this.handleClick = this.handleClick.bind(this);\n this.resizeChart = this.resizeChart.bind(this);\n\n this.player().on('playerresize', this.resizeChart);\n\n this.on(this.el(), 'mouseup', this.handleClick);\n\n this.player().on('dispose', () => {\n this.player().off('playerresize', this.resizeChart);\n\n this.off(this.el(), 'mouseup', this.handleClick);\n });\n }\n\n private handleClick(event: videojs.EventTarget.Event): void {\n if (!videojs.dom.isSingleLeftClick(event))\n return;\n\n if (this.player().paused()) {\n this.player().play();\n return;\n }\n\n this.player().pause();\n }\n\n private buildChart(): void {\n if (this.chart)\n return;\n\n const chartDimensions = this.getChartDimensions();\n\n /**\n * The dimensions calculation relies on the control bar and progress control\n * being visible, so if it isn't, we wait for the play event.\n */\n if (!chartDimensions) {\n this.player().one('play', () => this.buildChart());\n return;\n }\n\n const container: HTMLElement = this.el().querySelector('.cv-engagement-chart');\n\n this.chart = Highcharts.chart(container, this.getHighchartOptions(chartDimensions));\n }\n\n private resizeChart(): void {\n const chartDimensions = this.getChartDimensions();\n\n if (!this.chart || !chartDimensions)\n return;\n\n this.chart.setSize(chartDimensions.width, chartDimensions.height);\n }\n\n private destroyChart(): void {\n this.chart?.destroy();\n this.chart = null;\n }\n\n private getChartDimensions(): ChartDimensions {\n const collapserator = this.player().getChild('collapserator');\n const collapseratorHeight = collapserator?.currentHeight();\n\n const width = this.el().clientWidth;\n\n if (!collapseratorHeight || !width)\n return null;\n\n const { height } = this.player().currentDimensions();\n \n return {\n width,\n height: height - collapseratorHeight\n };\n }\n\n private getHighchartOptions({ width, height }: ChartDimensions): Highcharts.Options {\n return {\n ...STATIC_CHART_OPTIONS,\n chart: getChartOptions(width, height),\n yAxis: getYAxisChartOptions(this.options_.heatMap),\n tooltip: getTooltipOptions(this.options_.interactive),\n plotOptions: getPlotOptions(this.moveTimepointIndicator.bind(this)),\n series: [{\n type: 'area',\n data: this.options_.heatMap\n }]\n };\n }\n\n private moveTimepointIndicator(x: number | null): void {\n if (this.options_.onTimepointHover)\n this.options_.onTimepointHover(x);\n\n const indicator: HTMLDivElement = this.el().querySelector('.cv-engagement-timepoint-indicator');\n\n if (x === null) {\n videojs.dom.removeClass(indicator, 'cv-engagement-timepoint-indicator-visible');\n return;\n }\n\n videojs.dom.addClass(indicator, 'cv-engagement-timepoint-indicator-visible');\n indicator.style.left = `${x / this.options_.heatMap.length * 100}%`;\n }\n}\n\nvideojs.registerComponent('EngagementOverlay', EngagementOverlay);\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport { Interactive } from 'libs/shared/interfaces';\n\nimport { CogButton } from 'projects/player/components/cog-button/cog-button';\nimport { EngagementOverlay } from 'projects/player/plugins/engagement-overlay-plugin/components/engagement-overlay/engagement-overlay';\nimport { EngagementOverlayMenuItem } from 'projects/player/plugins/engagement-overlay-plugin/components/engagement-overlay-menu-item/engagement-overlay-menu-item';\n\nimport 'projects/player/plugins/engagement-overlay-plugin/components/engagement-overlay/engagement-overlay';\n\nconst Plugin = videojs.getPlugin('plugin');\n\ninterface EngagementOverlayPluginOptions {\n heatMap: number[];\n interactive?: Interactive;\n onTimepointHover?: (time: number | null) => void;\n}\n\nclass EngagementOverlayPlugin extends Plugin {\n private options: EngagementOverlayPluginOptions;\n\n constructor(player: VideoJsPlayer, options: EngagementOverlayPluginOptions) {\n super(player, options);\n\n this.options = options;\n\n player.ready(() => {\n this.initialize();\n });\n }\n \n private initialize(): void {\n if (!this.hasHeatMapData())\n return;\n\n this.player.addChild('engagementOverlay', {\n heatMap: this.options.heatMap,\n interactive: this.options.interactive,\n onTimepointHover: this.options.onTimepointHover\n });\n\n /**\n * Check additionalItemOrder in cog-button.ts if you need to change the order. - Sha\n */\n const cogButton = this.player.getChild('collapserator')?.getChild('cogButton') as CogButton;\n cogButton.addItem({\n ctor: EngagementOverlayMenuItem,\n name: 'EngagementOverlayMenuItem',\n options: { overlayVisible: true }\n });\n }\n\n public toggleOverlay(show: boolean): void {\n const engagementOverlay = this.player.getChild('engagementOverlay') as EngagementOverlay;\n engagementOverlay?.toggleChart(show);\n }\n\n private hasHeatMapData(): boolean {\n return this.options.heatMap?.reduce((acc, val) => acc + val, 0) > 0;\n }\n}\n\nvideojs.registerPlugin('engagementOverlayPlugin', EngagementOverlayPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n engagementOverlayPlugin(options?: EngagementOverlayPluginOptions): EngagementOverlayPlugin;\n }\n}\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport { Interactive } from 'libs/shared/interfaces';\n\nimport { InteractiveBarItems } from 'projects/player/plugins/interactive-plugin/components/seek-bar/interactive-bar-items';\nimport { TrackHelper } from 'projects/player/utils/track-helper';\n\nimport './interactive-plugin-styles.scss';\n\nconst Plugin = videojs.getPlugin('plugin');\n\ninterface InteractiveSeekBarPluginOptions {\n interactive: Interactive;\n}\n\n/**\n * This plugin will just render the interactive seek bar (i.e. just the interaction markers).\n * The user won't be able to interact with any of the interactions.\n * Currently this is just used in reports-player\n */\nclass InteractiveSeekBarPlugin extends Plugin {\n private options: InteractiveSeekBarPluginOptions;\n\n constructor(player: VideoJsPlayer, options: InteractiveSeekBarPluginOptions) {\n super(player);\n\n this.options = options;\n\n this.player.one('loadedmetadata', () => this.player.ready(this.initialize.bind(this)));\n }\n\n private initialize(): void {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n TrackHelper.useMetadataTrack(this.player, 'interactive', this.onTrackLoaded.bind(this));\n\n this.player.addClass('cv-interactive-plugin');\n }\n\n private onTrackLoaded(track: TextTrack): void {\n this.addChildren(track);\n }\n\n private addChildren(track: TextTrack): void {\n const seekBar = this.player.controlBar.getChild('progressControl').getChild('SeekBar');\n\n seekBar.addChild(new InteractiveBarItems(this.player, {\n interactive: this.options.interactive,\n track\n }));\n }\n}\n\nvideojs.registerPlugin('interactiveSeekBarPlugin', InteractiveSeekBarPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n interactiveSeekBarPlugin(options?: InteractiveSeekBarPluginOptions): InteractiveSeekBarPlugin;\n }\n}\n","import { Interactive } from 'libs/shared/interfaces';\n\nimport { ClipData } from 'projects/player/interfaces/models/ClipData';\nimport { PlaybackObject } from 'projects/player/interfaces/models/PlaybackObject';\nimport { BasePlayer, BasePlayerOptions } from 'projects/player/players/base-player';\nimport { AnalyticsPlayerType } from 'projects/player/services/analytics-service';\nimport { InteractiveTrackHelper } from 'projects/player/utils/interactive-track-helper';\n\nimport './reports-player.scss';\n\nimport 'projects/player/plugins/engagement-overlay-plugin/engagement-overlay-plugin';\nimport 'projects/player/plugins/clip-plugin/clip-plugin';\nimport 'projects/player/plugins/interactive-plugin/interactive-seek-bar-plugin';\nimport 'projects/player/plugins/old-version-refresh-plugin/old-version-refresh-plugin';\n\nexport interface ReportsPlayerOptions extends BasePlayerOptions {\n heatMap: number[];\n onTimepointHover?: (time: number | null) => void;\n}\n\nexport class ReportsPlayer extends BasePlayer {\n declare protected options: ReportsPlayerOptions;\n private track: TextTrack;\n\n constructor(id: string | Element, options: ReportsPlayerOptions) {\n super(id, options);\n }\n\n protected getPlayerClassName(): string {\n return 'cv-reports-player';\n }\n\n protected getAnalyticsPlayerType(): AnalyticsPlayerType {\n return 'reports-player';\n }\n\n protected async additionalSetup(playbackObject: PlaybackObject): Promise<void> {\n super.additionalSetup(playbackObject);\n\n this.setupEngagementOverlayPlugin(playbackObject);\n this.setupUpClipPlugin(playbackObject);\n this.setupInteractiveSeekBarPlugin(playbackObject);\n }\n\n private setupEngagementOverlayPlugin(playbackObject: PlaybackObject): void {\n this.player.engagementOverlayPlugin({\n heatMap: this.options.heatMap,\n interactive: playbackObject.additionalData?.interactive as Interactive,\n onTimepointHover: this.options.onTimepointHover\n });\n }\n\n private setupUpClipPlugin(playbackObject: PlaybackObject): void {\n const isClip = playbackObject.mediaType === 'MasterClip';\n const isInteractive = playbackObject.mediaType === 'MasterInteractive';\n\n if (!isClip && !isInteractive)\n return;\n\n let clipData: ClipData;\n if (isClip)\n clipData = playbackObject.additionalData;\n \n if (isInteractive) {\n clipData = playbackObject.additionalData?.clipData;\n\n // Not all interactives will have clip data\n if (!clipData)\n return;\n }\n\n if (!clipData)\n throw Error('Invalid clip data');\n\n this.player.clipPlugin({\n startTime: clipData.startTime,\n endTime: clipData.endTime\n });\n }\n\n private setupInteractiveSeekBarPlugin(playbackObject: PlaybackObject): void {\n const interactive = playbackObject.additionalData?.interactive as Interactive;\n\n if (!playbackObject.additionalData?.interactive)\n return;\n\n this.track = InteractiveTrackHelper.getInteractiveTrack(this.player, playbackObject);\n\n this.player.interactiveSeekBarPlugin({ interactive });\n }\n\n protected getSeekBarOptions(): any {\n return {\n ignoreChapters: true\n };\n }\n}\n","import React from 'react';\n\nimport { ReportsPlayer, ReportsPlayerOptions } from 'projects/player/players/reports/reports-player';\n\nexport function ClickViewReportsPlayer(props: ReportsPlayerOptions): React.ReactElement {\n const ref = React.useRef(null);\n const playerRef = React.useRef<ReportsPlayer>(null);\n\n React.useEffect(() => {\n playerRef.current = new ReportsPlayer(ref.current, props);\n }, []);\n\n return (\n <div ref={ref}></div>\n );\n}\n",":local {\n .playerContainer {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n }\n\n .playerPlaceholder {\n width: 100%;\n padding-bottom: 56.25%;\n }\n\n .heatMap {\n height: 1rem;\n }\n\n .heatMapTimepointIndicator {\n border-left: 0.125rem dashed $info;\n margin-left: -0.0625rem;\n position: absolute;\n top: 0;\n bottom: 0;\n opacity: 0;\n visibility: hidden;\n\n &.heatMapTimepointIndicatorVisible {\n opacity: 1;\n visibility: visible;\n }\n }\n\n .partialLoadingContainer {\n height: 24.015625rem;\n }\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EngagementHeatMap, EngagementHeatMapLegend } from 'libs/shared/apps/analytics/components/engagement-heat-map/EngagementHeatMap';\nimport { getFullHeatMap } from 'libs/shared/apps/analytics/utils/EngagementUtils';\nimport { Engagement } from 'libs/shared/interfaces';\n\nimport { ClickViewReportsPlayer } from 'projects/player/react/ReportsPlayer';\n\nimport styles from './video-engagement-overlay.module.scss';\n\nconst namespace = 'shared.videoEngagementOverlay';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface VideoEngagementOverlayProps {\n engagement: Engagement;\n viewKey: string;\n imageCdnUrl: string;\n playerApiUrl: string;\n}\n\nexport function VideoEngagementOverlay(props: VideoEngagementOverlayProps): JSX.Element {\n const timepointIndicatorRef = React.useRef<HTMLDivElement>(null);\n\n const heatMap = getFullHeatMap(props.engagement);\n\n function setHoverTimepoint(time: number | null): void {\n const el = timepointIndicatorRef.current;\n\n if (!el)\n return;\n\n if (time === null) {\n el.classList.remove(styles.heatMapTimepointIndicatorVisible);\n return;\n }\n\n el.classList.add(styles.heatMapTimepointIndicatorVisible);\n el.style.left = `${time / heatMap.length * 100}%`;\n }\n\n return (\n <div className='bg-white border rounded overflow-hidden h-100'>\n <div className='position-relative'>\n {/**\n * The below div is an empty 16:9 rectangle which maintains this component's\n * height while the player is loading.\n */\n }\n <div className={styles.playerPlaceholder} />\n <div className={styles.playerContainer}>\n <ClickViewReportsPlayer\n viewKey={props.viewKey}\n playerApi={new URL(props.playerApiUrl)}\n hotkeyElQuerySelector='body'\n heatMap={heatMap}\n onTimepointHover={setHoverTimepoint}\n aspectRatio='16:9'\n />\n </div>\n </div>\n <div className='p-3'>\n <div className='position-relative'>\n <EngagementHeatMap\n engagement={props.engagement}\n className={styles.heatMap}\n />\n <div ref={timepointIndicatorRef} className={styles.heatMapTimepointIndicator} />\n </div>\n <div className='d-flex justify-content-between mt-2'>\n <strong>\n {getPhrase('heatmap')}\n </strong>\n <div className='w-33'>\n <EngagementHeatMapLegend />\n </div>\n </div>\n </div>\n </div>\n );\n}\n",":local {\n .videoContainer {\n width: 44%;\n }\n}","import React from 'react';\n\nimport { EngagementTable } from 'libs/shared/apps/analytics/components/engagement-table/EngagementTable';\nimport { InsightAmountWatched } from 'libs/shared/apps/analytics/components/insights/amount-watched/InsightAmountWatched';\nimport { InsightTotalViews } from 'libs/shared/apps/analytics/components/insights/total-views/InsightTotalViews';\nimport { GroupedAnalyticsCount } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { VideoViewEventResponse } from 'libs/shared/apps/analytics/interfaces/VideoViewEvent';\nimport { Config, Engagement, PlayerViewKey } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport { PartialInsightsHeatmap } from 'apps/my-shares/components/insights-heatmap/partial-loading/PartialInsightsHeatmap';\nimport { VideoEngagementOverlay } from 'apps/my-shares/components/video-engagement-overlay/VideoEngagementOverlay';\n\nimport styles from './insights-heatmap.module.scss';\n\ninterface InsightsHeatmapProps {\n hasDataLoaded: boolean;\n tableDataLoaded: boolean;\n yearGroups: GroupedAnalyticsCount[];\n aggregateEngagement: Engagement;\n individualEngagement: Engagement[];\n viewKey: PlayerViewKey;\n config: Config;\n users: AnonUser[];\n classroomStudents?: AnonUser[];\n anonymiseUsers: boolean;\n hideStaffResults: boolean;\n}\n\nexport function InsightsHeatmap(props: InsightsHeatmapProps) {\n return (\n <>\n {!props.hasDataLoaded && <PartialInsightsHeatmap />}\n\n <div className='row g-3 mb-3'>\n {props.hasDataLoaded &&\n <>\n <div className='col'>\n <InsightTotalViews\n events={{ yearGroupCount: props.yearGroups } as VideoViewEventResponse}\n emptyStateImage={ImageUrls.EmptyStates.MY_VIDEOS}\n hideStaffResults={props.hideStaffResults}\n />\n </div>\n <div className='col'>\n <InsightAmountWatched engagement={props.individualEngagement} />\n </div>\n <div className={styles.videoContainer}>\n <VideoEngagementOverlay\n engagement={props.aggregateEngagement}\n viewKey={props.viewKey.viewKey}\n playerApiUrl={props.config.playerApiUrl}\n imageCdnUrl={props.config.imageCdnUrl}\n />\n </div>\n </>\n }\n\n {props.tableDataLoaded &&\n <div className='col-12'>\n <EngagementTable\n engagement={props.individualEngagement}\n users={props.users}\n imageCdnUrl={props.config?.imageCdnUrl}\n anonymiseUsers={props.anonymiseUsers}\n classroomStudents={props.classroomStudents}\n border\n enableSort\n showSeparateNameColumns\n />\n </div>\n }\n </div>\n </>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import"./DAXXjFlN.chunk.js";import{t as e}from"./DMnm3Ewv.chunk.js";import{n as t}from"./B785hxeE.chunk.js";import{t as n}from"./C2w0pmFW.chunk.js";import{t as r}from"./wrLrTezN.chunk.js";import{u as i}from"./BX0wDJmp.chunk.js";import{y as a}from"./NlCAcBdo.chunk.js";import{t as o}from"./xwiwWcv12.chunk.js";import{t as s}from"./DbSUQ2A12.chunk.js";import{t as c}from"./BC8PeYqm.chunk.js";import{t as l}from"./CqrjHjAN.chunk.js";import{t as u}from"./D_gWf2lC.chunk.js";import{n as d,t as f}from"./C6-aC3vu.chunk.js";import{n as p,t as m}from"./BGhJ8TEx.chunk.js";import{t as h}from"./7LGxCHGV.chunk.js";import{t as g}from"./Bbv3vbm7.chunk.js";import{t as _}from"./B3gsVN-_.chunk.js";import{r as v}from"./Bw2cauzs2.chunk.js";import{t as y}from"./CgW21-1J.chunk.js";import{n as b}from"./ChnNWPOK2.chunk.js";import{t as x}from"./C9XBZFiR.chunk.js";import{t as S}from"./BnuuRu_J2.chunk.js";import{t as C}from"./CC5Dr9aG.chunk.js";import{t as w}from"./BYaCUOEW2.chunk.js";import{t as T}from"./DNuJUXpr2.chunk.js";import{n as E,r as D,t as O}from"./CrGWZr2R2.chunk.js";n();var k=r(),A={notFound:y,forbidden:{privacy:g}};function j(e){return e?._parentClip||e?._parentVideo}function M(n){let{hasPermissions:r}=_(),g=i(u.config()),y=i(l.token()),M=i(l.currentUser()),N=i(M.data?.isAuthenticated&&o.yearGroups(M.data.customerId)),P=i(c.interactiveMetadata(n.id)),F=D(),I=i(P.statusCode===e.Forbidden&&c.interactiveMetadata(n.id,s.StripMetadata)),L=i(F&&P.data&&c.interactive(P.data.interactiveId)),R=i(F&&P.data&&c.videoInteractives(j(P.data).id)),z=w(),B=i(m.createViewKey(n.id,p.MasterObject)),V=v({video:P.data,context:n.queryParams.context,contextId:n.queryParams.contextId,moviesAndTv:n.queryParams.mtv,currentUser:M.data}),{commonVideoProps:H,hasCommonVideoPropsCompleted:U}=S({locationContext:F?a.PreviewInteractive:a.PlayInteractive,mtv:n.queryParams.mtv});b({id:n.id,app:`interactives`}),x(P,A,{forbidden:!0}),h(I),f(d.getInteractiveMetadata({content:P.data})),T(V.videos??[]);let W=C({name:P.data?.name});return P.data&&g.hasCompleted&&M.hasCompleted&&(!F||L.hasCompleted)&&B.hasCompleted&&y.hasCompleted&&U?F?(0,k.jsx)(O,{currentUser:M.data,queryParams:n.queryParams,interactive:P.data,interactives:R.data?.data,isPreviewPreventScrubbingEnabled:L.data.preventScrubbing,audiences:z.data,relatedVideos:V,canManageVideoAccess:r(t.ManageVideoAccess),breadcrumbs:W,token:y.data,commonVideoProps:H}):(0,k.jsx)(E,{interactive:P.data,currentUser:M.data,config:g.data,yearGroups:N.data,audiences:z.data,queryParams:n.queryParams,viewKey:B.data,relatedVideos:V,startTime:n.queryParams?.t??n.queryParams?.startTime,token:y.data,commonVideoProps:H}):(0,k.jsx)(k.Fragment,{})}export{M as InteractiveView};
2
- //# sourceMappingURL=VDqAyMTi2.chunk.js.map
1
+ import"./DAXXjFlN.chunk.js";import{t as e}from"./DMnm3Ewv.chunk.js";import{n as t}from"./B785hxeE.chunk.js";import{t as n}from"./C2w0pmFW.chunk.js";import{t as r}from"./wrLrTezN.chunk.js";import{u as i}from"./BX0wDJmp.chunk.js";import{y as a}from"./NlCAcBdo.chunk.js";import{t as o}from"./xwiwWcv12.chunk.js";import{t as s}from"./DbSUQ2A12.chunk.js";import{t as c}from"./BC8PeYqm.chunk.js";import{t as l}from"./CqrjHjAN.chunk.js";import{t as u}from"./D_gWf2lC.chunk.js";import{n as d,t as f}from"./C6-aC3vu.chunk.js";import{n as p,t as m}from"./BGhJ8TEx.chunk.js";import{t as h}from"./7LGxCHGV.chunk.js";import{t as g}from"./Bbv3vbm7.chunk.js";import{t as _}from"./B3gsVN-_.chunk.js";import{r as v}from"./Cm6SLr7W2.chunk.js";import{t as y}from"./CgW21-1J.chunk.js";import{n as b}from"./ChnNWPOK2.chunk.js";import{t as x}from"./C9XBZFiR.chunk.js";import{t as S}from"./BnuuRu_J2.chunk.js";import{t as C}from"./CC5Dr9aG.chunk.js";import{t as w}from"./BYaCUOEW2.chunk.js";import{t as T}from"./DNuJUXpr2.chunk.js";import{n as E,r as D,t as O}from"./DRHbASmP2.chunk.js";n();var k=r(),A={notFound:y,forbidden:{privacy:g}};function j(e){return e?._parentClip||e?._parentVideo}function M(n){let{hasPermissions:r}=_(),g=i(u.config()),y=i(l.token()),M=i(l.currentUser()),N=i(M.data?.isAuthenticated&&o.yearGroups(M.data.customerId)),P=i(c.interactiveMetadata(n.id)),F=D(),I=i(P.statusCode===e.Forbidden&&c.interactiveMetadata(n.id,s.StripMetadata)),L=i(F&&P.data&&c.interactive(P.data.interactiveId)),R=i(F&&P.data&&c.videoInteractives(j(P.data).id)),z=w(),B=i(m.createViewKey(n.id,p.MasterObject)),V=v({video:P.data,context:n.queryParams.context,contextId:n.queryParams.contextId,moviesAndTv:n.queryParams.mtv,currentUser:M.data}),{commonVideoProps:H,hasCommonVideoPropsCompleted:U}=S({locationContext:F?a.PreviewInteractive:a.PlayInteractive,mtv:n.queryParams.mtv});b({id:n.id,app:`interactives`}),x(P,A,{forbidden:!0}),h(I),f(d.getInteractiveMetadata({content:P.data})),T(V.videos??[]);let W=C({name:P.data?.name});return P.data&&g.hasCompleted&&M.hasCompleted&&(!F||L.hasCompleted)&&B.hasCompleted&&y.hasCompleted&&U?F?(0,k.jsx)(O,{currentUser:M.data,queryParams:n.queryParams,interactive:P.data,interactives:R.data?.data,isPreviewPreventScrubbingEnabled:L.data.preventScrubbing,audiences:z.data,relatedVideos:V,canManageVideoAccess:r(t.ManageVideoAccess),breadcrumbs:W,token:y.data,commonVideoProps:H}):(0,k.jsx)(E,{interactive:P.data,currentUser:M.data,config:g.data,yearGroups:N.data,audiences:z.data,queryParams:n.queryParams,viewKey:B.data,relatedVideos:V,startTime:n.queryParams?.t??n.queryParams?.startTime,token:y.data,commonVideoProps:H}):(0,k.jsx)(k.Fragment,{})}export{M as InteractiveView};
2
+ //# sourceMappingURL=ClMXRZea2.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"VDqAyMTi2.chunk.js","names":[],"sources":["../../src/apps/interactives/views/interactive-view/InteractiveView.tsx"],"sourcesContent":["import React from 'react';\n\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Flight } from 'libs/common/flight';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { MediaIdType } from 'libs/shared/enums/MediaIdType';\nimport { PermissionFilterOption } from 'libs/shared/enums/PermissionFilterOption';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { VideoNotFoundError } from 'libs/shared/errors/videos/video-not-found/VideoNotFoundError';\nimport { VideoPrivateError } from 'libs/shared/errors/videos/video-private/VideoPrivateError';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { PlayerRequests } from 'libs/shared/flight-requests/PlayerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useBreadcrumbs } from 'libs/shared/hooks/useBreadcrumbs';\nimport { useCannotConsumeError } from 'libs/shared/hooks/useCannotConsumeError';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Clip, Config, CurrentUser, Interactive, InteractiveCollection, InteractiveMetadata, PlayerViewKey, Video, YearGroup } from 'libs/shared/interfaces';\nimport { AuthToken } from 'libs/shared/interfaces/models/AuthToken';\nimport { PlayViewQueryParams } from 'libs/shared/interfaces/query-params/PlayViewQueryParams';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { useCommonVideoProps } from 'shared/hooks/useCommonVideoProps';\nimport { useDeepLinks } from 'shared/hooks/useDeepLinks';\nimport { useGetRelatedVideos } from 'shared/hooks/useGetRelatedVideos';\nimport { usePresentationAudiences } from 'shared/hooks/usePresentationAudiences';\nimport { useShouldPreviewInteractive } from 'shared/hooks/useShouldPreviewInteractive';\nimport { useVideoMixin } from 'shared/hooks/useVideoMixin';\n\nimport { PlayInteractive } from 'apps/interactives/components/play-interactive/PlayInteractive';\nimport { PreviewInteractive } from 'apps/interactives/components/preview-interactive/PreviewInteractive';\n\nconst videoErrors = {\n notFound: VideoNotFoundError,\n forbidden: {\n privacy: VideoPrivateError\n }\n};\n\nfunction getSourceVideo(interactive?: InteractiveMetadata): Clip | Video {\n return interactive?._parentClip || interactive?._parentVideo;\n}\ninterface InteractiveViewProps {\n id: string;\n queryParams: PlayViewQueryParams;\n}\n\nexport function InteractiveView(props: InteractiveViewProps): JSX.Element {\n const { hasPermissions } = usePermissions();\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const token = Flight.useBasicFetch<AuthToken>(UserRequests.token());\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n InteractiveRequests.interactiveMetadata(props.id)\n );\n const shouldPreviewInteractive = useShouldPreviewInteractive();\n const strippedInteractiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n interactiveMetadata.statusCode === HttpStatus.Forbidden &&\n InteractiveRequests.interactiveMetadata(props.id, PermissionFilterOption.StripMetadata)\n );\n const interactive = Flight.useBasicFetch<Interactive>(\n shouldPreviewInteractive && interactiveMetadata.data &&\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId)\n );\n const interactives = Flight.useBasicFetch<InteractiveCollection>(\n shouldPreviewInteractive && interactiveMetadata.data &&\n InteractiveRequests.videoInteractives(getSourceVideo(interactiveMetadata.data).id)\n );\n \n const audiences = usePresentationAudiences();\n const viewKey = Flight.useBasicFetch<PlayerViewKey>(PlayerRequests.createViewKey(props.id, MediaIdType.MasterObject));\n\n const relatedVideos = useGetRelatedVideos({\n video: interactiveMetadata.data,\n context: props.queryParams.context,\n contextId: props.queryParams.contextId,\n moviesAndTv: props.queryParams.mtv,\n currentUser: currentUser.data\n });\n\n const locationContext = shouldPreviewInteractive ?\n LocationContext.PreviewInteractive :\n LocationContext.PlayInteractive;\n \n const {\n commonVideoProps,\n hasCommonVideoPropsCompleted\n } = useCommonVideoProps({ locationContext, mtv: props.queryParams.mtv });\n\n useDeepLinks({ id: props.id, app: 'interactives' });\n\n useHandleObjectError(interactiveMetadata, videoErrors, { forbidden: true });\n useCannotConsumeError(strippedInteractiveMetadata);\n useSetPageMetadata(PageMetadataHelper.getInteractiveMetadata({ content: interactiveMetadata.data }));\n\n useVideoMixin(relatedVideos.videos ?? []);\n\n const breadcrumbs = useBreadcrumbs({ name: interactiveMetadata.data?.name });\n\n const hasLoaded = (\n interactiveMetadata.data &&\n config.hasCompleted &&\n currentUser.hasCompleted &&\n (!shouldPreviewInteractive || interactive.hasCompleted) &&\n viewKey.hasCompleted &&\n token.hasCompleted &&\n hasCommonVideoPropsCompleted\n );\n\n if (!hasLoaded)\n return <></>;\n\n if (shouldPreviewInteractive) {\n return (\n <PreviewInteractive\n currentUser={currentUser.data}\n queryParams={props.queryParams}\n interactive={interactiveMetadata.data}\n interactives={interactives.data?.data}\n isPreviewPreventScrubbingEnabled={interactive.data.preventScrubbing}\n audiences={audiences.data}\n relatedVideos={relatedVideos}\n canManageVideoAccess={hasPermissions(PermissionName.ManageVideoAccess)}\n breadcrumbs={breadcrumbs}\n token={token.data}\n commonVideoProps={commonVideoProps}\n />\n );\n }\n\n return (\n <PlayInteractive\n interactive={interactiveMetadata.data}\n currentUser={currentUser.data}\n config={config.data}\n yearGroups={yearGroups.data}\n audiences={audiences.data}\n queryParams={props.queryParams}\n viewKey={viewKey.data}\n relatedVideos={relatedVideos}\n startTime={props.queryParams?.t ?? props.queryParams?.startTime}\n token={token.data}\n commonVideoProps={commonVideoProps}\n />\n );\n}\n"],"mappings":"sjCAqCM,EAAc,CAClB,SAAU,EACV,UAAW,CACT,QAAS,CACX,CACF,EAEA,SAAS,EAAe,EAAiD,CACvE,OAAO,GAAa,aAAe,GAAa,YAClD,CAMA,SAAgB,EAAgB,EAA0C,CACxE,GAAM,CAAE,kBAAmB,EAAe,EAEpC,EAAS,EAA6B,EAAe,OAAO,CAAC,EAC7D,EAAQ,EAAgC,EAAa,MAAM,CAAC,EAC5D,EAAc,EAAkC,EAAa,YAAY,CAAC,EAC1E,EAAa,EACjB,EAAY,MAAM,iBAAmB,EAAiB,WAAW,EAAY,KAAK,UAAU,CAC9F,EAEM,EAAsB,EAC1B,EAAoB,oBAAoB,EAAM,EAAE,CAClD,EACM,EAA2B,EAA4B,EACvD,EAA8B,EAClC,EAAoB,aAAe,EAAW,WAC5C,EAAoB,oBAAoB,EAAM,GAAI,EAAuB,aAAa,CAC1F,EACM,EAAc,EAClB,GAA4B,EAAoB,MAChD,EAAoB,YAAY,EAAoB,KAAK,aAAa,CACxE,EACM,EAAe,EACnB,GAA4B,EAAoB,MAChD,EAAoB,kBAAkB,EAAe,EAAoB,IAAI,CAAC,CAAC,EAAE,CACnF,EAEM,EAAY,EAAyB,EACrC,EAAU,EAAoC,EAAe,cAAc,EAAM,GAAI,EAAY,YAAY,CAAC,EAE9G,EAAgB,EAAoB,CACxC,MAAO,EAAoB,KAC3B,QAAS,EAAM,YAAY,QAC3B,UAAW,EAAM,YAAY,UAC7B,YAAa,EAAM,YAAY,IAC/B,YAAa,EAAY,IAC3B,CAAC,EAMK,CACJ,mBACA,gCACE,EAAoB,CAAE,gBAPF,EACtB,EAAgB,mBAChB,EAAgB,gBAKyB,IAAK,EAAM,YAAY,GAAI,CAAC,EAEvE,EAAa,CAAE,GAAI,EAAM,GAAI,IAAK,cAAe,CAAC,EAElD,EAAqB,EAAqB,EAAa,CAAE,UAAW,EAAK,CAAC,EAC1E,EAAsB,CAA2B,EACjD,EAAmB,EAAmB,uBAAuB,CAAE,QAAS,EAAoB,IAAK,CAAC,CAAC,EAEnG,EAAc,EAAc,QAAU,CAAC,CAAC,EAExC,IAAM,EAAc,EAAe,CAAE,KAAM,EAAoB,MAAM,IAAK,CAAC,EAiC3E,OA9BE,EAAoB,MACpB,EAAO,cACP,EAAY,eACX,CAAC,GAA4B,EAAY,eAC1C,EAAQ,cACR,EAAM,cACN,EAME,GAEA,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,YAAa,EAAY,KACzB,YAAa,EAAM,YACnB,YAAa,EAAoB,KACjC,aAAc,EAAa,MAAM,KACjC,iCAAkC,EAAY,KAAK,iBACnD,UAAW,EAAU,KACN,gBACf,qBAAsB,EAAe,EAAe,iBAAiB,EACxD,cACb,MAAO,EAAM,KACK,kBACnB,CAAA,GAKH,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,YAAa,EAAoB,KACjC,YAAa,EAAY,KACzB,OAAQ,EAAO,KACf,WAAY,EAAW,KACvB,UAAW,EAAU,KACrB,YAAa,EAAM,YACnB,QAAS,EAAQ,KACF,gBACf,UAAW,EAAM,aAAa,GAAK,EAAM,aAAa,UACtD,MAAO,EAAM,KACK,kBACnB,CAAA,GAjCM,EAAA,EAAA,IAAA,CAAA,EAAA,SAAA,CAAI,CAAA,CAmCf"}
1
+ {"version":3,"file":"ClMXRZea2.chunk.js","names":[],"sources":["../../src/apps/interactives/views/interactive-view/InteractiveView.tsx"],"sourcesContent":["import React from 'react';\n\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Flight } from 'libs/common/flight';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { MediaIdType } from 'libs/shared/enums/MediaIdType';\nimport { PermissionFilterOption } from 'libs/shared/enums/PermissionFilterOption';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { VideoNotFoundError } from 'libs/shared/errors/videos/video-not-found/VideoNotFoundError';\nimport { VideoPrivateError } from 'libs/shared/errors/videos/video-private/VideoPrivateError';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { PlayerRequests } from 'libs/shared/flight-requests/PlayerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useBreadcrumbs } from 'libs/shared/hooks/useBreadcrumbs';\nimport { useCannotConsumeError } from 'libs/shared/hooks/useCannotConsumeError';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Clip, Config, CurrentUser, Interactive, InteractiveCollection, InteractiveMetadata, PlayerViewKey, Video, YearGroup } from 'libs/shared/interfaces';\nimport { AuthToken } from 'libs/shared/interfaces/models/AuthToken';\nimport { PlayViewQueryParams } from 'libs/shared/interfaces/query-params/PlayViewQueryParams';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { useCommonVideoProps } from 'shared/hooks/useCommonVideoProps';\nimport { useDeepLinks } from 'shared/hooks/useDeepLinks';\nimport { useGetRelatedVideos } from 'shared/hooks/useGetRelatedVideos';\nimport { usePresentationAudiences } from 'shared/hooks/usePresentationAudiences';\nimport { useShouldPreviewInteractive } from 'shared/hooks/useShouldPreviewInteractive';\nimport { useVideoMixin } from 'shared/hooks/useVideoMixin';\n\nimport { PlayInteractive } from 'apps/interactives/components/play-interactive/PlayInteractive';\nimport { PreviewInteractive } from 'apps/interactives/components/preview-interactive/PreviewInteractive';\n\nconst videoErrors = {\n notFound: VideoNotFoundError,\n forbidden: {\n privacy: VideoPrivateError\n }\n};\n\nfunction getSourceVideo(interactive?: InteractiveMetadata): Clip | Video {\n return interactive?._parentClip || interactive?._parentVideo;\n}\ninterface InteractiveViewProps {\n id: string;\n queryParams: PlayViewQueryParams;\n}\n\nexport function InteractiveView(props: InteractiveViewProps): JSX.Element {\n const { hasPermissions } = usePermissions();\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const token = Flight.useBasicFetch<AuthToken>(UserRequests.token());\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n InteractiveRequests.interactiveMetadata(props.id)\n );\n const shouldPreviewInteractive = useShouldPreviewInteractive();\n const strippedInteractiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n interactiveMetadata.statusCode === HttpStatus.Forbidden &&\n InteractiveRequests.interactiveMetadata(props.id, PermissionFilterOption.StripMetadata)\n );\n const interactive = Flight.useBasicFetch<Interactive>(\n shouldPreviewInteractive && interactiveMetadata.data &&\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId)\n );\n const interactives = Flight.useBasicFetch<InteractiveCollection>(\n shouldPreviewInteractive && interactiveMetadata.data &&\n InteractiveRequests.videoInteractives(getSourceVideo(interactiveMetadata.data).id)\n );\n \n const audiences = usePresentationAudiences();\n const viewKey = Flight.useBasicFetch<PlayerViewKey>(PlayerRequests.createViewKey(props.id, MediaIdType.MasterObject));\n\n const relatedVideos = useGetRelatedVideos({\n video: interactiveMetadata.data,\n context: props.queryParams.context,\n contextId: props.queryParams.contextId,\n moviesAndTv: props.queryParams.mtv,\n currentUser: currentUser.data\n });\n\n const locationContext = shouldPreviewInteractive ?\n LocationContext.PreviewInteractive :\n LocationContext.PlayInteractive;\n \n const {\n commonVideoProps,\n hasCommonVideoPropsCompleted\n } = useCommonVideoProps({ locationContext, mtv: props.queryParams.mtv });\n\n useDeepLinks({ id: props.id, app: 'interactives' });\n\n useHandleObjectError(interactiveMetadata, videoErrors, { forbidden: true });\n useCannotConsumeError(strippedInteractiveMetadata);\n useSetPageMetadata(PageMetadataHelper.getInteractiveMetadata({ content: interactiveMetadata.data }));\n\n useVideoMixin(relatedVideos.videos ?? []);\n\n const breadcrumbs = useBreadcrumbs({ name: interactiveMetadata.data?.name });\n\n const hasLoaded = (\n interactiveMetadata.data &&\n config.hasCompleted &&\n currentUser.hasCompleted &&\n (!shouldPreviewInteractive || interactive.hasCompleted) &&\n viewKey.hasCompleted &&\n token.hasCompleted &&\n hasCommonVideoPropsCompleted\n );\n\n if (!hasLoaded)\n return <></>;\n\n if (shouldPreviewInteractive) {\n return (\n <PreviewInteractive\n currentUser={currentUser.data}\n queryParams={props.queryParams}\n interactive={interactiveMetadata.data}\n interactives={interactives.data?.data}\n isPreviewPreventScrubbingEnabled={interactive.data.preventScrubbing}\n audiences={audiences.data}\n relatedVideos={relatedVideos}\n canManageVideoAccess={hasPermissions(PermissionName.ManageVideoAccess)}\n breadcrumbs={breadcrumbs}\n token={token.data}\n commonVideoProps={commonVideoProps}\n />\n );\n }\n\n return (\n <PlayInteractive\n interactive={interactiveMetadata.data}\n currentUser={currentUser.data}\n config={config.data}\n yearGroups={yearGroups.data}\n audiences={audiences.data}\n queryParams={props.queryParams}\n viewKey={viewKey.data}\n relatedVideos={relatedVideos}\n startTime={props.queryParams?.t ?? props.queryParams?.startTime}\n token={token.data}\n commonVideoProps={commonVideoProps}\n />\n );\n}\n"],"mappings":"sjCAqCM,EAAc,CAClB,SAAU,EACV,UAAW,CACT,QAAS,CACX,CACF,EAEA,SAAS,EAAe,EAAiD,CACvE,OAAO,GAAa,aAAe,GAAa,YAClD,CAMA,SAAgB,EAAgB,EAA0C,CACxE,GAAM,CAAE,kBAAmB,EAAe,EAEpC,EAAS,EAA6B,EAAe,OAAO,CAAC,EAC7D,EAAQ,EAAgC,EAAa,MAAM,CAAC,EAC5D,EAAc,EAAkC,EAAa,YAAY,CAAC,EAC1E,EAAa,EACjB,EAAY,MAAM,iBAAmB,EAAiB,WAAW,EAAY,KAAK,UAAU,CAC9F,EAEM,EAAsB,EAC1B,EAAoB,oBAAoB,EAAM,EAAE,CAClD,EACM,EAA2B,EAA4B,EACvD,EAA8B,EAClC,EAAoB,aAAe,EAAW,WAC5C,EAAoB,oBAAoB,EAAM,GAAI,EAAuB,aAAa,CAC1F,EACM,EAAc,EAClB,GAA4B,EAAoB,MAChD,EAAoB,YAAY,EAAoB,KAAK,aAAa,CACxE,EACM,EAAe,EACnB,GAA4B,EAAoB,MAChD,EAAoB,kBAAkB,EAAe,EAAoB,IAAI,CAAC,CAAC,EAAE,CACnF,EAEM,EAAY,EAAyB,EACrC,EAAU,EAAoC,EAAe,cAAc,EAAM,GAAI,EAAY,YAAY,CAAC,EAE9G,EAAgB,EAAoB,CACxC,MAAO,EAAoB,KAC3B,QAAS,EAAM,YAAY,QAC3B,UAAW,EAAM,YAAY,UAC7B,YAAa,EAAM,YAAY,IAC/B,YAAa,EAAY,IAC3B,CAAC,EAMK,CACJ,mBACA,gCACE,EAAoB,CAAE,gBAPF,EACtB,EAAgB,mBAChB,EAAgB,gBAKyB,IAAK,EAAM,YAAY,GAAI,CAAC,EAEvE,EAAa,CAAE,GAAI,EAAM,GAAI,IAAK,cAAe,CAAC,EAElD,EAAqB,EAAqB,EAAa,CAAE,UAAW,EAAK,CAAC,EAC1E,EAAsB,CAA2B,EACjD,EAAmB,EAAmB,uBAAuB,CAAE,QAAS,EAAoB,IAAK,CAAC,CAAC,EAEnG,EAAc,EAAc,QAAU,CAAC,CAAC,EAExC,IAAM,EAAc,EAAe,CAAE,KAAM,EAAoB,MAAM,IAAK,CAAC,EAiC3E,OA9BE,EAAoB,MACpB,EAAO,cACP,EAAY,eACX,CAAC,GAA4B,EAAY,eAC1C,EAAQ,cACR,EAAM,cACN,EAME,GAEA,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,YAAa,EAAY,KACzB,YAAa,EAAM,YACnB,YAAa,EAAoB,KACjC,aAAc,EAAa,MAAM,KACjC,iCAAkC,EAAY,KAAK,iBACnD,UAAW,EAAU,KACN,gBACf,qBAAsB,EAAe,EAAe,iBAAiB,EACxD,cACb,MAAO,EAAM,KACK,kBACnB,CAAA,GAKH,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,YAAa,EAAoB,KACjC,YAAa,EAAY,KACzB,OAAQ,EAAO,KACf,WAAY,EAAW,KACvB,UAAW,EAAU,KACrB,YAAa,EAAM,YACnB,QAAS,EAAQ,KACF,gBACf,UAAW,EAAM,aAAa,GAAK,EAAM,aAAa,UACtD,MAAO,EAAM,KACK,kBACnB,CAAA,GAjCM,EAAA,EAAA,IAAA,CAAA,EAAA,SAAA,CAAI,CAAA,CAmCf"}
@@ -1,3 +1,3 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["scripts/BpFyfI-52.chunk.js","scripts/DAXXjFlN.chunk.js","scripts/snXCXfT6.chunk.js","scripts/e57H3T-k.chunk.js","scripts/C2w0pmFW.chunk.js","scripts/wrLrTezN.chunk.js","scripts/BVnMI-dl.chunk.js","scripts/CMDJWWg3.chunk.js","scripts/Dr3Lux2e.chunk.js","scripts/wdQVW3s5.chunk.js","scripts/BGGL8m_U.chunk.js","scripts/B_N30_Kb.chunk.js","scripts/rPN1bfU12.chunk.js","scripts/BIzu5ufQ.chunk.js","scripts/BftnFbcr.chunk.js","scripts/DPtsihFR.chunk.js","scripts/DMnm3Ewv.chunk.js","scripts/DFZS3Ffo.chunk.js","scripts/C1SLt-ar.chunk.js","scripts/NlCAcBdo.chunk.js","scripts/BzfCWDOl2.chunk.js","scripts/C5j5LRut2.chunk.js","scripts/Bneb37232.chunk.js","scripts/C1PTqhPY2.chunk.js","scripts/BDwjs8qz2.chunk.js","scripts/B3TDTJSl.chunk.js","scripts/BYSskNbK.chunk.js","scripts/BRcHS92O2.chunk.js","scripts/CaHxeG5Y2.chunk.js","scripts/e_p5kSFR2.chunk.js","scripts/Byg072EM.chunk.js","scripts/DZX1tZ-D2.chunk.js","scripts/QCFxJYkI2.chunk.js","scripts/C0exjRXJ.chunk.js","scripts/Bbp2U9GK.chunk.js","scripts/CYSDN6kj.chunk.js","scripts/CVqxBe99.chunk.js","scripts/CNxJMwxC.chunk.js","scripts/CQRza4Ga.chunk.js","scripts/ByIC_M_8.chunk.js","scripts/Epqx0J1v.chunk.js","scripts/Cy6lZVxk.chunk.js","scripts/BUnh3rN0.chunk.js","scripts/_GCZ-60i.chunk.js","scripts/CduNFx13.chunk.js","css/9awfngRG.chunk.css","css/zFl67mql.chunk.css","scripts/CXnhm0VS2.chunk.js","scripts/CQyJ7YGa.chunk.js","scripts/iZ7EqNA72.chunk.js","scripts/OL3Z6Yp62.chunk.js","scripts/TTO6HcNP.chunk.js","scripts/ClVhjUGI.chunk.js","scripts/11tE0tcu.chunk.js","scripts/E5Pmu4O7.chunk.js","scripts/CKOWgMyj2.chunk.js","scripts/D5yUWL7p2.chunk.js","scripts/BxYKQEUG2.chunk.js","scripts/DaT2nTfp.chunk.js","scripts/CDeqAwMc.chunk.js","scripts/ss6ZpC3s.chunk.js","scripts/GvIHspQt.chunk.js","scripts/FFbkHQcg.chunk.js","scripts/ClpxGEGl.chunk.js","scripts/CvNHBl0q.chunk.js","scripts/C-k6FY-f.chunk.js","scripts/BLm6PYXX.chunk.js","scripts/BM2EJL9g.chunk.js","scripts/DqXpeRGy.chunk.js","scripts/CpFtf-tI2.chunk.js","scripts/CCrnRkGN2.chunk.js","scripts/CXVBjdpb.chunk.js","scripts/BruX4yYB.chunk.js","scripts/gl4k7dtw.chunk.js","scripts/CQ0MgG2c.chunk.js","scripts/Dhx_Wqdc.chunk.js","scripts/6ZXIO06e.chunk.js","scripts/DlEtkSBj2.chunk.js","scripts/CnsLb4V9.chunk.js","scripts/C7HU4huj.chunk.js","scripts/BGswYbRT.chunk.js","scripts/o_O53MMd.chunk.js","scripts/9kSpxveW.chunk.js","scripts/C-THHyTP.chunk.js","scripts/DDJBf9pK2.chunk.js","scripts/DUXPuDp72.chunk.js","scripts/BiqmNDlz2.chunk.js","scripts/Bs2PKr1I2.chunk.js","scripts/BlGyXBAH2.chunk.js","scripts/Dc1hYuQ12.chunk.js","css/CuSUr3Gp.chunk.css","scripts/Dp6QHgBL.chunk.js","scripts/ByszCPst.chunk.js","scripts/B44BW79X2.chunk.js","scripts/BU5CGdBX.chunk.js","css/BPdg7JW4.chunk.css","scripts/Z4RlHaVG.chunk.js","scripts/Dg1mFtY2.chunk.js","scripts/BBEIIgZ6.chunk.js","scripts/CHL4nrKG.chunk.js","scripts/CWMwyVGJ2.chunk.js","scripts/QVHuXdWQ2.chunk.js","scripts/CfTTKh6M.chunk.js","css/D8a4tOyE.chunk.css","scripts/lPQgHDFT.chunk.js","scripts/XBYhZGTN.chunk.js","scripts/CwYrnhdi.chunk.js","scripts/CoUj6M-_.chunk.js","scripts/c7DC36s9.chunk.js","scripts/BVm7hIyo.chunk.js","scripts/FAs_d-DP.chunk.js","scripts/Bzihudtn.chunk.js","scripts/BFXddaSP.chunk.js","scripts/YjWbDb2Y.chunk.js","scripts/BJUbYu222.chunk.js","scripts/BBDxSGT52.chunk.js","scripts/jAbfamoi.chunk.js","scripts/CdYjo8_g2.chunk.js","scripts/CbOJtYeK.chunk.js","scripts/B3fF5gkg.chunk.js","scripts/CvHvrB-t.chunk.js","scripts/B6bB9two.chunk.js","scripts/BbgQJe-T.chunk.js","scripts/5ONJSThP.chunk.js","scripts/xa4cS6Fq.chunk.js","scripts/DGmmTRu72.chunk.js","scripts/B_BV48Fy.chunk.js","scripts/BX0wDJmp.chunk.js","scripts/CqrjHjAN.chunk.js","scripts/Ky1--4w3.chunk.js","scripts/CZgWQFsJ.chunk.js","scripts/CVHQXNzi2.chunk.js","scripts/B9VCwo3g2.chunk.js","scripts/DsBWAM3I2.chunk.js","scripts/_42F7SIA2.chunk.js","scripts/Cr6TXzQQ2.chunk.js","scripts/CjA4Q5pm.chunk.js","scripts/CmcCVXi32.chunk.js","scripts/BcibGFe42.chunk.js","scripts/WvK58Ge12.chunk.js","scripts/DYKH_3un.chunk.js","scripts/CunDpHqX2.chunk.js","css/0ZqRj7up.chunk.css","scripts/B5XaBzZh.chunk.js","scripts/DIENjKhZ.chunk.js","css/D2t3ESms.chunk.css","scripts/B_9JhhOa.chunk.js","scripts/BPavmm8c.chunk.js","css/DnhOr8Y7.chunk.css","scripts/CnnDkGmK.chunk.js","scripts/C3Wa868y.chunk.js","css/DvO5Hl4o.chunk.css","scripts/BYC-9gzd.chunk.js","css/BL4roXAj.chunk.css","scripts/DbQFpTve.chunk.js","scripts/DYN56vJ6.chunk.js","scripts/lhZ5v-iN2.chunk.js","css/BU5l8u5C.chunk.css","scripts/Cyb3BaQc.chunk.js","scripts/D5nbPgu6.chunk.js","css/BBsXDtTT.chunk.css","scripts/DhhslGq9.chunk.js","scripts/DT8J1fGP.chunk.js","scripts/duGVMZTg.chunk.js","scripts/DlAOGdRl.chunk.js","scripts/C3q_xvci.chunk.js","scripts/Dl2HqObu.chunk.js","css/FUAcQhsk.chunk.css","scripts/BScb3_Xj2.chunk.js","scripts/DhwAOJmY2.chunk.js","css/PJ3nCJ4X.chunk.css","scripts/IqGr9V7u2.chunk.js","css/ChavoTyg.chunk.css","scripts/B-W0xPTa2.chunk.js","scripts/B2JUNqnO2.chunk.js","css/C1-mauxJ.chunk.css","scripts/BiKac8UT2.chunk.js","css/J67nkM51.chunk.css","scripts/Br8WvETm.chunk.js","scripts/Dyy-PWHO.chunk.js","scripts/B2INd6bh.chunk.js","scripts/BRrNQXpU2.chunk.js","css/DVhPtkT7.chunk.css","scripts/D3-wtcxf2.chunk.js","scripts/DEZqrbCm.chunk.js","scripts/Chgge8yX2.chunk.js","scripts/BteVhTv7.chunk.js","scripts/De16zmhB.chunk.js","css/BgzV9aK4.chunk.css","scripts/BicQH0Al.chunk.js","css/D5JKYURg.chunk.css","scripts/B1r_1ubU.chunk.js","scripts/C5f0lBCw2.chunk.js","css/DBshtiPC.chunk.css","scripts/29-YRbOp.chunk.js","scripts/CcI-EKxs.chunk.js","scripts/CsF4wDV1.chunk.js","scripts/_jJAx6fU.chunk.js","scripts/CLjADRa42.chunk.js","css/DVdh6HWj.chunk.css"])))=>i.map(i=>d[i]);
2
- import{o as e}from"./DAXXjFlN.chunk.js";import{x as t,y as n}from"./BftnFbcr.chunk.js";import"./DFZS3Ffo.chunk.js";import{n as r}from"./B785hxeE.chunk.js";import{t as i}from"./CQyJ7YGa.chunk.js";import{t as a}from"./e57H3T-k.chunk.js";import{t as o}from"./C2w0pmFW.chunk.js";import{t as s}from"./wrLrTezN.chunk.js";import{t as c}from"./BXTI9cmX.chunk.js";import{i as l}from"./BYSskNbK.chunk.js";import{f as u,g as d,p as f,u as p}from"./BX0wDJmp.chunk.js";import{U as m,d as h,l as g,s as _,y as v,z as y}from"./NlCAcBdo.chunk.js";import{t as b}from"./DGmmTRu72.chunk.js";import{t as x}from"./CVHQXNzi2.chunk.js";import{t as S}from"./BrbeV-Gn2.chunk.js";import{t as C}from"./LoQS6GjP.chunk.js";import{t as w}from"./CZgWQFsJ.chunk.js";import{t as T}from"./CqrjHjAN.chunk.js";import{t as E}from"./eoAypzU3.chunk.js";import{t as D}from"./D_gWf2lC.chunk.js";import{t as O}from"./_GCZ-60i.chunk.js";import{t as k}from"./DruDe9vI.chunk.js";import{t as A}from"./7-GJWRH82.chunk.js";import{t as j}from"./dLd5d3X22.chunk.js";import{n as M}from"./BRcHS92O2.chunk.js";import{t as ee}from"./Bs2PKr1I2.chunk.js";import{t as N}from"./QCFxJYkI2.chunk.js";import{t as te}from"./e_p5kSFR2.chunk.js";import{t as ne}from"./CduNFx13.chunk.js";import{n as P,t as F}from"./BGhJ8TEx.chunk.js";import{n as re,t as ie}from"./DWLFYiMu.chunk.js";import{t as ae}from"./DDLr4JCi.chunk.js";import{t as I}from"./B3gsVN-_.chunk.js";import{t as oe}from"./BDif2ytg2.chunk.js";import{t as L}from"./CbzENe5-2.chunk.js";import{t as R}from"./Dfw0sxVt2.chunk.js";import{t as se}from"./rVRhgtHY2.chunk.js";import{t as ce}from"./6UdHSMo02.chunk.js";import{t as le}from"./BSYDOevb2.chunk.js";import{t as z}from"./BugRosaL2.chunk.js";import{t as ue}from"./DYDxLHiV2.chunk.js";import{n as de}from"./CpFtf-tI2.chunk.js";import{t as fe}from"./BTd65Rcb2.chunk.js";import{t as pe}from"./D6vGqwTy2.chunk.js";import{t as B}from"./DBkEQkKm2.chunk.js";import{t as me}from"./dkL70h2W2.chunk.js";import{n as he,t as ge}from"./Bmh0Fxsl2.chunk.js";import"./BUDCkU2S2.chunk.js";import{t as _e}from"./C1loT8MD2.chunk.js";var V=e(o()),H=s();function U(e,t){let n=u(),{hasPermissions:i}=I(),a=(p(T.currentUser()).data?.isAuthenticated||t)&&i(r.ViewVideoPointsOfInterest);function o(t){return C.pointsOfInterest(e,t)}function s(e){n(o(e))}a||(e=null),ae(!!e&&o,!!e&&s);let c=re(!!e&&(e=>o(e).key));return a?c:ie}function W(e){let{hasEnabledViviPlayback:t,hasEnabledAppleTvPlayback:n,hasEnabledViviStudentCasting:i,isLoadingSettings:a}=b(null),{hasProduct:o,isLoadingProducts:s}=R(),{hasPermissions:c,isLoaded:l}=I(),{fetchViviAccessToken:u,fetchAppleTvAccessToken:d}=ve(),f=p(T.currentUser()),m=p(D.config()),h=xe(c),g=f.data?.isAuthenticated??!1,_=!c(r.StudentExperience),v=!c(r.GuestExperience),y=o(N.Primary),x=g&&y&&(_||i)&&v,S=g&&y&&_&&v,C=x&&t,w=p(e&&C&&L.getViviIntegrationStatus()),E=w.data===oe.Connected,O=!C||w.hasCompleted;return{hasCompleted:!g||f.hasCompleted&&m.hasCompleted&&O&&l&&!a&&!s,data:{ctaOptions:h,canUserCastToDevices:x||S,vivi:{accountConnected:E,enabled:x&&t,apiUrl:m.data?.viviApiUrl??``,fetchAccessToken:u},appleTv:{enabled:S&&n,fetchAccessToken:d}}}}function ve(){let e=f(),t=d();return{fetchViviAccessToken:async()=>{let n=L.getViviAccessToken(),r=t(n.key),{token:i}=r.shouldFetch?await e(n):r.data;return i},fetchAppleTvAccessToken:()=>e(L.getAppleTvAccessToken())}}var ye=`https://clickv.ie/w/WVsx`,be=`https://clickv.ie/w/PVsx`;function xe(e){let[i,a]=j(`devices:cta:dismissed`,{dismissed:!1},{storage:l.LocalStorage}),o=e(r.StudentExperience),s=e(r.ManageIntegrations),u={entity:g.DevicesCta,actionType:y.Click,workflowPhase:m.Complete,location:v.Player};return{hasBeenDismissed:i.dismissed||o,canUserManageIntegrations:s,onDismiss:e=>{O.logUserAction({canUserManageIntegrations:s,context:e},{...u,descriptor:_.Dismiss,eventVersion:h.V1}),a({dismissed:!0})},onInstall:e=>{O.logUserAction({canUserManageIntegrations:s,context:e},{...u,descriptor:_.InstallIntegration,eventVersion:h.V1}),n.trigger({application:c.SETTINGS,action:E.Settings.INTEGRATIONS})},onLearnMore:e=>{O.logUserAction({canUserManageIntegrations:s,context:e},{...u,descriptor:_.LearnMore,eventVersion:h.V1}),(e===`vivi_and_apple_tv`||e===`vivi`)&&t.PageLoad(ye,!0),(e===`vivi_and_apple_tv`||e===`apple_tv`)&&t.PageLoad(be,!0)},onContactSupport:e=>{O.logUserAction({canUserManageIntegrations:s,context:e},{...u,descriptor:_.ContactSupport,eventVersion:h.V1}),t.PageLoad(te.getSupportRequestUrl(),!0)}}}var G={VIDEO_START_TIME_CUTOFF:10,PUBLIC_SEARCH_QUERY_DEBOUNCE:400,AUTHENTICATED_SEARCH_QUERY_DEBOUNCE:200},K=e=>({application:c.LIBRARIES,action:E.Libraries.LIBRARY,args:[e.id.toString(),a.slugify(e.name)]}),q=(e,t)=>({application:c.LIBRARIES,action:E.Libraries.FOLDER,args:[e.id.toString(),t.id.toString(),a.slugify(t.name)]});function Se(e){let{settings:t,presentationSlug:n}=e;return{getTagAppLink:e=>({application:c.SEARCH,action:E.Search.HOME,params:{tagOrClassification:e.name}}),getSeriesAppLink:(e,t)=>ue.getSeriesAppLink(e,t?{mtv:!0}:{},n),getResourceAppLink:(e,t,n)=>r=>!n&&!t?{application:c.SIGN_UP,action:E.SignUp.SIGN_UP}:{application:c.VIDEOS,action:E.Videos.PREVIEW_PDF,args:[r.id],params:{videoId:e,shareId:t}},getPartnerProfileAppLink:t?.hasPartnerProfiles?e=>z.getPartnerDashboardAppLink(e):null,getPartnerDashboardHubAppLink:t?.hasPartnerProfiles?e=>z.getPartnerDashboardHubAppLink(e):null,getLibraryAppLink:K,getFolderAppLink:q}}function Ce(e,t){let n=Number(e);if(!isNaN(n)&&n>=0)return n;let r=S.getVideoProgress(t);return!r||r>=t.duration/1e3-G.VIDEO_START_TIME_CUTOFF?0:r}function we(e){if(Number.isInteger(+e))return+e}var J={poster:`_poster_1ven8_1`,frost:`_frost_1ven8_5`,image:`_image_1ven8_9`},Y=`shared.streamLimitOverlay`,X=i.encloseNamespace(Y);function Te(e){let t=e.canRedeemMoreReferrals?E.SignUp.INVITE_COLLEAGUE:E.SignUp.UPGRADE,n=e.canRedeemMoreReferrals?`inviteCta`:`upgradeCta`,r=e.embed||e.hasStudentExperience,i;return i=r?`basicDescription`:e.canRedeemMoreReferrals?`referralDescription`:`upgradeDescription`,V.useEffect(()=>{e.embed&&fe.remove()},[e.embed]),(0,H.jsxs)(`div`,{className:`position-relative bg-light overflow-hidden ${e.embed?`position-fixed top-0 start-0 end-0 bottom-0`:`ratio ratio-16x9`}`,children:[e.posterUrl&&(0,H.jsx)(`img`,{className:`position-absolute top-0 start-0 w-100 h-100 object-fit-cover ${J.poster}`,src:e.posterUrl,alt:``}),(0,H.jsx)(`div`,{className:`position-absolute top-0 start-0 w-100 h-100 ${J.frost}`}),(0,H.jsxs)(`div`,{className:`position-absolute top-0 start-0 w-100 h-100 d-flex flex-column align-items-center justify-content-center text-center p-4`,children:[(0,H.jsx)(`img`,{className:`${J.image} d-none d-md-block mb-3`,src:A.SignUp.INVITE_COLLEAGUE,alt:X(`heading`)}),(0,H.jsx)(`h2`,{className:`h5 mb-2`,children:(0,H.jsx)(de,{namespace:Y,phrase:`heading`,options:{smartCount:e.totalStreamsAvailable}})}),(0,H.jsx)(`p`,{className:`text-dark mb-3`,children:X(i)}),!r&&(0,H.jsx)(ne,{className:`btn btn-dark`,appLink:{application:c.SIGN_UP,action:t},children:X(n)})]})]})}var Ee=38,De=40,Oe=()=>{function e(e){if(e.keyCode===Ee||e.keyCode===De)return e.preventDefault(),!1}V.useEffect(()=>(window.addEventListener(`keydown`,e,!1),()=>{window.removeEventListener(`keydown`,e,!1)}),[])},Z=6,ke=25;function Q(e){let{video:t,currentUser:n,moviesAndTv:r,context:i,contextId:a}=e,{canViewRelatedVideos:o}=_e(),{hasProduct:s}=R(),c=u();function l(e){return!t||!n?.isAuthenticated||!s(N.Primary)||!o||!i&&!a?null:C.relatedVideos({videoId:t.id,context:i,collectionId:a,moviesAndTv:r,limit:e})}function d(e){return e&&(h&&(e=e.slice(0,Z-1)),e.filter(e=>S.getCanBeConsumed(e)?.canNavigate))}function f(){c(l(ke))}let m=p(l(Z)),h=m.data?.length===Z;return{videos:d(m.data),hasCompleted:m.hasCompleted,isFetching:m.isFetching,hasError:m.hasError,hasMore:h,fetchNext:f}}var Ae=M.Medium;function je(e,t,n){return t?n?n.objectId===e?F.createViewKey(t,P.Share):F.createViewKey(e,P.MasterObject,t):null:F.createViewKey(e,P.MasterObject)}function Me(e){let{objectId:t,objectTypeId:n,shareId:r,context:i,contextId:a,moviesAndTv:o}=e,s=p(D.config()),c=p(T.currentUser()),l=p(t&&S.getVideoRequest(t,n,r)),u=p(r&&k.getShareObject(r)),d=U((n===x.Video||n===x.Clip)&&t),f=p(t&&je(t,r,u.data)),m=Q({video:l.data,context:i,contextId:a,moviesAndTv:o,currentUser:c.data}),h=W(t);return p(t&&c.data?.isAuthenticated&&he.isFavourited(c.data.id,[t])),{hasCompleted:l.data&&s.hasCompleted&&c.hasCompleted&&(!r||u.hasCompleted)&&(n!==x.Video||d.hasCompleted)&&f.hasCompleted&&h.hasCompleted,config:s.data,currentUser:c.data,video:l.data,shareLink:u.data,pointsOfInterest:d?.items,viewKey:f.data,relatedVideos:m.videos,playerIntegrations:h.data}}function Ne(e,t){let{setFavourite:n,canFavourite:r}=ge(v.Player),i=me.isFavouritedByCurrentUser(t),a=S.isVideoTypeArchived(t);V.useEffect(()=>{!e||!t||!r(t)||a||e.setFavourite?.(i,e=>n(t,e))},[t,e,r,a])}function Pe(e,t,r,i,a){let{hasProduct:o}=R(),s=S.isVideoTypeArchived(r),l=t.isAuthenticated&&S.isVideo(r)&&r._canCreateChild?.value&&o(N.Primary)&&!i&&a&&!s;if(!l)return;function u(){l&&n.trigger({application:c.CLIPS,action:E.Clips.CREATE_CLIP,args:[r.id],params:{startTime:e.current?.currentTime?.()??void 0}})}return u}function Fe(e,t){let{hasProduct:n}=R();return e.isAuthenticated&&n(N.Primary)&&t}function Ie(e){let{player:t,relatedVideos:r,shareId:i,context:a,contextId:o,moviesAndTv:s,playNext:c,mode:l,isAuthenticated:u,presentationSlug:d}=e,f=r?.[0];V.useEffect(()=>{if(!t?.setNextVideo||!f)return;if(l!=="default"){t.setNextVideo?.(null,!1,null);return}let e=S.getThumbnail(f)?.url,r={name:f.name,thumbnailUrl:ee.createUrl(e,{size:Ae})};t.setNextVideo?.(r,c,()=>{n.trigger(B.getAppLink(f,{shareId:i,context:a,contextId:o,playNext:c,moviesAndTv:s,includeContext:u},d))})},[t,f,i,a,o,c,l])}var $={embeddedPlayer:`_embeddedPlayer_1qmhl_1`,placeholder:`_placeholder_1qmhl_8`,theatreMode:`_theatreMode_1qmhl_12`};function Le(e){return e.shareLink?e.currentUser.isAuthenticated?!0:!!e.collectAnonResults:!1}function Re(e,t,r,i,a){if(t)return n.getHref({application:c.SHARE,action:E.Share.VIEW_SHARE_LINK,args:[t.id],params:{t:r.currentTime,a:!0}});let o=B.getAppLink(e,{includeContext:i},a);return o.params||={},o.params.t=r.currentTime,o.params.a=!0,n.getHref(o)}ze.defaultProps={allowCreateClip:!0};function ze(e){let t=V.useRef(null),n=V.useRef(null);Ne(t.current,e.video),t.current,e.video,e.shareLink,Ie({player:t.current,relatedVideos:e.relatedVideos,shareId:e.shareLink?.id,context:e.context,contextId:e.contextId,moviesAndTv:e.moviesAndTv,playNext:e.playNext,mode:e.mode,isAuthenticated:e.currentUser?.isAuthenticated,presentationSlug:e.presentationSlug}),Oe();let i=Fe(e.currentUser,e.onRequestPictureInPicture),{experimentalInteractiveQuestions:a}=b(null),{isLoaded:o,hasReachedStreamLimit:s,canRedeemMoreReferrals:c,totalStreamsAvailable:l}=pe(),{hasPermissions:u}=I(),d=u(r.GuestExperience),f=u(r.StudentExperience),p=Pe(t,e.currentUser,e.video,e.embed,!d&&e.allowCreateClip),m=se();function h(n){t.current=n,m(),e.onReady&&e.onReady(n),g(n)}function g(t){n.current=new ce({player:t,video:e.video,analyticsLocation:e.embed?v.EmbeddedPlayer:v.PlayPage,shareId:e.shareLink?.id})}let _=``;`thumbnail`in e.video&&(_=e.video.thumbnail?.url),!_&&`_parentVideo`in e.video&&(_=e.video._parentVideo?.thumbnail?.url);let y={viewKey:e.viewKey.viewKey,playerApi:new URL(e.config.playerApiUrl),imageCdnUrl:e.config.imageCdnUrl,autoplay:e.autoplay,startTime:Ce(e.startTime,e.video),endTime:we(e.endTime),embed:e.embed,showResources:e.showResources,getExternalLink:e.embed&&(t=>Re(e.video,e.shareLink,t,e.currentUser?.isAuthenticated,e.presentationSlug)),muted:e.muted,splash:e.embed?{title:e.video.name,posterUrl:_,ratingCode:S.getRating(e.video)?.code,ratingValue:S.getRating(e.video)?.value,seriesName:`series`in e.video&&e.video.series?.name,seasonNumber:`season`in e.video&&e.video.season?.number,episodeNumber:`episodeNumber`in e.video&&e.video.episodeNumber}:void 0,allowTheatreMode:e.allowTheatreMode,allowLoop:!0,hotkeyElQuerySelector:`body`,sharerInstanceRegion:e.shareLink?.ownerInstanceRegion},C=e.playerIntegrations?{...e.playerIntegrations,trackingCode:S.getTrackingCode(e.video)}:void 0,T=e.mode==="default"&&e.defaultDisplayMode===`theatre`,E=e.mode===`hover`,D=e.video.typeId===x.Interactive,O=le.isPublic(e.shareLink),k=o&&s&&!E&&!O,A=V.useMemo(()=>V.lazy(()=>w(()=>import(`./BpFyfI-52.chunk.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177]))),[]),j=V.useMemo(()=>V.lazy(()=>w(()=>import(`./Br8WvETm.chunk.js`),__vite__mapDeps([178,1,14,7,15,16,4,5,19,179,2,3,6,8,9,10,11,12,13,131,43,17,34,44,45,180,123,79,181,182,139,183,119,184,48,24,33,185,186,187,98,188,189,113,27,87,31,86,88,89,90,190,191,192,193,107,108,109,26,110,111,112,25,35,36,37,38,39,40,42,46,47,49,50,51,114,115,116,85,117,118,120,121,122,18,69,55,56,124,125,126,127,72,128,129,130,80,132,133,134,135,136,137,138,41,140,141,142,143,144,145,146,147,148,149,150,151,154,155,156,157,176,194,195,196,76,77,78,75,58,59,60,61,62,63,64,65,66,67,68,70,71,73,74,197,198,199]))),[]);if(k)return(0,H.jsx)(Te,{posterUrl:_,embed:e.embed,hasStudentExperience:f,canRedeemMoreReferrals:c,totalStreamsAvailable:l});if(D)return(0,H.jsx)(V.Suspense,{fallback:(0,H.jsx)(`div`,{className:$.placeholder}),children:(0,H.jsx)(A,{...y,imageApi:new URL(e.config.imageCdnUrl),currentUser:e.currentUser,collectResults:Le(e),shareId:e.shareLink?.id,enableImmersiveReader:!0,summaryPortalNode:e.summaryPortalNode,onShowSummary:e.onShowSummary,onReady:h,className:e.embed?$.embeddedPlayer:``,furthestVisitedTime:e.video._videoProgress?.furthest,questionListPortalNode:e.questionListPortalNode,authToken:e.token?.value,experimentalInteractiveQuestions:a})});function M(){return e.embed?$.embeddedPlayer:T?`w-100 h-100`:``}return(0,H.jsx)(V.Suspense,{fallback:(0,H.jsx)(`div`,{className:`${$.placeholder} ${T?$.theatreMode:``}`}),children:(0,H.jsx)(j,{...y,devicesConfig:C,className:M(),onClickCreateClip:p,pointsOfInterest:e.pointsOfInterest,onReady:h,showResources:e.embed,onRequestPictureInPicture:i&&e.onRequestPictureInPicture,onRequestTheatreMode:e.onRequestTheatreMode,theatreMode:T,nextDefaultDisplayMode:e.defaultDisplayMode,allowTranscript:e.allowTranscript})})}export{q as a,W as c,Se as i,U as l,Me as n,K as o,Q as r,G as s,ze as t};
3
- //# sourceMappingURL=Bw2cauzs2.chunk.js.map
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["scripts/D2vAOC7r2.chunk.js","scripts/DAXXjFlN.chunk.js","scripts/snXCXfT6.chunk.js","scripts/e57H3T-k.chunk.js","scripts/C2w0pmFW.chunk.js","scripts/wrLrTezN.chunk.js","scripts/BVnMI-dl.chunk.js","scripts/CMDJWWg3.chunk.js","scripts/Dr3Lux2e.chunk.js","scripts/wdQVW3s5.chunk.js","scripts/BGGL8m_U.chunk.js","scripts/B_N30_Kb.chunk.js","scripts/rPN1bfU12.chunk.js","scripts/BIzu5ufQ.chunk.js","scripts/BftnFbcr.chunk.js","scripts/DPtsihFR.chunk.js","scripts/DMnm3Ewv.chunk.js","scripts/DFZS3Ffo.chunk.js","scripts/C1SLt-ar.chunk.js","scripts/NlCAcBdo.chunk.js","scripts/BzfCWDOl2.chunk.js","scripts/C5j5LRut2.chunk.js","scripts/Bneb37232.chunk.js","scripts/C1PTqhPY2.chunk.js","scripts/BDwjs8qz2.chunk.js","scripts/B3TDTJSl.chunk.js","scripts/BYSskNbK.chunk.js","scripts/BRcHS92O2.chunk.js","scripts/CaHxeG5Y2.chunk.js","scripts/e_p5kSFR2.chunk.js","scripts/Byg072EM.chunk.js","scripts/DZX1tZ-D2.chunk.js","scripts/QCFxJYkI2.chunk.js","scripts/C0exjRXJ.chunk.js","scripts/Bbp2U9GK.chunk.js","scripts/CYSDN6kj.chunk.js","scripts/CVqxBe99.chunk.js","scripts/CNxJMwxC.chunk.js","scripts/CQRza4Ga.chunk.js","scripts/ByIC_M_8.chunk.js","scripts/Epqx0J1v.chunk.js","scripts/Cy6lZVxk.chunk.js","scripts/BUnh3rN0.chunk.js","scripts/_GCZ-60i.chunk.js","scripts/CduNFx13.chunk.js","css/9awfngRG.chunk.css","css/zFl67mql.chunk.css","scripts/CXnhm0VS2.chunk.js","scripts/CQyJ7YGa.chunk.js","scripts/iZ7EqNA72.chunk.js","scripts/OL3Z6Yp62.chunk.js","scripts/TTO6HcNP.chunk.js","scripts/ClVhjUGI.chunk.js","scripts/11tE0tcu.chunk.js","scripts/E5Pmu4O7.chunk.js","scripts/CKOWgMyj2.chunk.js","scripts/D5yUWL7p2.chunk.js","scripts/BxYKQEUG2.chunk.js","scripts/DaT2nTfp.chunk.js","scripts/CDeqAwMc.chunk.js","scripts/ss6ZpC3s.chunk.js","scripts/GvIHspQt.chunk.js","scripts/FFbkHQcg.chunk.js","scripts/ClpxGEGl.chunk.js","scripts/CvNHBl0q.chunk.js","scripts/C-k6FY-f.chunk.js","scripts/BLm6PYXX.chunk.js","scripts/BM2EJL9g.chunk.js","scripts/DqXpeRGy.chunk.js","scripts/CpFtf-tI2.chunk.js","scripts/CCrnRkGN2.chunk.js","scripts/CXVBjdpb.chunk.js","scripts/BruX4yYB.chunk.js","scripts/gl4k7dtw.chunk.js","scripts/CQ0MgG2c.chunk.js","scripts/Dhx_Wqdc.chunk.js","scripts/6ZXIO06e.chunk.js","scripts/DlEtkSBj2.chunk.js","scripts/CnsLb4V9.chunk.js","scripts/C7HU4huj.chunk.js","scripts/BGswYbRT.chunk.js","scripts/o_O53MMd.chunk.js","scripts/9kSpxveW.chunk.js","scripts/C-THHyTP.chunk.js","scripts/DDJBf9pK2.chunk.js","scripts/DUXPuDp72.chunk.js","scripts/BiqmNDlz2.chunk.js","scripts/Bs2PKr1I2.chunk.js","scripts/BlGyXBAH2.chunk.js","scripts/Dc1hYuQ12.chunk.js","css/CuSUr3Gp.chunk.css","scripts/Dp6QHgBL.chunk.js","scripts/ByszCPst.chunk.js","scripts/B44BW79X2.chunk.js","scripts/BU5CGdBX.chunk.js","css/BPdg7JW4.chunk.css","scripts/Z4RlHaVG.chunk.js","scripts/Dg1mFtY2.chunk.js","scripts/BBEIIgZ6.chunk.js","scripts/CHL4nrKG.chunk.js","scripts/CWMwyVGJ2.chunk.js","scripts/QVHuXdWQ2.chunk.js","scripts/CfTTKh6M.chunk.js","css/D8a4tOyE.chunk.css","scripts/lPQgHDFT.chunk.js","scripts/XBYhZGTN.chunk.js","scripts/CwYrnhdi.chunk.js","scripts/CKGiikBV.chunk.js","scripts/c7DC36s9.chunk.js","scripts/BVm7hIyo.chunk.js","scripts/FAs_d-DP.chunk.js","scripts/Bzihudtn.chunk.js","scripts/BFXddaSP.chunk.js","scripts/YjWbDb2Y.chunk.js","scripts/BJUbYu222.chunk.js","scripts/BBDxSGT52.chunk.js","scripts/jAbfamoi.chunk.js","scripts/CdYjo8_g2.chunk.js","scripts/CbOJtYeK.chunk.js","scripts/B3fF5gkg.chunk.js","scripts/CvHvrB-t.chunk.js","scripts/B6bB9two.chunk.js","scripts/BbgQJe-T.chunk.js","scripts/5ONJSThP.chunk.js","scripts/xa4cS6Fq.chunk.js","scripts/DGmmTRu72.chunk.js","scripts/B_BV48Fy.chunk.js","scripts/BX0wDJmp.chunk.js","scripts/CqrjHjAN.chunk.js","scripts/Ky1--4w3.chunk.js","scripts/CZgWQFsJ.chunk.js","scripts/CVHQXNzi2.chunk.js","scripts/B9VCwo3g2.chunk.js","scripts/DsBWAM3I2.chunk.js","scripts/_42F7SIA2.chunk.js","scripts/Cr6TXzQQ2.chunk.js","scripts/CjA4Q5pm.chunk.js","scripts/CmcCVXi32.chunk.js","scripts/BcibGFe42.chunk.js","scripts/WvK58Ge12.chunk.js","scripts/DYKH_3un.chunk.js","scripts/CunDpHqX2.chunk.js","css/0ZqRj7up.chunk.css","scripts/B5XaBzZh.chunk.js","scripts/DIENjKhZ.chunk.js","css/D2t3ESms.chunk.css","scripts/B_9JhhOa.chunk.js","scripts/BPavmm8c.chunk.js","css/DnhOr8Y7.chunk.css","scripts/CnnDkGmK.chunk.js","scripts/C3Wa868y.chunk.js","css/DvO5Hl4o.chunk.css","scripts/6BvA1WyF.chunk.js","css/BL4roXAj.chunk.css","scripts/DIeIfhGe.chunk.js","scripts/_XhYAc8v.chunk.js","scripts/lhZ5v-iN2.chunk.js","css/BU5l8u5C.chunk.css","scripts/Cyb3BaQc.chunk.js","scripts/D5nbPgu6.chunk.js","css/BBsXDtTT.chunk.css","scripts/DhhslGq9.chunk.js","scripts/DT8J1fGP.chunk.js","scripts/duGVMZTg.chunk.js","scripts/DlAOGdRl.chunk.js","scripts/C3q_xvci.chunk.js","scripts/Dl2HqObu.chunk.js","css/FUAcQhsk.chunk.css","scripts/BScb3_Xj2.chunk.js","scripts/DhwAOJmY2.chunk.js","css/PJ3nCJ4X.chunk.css","scripts/IqGr9V7u2.chunk.js","css/ChavoTyg.chunk.css","scripts/B-W0xPTa2.chunk.js","scripts/B2JUNqnO2.chunk.js","css/C1-mauxJ.chunk.css","scripts/BiKac8UT2.chunk.js","css/J67nkM51.chunk.css","scripts/Dhv7zSEB.chunk.js","scripts/Dyy-PWHO.chunk.js","scripts/B2INd6bh.chunk.js","scripts/BRrNQXpU2.chunk.js","css/DVhPtkT7.chunk.css","scripts/D3-wtcxf2.chunk.js","scripts/DEZqrbCm.chunk.js","scripts/Chgge8yX2.chunk.js","scripts/BteVhTv7.chunk.js","scripts/De16zmhB.chunk.js","css/BgzV9aK4.chunk.css","scripts/BicQH0Al.chunk.js","css/D5JKYURg.chunk.css","scripts/B1r_1ubU.chunk.js","scripts/C5f0lBCw2.chunk.js","css/DBshtiPC.chunk.css","scripts/D4uneRs9.chunk.js","scripts/CcI-EKxs.chunk.js","scripts/CsF4wDV1.chunk.js","scripts/_jJAx6fU.chunk.js","scripts/CLjADRa42.chunk.js","css/DVdh6HWj.chunk.css"])))=>i.map(i=>d[i]);
2
+ import{o as e}from"./DAXXjFlN.chunk.js";import{x as t,y as n}from"./BftnFbcr.chunk.js";import"./DFZS3Ffo.chunk.js";import{n as r}from"./B785hxeE.chunk.js";import{t as i}from"./CQyJ7YGa.chunk.js";import{t as a}from"./e57H3T-k.chunk.js";import{t as o}from"./C2w0pmFW.chunk.js";import{t as s}from"./wrLrTezN.chunk.js";import{t as c}from"./BXTI9cmX.chunk.js";import{i as l}from"./BYSskNbK.chunk.js";import{f as u,g as d,p as f,u as p}from"./BX0wDJmp.chunk.js";import{U as m,d as h,l as g,s as _,y as v,z as y}from"./NlCAcBdo.chunk.js";import{t as b}from"./DGmmTRu72.chunk.js";import{t as x}from"./CVHQXNzi2.chunk.js";import{t as S}from"./BrbeV-Gn2.chunk.js";import{t as C}from"./LoQS6GjP.chunk.js";import{t as w}from"./CZgWQFsJ.chunk.js";import{t as T}from"./CqrjHjAN.chunk.js";import{t as E}from"./eoAypzU3.chunk.js";import{t as D}from"./D_gWf2lC.chunk.js";import{t as O}from"./_GCZ-60i.chunk.js";import{t as k}from"./DruDe9vI.chunk.js";import{t as A}from"./7-GJWRH82.chunk.js";import{t as j}from"./dLd5d3X22.chunk.js";import{n as M}from"./BRcHS92O2.chunk.js";import{t as ee}from"./Bs2PKr1I2.chunk.js";import{t as N}from"./QCFxJYkI2.chunk.js";import{t as te}from"./e_p5kSFR2.chunk.js";import{t as ne}from"./CduNFx13.chunk.js";import{n as P,t as F}from"./BGhJ8TEx.chunk.js";import{n as re,t as ie}from"./DWLFYiMu.chunk.js";import{t as ae}from"./DDLr4JCi.chunk.js";import{t as I}from"./B3gsVN-_.chunk.js";import{t as oe}from"./BDif2ytg2.chunk.js";import{t as L}from"./CbzENe5-2.chunk.js";import{t as R}from"./Dfw0sxVt2.chunk.js";import{t as se}from"./rVRhgtHY2.chunk.js";import{t as ce}from"./6UdHSMo02.chunk.js";import{t as le}from"./BSYDOevb2.chunk.js";import{t as z}from"./BugRosaL2.chunk.js";import{t as ue}from"./DYDxLHiV2.chunk.js";import{n as de}from"./CpFtf-tI2.chunk.js";import{t as fe}from"./BTd65Rcb2.chunk.js";import{t as pe}from"./D6vGqwTy2.chunk.js";import{t as B}from"./DBkEQkKm2.chunk.js";import{t as me}from"./dkL70h2W2.chunk.js";import{n as he,t as ge}from"./Bmh0Fxsl2.chunk.js";import"./BUDCkU2S2.chunk.js";import{t as _e}from"./C1loT8MD2.chunk.js";var V=e(o()),H=s();function U(e,t){let n=u(),{hasPermissions:i}=I(),a=(p(T.currentUser()).data?.isAuthenticated||t)&&i(r.ViewVideoPointsOfInterest);function o(t){return C.pointsOfInterest(e,t)}function s(e){n(o(e))}a||(e=null),ae(!!e&&o,!!e&&s);let c=re(!!e&&(e=>o(e).key));return a?c:ie}function W(e){let{hasEnabledViviPlayback:t,hasEnabledAppleTvPlayback:n,hasEnabledViviStudentCasting:i,isLoadingSettings:a}=b(null),{hasProduct:o,isLoadingProducts:s}=R(),{hasPermissions:c,isLoaded:l}=I(),{fetchViviAccessToken:u,fetchAppleTvAccessToken:d}=ve(),f=p(T.currentUser()),m=p(D.config()),h=xe(c),g=f.data?.isAuthenticated??!1,_=!c(r.StudentExperience),v=!c(r.GuestExperience),y=o(N.Primary),x=g&&y&&(_||i)&&v,S=g&&y&&_&&v,C=x&&t,w=p(e&&C&&L.getViviIntegrationStatus()),E=w.data===oe.Connected,O=!C||w.hasCompleted;return{hasCompleted:!g||f.hasCompleted&&m.hasCompleted&&O&&l&&!a&&!s,data:{ctaOptions:h,canUserCastToDevices:x||S,vivi:{accountConnected:E,enabled:x&&t,apiUrl:m.data?.viviApiUrl??``,fetchAccessToken:u},appleTv:{enabled:S&&n,fetchAccessToken:d}}}}function ve(){let e=f(),t=d();return{fetchViviAccessToken:async()=>{let n=L.getViviAccessToken(),r=t(n.key),{token:i}=r.shouldFetch?await e(n):r.data;return i},fetchAppleTvAccessToken:()=>e(L.getAppleTvAccessToken())}}var ye=`https://clickv.ie/w/WVsx`,be=`https://clickv.ie/w/PVsx`;function xe(e){let[i,a]=j(`devices:cta:dismissed`,{dismissed:!1},{storage:l.LocalStorage}),o=e(r.StudentExperience),s=e(r.ManageIntegrations),u={entity:g.DevicesCta,actionType:y.Click,workflowPhase:m.Complete,location:v.Player};return{hasBeenDismissed:i.dismissed||o,canUserManageIntegrations:s,onDismiss:e=>{O.logUserAction({canUserManageIntegrations:s,context:e},{...u,descriptor:_.Dismiss,eventVersion:h.V1}),a({dismissed:!0})},onInstall:e=>{O.logUserAction({canUserManageIntegrations:s,context:e},{...u,descriptor:_.InstallIntegration,eventVersion:h.V1}),n.trigger({application:c.SETTINGS,action:E.Settings.INTEGRATIONS})},onLearnMore:e=>{O.logUserAction({canUserManageIntegrations:s,context:e},{...u,descriptor:_.LearnMore,eventVersion:h.V1}),(e===`vivi_and_apple_tv`||e===`vivi`)&&t.PageLoad(ye,!0),(e===`vivi_and_apple_tv`||e===`apple_tv`)&&t.PageLoad(be,!0)},onContactSupport:e=>{O.logUserAction({canUserManageIntegrations:s,context:e},{...u,descriptor:_.ContactSupport,eventVersion:h.V1}),t.PageLoad(te.getSupportRequestUrl(),!0)}}}var G={VIDEO_START_TIME_CUTOFF:10,PUBLIC_SEARCH_QUERY_DEBOUNCE:400,AUTHENTICATED_SEARCH_QUERY_DEBOUNCE:200},K=e=>({application:c.LIBRARIES,action:E.Libraries.LIBRARY,args:[e.id.toString(),a.slugify(e.name)]}),q=(e,t)=>({application:c.LIBRARIES,action:E.Libraries.FOLDER,args:[e.id.toString(),t.id.toString(),a.slugify(t.name)]});function Se(e){let{settings:t,presentationSlug:n}=e;return{getTagAppLink:e=>({application:c.SEARCH,action:E.Search.HOME,params:{tagOrClassification:e.name}}),getSeriesAppLink:(e,t)=>ue.getSeriesAppLink(e,t?{mtv:!0}:{},n),getResourceAppLink:(e,t,n)=>r=>!n&&!t?{application:c.SIGN_UP,action:E.SignUp.SIGN_UP}:{application:c.VIDEOS,action:E.Videos.PREVIEW_PDF,args:[r.id],params:{videoId:e,shareId:t}},getPartnerProfileAppLink:t?.hasPartnerProfiles?e=>z.getPartnerDashboardAppLink(e):null,getPartnerDashboardHubAppLink:t?.hasPartnerProfiles?e=>z.getPartnerDashboardHubAppLink(e):null,getLibraryAppLink:K,getFolderAppLink:q}}function Ce(e,t){let n=Number(e);if(!isNaN(n)&&n>=0)return n;let r=S.getVideoProgress(t);return!r||r>=t.duration/1e3-G.VIDEO_START_TIME_CUTOFF?0:r}function we(e){if(Number.isInteger(+e))return+e}var J={poster:`_poster_1ven8_1`,frost:`_frost_1ven8_5`,image:`_image_1ven8_9`},Y=`shared.streamLimitOverlay`,X=i.encloseNamespace(Y);function Te(e){let t=e.canRedeemMoreReferrals?E.SignUp.INVITE_COLLEAGUE:E.SignUp.UPGRADE,n=e.canRedeemMoreReferrals?`inviteCta`:`upgradeCta`,r=e.embed||e.hasStudentExperience,i;return i=r?`basicDescription`:e.canRedeemMoreReferrals?`referralDescription`:`upgradeDescription`,V.useEffect(()=>{e.embed&&fe.remove()},[e.embed]),(0,H.jsxs)(`div`,{className:`position-relative bg-light overflow-hidden ${e.embed?`position-fixed top-0 start-0 end-0 bottom-0`:`ratio ratio-16x9`}`,children:[e.posterUrl&&(0,H.jsx)(`img`,{className:`position-absolute top-0 start-0 w-100 h-100 object-fit-cover ${J.poster}`,src:e.posterUrl,alt:``}),(0,H.jsx)(`div`,{className:`position-absolute top-0 start-0 w-100 h-100 ${J.frost}`}),(0,H.jsxs)(`div`,{className:`position-absolute top-0 start-0 w-100 h-100 d-flex flex-column align-items-center justify-content-center text-center p-4`,children:[(0,H.jsx)(`img`,{className:`${J.image} d-none d-md-block mb-3`,src:A.SignUp.INVITE_COLLEAGUE,alt:X(`heading`)}),(0,H.jsx)(`h2`,{className:`h5 mb-2`,children:(0,H.jsx)(de,{namespace:Y,phrase:`heading`,options:{smartCount:e.totalStreamsAvailable}})}),(0,H.jsx)(`p`,{className:`text-dark mb-3`,children:X(i)}),!r&&(0,H.jsx)(ne,{className:`btn btn-dark`,appLink:{application:c.SIGN_UP,action:t},children:X(n)})]})]})}var Ee=38,De=40,Oe=()=>{function e(e){if(e.keyCode===Ee||e.keyCode===De)return e.preventDefault(),!1}V.useEffect(()=>(window.addEventListener(`keydown`,e,!1),()=>{window.removeEventListener(`keydown`,e,!1)}),[])},Z=6,ke=25;function Q(e){let{video:t,currentUser:n,moviesAndTv:r,context:i,contextId:a}=e,{canViewRelatedVideos:o}=_e(),{hasProduct:s}=R(),c=u();function l(e){return!t||!n?.isAuthenticated||!s(N.Primary)||!o||!i&&!a?null:C.relatedVideos({videoId:t.id,context:i,collectionId:a,moviesAndTv:r,limit:e})}function d(e){return e&&(h&&(e=e.slice(0,Z-1)),e.filter(e=>S.getCanBeConsumed(e)?.canNavigate))}function f(){c(l(ke))}let m=p(l(Z)),h=m.data?.length===Z;return{videos:d(m.data),hasCompleted:m.hasCompleted,isFetching:m.isFetching,hasError:m.hasError,hasMore:h,fetchNext:f}}var Ae=M.Medium;function je(e,t,n){return t?n?n.objectId===e?F.createViewKey(t,P.Share):F.createViewKey(e,P.MasterObject,t):null:F.createViewKey(e,P.MasterObject)}function Me(e){let{objectId:t,objectTypeId:n,shareId:r,context:i,contextId:a,moviesAndTv:o}=e,s=p(D.config()),c=p(T.currentUser()),l=p(t&&S.getVideoRequest(t,n,r)),u=p(r&&k.getShareObject(r)),d=U((n===x.Video||n===x.Clip)&&t),f=p(t&&je(t,r,u.data)),m=Q({video:l.data,context:i,contextId:a,moviesAndTv:o,currentUser:c.data}),h=W(t);return p(t&&c.data?.isAuthenticated&&he.isFavourited(c.data.id,[t])),{hasCompleted:l.data&&s.hasCompleted&&c.hasCompleted&&(!r||u.hasCompleted)&&(n!==x.Video||d.hasCompleted)&&f.hasCompleted&&h.hasCompleted,config:s.data,currentUser:c.data,video:l.data,shareLink:u.data,pointsOfInterest:d?.items,viewKey:f.data,relatedVideos:m.videos,playerIntegrations:h.data}}function Ne(e,t){let{setFavourite:n,canFavourite:r}=ge(v.Player),i=me.isFavouritedByCurrentUser(t),a=S.isVideoTypeArchived(t);V.useEffect(()=>{!e||!t||!r(t)||a||e.setFavourite?.(i,e=>n(t,e))},[t,e,r,a])}function Pe(e,t,r,i,a){let{hasProduct:o}=R(),s=S.isVideoTypeArchived(r),l=t.isAuthenticated&&S.isVideo(r)&&r._canCreateChild?.value&&o(N.Primary)&&!i&&a&&!s;if(!l)return;function u(){l&&n.trigger({application:c.CLIPS,action:E.Clips.CREATE_CLIP,args:[r.id],params:{startTime:e.current?.currentTime?.()??void 0}})}return u}function Fe(e,t){let{hasProduct:n}=R();return e.isAuthenticated&&n(N.Primary)&&t}function Ie(e){let{player:t,relatedVideos:r,shareId:i,context:a,contextId:o,moviesAndTv:s,playNext:c,mode:l,isAuthenticated:u,presentationSlug:d}=e,f=r?.[0];V.useEffect(()=>{if(!t?.setNextVideo||!f)return;if(l!=="default"){t.setNextVideo?.(null,!1,null);return}let e=S.getThumbnail(f)?.url,r={name:f.name,thumbnailUrl:ee.createUrl(e,{size:Ae})};t.setNextVideo?.(r,c,()=>{n.trigger(B.getAppLink(f,{shareId:i,context:a,contextId:o,playNext:c,moviesAndTv:s,includeContext:u},d))})},[t,f,i,a,o,c,l])}var $={embeddedPlayer:`_embeddedPlayer_1qmhl_1`,placeholder:`_placeholder_1qmhl_8`,theatreMode:`_theatreMode_1qmhl_12`};function Le(e){return e.shareLink?e.currentUser.isAuthenticated?!0:!!e.collectAnonResults:!1}function Re(e,t,r,i,a){if(t)return n.getHref({application:c.SHARE,action:E.Share.VIEW_SHARE_LINK,args:[t.id],params:{t:r.currentTime,a:!0}});let o=B.getAppLink(e,{includeContext:i},a);return o.params||={},o.params.t=r.currentTime,o.params.a=!0,n.getHref(o)}ze.defaultProps={allowCreateClip:!0};function ze(e){let t=V.useRef(null),n=V.useRef(null);Ne(t.current,e.video),t.current,e.video,e.shareLink,Ie({player:t.current,relatedVideos:e.relatedVideos,shareId:e.shareLink?.id,context:e.context,contextId:e.contextId,moviesAndTv:e.moviesAndTv,playNext:e.playNext,mode:e.mode,isAuthenticated:e.currentUser?.isAuthenticated,presentationSlug:e.presentationSlug}),Oe();let i=Fe(e.currentUser,e.onRequestPictureInPicture),{experimentalInteractiveQuestions:a}=b(null),{isLoaded:o,hasReachedStreamLimit:s,canRedeemMoreReferrals:c,totalStreamsAvailable:l}=pe(),{hasPermissions:u}=I(),d=u(r.GuestExperience),f=u(r.StudentExperience),p=Pe(t,e.currentUser,e.video,e.embed,!d&&e.allowCreateClip),m=se();function h(n){t.current=n,m(),e.onReady&&e.onReady(n),g(n)}function g(t){n.current=new ce({player:t,video:e.video,analyticsLocation:e.embed?v.EmbeddedPlayer:v.PlayPage,shareId:e.shareLink?.id})}let _=``;`thumbnail`in e.video&&(_=e.video.thumbnail?.url),!_&&`_parentVideo`in e.video&&(_=e.video._parentVideo?.thumbnail?.url);let y={viewKey:e.viewKey.viewKey,playerApi:new URL(e.config.playerApiUrl),imageCdnUrl:e.config.imageCdnUrl,autoplay:e.autoplay,startTime:Ce(e.startTime,e.video),endTime:we(e.endTime),embed:e.embed,showResources:e.showResources,getExternalLink:e.embed&&(t=>Re(e.video,e.shareLink,t,e.currentUser?.isAuthenticated,e.presentationSlug)),muted:e.muted,splash:e.embed?{title:e.video.name,posterUrl:_,ratingCode:S.getRating(e.video)?.code,ratingValue:S.getRating(e.video)?.value,seriesName:`series`in e.video&&e.video.series?.name,seasonNumber:`season`in e.video&&e.video.season?.number,episodeNumber:`episodeNumber`in e.video&&e.video.episodeNumber}:void 0,allowTheatreMode:e.allowTheatreMode,allowLoop:!0,hotkeyElQuerySelector:`body`,sharerInstanceRegion:e.shareLink?.ownerInstanceRegion},C=e.playerIntegrations?{...e.playerIntegrations,trackingCode:S.getTrackingCode(e.video)}:void 0,T=e.mode==="default"&&e.defaultDisplayMode===`theatre`,E=e.mode===`hover`,D=e.video.typeId===x.Interactive,O=le.isPublic(e.shareLink),k=o&&s&&!E&&!O,A=V.useMemo(()=>V.lazy(()=>w(()=>import(`./D2vAOC7r2.chunk.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177]))),[]),j=V.useMemo(()=>V.lazy(()=>w(()=>import(`./Dhv7zSEB.chunk.js`),__vite__mapDeps([178,1,14,7,15,16,4,5,19,179,2,3,6,8,9,10,11,12,13,131,43,17,34,44,45,180,123,79,181,182,139,183,119,184,48,24,33,185,186,187,98,188,189,113,27,87,31,86,88,89,90,190,191,192,193,107,108,109,26,110,111,112,25,35,36,37,38,39,40,42,46,47,49,50,51,114,115,116,85,117,118,120,121,122,18,69,55,56,124,125,126,127,72,128,129,130,80,132,133,134,135,136,137,138,41,140,141,142,143,144,145,146,147,148,149,150,151,154,155,156,157,176,194,195,196,76,77,78,75,58,59,60,61,62,63,64,65,66,67,68,70,71,73,74,197,198,199]))),[]);if(k)return(0,H.jsx)(Te,{posterUrl:_,embed:e.embed,hasStudentExperience:f,canRedeemMoreReferrals:c,totalStreamsAvailable:l});if(D)return(0,H.jsx)(V.Suspense,{fallback:(0,H.jsx)(`div`,{className:$.placeholder}),children:(0,H.jsx)(A,{...y,imageApi:new URL(e.config.imageCdnUrl),currentUser:e.currentUser,collectResults:Le(e),shareId:e.shareLink?.id,enableImmersiveReader:!0,summaryPortalNode:e.summaryPortalNode,onShowSummary:e.onShowSummary,onReady:h,className:e.embed?$.embeddedPlayer:``,furthestVisitedTime:e.video._videoProgress?.furthest,questionListPortalNode:e.questionListPortalNode,authToken:e.token?.value,experimentalInteractiveQuestions:a})});function M(){return e.embed?$.embeddedPlayer:T?`w-100 h-100`:``}return(0,H.jsx)(V.Suspense,{fallback:(0,H.jsx)(`div`,{className:`${$.placeholder} ${T?$.theatreMode:``}`}),children:(0,H.jsx)(j,{...y,devicesConfig:C,className:M(),onClickCreateClip:p,pointsOfInterest:e.pointsOfInterest,onReady:h,showResources:e.embed,onRequestPictureInPicture:i&&e.onRequestPictureInPicture,onRequestTheatreMode:e.onRequestTheatreMode,theatreMode:T,nextDefaultDisplayMode:e.defaultDisplayMode,allowTranscript:e.allowTranscript})})}export{q as a,W as c,Se as i,U as l,Me as n,K as o,Q as r,G as s,ze as t};
3
+ //# sourceMappingURL=Cm6SLr7W2.chunk.js.map