@clickview/lite 0.104.0-rc.2 → 0.104.0-rc.4
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.
- package/dist/.vite/manifest.json +779 -779
- package/dist/bundles.json +1 -1
- package/dist/en.json +1 -1
- package/dist/scripts/{CXN0_XjU.chunk.js → -KvTbeQV.chunk.js} +2 -2
- package/dist/scripts/{CXN0_XjU.chunk.js.map → -KvTbeQV.chunk.js.map} +1 -1
- package/dist/scripts/{Bu7Sr1dy.chunk.js → 0Fek4oFk.chunk.js} +2 -2
- package/dist/scripts/{Bu7Sr1dy.chunk.js.map → 0Fek4oFk.chunk.js.map} +1 -1
- package/dist/scripts/{CfRQYWGG.chunk.js → 5PKjjI4Y.chunk.js} +2 -2
- package/dist/scripts/{CfRQYWGG.chunk.js.map → 5PKjjI4Y.chunk.js.map} +1 -1
- package/dist/scripts/{z8IWZ1V1.chunk.js → AEOAlemi.chunk.js} +2 -2
- package/dist/scripts/{z8IWZ1V1.chunk.js.map → AEOAlemi.chunk.js.map} +1 -1
- package/dist/scripts/{DBcWjmUy.chunk.js → B1TqilLB.chunk.js} +2 -2
- package/dist/scripts/{DBcWjmUy.chunk.js.map → B1TqilLB.chunk.js.map} +1 -1
- package/dist/scripts/B1hsuVfV2.chunk.js +2 -0
- package/dist/scripts/{BwBWuxjr2.chunk.js.map → B1hsuVfV2.chunk.js.map} +1 -1
- package/dist/scripts/{BiUOH1CR.chunk.js → B2wDqI1S.chunk.js} +2 -2
- package/dist/scripts/{BiUOH1CR.chunk.js.map → B2wDqI1S.chunk.js.map} +1 -1
- package/dist/scripts/{DWJiezgB2.chunk.js → BBWnpWNB2.chunk.js} +2 -2
- package/dist/scripts/{DWJiezgB2.chunk.js.map → BBWnpWNB2.chunk.js.map} +1 -1
- package/dist/scripts/BILyzh0I.chunk.js +1 -0
- package/dist/scripts/{B-k4BlVQ2.chunk.js → BUVko1EF2.chunk.js} +3 -3
- package/dist/scripts/{B-k4BlVQ2.chunk.js.map → BUVko1EF2.chunk.js.map} +1 -1
- package/dist/scripts/{GolowYbA.chunk.js → BYbQI3CA.chunk.js} +2 -2
- package/dist/scripts/{GolowYbA.chunk.js.map → BYbQI3CA.chunk.js.map} +1 -1
- package/dist/scripts/{DFlO2qoz2.chunk.js → Bf9r1ZoF2.chunk.js} +2 -2
- package/dist/scripts/{DFlO2qoz2.chunk.js.map → Bf9r1ZoF2.chunk.js.map} +1 -1
- package/dist/scripts/{BpHA-MkZ.chunk.js → BiWUSyJr.chunk.js} +2 -2
- package/dist/scripts/{BpHA-MkZ.chunk.js.map → BiWUSyJr.chunk.js.map} +1 -1
- package/dist/scripts/{C8tDgg1l2.chunk.js → BlsbWOzw2.chunk.js} +2 -2
- package/dist/scripts/{C8tDgg1l2.chunk.js.map → BlsbWOzw2.chunk.js.map} +1 -1
- package/dist/scripts/{C_tdgSWS2.chunk.js → Bzk4AwVx2.chunk.js} +2 -2
- package/dist/scripts/{C_tdgSWS2.chunk.js.map → Bzk4AwVx2.chunk.js.map} +1 -1
- package/dist/scripts/{uSXjtjlJ.chunk.js → C3PXfYEd.chunk.js} +2 -2
- package/dist/scripts/{uSXjtjlJ.chunk.js.map → C3PXfYEd.chunk.js.map} +1 -1
- package/dist/scripts/{BgPye7Nd2.chunk.js → C46OeU6w2.chunk.js} +2 -2
- package/dist/scripts/{BgPye7Nd2.chunk.js.map → C46OeU6w2.chunk.js.map} +1 -1
- package/dist/scripts/{9oMRc0cb2.chunk.js → CAs2Sere2.chunk.js} +2 -2
- package/dist/scripts/{9oMRc0cb2.chunk.js.map → CAs2Sere2.chunk.js.map} +1 -1
- package/dist/scripts/{Bm5qACA52.chunk.js → CNfmLVE82.chunk.js} +2 -2
- package/dist/scripts/{Bm5qACA52.chunk.js.map → CNfmLVE82.chunk.js.map} +1 -1
- package/dist/scripts/{-7qiRMLt.chunk.js → CW1i-QHv.chunk.js} +2 -2
- package/dist/scripts/{-7qiRMLt.chunk.js.map → CW1i-QHv.chunk.js.map} +1 -1
- package/dist/scripts/{EKwCaE3J2.chunk.js → CX6c7KRp2.chunk.js} +2 -2
- package/dist/scripts/{EKwCaE3J2.chunk.js.map → CX6c7KRp2.chunk.js.map} +1 -1
- package/dist/scripts/{D_uAdX7E2.chunk.js → CaCm4N_d2.chunk.js} +2 -2
- package/dist/scripts/{D_uAdX7E2.chunk.js.map → CaCm4N_d2.chunk.js.map} +1 -1
- package/dist/scripts/{DW_sm5se2.chunk.js → CfNYFxJl2.chunk.js} +2 -2
- package/dist/scripts/{DW_sm5se2.chunk.js.map → CfNYFxJl2.chunk.js.map} +1 -1
- package/dist/scripts/{CVL6bQWp.chunk.js → CpzveYo2.chunk.js} +2 -2
- package/dist/scripts/{CVL6bQWp.chunk.js.map → CpzveYo2.chunk.js.map} +1 -1
- package/dist/scripts/{CFduwlo0.chunk.js → Cqq1N9xw.chunk.js} +2 -2
- package/dist/scripts/{CFduwlo0.chunk.js.map → Cqq1N9xw.chunk.js.map} +1 -1
- package/dist/scripts/{UCiRB6cQ.chunk.js → CwFYdvvA.chunk.js} +2 -2
- package/dist/scripts/{UCiRB6cQ.chunk.js.map → CwFYdvvA.chunk.js.map} +1 -1
- package/dist/scripts/{By9Vb8Wn.chunk.js → CwYg3Mqk.chunk.js} +2 -2
- package/dist/scripts/{By9Vb8Wn.chunk.js.map → CwYg3Mqk.chunk.js.map} +1 -1
- package/dist/scripts/{DLcyKjA7.chunk.js → Cyit3dMk.chunk.js} +2 -2
- package/dist/scripts/{DLcyKjA7.chunk.js.map → Cyit3dMk.chunk.js.map} +1 -1
- package/dist/scripts/{BxjzTnvL2.chunk.js → D-iyHqNw2.chunk.js} +3 -3
- package/dist/scripts/{BxjzTnvL2.chunk.js.map → D-iyHqNw2.chunk.js.map} +1 -1
- package/dist/scripts/{DICsRDM42.chunk.js → DH_0KtTK2.chunk.js} +2 -2
- package/dist/scripts/{DICsRDM42.chunk.js.map → DH_0KtTK2.chunk.js.map} +1 -1
- package/dist/scripts/{BTcLMVw4.chunk.js → DKDWcWxk.chunk.js} +2 -2
- package/dist/scripts/{BTcLMVw4.chunk.js.map → DKDWcWxk.chunk.js.map} +1 -1
- package/dist/scripts/{Df6x5Ekm2.chunk.js → DN82USWW2.chunk.js} +2 -2
- package/dist/scripts/{Df6x5Ekm2.chunk.js.map → DN82USWW2.chunk.js.map} +1 -1
- package/dist/scripts/{C62uevy9.chunk.js → DWo8DfD9.chunk.js} +2 -2
- package/dist/scripts/{C62uevy9.chunk.js.map → DWo8DfD9.chunk.js.map} +1 -1
- package/dist/scripts/{Bh-26cqn.chunk.js → Dnz8CbEu.chunk.js} +3 -3
- package/dist/scripts/{Bh-26cqn.chunk.js.map → Dnz8CbEu.chunk.js.map} +1 -1
- package/dist/scripts/{CukXgE1z.chunk.js → Dt5731Ay.chunk.js} +2 -2
- package/dist/scripts/{CukXgE1z.chunk.js.map → Dt5731Ay.chunk.js.map} +1 -1
- package/dist/scripts/{DCPsmD1m.chunk.js → Dtag-27K.chunk.js} +2 -2
- package/dist/scripts/{DCPsmD1m.chunk.js.map → Dtag-27K.chunk.js.map} +1 -1
- package/dist/scripts/{DOCHl5Sy.chunk.js → DyE6EUDb.chunk.js} +2 -2
- package/dist/scripts/{DOCHl5Sy.chunk.js.map → DyE6EUDb.chunk.js.map} +1 -1
- package/dist/scripts/{app-CuKrDFuc.js → app-CfAhMxn1.js} +4 -4
- package/dist/scripts/{app-CuKrDFuc.js.map → app-CfAhMxn1.js.map} +1 -1
- package/dist/scripts/{DerPQKk6.chunk.js → cDv6zuhh.chunk.js} +2 -2
- package/dist/scripts/{DerPQKk6.chunk.js.map → cDv6zuhh.chunk.js.map} +1 -1
- package/dist/scripts/jAtAipGN.chunk.js +2 -0
- package/dist/scripts/{CpsbRDII.chunk.js.map → jAtAipGN.chunk.js.map} +1 -1
- package/dist/scripts/{CXKdMqPJ.chunk.js → pKtXmGbN.chunk.js} +2 -2
- package/dist/scripts/{CXKdMqPJ.chunk.js.map → pKtXmGbN.chunk.js.map} +1 -1
- package/dist/scripts/{DhdM2yGm.chunk.js → qRLSbnEr.chunk.js} +2 -2
- package/dist/scripts/{DhdM2yGm.chunk.js.map → qRLSbnEr.chunk.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/BwBWuxjr2.chunk.js +0 -2
- package/dist/scripts/CCBk_ENs.chunk.js +0 -1
- package/dist/scripts/CpsbRDII.chunk.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DW_sm5se2.chunk.js","names":[],"sources":["../../src/apps/my-shares/hooks/useHardGateInsights.ts","../../src/apps/my-shares/hooks/useInsightEngagement.ts","../../src/apps/my-shares/views/heatmap/InsightsHeatmapView.tsx","../../src/apps/my-shares/views/interactive/overview/InteractiveInsightsOverviewUtils.ts","../../src/apps/my-shares/views/interactive/overview/InteractiveInsightsOverviewView.tsx","../../src/apps/my-shares/views/interactive/questions/InteractiveInsightsQuestionsView.tsx","../../src/apps/my-shares/views/interactive/students/InteractiveInsightsStudentsView.tsx","../../../../libs/shared/src/apps/analytics/components/insights/students-not-watched/InsightStudentsNotWatched.tsx","../../../../libs/shared/src/apps/analytics/components/insights/students-watched/InsightStudentsWatched.tsx","../../src/apps/my-shares/components/video-insights-overview/partial-loading/partial-video-insights-overview.module.scss","../../src/apps/my-shares/components/video-insights-overview/partial-loading/PartialVideoInsightsOverview.tsx","../../src/apps/my-shares/components/video-insights-overview/VideoInsightsOvervew.tsx","../../src/apps/my-shares/views/video/overview/VideoInsightsOverviewUtils.ts","../../src/apps/my-shares/views/video/overview/VideoInsightsOverviewView.tsx","../../src/apps/my-shares/views/base-insights-view/useInsightsView.tsx","../../src/apps/my-shares/views/base-insights-view/BaseInsightsView.tsx"],"sourcesContent":["import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nexport function useHardGateInsights(shareId: string) {\n const { getGatedPermission, isLoaded } = usePermissions();\n\n React.useEffect(() => {\n if (!isLoaded)\n return;\n\n const permission = getGatedPermission(PermissionName.ViewInsights);\n\n if (permission !== 'hard-gate')\n return;\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.HARD_GATE_INSIGHTS,\n args: [shareId]\n });\n }, [isLoaded]);\n}\n","import { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useBatchFetch } from 'libs/shared/hooks/UseBatchFetch';\nimport { Engagement } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport { VideoViewsV2Requests } from 'shared/flight-requests/VideoViewsV2Requests';\n\nimport { useAnonSessions } from 'apps/my-shares/hooks/useAnonSessions';\n\nexport function useInsightEngagement(shareId: string) {\n const [hideStaffResults] = useViewModel<boolean>(SharedViewModelKeys.HIDE_STAFF_RESULTS);\n\n const engagement = Flight.useBasicFetch<Engagement[]>(\n VideoViewsV2Requests.shareHeatMap(shareId)\n );\n\n const anonSessions = useAnonSessions(shareId);\n\n const userIds = engagement.data?.map(u => u.userId).filter(id => !!id) || [];\n const users = useBatchFetch<AnonUser>(userIds, UserRequests.getById);\n\n function getAnonUser(e: Engagement): AnonUser {\n if (e.userId) {\n const user = users.items?.[e.userId];\n\n if (!user)\n return { id: e.userId, deleted: true } as AnonUser;\n\n return user;\n }\n\n const anonSession = anonSessions.items?.[e.sessionId];\n if (anonSession)\n return anonSession;\n\n return { sessionId: e.sessionId } as AnonUser;\n }\n \n const userMap = {\n ...anonSessions.items,\n ...users.items\n };\n\n const filteredEngagement = engagement.data?.filter(e => {\n const user = userMap[e.userId || e.sessionId];\n\n if (!user)\n return e;\n\n // Video views is returning userType as a number - Sha\n const userType = user.userType as unknown as number;\n if (userType === 1 && hideStaffResults)\n return null;\n\n return e;\n }).filter(e => !!e);\n\n const viewers = engagement\n .data?.map(e => ({ ...getAnonUser(e), percentage: e.engagementRate }));\n\n return {\n engagement: filteredEngagement,\n users: viewers,\n hasCompleted: (\n engagement.hasCompleted &&\n anonSessions.hasCompleted &&\n (!userIds?.length || users.hasCompleted)\n )\n };\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { InteractiveResultsRequests } from 'libs/shared/apps/analytics/flight-requests/InteractiveResultsRequests';\nimport { GroupedAnalyticsCount } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { InteractivesPendingReviews } from 'libs/shared/apps/analytics/interfaces/response/InteractivesPendingReviewsResponse';\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share/interfaces/Share';\nimport { ShareHelper } from 'libs/shared/apps/share/utils/ShareHelper';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { MediaIdType } from 'libs/shared/enums/MediaIdType';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { PlayerRequests } from 'libs/shared/flight-requests/PlayerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { useLockContentWidth } from 'libs/shared/hooks/useLockContentWidth';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Classroom, Config, CurrentUser, Engagement, PlayerViewKey, VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { ViewModelKeys } from 'shared/constants/LiteViewModels';\nimport { VideoViewsV2Requests } from 'shared/flight-requests/VideoViewsV2Requests';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { InsightsHeader } from 'apps/my-shares/components/insights-header/InsightsHeader';\nimport { InsightsHeatmap } from 'apps/my-shares/components/insights-heatmap/InsightsHeatmap';\nimport { useHardGateInsights } from 'apps/my-shares/hooks/useHardGateInsights';\nimport { useInsightEngagement } from 'apps/my-shares/hooks/useInsightEngagement';\nimport { useInsightsClassroomStudents } from 'apps/my-shares/hooks/useInsightsClassroomStudents';\nimport { getInsightsInteractiveTabs, getInsightsVideoTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\n\nconst namespace = 'shared.insightsHeatmap';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightsHeatmapViewProps {\n shareId: string;\n}\n\nexport function InsightsHeatmapView(props: InsightsHeatmapViewProps) {\n const [anonymiseUsers] = useViewModel<boolean>(ViewModelKeys.ANONYMISE_USERS);\n const [hideStaffResults] = useViewModel<boolean>(ViewModelKeys.HIDE_STAFF_RESULTS);\n\n useLockContentWidth();\n\n const { hasPermissions, getGatedPermission } = usePermissions();\n\n const share = Flight.useBasicFetch<Share>(ShareRequests.getShare(props.shareId));\n \n const classroomId = ShareHelper.getClassroomIdFromShare(share.data);\n const classroom = Flight.useBasicFetch<Classroom>(classroomId && ClassroomRequests.getClassroom(classroomId));\n\n const classroomStudents = useInsightsClassroomStudents(props.shareId);\n \n const videoRequest = share.data && VideoHelper.getVideoRequest(share.data.objectId, share.data.objectTypeId);\n const video = Flight.useBasicFetch<VideoTypes>(videoRequest);\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const pendingReviewsRequest = VideoHelper.isInteractive(video.data) && InteractiveResultsRequests.pendingReviews({\n interactives: [video.data].map(obj => ({\n interactiveId: obj.interactiveId,\n metadataId: obj.id,\n shareId: props.shareId\n })),\n filters: {\n currentCustomerId: currentUser.data.customerId,\n currentUserId: currentUser.data.id\n }\n });\n const pendingReviews = Flight.useBasicFetch<InteractivesPendingReviews[]>(pendingReviewsRequest);\n const markingRequired = pendingReviews.data?.[0]?.pendingReviewCount > 0;\n\n const aggregateEngagement = Flight.useBasicFetch<Engagement>(\n VideoViewsV2Requests.shareHeatMapAggregation(props.shareId)\n );\n\n const { users, engagement, hasCompleted } = useInsightEngagement(props.shareId);\n\n const yearGroupsCount = Flight.useBasicFetch<GroupedAnalyticsCount[]>(\n VideoViewsV2Requests.shareAggregation(props.shareId, 'year_group')\n );\n\n const viewKey = Flight.useBasicFetch<PlayerViewKey>(\n share.data?.objectId &&\n PlayerRequests.createViewKey(share.data.objectId, MediaIdType.MasterObject)\n );\n\n useSetPageMetadata({ title: video.data ? getPhrase('pageTitle', { video: video.data?.name }) : null });\n useHandleObjectError([ share, video ]);\n useHardGateInsights(props.shareId);\n\n const hasDataLoaded =\n share.hasCompleted &&\n video.hasCompleted &&\n config.hasCompleted &&\n aggregateEngagement.hasCompleted &&\n yearGroupsCount.hasCompleted &&\n viewKey.hasCompleted &&\n yearGroups.hasCompleted;\n\n function getInsightsTabs() {\n if (share.data?.objectTypeId === MasterType.Interactive)\n return getInsightsInteractiveTabs(share.data, 'heatmap');\n\n return getInsightsVideoTabs(share.data, 'heatmap');\n }\n\n return (\n <div className='px-3'>\n <InsightsHeader\n video={video.data}\n tabs={getInsightsTabs()}\n hasSchoolAnalytics={hasPermissions(PermissionName.ViewSchoolAnalytics)}\n analyticsWebUrl={config.data?.analyticsWebUrl}\n share={share.data}\n yearGroups={yearGroups.data}\n classroom={classroom.data}\n markingRequired={markingRequired}\n hasData={!!engagement?.length}\n viewInsightsGatedPermission={getGatedPermission(PermissionName.ViewInsights)}\n />\n <InsightsHeatmap\n aggregateEngagement={aggregateEngagement.data}\n individualEngagement={engagement}\n yearGroups={yearGroupsCount.data}\n config={config.data}\n users={users}\n viewKey={viewKey.data}\n hasDataLoaded={hasDataLoaded}\n tableDataLoaded={hasCompleted}\n anonymiseUsers={anonymiseUsers}\n classroomStudents={classroomStudents.items}\n hideStaffResults={hideStaffResults}\n />\n </div>\n );\n}\n","import { HashObject } from 'libs/common/react/interfaces';\n\nimport { Share } from 'libs/shared/apps/share/interfaces/Share';\n\nimport { getInsightsHeatmapAppLink, getInsightsQuestionsAppLink, getInsightsStudentsAppLink } from 'shared/utils/ObjectAppLinkHelper';\n\nexport function getInteractiveInsightsAppLinks(share: Share, params?: HashObject) {\n return {\n resultsAppLink: getInsightsStudentsAppLink(share, null, params),\n questionsAppLink: getInsightsQuestionsAppLink(share, null, params),\n heatmapAppLink: getInsightsHeatmapAppLink(share, null, params)\n };\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { GroupedAnalyticsCount } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { groupStudents } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share/interfaces/Share';\nimport { ShareHelper } from 'libs/shared/apps/share/utils/ShareHelper';\nimport { ScoreThresholdInsights } from 'libs/shared/constants/ScoreThresholds';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\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 { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { useLockContentWidth } from 'libs/shared/hooks/useLockContentWidth';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Classroom, Config, CurrentUser, Engagement, Interactive, InteractiveMetadata, YearGroup } from 'libs/shared/interfaces';\n\nimport { VideoViewsV2Requests } from 'shared/flight-requests/VideoViewsV2Requests';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { InsightsHeader } from 'apps/my-shares/components/insights-header/InsightsHeader';\nimport { InteractiveInsightsOverview } from 'apps/my-shares/components/interactive-insights-overview/InteractiveInsightsOverview';\nimport { useHardGateInsights } from 'apps/my-shares/hooks/useHardGateInsights';\nimport { useInsightsClassroomStudents } from 'apps/my-shares/hooks/useInsightsClassroomStudents';\nimport { useInsightsInteractiveResults } from 'apps/my-shares/hooks/useInsightsInteractiveResults';\nimport { getInsightsInteractiveTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\nimport { getInteractiveInsightsAppLinks } from 'apps/my-shares/views/interactive/overview/InteractiveInsightsOverviewUtils';\n\nconst namespace = 'insights.interactiveInsightsOverviewView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InteractiveInsightsViewProps {\n shareId: string;\n}\n\nexport function InteractiveInsightsOverviewView(props: InteractiveInsightsViewProps) {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n useLockContentWidth();\n\n const { hasPermissions, getGatedPermission } = usePermissions();\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const share = Flight.useBasicFetch<Share>(ShareRequests.getShare(props.shareId));\n \n const classroomId = ShareHelper.getClassroomIdFromShare(share.data);\n const classroom = Flight.useBasicFetch<Classroom>(classroomId && ClassroomRequests.getClassroom(classroomId));\n\n const classroomStudents = useInsightsClassroomStudents(props.shareId);\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n share.data?.objectId &&\n InteractiveRequests.interactiveMetadata(share.data.objectId)\n );\n\n const interactive = Flight.useBasicFetch<Interactive>(\n interactiveMetadata.data?.interactiveId &&\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId)\n );\n\n const results = useInsightsInteractiveResults(props.shareId);\n\n const engagement = Flight.useBasicFetch<Engagement[]>(\n VideoViewsV2Requests.shareHeatMap(props.shareId)\n );\n\n const aggregateEngagement = Flight.useBasicFetch<Engagement>(\n VideoViewsV2Requests.shareHeatMapAggregation(props.shareId)\n );\n\n const osCount = Flight.useBasicFetch<GroupedAnalyticsCount[]>(\n VideoViewsV2Requests.shareAggregation(props.shareId, 'os_name')\n );\n\n useSetPageMetadata({ title: interactiveMetadata.data ? getPhrase('pageTitle', { video: interactiveMetadata.data?.name }) : null });\n\n useHandleObjectError([ share, interactive, interactiveMetadata ]);\n useHardGateInsights(props.shareId);\n\n const hasDataLoaded =\n config.hasCompleted &&\n interactiveMetadata.hasCompleted &&\n interactive.data &&\n aggregateEngagement.hasCompleted &&\n engagement.hasCompleted &&\n osCount.hasCompleted &&\n results.hasCompleted &&\n yearGroups.hasCompleted;\n\n const interactiveInsightsAppLinks = getInteractiveInsightsAppLinks(share.data);\n\n const studentGroups = hasDataLoaded && groupStudents(interactive.data, results.data, ScoreThresholdInsights);\n const markingRequired = studentGroups && studentGroups.markingRequired.length > 0;\n\n return (\n <div className='px-3'>\n <InsightsHeader\n video={interactiveMetadata.data}\n tabs={getInsightsInteractiveTabs(share.data, 'insights')}\n hasSchoolAnalytics={hasPermissions(PermissionName.ViewSchoolAnalytics)}\n analyticsWebUrl={config.data?.analyticsWebUrl}\n share={share.data}\n yearGroups={yearGroups.data}\n classroom={classroom.data}\n markingRequired={markingRequired}\n hasData={!!results.data?.students.length}\n viewInsightsGatedPermission={getGatedPermission(PermissionName.ViewInsights)}\n />\n\n <InteractiveInsightsOverview\n aggregateEngagement={aggregateEngagement.data}\n individualEngagement={engagement.data}\n interactive={interactive.data}\n interactiveMetadata={interactiveMetadata.data}\n interactiveInsightsAppLinks={interactiveInsightsAppLinks}\n classroomStudents={classroomStudents.items}\n results={results.data}\n osCount={osCount.data}\n config={config.data}\n anonymiseUsers={anonymiseUsers}\n hasDataLoaded={hasDataLoaded}\n share={share.data}\n />\n </div>\n );\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { groupStudents } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { SortStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share/interfaces/Share';\nimport { ShareHelper } from 'libs/shared/apps/share/utils/ShareHelper';\nimport { ScoreThresholdInsights } from 'libs/shared/constants/ScoreThresholds';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\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 { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { useLockContentWidth } from 'libs/shared/hooks/useLockContentWidth';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Classroom, Config, CurrentUser, Interactive, InteractiveMetadata, YearGroup } from 'libs/shared/interfaces';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { InsightsHeader } from 'apps/my-shares/components/insights-header/InsightsHeader';\nimport { InteractiveInsightsQuestions } from 'apps/my-shares/components/interactive-insights-questions/InteractiveInsightsQuestions';\nimport { useHardGateInsights } from 'apps/my-shares/hooks/useHardGateInsights';\nimport { useInsightsInteractiveResults } from 'apps/my-shares/hooks/useInsightsInteractiveResults';\nimport { getInsightsInteractiveTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\n\nconst namespace = 'shared.interactiveInsightsQuestionsView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InteractiveInsightsQuestionsViewProps {\n shareId: string;\n interactionId: string;\n sortBy: SortStudentsBy;\n}\n\nexport function InteractiveInsightsQuestionsView(props: InteractiveInsightsQuestionsViewProps) {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n useLockContentWidth();\n\n const { hasPermissions, getGatedPermission } = usePermissions();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const share = Flight.useBasicFetch<Share>(ShareRequests.getShare(props.shareId));\n \n const classroomId = ShareHelper.getClassroomIdFromShare(share.data);\n const classroom = Flight.useBasicFetch<Classroom>(classroomId && ClassroomRequests.getClassroom(classroomId));\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n share.data?.objectId &&\n InteractiveRequests.interactiveMetadata(share.data?.objectId)\n );\n\n const interactive = Flight.useBasicFetch<Interactive>(interactiveMetadata.data?.interactiveId &&\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId));\n\n const results = useInsightsInteractiveResults(props.shareId);\n\n useSetPageMetadata({ title: interactiveMetadata.data ? getPhrase('pageTitle', { video: interactiveMetadata.data?.name }) : null });\n useHandleObjectError([ share, interactive, interactiveMetadata ]);\n useHardGateInsights(props.shareId);\n\n const hasDataLoaded = interactive.data && interactiveMetadata.data && !!results.data && !!yearGroups.data;\n \n const studentGroups = hasDataLoaded && groupStudents(interactive.data, results.data, ScoreThresholdInsights);\n const markingRequired = studentGroups && studentGroups.markingRequired.length > 0;\n\n return (\n <div className='px-3'>\n <InsightsHeader\n tabs={getInsightsInteractiveTabs(share.data, 'questions')}\n video={interactiveMetadata.data}\n hasSchoolAnalytics={hasPermissions(PermissionName.ViewSchoolAnalytics)}\n analyticsWebUrl={config.data?.analyticsWebUrl}\n share={share.data}\n yearGroups={yearGroups.data}\n classroom={classroom.data}\n markingRequired={markingRequired}\n hasData={!!results.data?.students.length}\n viewInsightsGatedPermission={getGatedPermission(PermissionName.ViewInsights)}\n />\n\n <InteractiveInsightsQuestions\n interactive={interactive.data}\n interactiveMetadata={interactiveMetadata.data}\n interactionId={props.interactionId}\n config={config.data}\n sortBy={props.sortBy}\n isFetching={!results.hasCompleted || interactive.isFetching}\n anonymiseUsers={anonymiseUsers}\n results={results.data}\n hasDataLoaded={hasDataLoaded}\n />\n </div>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { groupStudents } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { FilterStudentsBy, SortStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share/interfaces/Share';\nimport { ShareHelper } from 'libs/shared/apps/share/utils/ShareHelper';\nimport { ScoreThresholdInsights } from 'libs/shared/constants/ScoreThresholds';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\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 { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Classroom, Config, CurrentUser, Interactive, InteractiveMetadata, YearGroup } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { InsightsHeader } from 'apps/my-shares/components/insights-header/InsightsHeader';\nimport { InteractiveInsightsStudents } from 'apps/my-shares/components/interactive-insights-students/InteractiveInsightsStudents';\nimport { useHardGateInsights } from 'apps/my-shares/hooks/useHardGateInsights';\nimport { useInsightsInteractiveResults } from 'apps/my-shares/hooks/useInsightsInteractiveResults';\nimport { getInsightsInteractiveTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\n\nconst namespace = 'insights.interactiveInsightsStudents';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InteractiveInsightsStudentsViewProps {\n shareId: string;\n sortBy: SortStudentsBy;\n filterBy: FilterStudentsBy;\n}\n\nexport function InteractiveInsightsStudentsView(props: InteractiveInsightsStudentsViewProps) {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n const [hideStaffResults] = useViewModel<boolean>(SharedViewModelKeys.HIDE_STAFF_RESULTS);\n\n const { hasPermissions, getGatedPermission } = usePermissions();\n \n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const share = Flight.useBasicFetch<Share>(ShareRequests.getShare(props.shareId));\n \n const classroomId = ShareHelper.getClassroomIdFromShare(share.data);\n const classroom = Flight.useBasicFetch<Classroom>(classroomId && ClassroomRequests.getClassroom(classroomId));\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n share.data?.objectId &&\n InteractiveRequests.interactiveMetadata(share.data.objectId)\n );\n\n const interactive = Flight.useBasicFetch<Interactive>(interactiveMetadata.data?.interactiveId &&\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId));\n\n const results = useInsightsInteractiveResults(props.shareId);\n\n const hasDataLoaded = interactive.data && interactiveMetadata.data && !!results.data && !!yearGroups.data;\n\n const studentGroups = hasDataLoaded && groupStudents(interactive.data, results.data, ScoreThresholdInsights);\n const markingRequired = studentGroups && studentGroups.markingRequired.length > 0;\n\n useSetPageMetadata({ title: interactiveMetadata.data ? getPhrase('pageTitle', { video: interactiveMetadata.data?.name }) : null });\n useHandleObjectError([ share, interactive, interactiveMetadata ]);\n useHardGateInsights(props.shareId);\n\n function viewStudentResults(\n user: AnonUser,\n interactiveMetadataId: string,\n interactionId?: string\n ) {\n Core.AppLinkHelper.trigger({\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_STUDENT_RESULTS,\n params: {\n studentId: user.id,\n shareId: props.shareId,\n interactionId,\n sessionId: user.sessionId\n }\n });\n }\n\n return (\n <div className='px-3'>\n <InsightsHeader\n tabs={getInsightsInteractiveTabs(share.data, 'results')}\n video={interactiveMetadata.data}\n hasSchoolAnalytics={hasPermissions(PermissionName.ViewSchoolAnalytics)}\n analyticsWebUrl={config.data?.analyticsWebUrl}\n share={share.data}\n yearGroups={yearGroups.data}\n classroom={classroom.data}\n markingRequired={markingRequired}\n hasData={!!results.data?.students.length}\n viewInsightsGatedPermission={getGatedPermission(PermissionName.ViewInsights)}\n />\n\n <InteractiveInsightsStudents\n interactiveMetadata={interactiveMetadata.data}\n viewStudentResults={viewStudentResults}\n interactive={interactive.data}\n results={results.data}\n filterBy={props.filterBy}\n sortBy={props.sortBy}\n // Must be isFetching, not hasCompleted, as we need to refresh the table when the results are updated\n isFetching={results.isFetching}\n anonymiseUsers={anonymiseUsers}\n hasDataLoaded={hasDataLoaded}\n config={config.data}\n hideStaffResults={hideStaffResults}\n />\n </div>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightStudentList } from 'libs/shared/apps/analytics/components/insight-student-list/InsightStudentList';\nimport { PuzzleSvg } from 'libs/shared/images/svg/objects/PuzzleSvg';\nimport { User } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.insightStudentsNotWatched';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightStudentsNotWatchedProps {\n students: User[];\n imageCdnUrl: string;\n imageUrl: string;\n heatmapAppLink: Core.AppLink;\n watchedIds: string[];\n anonymiseUsers: boolean;\n}\n\nexport function InsightStudentsNotWatched(props: InsightStudentsNotWatchedProps) {\n const studentsNotWatched = props.students?.filter(student => !props.watchedIds?.includes(student.id)) || [];\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svg={PuzzleSvg}\n svgClassName='bg-light-teal text-teal'\n >\n <InsightStudentList\n students={studentsNotWatched}\n imageCdnUrl={props.imageCdnUrl}\n imageUrl={props.imageUrl}\n description={getPhrase('studentsDisplay')}\n anonymiseUsers={props.anonymiseUsers}\n />\n </InsightCard>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightStudentList } from 'libs/shared/apps/analytics/components/insight-student-list/InsightStudentList';\nimport { FlagSvg } from 'libs/shared/images/svg/objects/FlagSvg';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nconst namespace = 'shared.insightStudentsWatched';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightWatchedProps {\n students: AnonUser[];\n imageCdnUrl: string;\n heatmapAppLink: Core.AppLink;\n imageUrl: string;\n anonymiseUsers: boolean;\n}\n\nexport function InsightStudentsWatched(props: InsightWatchedProps) {\n return (\n <InsightCard\n title={getPhrase('title')}\n svg={FlagSvg}\n svgClassName='bg-light-indigo text-indigo'\n count={props.students.length}\n >\n <InsightStudentList\n students={props.students}\n imageCdnUrl={props.imageCdnUrl}\n imageUrl={props.imageUrl}\n description={getPhrase('studentsDisplay')}\n appLink={props.heatmapAppLink}\n appLinkText={getPhrase('viewAll')}\n anonymiseUsers={props.anonymiseUsers}\n />\n </InsightCard>\n );\n}\n",":local {\n .partialInsights {\n height: 12.5rem;\n }\n}","import React from 'react';\n\nimport styles from './partial-video-insights-overview.module.scss';\n\nexport function PartialVideoInsightsOverview() {\n return (\n <div>\n <h2 className='h4 w-25 partial-loading-background'> </h2>\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\n <h2 className='h4 w-25 partial-loading-background'> </h2>\n <div className='row g-3 mb-5'>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n </div>\n </div>\n );\n}\n","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { InsightDevices } from 'libs/shared/apps/analytics/components/insights/devices/InsightDevices';\nimport { InsightHeatmap } from 'libs/shared/apps/analytics/components/insights/heatmap/InsightHeatmap';\nimport { InsightStudentsNotWatched } from 'libs/shared/apps/analytics/components/insights/students-not-watched/InsightStudentsNotWatched';\nimport { InsightStudentsWatched } from 'libs/shared/apps/analytics/components/insights/students-watched/InsightStudentsWatched';\nimport { GroupedAnalyticsCount } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { getEngagementRate } from 'libs/shared/apps/analytics/utils/EngagementUtils';\nimport { Share } from 'libs/shared/apps/share/interfaces/Share';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Config, Engagement, User, Video } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport { InsightsShareMask } from 'apps/my-shares/components/insights-mask/InsightsShareMask';\nimport { PartialVideoInsightsOverview } from 'apps/my-shares/components/video-insights-overview/partial-loading/PartialVideoInsightsOverview';\n\nconst namespace = 'insights.videoInsightsOverview';\n\ninterface VideoInsightsOverviewProps {\n hasDataLoaded: boolean;\n hasClassrooms: boolean;\n anonymiseUsers: boolean;\n videoInsightsAppLinks: HashObject;\n config: Config;\n video: Video;\n classroomStudents: User[];\n viewers: AnonUser[];\n individualEngagement: Engagement[];\n aggregateEngagement: Engagement;\n share: Share;\n osCount: GroupedAnalyticsCount[];\n}\n\nexport function VideoInsightsOverview(props: VideoInsightsOverviewProps) {\n const hasData = props.hasDataLoaded && !!props.viewers?.length;\n\n function getStudentsList() {\n if (!props.viewers) return [];\n\n return Object.values(props.viewers);\n }\n\n return (\n <>\n {!props.hasDataLoaded && <PartialVideoInsightsOverview />}\n\n {props.hasDataLoaded &&\n <InsightsShareMask video={props.video} hasData={hasData} share={props.share}>\n <section className='mb-5'>\n <h2 className='h4'>\n <Text namespace={namespace} phrase='studentViewing' />\n <span>: {getStudentsList().length}{props.classroomStudents ? `/${props.classroomStudents.length}` : ''}</span>\n </h2>\n <div className='row g-3'>\n {!!props.classroomStudents?.length && (\n <div className='col-12 col-md'>\n <InsightStudentsNotWatched\n students={props.classroomStudents}\n watchedIds={props.viewers?.map(u => u.id)}\n imageCdnUrl={props.config.imageCdnUrl}\n heatmapAppLink={props.videoInsightsAppLinks.heatmapAppLink}\n imageUrl={ImageUrls.Insights.AVATAR}\n anonymiseUsers={props.anonymiseUsers}\n />\n </div>\n )}\n <div className='col-12 col-md'>\n <InsightStudentsWatched\n students={getStudentsList()}\n imageCdnUrl={props.config.imageCdnUrl}\n heatmapAppLink={props.videoInsightsAppLinks.heatmapAppLink}\n imageUrl={ImageUrls.Insights.AVATAR}\n anonymiseUsers={props.anonymiseUsers}\n />\n </div>\n </div>\n </section>\n <section className='mb-5'>\n <h2 className='h4'>\n <Text\n namespace={namespace}\n phrase={props.hasClassrooms ? 'classEngagement' : 'engagement'}\n />\n </h2>\n <div className='row g-3'>\n <div className='col-12 col-md-6'>\n <InsightDevices\n osCount={props.osCount}\n />\n </div>\n <div className='col-12 col-md-6'>\n <InsightHeatmap\n engagement={props.aggregateEngagement}\n heatmapAppLink={props.videoInsightsAppLinks.heatmapAppLink}\n engagementRate={getEngagementRate(props.individualEngagement)}\n />\n </div>\n </div>\n </section>\n </InsightsShareMask>\n }\n </>\n );\n}\n","import { HashObject } from 'libs/common/react/interfaces';\n\nimport { Share } from 'libs/shared/apps/share/interfaces/Share';\n\nimport { getInsightsHeatmapAppLink } from 'shared/utils/ObjectAppLinkHelper';\n\nexport function getVideoInsightsAppLinks(share: Share, params?: HashObject) {\n return {\n heatmapAppLink: getInsightsHeatmapAppLink(share, null, params)\n };\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { GroupedAnalyticsCount } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share/interfaces/Share';\nimport { ShareHelper } from 'libs/shared/apps/share/utils/ShareHelper';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { useLockContentWidth } from 'libs/shared/hooks/useLockContentWidth';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Classroom, Config, CurrentUser, Engagement, VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { VideoViewsV2Requests } from 'shared/flight-requests/VideoViewsV2Requests';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { InsightsHeader } from 'apps/my-shares/components/insights-header/InsightsHeader';\nimport { VideoInsightsOverview } from 'apps/my-shares/components/video-insights-overview/VideoInsightsOvervew';\nimport { useHardGateInsights } from 'apps/my-shares/hooks/useHardGateInsights';\nimport { useInsightEngagement } from 'apps/my-shares/hooks/useInsightEngagement';\nimport { useInsightsClassroomStudents } from 'apps/my-shares/hooks/useInsightsClassroomStudents';\nimport { getInsightsVideoTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\nimport { getVideoInsightsAppLinks } from 'apps/my-shares/views/video/overview/VideoInsightsOverviewUtils';\n\nconst namespace = 'insights.videoInsightsOverviewView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface VideoInsightsViewProps {\n shareId: string;\n}\n\nexport function VideoInsightsOverviewView(props: VideoInsightsViewProps) {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n useLockContentWidth();\n\n const { hasClassrooms } = useSettings(null);\n\n const { hasPermissions, getGatedPermission } = usePermissions();\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const share = Flight.useBasicFetch<Share>(ShareRequests.getShare(props.shareId));\n\n const classroomId = ShareHelper.getClassroomIdFromShare(share.data);\n const classroom = Flight.useBasicFetch<Classroom>(classroomId && ClassroomRequests.getClassroom(classroomId));\n\n const classroomStudents = useInsightsClassroomStudents(props.shareId);\n\n const videoRequest = share.data && VideoHelper.getVideoRequest(share.data.objectId, share.data.objectTypeId);\n const video = Flight.useBasicFetch<VideoTypes>(videoRequest);\n\n useSetPageMetadata({ title: video.data ? getPhrase('pageTitle', { video: video.data?.name }) : null });\n useHandleObjectError([ share, video ]);\n useHardGateInsights(props.shareId);\n\n const engagement = Flight.useBasicFetch<Engagement[]>(\n VideoViewsV2Requests.shareHeatMap(props.shareId)\n );\n\n const aggregateEngagement = Flight.useBasicFetch<Engagement>(\n VideoViewsV2Requests.shareHeatMapAggregation(props.shareId)\n );\n\n const osCount = Flight.useBasicFetch<GroupedAnalyticsCount[]>(\n VideoViewsV2Requests.shareAggregation(props.shareId, 'os_name')\n );\n\n const { users, hasCompleted } = useInsightEngagement(props.shareId);\n \n const hasDataLoaded =\n config.hasCompleted &&\n video.hasCompleted &&\n engagement.hasCompleted &&\n aggregateEngagement.hasCompleted &&\n osCount.hasCompleted &&\n yearGroups.data &&\n hasCompleted;\n\n const videoInsightsAppLinks = getVideoInsightsAppLinks(share.data);\n\n return (\n <div className='px-3'>\n <InsightsHeader\n video={video.data}\n classroom={classroom.data}\n tabs={getInsightsVideoTabs(share.data, 'insights')}\n hasSchoolAnalytics={hasPermissions(PermissionName.ViewSchoolAnalytics)}\n analyticsWebUrl={config.data?.analyticsWebUrl}\n share={share.data}\n yearGroups={yearGroups.data}\n hasData={hasDataLoaded && !!users?.length}\n viewInsightsGatedPermission={getGatedPermission(PermissionName.ViewInsights)}\n />\n\n <VideoInsightsOverview\n hasDataLoaded={!!hasDataLoaded}\n hasClassrooms={hasClassrooms}\n anonymiseUsers={anonymiseUsers}\n videoInsightsAppLinks={videoInsightsAppLinks}\n config={config.data}\n video={video.data}\n classroomStudents={classroomStudents.items}\n viewers={users}\n individualEngagement={engagement.data}\n aggregateEngagement={aggregateEngagement.data}\n share={share.data}\n osCount={osCount.data}\n />\n </div>\n );\n}\n","import React from 'react';\n\nimport { FilterStudentsBy, SortStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { Share } from 'libs/shared/apps/share/interfaces/Share';\nimport { MasterType } from 'libs/shared/enums/MasterType';\n\nimport { InsightsTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\nimport { InsightsHeatmapView } from 'apps/my-shares/views/heatmap/InsightsHeatmapView';\nimport { InteractiveInsightsOverviewView } from 'apps/my-shares/views/interactive/overview/InteractiveInsightsOverviewView';\nimport { InteractiveInsightsQuestionsView } from 'apps/my-shares/views/interactive/questions/InteractiveInsightsQuestionsView';\nimport { InteractiveInsightsStudentsView } from 'apps/my-shares/views/interactive/students/InteractiveInsightsStudentsView';\nimport { VideoInsightsOverviewView } from 'apps/my-shares/views/video/overview/VideoInsightsOverviewView';\n\ninterface UseInsightsViewOptions {\n share: Share | undefined;\n tab: InsightsTabs;\n interactionId: string;\n sortBy: SortStudentsBy;\n filterBy: FilterStudentsBy;\n}\n\ntype ShareContext = Omit<UseInsightsViewOptions, 'tab'>;\ntype ViewFn = (ctx: ShareContext) => JSX.Element;\ntype ViewRegistry = Partial<Record<MasterType, Partial<Record<InsightsTabs, ViewFn>>>>;\n\nconst INSIGHTS_VIEWS: ViewRegistry = {\n [MasterType.Video]: {\n insights: ctx => <VideoInsightsOverviewView shareId={ctx.share.shareId} />,\n heatmap: ctx => <InsightsHeatmapView shareId={ctx.share.shareId} />\n },\n [MasterType.Clip]: {\n insights: ctx => <VideoInsightsOverviewView shareId={ctx.share.shareId} />,\n heatmap: ctx => <InsightsHeatmapView shareId={ctx.share.shareId} />\n },\n [MasterType.Interactive]: {\n insights: ctx => <InteractiveInsightsOverviewView shareId={ctx.share.shareId} />,\n heatmap: ctx => <InsightsHeatmapView shareId={ctx.share.shareId} />,\n questions: ctx => (\n <InteractiveInsightsQuestionsView\n interactionId={ctx.interactionId}\n sortBy={ctx.sortBy}\n shareId={ctx.share.shareId}\n />\n ),\n results: ctx => (\n <InteractiveInsightsStudentsView\n filterBy={ctx.filterBy}\n sortBy={ctx.sortBy}\n shareId={ctx.share.shareId}\n />\n )\n }\n};\n\n/**\n * Takes any Share object and a tab, and returns the corresponding \"insights\" view.\n * This is just a utility hook, and as such doesn't need to set the page title directly.\n */\n// eslint-disable-next-line rulesdir/require-view-title\nexport function useInsightsView(options: UseInsightsViewOptions): JSX.Element {\n const { share, tab } = options;\n const viewFn = INSIGHTS_VIEWS[share?.objectTypeId]?.[tab];\n\n if (viewFn)\n return viewFn(options);\n\n return <></>;\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { Flight } from 'libs/common/react/index';\n\nimport { FilterStudentsBy, SortStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share/interfaces/Share';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { getShareOptionsAppLink } from 'shared/utils/ObjectAppLinkHelper';\n\nimport { InsightsTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\nimport { useInsightsView } from 'apps/my-shares/views/base-insights-view/useInsightsView';\n\ninterface BaseInsightsViewProps {\n shareId: string;\n tab: InsightsTabs;\n interactionId: string;\n sortBy: SortStudentsBy;\n filterBy: FilterStudentsBy;\n showShareOptions?: boolean;\n}\n\n/**\n * BaseInsightsView is a generic component that renders different \"insights\" views based on the provided share.\n * The child views will handle setting the page title and other specific details.\n * \n * It also handles the logic for showing share options if `showShareOptions` is true - which is currently used\n * in our used in our LCE emails.\n */\n// eslint-disable-next-line rulesdir/require-view-title\nexport function BaseInsightsView(props: BaseInsightsViewProps): JSX.Element {\n const share = Flight.useBasicFetch<Share>(ShareRequests.getShare(props.shareId));\n const { hasPermissions, isLoaded } = usePermissions();\n\n const view = useInsightsView({\n share: share.data,\n tab: props.tab,\n interactionId: props.interactionId,\n sortBy: props.sortBy,\n filterBy: props.filterBy\n });\n\n /**\n * If the showShareOptions is in the query params, we also want to show the share popup.\n */\n React.useEffect(() => {\n if (!props.showShareOptions) return;\n if (!share.data) return;\n\n const appLink = getShareOptionsAppLink(share.data);\n \n if (!appLink) return;\n\n Core.AppLinkHelper.trigger(appLink);\n }, [ share.data, props.showShareOptions ]);\n\n /**\n * If the user doesn't have insights permissions, redirect to the insights overview page.\n */\n React.useEffect(() => {\n if (!isLoaded) return;\n if (hasPermissions([ PermissionName.ViewInsights, PermissionName.ViewAnalytics ])) return;\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.HOME\n });\n }, [isLoaded]);\n \n if (!isLoaded)\n return <></>;\n\n return (\n <>\n {view}\n </>\n );\n}\n"],"mappings":"qzDAUA,SAAgB,EAAoB,EAAiB,CACnD,GAAM,CAAE,qBAAoB,YAAa,EAAe,EAExD,EAAM,cAAgB,CACf,GAGc,EAAmB,EAAe,YAEjD,IAAe,aAGnB,EAAmB,QAAQ,CACzB,YAAa,EAAY,UACzB,OAAQ,EAAQ,SAAS,mBACzB,KAAM,CAAC,CAAO,CAChB,CAAC,CACH,EAAG,CAAC,CAAQ,CAAC,CACf,CCfA,SAAgB,GAAqB,EAAiB,CACpD,GAAM,CAAC,GAAoB,EAAsB,EAAoB,kBAAkB,EAEjF,EAAa,EACjB,EAAqB,aAAa,CAAO,CAC3C,EAEM,EAAe,EAAgB,CAAO,EAEtC,EAAU,EAAW,MAAM,IAAI,GAAK,EAAE,MAAM,CAAC,CAAC,OAAO,GAAM,CAAC,CAAC,CAAE,GAAK,CAAC,EACrE,EAAQ,EAAwB,EAAS,EAAa,OAAO,EAEnE,SAAS,EAAY,EAAyB,CAc5C,OAbI,EAAE,OACS,EAAM,QAAQ,EAAE,SAGpB,CAAE,GAAI,EAAE,OAAQ,QAAS,EAAK,EAKrB,EAAa,QAAQ,EAAE,YAIpC,CAAE,UAAW,EAAE,SAAU,CAClC,CAEA,IAAM,EAAU,CACd,GAAG,EAAa,MAChB,GAAG,EAAM,KACX,EAmBA,MAAO,CACL,WAlByB,EAAW,MAAM,OAAO,GAAK,CACtD,IAAM,EAAO,EAAQ,EAAE,QAAU,EAAE,WAUnC,OARK,GAIY,EAAK,WACL,GAAK,EACb,KAEF,CACT,CAAC,CAAC,CAAC,OAAO,GAAK,CAAC,CAAC,CAAC,EAOhB,MALc,EACb,MAAM,IAAI,IAAM,CAAE,GAAG,EAAY,CAAC,EAAG,WAAY,EAAE,cAAe,EAAE,EAKrE,aACE,EAAW,cACX,EAAa,eACZ,CAAC,GAAS,QAAU,EAAM,aAE/B,CACF,WCnCM,GAAY,EAAgB,iBAAiB,wBAAS,EAM5D,SAAgB,EAAoB,EAAiC,CACnE,GAAM,CAAC,GAAkB,EAAsB,EAAc,eAAe,EACtE,CAAC,GAAoB,EAAsB,EAAc,kBAAkB,EAEjF,EAAoB,EAEpB,GAAM,CAAE,iBAAgB,sBAAuB,EAAe,EAExD,EAAQ,EAA4B,EAAc,SAAS,EAAM,OAAO,CAAC,EAEzE,EAAc,EAAY,wBAAwB,EAAM,IAAI,EAC5D,EAAY,EAAgC,GAAe,EAAkB,aAAa,CAAW,CAAC,EAEtG,EAAoB,EAA6B,EAAM,OAAO,EAG9D,EAAQ,EADO,EAAM,MAAQ,EAAY,gBAAgB,EAAM,KAAK,SAAU,EAAM,KAAK,YAAY,CAChD,EAErD,EAAS,EAA6B,EAAe,OAAO,CAAC,EAC7D,EAAc,EAAkC,EAAa,YAAY,CAAC,EAC1E,EAAa,EACjB,EAAY,MAAQ,EAAiB,WAAW,EAAY,KAAK,UAAU,CAC7E,EAcM,EADiB,EAXO,EAAY,cAAc,EAAM,IAAI,GAAK,EAA2B,eAAe,CAC/G,aAAc,CAAC,EAAM,IAAI,CAAC,CAAC,IAAI,IAAQ,CACrC,cAAe,EAAI,cACnB,WAAY,EAAI,GAChB,QAAS,EAAM,OACjB,EAAE,EACF,QAAS,CACP,kBAAmB,EAAY,KAAK,WACpC,cAAe,EAAY,KAAK,EAClC,CACF,CAAC,CAEuB,CAAA,CAAe,OAAO,EAAE,EAAE,mBAAqB,EAEjE,EAAsB,EAC1B,EAAqB,wBAAwB,EAAM,OAAO,CAC5D,EAEM,CAAE,QAAO,aAAY,gBAAiB,GAAqB,EAAM,OAAO,EAExE,EAAkB,EACtB,EAAqB,iBAAiB,EAAM,QAAS,YAAY,CACnE,EAEM,EAAU,EACd,EAAM,MAAM,UACZ,EAAe,cAAc,EAAM,KAAK,SAAU,EAAY,YAAY,CAC5E,EAEA,EAAmB,CAAE,MAAO,EAAM,KAAO,GAAU,YAAa,CAAE,MAAO,EAAM,MAAM,IAAK,CAAC,EAAI,IAAK,CAAC,EACrG,EAAqB,CAAE,EAAO,CAAM,CAAC,EACrC,EAAoB,EAAM,OAAO,EAEjC,IAAM,EACJ,EAAM,cACN,EAAM,cACN,EAAO,cACP,EAAoB,cACpB,EAAgB,cAChB,EAAQ,cACR,EAAW,aAEb,SAAS,GAAkB,CAIzB,OAHI,EAAM,MAAM,eAAiB,EAAW,YACnC,EAA2B,EAAM,KAAM,SAAS,EAElD,EAAqB,EAAM,KAAM,SAAS,CACnD,CAEA,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,gBAAf,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,MAAO,EAAM,KACb,KAAM,EAAgB,EACtB,mBAAoB,EAAe,EAAe,mBAAmB,EACrE,gBAAiB,EAAO,MAAM,gBAC9B,MAAO,EAAM,KACb,WAAY,EAAW,KACvB,UAAW,EAAU,KACJ,kBACjB,QAAS,CAAC,CAAC,GAAY,OACvB,4BAA6B,EAAmB,EAAe,YAAY,CAC5E,CAAA,GACD,EAAA,EAAA,IAAA,CAAC,GAAD,CACE,oBAAqB,EAAoB,KACzC,qBAAsB,EACtB,WAAY,EAAgB,KAC5B,OAAQ,EAAO,KACR,QACP,QAAS,EAAQ,KACF,gBACf,gBAAiB,EACD,iBAChB,kBAAmB,EAAkB,MACnB,kBACnB,CAAA,CACE,GAET,CC5IA,SAAgB,GAA+B,EAAc,EAAqB,CAChF,MAAO,CACL,eAAgB,EAA2B,EAAO,KAAM,CAAM,EAC9D,iBAAkB,EAA4B,EAAO,KAAM,CAAM,EACjE,eAAgB,EAA0B,EAAO,KAAM,CAAM,CAC/D,CACF,CCwBA,IAAM,GAAY,EAAgB,iBAAiB,0CAAS,EAM5D,SAAgB,GAAgC,EAAqC,CACnF,GAAM,CAAC,GAAkB,EAAsB,EAAoB,eAAe,EAElF,EAAoB,EAEpB,GAAM,CAAE,iBAAgB,sBAAuB,EAAe,EAExD,EAAS,EAA6B,EAAe,OAAO,CAAC,EAC7D,EAAc,EAAkC,EAAa,YAAY,CAAC,EAC1E,EAAa,EACjB,EAAY,MAAQ,EAAiB,WAAW,EAAY,KAAK,UAAU,CAC7E,EAEM,EAAQ,EAA4B,EAAc,SAAS,EAAM,OAAO,CAAC,EAEzE,EAAc,EAAY,wBAAwB,EAAM,IAAI,EAC5D,EAAY,EAAgC,GAAe,EAAkB,aAAa,CAAW,CAAC,EAEtG,EAAoB,EAA6B,EAAM,OAAO,EAE9D,EAAsB,EAC1B,EAAM,MAAM,UACZ,EAAoB,oBAAoB,EAAM,KAAK,QAAQ,CAC7D,EAEM,EAAc,EAClB,EAAoB,MAAM,eAC1B,EAAoB,YAAY,EAAoB,KAAK,aAAa,CACxE,EAEM,EAAU,EAA8B,EAAM,OAAO,EAErD,EAAa,EACjB,EAAqB,aAAa,EAAM,OAAO,CACjD,EAEM,EAAsB,EAC1B,EAAqB,wBAAwB,EAAM,OAAO,CAC5D,EAEM,EAAU,EACd,EAAqB,iBAAiB,EAAM,QAAS,SAAS,CAChE,EAEA,EAAmB,CAAE,MAAO,EAAoB,KAAO,GAAU,YAAa,CAAE,MAAO,EAAoB,MAAM,IAAK,CAAC,EAAI,IAAK,CAAC,EAEjI,EAAqB,CAAE,EAAO,EAAa,CAAoB,CAAC,EAChE,EAAoB,EAAM,OAAO,EAEjC,IAAM,EACJ,EAAO,cACP,EAAoB,cACpB,EAAY,MACZ,EAAoB,cACpB,EAAW,cACX,EAAQ,cACR,EAAQ,cACR,EAAW,aAEP,EAA8B,GAA+B,EAAM,IAAI,EAEvE,EAAgB,GAAiB,EAAc,EAAY,KAAM,EAAQ,KAAM,CAAsB,EACrG,EAAkB,GAAiB,EAAc,gBAAgB,OAAS,EAEhF,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,gBAAf,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,MAAO,EAAoB,KAC3B,KAAM,EAA2B,EAAM,KAAM,UAAU,EACvD,mBAAoB,EAAe,EAAe,mBAAmB,EACrE,gBAAiB,EAAO,MAAM,gBAC9B,MAAO,EAAM,KACb,WAAY,EAAW,KACvB,UAAW,EAAU,KACJ,kBACjB,QAAS,CAAC,CAAC,EAAQ,MAAM,SAAS,OAClC,4BAA6B,EAAmB,EAAe,YAAY,CAC5E,CAAA,GAED,EAAA,EAAA,IAAA,CAAC,GAAD,CACE,oBAAqB,EAAoB,KACzC,qBAAsB,EAAW,KACjC,YAAa,EAAY,KACzB,oBAAqB,EAAoB,KACZ,8BAC7B,kBAAmB,EAAkB,MACrC,QAAS,EAAQ,KACjB,QAAS,EAAQ,KACjB,OAAQ,EAAO,KACC,iBACD,gBACf,MAAO,EAAM,IACd,CAAA,CACE,GAET,CCzGA,IAAM,GAAY,EAAgB,iBAAiB,yCAAS,EAQ5D,SAAgB,GAAiC,EAA8C,CAC7F,GAAM,CAAC,GAAkB,EAAsB,EAAoB,eAAe,EAElF,EAAoB,EAEpB,GAAM,CAAE,iBAAgB,sBAAuB,EAAe,EAExD,EAAc,EAAkC,EAAa,YAAY,CAAC,EAC1E,EAAS,EAA6B,EAAe,OAAO,CAAC,EAC7D,EAAa,EACjB,EAAY,MAAQ,EAAiB,WAAW,EAAY,KAAK,UAAU,CAC7E,EAEM,EAAQ,EAA4B,EAAc,SAAS,EAAM,OAAO,CAAC,EAEzE,EAAc,EAAY,wBAAwB,EAAM,IAAI,EAC5D,EAAY,EAAgC,GAAe,EAAkB,aAAa,CAAW,CAAC,EAEtG,EAAsB,EAC1B,EAAM,MAAM,UACZ,EAAoB,oBAAoB,EAAM,MAAM,QAAQ,CAC9D,EAEM,EAAc,EAAkC,EAAoB,MAAM,eAC9E,EAAoB,YAAY,EAAoB,KAAK,aAAa,CAAC,EAEnE,EAAU,EAA8B,EAAM,OAAO,EAE3D,EAAmB,CAAE,MAAO,EAAoB,KAAO,GAAU,YAAa,CAAE,MAAO,EAAoB,MAAM,IAAK,CAAC,EAAI,IAAK,CAAC,EACjI,EAAqB,CAAE,EAAO,EAAa,CAAoB,CAAC,EAChE,EAAoB,EAAM,OAAO,EAEjC,IAAM,EAAgB,EAAY,MAAQ,EAAoB,MAAQ,CAAC,CAAC,EAAQ,MAAQ,CAAC,CAAC,EAAW,KAE/F,EAAgB,GAAiB,EAAc,EAAY,KAAM,EAAQ,KAAM,CAAsB,EACrG,EAAkB,GAAiB,EAAc,gBAAgB,OAAS,EAEhF,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,gBAAf,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,KAAM,EAA2B,EAAM,KAAM,WAAW,EACxD,MAAO,EAAoB,KAC3B,mBAAoB,EAAe,EAAe,mBAAmB,EACrE,gBAAiB,EAAO,MAAM,gBAC9B,MAAO,EAAM,KACb,WAAY,EAAW,KACvB,UAAW,EAAU,KACJ,kBACjB,QAAS,CAAC,CAAC,EAAQ,MAAM,SAAS,OAClC,4BAA6B,EAAmB,EAAe,YAAY,CAC5E,CAAA,GAED,EAAA,EAAA,IAAA,CAAC,GAAD,CACE,YAAa,EAAY,KACzB,oBAAqB,EAAoB,KACzC,cAAe,EAAM,cACrB,OAAQ,EAAO,KACf,OAAQ,EAAM,OACd,WAAY,CAAC,EAAQ,cAAgB,EAAY,WACjC,iBAChB,QAAS,EAAQ,KACF,eAChB,CAAA,CACE,GAET,CCrEA,IAAM,GAAY,EAAgB,iBAAiB,sCAAS,EAQ5D,SAAgB,GAAgC,EAA6C,CAC3F,GAAM,CAAC,GAAkB,EAAsB,EAAoB,eAAe,EAC5E,CAAC,GAAoB,EAAsB,EAAoB,kBAAkB,EAEjF,CAAE,iBAAgB,sBAAuB,EAAe,EAExD,EAAc,EAAkC,EAAa,YAAY,CAAC,EAC1E,EAAS,EAA6B,EAAe,OAAO,CAAC,EAC7D,EAAa,EACjB,EAAY,MAAQ,EAAiB,WAAW,EAAY,KAAK,UAAU,CAC7E,EAEM,EAAQ,EAA4B,EAAc,SAAS,EAAM,OAAO,CAAC,EAEzE,EAAc,EAAY,wBAAwB,EAAM,IAAI,EAC5D,EAAY,EAAgC,GAAe,EAAkB,aAAa,CAAW,CAAC,EAEtG,EAAsB,EAC1B,EAAM,MAAM,UACZ,EAAoB,oBAAoB,EAAM,KAAK,QAAQ,CAC7D,EAEM,EAAc,EAAkC,EAAoB,MAAM,eAC9E,EAAoB,YAAY,EAAoB,KAAK,aAAa,CAAC,EAEnE,EAAU,EAA8B,EAAM,OAAO,EAErD,EAAgB,EAAY,MAAQ,EAAoB,MAAQ,CAAC,CAAC,EAAQ,MAAQ,CAAC,CAAC,EAAW,KAE/F,EAAgB,GAAiB,EAAc,EAAY,KAAM,EAAQ,KAAM,CAAsB,EACrG,EAAkB,GAAiB,EAAc,gBAAgB,OAAS,EAEhF,EAAmB,CAAE,MAAO,EAAoB,KAAO,GAAU,YAAa,CAAE,MAAO,EAAoB,MAAM,IAAK,CAAC,EAAI,IAAK,CAAC,EACjI,EAAqB,CAAE,EAAO,EAAa,CAAoB,CAAC,EAChE,EAAoB,EAAM,OAAO,EAEjC,SAAS,EACP,EACA,EACA,EACA,CACA,EAAmB,QAAQ,CACzB,YAAa,EAAY,UACzB,OAAQ,EAAQ,SAAS,4BACzB,OAAQ,CACN,UAAW,EAAK,GAChB,QAAS,EAAM,QACf,gBACA,UAAW,EAAK,SAClB,CACF,CAAC,CACH,CAEA,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,gBAAf,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,KAAM,EAA2B,EAAM,KAAM,SAAS,EACtD,MAAO,EAAoB,KAC3B,mBAAoB,EAAe,EAAe,mBAAmB,EACrE,gBAAiB,EAAO,MAAM,gBAC9B,MAAO,EAAM,KACb,WAAY,EAAW,KACvB,UAAW,EAAU,KACJ,kBACjB,QAAS,CAAC,CAAC,EAAQ,MAAM,SAAS,OAClC,4BAA6B,EAAmB,EAAe,YAAY,CAC5E,CAAA,GAED,EAAA,EAAA,IAAA,CAAC,GAAD,CACE,oBAAqB,EAAoB,KACrB,qBACpB,YAAa,EAAY,KACzB,QAAS,EAAQ,KACjB,SAAU,EAAM,SAChB,OAAQ,EAAM,OAEd,WAAY,EAAQ,WACJ,iBACD,gBACf,OAAQ,EAAO,KACG,kBACnB,CAAA,CACE,GAET,CCrHA,IAAM,GAAY,EAAgB,iBAAiB,kCAAS,EAW5D,SAAgB,GAA0B,EAAuC,CAC/E,IAAM,EAAqB,EAAM,UAAU,OAAO,GAAW,CAAC,EAAM,YAAY,SAAS,EAAQ,EAAE,CAAC,GAAK,CAAC,EAE1G,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,MAAO,GAAU,OAAO,EACxB,IAAK,GACL,aAAa,oCAEb,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,SAAU,EACV,YAAa,EAAM,YACnB,SAAU,EAAM,SAChB,YAAa,GAAU,iBAAiB,EACxC,eAAgB,EAAM,cACvB,CAAA,CACU,CAAA,CAEjB,CC7BA,IAAM,EAAY,EAAgB,iBAAiB,+BAAS,EAU5D,SAAgB,GAAuB,EAA4B,CACjE,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,MAAO,EAAU,OAAO,EACxB,IAAK,GACL,aAAa,8BACb,MAAO,EAAM,SAAS,iBAEtB,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,SAAU,EAAM,SAChB,YAAa,EAAM,YACnB,SAAU,EAAM,SAChB,YAAa,EAAU,iBAAiB,EACxC,QAAS,EAAM,eACf,YAAa,EAAU,SAAS,EAChC,eAAgB,EAAM,cACvB,CAAA,CACU,CAAA,CAEjB,oDEpCA,SAAgB,IAA+B,CAC7C,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAU,8CAAqC,MAAU,CAAA,GAC7D,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,yBACb,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,mBACb,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,GAAG,EAAO,gBAAgB,oCAA2C,CAAA,CAClF,CAAA,CACF,CAAA,GAEL,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAU,8CAAqC,MAAU,CAAA,GAC7D,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,wBAAf,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,kBACb,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,GAAG,EAAO,gBAAgB,oCAA2C,CAAA,CAClF,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,kBACb,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,GAAG,EAAO,gBAAgB,oCAA2C,CAAA,CAClF,CAAA,CACF,GACF,CAAA,CAAA,CAET,CCLA,IAAM,GAAY,iCAiBlB,SAAgB,GAAsB,EAAmC,CACvE,IAAM,EAAU,EAAM,eAAiB,CAAC,CAAC,EAAM,SAAS,OAExD,SAAS,GAAkB,CAGzB,OAFK,EAAM,QAEJ,OAAO,OAAO,EAAM,OAAO,EAFP,CAAC,CAG9B,CAEA,OACE,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,CACG,CAAC,EAAM,gBAAiB,EAAA,EAAA,IAAA,CAAC,GAAD,CAA+B,CAAA,EAEvD,EAAM,gBACL,EAAA,EAAA,KAAA,CAAC,GAAD,CAAmB,MAAO,EAAM,MAAgB,UAAS,MAAO,EAAM,eAAtE,EACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAU,gBAAnB,EACE,EAAA,EAAA,KAAA,CAAC,KAAD,CAAI,UAAU,cAAd,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAiB,aAAW,OAAO,gBAAkB,CAAA,GACrD,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,CAAM,KAAG,EAAgB,CAAC,CAAC,OAAQ,EAAM,kBAAoB,IAAI,EAAM,kBAAkB,SAAW,EAAS,CAAA,CAAA,CAC3G,KACJ,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,mBAAf,CACG,CAAC,CAAC,EAAM,mBAAmB,SAC1B,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,0BACb,EAAA,EAAA,IAAA,CAAC,GAAD,CACE,SAAU,EAAM,kBAChB,WAAY,EAAM,SAAS,IAAI,GAAK,EAAE,EAAE,EACxC,YAAa,EAAM,OAAO,YAC1B,eAAgB,EAAM,sBAAsB,eAC5C,SAAU,EAAU,SAAS,OAC7B,eAAgB,EAAM,cACvB,CAAA,CACE,CAAA,GAEP,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,0BACb,EAAA,EAAA,IAAA,CAAC,GAAD,CACE,SAAU,EAAgB,EAC1B,YAAa,EAAM,OAAO,YAC1B,eAAgB,EAAM,sBAAsB,eAC5C,SAAU,EAAU,SAAS,OAC7B,eAAgB,EAAM,cACvB,CAAA,CACE,CAAA,CACF,GACE,KACT,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAU,gBAAnB,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAU,eACZ,EAAA,EAAA,IAAA,CAAC,EAAD,CACa,aACX,OAAQ,EAAM,cAAgB,kBAAoB,YACnD,CAAA,CACC,CAAA,GACJ,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,mBAAf,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,4BACb,EAAA,EAAA,IAAA,CAAC,GAAD,CACE,QAAS,EAAM,OAChB,CAAA,CACE,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,4BACb,EAAA,EAAA,IAAA,CAAC,GAAD,CACE,WAAY,EAAM,oBAClB,eAAgB,EAAM,sBAAsB,eAC5C,eAAgB,EAAkB,EAAM,oBAAoB,CAC7D,CAAA,CACE,CAAA,CACF,GACE,GACQ,GAErB,CAAA,CAAA,CAEN,CCrGA,SAAgB,GAAyB,EAAc,EAAqB,CAC1E,MAAO,CACL,eAAgB,EAA0B,EAAO,KAAM,CAAM,CAC/D,CACF,CCyBA,IAAM,GAAY,EAAgB,iBAAiB,oCAAS,EAM5D,SAAgB,GAA0B,EAA+B,CACvE,GAAM,CAAC,GAAkB,EAAsB,EAAoB,eAAe,EAElF,EAAoB,EAEpB,GAAM,CAAE,iBAAkB,EAAY,IAAI,EAEpC,CAAE,iBAAgB,sBAAuB,EAAe,EAExD,EAAS,EAA6B,EAAe,OAAO,CAAC,EAC7D,EAAc,EAAkC,EAAa,YAAY,CAAC,EAC1E,EAAa,EACjB,EAAY,MAAQ,EAAiB,WAAW,EAAY,KAAK,UAAU,CAC7E,EAEM,EAAQ,EAA4B,EAAc,SAAS,EAAM,OAAO,CAAC,EAEzE,EAAc,EAAY,wBAAwB,EAAM,IAAI,EAC5D,EAAY,EAAgC,GAAe,EAAkB,aAAa,CAAW,CAAC,EAEtG,EAAoB,EAA6B,EAAM,OAAO,EAG9D,EAAQ,EADO,EAAM,MAAQ,EAAY,gBAAgB,EAAM,KAAK,SAAU,EAAM,KAAK,YAAY,CAChD,EAE3D,EAAmB,CAAE,MAAO,EAAM,KAAO,GAAU,YAAa,CAAE,MAAO,EAAM,MAAM,IAAK,CAAC,EAAI,IAAK,CAAC,EACrG,EAAqB,CAAE,EAAO,CAAM,CAAC,EACrC,EAAoB,EAAM,OAAO,EAEjC,IAAM,EAAa,EACjB,EAAqB,aAAa,EAAM,OAAO,CACjD,EAEM,EAAsB,EAC1B,EAAqB,wBAAwB,EAAM,OAAO,CAC5D,EAEM,EAAU,EACd,EAAqB,iBAAiB,EAAM,QAAS,SAAS,CAChE,EAEM,CAAE,QAAO,gBAAiB,GAAqB,EAAM,OAAO,EAE5D,EACJ,EAAO,cACP,EAAM,cACN,EAAW,cACX,EAAoB,cACpB,EAAQ,cACR,EAAW,MACX,EAEI,EAAwB,GAAyB,EAAM,IAAI,EAEjE,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,gBAAf,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,MAAO,EAAM,KACb,UAAW,EAAU,KACrB,KAAM,EAAqB,EAAM,KAAM,UAAU,EACjD,mBAAoB,EAAe,EAAe,mBAAmB,EACrE,gBAAiB,EAAO,MAAM,gBAC9B,MAAO,EAAM,KACb,WAAY,EAAW,KACvB,QAAS,GAAiB,CAAC,CAAC,GAAO,OACnC,4BAA6B,EAAmB,EAAe,YAAY,CAC5E,CAAA,GAED,EAAA,EAAA,IAAA,CAAC,GAAD,CACE,cAAe,CAAC,CAAC,EACF,gBACC,iBACO,wBACvB,OAAQ,EAAO,KACf,MAAO,EAAM,KACb,kBAAmB,EAAkB,MACrC,QAAS,EACT,qBAAsB,EAAW,KACjC,oBAAqB,EAAoB,KACzC,MAAO,EAAM,KACb,QAAS,EAAQ,IAClB,CAAA,CACE,GAET,CCpGA,IAAM,GAA+B,EAClC,EAAW,OAAQ,CAClB,SAAU,IAAO,EAAA,EAAA,IAAA,CAAC,GAAD,CAA2B,QAAS,EAAI,MAAM,OAAU,CAAA,EACzE,QAAS,IAAO,EAAA,EAAA,IAAA,CAAC,EAAD,CAAqB,QAAS,EAAI,MAAM,OAAU,CAAA,CACpE,GACC,EAAW,MAAO,CACjB,SAAU,IAAO,EAAA,EAAA,IAAA,CAAC,GAAD,CAA2B,QAAS,EAAI,MAAM,OAAU,CAAA,EACzE,QAAS,IAAO,EAAA,EAAA,IAAA,CAAC,EAAD,CAAqB,QAAS,EAAI,MAAM,OAAU,CAAA,CACpE,GACC,EAAW,aAAc,CACxB,SAAU,IAAO,EAAA,EAAA,IAAA,CAAC,GAAD,CAAiC,QAAS,EAAI,MAAM,OAAU,CAAA,EAC/E,QAAS,IAAO,EAAA,EAAA,IAAA,CAAC,EAAD,CAAqB,QAAS,EAAI,MAAM,OAAU,CAAA,EAClE,UAAW,IACT,EAAA,EAAA,IAAA,CAAC,GAAD,CACE,cAAe,EAAI,cACnB,OAAQ,EAAI,OACZ,QAAS,EAAI,MAAM,OACpB,CAAA,EAEH,QAAS,IACP,EAAA,EAAA,IAAA,CAAC,GAAD,CACE,SAAU,EAAI,SACd,OAAQ,EAAI,OACZ,QAAS,EAAI,MAAM,OACpB,CAAA,CAEL,CACF,EAOA,SAAgB,GAAgB,EAA8C,CAC5E,GAAM,CAAE,QAAO,OAAQ,EACjB,EAAS,GAAe,GAAO,aAAa,GAAG,GAKrD,OAHI,EACK,EAAO,CAAO,GAEhB,EAAA,EAAA,IAAA,CAAA,EAAA,SAAA,CAAI,CAAA,CACb,CChCA,SAAgB,GAAiB,EAA2C,CAC1E,IAAM,EAAQ,EAA4B,EAAc,SAAS,EAAM,OAAO,CAAC,EACzE,CAAE,iBAAgB,YAAa,EAAe,EAE9C,EAAO,GAAgB,CAC3B,MAAO,EAAM,KACb,IAAK,EAAM,IACX,cAAe,EAAM,cACrB,OAAQ,EAAM,OACd,SAAU,EAAM,QAClB,CAAC,EAgCD,OA3BA,EAAM,cAAgB,CAEpB,GADI,CAAC,EAAM,kBACP,CAAC,EAAM,KAAM,OAEjB,IAAM,EAAU,EAAuB,EAAM,IAAI,EAE5C,GAEL,EAAmB,QAAQ,CAAO,CACpC,EAAG,CAAE,EAAM,KAAM,EAAM,gBAAiB,CAAC,EAKzC,EAAM,cAAgB,CACf,IACD,EAAe,CAAE,EAAe,aAAc,EAAe,aAAc,CAAC,GAEhF,EAAmB,QAAQ,CACzB,YAAa,EAAY,UACzB,OAAQ,EAAQ,SAAS,IAC3B,CAAC,EACH,EAAG,CAAC,CAAQ,CAAC,EAER,GAIH,EAAA,EAAA,IAAA,CAAA,EAAA,SAAA,CAAA,SACG,CACD,CAAA,GALK,EAAA,EAAA,IAAA,CAAA,EAAA,SAAA,CAAI,CAAA,CAOf"}
|
|
1
|
+
{"version":3,"file":"CfNYFxJl2.chunk.js","names":[],"sources":["../../src/apps/my-shares/hooks/useHardGateInsights.ts","../../src/apps/my-shares/hooks/useInsightEngagement.ts","../../src/apps/my-shares/views/heatmap/InsightsHeatmapView.tsx","../../src/apps/my-shares/views/interactive/overview/InteractiveInsightsOverviewUtils.ts","../../src/apps/my-shares/views/interactive/overview/InteractiveInsightsOverviewView.tsx","../../src/apps/my-shares/views/interactive/questions/InteractiveInsightsQuestionsView.tsx","../../src/apps/my-shares/views/interactive/students/InteractiveInsightsStudentsView.tsx","../../../../libs/shared/src/apps/analytics/components/insights/students-not-watched/InsightStudentsNotWatched.tsx","../../../../libs/shared/src/apps/analytics/components/insights/students-watched/InsightStudentsWatched.tsx","../../src/apps/my-shares/components/video-insights-overview/partial-loading/partial-video-insights-overview.module.scss","../../src/apps/my-shares/components/video-insights-overview/partial-loading/PartialVideoInsightsOverview.tsx","../../src/apps/my-shares/components/video-insights-overview/VideoInsightsOvervew.tsx","../../src/apps/my-shares/views/video/overview/VideoInsightsOverviewUtils.ts","../../src/apps/my-shares/views/video/overview/VideoInsightsOverviewView.tsx","../../src/apps/my-shares/views/base-insights-view/useInsightsView.tsx","../../src/apps/my-shares/views/base-insights-view/BaseInsightsView.tsx"],"sourcesContent":["import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nexport function useHardGateInsights(shareId: string) {\n const { getGatedPermission, isLoaded } = usePermissions();\n\n React.useEffect(() => {\n if (!isLoaded)\n return;\n\n const permission = getGatedPermission(PermissionName.ViewInsights);\n\n if (permission !== 'hard-gate')\n return;\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.HARD_GATE_INSIGHTS,\n args: [shareId]\n });\n }, [isLoaded]);\n}\n","import { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useBatchFetch } from 'libs/shared/hooks/UseBatchFetch';\nimport { Engagement } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport { VideoViewsV2Requests } from 'shared/flight-requests/VideoViewsV2Requests';\n\nimport { useAnonSessions } from 'apps/my-shares/hooks/useAnonSessions';\n\nexport function useInsightEngagement(shareId: string) {\n const [hideStaffResults] = useViewModel<boolean>(SharedViewModelKeys.HIDE_STAFF_RESULTS);\n\n const engagement = Flight.useBasicFetch<Engagement[]>(\n VideoViewsV2Requests.shareHeatMap(shareId)\n );\n\n const anonSessions = useAnonSessions(shareId);\n\n const userIds = engagement.data?.map(u => u.userId).filter(id => !!id) || [];\n const users = useBatchFetch<AnonUser>(userIds, UserRequests.getById);\n\n function getAnonUser(e: Engagement): AnonUser {\n if (e.userId) {\n const user = users.items?.[e.userId];\n\n if (!user)\n return { id: e.userId, deleted: true } as AnonUser;\n\n return user;\n }\n\n const anonSession = anonSessions.items?.[e.sessionId];\n if (anonSession)\n return anonSession;\n\n return { sessionId: e.sessionId } as AnonUser;\n }\n \n const userMap = {\n ...anonSessions.items,\n ...users.items\n };\n\n const filteredEngagement = engagement.data?.filter(e => {\n const user = userMap[e.userId || e.sessionId];\n\n if (!user)\n return e;\n\n // Video views is returning userType as a number - Sha\n const userType = user.userType as unknown as number;\n if (userType === 1 && hideStaffResults)\n return null;\n\n return e;\n }).filter(e => !!e);\n\n const viewers = engagement\n .data?.map(e => ({ ...getAnonUser(e), percentage: e.engagementRate }));\n\n return {\n engagement: filteredEngagement,\n users: viewers,\n hasCompleted: (\n engagement.hasCompleted &&\n anonSessions.hasCompleted &&\n (!userIds?.length || users.hasCompleted)\n )\n };\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { InteractiveResultsRequests } from 'libs/shared/apps/analytics/flight-requests/InteractiveResultsRequests';\nimport { GroupedAnalyticsCount } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { InteractivesPendingReviews } from 'libs/shared/apps/analytics/interfaces/response/InteractivesPendingReviewsResponse';\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share/interfaces/Share';\nimport { ShareHelper } from 'libs/shared/apps/share/utils/ShareHelper';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { MediaIdType } from 'libs/shared/enums/MediaIdType';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { PlayerRequests } from 'libs/shared/flight-requests/PlayerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { useLockContentWidth } from 'libs/shared/hooks/useLockContentWidth';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Classroom, Config, CurrentUser, Engagement, PlayerViewKey, VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { ViewModelKeys } from 'shared/constants/LiteViewModels';\nimport { VideoViewsV2Requests } from 'shared/flight-requests/VideoViewsV2Requests';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { InsightsHeader } from 'apps/my-shares/components/insights-header/InsightsHeader';\nimport { InsightsHeatmap } from 'apps/my-shares/components/insights-heatmap/InsightsHeatmap';\nimport { useHardGateInsights } from 'apps/my-shares/hooks/useHardGateInsights';\nimport { useInsightEngagement } from 'apps/my-shares/hooks/useInsightEngagement';\nimport { useInsightsClassroomStudents } from 'apps/my-shares/hooks/useInsightsClassroomStudents';\nimport { getInsightsInteractiveTabs, getInsightsVideoTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\n\nconst namespace = 'shared.insightsHeatmap';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightsHeatmapViewProps {\n shareId: string;\n}\n\nexport function InsightsHeatmapView(props: InsightsHeatmapViewProps) {\n const [anonymiseUsers] = useViewModel<boolean>(ViewModelKeys.ANONYMISE_USERS);\n const [hideStaffResults] = useViewModel<boolean>(ViewModelKeys.HIDE_STAFF_RESULTS);\n\n useLockContentWidth();\n\n const { hasPermissions, getGatedPermission } = usePermissions();\n\n const share = Flight.useBasicFetch<Share>(ShareRequests.getShare(props.shareId));\n \n const classroomId = ShareHelper.getClassroomIdFromShare(share.data);\n const classroom = Flight.useBasicFetch<Classroom>(classroomId && ClassroomRequests.getClassroom(classroomId));\n\n const classroomStudents = useInsightsClassroomStudents(props.shareId);\n \n const videoRequest = share.data && VideoHelper.getVideoRequest(share.data.objectId, share.data.objectTypeId);\n const video = Flight.useBasicFetch<VideoTypes>(videoRequest);\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const pendingReviewsRequest = VideoHelper.isInteractive(video.data) && InteractiveResultsRequests.pendingReviews({\n interactives: [video.data].map(obj => ({\n interactiveId: obj.interactiveId,\n metadataId: obj.id,\n shareId: props.shareId\n })),\n filters: {\n currentCustomerId: currentUser.data.customerId,\n currentUserId: currentUser.data.id\n }\n });\n const pendingReviews = Flight.useBasicFetch<InteractivesPendingReviews[]>(pendingReviewsRequest);\n const markingRequired = pendingReviews.data?.[0]?.pendingReviewCount > 0;\n\n const aggregateEngagement = Flight.useBasicFetch<Engagement>(\n VideoViewsV2Requests.shareHeatMapAggregation(props.shareId)\n );\n\n const { users, engagement, hasCompleted } = useInsightEngagement(props.shareId);\n\n const yearGroupsCount = Flight.useBasicFetch<GroupedAnalyticsCount[]>(\n VideoViewsV2Requests.shareAggregation(props.shareId, 'year_group')\n );\n\n const viewKey = Flight.useBasicFetch<PlayerViewKey>(\n share.data?.objectId &&\n PlayerRequests.createViewKey(share.data.objectId, MediaIdType.MasterObject)\n );\n\n useSetPageMetadata({ title: video.data ? getPhrase('pageTitle', { video: video.data?.name }) : null });\n useHandleObjectError([ share, video ]);\n useHardGateInsights(props.shareId);\n\n const hasDataLoaded =\n share.hasCompleted &&\n video.hasCompleted &&\n config.hasCompleted &&\n aggregateEngagement.hasCompleted &&\n yearGroupsCount.hasCompleted &&\n viewKey.hasCompleted &&\n yearGroups.hasCompleted;\n\n function getInsightsTabs() {\n if (share.data?.objectTypeId === MasterType.Interactive)\n return getInsightsInteractiveTabs(share.data, 'heatmap');\n\n return getInsightsVideoTabs(share.data, 'heatmap');\n }\n\n return (\n <div className='px-3'>\n <InsightsHeader\n video={video.data}\n tabs={getInsightsTabs()}\n hasSchoolAnalytics={hasPermissions(PermissionName.ViewSchoolAnalytics)}\n analyticsWebUrl={config.data?.analyticsWebUrl}\n share={share.data}\n yearGroups={yearGroups.data}\n classroom={classroom.data}\n markingRequired={markingRequired}\n hasData={!!engagement?.length}\n viewInsightsGatedPermission={getGatedPermission(PermissionName.ViewInsights)}\n />\n <InsightsHeatmap\n aggregateEngagement={aggregateEngagement.data}\n individualEngagement={engagement}\n yearGroups={yearGroupsCount.data}\n config={config.data}\n users={users}\n viewKey={viewKey.data}\n hasDataLoaded={hasDataLoaded}\n tableDataLoaded={hasCompleted}\n anonymiseUsers={anonymiseUsers}\n classroomStudents={classroomStudents.items}\n hideStaffResults={hideStaffResults}\n />\n </div>\n );\n}\n","import { HashObject } from 'libs/common/react/interfaces';\n\nimport { Share } from 'libs/shared/apps/share/interfaces/Share';\n\nimport { getInsightsHeatmapAppLink, getInsightsQuestionsAppLink, getInsightsStudentsAppLink } from 'shared/utils/ObjectAppLinkHelper';\n\nexport function getInteractiveInsightsAppLinks(share: Share, params?: HashObject) {\n return {\n resultsAppLink: getInsightsStudentsAppLink(share, null, params),\n questionsAppLink: getInsightsQuestionsAppLink(share, null, params),\n heatmapAppLink: getInsightsHeatmapAppLink(share, null, params)\n };\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { GroupedAnalyticsCount } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { groupStudents } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share/interfaces/Share';\nimport { ShareHelper } from 'libs/shared/apps/share/utils/ShareHelper';\nimport { ScoreThresholdInsights } from 'libs/shared/constants/ScoreThresholds';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\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 { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { useLockContentWidth } from 'libs/shared/hooks/useLockContentWidth';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Classroom, Config, CurrentUser, Engagement, Interactive, InteractiveMetadata, YearGroup } from 'libs/shared/interfaces';\n\nimport { VideoViewsV2Requests } from 'shared/flight-requests/VideoViewsV2Requests';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { InsightsHeader } from 'apps/my-shares/components/insights-header/InsightsHeader';\nimport { InteractiveInsightsOverview } from 'apps/my-shares/components/interactive-insights-overview/InteractiveInsightsOverview';\nimport { useHardGateInsights } from 'apps/my-shares/hooks/useHardGateInsights';\nimport { useInsightsClassroomStudents } from 'apps/my-shares/hooks/useInsightsClassroomStudents';\nimport { useInsightsInteractiveResults } from 'apps/my-shares/hooks/useInsightsInteractiveResults';\nimport { getInsightsInteractiveTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\nimport { getInteractiveInsightsAppLinks } from 'apps/my-shares/views/interactive/overview/InteractiveInsightsOverviewUtils';\n\nconst namespace = 'insights.interactiveInsightsOverviewView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InteractiveInsightsViewProps {\n shareId: string;\n}\n\nexport function InteractiveInsightsOverviewView(props: InteractiveInsightsViewProps) {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n useLockContentWidth();\n\n const { hasPermissions, getGatedPermission } = usePermissions();\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const share = Flight.useBasicFetch<Share>(ShareRequests.getShare(props.shareId));\n \n const classroomId = ShareHelper.getClassroomIdFromShare(share.data);\n const classroom = Flight.useBasicFetch<Classroom>(classroomId && ClassroomRequests.getClassroom(classroomId));\n\n const classroomStudents = useInsightsClassroomStudents(props.shareId);\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n share.data?.objectId &&\n InteractiveRequests.interactiveMetadata(share.data.objectId)\n );\n\n const interactive = Flight.useBasicFetch<Interactive>(\n interactiveMetadata.data?.interactiveId &&\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId)\n );\n\n const results = useInsightsInteractiveResults(props.shareId);\n\n const engagement = Flight.useBasicFetch<Engagement[]>(\n VideoViewsV2Requests.shareHeatMap(props.shareId)\n );\n\n const aggregateEngagement = Flight.useBasicFetch<Engagement>(\n VideoViewsV2Requests.shareHeatMapAggregation(props.shareId)\n );\n\n const osCount = Flight.useBasicFetch<GroupedAnalyticsCount[]>(\n VideoViewsV2Requests.shareAggregation(props.shareId, 'os_name')\n );\n\n useSetPageMetadata({ title: interactiveMetadata.data ? getPhrase('pageTitle', { video: interactiveMetadata.data?.name }) : null });\n\n useHandleObjectError([ share, interactive, interactiveMetadata ]);\n useHardGateInsights(props.shareId);\n\n const hasDataLoaded =\n config.hasCompleted &&\n interactiveMetadata.hasCompleted &&\n interactive.data &&\n aggregateEngagement.hasCompleted &&\n engagement.hasCompleted &&\n osCount.hasCompleted &&\n results.hasCompleted &&\n yearGroups.hasCompleted;\n\n const interactiveInsightsAppLinks = getInteractiveInsightsAppLinks(share.data);\n\n const studentGroups = hasDataLoaded && groupStudents(interactive.data, results.data, ScoreThresholdInsights);\n const markingRequired = studentGroups && studentGroups.markingRequired.length > 0;\n\n return (\n <div className='px-3'>\n <InsightsHeader\n video={interactiveMetadata.data}\n tabs={getInsightsInteractiveTabs(share.data, 'insights')}\n hasSchoolAnalytics={hasPermissions(PermissionName.ViewSchoolAnalytics)}\n analyticsWebUrl={config.data?.analyticsWebUrl}\n share={share.data}\n yearGroups={yearGroups.data}\n classroom={classroom.data}\n markingRequired={markingRequired}\n hasData={!!results.data?.students.length}\n viewInsightsGatedPermission={getGatedPermission(PermissionName.ViewInsights)}\n />\n\n <InteractiveInsightsOverview\n aggregateEngagement={aggregateEngagement.data}\n individualEngagement={engagement.data}\n interactive={interactive.data}\n interactiveMetadata={interactiveMetadata.data}\n interactiveInsightsAppLinks={interactiveInsightsAppLinks}\n classroomStudents={classroomStudents.items}\n results={results.data}\n osCount={osCount.data}\n config={config.data}\n anonymiseUsers={anonymiseUsers}\n hasDataLoaded={hasDataLoaded}\n share={share.data}\n />\n </div>\n );\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { groupStudents } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { SortStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share/interfaces/Share';\nimport { ShareHelper } from 'libs/shared/apps/share/utils/ShareHelper';\nimport { ScoreThresholdInsights } from 'libs/shared/constants/ScoreThresholds';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\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 { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { useLockContentWidth } from 'libs/shared/hooks/useLockContentWidth';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Classroom, Config, CurrentUser, Interactive, InteractiveMetadata, YearGroup } from 'libs/shared/interfaces';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { InsightsHeader } from 'apps/my-shares/components/insights-header/InsightsHeader';\nimport { InteractiveInsightsQuestions } from 'apps/my-shares/components/interactive-insights-questions/InteractiveInsightsQuestions';\nimport { useHardGateInsights } from 'apps/my-shares/hooks/useHardGateInsights';\nimport { useInsightsInteractiveResults } from 'apps/my-shares/hooks/useInsightsInteractiveResults';\nimport { getInsightsInteractiveTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\n\nconst namespace = 'shared.interactiveInsightsQuestionsView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InteractiveInsightsQuestionsViewProps {\n shareId: string;\n interactionId: string;\n sortBy: SortStudentsBy;\n}\n\nexport function InteractiveInsightsQuestionsView(props: InteractiveInsightsQuestionsViewProps) {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n useLockContentWidth();\n\n const { hasPermissions, getGatedPermission } = usePermissions();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const share = Flight.useBasicFetch<Share>(ShareRequests.getShare(props.shareId));\n \n const classroomId = ShareHelper.getClassroomIdFromShare(share.data);\n const classroom = Flight.useBasicFetch<Classroom>(classroomId && ClassroomRequests.getClassroom(classroomId));\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n share.data?.objectId &&\n InteractiveRequests.interactiveMetadata(share.data?.objectId)\n );\n\n const interactive = Flight.useBasicFetch<Interactive>(interactiveMetadata.data?.interactiveId &&\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId));\n\n const results = useInsightsInteractiveResults(props.shareId);\n\n useSetPageMetadata({ title: interactiveMetadata.data ? getPhrase('pageTitle', { video: interactiveMetadata.data?.name }) : null });\n useHandleObjectError([ share, interactive, interactiveMetadata ]);\n useHardGateInsights(props.shareId);\n\n const hasDataLoaded = interactive.data && interactiveMetadata.data && !!results.data && !!yearGroups.data;\n \n const studentGroups = hasDataLoaded && groupStudents(interactive.data, results.data, ScoreThresholdInsights);\n const markingRequired = studentGroups && studentGroups.markingRequired.length > 0;\n\n return (\n <div className='px-3'>\n <InsightsHeader\n tabs={getInsightsInteractiveTabs(share.data, 'questions')}\n video={interactiveMetadata.data}\n hasSchoolAnalytics={hasPermissions(PermissionName.ViewSchoolAnalytics)}\n analyticsWebUrl={config.data?.analyticsWebUrl}\n share={share.data}\n yearGroups={yearGroups.data}\n classroom={classroom.data}\n markingRequired={markingRequired}\n hasData={!!results.data?.students.length}\n viewInsightsGatedPermission={getGatedPermission(PermissionName.ViewInsights)}\n />\n\n <InteractiveInsightsQuestions\n interactive={interactive.data}\n interactiveMetadata={interactiveMetadata.data}\n interactionId={props.interactionId}\n config={config.data}\n sortBy={props.sortBy}\n isFetching={!results.hasCompleted || interactive.isFetching}\n anonymiseUsers={anonymiseUsers}\n results={results.data}\n hasDataLoaded={hasDataLoaded}\n />\n </div>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { groupStudents } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { FilterStudentsBy, SortStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share/interfaces/Share';\nimport { ShareHelper } from 'libs/shared/apps/share/utils/ShareHelper';\nimport { ScoreThresholdInsights } from 'libs/shared/constants/ScoreThresholds';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\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 { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Classroom, Config, CurrentUser, Interactive, InteractiveMetadata, YearGroup } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { InsightsHeader } from 'apps/my-shares/components/insights-header/InsightsHeader';\nimport { InteractiveInsightsStudents } from 'apps/my-shares/components/interactive-insights-students/InteractiveInsightsStudents';\nimport { useHardGateInsights } from 'apps/my-shares/hooks/useHardGateInsights';\nimport { useInsightsInteractiveResults } from 'apps/my-shares/hooks/useInsightsInteractiveResults';\nimport { getInsightsInteractiveTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\n\nconst namespace = 'insights.interactiveInsightsStudents';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InteractiveInsightsStudentsViewProps {\n shareId: string;\n sortBy: SortStudentsBy;\n filterBy: FilterStudentsBy;\n}\n\nexport function InteractiveInsightsStudentsView(props: InteractiveInsightsStudentsViewProps) {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n const [hideStaffResults] = useViewModel<boolean>(SharedViewModelKeys.HIDE_STAFF_RESULTS);\n\n const { hasPermissions, getGatedPermission } = usePermissions();\n \n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const share = Flight.useBasicFetch<Share>(ShareRequests.getShare(props.shareId));\n \n const classroomId = ShareHelper.getClassroomIdFromShare(share.data);\n const classroom = Flight.useBasicFetch<Classroom>(classroomId && ClassroomRequests.getClassroom(classroomId));\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n share.data?.objectId &&\n InteractiveRequests.interactiveMetadata(share.data.objectId)\n );\n\n const interactive = Flight.useBasicFetch<Interactive>(interactiveMetadata.data?.interactiveId &&\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId));\n\n const results = useInsightsInteractiveResults(props.shareId);\n\n const hasDataLoaded = interactive.data && interactiveMetadata.data && !!results.data && !!yearGroups.data;\n\n const studentGroups = hasDataLoaded && groupStudents(interactive.data, results.data, ScoreThresholdInsights);\n const markingRequired = studentGroups && studentGroups.markingRequired.length > 0;\n\n useSetPageMetadata({ title: interactiveMetadata.data ? getPhrase('pageTitle', { video: interactiveMetadata.data?.name }) : null });\n useHandleObjectError([ share, interactive, interactiveMetadata ]);\n useHardGateInsights(props.shareId);\n\n function viewStudentResults(\n user: AnonUser,\n interactiveMetadataId: string,\n interactionId?: string\n ) {\n Core.AppLinkHelper.trigger({\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_STUDENT_RESULTS,\n params: {\n studentId: user.id,\n shareId: props.shareId,\n interactionId,\n sessionId: user.sessionId\n }\n });\n }\n\n return (\n <div className='px-3'>\n <InsightsHeader\n tabs={getInsightsInteractiveTabs(share.data, 'results')}\n video={interactiveMetadata.data}\n hasSchoolAnalytics={hasPermissions(PermissionName.ViewSchoolAnalytics)}\n analyticsWebUrl={config.data?.analyticsWebUrl}\n share={share.data}\n yearGroups={yearGroups.data}\n classroom={classroom.data}\n markingRequired={markingRequired}\n hasData={!!results.data?.students.length}\n viewInsightsGatedPermission={getGatedPermission(PermissionName.ViewInsights)}\n />\n\n <InteractiveInsightsStudents\n interactiveMetadata={interactiveMetadata.data}\n viewStudentResults={viewStudentResults}\n interactive={interactive.data}\n results={results.data}\n filterBy={props.filterBy}\n sortBy={props.sortBy}\n // Must be isFetching, not hasCompleted, as we need to refresh the table when the results are updated\n isFetching={results.isFetching}\n anonymiseUsers={anonymiseUsers}\n hasDataLoaded={hasDataLoaded}\n config={config.data}\n hideStaffResults={hideStaffResults}\n />\n </div>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightStudentList } from 'libs/shared/apps/analytics/components/insight-student-list/InsightStudentList';\nimport { PuzzleSvg } from 'libs/shared/images/svg/objects/PuzzleSvg';\nimport { User } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.insightStudentsNotWatched';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightStudentsNotWatchedProps {\n students: User[];\n imageCdnUrl: string;\n imageUrl: string;\n heatmapAppLink: Core.AppLink;\n watchedIds: string[];\n anonymiseUsers: boolean;\n}\n\nexport function InsightStudentsNotWatched(props: InsightStudentsNotWatchedProps) {\n const studentsNotWatched = props.students?.filter(student => !props.watchedIds?.includes(student.id)) || [];\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svg={PuzzleSvg}\n svgClassName='bg-light-teal text-teal'\n >\n <InsightStudentList\n students={studentsNotWatched}\n imageCdnUrl={props.imageCdnUrl}\n imageUrl={props.imageUrl}\n description={getPhrase('studentsDisplay')}\n anonymiseUsers={props.anonymiseUsers}\n />\n </InsightCard>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightStudentList } from 'libs/shared/apps/analytics/components/insight-student-list/InsightStudentList';\nimport { FlagSvg } from 'libs/shared/images/svg/objects/FlagSvg';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nconst namespace = 'shared.insightStudentsWatched';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightWatchedProps {\n students: AnonUser[];\n imageCdnUrl: string;\n heatmapAppLink: Core.AppLink;\n imageUrl: string;\n anonymiseUsers: boolean;\n}\n\nexport function InsightStudentsWatched(props: InsightWatchedProps) {\n return (\n <InsightCard\n title={getPhrase('title')}\n svg={FlagSvg}\n svgClassName='bg-light-indigo text-indigo'\n count={props.students.length}\n >\n <InsightStudentList\n students={props.students}\n imageCdnUrl={props.imageCdnUrl}\n imageUrl={props.imageUrl}\n description={getPhrase('studentsDisplay')}\n appLink={props.heatmapAppLink}\n appLinkText={getPhrase('viewAll')}\n anonymiseUsers={props.anonymiseUsers}\n />\n </InsightCard>\n );\n}\n",":local {\n .partialInsights {\n height: 12.5rem;\n }\n}","import React from 'react';\n\nimport styles from './partial-video-insights-overview.module.scss';\n\nexport function PartialVideoInsightsOverview() {\n return (\n <div>\n <h2 className='h4 w-25 partial-loading-background'> </h2>\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\n <h2 className='h4 w-25 partial-loading-background'> </h2>\n <div className='row g-3 mb-5'>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n </div>\n </div>\n );\n}\n","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { InsightDevices } from 'libs/shared/apps/analytics/components/insights/devices/InsightDevices';\nimport { InsightHeatmap } from 'libs/shared/apps/analytics/components/insights/heatmap/InsightHeatmap';\nimport { InsightStudentsNotWatched } from 'libs/shared/apps/analytics/components/insights/students-not-watched/InsightStudentsNotWatched';\nimport { InsightStudentsWatched } from 'libs/shared/apps/analytics/components/insights/students-watched/InsightStudentsWatched';\nimport { GroupedAnalyticsCount } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { getEngagementRate } from 'libs/shared/apps/analytics/utils/EngagementUtils';\nimport { Share } from 'libs/shared/apps/share/interfaces/Share';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Config, Engagement, User, Video } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport { InsightsShareMask } from 'apps/my-shares/components/insights-mask/InsightsShareMask';\nimport { PartialVideoInsightsOverview } from 'apps/my-shares/components/video-insights-overview/partial-loading/PartialVideoInsightsOverview';\n\nconst namespace = 'insights.videoInsightsOverview';\n\ninterface VideoInsightsOverviewProps {\n hasDataLoaded: boolean;\n hasClassrooms: boolean;\n anonymiseUsers: boolean;\n videoInsightsAppLinks: HashObject;\n config: Config;\n video: Video;\n classroomStudents: User[];\n viewers: AnonUser[];\n individualEngagement: Engagement[];\n aggregateEngagement: Engagement;\n share: Share;\n osCount: GroupedAnalyticsCount[];\n}\n\nexport function VideoInsightsOverview(props: VideoInsightsOverviewProps) {\n const hasData = props.hasDataLoaded && !!props.viewers?.length;\n\n function getStudentsList() {\n if (!props.viewers) return [];\n\n return Object.values(props.viewers);\n }\n\n return (\n <>\n {!props.hasDataLoaded && <PartialVideoInsightsOverview />}\n\n {props.hasDataLoaded &&\n <InsightsShareMask video={props.video} hasData={hasData} share={props.share}>\n <section className='mb-5'>\n <h2 className='h4'>\n <Text namespace={namespace} phrase='studentViewing' />\n <span>: {getStudentsList().length}{props.classroomStudents ? `/${props.classroomStudents.length}` : ''}</span>\n </h2>\n <div className='row g-3'>\n {!!props.classroomStudents?.length && (\n <div className='col-12 col-md'>\n <InsightStudentsNotWatched\n students={props.classroomStudents}\n watchedIds={props.viewers?.map(u => u.id)}\n imageCdnUrl={props.config.imageCdnUrl}\n heatmapAppLink={props.videoInsightsAppLinks.heatmapAppLink}\n imageUrl={ImageUrls.Insights.AVATAR}\n anonymiseUsers={props.anonymiseUsers}\n />\n </div>\n )}\n <div className='col-12 col-md'>\n <InsightStudentsWatched\n students={getStudentsList()}\n imageCdnUrl={props.config.imageCdnUrl}\n heatmapAppLink={props.videoInsightsAppLinks.heatmapAppLink}\n imageUrl={ImageUrls.Insights.AVATAR}\n anonymiseUsers={props.anonymiseUsers}\n />\n </div>\n </div>\n </section>\n <section className='mb-5'>\n <h2 className='h4'>\n <Text\n namespace={namespace}\n phrase={props.hasClassrooms ? 'classEngagement' : 'engagement'}\n />\n </h2>\n <div className='row g-3'>\n <div className='col-12 col-md-6'>\n <InsightDevices\n osCount={props.osCount}\n />\n </div>\n <div className='col-12 col-md-6'>\n <InsightHeatmap\n engagement={props.aggregateEngagement}\n heatmapAppLink={props.videoInsightsAppLinks.heatmapAppLink}\n engagementRate={getEngagementRate(props.individualEngagement)}\n />\n </div>\n </div>\n </section>\n </InsightsShareMask>\n }\n </>\n );\n}\n","import { HashObject } from 'libs/common/react/interfaces';\n\nimport { Share } from 'libs/shared/apps/share/interfaces/Share';\n\nimport { getInsightsHeatmapAppLink } from 'shared/utils/ObjectAppLinkHelper';\n\nexport function getVideoInsightsAppLinks(share: Share, params?: HashObject) {\n return {\n heatmapAppLink: getInsightsHeatmapAppLink(share, null, params)\n };\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { GroupedAnalyticsCount } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share/interfaces/Share';\nimport { ShareHelper } from 'libs/shared/apps/share/utils/ShareHelper';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { useLockContentWidth } from 'libs/shared/hooks/useLockContentWidth';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Classroom, Config, CurrentUser, Engagement, VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { VideoViewsV2Requests } from 'shared/flight-requests/VideoViewsV2Requests';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { InsightsHeader } from 'apps/my-shares/components/insights-header/InsightsHeader';\nimport { VideoInsightsOverview } from 'apps/my-shares/components/video-insights-overview/VideoInsightsOvervew';\nimport { useHardGateInsights } from 'apps/my-shares/hooks/useHardGateInsights';\nimport { useInsightEngagement } from 'apps/my-shares/hooks/useInsightEngagement';\nimport { useInsightsClassroomStudents } from 'apps/my-shares/hooks/useInsightsClassroomStudents';\nimport { getInsightsVideoTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\nimport { getVideoInsightsAppLinks } from 'apps/my-shares/views/video/overview/VideoInsightsOverviewUtils';\n\nconst namespace = 'insights.videoInsightsOverviewView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface VideoInsightsViewProps {\n shareId: string;\n}\n\nexport function VideoInsightsOverviewView(props: VideoInsightsViewProps) {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n useLockContentWidth();\n\n const { hasClassrooms } = useSettings(null);\n\n const { hasPermissions, getGatedPermission } = usePermissions();\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const share = Flight.useBasicFetch<Share>(ShareRequests.getShare(props.shareId));\n\n const classroomId = ShareHelper.getClassroomIdFromShare(share.data);\n const classroom = Flight.useBasicFetch<Classroom>(classroomId && ClassroomRequests.getClassroom(classroomId));\n\n const classroomStudents = useInsightsClassroomStudents(props.shareId);\n\n const videoRequest = share.data && VideoHelper.getVideoRequest(share.data.objectId, share.data.objectTypeId);\n const video = Flight.useBasicFetch<VideoTypes>(videoRequest);\n\n useSetPageMetadata({ title: video.data ? getPhrase('pageTitle', { video: video.data?.name }) : null });\n useHandleObjectError([ share, video ]);\n useHardGateInsights(props.shareId);\n\n const engagement = Flight.useBasicFetch<Engagement[]>(\n VideoViewsV2Requests.shareHeatMap(props.shareId)\n );\n\n const aggregateEngagement = Flight.useBasicFetch<Engagement>(\n VideoViewsV2Requests.shareHeatMapAggregation(props.shareId)\n );\n\n const osCount = Flight.useBasicFetch<GroupedAnalyticsCount[]>(\n VideoViewsV2Requests.shareAggregation(props.shareId, 'os_name')\n );\n\n const { users, hasCompleted } = useInsightEngagement(props.shareId);\n \n const hasDataLoaded =\n config.hasCompleted &&\n video.hasCompleted &&\n engagement.hasCompleted &&\n aggregateEngagement.hasCompleted &&\n osCount.hasCompleted &&\n yearGroups.data &&\n hasCompleted;\n\n const videoInsightsAppLinks = getVideoInsightsAppLinks(share.data);\n\n return (\n <div className='px-3'>\n <InsightsHeader\n video={video.data}\n classroom={classroom.data}\n tabs={getInsightsVideoTabs(share.data, 'insights')}\n hasSchoolAnalytics={hasPermissions(PermissionName.ViewSchoolAnalytics)}\n analyticsWebUrl={config.data?.analyticsWebUrl}\n share={share.data}\n yearGroups={yearGroups.data}\n hasData={hasDataLoaded && !!users?.length}\n viewInsightsGatedPermission={getGatedPermission(PermissionName.ViewInsights)}\n />\n\n <VideoInsightsOverview\n hasDataLoaded={!!hasDataLoaded}\n hasClassrooms={hasClassrooms}\n anonymiseUsers={anonymiseUsers}\n videoInsightsAppLinks={videoInsightsAppLinks}\n config={config.data}\n video={video.data}\n classroomStudents={classroomStudents.items}\n viewers={users}\n individualEngagement={engagement.data}\n aggregateEngagement={aggregateEngagement.data}\n share={share.data}\n osCount={osCount.data}\n />\n </div>\n );\n}\n","import React from 'react';\n\nimport { FilterStudentsBy, SortStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { Share } from 'libs/shared/apps/share/interfaces/Share';\nimport { MasterType } from 'libs/shared/enums/MasterType';\n\nimport { InsightsTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\nimport { InsightsHeatmapView } from 'apps/my-shares/views/heatmap/InsightsHeatmapView';\nimport { InteractiveInsightsOverviewView } from 'apps/my-shares/views/interactive/overview/InteractiveInsightsOverviewView';\nimport { InteractiveInsightsQuestionsView } from 'apps/my-shares/views/interactive/questions/InteractiveInsightsQuestionsView';\nimport { InteractiveInsightsStudentsView } from 'apps/my-shares/views/interactive/students/InteractiveInsightsStudentsView';\nimport { VideoInsightsOverviewView } from 'apps/my-shares/views/video/overview/VideoInsightsOverviewView';\n\ninterface UseInsightsViewOptions {\n share: Share | undefined;\n tab: InsightsTabs;\n interactionId: string;\n sortBy: SortStudentsBy;\n filterBy: FilterStudentsBy;\n}\n\ntype ShareContext = Omit<UseInsightsViewOptions, 'tab'>;\ntype ViewFn = (ctx: ShareContext) => JSX.Element;\ntype ViewRegistry = Partial<Record<MasterType, Partial<Record<InsightsTabs, ViewFn>>>>;\n\nconst INSIGHTS_VIEWS: ViewRegistry = {\n [MasterType.Video]: {\n insights: ctx => <VideoInsightsOverviewView shareId={ctx.share.shareId} />,\n heatmap: ctx => <InsightsHeatmapView shareId={ctx.share.shareId} />\n },\n [MasterType.Clip]: {\n insights: ctx => <VideoInsightsOverviewView shareId={ctx.share.shareId} />,\n heatmap: ctx => <InsightsHeatmapView shareId={ctx.share.shareId} />\n },\n [MasterType.Interactive]: {\n insights: ctx => <InteractiveInsightsOverviewView shareId={ctx.share.shareId} />,\n heatmap: ctx => <InsightsHeatmapView shareId={ctx.share.shareId} />,\n questions: ctx => (\n <InteractiveInsightsQuestionsView\n interactionId={ctx.interactionId}\n sortBy={ctx.sortBy}\n shareId={ctx.share.shareId}\n />\n ),\n results: ctx => (\n <InteractiveInsightsStudentsView\n filterBy={ctx.filterBy}\n sortBy={ctx.sortBy}\n shareId={ctx.share.shareId}\n />\n )\n }\n};\n\n/**\n * Takes any Share object and a tab, and returns the corresponding \"insights\" view.\n * This is just a utility hook, and as such doesn't need to set the page title directly.\n */\n// eslint-disable-next-line rulesdir/require-view-title\nexport function useInsightsView(options: UseInsightsViewOptions): JSX.Element {\n const { share, tab } = options;\n const viewFn = INSIGHTS_VIEWS[share?.objectTypeId]?.[tab];\n\n if (viewFn)\n return viewFn(options);\n\n return <></>;\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { Flight } from 'libs/common/react/index';\n\nimport { FilterStudentsBy, SortStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share/interfaces/Share';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { getShareOptionsAppLink } from 'shared/utils/ObjectAppLinkHelper';\n\nimport { InsightsTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\nimport { useInsightsView } from 'apps/my-shares/views/base-insights-view/useInsightsView';\n\ninterface BaseInsightsViewProps {\n shareId: string;\n tab: InsightsTabs;\n interactionId: string;\n sortBy: SortStudentsBy;\n filterBy: FilterStudentsBy;\n showShareOptions?: boolean;\n}\n\n/**\n * BaseInsightsView is a generic component that renders different \"insights\" views based on the provided share.\n * The child views will handle setting the page title and other specific details.\n * \n * It also handles the logic for showing share options if `showShareOptions` is true - which is currently used\n * in our used in our LCE emails.\n */\n// eslint-disable-next-line rulesdir/require-view-title\nexport function BaseInsightsView(props: BaseInsightsViewProps): JSX.Element {\n const share = Flight.useBasicFetch<Share>(ShareRequests.getShare(props.shareId));\n const { hasPermissions, isLoaded } = usePermissions();\n\n const view = useInsightsView({\n share: share.data,\n tab: props.tab,\n interactionId: props.interactionId,\n sortBy: props.sortBy,\n filterBy: props.filterBy\n });\n\n /**\n * If the showShareOptions is in the query params, we also want to show the share popup.\n */\n React.useEffect(() => {\n if (!props.showShareOptions) return;\n if (!share.data) return;\n\n const appLink = getShareOptionsAppLink(share.data);\n \n if (!appLink) return;\n\n Core.AppLinkHelper.trigger(appLink);\n }, [ share.data, props.showShareOptions ]);\n\n /**\n * If the user doesn't have insights permissions, redirect to the insights overview page.\n */\n React.useEffect(() => {\n if (!isLoaded) return;\n if (hasPermissions([ PermissionName.ViewInsights, PermissionName.ViewAnalytics ])) return;\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.HOME\n });\n }, [isLoaded]);\n \n if (!isLoaded)\n return <></>;\n\n return (\n <>\n {view}\n </>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"./DAXXjFlN.chunk.js";import{y as e}from"./BftnFbcr.chunk.js";import"./DFZS3Ffo.chunk.js";import{t}from"./CQyJ7YGa.chunk.js";import{t as n}from"./e57H3T-k.chunk.js";import{t as r}from"./C2w0pmFW.chunk.js";import{t as i}from"./wrLrTezN.chunk.js";import{t as a}from"./BXTI9cmX.chunk.js";import{u as o}from"./BX0wDJmp.chunk.js";import{H as s,l as c,y as l,z as u}from"./NlCAcBdo.chunk.js";import{t as d}from"./DGmmTRu72.chunk.js";import{t as f}from"./CVHQXNzi2.chunk.js";import{t as p}from"./BrbeV-Gn2.chunk.js";import{t as m}from"./DZssmXj6.chunk.js";import{t as h}from"./LoQS6GjP.chunk.js";import{t as g}from"./eoAypzU3.chunk.js";import{t as _}from"./_GCZ-60i.chunk.js";import{r as v}from"./CsWeCs8U2.chunk.js";import{t as y}from"./DaT2nTfp.chunk.js";import{t as b}from"./C-k6FY-f.chunk.js";import{t as x}from"./jAbfamoi.chunk.js";import{t as S}from"./
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import"./DAXXjFlN.chunk.js";import{y as e}from"./BftnFbcr.chunk.js";import"./DFZS3Ffo.chunk.js";import{t}from"./CQyJ7YGa.chunk.js";import{t as n}from"./e57H3T-k.chunk.js";import{t as r}from"./C2w0pmFW.chunk.js";import{t as i}from"./wrLrTezN.chunk.js";import{t as a}from"./BXTI9cmX.chunk.js";import{u as o}from"./BX0wDJmp.chunk.js";import{H as s,l as c,y as l,z as u}from"./NlCAcBdo.chunk.js";import{t as d}from"./DGmmTRu72.chunk.js";import{t as f}from"./CVHQXNzi2.chunk.js";import{t as p}from"./BrbeV-Gn2.chunk.js";import{t as m}from"./DZssmXj6.chunk.js";import{t as h}from"./LoQS6GjP.chunk.js";import{t as g}from"./eoAypzU3.chunk.js";import{t as _}from"./_GCZ-60i.chunk.js";import{r as v}from"./CsWeCs8U2.chunk.js";import{t as y}from"./DaT2nTfp.chunk.js";import{t as b}from"./C-k6FY-f.chunk.js";import{t as x}from"./jAbfamoi.chunk.js";import{t as S}from"./jAtAipGN.chunk.js";import{t as C}from"./CCb14vhF.chunk.js";import{n as w}from"./D6bsI9KZ.chunk.js";import{t as T}from"./DkxWaE9O.chunk.js";r();var E=x(),D=i(),O=`shared.videoGuidanceClassroomGuidePopup`,k=350;function A(e){function n(t){return e.curriculums.updateCurriculum(t,{shouldLog:!0,video:e.video,locationContext:l.CurriculumGuidancePopup})}return(0,D.jsx)(y,{closePopup:e.onClickClose,showLoadingSpinner:e.isLoading,title:t.getPhrase(O,`curriculumLinks`),size:`lg`,children:!e.isLoading&&(0,D.jsxs)(D.Fragment,{children:[(0,D.jsxs)(E.Scrollbars,{autoHeightMax:k,autoHeightMin:k,autoHeight:!0,className:`pb-3`,renderThumbVertical:({style:e,...t})=>(0,D.jsx)(`div`,{...t,style:{...e,borderRadius:`inherit`,backgroundColor:`rgba(0, 0, 0, 0.2)`,zIndex:5},className:`thumb-vertical`}),children:[(0,D.jsx)(T,{availableCurriculums:e.curriculums.availableCurriculums,onChangeCurriculum:n,selectedCurriculum:e.curriculums.preferredCurriculum}),(0,D.jsx)(`div`,{className:`pb-3`,children:(0,D.jsx)(w,{curriculumLinks:e.curriculums.curriculumLinks,onChangeCurriculum:n,hasCompleted:e.curriculums.hasCompleted,mappedCurriculums:e.curriculums.mappedCurriculums,isFetching:e.curriculums.isFetching,getCodeAppLink:e.getCodeAppLink,locationContext:l.CurriculumGuidancePopup})})]}),(0,D.jsxs)(b,{children:[(0,D.jsx)(b.Cancel,{onClick:e.onClickClose,text:t.getPhrase(O,`close`)}),(0,D.jsx)(b.Submit,{text:t.getPhrase(O,`viewVideo`),variant:`dark`,onClick:e.onClickViewVideo})]})]})})}function j(t){function r(){return t.type===f.Video?h.video(t.id):m.clip(t.id)}let i=o(r()),y=C(t.id),{hasNewSearch:b}=d(null);function x(){_.logUserAction({id:i.data.id,name:i.data.name},{entity:p.isVideo(i.data)?c.Video:c.Clip,location:l.CurriculumGuidancePopup,actionType:u.Click,descriptor:s.Close}),t.closePopup()}function w(){if(_.logUserAction({id:i.data.id,name:i.data.name},{entity:p.isVideo(i.data)?c.Video:c.Clip,location:l.CurriculumGuidancePopup,actionType:u.Click,descriptor:s.ViewVideo}),p.isVideo(i.data)){e.trigger({application:a.VIDEOS,action:g.Videos.PLAY_VIDEO,args:[null,i.data.id,n.slugify(i.data.name)]}),t.closePopup();return}e.trigger({application:a.CLIPS,action:g.Clips.PLAY_CLIP,args:[i.data.id,n.slugify(i.data.name)]}),t.closePopup()}return(0,D.jsx)(A,{isLoading:!i.hasCompleted,video:i.data,curriculums:y,onClickClose:x,onClickViewVideo:w,closePopup:t.closePopup,getCodeAppLink:(e,t)=>b?S.getSearchAppLink(e,{[v]:t}):null})}export{j as VideoGuidanceClassroomGuideView};
|
|
2
|
+
//# sourceMappingURL=CpzveYo2.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"CpzveYo2.chunk.js","names":[],"sources":["../../../../libs/shared/src/components/video-guidance/classroom-guide/popup/VideoGuidanceClassroomGuidePopup.tsx","../../src/shared/views/video-guidance-classroom-guide/VideoGuidanceClassroomGuideView.tsx"],"sourcesContent":["import React from 'react';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { CurriculumDropdown } from 'libs/shared/components/curriculum-links/CurriculumDropdown';\nimport { CurriculumLinks } from 'libs/shared/components/curriculum-links/CurriculumLinks';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Clip, CurriculumData, PopupViewProps, Video } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.videoGuidanceClassroomGuidePopup';\n\nconst MIN_MAX_HEIGHT = 350;\n\ninterface VideoGuidanceClassroomGuidePopupProps extends PopupViewProps {\n isLoading: boolean;\n video: Video | Clip;\n onClickClose: () => void;\n onClickViewVideo: () => void;\n curriculums: CurriculumData;\n getCodeAppLink?: (query: string, isCode: boolean) => Core.AppLink;\n}\n\nexport function VideoGuidanceClassroomGuidePopup(props: VideoGuidanceClassroomGuidePopupProps): JSX.Element {\n function onChangeCurriculum(curriculumId: string): Promise<void> {\n return props.curriculums.updateCurriculum(curriculumId, {\n shouldLog: true,\n video: props.video,\n locationContext: LocationContext.CurriculumGuidancePopup\n });\n }\n\n return (\n <Popup\n closePopup={props.onClickClose}\n showLoadingSpinner={props.isLoading}\n title={LanguageService.getPhrase(namespace, 'curriculumLinks')}\n size='lg'\n >\n {!props.isLoading && (\n <>\n <Scrollbars\n autoHeightMax={MIN_MAX_HEIGHT}\n autoHeightMin={MIN_MAX_HEIGHT}\n autoHeight\n className='pb-3'\n // move vertical scrollbar to the top\n renderThumbVertical={({ style, ...props }) => <div {...props} style={{ ...style, borderRadius: 'inherit', backgroundColor: 'rgba(0, 0, 0, 0.2)', zIndex: 5 }} className='thumb-vertical'/>}\n >\n <CurriculumDropdown\n availableCurriculums={props.curriculums.availableCurriculums}\n onChangeCurriculum={onChangeCurriculum}\n selectedCurriculum={props.curriculums.preferredCurriculum}\n />\n\n <div className='pb-3'>\n <CurriculumLinks\n curriculumLinks={props.curriculums.curriculumLinks}\n onChangeCurriculum={onChangeCurriculum}\n hasCompleted={props.curriculums.hasCompleted}\n mappedCurriculums={props.curriculums.mappedCurriculums}\n isFetching={props.curriculums.isFetching}\n getCodeAppLink={props.getCodeAppLink}\n locationContext={LocationContext.CurriculumGuidancePopup}\n />\n </div>\n </Scrollbars>\n\n <PopupButtons>\n <PopupButtons.Cancel\n onClick={props.onClickClose}\n text={LanguageService.getPhrase(namespace, 'close')}\n />\n <PopupButtons.Submit\n text={LanguageService.getPhrase(namespace, 'viewVideo')}\n variant='dark'\n onClick={props.onClickViewVideo}\n />\n </PopupButtons>\n </>\n )}\n </Popup>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { Flight } from 'libs/common/react/index';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction, VideoGuidanceDescriptor } from 'libs/analytics/interfaces';\n\nimport { SEARCH_CURRICULUM_CODE_PARAM } from 'libs/shared/apps/search/utils/SharedSearchHelper';\nimport { VideoGuidanceClassroomGuidePopup } from 'libs/shared/components/video-guidance/classroom-guide/popup/VideoGuidanceClassroomGuidePopup';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ClipRequests } from 'libs/shared/flight-requests/ClipRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Clip, PopupViewProps, Video } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { useCurriculums } from 'shared/hooks/useCurriculums';\n\nimport { SearchHelper } from 'apps/search/utils/SearchHelper';\n\ninterface VideoGuidanceClassroomGuideViewProps extends PopupViewProps {\n id: string;\n type: MasterType;\n}\n\n// eslint-disable-next-line rulesdir/require-view-title\nexport function VideoGuidanceClassroomGuideView(props: VideoGuidanceClassroomGuideViewProps): JSX.Element {\n function getRequest(): Flight.Request {\n return props.type === MasterType.Video ?\n VideoRequests.video(props.id) :\n ClipRequests.clip(props.id);\n }\n\n const video = Flight.useBasicFetch<Clip | Video>(getRequest());\n const curriculums = useCurriculums(props.id);\n const { hasNewSearch } = useSettings(null);\n\n function onClickClose(): void {\n AnalyticsHelper.logUserAction({\n id: video.data.id,\n name: video.data.name\n }, {\n entity: VideoHelper.isVideo(video.data) ?\n EntityType.Video :\n EntityType.Clip,\n location: LocationContext.CurriculumGuidancePopup,\n actionType: UserAction.Click,\n descriptor: VideoGuidanceDescriptor.Close\n });\n\n props.closePopup();\n }\n\n function onClickViewVideo(): void {\n AnalyticsHelper.logUserAction({\n id: video.data.id,\n name: video.data.name\n }, {\n entity: VideoHelper.isVideo(video.data) ?\n EntityType.Video :\n EntityType.Clip,\n location: LocationContext.CurriculumGuidancePopup,\n actionType: UserAction.Click,\n descriptor: VideoGuidanceDescriptor.ViewVideo\n });\n\n if (VideoHelper.isVideo(video.data)) {\n Core.AppLinkHelper.trigger({\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PLAY_VIDEO,\n args: [ null, video.data.id, TextHelper.slugify(video.data.name) ]\n });\n\n props.closePopup();\n\n return;\n }\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.CLIPS,\n action: Actions.Clips.PLAY_CLIP,\n args: [ video.data.id, TextHelper.slugify(video.data.name) ]\n });\n\n props.closePopup();\n }\n\n return (\n <VideoGuidanceClassroomGuidePopup\n isLoading={!video.hasCompleted}\n video={video.data}\n curriculums={curriculums}\n onClickClose={onClickClose}\n onClickViewVideo={onClickViewVideo}\n closePopup={props.closePopup}\n getCodeAppLink={(query, isCode) => {\n if (!hasNewSearch)\n return null;\n\n return SearchHelper.getSearchAppLink(query, { [SEARCH_CURRICULUM_CODE_PARAM]: isCode });\n }}\n />\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import{o as e}from"./DAXXjFlN.chunk.js";import{t}from"./C2w0pmFW.chunk.js";import{t as n}from"./wrLrTezN.chunk.js";import{t as r}from"./lhZ5v-iN2.chunk.js";import{f as i,m as a,n as o}from"./
|
|
1
|
+
import{o as e}from"./DAXXjFlN.chunk.js";import{t}from"./C2w0pmFW.chunk.js";import{t as n}from"./wrLrTezN.chunk.js";import{t as r}from"./lhZ5v-iN2.chunk.js";import{f as i,m as a,n as o}from"./DKDWcWxk.chunk.js";var s=a.getComponent(`Button`),c=class extends s{constructor(e,t){super(e,t),this.update()}update(){this.options_.activityStatus===r.Complete?this.addClass(`cv-activity-completed`):this.removeClass(`cv-activity-completed`)}handleClick(...e){this.options_.activityStatus=this.getToggledActivityStatus(),this.update(),this.options_.clickHandler&&this.options_.clickHandler.call(this,e)}buildCSSClass(){return`cv-activity-status-button`}getToggledActivityStatus(){if(this.options_.activityStatus===r.None||this.options_.activityStatus===r.Incomplete)return r.Complete;if(this.options_.activityStatus===r.Complete)return r.Incomplete}};c.prototype.controlText_=`Complete`;var l=a.getPlugin(`plugin`),u=class extends l{setActivityStatus(e,t){e!==this.activityStatus&&(this.activityStatus=e,this.onToggleStatus=t,this.player.ready(()=>{this.renderActivityStatusButton()}))}renderActivityStatusButton(){this.button&&this.player.removeChild(this.button),this.button=new c(this.player,{activityStatus:this.activityStatus,clickHandler:this.onToggleStatus}),this.player.addChild(this.button)}};a.registerPlugin(`activityStatusPlugin`,u);var d=e(t()),f=n();function p(e){let[t,n]=d.useState(5);if(d.useEffect(()=>{let e=setInterval(()=>{n(e=>e-1)},1e3);return()=>{clearInterval(e)}},[]),d.useEffect(()=>{t===0&&e.onPlayNext()},[t]),!e.nextVideo||!e.onPlayNext)return(0,f.jsx)(f.Fragment,{});let r=Math.ceil(t),i=r===1?`second`:`seconds`;return(0,f.jsx)(f.Fragment,{children:(0,f.jsxs)(`div`,{className:`cv-up-next-container`,children:[(0,f.jsx)(`div`,{className:`cv-cancel-up-next cursor-pointer`,role:`button`,onClick:e.onCancel,children:`×`}),(0,f.jsxs)(`div`,{className:`cv-up-next-heading`,children:[`Up next in `,r,` `,i,`:`]}),(0,f.jsx)(`div`,{className:`cv-up-next-image cursor-pointer`,onClick:e.onPlayNext,style:{backgroundImage:`url(${e.nextVideo?.thumbnailUrl})`}}),(0,f.jsx)(`div`,{className:`cv-up-next-title`,children:e.nextVideo.name})]})})}a.registerComponent(`UpNext`,o((e,t)=>(0,f.jsx)(p,{player:e,...t})));var m=a.getComponent(`MenuItem`),h=class extends m{constructor(e,t){super(e,t),this.bindListeners(),this.player_.nextVideoPlugin().getShouldPlayNext()&&this.toggleOn()}bindListeners(){this.onPlayNextChange=this.onPlayNextChange.bind(this),this.player_.on(`cv:playnext`,this.onPlayNextChange)}handleToggle(){let e=this.player_.nextVideoPlugin().getShouldPlayNext();this.player_.nextVideoPlugin().setShouldPlayNext(!e,!0)}onPlayNextChange(e,t){t?this.toggleOn():this.toggleOff()}toggleOn(){a.dom.addClass(this.toggleEl,`on`)}toggleOff(){a.dom.removeClass(this.toggleEl,`on`)}handleClick(e){e.stopImmediatePropagation()}createEl(e,t,n){this.handlerBound||=(this.handleToggle=this.handleToggle.bind(this),!0),this.toggleEl&&this.toggleEl.removeEventListener(`click`,this.handleToggle),this.toggleEl=a.dom.createEl(`div`,{className:`custom-toggle custom-toggle-info toggle-option float-end`,innerHTML:`<span class="handle"></span></div>`}),this.toggleEl.addEventListener(`click`,this.handleToggle);let r=super.createEl(e,{className:`vjs-menu-item cv-cog-menu-item cv-play-next-toggle`,innerHTML:`
|
|
2
2
|
<span class="vjs-menu-item-text">Play next video</span>
|
|
3
3
|
<span class="cv-toggle-container"></span>`},n);return r.children[1].appendChild(this.toggleEl),r}dispose(){this.player_.off(`cv:playnext`,this.onPlayNextChange),super.dispose()}};a.registerComponent(`NextVideoMenuItem`,h);var g=`cv-persisttest`,_=`cv-play-next-video`,v=a.getPlugin(`plugin`),y=a.getComponent(`NextVideoMenuItem`),b=class extends v{constructor(e){if(super(e),this.setShouldPlayNext=this.setShouldPlayNext.bind(this),this.getShouldPlayNext=this.getShouldPlayNext.bind(this),this.getChapterTrack=this.getChapterTrack.bind(this),this.onTimeUpdate=this.onTimeUpdate.bind(this),this.hasLocalStorage=this.testHasLocalStorage(),this.shouldPlayNextVideo=!1,this.hasLocalStorage){let e=window.localStorage.getItem(_);this.shouldPlayNextVideo=e===`true`}e.ready(()=>{this.initialize()})}initialize(){this.player.isDisposed()||this.bindListeners()}getChapterTrack(){return i.getTrack(this.player,`chapters`,null)}setNextVideo(e,t,n){this.nextVideo=e,this.callback=n,t&&this.setShouldPlayNext(!0),(this.player.getChild(`collapserator`)?.getChild(`cogButton`)).addItem({ctor:y,name:`NextVideoMenuItem`})}getShouldPlayNext(){return this.shouldPlayNextVideo}setShouldPlayNext(e,t){this.shouldPlayNextVideo=e,this.player.trigger(`cv:playnext`,e),this.hasLocalStorage&&t&&window.localStorage.setItem(_,e.toString()),e&&this.player.loopVideoPlugin().loop(!1)}bindListeners(){this.player.on(`timeupdate`,this.onTimeUpdate)}dispose(){this.player.off(`timeupdate`,this.onTimeUpdate),this.hideUpNext(),super.dispose()}onTimeUpdate(){if(!(this.player.pictureInPicture&&this.player.isInPictureInPicture())){if(!this.getShouldPlayNext()){this.hideUpNext();return}if(this.upNextRendered&&this.player.currentTime()<this.player.duration()){this.hideUpNext();return}this.player.ended()&&this.showUpNext()}}showUpNext(){this.upNextRendered||(this.upNextRendered=!0,this.player.addChild(`UpNext`,{nextVideo:this.nextVideo,onPlayNext:this.callback,onCancel:()=>{this.hideUpNext(),this.setShouldPlayNext(!1)}}))}hideUpNext(){if(!this.upNextRendered)return;this.upNextRendered=!1;let e=this.player.getChild(`UpNext`);e&&(this.player.removeChild(e),e.dispose())}testHasLocalStorage(){try{return window.localStorage.setItem(g,`persistPlayNext`),window.localStorage.removeItem(g),!0}catch{return!1}}};a.registerPlugin(`nextVideoPlugin`,b);var x=a.getComponent(`MenuItem`),S=class extends x{constructor(e,t){super(e,t),this.onLoopVideoChange=this.onLoopVideoChange.bind(this),this.player_.on(`cv:loopvideo`,this.onLoopVideoChange),this.onLoopVideoChange(null,this.player_.loopVideoPlugin().loop())}onLoopVideoChange(e,t){t?this.toggleOn():this.toggleOff()}handleToggle(){let e=this.player_.loopVideoPlugin().loop();this.player_.loopVideoPlugin().loop(!e)}toggleOn(){a.dom.addClass(this.toggleEl,`on`)}toggleOff(){a.dom.removeClass(this.toggleEl,`on`)}handleClick(e){e.stopImmediatePropagation()}createEl(e,t,n){this.handlerBound||=(this.handleToggle=this.handleToggle.bind(this),!0),this.toggleEl&&this.toggleEl.removeEventListener(`click`,this.handleToggle),this.toggleEl=a.dom.createEl(`div`,{className:`custom-toggle custom-toggle-info toggle-option float-end`,innerHTML:`<span class="handle"></span></div>`}),this.toggleEl.addEventListener(`click`,this.handleToggle);let r=super.createEl(e,{className:`vjs-menu-item cv-cog-menu-item cv-loop-video-toggle`,innerHTML:`
|
|
4
4
|
<span class="vjs-menu-item-text">Loop video</span>
|
|
5
5
|
<span class="cv-toggle-container"></span>`},n);return r.children[1].appendChild(this.toggleEl),r}dispose(){this.player_.off(`cv:loopvideo`,this.onLoopVideoChange),super.dispose()}};a.registerComponent(`LoopVideoMenuItem`,S);var C=a.getPlugin(`plugin`),w=a.getComponent(`LoopVideoMenuItem`),T=class extends C{constructor(e,t){super(e),t.allowLoop&&this.player.ready(()=>this.addButton()),this.onEnded=this.onEnded.bind(this),this.player.on(`ended`,this.onEnded)}addButton(){(this.player.getChild(`collapserator`)?.getChild(`cogButton`)).addItem({ctor:w,name:`LoopVideoMenuItem`})}onEnded(){this.player.loop()&&this.player.play()}loop(e){if(typeof e!=`boolean`)return this.player.loop();e&&this.player.nextVideoPlugin?.()?.setShouldPlayNext(!1,!1),this.player.trigger(`cv:loopvideo`,e),this.player.loop(e)}dispose(){this.player.off(`ended`,this.onEnded),super.dispose()}};a.registerPlugin(`loopVideoPlugin`,T);
|
|
6
|
-
//# sourceMappingURL=
|
|
6
|
+
//# sourceMappingURL=Cqq1N9xw.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CFduwlo0.chunk.js","names":[],"sources":["../../../player/src/plugins/activity-status-plugin/components/activity-status-button.ts","../../../player/src/plugins/activity-status-plugin/activity-status-plugin.ts","../../../player/src/plugins/next-video-plugin/components/up-next/up-next.scss","../../../player/src/plugins/next-video-plugin/components/up-next/up-next.tsx","../../../player/src/components/next-video-menu-item/next-video-menu-item.ts","../../../player/src/plugins/next-video-plugin/next-video-plugin.ts","../../../player/src/plugins/loop-video-plugin/components/loop-video-menu-item.ts","../../../player/src/plugins/loop-video-plugin/loop-video-plugin.ts"],"sourcesContent":["import videojs, { VideoJsPlayer } from 'video.js';\n\nimport { ShareActivityStatus } from 'libs/shared/enums/ShareActivityStatus';\n\nconst Button = videojs.getComponent('Button');\n\nimport './activity-status-button.scss';\n\ninterface ActivityStatusButtonOptions extends videojs.ComponentOptions {\n activityStatus: ShareActivityStatus;\n clickHandler: () => void;\n}\n\nexport class ActivityStatusButton extends Button {\n public options_: ActivityStatusButtonOptions;\n public controlText_: string;\n\n constructor(player: VideoJsPlayer, options: ActivityStatusButtonOptions) {\n super(player, options);\n\n this.update();\n }\n\n public update(): void {\n if (this.options_.activityStatus === ShareActivityStatus.Complete)\n this.addClass('cv-activity-completed');\n else\n this.removeClass('cv-activity-completed');\n }\n\n public handleClick(...args: any[]) {\n this.options_.activityStatus = this.getToggledActivityStatus();\n\n this.update();\n if (this.options_.clickHandler) {\n this.options_.clickHandler.call(this, args);\n }\n }\n\n public buildCSSClass(): string {\n return 'cv-activity-status-button';\n }\n\n private getToggledActivityStatus(): ShareActivityStatus {\n if (this.options_.activityStatus === ShareActivityStatus.None\n || this.options_.activityStatus === ShareActivityStatus.Incomplete) {\n return ShareActivityStatus.Complete;\n }\n\n if (this.options_.activityStatus === ShareActivityStatus.Complete) {\n return ShareActivityStatus.Incomplete;\n }\n }\n}\n\nActivityStatusButton.prototype.controlText_ = 'Complete';\n","import videojs from 'video.js';\n\nimport { ShareActivityStatus } from 'libs/shared/enums/ShareActivityStatus';\n\nimport { ActivityStatusButton } from 'projects/player/plugins/activity-status-plugin/components/activity-status-button';\n\nconst Plugin = videojs.getPlugin('plugin');\n\nclass ActivityStatusPlugin extends Plugin {\n private activityStatus: ShareActivityStatus;\n private onToggleStatus: () => void;\n private button: ActivityStatusButton;\n\n public setActivityStatus(activityStatus: ShareActivityStatus, onToggleStatus: () => void): void {\n if (activityStatus === this.activityStatus)\n return;\n\n this.activityStatus = activityStatus;\n this.onToggleStatus = onToggleStatus;\n\n this.player.ready(() => {\n this.renderActivityStatusButton();\n });\n }\n\n // Remove old button and render new button when activity status is different from previous status\n private renderActivityStatusButton(): void {\n if (this.button) {\n this.player.removeChild(this.button);\n }\n\n this.button = new ActivityStatusButton(this.player, {\n activityStatus: this.activityStatus,\n clickHandler: this.onToggleStatus\n });\n\n this.player.addChild(this.button);\n }\n}\n\nvideojs.registerPlugin('activityStatusPlugin', ActivityStatusPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n activityStatusPlugin(): ActivityStatusPlugin;\n }\n}\n","// This file is using some horrid valuies\n// It needs to be re-written this was just quickly thrown together\n// to show something at retro - Sha\n\n.video-js {\n .cv-up-next-container {\n position: absolute;\n bottom: 1.5em;\n color: $white;\n padding: 0.8em;\n width: 19em;\n border-radius: 0.3333em;\n background: $menu-bg;\n right: 1.5em;\n font-size: 1.5em;\n z-index: 6;\n }\n\n .cv-cancel-up-next {\n position: absolute;\n top: 0;\n right: 0.4em;\n font-size: 2em;\n }\n\n .cv-up-next-image {\n padding-bottom: 56.25%;\n background-size: contain;\n border-radius: 0.3333em;\n background-color: linear-gradient(to right, $gray-300, $gray-100);\n }\n\n .cv-up-next-heading {\n color: $white;\n padding-bottom: 0.6em;\n }\n\n .cv-up-next-title {\n color: $white;\n padding-top: 0.6em;\n }\n}","import * as React from 'react';\nimport videojs, { VideoJsPlayer } from 'video.js';\n\nimport { NextVideo } from 'projects/player/interfaces/NextVideo';\nimport { getReactComponent } from 'projects/player/react/react-component';\n\nimport './up-next.scss';\n\ninterface UpNextProps {\n player: VideoJsPlayer;\n nextVideo: NextVideo;\n onPlayNext: () => void;\n onCancel: () => void;\n}\n\nfunction UpNext(props: UpNextProps): JSX.Element {\n const [ timeRemaining, setTimeRemaining ] = React.useState(5);\n\n React.useEffect(() => {\n const timer = setInterval(() => {\n setTimeRemaining(prev => prev - 1);\n }, 1000);\n\n return () => {\n clearInterval(timer);\n };\n }, []);\n\n React.useEffect(() => {\n if (timeRemaining === 0)\n props.onPlayNext();\n }, [timeRemaining]);\n\n if (!props.nextVideo || !props.onPlayNext)\n return <></>;\n\n const roundedTimeRemaining = Math.ceil(timeRemaining);\n const secondsString = roundedTimeRemaining === 1 ? 'second' : 'seconds';\n\n return (\n <>\n <div className='cv-up-next-container'>\n <div className='cv-cancel-up-next cursor-pointer' role='button' onClick={props.onCancel}>×</div>\n <div className='cv-up-next-heading'>Up next in {roundedTimeRemaining} {secondsString}:</div>\n <div\n className='cv-up-next-image cursor-pointer'\n onClick={props.onPlayNext}\n style={{\n backgroundImage: `url(${props.nextVideo?.thumbnailUrl})`\n }}\n ></div>\n <div className='cv-up-next-title'>{props.nextVideo.name}</div>\n </div>\n </>\n );\n}\n\nvideojs.registerComponent(\n 'UpNext',\n getReactComponent(\n (player: VideoJsPlayer, options: UpNextProps) => <UpNext player={player} {...options} />\n )\n);\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport './next-video-menu-item.scss';\n\nconst MenuItem = videojs.getComponent('MenuItem');\n\nclass NextVideoMenuItem extends MenuItem {\n private toggleEl: Element;\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: videojs.ComponentOptions) {\n super(player, options);\n\n this.bindListeners();\n\n if (this.player_.nextVideoPlugin().getShouldPlayNext())\n this.toggleOn();\n }\n\n private bindListeners(): void {\n this.onPlayNextChange = this.onPlayNextChange.bind(this);\n\n this.player_.on('cv:playnext', this.onPlayNextChange);\n }\n\n public handleToggle(): void {\n const shouldPlayNext = this.player_.nextVideoPlugin().getShouldPlayNext();\n\n this.player_.nextVideoPlugin().setShouldPlayNext(!shouldPlayNext, true);\n }\n\n private onPlayNextChange(_: any, enabled: boolean): void {\n enabled ? this.toggleOn() : this.toggleOff();\n }\n\n private toggleOn(): void {\n videojs.dom.addClass(this.toggleEl, 'on');\n }\n\n private toggleOff(): void {\n videojs.dom.removeClass(this.toggleEl, 'on');\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\">Play next video</span>\n <span class=\"cv-toggle-container\"></span>`;\n\n const el = super.createEl(tagName, {\n className: 'vjs-menu-item cv-cog-menu-item cv-play-next-toggle',\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 public dispose(): void {\n this.player_.off('cv:playnext', this.onPlayNextChange);\n super.dispose();\n }\n}\n\nvideojs.registerComponent('NextVideoMenuItem', NextVideoMenuItem);\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport { CogButton } from 'projects/player/components/cog-button/cog-button';\nimport { NextVideo } from 'projects/player/interfaces/NextVideo';\nimport { TrackHelper } from 'projects/player/utils/track-helper';\n\nimport 'projects/player/plugins/next-video-plugin/components/up-next/up-next';\nimport 'projects/player/components/next-video-menu-item/next-video-menu-item';\n\nconst TEST = 'cv-persisttest';\nconst PLAY_NEXT = 'cv-play-next-video';\n\nconst Plugin = videojs.getPlugin('plugin');\nconst NextVideoMenuItem = videojs.getComponent('NextVideoMenuItem') as unknown as typeof videojs.MenuItem;\n\nclass NextVideoPlugin extends Plugin {\n private shouldPlayNextVideo: boolean;\n private hasLocalStorage: boolean;\n private nextVideoMenuItem: typeof videojs.MenuItem;\n\n private upNextRendered: boolean;\n\n private nextVideo: NextVideo;\n private callback: () => void;\n \n constructor(player: VideoJsPlayer) {\n super(player);\n\n this.setShouldPlayNext = this.setShouldPlayNext.bind(this);\n this.getShouldPlayNext = this.getShouldPlayNext.bind(this);\n this.getChapterTrack = this.getChapterTrack.bind(this);\n this.onTimeUpdate = this.onTimeUpdate.bind(this);\n\n this.hasLocalStorage = this.testHasLocalStorage();\n\n this.shouldPlayNextVideo = false;\n\n if (this.hasLocalStorage) {\n const item = window.localStorage.getItem(PLAY_NEXT);\n this.shouldPlayNextVideo = item === 'true';\n }\n\n player.ready(() => {\n this.initialize();\n });\n }\n \n private initialize(): void {\n if ((this.player as any).isDisposed())\n return;\n \n this.bindListeners();\n }\n\n private getChapterTrack(): TextTrack {\n return TrackHelper.getTrack(this.player, 'chapters', null);\n }\n\n public setNextVideo(nextVideo: NextVideo, playNext: boolean, callback: () => void): void {\n this.nextVideo = nextVideo;\n this.callback = callback;\n\n if (playNext)\n this.setShouldPlayNext(true);\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({ ctor: NextVideoMenuItem, name: 'NextVideoMenuItem' });\n }\n\n public getShouldPlayNext(): boolean {\n return this.shouldPlayNextVideo;\n }\n\n public setShouldPlayNext(val: boolean, persist?: boolean): void {\n this.shouldPlayNextVideo = val;\n this.player.trigger('cv:playnext', val);\n\n if (this.hasLocalStorage && persist)\n window.localStorage.setItem(PLAY_NEXT, val.toString());\n\n if (val)\n this.player.loopVideoPlugin().loop(false);\n }\n\n private bindListeners(): void {\n this.player.on('timeupdate', this.onTimeUpdate);\n }\n\n public dispose(): void {\n this.player.off('timeupdate', this.onTimeUpdate);\n\n this.hideUpNext();\n\n super.dispose();\n }\n\n private onTimeUpdate(): void {\n /**\n * Do nothing when in picture in picture.\n * TODO: Figure out how next video should work for PiP\n */\n if (this.player.pictureInPicture && this.player.isInPictureInPicture())\n return;\n\n if (!this.getShouldPlayNext()) {\n this.hideUpNext();\n return;\n }\n\n /*\n * Always hide the up-next tile if the video is not at the end\n */\n if (this.upNextRendered && this.player.currentTime() < this.player.duration()) {\n this.hideUpNext();\n return;\n }\n\n /*\n * Show the up-next tile when the video has finished\n */\n if (this.player.ended()) {\n this.showUpNext();\n }\n }\n\n private showUpNext(): void {\n if (this.upNextRendered)\n return;\n\n this.upNextRendered = true;\n\n this.player.addChild('UpNext', {\n nextVideo: this.nextVideo,\n onPlayNext: this.callback,\n onCancel: () => {\n this.hideUpNext();\n this.setShouldPlayNext(false);\n }\n });\n }\n\n private hideUpNext(): void {\n if (!this.upNextRendered)\n return;\n\n this.upNextRendered = false;\n\n const upNext = this.player.getChild('UpNext');\n\n if (upNext) {\n this.player.removeChild(upNext);\n upNext.dispose();\n }\n }\n\n private testHasLocalStorage(): boolean {\n try {\n window.localStorage.setItem(TEST, 'persistPlayNext');\n window.localStorage.removeItem(TEST);\n return true;\n } catch {\n return false;\n }\n }\n}\n\nvideojs.registerPlugin('nextVideoPlugin', NextVideoPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n nextVideoPlugin(): NextVideoPlugin;\n }\n}\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport './loop-video-menu-item.scss';\n\nconst MenuItem = videojs.getComponent('MenuItem');\n\nexport class LoopVideoMenuItem extends MenuItem {\n private toggleEl: Element;\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: videojs.ComponentOptions) {\n super(player, options);\n\n this.onLoopVideoChange = this.onLoopVideoChange.bind(this);\n\n this.player_.on('cv:loopvideo', this.onLoopVideoChange);\n\n this.onLoopVideoChange(null, this.player_.loopVideoPlugin().loop());\n }\n\n private onLoopVideoChange(_: any, enabled: boolean): void {\n enabled ? this.toggleOn() : this.toggleOff();\n }\n\n public handleToggle(): void {\n const loop = this.player_.loopVideoPlugin().loop();\n\n this.player_.loopVideoPlugin().loop(!loop);\n }\n\n private toggleOn(): void {\n videojs.dom.addClass(this.toggleEl, 'on');\n }\n\n private toggleOff(): void {\n videojs.dom.removeClass(this.toggleEl, 'on');\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\">Loop video</span>\n <span class=\"cv-toggle-container\"></span>`;\n\n const el = super.createEl(tagName, {\n className: 'vjs-menu-item cv-cog-menu-item cv-loop-video-toggle',\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 public dispose(): void {\n this.player_.off('cv:loopvideo', this.onLoopVideoChange);\n super.dispose();\n }\n}\n\nvideojs.registerComponent('LoopVideoMenuItem', LoopVideoMenuItem);\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport { CogButton } from 'projects/player/components/cog-button/cog-button';\n\nimport 'projects/player/plugins/loop-video-plugin/components/loop-video-menu-item';\n\nconst Plugin = videojs.getPlugin('plugin');\nconst LoopVideoMenuItem = videojs.getComponent('LoopVideoMenuItem') as unknown as typeof videojs.MenuItem;\n\ninterface LoopVideoPluginOptions {\n allowLoop: boolean;\n}\n\nclass LoopVideoPlugin extends Plugin {\n constructor(player: VideoJsPlayer, options: LoopVideoPluginOptions) {\n super(player);\n\n // Button must be added after ctor finishes, otherwise subsequent calls to\n // this.player.loopVideoPlugin() will try make a new plugin - Sha\n if (options.allowLoop)\n this.player.ready(() => this.addButton());\n\n this.onEnded = this.onEnded.bind(this);\n this.player.on('ended', this.onEnded);\n }\n\n private addButton(): void {\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({ ctor: LoopVideoMenuItem, name: 'LoopVideoMenuItem' });\n }\n\n private onEnded(): void {\n // turns out the regular loop functionality doesn't work with clips.\n // this call will just do nothing for videos - Sha\n if (this.player.loop())\n this.player.play();\n }\n\n public loop(enabled: boolean): void;\n public loop(): boolean ;\n public loop(enabled?: boolean): any {\n if (typeof enabled !== 'boolean')\n return this.player.loop();\n\n if (enabled)\n this.player.nextVideoPlugin?.()?.setShouldPlayNext(false, false);\n\n this.player.trigger('cv:loopvideo', enabled);\n this.player.loop(enabled);\n }\n\n public dispose(): void {\n this.player.off('ended', this.onEnded);\n super.dispose();\n }\n}\n\nvideojs.registerPlugin('loopVideoPlugin', LoopVideoPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n loopVideoPlugin(options?: LoopVideoPluginOptions): LoopVideoPlugin;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Cqq1N9xw.chunk.js","names":[],"sources":["../../../player/src/plugins/activity-status-plugin/components/activity-status-button.ts","../../../player/src/plugins/activity-status-plugin/activity-status-plugin.ts","../../../player/src/plugins/next-video-plugin/components/up-next/up-next.scss","../../../player/src/plugins/next-video-plugin/components/up-next/up-next.tsx","../../../player/src/components/next-video-menu-item/next-video-menu-item.ts","../../../player/src/plugins/next-video-plugin/next-video-plugin.ts","../../../player/src/plugins/loop-video-plugin/components/loop-video-menu-item.ts","../../../player/src/plugins/loop-video-plugin/loop-video-plugin.ts"],"sourcesContent":["import videojs, { VideoJsPlayer } from 'video.js';\n\nimport { ShareActivityStatus } from 'libs/shared/enums/ShareActivityStatus';\n\nconst Button = videojs.getComponent('Button');\n\nimport './activity-status-button.scss';\n\ninterface ActivityStatusButtonOptions extends videojs.ComponentOptions {\n activityStatus: ShareActivityStatus;\n clickHandler: () => void;\n}\n\nexport class ActivityStatusButton extends Button {\n public options_: ActivityStatusButtonOptions;\n public controlText_: string;\n\n constructor(player: VideoJsPlayer, options: ActivityStatusButtonOptions) {\n super(player, options);\n\n this.update();\n }\n\n public update(): void {\n if (this.options_.activityStatus === ShareActivityStatus.Complete)\n this.addClass('cv-activity-completed');\n else\n this.removeClass('cv-activity-completed');\n }\n\n public handleClick(...args: any[]) {\n this.options_.activityStatus = this.getToggledActivityStatus();\n\n this.update();\n if (this.options_.clickHandler) {\n this.options_.clickHandler.call(this, args);\n }\n }\n\n public buildCSSClass(): string {\n return 'cv-activity-status-button';\n }\n\n private getToggledActivityStatus(): ShareActivityStatus {\n if (this.options_.activityStatus === ShareActivityStatus.None\n || this.options_.activityStatus === ShareActivityStatus.Incomplete) {\n return ShareActivityStatus.Complete;\n }\n\n if (this.options_.activityStatus === ShareActivityStatus.Complete) {\n return ShareActivityStatus.Incomplete;\n }\n }\n}\n\nActivityStatusButton.prototype.controlText_ = 'Complete';\n","import videojs from 'video.js';\n\nimport { ShareActivityStatus } from 'libs/shared/enums/ShareActivityStatus';\n\nimport { ActivityStatusButton } from 'projects/player/plugins/activity-status-plugin/components/activity-status-button';\n\nconst Plugin = videojs.getPlugin('plugin');\n\nclass ActivityStatusPlugin extends Plugin {\n private activityStatus: ShareActivityStatus;\n private onToggleStatus: () => void;\n private button: ActivityStatusButton;\n\n public setActivityStatus(activityStatus: ShareActivityStatus, onToggleStatus: () => void): void {\n if (activityStatus === this.activityStatus)\n return;\n\n this.activityStatus = activityStatus;\n this.onToggleStatus = onToggleStatus;\n\n this.player.ready(() => {\n this.renderActivityStatusButton();\n });\n }\n\n // Remove old button and render new button when activity status is different from previous status\n private renderActivityStatusButton(): void {\n if (this.button) {\n this.player.removeChild(this.button);\n }\n\n this.button = new ActivityStatusButton(this.player, {\n activityStatus: this.activityStatus,\n clickHandler: this.onToggleStatus\n });\n\n this.player.addChild(this.button);\n }\n}\n\nvideojs.registerPlugin('activityStatusPlugin', ActivityStatusPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n activityStatusPlugin(): ActivityStatusPlugin;\n }\n}\n","// This file is using some horrid valuies\n// It needs to be re-written this was just quickly thrown together\n// to show something at retro - Sha\n\n.video-js {\n .cv-up-next-container {\n position: absolute;\n bottom: 1.5em;\n color: $white;\n padding: 0.8em;\n width: 19em;\n border-radius: 0.3333em;\n background: $menu-bg;\n right: 1.5em;\n font-size: 1.5em;\n z-index: 6;\n }\n\n .cv-cancel-up-next {\n position: absolute;\n top: 0;\n right: 0.4em;\n font-size: 2em;\n }\n\n .cv-up-next-image {\n padding-bottom: 56.25%;\n background-size: contain;\n border-radius: 0.3333em;\n background-color: linear-gradient(to right, $gray-300, $gray-100);\n }\n\n .cv-up-next-heading {\n color: $white;\n padding-bottom: 0.6em;\n }\n\n .cv-up-next-title {\n color: $white;\n padding-top: 0.6em;\n }\n}","import * as React from 'react';\nimport videojs, { VideoJsPlayer } from 'video.js';\n\nimport { NextVideo } from 'projects/player/interfaces/NextVideo';\nimport { getReactComponent } from 'projects/player/react/react-component';\n\nimport './up-next.scss';\n\ninterface UpNextProps {\n player: VideoJsPlayer;\n nextVideo: NextVideo;\n onPlayNext: () => void;\n onCancel: () => void;\n}\n\nfunction UpNext(props: UpNextProps): JSX.Element {\n const [ timeRemaining, setTimeRemaining ] = React.useState(5);\n\n React.useEffect(() => {\n const timer = setInterval(() => {\n setTimeRemaining(prev => prev - 1);\n }, 1000);\n\n return () => {\n clearInterval(timer);\n };\n }, []);\n\n React.useEffect(() => {\n if (timeRemaining === 0)\n props.onPlayNext();\n }, [timeRemaining]);\n\n if (!props.nextVideo || !props.onPlayNext)\n return <></>;\n\n const roundedTimeRemaining = Math.ceil(timeRemaining);\n const secondsString = roundedTimeRemaining === 1 ? 'second' : 'seconds';\n\n return (\n <>\n <div className='cv-up-next-container'>\n <div className='cv-cancel-up-next cursor-pointer' role='button' onClick={props.onCancel}>×</div>\n <div className='cv-up-next-heading'>Up next in {roundedTimeRemaining} {secondsString}:</div>\n <div\n className='cv-up-next-image cursor-pointer'\n onClick={props.onPlayNext}\n style={{\n backgroundImage: `url(${props.nextVideo?.thumbnailUrl})`\n }}\n ></div>\n <div className='cv-up-next-title'>{props.nextVideo.name}</div>\n </div>\n </>\n );\n}\n\nvideojs.registerComponent(\n 'UpNext',\n getReactComponent(\n (player: VideoJsPlayer, options: UpNextProps) => <UpNext player={player} {...options} />\n )\n);\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport './next-video-menu-item.scss';\n\nconst MenuItem = videojs.getComponent('MenuItem');\n\nclass NextVideoMenuItem extends MenuItem {\n private toggleEl: Element;\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: videojs.ComponentOptions) {\n super(player, options);\n\n this.bindListeners();\n\n if (this.player_.nextVideoPlugin().getShouldPlayNext())\n this.toggleOn();\n }\n\n private bindListeners(): void {\n this.onPlayNextChange = this.onPlayNextChange.bind(this);\n\n this.player_.on('cv:playnext', this.onPlayNextChange);\n }\n\n public handleToggle(): void {\n const shouldPlayNext = this.player_.nextVideoPlugin().getShouldPlayNext();\n\n this.player_.nextVideoPlugin().setShouldPlayNext(!shouldPlayNext, true);\n }\n\n private onPlayNextChange(_: any, enabled: boolean): void {\n enabled ? this.toggleOn() : this.toggleOff();\n }\n\n private toggleOn(): void {\n videojs.dom.addClass(this.toggleEl, 'on');\n }\n\n private toggleOff(): void {\n videojs.dom.removeClass(this.toggleEl, 'on');\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\">Play next video</span>\n <span class=\"cv-toggle-container\"></span>`;\n\n const el = super.createEl(tagName, {\n className: 'vjs-menu-item cv-cog-menu-item cv-play-next-toggle',\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 public dispose(): void {\n this.player_.off('cv:playnext', this.onPlayNextChange);\n super.dispose();\n }\n}\n\nvideojs.registerComponent('NextVideoMenuItem', NextVideoMenuItem);\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport { CogButton } from 'projects/player/components/cog-button/cog-button';\nimport { NextVideo } from 'projects/player/interfaces/NextVideo';\nimport { TrackHelper } from 'projects/player/utils/track-helper';\n\nimport 'projects/player/plugins/next-video-plugin/components/up-next/up-next';\nimport 'projects/player/components/next-video-menu-item/next-video-menu-item';\n\nconst TEST = 'cv-persisttest';\nconst PLAY_NEXT = 'cv-play-next-video';\n\nconst Plugin = videojs.getPlugin('plugin');\nconst NextVideoMenuItem = videojs.getComponent('NextVideoMenuItem') as unknown as typeof videojs.MenuItem;\n\nclass NextVideoPlugin extends Plugin {\n private shouldPlayNextVideo: boolean;\n private hasLocalStorage: boolean;\n private nextVideoMenuItem: typeof videojs.MenuItem;\n\n private upNextRendered: boolean;\n\n private nextVideo: NextVideo;\n private callback: () => void;\n \n constructor(player: VideoJsPlayer) {\n super(player);\n\n this.setShouldPlayNext = this.setShouldPlayNext.bind(this);\n this.getShouldPlayNext = this.getShouldPlayNext.bind(this);\n this.getChapterTrack = this.getChapterTrack.bind(this);\n this.onTimeUpdate = this.onTimeUpdate.bind(this);\n\n this.hasLocalStorage = this.testHasLocalStorage();\n\n this.shouldPlayNextVideo = false;\n\n if (this.hasLocalStorage) {\n const item = window.localStorage.getItem(PLAY_NEXT);\n this.shouldPlayNextVideo = item === 'true';\n }\n\n player.ready(() => {\n this.initialize();\n });\n }\n \n private initialize(): void {\n if ((this.player as any).isDisposed())\n return;\n \n this.bindListeners();\n }\n\n private getChapterTrack(): TextTrack {\n return TrackHelper.getTrack(this.player, 'chapters', null);\n }\n\n public setNextVideo(nextVideo: NextVideo, playNext: boolean, callback: () => void): void {\n this.nextVideo = nextVideo;\n this.callback = callback;\n\n if (playNext)\n this.setShouldPlayNext(true);\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({ ctor: NextVideoMenuItem, name: 'NextVideoMenuItem' });\n }\n\n public getShouldPlayNext(): boolean {\n return this.shouldPlayNextVideo;\n }\n\n public setShouldPlayNext(val: boolean, persist?: boolean): void {\n this.shouldPlayNextVideo = val;\n this.player.trigger('cv:playnext', val);\n\n if (this.hasLocalStorage && persist)\n window.localStorage.setItem(PLAY_NEXT, val.toString());\n\n if (val)\n this.player.loopVideoPlugin().loop(false);\n }\n\n private bindListeners(): void {\n this.player.on('timeupdate', this.onTimeUpdate);\n }\n\n public dispose(): void {\n this.player.off('timeupdate', this.onTimeUpdate);\n\n this.hideUpNext();\n\n super.dispose();\n }\n\n private onTimeUpdate(): void {\n /**\n * Do nothing when in picture in picture.\n * TODO: Figure out how next video should work for PiP\n */\n if (this.player.pictureInPicture && this.player.isInPictureInPicture())\n return;\n\n if (!this.getShouldPlayNext()) {\n this.hideUpNext();\n return;\n }\n\n /*\n * Always hide the up-next tile if the video is not at the end\n */\n if (this.upNextRendered && this.player.currentTime() < this.player.duration()) {\n this.hideUpNext();\n return;\n }\n\n /*\n * Show the up-next tile when the video has finished\n */\n if (this.player.ended()) {\n this.showUpNext();\n }\n }\n\n private showUpNext(): void {\n if (this.upNextRendered)\n return;\n\n this.upNextRendered = true;\n\n this.player.addChild('UpNext', {\n nextVideo: this.nextVideo,\n onPlayNext: this.callback,\n onCancel: () => {\n this.hideUpNext();\n this.setShouldPlayNext(false);\n }\n });\n }\n\n private hideUpNext(): void {\n if (!this.upNextRendered)\n return;\n\n this.upNextRendered = false;\n\n const upNext = this.player.getChild('UpNext');\n\n if (upNext) {\n this.player.removeChild(upNext);\n upNext.dispose();\n }\n }\n\n private testHasLocalStorage(): boolean {\n try {\n window.localStorage.setItem(TEST, 'persistPlayNext');\n window.localStorage.removeItem(TEST);\n return true;\n } catch {\n return false;\n }\n }\n}\n\nvideojs.registerPlugin('nextVideoPlugin', NextVideoPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n nextVideoPlugin(): NextVideoPlugin;\n }\n}\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport './loop-video-menu-item.scss';\n\nconst MenuItem = videojs.getComponent('MenuItem');\n\nexport class LoopVideoMenuItem extends MenuItem {\n private toggleEl: Element;\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: videojs.ComponentOptions) {\n super(player, options);\n\n this.onLoopVideoChange = this.onLoopVideoChange.bind(this);\n\n this.player_.on('cv:loopvideo', this.onLoopVideoChange);\n\n this.onLoopVideoChange(null, this.player_.loopVideoPlugin().loop());\n }\n\n private onLoopVideoChange(_: any, enabled: boolean): void {\n enabled ? this.toggleOn() : this.toggleOff();\n }\n\n public handleToggle(): void {\n const loop = this.player_.loopVideoPlugin().loop();\n\n this.player_.loopVideoPlugin().loop(!loop);\n }\n\n private toggleOn(): void {\n videojs.dom.addClass(this.toggleEl, 'on');\n }\n\n private toggleOff(): void {\n videojs.dom.removeClass(this.toggleEl, 'on');\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\">Loop video</span>\n <span class=\"cv-toggle-container\"></span>`;\n\n const el = super.createEl(tagName, {\n className: 'vjs-menu-item cv-cog-menu-item cv-loop-video-toggle',\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 public dispose(): void {\n this.player_.off('cv:loopvideo', this.onLoopVideoChange);\n super.dispose();\n }\n}\n\nvideojs.registerComponent('LoopVideoMenuItem', LoopVideoMenuItem);\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport { CogButton } from 'projects/player/components/cog-button/cog-button';\n\nimport 'projects/player/plugins/loop-video-plugin/components/loop-video-menu-item';\n\nconst Plugin = videojs.getPlugin('plugin');\nconst LoopVideoMenuItem = videojs.getComponent('LoopVideoMenuItem') as unknown as typeof videojs.MenuItem;\n\ninterface LoopVideoPluginOptions {\n allowLoop: boolean;\n}\n\nclass LoopVideoPlugin extends Plugin {\n constructor(player: VideoJsPlayer, options: LoopVideoPluginOptions) {\n super(player);\n\n // Button must be added after ctor finishes, otherwise subsequent calls to\n // this.player.loopVideoPlugin() will try make a new plugin - Sha\n if (options.allowLoop)\n this.player.ready(() => this.addButton());\n\n this.onEnded = this.onEnded.bind(this);\n this.player.on('ended', this.onEnded);\n }\n\n private addButton(): void {\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({ ctor: LoopVideoMenuItem, name: 'LoopVideoMenuItem' });\n }\n\n private onEnded(): void {\n // turns out the regular loop functionality doesn't work with clips.\n // this call will just do nothing for videos - Sha\n if (this.player.loop())\n this.player.play();\n }\n\n public loop(enabled: boolean): void;\n public loop(): boolean ;\n public loop(enabled?: boolean): any {\n if (typeof enabled !== 'boolean')\n return this.player.loop();\n\n if (enabled)\n this.player.nextVideoPlugin?.()?.setShouldPlayNext(false, false);\n\n this.player.trigger('cv:loopvideo', enabled);\n this.player.loop(enabled);\n }\n\n public dispose(): void {\n this.player.off('ended', this.onEnded);\n super.dispose();\n }\n}\n\nvideojs.registerPlugin('loopVideoPlugin', LoopVideoPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n loopVideoPlugin(options?: LoopVideoPluginOptions): LoopVideoPlugin;\n }\n}\n"],"mappings":"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"}
|