@clickview/lite 0.104.0-rc.3 → 0.104.0-rc.5
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 +699 -699
- package/dist/bundles.json +1 -1
- package/dist/en.json +1 -1
- package/dist/scripts/{CW1i-QHv.chunk.js → -7qiRMLt.chunk.js} +2 -2
- package/dist/scripts/{CW1i-QHv.chunk.js.map → -7qiRMLt.chunk.js.map} +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/{Ta3cqTAC.chunk.js → AEOAlemi.chunk.js} +2 -2
- package/dist/scripts/{Ta3cqTAC.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/{ft2cSH-j.chunk.js → B3AhKFfz.chunk.js} +2 -2
- package/dist/scripts/{ft2cSH-j.chunk.js.map → B3AhKFfz.chunk.js.map} +1 -1
- package/dist/scripts/{DFFq-sgD.chunk.js → B3y60nT5.chunk.js} +2 -2
- package/dist/scripts/{DFFq-sgD.chunk.js.map → B3y60nT5.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/{B6GfukUn2.chunk.js → B_TE5XUR2.chunk.js} +2 -2
- package/dist/scripts/{B6GfukUn2.chunk.js.map → B_TE5XUR2.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/{VJQU9c4G2.chunk.js → Bld7iWR52.chunk.js} +2 -2
- package/dist/scripts/{VJQU9c4G2.chunk.js.map → Bld7iWR52.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/{9oMRc0cb2.chunk.js → CAs2Sere2.chunk.js} +2 -2
- package/dist/scripts/{9oMRc0cb2.chunk.js.map → CAs2Sere2.chunk.js.map} +1 -1
- package/dist/scripts/CCBk_ENs.chunk.js +1 -0
- package/dist/scripts/{qT_Twe2q.chunk.js → CMHxOVI7.chunk.js} +2 -2
- package/dist/scripts/{qT_Twe2q.chunk.js.map → CMHxOVI7.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/{CpzveYo2.chunk.js → CVL6bQWp.chunk.js} +2 -2
- package/dist/scripts/{CpzveYo2.chunk.js.map → CVL6bQWp.chunk.js.map} +1 -1
- package/dist/scripts/{CNPKh2z72.chunk.js → CX6c7KRp2.chunk.js} +2 -2
- package/dist/scripts/{CNPKh2z72.chunk.js.map → CX6c7KRp2.chunk.js.map} +1 -1
- package/dist/scripts/{BTm7hIyP2.chunk.js → CaCm4N_d2.chunk.js} +2 -2
- package/dist/scripts/{BTm7hIyP2.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/{C4OV7pr-.chunk.js → CmnbQiBA.chunk.js} +2 -2
- package/dist/scripts/{C4OV7pr-.chunk.js.map → CmnbQiBA.chunk.js.map} +1 -1
- package/dist/scripts/CpsbRDII.chunk.js +2 -0
- package/dist/scripts/{jAtAipGN.chunk.js.map → CpsbRDII.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/{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/{x2GB1P6E2.chunk.js → D3ncynN72.chunk.js} +3 -3
- package/dist/scripts/{x2GB1P6E2.chunk.js.map → D3ncynN72.chunk.js.map} +1 -1
- package/dist/scripts/{DH_0KtTK2.chunk.js → DICsRDM42.chunk.js} +2 -2
- package/dist/scripts/{DH_0KtTK2.chunk.js.map → DICsRDM42.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/{2p_6pVn6.chunk.js → DSPMbDdF.chunk.js} +2 -2
- package/dist/scripts/{2p_6pVn6.chunk.js.map → DSPMbDdF.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-LEZ4B6dG.js → app-BzH1hkoU.js} +4 -4
- package/dist/scripts/{app-LEZ4B6dG.js.map → app-BzH1hkoU.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/{Cl2FZEIX.chunk.js → fMgBORUX.chunk.js} +2 -2
- package/dist/scripts/{Cl2FZEIX.chunk.js.map → fMgBORUX.chunk.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/BILyzh0I.chunk.js +0 -1
- package/dist/scripts/jAtAipGN.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":"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"}
|
|
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{t as e}from"./DMnm3Ewv.chunk.js";import{n as t}from"./B785hxeE.chunk.js";import{t as n}from"./CQyJ7YGa.chunk.js";import{t as r}from"./C2w0pmFW.chunk.js";import{t as i}from"./wrLrTezN.chunk.js";import{u as a}from"./BX0wDJmp.chunk.js";import{y as o}from"./NlCAcBdo.chunk.js";import{t as s}from"./DGmmTRu72.chunk.js";import{t as c}from"./DbSUQ2A12.chunk.js";import{t as l}from"./DZssmXj6.chunk.js";import{t as u}from"./BC8PeYqm.chunk.js";import{t as d}from"./LoQS6GjP.chunk.js";import{t as f}from"./CqrjHjAN.chunk.js";import{t as p}from"./XIE88U01.chunk.js";import{n as m,t as h}from"./C6-aC3vu.chunk.js";import{t as g}from"./7LGxCHGV.chunk.js";import{t as _}from"./Bbv3vbm7.chunk.js";import{t as v}from"./B3gsVN-_.chunk.js";import{l as y,r as b}from"./
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import"./DAXXjFlN.chunk.js";import{t as e}from"./DMnm3Ewv.chunk.js";import{n as t}from"./B785hxeE.chunk.js";import{t as n}from"./CQyJ7YGa.chunk.js";import{t as r}from"./C2w0pmFW.chunk.js";import{t as i}from"./wrLrTezN.chunk.js";import{u as a}from"./BX0wDJmp.chunk.js";import{y as o}from"./NlCAcBdo.chunk.js";import{t as s}from"./DGmmTRu72.chunk.js";import{t as c}from"./DbSUQ2A12.chunk.js";import{t as l}from"./DZssmXj6.chunk.js";import{t as u}from"./BC8PeYqm.chunk.js";import{t as d}from"./LoQS6GjP.chunk.js";import{t as f}from"./CqrjHjAN.chunk.js";import{t as p}from"./XIE88U01.chunk.js";import{n as m,t as h}from"./C6-aC3vu.chunk.js";import{t as g}from"./7LGxCHGV.chunk.js";import{t as _}from"./Bbv3vbm7.chunk.js";import{t as v}from"./B3gsVN-_.chunk.js";import{l as y,r as b}from"./D-iyHqNw2.chunk.js";import{t as x}from"./Dfw0sxVt2.chunk.js";import{t as S}from"./C1loT8MD2.chunk.js";import{n as C}from"./ChnNWPOK2.chunk.js";import{t as w}from"./C9XBZFiR.chunk.js";import{t as T}from"./BnuuRu_J2.chunk.js";import{t as E}from"./CC5Dr9aG.chunk.js";import{t as D}from"./BYaCUOEW2.chunk.js";import{t as O}from"./DNuJUXpr2.chunk.js";import{v as k}from"./Bld7iWR52.chunk.js";import{t as A}from"./B_TE5XUR2.chunk.js";r();var j=i(),M=n.encloseNamespace(`shared.playClip`),N={notFound:p,forbidden:{privacy:_}};P.defaultProps={queryParams:{}};function P(n){let{context:r,contextId:i,mtv:p}=n.queryParams,{hasProduct:_}=x(),{commonVideoProps:P,hasCommonVideoPropsCompleted:F}=T({locationContext:o.PlayClip,mtv:p}),{hasPermissions:I}=v(),{hasTopicDirectories:L,hasPlayPageTranscript:R}=s(null),z=a(f.currentUser()),B=a(l.clip(n.id)),V=a(u.videoInteractives(n.id)),H=a(!!B.data?._parentVideo&&d.video(B.data._parentVideo.id));O([H.data]);let U=a(!!B.data?._parentVideo&&l.videoClips(B.data._parentVideo.id)),W=a(B.statusCode===e.Forbidden&&l.clip(n.id,c.StripMetadata)),G=b({video:H.data,context:r,contextId:i,moviesAndTv:p,currentUser:z.data}),K=D(),q=k(),J=y(n.id,!0),Y=S({objectId:B.data?.id,objectTypeId:B.data?.typeId}),X=E({name:B.data?.name});return h(m.getClipMetadata({content:B.data,phraseContext:{phraseHandler:M,titlePhrase:`pageTitle`,descriptionPhrase:`pageDescription`}})),w(B,N,{forbidden:!0}),O(G.videos??[]),g(W),C({id:n.id,app:`clips`}),B.data&&z.hasCompleted&&J.hasCompleted&&F?(0,j.jsx)(A,{clip:B.data,clips:U.data?.data,interactives:V.data?.data,currentUser:z.data,relatedVideos:r===`playlist`?G:{...G,videos:[]},hasProduct:_,queryParams:n.queryParams,audiences:K.data,canManageVideoAccess:I(t.ManageVideoAccess),pointsOfInterest:J.items,featureAccess:Y,tableOfContentsId:n.queryParams?.tocId,shouldShowSideTableOfContents:q,breadcrumbs:X,commonVideoProps:P,hasTopicDirectories:L,hasTheatreMode:R}):(0,j.jsx)(j.Fragment,{})}export{P as PlayClipView};
|
|
2
|
+
//# sourceMappingURL=CmnbQiBA.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"CmnbQiBA.chunk.js","names":[],"sources":["../../src/shared/views/play-clip/PlayClipView.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { PermissionFilterOption } from 'libs/shared/enums/PermissionFilterOption';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { VideoPrivateError } from 'libs/shared/errors/videos/video-private/VideoPrivateError';\nimport { ClipRequests } from 'libs/shared/flight-requests/ClipRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useBreadcrumbs } from 'libs/shared/hooks/useBreadcrumbs';\nimport { useCannotConsumeError } from 'libs/shared/hooks/useCannotConsumeError';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Clip, ClipCollection, CurrentUser, InteractiveCollection, Video } from 'libs/shared/interfaces';\nimport { PlayViewQueryParams } from 'libs/shared/interfaces/query-params/PlayViewQueryParams';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { useCommonVideoProps } from 'shared/hooks/useCommonVideoProps';\nimport { useDeepLinks } from 'shared/hooks/useDeepLinks';\nimport { useFetchPointsOfInterest } from 'shared/hooks/useFetchPointsOfInterest';\nimport { useGetRelatedVideos } from 'shared/hooks/useGetRelatedVideos';\nimport { usePresentationAudiences } from 'shared/hooks/usePresentationAudiences';\nimport { useVideoFeatureAccess } from 'shared/hooks/useVideoFeatureAccess';\nimport { useVideoMixin } from 'shared/hooks/useVideoMixin';\nimport { useShouldShowSideTableOfContents } from 'shared/views/play/hooks/useShouldShowTableOfContents';\n\nimport { PlayClip } from './components/play-clip/PlayClip';\n\nexport interface PlayViewProps {\n id: string;\n queryParams?: PlayViewQueryParams;\n}\n\nconst namespace = 'shared.playClip';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst clipErrors = {\n notFound: NotFoundError,\n forbidden: {\n privacy: VideoPrivateError\n }\n};\n\nPlayClipView.defaultProps = {\n queryParams: {}\n};\n\nexport function PlayClipView(props: PlayViewProps): JSX.Element {\n const { context, contextId, mtv } = props.queryParams;\n\n const { hasProduct } = useProducts();\n const {\n commonVideoProps,\n hasCommonVideoPropsCompleted\n } = useCommonVideoProps({ locationContext: LocationContext.PlayClip, mtv });\n const { hasPermissions } = usePermissions();\n const { hasTopicDirectories, hasPlayPageTranscript } = useSettings(null);\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const clip = Flight.useBasicFetch<Clip>(ClipRequests.clip(props.id));\n\n const interactives = Flight.useBasicFetch<InteractiveCollection>(InteractiveRequests.videoInteractives(props.id));\n const video = Flight.useBasicFetch<Video>(\n !!clip.data?._parentVideo && VideoRequests.video(clip.data._parentVideo.id)\n );\n useVideoMixin([video.data]);\n\n const childClips = Flight.useBasicFetch<ClipCollection>(\n !!clip.data?._parentVideo && ClipRequests.videoClips(clip.data._parentVideo.id)\n );\n\n const strippedClip = Flight.useBasicFetch<Clip>(clip.statusCode === HttpStatus.Forbidden &&\n ClipRequests.clip(props.id, PermissionFilterOption.StripMetadata));\n const relatedVideos = useGetRelatedVideos({\n video: video.data,\n context,\n contextId,\n moviesAndTv: mtv,\n currentUser: currentUser.data\n });\n const audiences = usePresentationAudiences();\n const shouldShowSideTableOfContents = useShouldShowSideTableOfContents();\n\n const pointsOfInterest = useFetchPointsOfInterest(props.id, true);\n \n const featureAccess = useVideoFeatureAccess({\n objectId: clip.data?.id,\n objectTypeId: clip.data?.typeId\n });\n\n const breadcrumbs = useBreadcrumbs({ name: clip.data?.name });\n\n useSetPageMetadata(PageMetadataHelper.getClipMetadata({\n content: clip.data,\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n }\n }));\n\n useHandleObjectError(clip, clipErrors, { forbidden: true });\n useVideoMixin(relatedVideos.videos ?? []);\n useCannotConsumeError(strippedClip);\n useDeepLinks({ id: props.id, app: 'clips' });\n\n const hasLoaded = (\n clip.data &&\n currentUser.hasCompleted &&\n pointsOfInterest.hasCompleted &&\n hasCommonVideoPropsCompleted\n );\n\n if (!hasLoaded)\n return <></>;\n\n return (\n <PlayClip\n clip={clip.data}\n clips={childClips.data?.data}\n interactives={interactives.data?.data}\n currentUser={currentUser.data}\n // we only show up next videos for clips in a playlist\n relatedVideos={context === 'playlist' ? relatedVideos : { ...relatedVideos, videos: []}}\n hasProduct={hasProduct}\n queryParams={props.queryParams}\n audiences={audiences.data}\n canManageVideoAccess={hasPermissions(PermissionName.ManageVideoAccess)}\n pointsOfInterest={pointsOfInterest.items}\n featureAccess={featureAccess}\n tableOfContentsId={props.queryParams?.tocId}\n shouldShowSideTableOfContents={shouldShowSideTableOfContents}\n breadcrumbs={breadcrumbs}\n commonVideoProps={commonVideoProps}\n hasTopicDirectories={hasTopicDirectories}\n hasTheatreMode={hasPlayPageTranscript}\n />\n );\n}\n"],"mappings":"2sCA4CM,EAAY,EAAgB,iBAAiB,iBAAS,EAEtD,EAAa,CACjB,SAAU,EACV,UAAW,CACT,QAAS,CACX,CACF,EAEA,EAAa,aAAe,CAC1B,YAAa,CAAC,CAChB,EAEA,SAAgB,EAAa,EAAmC,CAC9D,GAAM,CAAE,UAAS,YAAW,OAAQ,EAAM,YAEpC,CAAE,cAAe,EAAY,EAC7B,CACJ,mBACA,gCACE,EAAoB,CAAE,gBAAiB,EAAgB,SAAU,KAAI,CAAC,EACpE,CAAE,kBAAmB,EAAe,EACpC,CAAE,sBAAqB,yBAA0B,EAAY,IAAI,EAEjE,EAAc,EAAkC,EAAa,YAAY,CAAC,EAC1E,EAAO,EAA2B,EAAa,KAAK,EAAM,EAAE,CAAC,EAE7D,EAAe,EAA4C,EAAoB,kBAAkB,EAAM,EAAE,CAAC,EAC1G,EAAQ,EACZ,CAAC,CAAC,EAAK,MAAM,cAAgB,EAAc,MAAM,EAAK,KAAK,aAAa,EAAE,CAC5E,EACA,EAAc,CAAC,EAAM,IAAI,CAAC,EAE1B,IAAM,EAAa,EACjB,CAAC,CAAC,EAAK,MAAM,cAAgB,EAAa,WAAW,EAAK,KAAK,aAAa,EAAE,CAChF,EAEM,EAAe,EAA2B,EAAK,aAAe,EAAW,WAC7E,EAAa,KAAK,EAAM,GAAI,EAAuB,aAAa,CAAC,EAC7D,EAAgB,EAAoB,CACxC,MAAO,EAAM,KACb,UACA,YACA,YAAa,EACb,YAAa,EAAY,IAC3B,CAAC,EACK,EAAY,EAAyB,EACrC,EAAgC,EAAiC,EAEjE,EAAmB,EAAyB,EAAM,GAAI,EAAI,EAE1D,EAAgB,EAAsB,CAC1C,SAAU,EAAK,MAAM,GACrB,aAAc,EAAK,MAAM,MAC3B,CAAC,EAEK,EAAc,EAAe,CAAE,KAAM,EAAK,MAAM,IAAK,CAAC,EA0B5D,OAxBA,EAAmB,EAAmB,gBAAgB,CACpD,QAAS,EAAK,KACd,cAAe,CACb,cAAe,EACf,YAAa,YACb,kBAAmB,iBACrB,CACF,CAAC,CAAC,EAEF,EAAqB,EAAM,EAAY,CAAE,UAAW,EAAK,CAAC,EAC1D,EAAc,EAAc,QAAU,CAAC,CAAC,EACxC,EAAsB,CAAY,EAClC,EAAa,CAAE,GAAI,EAAM,GAAI,IAAK,OAAQ,CAAC,EAGzC,EAAK,MACL,EAAY,cACZ,EAAiB,cACjB,GAOA,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,KAAM,EAAK,KACX,MAAO,EAAW,MAAM,KACxB,aAAc,EAAa,MAAM,KACjC,YAAa,EAAY,KAEzB,cAAe,IAAY,WAAa,EAAgB,CAAE,GAAG,EAAe,OAAQ,CAAC,CAAC,EAC1E,aACZ,YAAa,EAAM,YACnB,UAAW,EAAU,KACrB,qBAAsB,EAAe,EAAe,iBAAiB,EACrE,iBAAkB,EAAiB,MACpB,gBACf,kBAAmB,EAAM,aAAa,MACP,gCAClB,cACK,mBACG,sBACrB,eAAgB,CACjB,CAAA,GAtBM,EAAA,EAAA,IAAA,CAAA,EAAA,SAAA,CAAI,CAAA,CAwBf"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{o as e}from"./DAXXjFlN.chunk.js";import{y as t}from"./BftnFbcr.chunk.js";import"./DFZS3Ffo.chunk.js";import{t as n}from"./e57H3T-k.chunk.js";import{t as r}from"./C2w0pmFW.chunk.js";import{t as i}from"./BXTI9cmX.chunk.js";import{n as a}from"./BVnMI-dl.chunk.js";import{t as o}from"./C1SLt-ar.chunk.js";import{U as s,d as c,z as l}from"./NlCAcBdo.chunk.js";import{t as u}from"./1LRpIhCn.chunk.js";import{n as d}from"./DTGfiG8Y.chunk.js";import{t as f}from"./eoAypzU3.chunk.js";import{t as p}from"./7-GJWRH82.chunk.js";import{t as m}from"./DpCWroEe2.chunk.js";import{t as h}from"./DYDxLHiV2.chunk.js";import{t as g}from"./DBkEQkKm2.chunk.js";import{t as _}from"./BUoougrH.chunk.js";import{t as v}from"./CzuHD4Ht.chunk.js";import{n as y,o as b,t as x}from"./CsWeCs8U2.chunk.js";import{t as S}from"./BwelEZs92.chunk.js";import{t as C}from"./HT_TXzUd2.chunk.js";import{t as w}from"./DFIgRAfX2.chunk.js";import{t as T}from"./DBHDBu1Y.chunk.js";import{t as E}from"./ryLD1Tv-.chunk.js";var D=e(r()),O={getCompanyAppLink(e,t){return{application:i.MOVIES_AND_TV,action:f.MoviesAndTv.COMPANY_DASHBOARD,args:[t,e.id,n.slugify(e.name)]}},getClassificationAppLink(e,t,n){return _.getAppLink(e,t?{moviesAndTv:!0}:{},n)},getCollectionActions(e,t,n,r){return t?[{svg:E,appLink:{application:i.SHARE,action:f.Share.SHARE,args:[e.id],params:{entityType:n}},analyticsData:{id:e.id},analyticsOptions:{...r,actionType:l.Share,workflowPhase:s.Start,eventVersion:c.V3},button:!0}]:[]},getSeriesAppLink(e,t,n){return h.getSeriesAppLink(e,t?{mtv:!0}:{},n)},getPlaylistAppLink(e,t,r){return{application:i.PLAYLISTS,action:f.Playlists.PLAYLIST,args:[r,e.id,n.slugify(e.name)],params:t?{mtv:!0}:null}},getAppLinks(e,t,n,r){return{getVideoAppLink:(e,t)=>g.getAppLink(e,{...t,moviesAndTv:n},r),getPlaylistAppLink:e=>O.getPlaylistAppLink(e,n,r),getSeriesAppLink:e=>O.getSeriesAppLink(e,n,r),getCompanyAppLink:n=>{let r=u.getPresentationSlugByCompany(n,e,t);return O.getCompanyAppLink(n,r)},getClassificationAppLink:e=>O.getClassificationAppLink(e,n,t),getPreviewQuestionsAppLink:e=>v.getPreviewQuestionsAppLink(e),getCollectionActions:O.getCollectionActions,searchSettings:{application:i.SETTINGS,action:f.Settings.PLATFORM_SETTINGS}}},isSearchAppLink(e){return e.application===i.SEARCH&&e.action===f.Search.HOME},useReferrerAppLink(){let e={application:i.DASHBOARD,action:f.Dashboard.HOME,args:[null]},[t,n]=D.useState(e),r=m.getCurrentRoute();return D.useEffect(()=>{O.isSearchAppLink(r.appLink)||n(r.appLink)},[r.appLink.application,r.appLink.action]),t},useOnFilterChange(e,t){let n={...t};delete n.query;let r=Object.keys(n).map(e=>n[e]).sort((e,t)=>e-t);D.useEffect(()=>{e()},[r.join(`:`)])},triggerAppLink(e,r={},o){let s={};r=o?a.omit(r,[`query`]):{},e&&(s.query=n.removeExtraSpace(e)),Object.keys(r).length&&(s={...s,...r}),t.trigger({application:i.SEARCH,action:f.Search.HOME,params:s},{replace:o})},getInitialQuery(){let e=m.getCurrentRoute().appLink;return O.isSearchAppLink(e)?e.params?.query??``:``},isValidSearch(e,t){if(e?.trim())return!0;if(!O.isSearchAppLink(t))return!1;let n=t?.params?.tagOrClassification,r=t?.params?.rating,i=t?.params?.moviesAndTv,a=t?.params?.source,o=t?.params?.scopeId;return Array.isArray(n)?!!n.length:!!n?.length||!!r?.length||!!i?.length||!!a?.length||!!o?.length},getFirstSeries(e){return o.first(e.items)},getFirstPlaylist(e){return o.first(e.items)},getVideoAppLink(e,t){return{application:i.VIDEOS,action:f.Videos.PLAY_VIDEO,args:[t,e.id,n.slugify(e.name)]}},getQuery(e){return e.query?e.query:e.tagOrClassification?(Array.isArray(e.tagOrClassification)?e.tagOrClassification:[e.tagOrClassification]).join(` `):``},getInaccessibleIndices(e){let{isLearner:t,queryParams:n,hasMoviesAndTv:r}=e,i=[];return(t||n.moviesAndTv)&&(i.push(`clip`),i.push(`interactive`)),r||i.push(`company`),i},getFilters(e){let{data:t,inaccessibleIndices:n,tagsAndClassifications:r,_hasNewSearch:i,_hasPartnerProfiles:a,hasCVFilters:o}=e;if(!t.hasDataLoaded||!i&&r&&!r.hasCompleted)return null;let{moviesAndTvDashboard:s,ratings:c,yearGroups:l,userDetails:u,schoolLevels:d,availableTopics:f,libraries:m,currentUser:h,isLearner:g,hasCustomLibraries:_,hasMoviesAndTv:v,isGuest:S,showStreamableSearchResults:T}=t,E=C.IS_XMAS?y.MoviesAndTv(p.MoviesAndTv.XMAS_SOCK,p.MoviesAndTv.XMAS_GIFTS):y.MoviesAndTv(p.MoviesAndTv.POPCORN_BOX,p.MoviesAndTv.POPCORN_BITS),D=C.IS_XMAS?y.MoviesAndTv(p.MoviesAndTv.POPCORN_BOX,p.MoviesAndTv.POPCORN_BITS):null,O=[];o?(v&&s.data?.id?O.push(E):O.push(D),h.data?.isAuthenticated&&O.push(y.Source(b.getOptions({libraries:m,isLearner:g,isGuest:S,hasCustomLibraries:_,liveStreams:T}))),S||O.push(y.Rating(c.data,l.data&&u.data&&w.getStudentMaxRating(l.data,u.data))),O.push(y.HasResources()),O.push(y.ObjectTypes(n,i,a)),i||O.push(y.TagOrClassification(r.data))):h.data?.isAuthenticated&&O.push(y.Source(b.getOptions({libraries:m,isLearner:g,isGuest:S,hasCustomLibraries:_,hideCVLibrary:!0,liveStreams:T})));let k=y.Presentation(d.data?.schoolLevels,i);x.showPresentationFilter(k)&&O.unshift(k);let A=y.Topics(f.data?.topics.map(e=>({name:e.name,id:e.topicIds.join(`:`)})));A.options&&A.options.length>1&&O.unshift(A);let j=[y.ProductionYear(),y.HasSubtitles(),y.IsHD()];return o&&j.push(y.IsClickViewContent()),j.push(y.Duration()),{mainFilters:O.filter(Boolean),moreFilters:x.getMoreFilters(j)}},getSearchAppLink(e,t){return{application:i.SEARCH,action:f.Search.HOME,params:{...t,query:e}}},getBackendFilters(e){if(!e.hasDataLoaded)return null;let{queryParams:t,ratings:n,currentPresentationId:r,isLearner:i,libraries:a,hasMoviesAndTv:o,streamableLibraryId:s,exchangeLibraryId:c,showExchangeSearchResults:l,showStreamableSearchResults:u}=e,d=x.buildBackendFilterParams(t,n.data,[r],i,a,s),f=`${S.FILTER_PARAM_PREFIX}excludeLibraryExclusive`,p=[];s&&!u&&p.push(s),c&&!l&&p.push(c),d[f]=p;let m=O.getInaccessibleIndices({isLearner:i,hasMoviesAndTv:o,queryParams:t});return{queryParams:t,backendFilters:d,appliedIndices:x.getAppliedIndices(e.queryParams).filter(e=>e!==`classification`&&e!==`company`).filter(e=>!m.find(t=>t===e)),inaccessibleIndices:m}},getBackendFiltersV2(e){if(!e.hasDataLoaded)return null;let{queryParams:t,ratings:n,isLearner:r,libraries:i,hasMoviesAndTv:a,streamableLibraryId:o,exchangeLibraryId:s,showExchangeSearchResults:c,availablePresentations:l,showStreamableSearchResults:u}=e,f=x.buildBackendFilterParams(t,n.data,l?.map(e=>e.id),r,i,o),p=[];o&&!u&&p.push(o),s&&!c&&p.push(s);let m=O.getInaccessibleIndices({isLearner:r,hasMoviesAndTv:a,queryParams:t}),h=`${S.FILTER_PARAM_PREFIX}indicesFilters`,g=x.getAppliedIndices(e.queryParams,!0,e.settings.hasPartnerProfiles).filter(e=>!m.find(t=>t===e)),_=l?.map(e=>e.id);return f[h]=g.map(e=>{let t={index:e};if(e===`video`&&p.length)return{...t,filters:{excludeLibraryExclusive:[...p]}};if(e===`classification`){let e={...t,filters:{classificationType:d.Subject,status:[T.Published,T.ComingSoon]}};return l?.length&&(e.filters.presentation=_),e}return e===`company`?{...t,filters:{presentation:_}}:t}),{queryParams:t,backendFilters:f,appliedIndices:g,inaccessibleIndices:m}}};export{O as t};
|
|
2
|
+
//# sourceMappingURL=CpsbRDII.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jAtAipGN.chunk.js","names":[],"sources":["../../src/apps/search/utils/SearchHelper.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { AnalyticsOptions, EventVersion, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { MixedSearchResultAppLinks } from 'libs/shared/apps/search/components/mixed-search-results/MixedSearchResults';\nimport { FilterConstants } from 'libs/shared/apps/search/constants/FilterConstants';\nimport { FilterOption, SearchIndices, SearchResultsObject, TopicResults } from 'libs/shared/apps/search/interfaces';\nimport { FilterHelper, Filters } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { RatingFilterHelper } from 'libs/shared/apps/search/utils/RatingFilterHelper';\nimport { ResultGrouping } from 'libs/shared/apps/search/utils/SharedSearchHelper';\nimport { SourceFilterHelper } from 'libs/shared/apps/search/utils/SourceFilterHelper';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { XmasConstants } from 'libs/shared/constants/XmasConstants';\nimport { ClassificationStatus } from 'libs/shared/enums/ClassificationStatus';\nimport { ClassificationType } from 'libs/shared/enums/ClassificationType';\nimport { SettingsHash } from 'libs/shared/hooks/useSettings';\nimport { ShareSvg } from 'libs/shared/images/svg/actions/ShareSvg';\nimport { Classification, Company, CuratedDashboard, CurrentUser, Library, Playlist, Presentation, Rating, SchoolLevels, Series, User, Video, YearGroup } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { ContextService } from 'libs/shared/services/ContextService';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { ClassificationAppLinkHelper } from 'shared/utils/ClassificationAppLinkHelper';\nimport { InteractiveHelpers } from 'shared/utils/InteractiveHelper';\nimport { LitePresentationHelper } from 'shared/utils/LitePresentationHelper';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { SeriesAppLinkHelper } from 'apps/series/SeriesAppLinkHelper';\n\ninterface GetFiltersOptions {\n data: {\n isLearner: boolean,\n moviesAndTvDashboard: Flight.Response<CuratedDashboard>,\n ratings: Flight.Response<Rating[]>,\n yearGroups: Flight.Response<YearGroup[]>,\n userDetails: Flight.Response<User>,\n schoolLevels: Flight.Response<SchoolLevels>,\n availableTopics: Flight.Response<TopicResults>,\n libraries: Library[],\n currentUser: Flight.Response<CurrentUser>,\n hasDataLoaded: boolean,\n hasCustomLibraries: boolean,\n hasMoviesAndTv: boolean,\n isGuest: boolean,\n showStreamableSearchResults: boolean\n };\n inaccessibleIndices: SearchIndices[];\n tagsAndClassifications?: Flight.Response<string[]>;\n hasCVFilters?: boolean;\n /**\n * Incremental changes flag for search v2\n */\n _hasNewSearch?: boolean;\n \n _hasPartnerProfiles?: boolean;\n}\n\nexport const SearchHelper = {\n getCompanyAppLink(company: Company, presentationSlug: string | null): Core.AppLink {\n return {\n application: AppChannels.MOVIES_AND_TV,\n action: Actions.MoviesAndTv.COMPANY_DASHBOARD,\n args: [ presentationSlug, company.id, TextHelper.slugify(company.name) ]\n };\n },\n\n getClassificationAppLink(\n classification: Classification,\n moviesAndTv: boolean,\n availablePresentations: Presentation[]\n ): Core.AppLink {\n return ClassificationAppLinkHelper.getAppLink(\n classification,\n moviesAndTv ? { moviesAndTv: true } : {},\n availablePresentations\n );\n },\n\n getCollectionActions(\n collection: Series | Playlist,\n showActions: boolean,\n collectionType: 'series' | 'playlist',\n baseAnalyticsOptions: AnalyticsOptions\n ): ActionOptions[] {\n if (!showActions)\n return [];\n \n return [{\n svg: ShareSvg,\n appLink: {\n application: AppChannels.SHARE,\n action: Actions.Share.SHARE,\n args: [collection.id],\n params: { entityType: collectionType }\n },\n analyticsData: { id: collection.id },\n analyticsOptions: {\n ...baseAnalyticsOptions,\n actionType: UserAction.Share,\n workflowPhase: WorkflowPhase.Start,\n eventVersion: EventVersion.V3\n },\n button: true\n }];\n },\n\n getSeriesAppLink(series: Series, moviesAndTv: boolean, presentationSlug: string | null): Core.AppLink {\n return SeriesAppLinkHelper.getSeriesAppLink(series, moviesAndTv ? { mtv: true } : {}, presentationSlug);\n },\n\n getPlaylistAppLink(playlist: Playlist, moviesAndTv: boolean, presentationSlug: string | null): Core.AppLink {\n return {\n application: AppChannels.PLAYLISTS,\n action: Actions.Playlists.PLAYLIST,\n args: [ presentationSlug, playlist.id, TextHelper.slugify(playlist.name) ],\n params: moviesAndTv ? { mtv: true } : null\n };\n },\n\n getAppLinks(\n presentation: Presentation,\n availablePresentations: Presentation[],\n moviesAndTv: boolean,\n presentationSlug: string | null\n ): MixedSearchResultAppLinks {\n return {\n getVideoAppLink: (video, opts: GetVideoAppLinkOptions) =>\n VideoAppLinkHelper.getAppLink(video, { ...opts, moviesAndTv }, presentationSlug),\n getPlaylistAppLink: playlist => SearchHelper.getPlaylistAppLink(playlist, moviesAndTv, presentationSlug),\n getSeriesAppLink: series => SearchHelper.getSeriesAppLink(series, moviesAndTv, presentationSlug),\n getCompanyAppLink: company => {\n const slug = LitePresentationHelper.getPresentationSlugByCompany(\n company,\n presentation,\n availablePresentations\n );\n return SearchHelper.getCompanyAppLink(company, slug);\n },\n getClassificationAppLink:\n classification => SearchHelper.getClassificationAppLink(classification, moviesAndTv, availablePresentations),\n getPreviewQuestionsAppLink: interactive => InteractiveHelpers.getPreviewQuestionsAppLink(interactive),\n getCollectionActions: SearchHelper.getCollectionActions,\n searchSettings: {\n application: AppChannels.SETTINGS,\n action: Actions.Settings.PLATFORM_SETTINGS\n }\n };\n },\n\n isSearchAppLink(currentAppLink: Core.AppLink): boolean {\n return currentAppLink.application === AppChannels.SEARCH && currentAppLink.action === Actions.Search.HOME;\n },\n\n useReferrerAppLink(): Core.AppLink {\n const defaultReferrerAppLink: Core.AppLink = {\n application: AppChannels.DASHBOARD,\n action: Actions.Dashboard.HOME,\n args: [null as string]\n };\n \n const [ referrerApplink, setReferrerAppLink ] = React.useState<Core.AppLink>(defaultReferrerAppLink);\n \n const currentRoute = ContextService.getCurrentRoute();\n \n React.useEffect(() => {\n if (SearchHelper.isSearchAppLink(currentRoute.appLink))\n return;\n\n setReferrerAppLink(currentRoute.appLink);\n }, [ currentRoute.appLink.application, currentRoute.appLink.action ]);\n \n return referrerApplink;\n },\n\n useOnFilterChange(fetchResults: (cursor?: string) => void, queryParams: HashObject): void {\n const params = { ...queryParams };\n delete params.query;\n\n const sortedValues = Object.keys(params).map(filterName => params[filterName]).sort((a, b) => a - b);\n\n React.useEffect(() => {\n fetchResults();\n }, [sortedValues.join(':')]);\n },\n\n triggerAppLink(query: string, otherQueryParams: HashObject = {}, isOnSearchPage: boolean): void {\n let params: HashObject = {};\n\n otherQueryParams = isOnSearchPage ? ObjectHelper.omit(otherQueryParams, ['query']) : {};\n\n if (query)\n params.query = TextHelper.removeExtraSpace(query);\n\n if (Object.keys(otherQueryParams).length) {\n params = {\n ...params,\n ...otherQueryParams\n };\n }\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n params\n }, { replace: isOnSearchPage });\n },\n\n getInitialQuery(): string {\n const currentAppLink = ContextService.getCurrentRoute().appLink;\n \n if (!SearchHelper.isSearchAppLink(currentAppLink))\n return '';\n \n return (currentAppLink.params as HashObject)?.query ?? '';\n },\n\n isValidSearch(query: string, currentAppLink: Core.AppLink): boolean {\n if (query?.trim())\n return true;\n\n if (!SearchHelper.isSearchAppLink(currentAppLink))\n return false;\n\n // If there's no search query, but a tag/topic filter is applied, the search is still valid\n const tagOrClassificationParam = (currentAppLink?.params as HashObject)?.tagOrClassification;\n const ratingParam = (currentAppLink?.params as HashObject)?.rating;\n const moviesAndTvParam = (currentAppLink?.params as HashObject)?.moviesAndTv;\n const source = (currentAppLink?.params as HashObject)?.source;\n const scopeId = (currentAppLink?.params as HashObject)?.scopeId;\n\n if (Array.isArray(tagOrClassificationParam))\n return !!tagOrClassificationParam.length;\n\n return (\n !!tagOrClassificationParam?.length ||\n !!ratingParam?.length ||\n !!moviesAndTvParam?.length ||\n !!source?.length ||\n !!scopeId?.length\n );\n },\n \n getFirstSeries(grouping: ResultGrouping) {\n return ArrayHelper.first(grouping.items) as SearchResultsObject<Series>;\n },\n\n getFirstPlaylist(grouping: ResultGrouping) {\n return ArrayHelper.first(grouping.items) as SearchResultsObject<Playlist>;\n },\n\n getVideoAppLink(video: Video, presentationSlug: string | null) {\n return {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PLAY_VIDEO,\n args: [ presentationSlug, video.id, TextHelper.slugify(video.name) ]\n };\n },\n\n /**\n * Companies and Classifications cannot be filtered well by tags.\n * This is especially evident when a user has searched for only a tag,\n * but has passed no query string. In this case, we populate the `query`\n * param with the names of the selected tags.\n */\n getQuery(queryParams: HashObject): string {\n if (queryParams.query)\n return queryParams.query;\n\n if (!queryParams.tagOrClassification)\n return '';\n\n const tagOrClassificationFilter = Array.isArray(queryParams.tagOrClassification) ?\n queryParams.tagOrClassification :\n [queryParams.tagOrClassification];\n\n return tagOrClassificationFilter.join(' ');\n },\n\n getInaccessibleIndices(options: {\n isLearner: boolean,\n queryParams: HashObject,\n hasMoviesAndTv: boolean\n }): SearchIndices[] {\n const { isLearner, queryParams, hasMoviesAndTv } = options;\n \n const inaccessible: SearchIndices[] = [];\n \n if (isLearner || queryParams.moviesAndTv) {\n inaccessible.push('clip');\n inaccessible.push('interactive');\n }\n \n if (!hasMoviesAndTv)\n inaccessible.push('company');\n \n return inaccessible;\n },\n\n getFilters(options: GetFiltersOptions) {\n const {\n data,\n inaccessibleIndices,\n tagsAndClassifications,\n _hasNewSearch,\n _hasPartnerProfiles,\n hasCVFilters\n } = options;\n \n if (!data.hasDataLoaded || (!_hasNewSearch && tagsAndClassifications && !tagsAndClassifications.hasCompleted))\n return null;\n\n const {\n moviesAndTvDashboard,\n ratings,\n yearGroups,\n userDetails,\n schoolLevels,\n availableTopics,\n libraries,\n currentUser,\n isLearner,\n hasCustomLibraries,\n hasMoviesAndTv,\n isGuest,\n showStreamableSearchResults\n } = data;\n\n const mtvOnFilter = XmasConstants.IS_XMAS ?\n Filters.MoviesAndTv(ImageUrls.MoviesAndTv.XMAS_SOCK, ImageUrls.MoviesAndTv.XMAS_GIFTS) :\n Filters.MoviesAndTv(ImageUrls.MoviesAndTv.POPCORN_BOX, ImageUrls.MoviesAndTv.POPCORN_BITS);\n\n const mtvOffFilter = XmasConstants.IS_XMAS ?\n Filters.MoviesAndTv(ImageUrls.MoviesAndTv.POPCORN_BOX, ImageUrls.MoviesAndTv.POPCORN_BITS) :\n null;\n\n const mainFilters = [];\n\n if (hasCVFilters) {\n if (hasMoviesAndTv && moviesAndTvDashboard.data?.id) {\n mainFilters.push(mtvOnFilter);\n } else {\n mainFilters.push(mtvOffFilter);\n }\n\n if (currentUser.data?.isAuthenticated) {\n mainFilters.push(Filters.Source(SourceFilterHelper.getOptions({\n libraries,\n isLearner,\n isGuest,\n hasCustomLibraries,\n liveStreams: showStreamableSearchResults\n })));\n }\n\n if (!isGuest) {\n mainFilters.push(Filters.Rating(\n ratings.data,\n yearGroups.data && userDetails.data &&\n RatingFilterHelper.getStudentMaxRating(yearGroups.data, userDetails.data)\n ));\n }\n\n mainFilters.push(Filters.HasResources());\n mainFilters.push(Filters.ObjectTypes(inaccessibleIndices, _hasNewSearch, _hasPartnerProfiles));\n \n if (!_hasNewSearch) {\n mainFilters.push(Filters.TagOrClassification(tagsAndClassifications.data));\n }\n } else {\n if (currentUser.data?.isAuthenticated) {\n mainFilters.push(Filters.Source(SourceFilterHelper.getOptions({\n libraries,\n isLearner,\n isGuest,\n hasCustomLibraries,\n hideCVLibrary: true,\n liveStreams: showStreamableSearchResults\n })));\n }\n }\n \n const presentationFilter = Filters.Presentation(schoolLevels.data?.schoolLevels, _hasNewSearch);\n const showPresentationFilter = FilterHelper.showPresentationFilter(presentationFilter);\n \n if (showPresentationFilter) {\n mainFilters.unshift(presentationFilter);\n }\n \n const topicsFilter = Filters.Topics(\n availableTopics.data?.topics.map(t => ({ name: t.name, id: t.topicIds.join(':') })) as FilterOption[]\n );\n \n if (topicsFilter.options && topicsFilter.options.length > 1)\n mainFilters.unshift(topicsFilter);\n \n const moreFilters = [\n Filters.ProductionYear(),\n Filters.HasSubtitles(),\n Filters.IsHD()\n ];\n \n if (hasCVFilters)\n moreFilters.push(Filters.IsClickViewContent());\n\n moreFilters.push(Filters.Duration());\n \n return {\n mainFilters: mainFilters.filter(Boolean),\n moreFilters: FilterHelper.getMoreFilters(moreFilters)\n };\n },\n\n getSearchAppLink(query: string, queryParams: HashObject): Core.AppLink {\n return {\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n params: {\n ...queryParams,\n query\n }\n };\n },\n\n getBackendFilters(options: {\n queryParams: HashObject,\n ratings: Flight.Response<Rating[]>,\n currentPresentationId: string,\n isLearner: boolean,\n hasDataLoaded: boolean,\n libraries: Library[],\n settings: SettingsHash,\n streamableLibraryId: string,\n exchangeLibraryId: string,\n showExchangeSearchResults: boolean,\n hasMoviesAndTv: boolean,\n showStreamableSearchResults: boolean\n }) {\n if (!options.hasDataLoaded)\n return null;\n\n const {\n queryParams,\n ratings,\n currentPresentationId,\n isLearner,\n libraries,\n hasMoviesAndTv,\n streamableLibraryId,\n exchangeLibraryId,\n showExchangeSearchResults,\n showStreamableSearchResults\n } = options;\n \n const backendFilters = FilterHelper.buildBackendFilterParams(\n queryParams,\n ratings.data,\n [currentPresentationId],\n isLearner,\n libraries,\n streamableLibraryId\n );\n\n const excludeLibraryFilter = `${FilterConstants.FILTER_PARAM_PREFIX}excludeLibraryExclusive`;\n const excludeLibraryIds = [];\n\n if (streamableLibraryId && !showStreamableSearchResults) {\n excludeLibraryIds.push(streamableLibraryId);\n }\n\n if (exchangeLibraryId && !showExchangeSearchResults) {\n excludeLibraryIds.push(exchangeLibraryId);\n }\n\n backendFilters[excludeLibraryFilter] = excludeLibraryIds;\n \n const inaccessibleIndices = SearchHelper.getInaccessibleIndices({\n isLearner,\n hasMoviesAndTv,\n queryParams\n });\n \n // Topic search is done separately using `useSearchTopics()`\n // Company search is done separately using `useSearchCompanies()`\n const appliedIndices = FilterHelper.getAppliedIndices(options.queryParams)\n .filter(i => i !== 'classification' && i !== 'company')\n .filter(index => !inaccessibleIndices.find(i => i === index));\n\n return {\n queryParams,\n backendFilters,\n appliedIndices,\n inaccessibleIndices\n };\n },\n\n getBackendFiltersV2(options: {\n queryParams: HashObject,\n ratings: Flight.Response<Rating[]>,\n currentPresentationId: string,\n isLearner: boolean,\n hasDataLoaded: boolean,\n libraries: Library[],\n settings: SettingsHash,\n streamableLibraryId: string,\n exchangeLibraryId: string,\n showExchangeSearchResults: boolean,\n hasMoviesAndTv: boolean,\n availablePresentations: Presentation[],\n showStreamableSearchResults: boolean\n }) {\n if (!options.hasDataLoaded)\n return null;\n\n const {\n queryParams,\n ratings,\n isLearner,\n libraries,\n hasMoviesAndTv,\n streamableLibraryId,\n exchangeLibraryId,\n showExchangeSearchResults,\n availablePresentations,\n showStreamableSearchResults\n } = options;\n\n const backendFilters = FilterHelper.buildBackendFilterParams(\n queryParams,\n ratings.data,\n availablePresentations?.map(p => p.id),\n isLearner,\n libraries,\n streamableLibraryId\n );\n \n const excludeLibraryIds: string[] = [];\n if (streamableLibraryId && !showStreamableSearchResults) {\n excludeLibraryIds.push(streamableLibraryId);\n }\n\n if (exchangeLibraryId && !showExchangeSearchResults) {\n excludeLibraryIds.push(exchangeLibraryId);\n }\n\n const inaccessibleIndices = SearchHelper.getInaccessibleIndices({\n isLearner,\n hasMoviesAndTv,\n queryParams\n });\n\n const indicesFilter = `${FilterConstants.FILTER_PARAM_PREFIX}indicesFilters`;\n\n const appliedIndices = FilterHelper.getAppliedIndices(\n options.queryParams,\n true,\n options.settings.hasPartnerProfiles\n ).filter(index => !inaccessibleIndices.find(i => i === index));\n\n const availablePresentationIds = availablePresentations?.map(p => p.id);\n\n const indicesWithFilters: HashObject[] = appliedIndices.map(index => {\n const indiceFilter = { index };\n \n if (index === 'video' && excludeLibraryIds.length) {\n const indice: HashObject = {\n ...indiceFilter,\n filters: {\n excludeLibraryExclusive: [...excludeLibraryIds]\n }\n };\n\n return indice;\n }\n\n if (index === 'classification') {\n const indice: HashObject = {\n ...indiceFilter,\n filters: {\n classificationType: ClassificationType.Subject,\n status: [ ClassificationStatus.Published, ClassificationStatus.ComingSoon ]\n }\n };\n\n if (availablePresentations?.length) {\n indice.filters.presentation = availablePresentationIds;\n }\n\n return indice;\n }\n\n if (index === 'company') {\n const indice: HashObject = {\n ...indiceFilter,\n filters: {\n presentation: availablePresentationIds\n }\n };\n\n return indice;\n }\n\n return indiceFilter;\n });\n\n backendFilters[indicesFilter] = indicesWithFilters;\n \n return {\n queryParams,\n backendFilters,\n appliedIndices,\n inaccessibleIndices\n };\n }\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CpsbRDII.chunk.js","names":[],"sources":["../../src/apps/search/utils/SearchHelper.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { AnalyticsOptions, EventVersion, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { MixedSearchResultAppLinks } from 'libs/shared/apps/search/components/mixed-search-results/MixedSearchResults';\nimport { FilterConstants } from 'libs/shared/apps/search/constants/FilterConstants';\nimport { FilterOption, SearchIndices, SearchResultsObject, TopicResults } from 'libs/shared/apps/search/interfaces';\nimport { FilterHelper, Filters } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { RatingFilterHelper } from 'libs/shared/apps/search/utils/RatingFilterHelper';\nimport { ResultGrouping } from 'libs/shared/apps/search/utils/SharedSearchHelper';\nimport { SourceFilterHelper } from 'libs/shared/apps/search/utils/SourceFilterHelper';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { XmasConstants } from 'libs/shared/constants/XmasConstants';\nimport { ClassificationStatus } from 'libs/shared/enums/ClassificationStatus';\nimport { ClassificationType } from 'libs/shared/enums/ClassificationType';\nimport { SettingsHash } from 'libs/shared/hooks/useSettings';\nimport { ShareSvg } from 'libs/shared/images/svg/actions/ShareSvg';\nimport { Classification, Company, CuratedDashboard, CurrentUser, Library, Playlist, Presentation, Rating, SchoolLevels, Series, User, Video, YearGroup } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { ContextService } from 'libs/shared/services/ContextService';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { ClassificationAppLinkHelper } from 'shared/utils/ClassificationAppLinkHelper';\nimport { InteractiveHelpers } from 'shared/utils/InteractiveHelper';\nimport { LitePresentationHelper } from 'shared/utils/LitePresentationHelper';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { SeriesAppLinkHelper } from 'apps/series/SeriesAppLinkHelper';\n\ninterface GetFiltersOptions {\n data: {\n isLearner: boolean,\n moviesAndTvDashboard: Flight.Response<CuratedDashboard>,\n ratings: Flight.Response<Rating[]>,\n yearGroups: Flight.Response<YearGroup[]>,\n userDetails: Flight.Response<User>,\n schoolLevels: Flight.Response<SchoolLevels>,\n availableTopics: Flight.Response<TopicResults>,\n libraries: Library[],\n currentUser: Flight.Response<CurrentUser>,\n hasDataLoaded: boolean,\n hasCustomLibraries: boolean,\n hasMoviesAndTv: boolean,\n isGuest: boolean,\n showStreamableSearchResults: boolean\n };\n inaccessibleIndices: SearchIndices[];\n tagsAndClassifications?: Flight.Response<string[]>;\n hasCVFilters?: boolean;\n /**\n * Incremental changes flag for search v2\n */\n _hasNewSearch?: boolean;\n \n _hasPartnerProfiles?: boolean;\n}\n\nexport const SearchHelper = {\n getCompanyAppLink(company: Company, presentationSlug: string | null): Core.AppLink {\n return {\n application: AppChannels.MOVIES_AND_TV,\n action: Actions.MoviesAndTv.COMPANY_DASHBOARD,\n args: [ presentationSlug, company.id, TextHelper.slugify(company.name) ]\n };\n },\n\n getClassificationAppLink(\n classification: Classification,\n moviesAndTv: boolean,\n availablePresentations: Presentation[]\n ): Core.AppLink {\n return ClassificationAppLinkHelper.getAppLink(\n classification,\n moviesAndTv ? { moviesAndTv: true } : {},\n availablePresentations\n );\n },\n\n getCollectionActions(\n collection: Series | Playlist,\n showActions: boolean,\n collectionType: 'series' | 'playlist',\n baseAnalyticsOptions: AnalyticsOptions\n ): ActionOptions[] {\n if (!showActions)\n return [];\n \n return [{\n svg: ShareSvg,\n appLink: {\n application: AppChannels.SHARE,\n action: Actions.Share.SHARE,\n args: [collection.id],\n params: { entityType: collectionType }\n },\n analyticsData: { id: collection.id },\n analyticsOptions: {\n ...baseAnalyticsOptions,\n actionType: UserAction.Share,\n workflowPhase: WorkflowPhase.Start,\n eventVersion: EventVersion.V3\n },\n button: true\n }];\n },\n\n getSeriesAppLink(series: Series, moviesAndTv: boolean, presentationSlug: string | null): Core.AppLink {\n return SeriesAppLinkHelper.getSeriesAppLink(series, moviesAndTv ? { mtv: true } : {}, presentationSlug);\n },\n\n getPlaylistAppLink(playlist: Playlist, moviesAndTv: boolean, presentationSlug: string | null): Core.AppLink {\n return {\n application: AppChannels.PLAYLISTS,\n action: Actions.Playlists.PLAYLIST,\n args: [ presentationSlug, playlist.id, TextHelper.slugify(playlist.name) ],\n params: moviesAndTv ? { mtv: true } : null\n };\n },\n\n getAppLinks(\n presentation: Presentation,\n availablePresentations: Presentation[],\n moviesAndTv: boolean,\n presentationSlug: string | null\n ): MixedSearchResultAppLinks {\n return {\n getVideoAppLink: (video, opts: GetVideoAppLinkOptions) =>\n VideoAppLinkHelper.getAppLink(video, { ...opts, moviesAndTv }, presentationSlug),\n getPlaylistAppLink: playlist => SearchHelper.getPlaylistAppLink(playlist, moviesAndTv, presentationSlug),\n getSeriesAppLink: series => SearchHelper.getSeriesAppLink(series, moviesAndTv, presentationSlug),\n getCompanyAppLink: company => {\n const slug = LitePresentationHelper.getPresentationSlugByCompany(\n company,\n presentation,\n availablePresentations\n );\n return SearchHelper.getCompanyAppLink(company, slug);\n },\n getClassificationAppLink:\n classification => SearchHelper.getClassificationAppLink(classification, moviesAndTv, availablePresentations),\n getPreviewQuestionsAppLink: interactive => InteractiveHelpers.getPreviewQuestionsAppLink(interactive),\n getCollectionActions: SearchHelper.getCollectionActions,\n searchSettings: {\n application: AppChannels.SETTINGS,\n action: Actions.Settings.PLATFORM_SETTINGS\n }\n };\n },\n\n isSearchAppLink(currentAppLink: Core.AppLink): boolean {\n return currentAppLink.application === AppChannels.SEARCH && currentAppLink.action === Actions.Search.HOME;\n },\n\n useReferrerAppLink(): Core.AppLink {\n const defaultReferrerAppLink: Core.AppLink = {\n application: AppChannels.DASHBOARD,\n action: Actions.Dashboard.HOME,\n args: [null as string]\n };\n \n const [ referrerApplink, setReferrerAppLink ] = React.useState<Core.AppLink>(defaultReferrerAppLink);\n \n const currentRoute = ContextService.getCurrentRoute();\n \n React.useEffect(() => {\n if (SearchHelper.isSearchAppLink(currentRoute.appLink))\n return;\n\n setReferrerAppLink(currentRoute.appLink);\n }, [ currentRoute.appLink.application, currentRoute.appLink.action ]);\n \n return referrerApplink;\n },\n\n useOnFilterChange(fetchResults: (cursor?: string) => void, queryParams: HashObject): void {\n const params = { ...queryParams };\n delete params.query;\n\n const sortedValues = Object.keys(params).map(filterName => params[filterName]).sort((a, b) => a - b);\n\n React.useEffect(() => {\n fetchResults();\n }, [sortedValues.join(':')]);\n },\n\n triggerAppLink(query: string, otherQueryParams: HashObject = {}, isOnSearchPage: boolean): void {\n let params: HashObject = {};\n\n otherQueryParams = isOnSearchPage ? ObjectHelper.omit(otherQueryParams, ['query']) : {};\n\n if (query)\n params.query = TextHelper.removeExtraSpace(query);\n\n if (Object.keys(otherQueryParams).length) {\n params = {\n ...params,\n ...otherQueryParams\n };\n }\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n params\n }, { replace: isOnSearchPage });\n },\n\n getInitialQuery(): string {\n const currentAppLink = ContextService.getCurrentRoute().appLink;\n \n if (!SearchHelper.isSearchAppLink(currentAppLink))\n return '';\n \n return (currentAppLink.params as HashObject)?.query ?? '';\n },\n\n isValidSearch(query: string, currentAppLink: Core.AppLink): boolean {\n if (query?.trim())\n return true;\n\n if (!SearchHelper.isSearchAppLink(currentAppLink))\n return false;\n\n // If there's no search query, but a tag/topic filter is applied, the search is still valid\n const tagOrClassificationParam = (currentAppLink?.params as HashObject)?.tagOrClassification;\n const ratingParam = (currentAppLink?.params as HashObject)?.rating;\n const moviesAndTvParam = (currentAppLink?.params as HashObject)?.moviesAndTv;\n const source = (currentAppLink?.params as HashObject)?.source;\n const scopeId = (currentAppLink?.params as HashObject)?.scopeId;\n\n if (Array.isArray(tagOrClassificationParam))\n return !!tagOrClassificationParam.length;\n\n return (\n !!tagOrClassificationParam?.length ||\n !!ratingParam?.length ||\n !!moviesAndTvParam?.length ||\n !!source?.length ||\n !!scopeId?.length\n );\n },\n \n getFirstSeries(grouping: ResultGrouping) {\n return ArrayHelper.first(grouping.items) as SearchResultsObject<Series>;\n },\n\n getFirstPlaylist(grouping: ResultGrouping) {\n return ArrayHelper.first(grouping.items) as SearchResultsObject<Playlist>;\n },\n\n getVideoAppLink(video: Video, presentationSlug: string | null) {\n return {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PLAY_VIDEO,\n args: [ presentationSlug, video.id, TextHelper.slugify(video.name) ]\n };\n },\n\n /**\n * Companies and Classifications cannot be filtered well by tags.\n * This is especially evident when a user has searched for only a tag,\n * but has passed no query string. In this case, we populate the `query`\n * param with the names of the selected tags.\n */\n getQuery(queryParams: HashObject): string {\n if (queryParams.query)\n return queryParams.query;\n\n if (!queryParams.tagOrClassification)\n return '';\n\n const tagOrClassificationFilter = Array.isArray(queryParams.tagOrClassification) ?\n queryParams.tagOrClassification :\n [queryParams.tagOrClassification];\n\n return tagOrClassificationFilter.join(' ');\n },\n\n getInaccessibleIndices(options: {\n isLearner: boolean,\n queryParams: HashObject,\n hasMoviesAndTv: boolean\n }): SearchIndices[] {\n const { isLearner, queryParams, hasMoviesAndTv } = options;\n \n const inaccessible: SearchIndices[] = [];\n \n if (isLearner || queryParams.moviesAndTv) {\n inaccessible.push('clip');\n inaccessible.push('interactive');\n }\n \n if (!hasMoviesAndTv)\n inaccessible.push('company');\n \n return inaccessible;\n },\n\n getFilters(options: GetFiltersOptions) {\n const {\n data,\n inaccessibleIndices,\n tagsAndClassifications,\n _hasNewSearch,\n _hasPartnerProfiles,\n hasCVFilters\n } = options;\n \n if (!data.hasDataLoaded || (!_hasNewSearch && tagsAndClassifications && !tagsAndClassifications.hasCompleted))\n return null;\n\n const {\n moviesAndTvDashboard,\n ratings,\n yearGroups,\n userDetails,\n schoolLevels,\n availableTopics,\n libraries,\n currentUser,\n isLearner,\n hasCustomLibraries,\n hasMoviesAndTv,\n isGuest,\n showStreamableSearchResults\n } = data;\n\n const mtvOnFilter = XmasConstants.IS_XMAS ?\n Filters.MoviesAndTv(ImageUrls.MoviesAndTv.XMAS_SOCK, ImageUrls.MoviesAndTv.XMAS_GIFTS) :\n Filters.MoviesAndTv(ImageUrls.MoviesAndTv.POPCORN_BOX, ImageUrls.MoviesAndTv.POPCORN_BITS);\n\n const mtvOffFilter = XmasConstants.IS_XMAS ?\n Filters.MoviesAndTv(ImageUrls.MoviesAndTv.POPCORN_BOX, ImageUrls.MoviesAndTv.POPCORN_BITS) :\n null;\n\n const mainFilters = [];\n\n if (hasCVFilters) {\n if (hasMoviesAndTv && moviesAndTvDashboard.data?.id) {\n mainFilters.push(mtvOnFilter);\n } else {\n mainFilters.push(mtvOffFilter);\n }\n\n if (currentUser.data?.isAuthenticated) {\n mainFilters.push(Filters.Source(SourceFilterHelper.getOptions({\n libraries,\n isLearner,\n isGuest,\n hasCustomLibraries,\n liveStreams: showStreamableSearchResults\n })));\n }\n\n if (!isGuest) {\n mainFilters.push(Filters.Rating(\n ratings.data,\n yearGroups.data && userDetails.data &&\n RatingFilterHelper.getStudentMaxRating(yearGroups.data, userDetails.data)\n ));\n }\n\n mainFilters.push(Filters.HasResources());\n mainFilters.push(Filters.ObjectTypes(inaccessibleIndices, _hasNewSearch, _hasPartnerProfiles));\n \n if (!_hasNewSearch) {\n mainFilters.push(Filters.TagOrClassification(tagsAndClassifications.data));\n }\n } else {\n if (currentUser.data?.isAuthenticated) {\n mainFilters.push(Filters.Source(SourceFilterHelper.getOptions({\n libraries,\n isLearner,\n isGuest,\n hasCustomLibraries,\n hideCVLibrary: true,\n liveStreams: showStreamableSearchResults\n })));\n }\n }\n \n const presentationFilter = Filters.Presentation(schoolLevels.data?.schoolLevels, _hasNewSearch);\n const showPresentationFilter = FilterHelper.showPresentationFilter(presentationFilter);\n \n if (showPresentationFilter) {\n mainFilters.unshift(presentationFilter);\n }\n \n const topicsFilter = Filters.Topics(\n availableTopics.data?.topics.map(t => ({ name: t.name, id: t.topicIds.join(':') })) as FilterOption[]\n );\n \n if (topicsFilter.options && topicsFilter.options.length > 1)\n mainFilters.unshift(topicsFilter);\n \n const moreFilters = [\n Filters.ProductionYear(),\n Filters.HasSubtitles(),\n Filters.IsHD()\n ];\n \n if (hasCVFilters)\n moreFilters.push(Filters.IsClickViewContent());\n\n moreFilters.push(Filters.Duration());\n \n return {\n mainFilters: mainFilters.filter(Boolean),\n moreFilters: FilterHelper.getMoreFilters(moreFilters)\n };\n },\n\n getSearchAppLink(query: string, queryParams: HashObject): Core.AppLink {\n return {\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n params: {\n ...queryParams,\n query\n }\n };\n },\n\n getBackendFilters(options: {\n queryParams: HashObject,\n ratings: Flight.Response<Rating[]>,\n currentPresentationId: string,\n isLearner: boolean,\n hasDataLoaded: boolean,\n libraries: Library[],\n settings: SettingsHash,\n streamableLibraryId: string,\n exchangeLibraryId: string,\n showExchangeSearchResults: boolean,\n hasMoviesAndTv: boolean,\n showStreamableSearchResults: boolean\n }) {\n if (!options.hasDataLoaded)\n return null;\n\n const {\n queryParams,\n ratings,\n currentPresentationId,\n isLearner,\n libraries,\n hasMoviesAndTv,\n streamableLibraryId,\n exchangeLibraryId,\n showExchangeSearchResults,\n showStreamableSearchResults\n } = options;\n \n const backendFilters = FilterHelper.buildBackendFilterParams(\n queryParams,\n ratings.data,\n [currentPresentationId],\n isLearner,\n libraries,\n streamableLibraryId\n );\n\n const excludeLibraryFilter = `${FilterConstants.FILTER_PARAM_PREFIX}excludeLibraryExclusive`;\n const excludeLibraryIds = [];\n\n if (streamableLibraryId && !showStreamableSearchResults) {\n excludeLibraryIds.push(streamableLibraryId);\n }\n\n if (exchangeLibraryId && !showExchangeSearchResults) {\n excludeLibraryIds.push(exchangeLibraryId);\n }\n\n backendFilters[excludeLibraryFilter] = excludeLibraryIds;\n \n const inaccessibleIndices = SearchHelper.getInaccessibleIndices({\n isLearner,\n hasMoviesAndTv,\n queryParams\n });\n \n // Topic search is done separately using `useSearchTopics()`\n // Company search is done separately using `useSearchCompanies()`\n const appliedIndices = FilterHelper.getAppliedIndices(options.queryParams)\n .filter(i => i !== 'classification' && i !== 'company')\n .filter(index => !inaccessibleIndices.find(i => i === index));\n\n return {\n queryParams,\n backendFilters,\n appliedIndices,\n inaccessibleIndices\n };\n },\n\n getBackendFiltersV2(options: {\n queryParams: HashObject,\n ratings: Flight.Response<Rating[]>,\n currentPresentationId: string,\n isLearner: boolean,\n hasDataLoaded: boolean,\n libraries: Library[],\n settings: SettingsHash,\n streamableLibraryId: string,\n exchangeLibraryId: string,\n showExchangeSearchResults: boolean,\n hasMoviesAndTv: boolean,\n availablePresentations: Presentation[],\n showStreamableSearchResults: boolean\n }) {\n if (!options.hasDataLoaded)\n return null;\n\n const {\n queryParams,\n ratings,\n isLearner,\n libraries,\n hasMoviesAndTv,\n streamableLibraryId,\n exchangeLibraryId,\n showExchangeSearchResults,\n availablePresentations,\n showStreamableSearchResults\n } = options;\n\n const backendFilters = FilterHelper.buildBackendFilterParams(\n queryParams,\n ratings.data,\n availablePresentations?.map(p => p.id),\n isLearner,\n libraries,\n streamableLibraryId\n );\n \n const excludeLibraryIds: string[] = [];\n if (streamableLibraryId && !showStreamableSearchResults) {\n excludeLibraryIds.push(streamableLibraryId);\n }\n\n if (exchangeLibraryId && !showExchangeSearchResults) {\n excludeLibraryIds.push(exchangeLibraryId);\n }\n\n const inaccessibleIndices = SearchHelper.getInaccessibleIndices({\n isLearner,\n hasMoviesAndTv,\n queryParams\n });\n\n const indicesFilter = `${FilterConstants.FILTER_PARAM_PREFIX}indicesFilters`;\n\n const appliedIndices = FilterHelper.getAppliedIndices(\n options.queryParams,\n true,\n options.settings.hasPartnerProfiles\n ).filter(index => !inaccessibleIndices.find(i => i === index));\n\n const availablePresentationIds = availablePresentations?.map(p => p.id);\n\n const indicesWithFilters: HashObject[] = appliedIndices.map(index => {\n const indiceFilter = { index };\n \n if (index === 'video' && excludeLibraryIds.length) {\n const indice: HashObject = {\n ...indiceFilter,\n filters: {\n excludeLibraryExclusive: [...excludeLibraryIds]\n }\n };\n\n return indice;\n }\n\n if (index === 'classification') {\n const indice: HashObject = {\n ...indiceFilter,\n filters: {\n classificationType: ClassificationType.Subject,\n status: [ ClassificationStatus.Published, ClassificationStatus.ComingSoon ]\n }\n };\n\n if (availablePresentations?.length) {\n indice.filters.presentation = availablePresentationIds;\n }\n\n return indice;\n }\n\n if (index === 'company') {\n const indice: HashObject = {\n ...indiceFilter,\n filters: {\n presentation: availablePresentationIds\n }\n };\n\n return indice;\n }\n\n return indiceFilter;\n });\n\n backendFilters[indicesFilter] = indicesWithFilters;\n \n return {\n queryParams,\n backendFilters,\n appliedIndices,\n inaccessibleIndices\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
|