@clickview/lite 0.50.0-rc.4 → 0.50.0-rc.6
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/bundles.json +1 -1
- package/dist/scripts/{1402-d327ed0365-lite.chunk.js → 1402-8c3babb6af-lite.chunk.js} +2 -2
- package/dist/scripts/1402-8c3babb6af-lite.chunk.js.map +1 -0
- package/dist/scripts/{1437-0db2164033-lite.chunk.js → 1437-2931819506-lite.chunk.js} +2 -2
- package/dist/scripts/{1437-0db2164033-lite.chunk.js.map → 1437-2931819506-lite.chunk.js.map} +1 -1
- package/dist/scripts/{1518-9961f6d99b-lite.chunk.js → 1518-e6c8ab0c89-lite.chunk.js} +2 -2
- package/dist/scripts/1518-e6c8ab0c89-lite.chunk.js.map +1 -0
- package/dist/scripts/{1820-006bcd8691-lite.chunk.js → 1820-818cf5a35d-lite.chunk.js} +2 -2
- package/dist/scripts/{1820-006bcd8691-lite.chunk.js.map → 1820-818cf5a35d-lite.chunk.js.map} +1 -1
- package/dist/scripts/{1895-933141db03-lite.chunk.js → 1895-a799be78c3-lite.chunk.js} +3 -3
- package/dist/scripts/{1895-933141db03-lite.chunk.js.map → 1895-a799be78c3-lite.chunk.js.map} +1 -1
- package/dist/scripts/{2446-c6b50a79cd-lite.chunk.js → 2446-acc94130ed-lite.chunk.js} +3 -3
- package/dist/scripts/{2446-c6b50a79cd-lite.chunk.js.map → 2446-acc94130ed-lite.chunk.js.map} +1 -1
- package/dist/scripts/{2703-430c5a5fc1-lite.chunk.js → 2703-6ae830c2e6-lite.chunk.js} +2 -2
- package/dist/scripts/2703-6ae830c2e6-lite.chunk.js.map +1 -0
- package/dist/scripts/{2724-9b1a944cfb-lite.chunk.js → 2724-ee3a51e0c9-lite.chunk.js} +2 -2
- package/dist/scripts/{2724-9b1a944cfb-lite.chunk.js.map → 2724-ee3a51e0c9-lite.chunk.js.map} +1 -1
- package/dist/scripts/{3070-4e82411f0c-lite.chunk.js → 3070-07721de8f8-lite.chunk.js} +2 -2
- package/dist/scripts/3070-07721de8f8-lite.chunk.js.map +1 -0
- package/dist/scripts/{5242-04c52713f2-lite.chunk.js → 5242-76b32478bc-lite.chunk.js} +2 -2
- package/dist/scripts/5242-76b32478bc-lite.chunk.js.map +1 -0
- package/dist/scripts/{537-92893a696e-lite.chunk.js → 537-850ad2ee25-lite.chunk.js} +3 -3
- package/dist/scripts/{537-92893a696e-lite.chunk.js.map → 537-850ad2ee25-lite.chunk.js.map} +1 -1
- package/dist/scripts/{5936-59acb26157-lite.chunk.js → 5936-7ad136f2a3-lite.chunk.js} +2 -2
- package/dist/scripts/5936-7ad136f2a3-lite.chunk.js.map +1 -0
- package/dist/scripts/6181-7a4fc8e1e1-lite.chunk.js +2 -0
- package/dist/scripts/6181-7a4fc8e1e1-lite.chunk.js.map +1 -0
- package/dist/scripts/{6263-0be2ae1ab4-lite.chunk.js → 6263-a60b811d93-lite.chunk.js} +2 -2
- package/dist/scripts/6263-a60b811d93-lite.chunk.js.map +1 -0
- package/dist/scripts/{6309-79092eb273-lite.chunk.js → 6309-dd3a8e7f21-lite.chunk.js} +3 -3
- package/dist/scripts/{6309-79092eb273-lite.chunk.js.map → 6309-dd3a8e7f21-lite.chunk.js.map} +1 -1
- package/dist/scripts/{6489-51de20f6f6-lite.chunk.js → 6489-335e4d9396-lite.chunk.js} +3 -3
- package/dist/scripts/{6489-51de20f6f6-lite.chunk.js.map → 6489-335e4d9396-lite.chunk.js.map} +1 -1
- package/dist/scripts/6531-835c743f1b-lite.chunk.js +2 -0
- package/dist/scripts/6531-835c743f1b-lite.chunk.js.map +1 -0
- package/dist/scripts/6741-e0ed9fd6f0-lite.chunk.js +3 -0
- package/dist/scripts/6741-e0ed9fd6f0-lite.chunk.js.map +1 -0
- package/dist/scripts/{6846-5ae3efe823-lite.chunk.js → 6846-08b00decd8-lite.chunk.js} +2 -2
- package/dist/scripts/{6846-5ae3efe823-lite.chunk.js.map → 6846-08b00decd8-lite.chunk.js.map} +1 -1
- package/dist/scripts/{7187-814cd6f6db-lite.chunk.js → 7187-93d4aac9eb-lite.chunk.js} +2 -2
- package/dist/scripts/{7187-814cd6f6db-lite.chunk.js.map → 7187-93d4aac9eb-lite.chunk.js.map} +1 -1
- package/dist/scripts/8055-08b92f8ed7-lite.chunk.js +3 -0
- package/dist/scripts/8055-08b92f8ed7-lite.chunk.js.map +1 -0
- package/dist/scripts/{8085-ed82fb07da-lite.chunk.js → 8085-cde67e66df-lite.chunk.js} +2 -2
- package/dist/scripts/8085-cde67e66df-lite.chunk.js.map +1 -0
- package/dist/scripts/8139-f0229a0806-lite.chunk.js +3 -0
- package/dist/scripts/8139-f0229a0806-lite.chunk.js.map +1 -0
- package/dist/scripts/{8354-a104955138-lite.chunk.js → 8354-411c0c4a3a-lite.chunk.js} +2 -2
- package/dist/scripts/8354-411c0c4a3a-lite.chunk.js.map +1 -0
- package/dist/scripts/{841-85a91a6576-lite.chunk.js → 841-a60ac16a8c-lite.chunk.js} +3 -3
- package/dist/scripts/{841-85a91a6576-lite.chunk.js.map → 841-a60ac16a8c-lite.chunk.js.map} +1 -1
- package/dist/scripts/{8987-07d38d2bab-lite.chunk.js → 8987-9fb9a632e7-lite.chunk.js} +2 -2
- package/dist/scripts/8987-9fb9a632e7-lite.chunk.js.map +1 -0
- package/dist/scripts/{9068-1c0aece2e1-lite.chunk.js → 9068-562c30f718-lite.chunk.js} +2 -2
- package/dist/scripts/9068-562c30f718-lite.chunk.js.map +1 -0
- package/dist/scripts/{9839-5347f31f8b-lite.chunk.js → 9839-d50dedfab8-lite.chunk.js} +3 -3
- package/dist/scripts/9839-d50dedfab8-lite.chunk.js.map +1 -0
- package/dist/scripts/{bundle-90f71581a8.min.js → bundle-098294f9a6.min.js} +3 -3
- package/dist/scripts/bundle-098294f9a6.min.js.map +1 -0
- package/package.json +1 -1
- package/dist/scripts/1402-d327ed0365-lite.chunk.js.map +0 -1
- package/dist/scripts/1518-9961f6d99b-lite.chunk.js.map +0 -1
- package/dist/scripts/2703-430c5a5fc1-lite.chunk.js.map +0 -1
- package/dist/scripts/3070-4e82411f0c-lite.chunk.js.map +0 -1
- package/dist/scripts/5242-04c52713f2-lite.chunk.js.map +0 -1
- package/dist/scripts/5936-59acb26157-lite.chunk.js.map +0 -1
- package/dist/scripts/6181-4944b5c6a2-lite.chunk.js +0 -2
- package/dist/scripts/6181-4944b5c6a2-lite.chunk.js.map +0 -1
- package/dist/scripts/6263-0be2ae1ab4-lite.chunk.js.map +0 -1
- package/dist/scripts/6531-d77ba2c5ce-lite.chunk.js +0 -2
- package/dist/scripts/6531-d77ba2c5ce-lite.chunk.js.map +0 -1
- package/dist/scripts/6741-6222c7b762-lite.chunk.js +0 -3
- package/dist/scripts/6741-6222c7b762-lite.chunk.js.map +0 -1
- package/dist/scripts/8055-9c259a30c4-lite.chunk.js +0 -3
- package/dist/scripts/8055-9c259a30c4-lite.chunk.js.map +0 -1
- package/dist/scripts/8085-ed82fb07da-lite.chunk.js.map +0 -1
- package/dist/scripts/8139-ec264689fd-lite.chunk.js +0 -3
- package/dist/scripts/8139-ec264689fd-lite.chunk.js.map +0 -1
- package/dist/scripts/8354-a104955138-lite.chunk.js.map +0 -1
- package/dist/scripts/8987-07d38d2bab-lite.chunk.js.map +0 -1
- package/dist/scripts/9068-1c0aece2e1-lite.chunk.js.map +0 -1
- package/dist/scripts/9839-5347f31f8b-lite.chunk.js.map +0 -1
- package/dist/scripts/bundle-90f71581a8.min.js.map +0 -1
- /package/dist/scripts/{1895-933141db03-lite.chunk.js.LICENSE.txt → 1895-a799be78c3-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{2446-c6b50a79cd-lite.chunk.js.LICENSE.txt → 2446-acc94130ed-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{537-92893a696e-lite.chunk.js.LICENSE.txt → 537-850ad2ee25-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{6309-79092eb273-lite.chunk.js.LICENSE.txt → 6309-dd3a8e7f21-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{6489-51de20f6f6-lite.chunk.js.LICENSE.txt → 6489-335e4d9396-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{6741-6222c7b762-lite.chunk.js.LICENSE.txt → 6741-e0ed9fd6f0-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{8055-9c259a30c4-lite.chunk.js.LICENSE.txt → 8055-08b92f8ed7-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{8139-ec264689fd-lite.chunk.js.LICENSE.txt → 8139-f0229a0806-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{841-85a91a6576-lite.chunk.js.LICENSE.txt → 841-a60ac16a8c-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{9839-5347f31f8b-lite.chunk.js.LICENSE.txt → 9839-d50dedfab8-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{bundle-90f71581a8.min.js.LICENSE.txt → bundle-098294f9a6.min.js.LICENSE.txt} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/3070-4e82411f0c-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/widgets/items/popout-video-widget-item/PopoutVideoWidgetItem.tsx","file:///app/packages/libs/shared/src/components/widgets/items/popout-video-widget-item/popout-video-widget-item.scss","file:///app/packages/libs/shared/src/hooks/UseBatchFetch.ts","file:///app/packages/libs/shared/src/hooks/UseMergeAudiences.ts","file:///app/packages/libs/shared/src/utils/audience-helper/AudienceStringBuilders.ts","file:///app/packages/libs/shared/src/utils/audience-helper/AudienceHelper.ts","file:///app/packages/projects/lite/src/apps/default/views/popup-plugin/components/nav-tiles.scss","file:///app/packages/projects/lite/src/apps/default/views/popup-plugin/components/Navtiles.tsx","file:///app/packages/projects/lite/src/apps/default/views/popup-plugin/PopupPluginView.tsx","file:///app/packages/projects/lite/src/apps/default/views/popup-plugin/hooks/useGetVideoHistoryVideos.ts","file:///app/packages/projects/lite/src/apps/watch-history/flight-requests/VideoHistoryRequests.ts","file:///app/packages/projects/lite/src/shared/hooks/useVideoMixin.ts"],"sourcesContent":["import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { VideoSubTextType } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { FixedWidgetItemProps } from 'libs/shared/components/widgets/items/FixedWidgetItemProps';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { CanFavouriteFunc, FavouriteFunc, PresentationAudience, Video, VideoTypes, WidgetType, YearGroup } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './popout-video-widget-item.scss';\n\nexport interface PopoutVideoWidgetItemProps extends FixedWidgetItemProps<VideoTypes> {\n canFavourite: CanFavouriteFunc;\n setFavourite: FavouriteFunc;\n presentationAudiences: PresentationAudience[];\n imageCdnUrl: string;\n yearGroups: YearGroup[];\n showVideoGuidance: boolean;\n hideTitle?: boolean;\n hideSeries?: boolean;\n companyLogoFallbackUrl?: string;\n subTextType?: VideoSubTextType;\n getSubTextAppLink?: (video: Video) => Core.AppLink;\n getInteractiveGuidanceAppLink: (id: string, type: MasterType) => Core.AppLink;\n getResourceGuidanceAppLink: (id: string, type: MasterType) => Core.AppLink;\n getClassroomGuideAppLink: (id: string, type: MasterType) => Core.AppLink;\n preventPopout?: boolean;\n isPlugin: boolean;\n}\n\nexport const PopoutVideoWidgetItem = React.memo(function(props: PopoutVideoWidgetItemProps): JSX.Element {\n const { data: video, getSubTextAppLink, context, thumbnailSize, preloadImage, presentationAudiences } = props;\n \n const videoAudiences = video?.subjectPresentationAudiences?.data;\n const mergedAudience = useMergeAudiences(videoAudiences, presentationAudiences);\n\n const breakpoints = useBreakpoints();\n\n let width = styles.rowWidth;\n\n if (context.type === WidgetType.LargeRow)\n width = styles.largeRowWidth;\n\n return (\n <div className={`px-1 flex-shrink-0 position-relative ${width}`}>\n <VideoThumbnail\n type={props.preventPopout || breakpoints.xs ? 'static' : 'popout'}\n textPosition={ThumbnailTextPosition.Below}\n video={video}\n appLink={props.getAppLink(video)}\n subTextAppLink={VideoHelper.isVideo(video) && getSubTextAppLink?.(video)}\n imageOptions={{ size: thumbnailSize }}\n preload={preloadImage}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n canFavourite={props.canFavourite}\n setFavourite={props.setFavourite}\n imageCdnUrl={props.imageCdnUrl}\n audience={mergedAudience}\n hideRating={!!mergedAudience}\n hideDuration={false}\n yearGroups={props.yearGroups}\n hideTitle={props.hideTitle}\n showVideoGuidance={props.showVideoGuidance}\n companyLogoFallbackUrl={props.companyLogoFallbackUrl}\n subTextType={props.subTextType}\n isPlugin={props.isPlugin}\n getInteractiveGuidanceAppLink={props.getInteractiveGuidanceAppLink}\n getResourceGuidanceAppLink={props.getResourceGuidanceAppLink}\n getClassroomGuideAppLink={props.getClassroomGuideAppLink}\n />\n </div>\n );\n});","// extracted by mini-css-extract-plugin\nexport default {\"rowWidth\":\"JSM4l\",\"largeRowWidth\":\"YYpNz\"};","import React from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport { Flight } from 'libs/common/flight';\nimport { ApplicationState, HashObject } from 'libs/common/react/interfaces';\n\nimport { BaseObject } from 'libs/shared/interfaces';\n\nexport interface UseBatchFetchResult<T extends BaseObject> {\n items: { [key: string]: T} | null;\n isFetching: boolean;\n}\n\n/**\n * Used to fetch multiple items by id with Flight. Will fetch 25 items at a time firing off multiple\n * requests if there are more than 25 items.\n * This will return items as null until we have all our items. Items will be returned as an object with\n * their ids as they key for easy mapping\n * \n * @param itemIds \n * @param getRequest \n */\nexport function useBatchFetch<T extends BaseObject>(\n itemIds: string[],\n getRequest: (ids: string[]) => Flight.Request\n): UseBatchFetchResult<T> {\n const [ idBatches, setIdBatches ] = React.useState<string[][]>([]);\n\n React.useEffect(() => {\n if (!itemIds?.length)\n return;\n\n const newBatches = [...idBatches];\n newBatches.push([]);\n\n itemIds.forEach(id => {\n if (newBatches.find(batch => batch.find(_id => _id === id)))\n return;\n\n newBatches[newBatches.length - 1].push(id);\n });\n\n setIdBatches(newBatches.filter(batch => batch.length));\n }, [itemIds ? itemIds.join(',') : null]);\n\n const dispatch = useDispatch();\n\n const state = useSelector((state: ApplicationState) => state);\n\n React.useEffect(() => {\n idBatches.forEach(idBatch => {\n const request = getRequest(idBatch);\n const response = Flight.getResponse<T[]>(state, request.key);\n\n if (response.shouldFetch)\n Flight.fetch(dispatch, request);\n });\n }, [idBatches?.length]);\n\n if (!idBatches?.length)\n return { items: null, isFetching: false };\n \n const items: { [key: string]: T} = {};\n\n /* Used locally to only return our items if we've fetched all of them */\n const responses: HashObject<Flight.Response<T[]>> = {};\n \n idBatches.forEach((idBatch, i) => {\n const request = getRequest(idBatch);\n const response = Flight.getResponse<T[]>(state, request.key);\n responses[i] = response;\n\n if (response.data)\n response.data.forEach(v => items[v.id] = v);\n });\n\n return {\n items: Object.keys(responses).some(k => !!responses[k].data) ? items : null,\n isFetching: !!Object.keys(responses).some(k => responses[k].isFetching)\n };\n}","import React from 'react';\n\nimport { Audience, PresentationAudience } from '../interfaces';\nimport { AudienceHelper } from '../utils/audience-helper/AudienceHelper';\n\nexport function useMergeAudiences(\n audiences: Audience[],\n presentationAudiences: PresentationAudience[]\n): PresentationAudience {\n // Memoize the audience functions as they are somewhat expensive and the result shouldn't change\n const sortedAudiences = React.useMemo(() => {\n if (!audiences?.length || !presentationAudiences || !AudienceHelper.shouldShowAudiences(presentationAudiences))\n return null;\n\n return AudienceHelper.getSortedPresentationAudiences(audiences, presentationAudiences);\n }, [audiences]);\n\n const mergedAudience = React.useMemo(() => {\n if (!sortedAudiences?.length)\n return null;\n\n return AudienceHelper.getMergedPresentationAudienceString(sortedAudiences);\n }, [sortedAudiences]);\n\n return mergedAudience;\n}","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\nconst HAS_NUMBER_REGEX = /\\d/;\nconst COUNT_OFFSET = 1;\n\nexport const AudienceStringBuilders = {\n /**\n * Handles audience sets like:\n * - Year 7, Year 8, etc\n * - Kindergarten, Grade 1, Grade 2, etc\n */\n yearsAndGradesBuilder(audiences: PresentationAudience[]): string {\n /**\n * Create a string with all of the audiences\n */\n const combinedNames = audiences.map(a => a.name).join(' ');\n\n /**\n * Extract all the numbers and matches from the string\n */\n const numberList = combinedNames.split(' ').filter(name => !isNaN(+name)).map(num => +num) || [];\n const wordList = combinedNames.split(' ').filter(name => isNaN(+name)) || [];\n\n // Find an audience that doesn't have a number, like \"Kindergarten\" or \"Foundation\".\n const audienceWithoutNum = audiences.find(p => {\n return !HAS_NUMBER_REGEX.test(p.name);\n });\n\n // Get audience label prefix\n let prefix = wordList.find(name => name !== audienceWithoutNum?.name);\n\n // Pluralise the prefix is there are multiple audiences\n if (audiences.length > 1)\n prefix += 's';\n\n if (audienceWithoutNum && numberList.length)\n return `${prefix} ${audienceWithoutNum.name.charAt(0)} - ${numberList.pop()}`;\n\n /**\n * Build set of logical audience ranges\n */\n const audienceRange = processAudienceRanges(numberList);\n\n return `${prefix} ${audienceRange.join(', ')}`;\n },\n\n /**\n * Handles audience sets like:\n * - Early Level, First Level, etc\n * - Lower Primary, Middle Primary, etc\n */\n wordyLevelsBuilder(audiences: PresentationAudience[]): string {\n const audienceNames = audiences.map(a => a.name);\n\n const commonWordsAndTheirPositions: { [word: string]: 'start' | 'end' } = {};\n\n /**\n * Go through each audience name, and find the words that are common between _all_ of the audiences.\n * For example, if the audiences are \"Early Level\", \"First Level\", and \"Second Level\", the common\n * word will be \"Level\".\n * We will also save whether the common word appears at the beginning or the end of the audience name.\n */\n audienceNames.forEach((name, index) => {\n if (index === 0) {\n const wordsInName = name.split(' ');\n wordsInName.forEach((word, index) => {\n commonWordsAndTheirPositions[word] = index === 0 ? 'start' : 'end';\n });\n\n return;\n }\n\n const wordsInName = name.split(' ');\n\n Object.keys(commonWordsAndTheirPositions).forEach(word => {\n if (!wordsInName.includes(word))\n delete commonWordsAndTheirPositions[word];\n });\n });\n\n // This function currently only handles audience names with 1 common word.\n const commonWord = Object.keys(commonWordsAndTheirPositions)[0];\n const commonWordPosition = commonWordsAndTheirPositions[commonWord];\n\n if (!commonWord)\n return audiences[0].name;\n\n /**\n * At this point, we will have a common word and the position of that word.\n * We now need to build out the rest of the audience name by merging the unique words.\n * For example, if the audiences are \"Early Level\", \"First Level\", and \"Second Level\", we will get\n * \"Early - Second\"\n */\n\n const firstAudienceName = audiences[0].name;\n const lastAudienceName = audiences[audiences.length - 1].name;\n\n // Function to strip the common word out of the audience name\n const stripOutCommonWord = (name: string) => name.split(commonWord)[0];\n\n const mergedWord = `${stripOutCommonWord(firstAudienceName)} - ${stripOutCommonWord(lastAudienceName)}`;\n\n const finalName = commonWordPosition === 'start'\n ? `${commonWord} ${mergedWord}`\n : `${mergedWord} ${commonWord}`;\n\n return finalName;\n },\n\n /**\n * Handles the english secondary audiences, which can be: Lower Secondary, Upper Secondary, and Advanced\n */\n englishSecondaryBuilder(audiences: PresentationAudience[]): string {\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n if (firstAudience.name === lastAudience.name)\n return firstAudience.name;\n\n if (lastAudience.name === 'Advanced') {\n const [level] = firstAudience.name.split(' ');\n\n if (level.toLowerCase() === 'lower')\n return 'Lower Sec - Adv';\n\n return 'Upper Sec - Adv';\n }\n\n return 'Lower - Upper Sec';\n },\n\n scottishSecondaryBuilder(audiences: PresentationAudience[]): string {\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n if (firstAudience.name === lastAudience.name)\n return firstAudience.name;\n\n if (lastAudience.name === 'Senior Phase')\n return `${firstAudience.name} - Senior`;\n\n return 'Third - Fourth Level';\n },\n\n /**\n * Handles the audience set: Reception, Key Stage 1, Lower Key Stage 2, and Upper Key Stage 2\n */\n keyStagesBuilder(audiences: PresentationAudience[]): string {\n // The first and last audience will build out the range\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n // The first word in the strings will either be \"Upper\", \"Lower\", \"Key\", or \"Reception\"\n const firstAudienceFirstWord = ArrayHelper.first(firstAudience.name.split(' '));\n const lastAudienceFirstWord = ArrayHelper.first(lastAudience.name.split(' '));\n\n // Each audience in this set except for \"Reception\" has a number. Get the numbers for the first and last audiences\n const firstAudienceNumber = firstAudience.name.split(' ').find(word => !isNaN(+word));\n const lastAudienceNumber = lastAudience.name.split(' ').find(word => !isNaN(+word));\n\n // If there's only one audience on the video:\n if (firstAudience === lastAudience) {\n // For these 2 audiences, return the full name as it's short enough already\n if (firstAudienceFirstWord === 'Key' || firstAudienceFirstWord === 'Reception')\n return firstAudience.name;\n\n // For the Upper/Lower key stage audiences, abbreviate the \"key stage\" part to KS1/KS2\n return `${firstAudienceFirstWord} KS${firstAudienceNumber}`;\n }\n\n /**\n * Handle when the object has >1 audience\n */\n\n let firstAudienceString = '';\n let lastAudienceString = '';\n\n // Reception is always shortened to \"R\" when in a range\n if (firstAudienceFirstWord === 'Reception') {\n firstAudienceString = 'R';\n } else {\n // All other audiences will be abbreviated to \"KS1/KS2\"\n firstAudienceString = `KS${firstAudienceNumber}`;\n }\n\n // The last audience will always be a key stage, so abbreviate this too\n lastAudienceString = `KS${lastAudienceNumber}`;\n\n // If the audience range contains both the \"Lower\" and \"Upper\" audiences, abbreviate those and return\n if (firstAudienceFirstWord === 'Lower' && lastAudienceFirstWord === 'Upper') {\n return `L ${firstAudienceString} - U ${lastAudienceString}`;\n }\n\n // Add \"Lower\" and \"Upper\" to the strings if it's needed\n if (firstAudienceFirstWord === 'Lower') {\n firstAudienceString = `Lower ${firstAudienceString}`;\n }\n\n if (lastAudienceFirstWord === 'Upper') {\n lastAudienceString = `Upper ${lastAudienceString}`;\n }\n\n // This handles a case where the range is Reception - Key Stage 1. In which case we don't abbreviate the key stage part to KS1.\n if (lastAudienceFirstWord === 'Key') {\n lastAudienceString = lastAudience.name;\n }\n\n return `${firstAudienceString} - ${lastAudienceString}`;\n }\n};\n\nfunction processAudienceRanges(audienceValues: number[]): string[] {\n /**\n * Lookahead by increments of offset\n */\n const offset = COUNT_OFFSET;\n\n let initialVal; let nextVal;\n let isContinguous: boolean = false;\n\n const ranges: string[] = [];\n\n // Audience values need to be in ascending order\n audienceValues = audienceValues.sort((a, b) => a - b);\n\n let i; let j;\n\n for (i = 0; i < audienceValues.length; i++) {\n j = i + 1;\n\n // Set our lower boundary to compare against\n if (!isContinguous)\n initialVal = audienceValues[i];\n\n nextVal = audienceValues[j];\n\n /**\n * Where the next number is also the next incremental value\n * we're going to continue iterating until the next value\n * is no longer contiguos.\n */\n if (audienceValues[i] + offset === nextVal) {\n isContinguous = true;\n } else if (isContinguous) {\n /**\n * Where we were tracking a contiguous set, format appropriately \n * and store the vals\n */\n\n ranges.push(`${initialVal} - ${audienceValues[i]}`);\n isContinguous = false;\n } else {\n /**\n * Where the values arent contiguous, just store the current value\n */\n\n ranges.push(`${audienceValues[i]}`);\n isContinguous = false;\n }\n }\n\n return ranges;\n}","import { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { HardCoded } from 'libs/shared/constants/HardCoded';\nimport { Audience, BaseObject, PresentationAudience } from 'libs/shared/interfaces';\n\nimport { AudienceStringBuilders } from './AudienceStringBuilders';\n\nconst DIGIT_REGEX = /([0-9]+)/ig;\nconst SPACE_REGEX = /\\s|\\+/ig;\n\n/**\n * Where there is 1 or less audiences on a presentation, it provides little value to\n * the user's experience, so we'll hide audiences altogether.\n */\nconst MIN_AUDIENCE_THRESHOLD = 1;\n\nexport const AudienceHelper = {\n /**\n * This is needed to sort an object's audiences, as they are not sorted by the backend.\n * To do this, we take the presentation audiences (sorted) and filter them by the object's\n * audiences, leaving behind a sorted array of object audiences.\n */\n getSortedPresentationAudiences(\n objectAudiences: Audience[],\n presentationAudiences: PresentationAudience[]\n ): PresentationAudience[] {\n /**\n * Atm there is a bug in flight's optimize, around multiple parts of the page \n * fetching the same object with a different response. We are filtering out\n * falsey values in our object audience ids until that's fixed. - Sha\n */\n const objectAudienceIds = objectAudiences\n .filter(v => !!v)\n .map(audience => audience.id.toString());\n\n /**\n * Remove audiences that aren't relevant for the user's current presentation\n */\n const filteredAudiences = presentationAudiences.filter(presAudience => {\n return objectAudienceIds.includes(presAudience.masterId.toString());\n });\n\n return filteredAudiences;\n },\n\n /**\n * This function accepts a set of presentation audiences, and returns a single\n * audience where the name is a merged string of the names of all of the audiences passed in.\n *\n * As we add more presentations that have different audience sets, we'll need to extend the `switch`\n * statement below to either include new string builder functions, or to include new presentation IDs\n * for existing string builder functions.\n */\n getMergedPresentationAudienceString(presentationAudiences: PresentationAudience[]): PresentationAudience {\n const { presentationId } = ArrayHelper.first(presentationAudiences);\n\n let mergedAudienceString = '';\n\n switch (+presentationId) {\n // Generic `Name Number`. Sometimes has just name. Examples: Year 12, Grade 4, Kindergarten\n case HardCoded.PresentationIds.DEFAULT:\n case HardCoded.PresentationIds.AU_SECONDARY:\n case HardCoded.PresentationIds.US_ELEMENTARY:\n case HardCoded.PresentationIds.AU_PRIMARY:\n case HardCoded.PresentationIds.STREAMABLE_LEARNING:\n if (presentationAudiences.length === 1)\n return presentationAudiences[0];\n\n mergedAudienceString = AudienceStringBuilders.yearsAndGradesBuilder(presentationAudiences);\n break;\n\n // Early Level, First Level, Second Level, etc.\n case HardCoded.PresentationIds.SCOTLAND_PRIMARY:\n case HardCoded.PresentationIds.INTERNATIONAL_PRIMARY:\n case HardCoded.PresentationIds.INTERNATIONAL_SECONDARY:\n if (presentationAudiences.length === 1)\n return presentationAudiences[0];\n\n mergedAudienceString = AudienceStringBuilders.wordyLevelsBuilder(presentationAudiences);\n break;\n\n case HardCoded.PresentationIds.ENGLISH_SECONDARY:\n mergedAudienceString = AudienceStringBuilders.englishSecondaryBuilder(presentationAudiences);\n break;\n\n \n case HardCoded.PresentationIds.SCOTLAND_SECONDARY:\n mergedAudienceString = AudienceStringBuilders.scottishSecondaryBuilder(presentationAudiences);\n break;\n\n // Key Stage 1, Lower Key Stage 2, etc.\n case HardCoded.PresentationIds.ENGLAND_PRIMARY:\n mergedAudienceString = AudienceStringBuilders.keyStagesBuilder(presentationAudiences);\n break;\n\n // These presentations only have 1 audience mapped. These are never shown as badges in the product.\n case HardCoded.PresentationIds.US_MIDDLE:\n case HardCoded.PresentationIds.US_HIGH:\n default:\n break;\n }\n\n if (!mergedAudienceString)\n return null;\n\n return { name: mergedAudienceString } as PresentationAudience;\n },\n\n /**\n * This function assumes the members array passed in is ordered by `name`.\n */\n sortMembersWithDuplicateNamesByAudience(members: BaseObject[]): BaseObject[] {\n // Returns the lowest level audience out of an array of audience objects by looking at the name\n const getLowestAudience = (audiences: Audience[]) => {\n if (!audiences.length)\n return null;\n\n let lowestAudience: Audience;\n let lowestAudienceDigit: number;\n\n audiences.forEach(audience => {\n const digit = +ArrayHelper.first(audience.name.match(DIGIT_REGEX));\n\n if (!lowestAudience) {\n lowestAudience = audience;\n lowestAudienceDigit = digit;\n return;\n }\n\n if (digit < lowestAudienceDigit)\n lowestAudience = audience;\n });\n\n return lowestAudience;\n };\n\n // This is used to track how many times a member's name appears in the collection\n const nameCountMap: HashObject<number> = {};\n\n let sorted: BaseObject[] = [];\n\n members.forEach(member => {\n if (!nameCountMap[member.name]) {\n nameCountMap[member.name] = 1;\n sorted.push(member);\n return;\n }\n\n sorted.push(member);\n nameCountMap[member.name]++;\n\n // Take the slice of duplicates that we want to sort by audience\n const slice = sorted.splice(sorted.length - nameCountMap[member.name]);\n\n // Sort the slice by lowest audience\n const sortedSlice = slice.sort((a: any, b: any) => {\n const firstObjLowestAudience = getLowestAudience(a.subjectPresentationAudiences.data);\n const secondObjLowestAudience = getLowestAudience(b.subjectPresentationAudiences.data);\n\n if (!firstObjLowestAudience && secondObjLowestAudience)\n return 1;\n\n if (!secondObjLowestAudience)\n return -1;\n\n const comparison = firstObjLowestAudience.name.localeCompare(secondObjLowestAudience.name);\n\n if (comparison === 0) return comparison;\n\n return comparison > 0 ? -1 : 1;\n });\n\n sorted = sorted.concat(sortedSlice);\n });\n\n return sorted;\n },\n\n getActiveAudiencesFromParams(audiences: PresentationAudience[], params: HashObject = {}): PresentationAudience[] {\n if (!ObjectHelper.isObject(params) || ObjectHelper.isEmpty(params))\n return;\n\n if (!audiences || !audiences.length)\n return;\n\n if (!AudienceHelper.shouldShowAudiences(audiences))\n return;\n\n // 'a' is shorthand for audience\n let { a } = params;\n\n if (!a)\n return;\n\n // Only a single query param was passed, we'll wrap it in an array\n if (typeof a === 'string')\n a = [a];\n\n const normalizeAudienceName = (audienceName: string) => {\n return audienceName.replace(SPACE_REGEX, '').toLowerCase();\n };\n\n // Build an audience lookup\n const audienceLookup = a.reduce((state: HashObject, audienceStr: string) => {\n state[normalizeAudienceName(audienceStr)] = audienceStr;\n return state;\n }, {});\n\n // Filter out our active audience based on whether their name matches the lookup object\n return audiences.filter((audience: PresentationAudience) => {\n return audienceLookup[normalizeAudienceName(audience.name)];\n });\n },\n\n getAudienceParams(audiences: PresentationAudience[]): HashObject {\n if (!audiences?.length)\n return null;\n\n return { a: audiences.map(a => a.name) };\n },\n\n shouldShowAudiences(audiences: PresentationAudience[] = []): boolean {\n if (!audiences)\n return false;\n\n return audiences.length > MIN_AUDIENCE_THRESHOLD;\n }\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"leftNavIcon\":\"ssG3i\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { IconCircle } from 'libs/shared/components/icon-circle/IconCircle';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { CuratedDashboard, Library } from 'libs/shared/interfaces';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { LeftNavId } from 'shared/enums/LeftNavId';\nimport { LeftNavConfig } from 'shared/views/left-nav/LeftNavConfig';\n\nimport { LibraryHelper } from 'apps/libraries/utils/LibraryHelper';\n\nimport styles from './nav-tiles.scss';\n\nconst namespace = 'default.popupPlugin';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface NavItemTileProps {\n id: LeftNavId;\n name: string;\n imageUrl?: string;\n iconClassName: string;\n svgName: string;\n appLink: Core.AppLink;\n}\n\nfunction NavItemTile(props: NavItemTileProps): JSX.Element {\n return (\n <li className={`columns-of-five-md col-6 mb-3`}>\n <AppLink\n appLink={props.appLink}\n className={`border rounded-3 d-flex align-items-center\n justify-content-center flex-column text-decoration-none h-100 py-3 px-1 text-center`}\n >\n <div className={`${styles.leftNavIcon} ${props.iconClassName} mx-auto mb-3`}>\n <IconCircle\n imageUrl={ImageHelper.createUrl(props.imageUrl, { size: ImageSize.Small })}\n svgName={props.svgName}\n svgSize={SvgContainerSize.Large}\n />\n </div>\n <div className='h6'>\n {props.name}\n </div>\n </AppLink>\n </li>\n );\n}\n\ninterface NavTilesProps {\n hasPermissions: HasPermissionsFunc;\n moviesAndTvDashboard: CuratedDashboard;\n hasNewMoviesAndTv: boolean;\n libraries: Library[];\n liteStudentCustomLibraries: boolean;\n}\n\nexport function NavTiles(props: NavTilesProps): JSX.Element {\n const { hasPermissions, moviesAndTvDashboard, hasNewMoviesAndTv, libraries, liteStudentCustomLibraries } = props;\n\n function shouldShowLibraries(): boolean {\n if (!libraries?.length)\n return false;\n \n if (!hasPermissions(PermissionName.StudentExperience))\n return true;\n \n /**\n * Students only see libraries if the school has the domain option\n */\n return liteStudentCustomLibraries;\n }\n\n return (\n <ul className='list-unstyled row'>\n {hasPermissions(PermissionName.StudentExperience) && (\n <NavItemTile\n id={LeftNavId.StudentFeed}\n appLink={LeftNavConfig[LeftNavId.StudentFeed].appLink}\n name={getPhrase('home')}\n iconClassName='bg-purple'\n svgName={cvSvgLibrary.House}\n />\n )}\n <NavItemTile\n id={LeftNavId.Discover}\n appLink={LeftNavConfig[LeftNavId.Discover].appLink}\n name={getPhrase('discover')}\n iconClassName='bg-blue'\n svgName={cvSvgLibrary.Compass}\n />\n {(!!moviesAndTvDashboard && !!hasNewMoviesAndTv) && (\n <NavItemTile\n id={LeftNavId.MoviesAndTv}\n appLink={LeftNavConfig[LeftNavId.MoviesAndTv].appLink}\n name={getPhrase('moviesAndTv')}\n iconClassName='bg-indigo'\n svgName={cvSvgLibrary.Popcorn}\n />\n )}\n <NavItemTile\n id={LeftNavId.Playlists}\n appLink={LeftNavConfig[LeftNavId.Playlists].appLink}\n name={getPhrase('playlists')}\n iconClassName='bg-green'\n svgName={cvSvgLibrary.Playlist}\n />\n <NavItemTile\n id={LeftNavId.MyVideos}\n appLink={LeftNavConfig[LeftNavId.MyVideos].appLink}\n name={getPhrase('myVideos')}\n iconClassName='bg-orange'\n svgName={cvSvgLibrary.Video}\n />\n {!!shouldShowLibraries() && (\n LibraryHelper.sort(libraries).map((library, index) => (\n <NavItemTile\n key={index}\n id={LeftNavId.Library}\n name={library.name}\n appLink={{\n ...LeftNavConfig[LeftNavId.Library].appLink,\n args: [ library.id, TextHelper.slugify(library.name) ]\n }}\n iconClassName='bg-teal'\n imageUrl={library.owner?.logo?.url}\n svgName={!(library.owner?.logo?.url) && cvSvgLibrary.Library}\n />\n ))\n )}\n </ul>\n );\n}","import React from 'react';\nimport { Radio } from 'backbone';\n\nimport { CommonChannels } from 'libs/common/backbone/constants/CommonChannels';\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { useFocusSearchBar } from 'libs/shared/components/search-bar/SearchUtils';\nimport { FixedWidget, PartialFixedWidget } from 'libs/shared/components/widgets/fixed-widget';\nimport { PopoutVideoWidgetItem, PopoutVideoWidgetItemProps } from 'libs/shared/components/widgets/items/popout-video-widget-item/PopoutVideoWidgetItem';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { FavouriteRequests } from 'libs/shared/flight-requests/FavouriteRequests';\nimport { LibraryRequests } from 'libs/shared/flight-requests/LibraryRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useListenOn } from 'libs/shared/hooks/UseListenOn';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, CurrentUser, DashboardTargetType, Library, PresentationAudience, VideoTypesCollection, YearGroup } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { usePluginHelper } from 'shared/hooks/use-plugin-helper/usePluginHelper';\nimport { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\nimport { usePresentation } from 'shared/hooks/usePresentation';\nimport { useFetchCuratedDashboard } from 'shared/utils/DashboardHelper';\nimport { LayoutHelper } from 'shared/utils/LayoutHelper';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { NavTiles } from 'apps/default/views/popup-plugin/components/Navtiles';\nimport { useGetVideoHistory } from 'apps/default/views/popup-plugin/hooks/useGetVideoHistoryVideos';\nimport { SeriesAppLinkHelper } from 'apps/series/SeriesAppLinkHelper';\n\nconst namespace = 'default.popupPlugin';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\n\nexport function PopupPluginView(): JSX.Element {\n const { isPlugin } = usePluginHelper();\n const { focusSearchBar } = useFocusSearchBar();\n\n /**\n * Required for video widgets\n */\n const { activePresentation } = usePresentation();\n const { hasPermissions, isLoaded } = usePermissions();\n const { setFavourite, canFavourite } = useLiteFavourites(LocationContext.VideoThumbnail);\n const { hasNewMoviesAndTv, liteStudentCustomLibraries, isLoadingSettings } = useSettings(null);\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n activePresentation &&\n AudienceRequests.audiencesByPresentationId(activePresentation.id)\n );\n\n /**\n * Watch history videos\n */\n const videoHistory = useGetVideoHistory();\n\n /**\n * Favourite videos\n */\n const favouriteVideos = Flight.useBasicFetch<VideoTypesCollection>(\n currentUser.data && FavouriteRequests.getFavourites(currentUser.data.id)\n );\n\n /**\n * Required for displaying our Nav item tiles.\n */\n const libraries = Flight.useBasicFetch<Library[]>(\n hasPermissions(PermissionName.ViewLibraries) &&\n LibraryRequests.domainLibraries([ 'customLibrary', 'sharedLibrary' ])\n );\n const {\n dashboard: moviesAndTvDashboard\n } = useFetchCuratedDashboard({\n targetType: DashboardTargetType.MoviesAndTv,\n queryParams: {}\n });\n Flight.useBasicFetch(!!libraries.data?.length &&\n LibraryRequests.librariesWithOwnerLogos(libraries.data.map(s => s.id)));\n\n useListenOn(CommonChannels.SHELL, Core.EventNames.ROUTE, appLink => {\n /**\n * Ignore applinks with no href. Like the embed popup - Sha\n */\n if (!Core.AppLinkHelper.getHref(appLink))\n return;\n\n /**\n * Enable the nav as we leave our popup view - Sha\n */\n LayoutHelper.enableNav();\n\n /**\n * Re-focus the search bar when the routing has ended.\n * We need to do this because the user may be mid typing, but the layout\n * re-render causes the search bar to lose focus - Sha\n */\n Radio.channel(CommonChannels.SHELL).once('routing:end', focusSearchBar);\n });\n\n const hasLoaded = (\n moviesAndTvDashboard.hasCompleted &&\n isLoaded &&\n !isLoadingSettings &&\n (!hasPermissions(PermissionName.ViewLibraries) || libraries.hasCompleted) &&\n config.hasCompleted\n );\n\n if (!hasLoaded)\n return <></>;\n\n return (\n <div className='px-4'>\n <NavTiles\n hasPermissions={hasPermissions}\n moviesAndTvDashboard={moviesAndTvDashboard.data}\n hasNewMoviesAndTv={hasNewMoviesAndTv}\n libraries={libraries.data}\n liteStudentCustomLibraries={liteStudentCustomLibraries}\n />\n\n {videoHistory.hasCompleted ?\n <div className='mb-3'>\n <FixedWidget<PopoutVideoWidgetItemProps>\n name={getPhrase('recentlyWatched')}\n collection={videoHistory.data || []}\n contents={WidgetContents.Videos}\n childComponent={PopoutVideoWidgetItem}\n extraChildComponentProps={{\n setFavourite,\n canFavourite,\n presentationAudiences: audiences.data,\n getSubTextAppLink: SeriesAppLinkHelper.getSeriesAppLink,\n imageCdnUrl: config.data.imageCdnUrl,\n yearGroups: yearGroups.data,\n showVideoGuidance: VideoHelper.showVideoGuidance(hasPermissions),\n isPlugin,\n getClassroomGuideAppLink: VideoAppLinkHelper.getClassroomGuideAppLink,\n getResourceGuidanceAppLink: VideoAppLinkHelper.getResourceGuidanceAppLink,\n getInteractiveGuidanceAppLink: VideoAppLinkHelper.getInteractiveGuidanceAppLink\n }}\n getChildAppLink={VideoAppLinkHelper.getAppLink}\n appLink={{\n application: AppChannels.WATCH_HISTORY,\n action: Actions.WatchHistory.HOME\n }}\n prefetched\n />\n </div> :\n <div className='mb-3'><PartialFixedWidget /></div>\n }\n\n {favouriteVideos.hasCompleted ?\n <FixedWidget<PopoutVideoWidgetItemProps>\n name={getPhrase('favourites')}\n collection={favouriteVideos.data.data || []}\n contents={WidgetContents.Videos}\n childComponent={PopoutVideoWidgetItem}\n extraChildComponentProps={{\n setFavourite,\n canFavourite,\n presentationAudiences: audiences.data,\n getSubTextAppLink: SeriesAppLinkHelper.getSeriesAppLink,\n imageCdnUrl: config.data.imageCdnUrl,\n yearGroups: yearGroups.data,\n showVideoGuidance: VideoHelper.showVideoGuidance(hasPermissions),\n isPlugin,\n getClassroomGuideAppLink: VideoAppLinkHelper.getClassroomGuideAppLink,\n getResourceGuidanceAppLink: VideoAppLinkHelper.getResourceGuidanceAppLink,\n getInteractiveGuidanceAppLink: VideoAppLinkHelper.getInteractiveGuidanceAppLink\n }}\n getChildAppLink={VideoAppLinkHelper.getAppLink}\n appLink={{\n application: AppChannels.DEFAULT,\n action: Actions.MyFavourites.MY_FAVOURITES\n }}\n prefetched\n /> :\n <PartialFixedWidget />\n }\n </div>\n );\n}","import React from 'react';\n\nimport { Flight } from 'libs/common/react/index';\n\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useBatchFetch } from 'libs/shared/hooks/UseBatchFetch';\nimport { VideoHistoryCollection, VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { useVideoMixin } from 'shared/hooks/useVideoMixin';\n\nimport { VideoHistoryRequests } from 'apps/watch-history/flight-requests/VideoHistoryRequests';\n\nexport function useGetVideoHistory() {\n const videoHistory = Flight.useBasicFetch<VideoHistoryCollection>(VideoHistoryRequests.userVideoHistory());\n\n const videosFetchResult = useBatchFetch<VideoTypes>(\n videoHistory.data?.data?.map(v => v.videoId) ?? [],\n VideoRequests.watchHistoryVideos\n );\n\n /**\n * We must do this to get the videos back into the correct order - Sha\n */\n const videoHistoryVideos = React.useMemo(() => {\n const videosMap = new Map<string, VideoTypes>();\n\n videoHistory.data?.data?.forEach(history => {\n if (videosMap.has(history.videoId))\n return;\n\n const video = videosFetchResult.items?.[history.videoId];\n\n if (video)\n videosMap.set(history.videoId, video);\n });\n\n return [...videosMap.values()];\n }, [ videosFetchResult.items, videoHistory.data ]);\n \n useVideoMixin(videoHistoryVideos.filter(VideoHelper.isVideo));\n\n return {\n data: videoHistoryVideos,\n hasCompleted: !videosFetchResult.isFetching\n };\n}","\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { VideoHistoryCollection } from 'libs/shared/interfaces';\n\nexport const VideoHistoryRequests = {\n userVideoHistory(\n cursor?: string,\n success?: (data: HashObject) => void,\n error?: (Xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n let key = 'video:history';\n let url = `{gateway}/v1/users/me/watch-history`;\n\n if (cursor) {\n key += `:${cursor}`;\n url += `?cursor=${cursor}`;\n }\n\n return {\n key,\n url,\n formatData: (historyCollection: VideoHistoryCollection) => {\n return {\n data: historyCollection.data.map(historyData => {\n // Convert last watched times from UTC to local time\n const lastTimeWatchedLocal = DateHelper.format(historyData.lastTimeWatched);\n const lastDateWatchedLocal = DateHelper.format(lastTimeWatchedLocal, 'YYYY-MM-DD');\n\n return {\n ...historyData,\n lastTimeWatched: lastTimeWatchedLocal,\n lastDateWatched: lastDateWatchedLocal\n };\n }),\n pagination: historyCollection.pagination\n };\n },\n success,\n error,\n always\n };\n },\n\n videoHistory(\n ids: string[],\n namespace?: string,\n success?: (data: HashObject) => void,\n error?: (Xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n const params = ids.sort().map(i => `videoId=${i}`);\n\n return {\n key: `video:history:videos:${params.join('&')}`,\n url: `{gateway}/v1/videos/history?${params.join('&')}`,\n normalizeOptions: {\n namespace\n },\n formatData: (historyCollection: HashObject[]) => {\n if (!historyCollection?.length)\n return historyCollection;\n\n /**\n * Data is formatted to enable it to be merged with the existing video object in the store\n * Where we need to merge more history properties with the video object, map them below.\n */\n return historyCollection.map((watchHistory: HashObject) => ({\n id: watchHistory.videoId,\n lastProgressPoint: watchHistory.lastProgressPoint\n }));\n },\n success,\n error,\n always\n };\n }\n};","import React from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { CurrentUser, Video, VideoCollection } from 'libs/shared/interfaces';\n\ninterface VideoMixinOptions {\n /**\n * If the videos that are having new data mixed into are sitting on an explicit Flight namespace,\n * providing that namespace here is required\n */\n flightNamespace?: string;\n}\n\nexport function useVideoMixin(videos: VideoCollection | Video[], options: VideoMixinOptions = {}): void {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const hydratedVideos = React.useRef<Set<string>>(new Set<string>());\n\n const videoIds = videos && (Array.isArray(videos)\n ? videos.filter(Boolean).map(v => v.id)\n : videos.data.filter(Boolean).map(v => v.id));\n\n const [ request, setRequest ] = React.useState<Flight.Request[]>([]);\n\n React.useEffect(() => {\n if (!videoIds?.length || !currentUser.hasCompleted)\n return;\n\n const unhydratedVideos: string[] = [];\n\n videoIds.forEach(id => {\n if (!hydratedVideos.current.has(id)) {\n unhydratedVideos.push(id);\n hydratedVideos.current.add(id);\n }\n });\n \n if (!unhydratedVideos.length)\n return;\n\n setRequest(r => {\n const newRequests = [\n ...r,\n VideoRequests.videoMixinAssocs(unhydratedVideos, options.flightNamespace)\n ];\n\n if (currentUser.data?.isAuthenticated)\n newRequests.push(ClassificationRequests.hasCurriculumLinks(unhydratedVideos, null, options.flightNamespace));\n\n return newRequests;\n });\n }, [ videoIds?.length, currentUser.hasCompleted ]);\n\n Flight.useBasicFetchAll(request);\n}"],"names":["PopoutVideoWidgetItem","props","video","data","getSubTextAppLink","context","thumbnailSize","preloadImage","presentationAudiences","videoAudiences","subjectPresentationAudiences","mergedAudience","breakpoints","useBreakpoints","width","type","className","VideoThumbnail","preventPopout","xs","textPosition","ThumbnailTextPosition","appLink","getAppLink","subTextAppLink","VideoHelper","imageOptions","size","preload","analyticsData","analyticsOptions","canFavourite","setFavourite","imageCdnUrl","audience","hideRating","hideDuration","yearGroups","hideTitle","showVideoGuidance","companyLogoFallbackUrl","subTextType","isPlugin","getInteractiveGuidanceAppLink","getResourceGuidanceAppLink","getClassroomGuideAppLink","useBatchFetch","itemIds","getRequest","idBatches","setIdBatches","length","newBatches","push","forEach","id","find","batch","_id","filter","join","dispatch","state","idBatch","request","key","shouldFetch","items","isFetching","responses","i","response","v","Object","keys","some","k","useMergeAudiences","audiences","sortedAudiences","HAS_NUMBER_REGEX","AudienceStringBuilders","firstAudience","ArrayHelper","lastAudience","name","split","toLowerCase","DIGIT_REGEX","SPACE_REGEX","AudienceHelper","getSortedPresentationAudiences","objectAudiences","objectAudienceIds","map","toString","presAudience","includes","masterId","getMergedPresentationAudienceString","mergedAudienceString","presentationId","HardCoded","combinedNames","a","numberList","isNaN","num","wordList","audienceWithoutNum","p","test","prefix","charAt","pop","audienceRange","audienceValues","initialVal","nextVal","j","isContinguous","ranges","sort","b","processAudienceRanges","audienceNames","commonWordsAndTheirPositions","index","wordsInName","word","commonWord","commonWordPosition","firstAudienceName","lastAudienceName","stripOutCommonWord","mergedWord","firstAudienceFirstWord","lastAudienceFirstWord","firstAudienceNumber","lastAudienceNumber","firstAudienceString","lastAudienceString","sortMembersWithDuplicateNamesByAudience","members","getLowestAudience","digit","match","lowestAudience","lowestAudienceDigit","nameCountMap","sorted","member","sortedSlice","splice","firstObjLowestAudience","secondObjLowestAudience","comparison","localeCompare","concat","getActiveAudiencesFromParams","params","ObjectHelper","shouldShowAudiences","normalizeAudienceName","audienceName","replace","audienceLookup","reduce","audienceStr","getAudienceParams","getPhrase","LanguageService","NavItemTile","AppLink","iconClassName","IconCircle","imageUrl","ImageHelper","svgName","svgSize","SvgContainer","S","NavTiles","hasPermissions","moviesAndTvDashboard","hasNewMoviesAndTv","libraries","liteStudentCustomLibraries","PermissionName","LeftNavId","LeftNavConfig","LibraryHelper","library","args","TextHelper","owner","logo","url","PopupPluginView","usePluginHelper","focusSearchBar","activePresentation","usePresentation","usePermissions","isLoaded","useLiteFavourites","u","useSettings","isLoadingSettings","config","ConfigRequests","currentUser","UserRequests","isAuthenticated","CustomerRequests","customerId","AudienceRequests","videoHistory","VideoHistoryRequests","videosFetchResult","videoId","VideoRequests","videoHistoryVideos","videosMap","Map","history","has","set","values","useVideoMixin","hasCompleted","useGetVideoHistory","favouriteVideos","FavouriteRequests","LibraryRequests","targetType","queryParams","dashboard","s","CommonChannels","LayoutHelper","Radio","once","collection","contents","WidgetContents","childComponent","extraChildComponentProps","SeriesAppLinkHelper","VideoAppLinkHelper","getChildAppLink","application","action","prefetched","userVideoHistory","cursor","success","error","always","formatData","historyCollection","historyData","lastTimeWatchedLocal","lastTimeWatched","lastDateWatchedLocal","lastDateWatched","pagination","ids","namespace","normalizeOptions","watchHistory","lastProgressPoint","videos","options","hydratedVideos","Set","videoIds","Array","isArray","Boolean","setRequest","unhydratedVideos","current","add","r","newRequests","flightNamespace"],"sourceRoot":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/5242-04c52713f2-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/infinite-scroll-footer/infinite-scroll-footer.scss","file:///app/packages/libs/shared/src/components/infinite-scroll-footer/InfiniteScrollFooter.tsx","file:///app/packages/libs/shared/src/components/widgets/widget-button/widget-button.scss","file:///app/packages/libs/shared/src/components/widgets/widget-button/WidgetButton.tsx","file:///app/packages/libs/shared/src/hooks/UseInfiniteScroll.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteList.ts","file:///app/packages/libs/shared/src/components/widgets/items/subject-widget-item/CompanyWidgetItem.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/CompanyResult.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/mixed-search-results.scss","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/exchange-video-group/ExchangeVideoGroup.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/FeaturedVideoResult.tsx","file:///app/packages/libs/shared/src/apps/search/components/playlist-with-videos/playlist-with-videos.scss","file:///app/packages/libs/shared/src/apps/search/components/playlist-with-videos/PlaylistWithVideos.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/LargePlaylistResults.tsx","file:///app/packages/libs/shared/src/apps/search/components/series-with-videos/series-with-videos.scss","file:///app/packages/libs/shared/src/apps/search/components/series-with-videos/SeriesWithVideos.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/LargeSeriesResult.tsx","file:///app/packages/libs/shared/src/apps/search/components/collection-video-list/CollectionVideoList.tsx","file:///app/packages/libs/shared/src/apps/search/components/collection-thumbnail/collection-thumbnail.scss","file:///app/packages/libs/shared/src/apps/search/components/collection-thumbnail/CollectionThumbnail.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/SmallPlaylistResult.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/SmallSeriesResults.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/SubjectResult.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/VideoResult.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/MixedSearchResults.tsx","file:///app/packages/libs/shared/src/apps/search/components/search-substitute/SearchSubstitute.tsx","file:///app/packages/libs/shared/src/apps/search/components/search-suggestions/SearchSuggestions.tsx","file:///app/packages/libs/shared/src/apps/search/flight-requests/SharedSearchRequests.ts","file:///app/packages/projects/lite/src/apps/search/hooks/useSearchTopics.ts","file:///app/packages/projects/lite/src/apps/search/hooks/useFetchSearchData.tsx","file:///app/packages/projects/lite/src/apps/search/hooks/useFetchSchoolLevels.ts","file:///app/packages/projects/lite/src/apps/search/hooks/useSearchCompanies.ts","file:///app/packages/projects/lite/src/apps/search/hooks/useGetSearchResults.tsx","file:///app/packages/projects/lite/src/apps/search/hooks/useGroupExchangeResults.ts","file:///app/packages/projects/lite/src/apps/search/views/search-results/empty-state/SearchResultsEmptyState.tsx","file:///app/packages/projects/lite/src/apps/search/views/search-results/SearchResultsView.tsx","file:///app/packages/projects/lite/src/apps/search/hooks/useGetTagsAndClassifications.tsx","file:///app/packages/projects/lite/src/apps/search/hooks/useSearchMask.tsx","file:///app/packages/projects/lite/src/shared/flight-requests/RatingRequests.ts","file:///app/packages/projects/lite/src/shared/hooks/usePresentationAudiences.ts","file:///app/packages/projects/lite/src/shared/hooks/useVideoMixin.ts"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"container\":\"VwD1b\",\"spinner\":\"eJ85e\"};","import * as React from 'react';\nimport { Spinner } from 'react-bootstrap';\nimport { useInView } from 'react-intersection-observer';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './infinite-scroll-footer.scss';\n\ninterface InfiniteScrollFooterProps {\n isFetching: boolean;\n fetchNext?: (nextCursor: string) => void;\n nextCursor?: string;\n fetchOnScroll?: boolean;\n}\n\nInfiniteScrollFooter.defaultProps = {\n fetchOnScroll: false\n};\n\nexport function InfiniteScrollFooter(props: InfiniteScrollFooterProps): React.ReactElement {\n const [ ref, inView ] = useInView();\n\n React.useEffect(() => {\n if (!props.fetchOnScroll)\n return;\n\n if (!inView || props.isFetching)\n return;\n\n props.fetchNext?.(props.nextCursor);\n }, [ inView, props.isFetching ]);\n\n return (\n <div className={`p-3 text-center ${styles.container}`} ref={ref}>\n {props.isFetching\n ? <Spinner as='span' animation='border' role='status' className={styles.spinner} />\n : (\n <SvgContainer\n svgName={cvSvgLibrary.ChevronDown}\n className='svg-container cursor-pointer'\n size={SvgContainerSize.Large}\n onClick={() => props.fetchNext?.(props.nextCursor)}\n />\n )\n }\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"buttonContainer\":\"_ejId\",\"left\":\"VSAPU\",\"right\":\"kgeXh\",\"button\":\"gAsE9\",\"hoverText\":\"APA36\",\"buttonHover\":\"cqD75\",\"chevron\":\"Ev4hr\",\"extendedClickableArea\":\"AtsWP\",\"gradientRight\":\"ZuAif\",\"gradientLeft\":\"Pt3nx\",\"topPos\":\"BVcIS\"};","import * as React from 'react';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { FixedWidgetState } from 'libs/shared/components/widgets/fixed-widget';\nimport { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './widget-button.scss';\n\nexport enum WidgetButtonDirection {\n Left,\n Right\n}\n\ninterface WidgetButtonProps {\n onClick: (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => void;\n direction: WidgetButtonDirection;\n hide: boolean;\n contents?: WidgetContents;\n useGradientBackdrop?: boolean;\n className?: string;\n hoverText?: string;\n hideExtendedClickableArea?: boolean;\n state?: FixedWidgetState;\n\n leftButtonClassName?: string;\n rightButtonClassName?: string;\n leftGradientClassName?: string;\n rightGradientClassName?: string;\n}\n\nexport const WidgetButton = React.memo(function(props: WidgetButtonProps): JSX.Element {\n const isLeft = props.direction === WidgetButtonDirection.Left;\n\n const arrowSvg = isLeft ? cvSvgLibrary.ChevronLeft : cvSvgLibrary.ChevronRight;\n\n function getPositionClass(): string {\n let className = styles.topPos;\n \n // Left / Right\n if (isLeft)\n className += ` ${styles.left} ${props.leftButtonClassName}`;\n else\n className += ` ${styles.right} ${props.rightButtonClassName}`;\n \n return className;\n }\n\n function getStyle(): React.CSSProperties {\n if (props.state?.contents === 'videos')\n return { paddingBottom: (56.25 / props.state?.viewableItems) + '%' };\n\n return { height: '100%' };\n }\n\n if (props.hide)\n return <></>;\n\n return (\n <div className={styles.buttonContainer} style={getStyle()}>\n {props.useGradientBackdrop &&\n <div className={isLeft ? `${styles.gradientLeft} ${props.leftGradientClassName}` : `${styles.gradientRight} ${props.rightGradientClassName}`} />\n }\n\n {!props.hideExtendedClickableArea && (\n <div\n role='button'\n onClick={props.onClick}\n className={`${styles.extendedClickableArea} ${isLeft ? styles.left : styles.right}`}\n />\n )}\n\n <div\n role='button'\n className={`${getPositionClass()} ${styles.button} ${props.className || ''}`}\n onClick={props.onClick}\n >\n {props.hoverText && (\n <span className={`ps-3 pe-2 ${styles.hoverText}`}>{props.hoverText}</span>\n )}\n <SvgContainer\n svgName={arrowSvg}\n size={SvgContainerSize.Medium}\n className={`svg-container d-inline-block ${styles.chevron}`}\n />\n </div>\n </div>\n );\n});","import { useEffect } from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst SCROLL_TOLERANCE = 400; // value in px\n\ninterface UseInfiniteScrollOptions {\n fetchNextPage: () => void;\n hasMore: boolean;\n isFetching: boolean;\n scrollContainer?: HTMLElement;\n}\n\nexport function useInfiniteScroll(options: UseInfiniteScrollOptions): void {\n const handleScroll = (): void => {\n if (options.isFetching)\n return;\n\n if (!options.scrollContainer) {\n const currentScrollHeight = window.innerHeight + document.documentElement.scrollTop;\n \n const totalHeight = document.documentElement.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n } else {\n const { scrollContainer } = options;\n const currentScrollHeight = scrollContainer.getBoundingClientRect().height + scrollContainer.scrollTop;\n \n const totalHeight = scrollContainer.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n }\n\n options.fetchNextPage();\n };\n\n useEffect(() => {\n const onScroll = FunctionHelper.throttle(handleScroll, 200);\n\n const scrollContainer = options.scrollContainer || window;\n\n if (options.hasMore)\n scrollContainer.addEventListener('scroll', onScroll);\n\n return () => scrollContainer.removeEventListener('scroll', onScroll);\n }, [ options.hasMore, options.fetchNextPage, options.scrollContainer ]);\n}","import { useEffect, useState } from 'react';\n\nimport { HttpStatus, HttpStatusClass } from 'libs/common/backbone/enums/HttpStatus';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { BaseObject, BasePaginatedCollection } from 'libs/shared/interfaces';\n\nimport { useInfiniteScroll } from './UseInfiniteScroll';\nimport { useSelectAllPages } from './UseSelectAllPages';\n\nexport interface UseInfiniteListResult<T extends BaseObject> {\n items: T[];\n hasMore: boolean;\n isFetching: boolean;\n nextCursor: string;\n totalItems?: number;\n hasFirstPageCompleted: boolean;\n}\n\n/**\n * Hook to extract an infinite list from the application state,\n * save it locally in state and only update when new data\n * is fetched.\n * \n * @param getRequest - callback function to get the request for each page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n * \n * @param fetchNext - callback function to fetch a page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n */\nexport function useInfiniteList<TObject = BaseObject, TResponse = BasePaginatedCollection<TObject>>(\n getRequest: ((cursor?: string) => Flight.Request) | false,\n fetchNext: ((cursor?: string) => void) | false,\n onError?: (pageNumber: number, statusCode: HttpStatus) => void,\n getItems?: (responseData: TResponse) => TObject[],\n getCursor?: (responseData: TResponse) => string,\n scrollContainer?: HTMLElement\n): UseInfiniteListResult<TObject> {\n const [ pagesFetched, setPagesFetched ] = useState(0);\n\n const fetchNextFn = fetchNext as (cursor?: string) => void;\n\n function getKey(cursor?: string): string {\n if (!getRequest)\n return null;\n\n const request = getRequest(cursor);\n\n if (!request)\n return null;\n\n return request.key;\n }\n\n const response = useSelectAllPages<TObject, TResponse>(\n getKey,\n getItems,\n getCursor\n );\n\n function fetchNextPage(): void {\n if (!fetchNext || !getRequest || !response)\n return;\n\n setPagesFetched(currentVal => currentVal + 1);\n return fetchNextFn(response.nextCursor);\n }\n\n useInfiniteScroll({\n fetchNextPage,\n hasMore: !!response?.nextCursor,\n isFetching: response?.isFetching,\n scrollContainer\n });\n\n useEffect(() => {\n if (!response)\n return;\n\n if (response.shouldInitialFetch && fetchNext) {\n fetchNextFn();\n setPagesFetched(currentVal => currentVal + 1);\n }\n }, [ response?.shouldInitialFetch, fetchNext ]);\n\n useEffect(() => {\n if (!response?.statusCode || !FunctionHelper.isFunction(onError))\n return;\n\n const httpStatusClass: HttpStatusClass = +(response.statusCode?.toString()?.substr(0, 1));\n\n if (httpStatusClass !== HttpStatusClass.ClientError && httpStatusClass !== HttpStatusClass.ServerError)\n return;\n\n onError(pagesFetched, response.statusCode);\n }, [response?.statusCode]);\n\n return {\n items: response?.items,\n hasMore: !!response?.nextCursor,\n nextCursor: response?.nextCursor,\n isFetching: response?.isFetching,\n totalItems: response?.totalItems,\n hasFirstPageCompleted: response?.hasFirstPageCompleted\n };\n}","import * as React from 'react';\n\nimport { ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { CoverPillWidgetContentWrapper, CoverPillWidgetItemProps } from 'libs/shared/components/widgets/items/subject-widget-item/CoverPill';\nimport { Company } from 'libs/shared/interfaces';\n\nexport function CompanyWidgetItem(props: CoverPillWidgetItemProps<Company>): JSX.Element {\n const analyticsData = {\n ...props.analyticsData,\n id: props.data?.id,\n name: props.data?.name\n };\n\n const analyticsOptions = {\n location: LocationContext.ClassificationListItem,\n ...props.analyticsOptions,\n actionType: UserAction.Click,\n entity: EntityType.Company,\n descriptor: ClickDescriptor.Cover\n };\n\n return (\n <CoverPillWidgetContentWrapper\n {...props}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n coverUrl={props.data.logo?.url}\n />\n );\n}","import React from 'react';\nimport { Col } from 'react-bootstrap';\n\nimport { CompanyWidgetItem } from 'libs/shared/components/widgets/items/subject-widget-item/CompanyWidgetItem';\nimport { Company } from 'libs/shared/interfaces';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function CompanyResult(props: MixedSearchResultItemProps<Company>): JSX.Element {\n return (\n <Col sm={6} md={props.useLargeStyle ? 6 : 4} lg={props.useLargeStyle ? 4 : 3}>\n <div className={`position-relative px-1 mb-2`}>\n <CompanyWidgetItem\n data={props.item}\n getChildAppLink={props.appLinks.getCompanyAppLink}\n getChildAppLinkOptions={() => props.appLinks.getCompanyAppLinkOptions?.(props.item)}\n analyticsData={{\n itemIndex: props.itemIndex,\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: 0\n }}\n isLarge={props.useLargeStyle}\n />\n </div>\n </Col>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"videoList\":\"ZhLPS\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { ClickDescriptor, EntityType, HashObject, LocationContext, SearchSourceDescriptor, UserAction } from 'libs/analytics/interfaces';\n\nimport { SourceFilterOptions } from 'libs/shared/apps/search/interfaces';\nimport { ExchangeVideoGroup } from 'libs/shared/apps/search/interfaces/SearchResults';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoItem } from 'libs/shared/components/video-list/video-item/VideoItem';\n\nimport { MixedSearchResultItemProps } from './../MixedSearchResultItemProps';\n\nimport styles from '../../mixed-search-results.scss';\n\nconst namespace = 'search.exchangeVideoGroup';\n\nconst EXCHANGE_RESULT_DISPLAY_LIMIT = 3;\n\nexport function ExchangeVideoGroup(props: MixedSearchResultItemProps<ExchangeVideoGroup>): JSX.Element {\n const limit = props.item.showCount >= EXCHANGE_RESULT_DISPLAY_LIMIT\n ? EXCHANGE_RESULT_DISPLAY_LIMIT\n : props.item.showCount;\n\n function getContainerClassName(): string {\n if (props.pagePositionIndex === 0)\n return 'border-bottom pb-1 mb-3';\n\n return 'border-top border-bottom pt-3 mt-2 pb-1 mb-3';\n }\n\n const currentAppLink = Core.AppLinkHelper.getCurrentAppLink();\n const currentParams = (currentAppLink.params as HashObject) ?? {};\n let currentSource = currentParams?.source ?? [];\n\n if (currentSource && !Array.isArray(currentSource))\n currentSource = [currentSource];\n\n const searchAppLink = {\n ...currentAppLink,\n params: {\n ...currentParams,\n source: [ ...(currentSource), SourceFilterOptions.ExchangeArchive ]\n }\n };\n\n const analyticsData = {\n query: props.queryParams.query,\n itemIndex: props.itemIndex,\n pagePositionIndex: props.pagePositionIndex\n };\n const analyticsOptions = {\n entity: EntityType.SearchResults,\n location: LocationContext.ExchangeSearchGroupItem,\n actionType: UserAction.Click,\n descriptor: SearchSourceDescriptor.ExchangeArchive\n };\n\n return (\n <div className={getContainerClassName()}>\n <AppLink\n appLink={searchAppLink}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n >\n <h2 className='h4'>\n <Text namespace={namespace} phrase='heading' />\n </h2>\n </AppLink>\n <p>\n <Text namespace={namespace} phrase='message' />\n \n <AppLink\n appLink={props.appLinks.searchSettings}\n className='text-info'\n analyticsData={analyticsData}\n analyticsOptions={{\n ...analyticsOptions,\n descriptor: ClickDescriptor.Settings\n }}\n >\n <Text namespace={namespace} phrase='searchSettings' />\n </AppLink>\n .\n </p>\n\n <div className={`position-relative ${styles.videoList}`}>\n {props.item.videos.slice(0, limit).map((v, i) => {\n return (\n <VideoItem\n key={i}\n video={v}\n yearGroups={props.yearGroups}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getSubTextAppLink={props.appLinks.getSubTextAppLink}\n presentationAudiences={props.audiences}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n analyticsData= {{\n search: {\n query: props.queryParams.query,\n score: v._score,\n maxScore: v._maxScore,\n featured: v._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n companyLogoFallbackUrl={props.companyLogoFallbackUrl}\n subTextType={props.subTextType}\n hasPermissions={props.hasPermissions}\n getClassroomGuideAppLink={props.appLinks.getClassroomGuideAppLink}\n getResourceGuidanceAppLink={props.appLinks.getResourceGuidanceAppLink}\n getInteractiveGuidanceAppLink={props.appLinks.getInteractiveGuidanceAppLink}\n isPlugin={props.isPlugin}\n />\n );\n })}\n </div>\n <div className='text-center py-2'>\n <AppLink\n className='text-secondary'\n appLink={searchAppLink}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n >\n <Text namespace={namespace} phrase='seeMore' />\n </AppLink>\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { HeroVideo } from 'libs/shared/apps/subjects/components/hero-video/HeroVideo';\nimport { Video } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function FeaturedVideoResult(props: MixedSearchResultItemProps<Video>): JSX.Element {\n return (\n <div className='pb-3'>\n <HeroVideo\n video={props.item}\n presentationAudiences={props.audiences}\n getVideoAppLink={(v, opts) => props.appLinks.getVideoAppLink(v, opts)}\n subTextAppLink={props.appLinks.getSubTextAppLink(props.item)}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n hideInteractiveBadge\n yearGroups={props.yearGroups}\n companyLogoFallbackUrl={props.companyLogoFallbackUrl}\n subTextType={props.subTextType}\n showVideoGuidance={VideoHelper.showVideoGuidance(props.hasPermissions)}\n imageCdnUrl={props.imageCdnUrl}\n isPlugin={props.isPlugin}\n getInteractiveGuidanceAppLink={props.appLinks.getInteractiveGuidanceAppLink}\n getResourceGuidanceAppLink={props.appLinks.getResourceGuidanceAppLink}\n getClassroomGuideAppLink={props.appLinks.getClassroomGuideAppLink}\n />\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"videoList\":\"eEZEe\"};","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { PlaylistItem } from 'libs/shared/apps/playlists/components/playlist-list';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoItem } from 'libs/shared/components/video-list/video-item/VideoItem';\nimport { VideoSubTextType } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { CurrentUser, Playlist, PresentationAudience, Video, YearGroup } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\n\nimport styles from './playlist-with-videos.scss';\n\nconst namespace = 'search.playlistWithVideos';\n\nfunction useGetMaxVideos(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xl || breakpoints.xxl)\n return 3;\n \n return 2;\n}\n\ninterface PlaylistWithVideoProps {\n playlist: Playlist;\n yearGroups: YearGroup[];\n playlistAppLink: Core.AppLink;\n presentationAudiences: PresentationAudience[];\n preloadImage: boolean;\n analyticsData: HashObject;\n imageCdnUrl: string;\n currentUser: CurrentUser;\n getSubTextAppLink: (video: Video) => Core.AppLink;\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n companyLogoFallbackUrl?: string;\n subTextType?: VideoSubTextType;\n hasPermissions: HasPermissionsFunc;\n isPlugin: boolean;\n}\n\nexport function PlaylistWithVideos(props: PlaylistWithVideoProps): JSX.Element {\n const maxVideos = useGetMaxVideos();\n\n const videos = props.playlist.videos.data.slice(0, maxVideos);\n\n const playlistAnalyticsOption: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Playlist,\n location: LocationContext.PlaylistWithVideos\n };\n\n const playlistAnalyticsData: HashObject = {\n ...props.analyticsData,\n id: props.playlist.id,\n name: props.playlist.name\n };\n\n return (\n <div className='ps-2 py-2'>\n <Row className='g-0 border border-light rounded-3'>\n <Col xs={4} lg={3} className='pe-3'>\n <PlaylistItem\n appLink={props.playlistAppLink}\n analyticsData={props.analyticsData}\n analyticsOptions={{\n ...playlistAnalyticsOption,\n descriptor: ClickDescriptor.Cover\n }}\n data={props.playlist}\n presentationAudiences={props.presentationAudiences}\n bgColourClassNames={BG_COLOUR_CLASS_NAMES}\n itemStyle='round-left'\n imageCdnUrl={props.imageCdnUrl}\n currentUser={props.currentUser}\n showCount={false}\n showOwner\n />\n </Col>\n <Col xs={8} lg={9}>\n <div className='d-flex justify-content-between'>\n <div className={`pt-3 ${styles.videoList}`}>\n {videos?.map(video => {\n const videoAnalyticsData: HashObject = {\n ...playlistAnalyticsData,\n videoId: video.id,\n videoName: video.name\n };\n\n return (\n <VideoItem\n key={video.id}\n video={video}\n getSubTextAppLink={props.getSubTextAppLink}\n canFavourite={() => false}\n setFavourite={null}\n getVideoAppLink={props.getVideoAppLink}\n analyticsData={videoAnalyticsData}\n analyticsOptions={{\n entity: EntityType.Video,\n location: LocationContext.PlaylistWithVideos\n }}\n size='sm'\n yearGroups={props.yearGroups}\n companyLogoFallbackUrl={props.companyLogoFallbackUrl}\n subTextType={props.subTextType}\n hasPermissions={props.hasPermissions}\n isPlugin={props.isPlugin}\n />\n );\n })}\n </div>\n <div className='text-end pt-3 pe-3'>\n <AppLink\n className='info-link fw-semibold'\n appLink={props.playlistAppLink}\n analyticsData={playlistAnalyticsData}\n analyticsOptions={{\n ...playlistAnalyticsOption,\n descriptor: ClickDescriptor.Link\n }}\n >\n <Text namespace={namespace} phrase='seeAllVideos' />\n </AppLink>\n </div>\n </div>\n </Col>\n </Row>\n </div>\n );\n}","import React from 'react';\n\nimport { Playlist } from 'libs/shared/interfaces';\n\nimport { PlaylistWithVideos } from '../../playlist-with-videos/PlaylistWithVideos';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function LargePlaylistResult(props: MixedSearchResultItemProps<Playlist>): JSX.Element {\n return (\n <div className='mx-n2'>\n <PlaylistWithVideos\n playlist={props.item}\n yearGroups={props.yearGroups}\n playlistAppLink={props.appLinks.getPlaylistAppLink(props.item)}\n presentationAudiences={props.audiences}\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n imageCdnUrl={props.imageCdnUrl}\n currentUser={props.currentUser}\n preloadImage\n getSubTextAppLink={props.appLinks.getSubTextAppLink}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n companyLogoFallbackUrl={props.companyLogoFallbackUrl}\n subTextType={props.subTextType}\n hasPermissions={props.hasPermissions}\n isPlugin={props.isPlugin}\n />\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"videoList\":\"UT8bc\"};","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SeriesTallPoster } from 'libs/shared/components/series-tall-poster/SeriesTallPoster';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoItem } from 'libs/shared/components/video-list/video-item/VideoItem';\nimport { VideoSubTextType } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { PresentationAudience, Series, Video, YearGroup } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\n\nimport styles from './series-with-videos.scss';\n\nconst namespace = 'search.seriesWithVideos';\n\nfunction useGetMaxVideos(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xl || breakpoints.xxl)\n return 5;\n \n if (breakpoints.lg || breakpoints.md)\n return 4;\n\n return 3;\n}\n\ninterface SeriesWithVideoProps {\n series: Series;\n yearGroups: YearGroup[];\n seriesAppLink: Core.AppLink;\n subTextAppLink: (video: Video) => Core.AppLink;\n presentationAudiences: PresentationAudience[];\n preloadImage: boolean;\n analyticsData: HashObject;\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n companyLogoFallbackUrl?: string;\n subTextType?: VideoSubTextType;\n hasPermissions: HasPermissionsFunc;\n isPlugin: boolean;\n}\n\nexport function SeriesWithVideos(props: SeriesWithVideoProps): JSX.Element {\n const maxVideos = useGetMaxVideos();\n\n const videos = props.series.videos.data.slice(0, maxVideos);\n\n const seriesAnalyticsOption: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Series,\n location: LocationContext.SeriesWithVideos\n };\n\n const seriesAnalyticsData: HashObject = {\n ...props.analyticsData,\n id: props.series.id,\n name: props.series.name\n };\n\n return (\n <div className='ps-2 py-2'>\n <Row className='g-0 border border-light rounded-3'>\n <Col xs={4} lg={3} className='pe-3'>\n <AppLink\n appLink={props.seriesAppLink}\n className='position-relative'\n analyticsData={seriesAnalyticsData}\n analyticsOptions={{\n ...seriesAnalyticsOption,\n descriptor: ClickDescriptor.TallPoster\n }}\n >\n <SeriesTallPoster\n series={props.series}\n presentationAudiences={props.presentationAudiences}\n preloadImage={props.preloadImage}\n imageClass='rounded-start-lg'\n />\n </AppLink>\n </Col>\n <Col xs={8} lg={9}>\n <div className='d-flex justify-content-between'>\n <div className={`pt-3 ${styles.videoList}`}>\n {videos?.map(video => {\n const videoAnalyticsData: HashObject = {\n ...seriesAnalyticsData,\n videoId: video.id,\n videoName: video.name\n };\n\n // insert parent series into video object\n video = {\n ...video,\n series: props.series\n };\n\n return (\n <VideoItem\n key={video.id}\n video={video}\n getSubTextAppLink={props.subTextAppLink}\n canFavourite={() => false}\n setFavourite={null}\n getVideoAppLink={props.getVideoAppLink}\n analyticsData={videoAnalyticsData}\n analyticsOptions={{\n entity: EntityType.Video,\n location: LocationContext.SeriesWithVideos\n }}\n size='sm'\n yearGroups={props.yearGroups}\n companyLogoFallbackUrl={props.companyLogoFallbackUrl}\n subTextType={props.subTextType}\n hasPermissions={props.hasPermissions}\n isPlugin={props.isPlugin}\n hideVideoGuidance\n />\n );\n })}\n </div>\n <div className='text-end pt-3 pe-3'>\n <AppLink\n className='info-link fw-semibold'\n appLink={props.seriesAppLink}\n analyticsData={seriesAnalyticsData}\n analyticsOptions={{\n ...seriesAnalyticsOption,\n descriptor: ClickDescriptor.Link\n }}\n >\n <Text namespace={namespace} phrase='seeAllVideos' />\n </AppLink>\n </div>\n </div>\n </Col>\n </Row>\n </div>\n );\n}","import React from 'react';\n\nimport { Series } from 'libs/shared/interfaces';\n\nimport { SeriesWithVideos } from '../../series-with-videos/SeriesWithVideos';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function LargeSeriesResult(props: MixedSearchResultItemProps<Series>): JSX.Element {\n return (\n <div className='mx-n2'>\n <SeriesWithVideos\n yearGroups={props.yearGroups}\n presentationAudiences={props.audiences}\n series={props.item}\n seriesAppLink={props.appLinks.getSeriesAppLink(props.item)}\n subTextAppLink={props.appLinks.getSubTextAppLink}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n preloadImage\n companyLogoFallbackUrl={props.companyLogoFallbackUrl}\n subTextType={props.subTextType}\n hasPermissions={props.hasPermissions}\n isPlugin={props.isPlugin}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { SeasonEpisode } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Video } from 'libs/shared/interfaces';\n\nconst namespace = 'search.collectionVideoList';\n\ninterface CollectionVideoListProps {\n videos: Video[];\n collectionId: string;\n appLink: Core.AppLink;\n analyticsOptions: AnalyticsOptions;\n analyticsData?: HashObject;\n getVideoAppLink: (video: Video) => Core.AppLink;\n}\n\nfunction useGetMaxVideos(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xs)\n return 2;\n\n if (breakpoints.sm)\n return 1;\n\n return 3;\n}\n\nexport function CollectionVideoList(props: CollectionVideoListProps): JSX.Element {\n const maxVideos = useGetMaxVideos();\n\n const analyticsProps = {\n analyticsData: props.analyticsData,\n analyticsOptions: props.analyticsOptions\n };\n\n return (\n <>\n <ul className='list-unstyled my-1'>\n {props.videos.slice(0, maxVideos).map(v => {\n const hasSeasonEpisode = !!v.episodeNumber && !!v.season?.id;\n\n return (\n <li key={`${props.collectionId}:${v.id}`} className='d-flex align-items-center'>\n <AppLink\n {...analyticsProps}\n className='clamp-1'\n appLink={props.getVideoAppLink(v)}\n >\n {hasSeasonEpisode && <><SeasonEpisode video={v} /> </>}\n {v.name}\n </AppLink>\n </li>\n );\n })}\n </ul>\n\n <AppLink\n {...analyticsProps}\n className='info-link'\n appLink={props.appLink}\n >\n <Text namespace={namespace} phrase='seeAll' />\n </AppLink>\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"overlayContainer\":\"MnBcv\",\"overlay\":\"AZSmh\"};","import React from 'react';\nimport { Col } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor } from 'libs/analytics/interfaces';\n\nimport { CollectionVideoList } from 'libs/shared/apps/search/components/collection-video-list/CollectionVideoList';\nimport { ActionOptions, Actions as ActionsComponent } from 'libs/shared/components/actions/Actions';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BadgeListContainer } from 'libs/shared/components/badges/BadgeListContainer';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { Mask, MaskType } from 'libs/shared/components/mask/Mask';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoListHelper } from 'libs/shared/components/video-list/VideoListHelper';\nimport { ImageType } from 'libs/shared/enums/Images';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Playlist, Series, Video } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\n\nimport styles from './collection-thumbnail.scss';\n\nconst namespace = 'search.collectionThumbnail';\n\n\nexport type GetCollectionActions = (\n collection: Collection,\n showActions: boolean,\n collectionType: CollectionType,\n baseAnalyticsOptions: AnalyticsOptions\n) => ActionOptions[]\n\ntype Collection = Series | Playlist;\ntype CollectionType = 'series' | 'playlist';\n\ninterface CollectionThumbnailProps {\n collection: Collection;\n collectionType: CollectionType;\n appLink: Core.AppLink;\n showActions: boolean;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n maskType?: MaskType;\n imageFallbackType?: ImageFallbackType;\n hideBadges?: boolean;\n isPlugin: boolean;\n getCollectionActions: GetCollectionActions;\n getVideoAppLink: (video: Video, opts?: GetVideoAppLinkOptions) => Core.AppLink;\n}\n\nexport function CollectionThumbnail(props: CollectionThumbnailProps): JSX.Element {\n const breakpoints = useBreakpoints();\n const size = VideoListHelper.getSize(breakpoints, 'md');\n const isSmall = size === 'sm';\n\n const hasVideos = !!props.collection.videos?.data?.length;\n\n const firstVideoWithThumbnail = hasVideos && props.collection.videos.data.find(v => !!v.thumbnail?.url);\n\n function getAnalyticsData(): HashObject {\n const data: HashObject = {\n ...props.analyticsData,\n id: props.collection.id,\n name: props.collection.name\n };\n\n if (firstVideoWithThumbnail) {\n data.videoId = firstVideoWithThumbnail.id;\n data.videoName = firstVideoWithThumbnail.name;\n }\n\n return data;\n }\n\n const analyticsData = getAnalyticsData();\n const isSeries = props.collectionType === 'series';\n\n return (\n <div className={`row g-0 ${isSmall ? '' : 'py-2'}`}>\n <Col {...VideoListHelper.getThumbnailColumns()} className={`flex-column align-items-flex-start ${isSmall ? `pb-2 pe-2` : 'mb-1 px-2'}`}>\n <div className={`position-relative overflow-hidden ${isSmall ? 'rounded' : 'rounded-3'}`}>\n <BaseImage\n data={firstVideoWithThumbnail?.thumbnail}\n appLink={props.appLink}\n imageType={ImageType.Thumbnails}\n analyticsData={analyticsData}\n analyticsOptions={{\n ...props.analyticsOptions,\n descriptor: ClickDescriptor.Thumbnail\n }}\n >\n <Mask type={props.maskType} />\n <ImageFallback type={props.imageFallbackType} />\n \n <div className={`d-flex flex-column align-items-center justify-content-center text-white h-100 ${styles.overlay}`}>\n <Text namespace={namespace} phrase='seeAll' />\n </div>\n </BaseImage>\n </div>\n </Col>\n\n <Col {...VideoListHelper.getDetailsColumns()} className={isSmall ? 'pb-2' : 'px-2'}>\n {!props.isPlugin &&\n <ActionsComponent\n actions={props.getCollectionActions(\n props.collection,\n props.showActions,\n props.collectionType,\n props.analyticsOptions\n )}\n className='float-end mt-n1'\n actionsDropdownClassName='btn btn-link ms-1'\n />\n }\n\n <AppLink\n appLink={props.appLink}\n analyticsData={analyticsData}\n analyticsOptions={{\n ...props.analyticsOptions,\n descriptor: ClickDescriptor.Title\n }}\n >\n <h5 className='m-0 mb-1'><span className='clamp-1'>{props.collection.name}</span></h5>\n </AppLink>\n\n {isSeries && !props.hideBadges && (\n <BadgeListContainer>\n <Badge type={BadgeType.Rating} data={(props.collection as Series).rating} />\n <Badge type={BadgeType.ProductionYear} data={(props.collection as Series).metadata?.year} />\n </BadgeListContainer>\n )}\n \n {hasVideos && (\n <CollectionVideoList\n collectionId={props.collection.id}\n videos={props.collection.videos.data}\n appLink={props.appLink}\n analyticsData={analyticsData}\n analyticsOptions={{\n ...props.analyticsOptions,\n descriptor: ClickDescriptor.Link\n }}\n getVideoAppLink={props.getVideoAppLink}\n />\n )}\n </Col>\n </div>\n );\n}","import React from 'react';\n\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { MaskType } from 'libs/shared/components/mask/Mask';\nimport { Playlist } from 'libs/shared/interfaces';\n\nimport { CollectionThumbnail } from '../../collection-thumbnail/CollectionThumbnail';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nimport styles from '../mixed-search-results.scss';\n\nexport function SmallPlaylistResult(props: MixedSearchResultItemProps<Playlist>): JSX.Element {\n return (\n <div className={`position-relative ${styles.videoList}`}>\n <CollectionThumbnail\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n analyticsOptions={{\n entity: EntityType.Playlist,\n actionType: UserAction.Click,\n location: LocationContext.PlaylistListItem\n }}\n appLink={props.appLinks.getPlaylistAppLink(props.item)}\n showActions={props.showActions}\n collection={props.item}\n collectionType='playlist'\n maskType={MaskType.Playlist}\n imageFallbackType={ImageFallbackType.PlaylistThumbnail}\n isPlugin={props.isPlugin}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getCollectionActions={props.appLinks.getCollectionActions}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { MaskType } from 'libs/shared/components/mask/Mask';\nimport { Series } from 'libs/shared/interfaces';\n\nimport { CollectionThumbnail } from '../../collection-thumbnail/CollectionThumbnail';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nimport styles from '../mixed-search-results.scss';\n\nexport function SmallSeriesResult(props: MixedSearchResultItemProps<Series>): JSX.Element {\n return (\n <div className={`position-relative ${styles.videoList}`}>\n <CollectionThumbnail\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n analyticsOptions={{\n entity: EntityType.Series,\n actionType: UserAction.Click,\n location: LocationContext.SeriesListItem\n }}\n appLink={props.appLinks.getSeriesAppLink(props.item)}\n collectionType='series'\n collection={props.item}\n showActions={props.showActions}\n maskType={MaskType.Series}\n imageFallbackType={ImageFallbackType.SeriesThumbnail}\n hideBadges\n isPlugin={props.isPlugin}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getCollectionActions={props.appLinks.getCollectionActions}\n />\n </div>\n );\n}","import React from 'react';\nimport { Col } from 'react-bootstrap';\n\nimport { SubjectWidgetItem } from 'libs/shared/components/widgets/items/subject-widget-item';\nimport { Classification } from 'libs/shared/interfaces';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function SubjectResult(props: MixedSearchResultItemProps<Classification>): JSX.Element {\n return (\n <Col sm={6} md={props.useLargeStyle ? 6 : 4} lg={props.useLargeStyle ? 4 : 3}>\n <div className={`position-relative px-1 mb-2`}>\n <SubjectWidgetItem\n data={props.item}\n getChildAppLink={props.appLinks.getClassificationAppLink}\n getChildAppLinkOptions={\n () => props.appLinks.getClassificationAppLinkOptions?.(props.item)\n }\n availablePresentations={props.availablePresentations}\n analyticsData={{\n itemIndex: props.itemIndex,\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: 0\n }}\n isLarge={props.useLargeStyle}\n />\n </div>\n </Col>\n );\n}","import React from 'react';\n\nimport { ClipItem, ClipItemProps } from 'libs/shared/components/video-list/clip-item/ClipItem';\nimport { InteractiveItem, InteractiveItemProps } from 'libs/shared/components/video-list/interactive-item/InteractiveItem';\nimport { VideoItem, VideoItemProps } from 'libs/shared/components/video-list/video-item/VideoItem';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nimport styles from '../mixed-search-results.scss';\n\nexport function VideoResult(props: MixedSearchResultItemProps<VideoTypes>): JSX.Element {\n function getItemComponent(\n video: VideoTypes\n ): (props: ClipItemProps | InteractiveItemProps | VideoItemProps) => JSX.Element {\n if (VideoHelper.isClip(video))\n return ClipItem;\n \n if (VideoHelper.isInteractive(video))\n return InteractiveItem;\n \n return VideoItem;\n }\n\n const Component = getItemComponent(props.item);\n\n return (\n <div className={`position-relative ${styles.videoList}`}>\n <Component\n video={props.item}\n yearGroups={props.yearGroups}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getSubTextAppLink={props.appLinks.getSubTextAppLink}\n getPreviewQuestionsAppLink={props.appLinks.getPreviewQuestionsAppLink}\n presentationAudiences={props.audiences}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n analyticsData= {{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n companyLogoFallbackUrl={props.companyLogoFallbackUrl}\n subTextType={props.subTextType}\n hasPermissions={props.hasPermissions}\n imageCdnUrl={props.imageCdnUrl}\n isPlugin={props.isPlugin}\n getClassroomGuideAppLink={props.appLinks.getClassroomGuideAppLink}\n getResourceGuidanceAppLink={props.appLinks.getResourceGuidanceAppLink}\n getInteractiveGuidanceAppLink={props.appLinks.getInteractiveGuidanceAppLink}\n />\n </div>\n );\n}","import React from 'react';\nimport { Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { VideoSubTextType } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { CanFavouriteFunc, Classification, Company, CurrentUser, FavouriteFunc, InteractiveMetadata, Playlist, Presentation, PresentationAudience, Series, Video, YearGroup } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { SearchResultObjectTypes, SearchResults, SearchResultsObject } from '../../interfaces';\nimport { GetCollectionActions } from '../collection-thumbnail/CollectionThumbnail';\n\nimport { CompanyResult } from './components/CompanyResult';\nimport { ExchangeVideoGroup } from './components/exchange-video-group/ExchangeVideoGroup';\nimport { FeaturedVideoResult } from './components/FeaturedVideoResult';\nimport { LargePlaylistResult } from './components/LargePlaylistResults';\nimport { LargeSeriesResult } from './components/LargeSeriesResult';\nimport { BaseMixedSearchResultItemProps } from './components/MixedSearchResultItemProps';\nimport { SmallPlaylistResult } from './components/SmallPlaylistResult';\nimport { SmallSeriesResult } from './components/SmallSeriesResults';\nimport { SubjectResult } from './components/SubjectResult';\nimport { VideoResult } from './components/VideoResult';\n\nconst TOPIC_DISPLAY_LIMIT = 8;\n\nexport interface MixedSearchResultAppLinks {\n getSubTextAppLink: (video: Video) => Core.AppLink;\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n getSeriesAppLink: (series: Series) => Core.AppLink;\n getCompanyAppLink: (company: Company) => Core.AppLink;\n getCompanyAppLinkOptions?: (company: Company) => Core.AppLinkOptions;\n getClassificationAppLink: (classification: Classification) => Core.AppLink;\n getClassificationAppLinkOptions?: (classification: Classification) => Core.AppLinkOptions;\n getPlaylistAppLink: (playlist: Playlist) => Core.AppLink;\n getPreviewQuestionsAppLink: (interactive: InteractiveMetadata) => Core.AppLink;\n getCollectionActions: GetCollectionActions;\n getInteractiveGuidanceAppLink: (id: string, type: MasterType) => Core.AppLink;\n getResourceGuidanceAppLink: (id: string, type: MasterType) => Core.AppLink;\n getClassroomGuideAppLink: (id: string, type: MasterType) => Core.AppLink;\n searchSettings?: Core.AppLink;\n}\n\ninterface MixedSearchResultsProps {\n queryParams: HashObject;\n results: SearchResultObjectTypes[];\n topics?: SearchResults;\n companies?: SearchResults;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n audiences: PresentationAudience[];\n currentUser: CurrentUser;\n imageCdnUrl: string;\n availablePresentations: Presentation[]\n showActions: boolean;\n yearGroups: YearGroup[];\n hasPermissions: HasPermissionsFunc;\n isPlugin: boolean;\n appLinks: MixedSearchResultAppLinks;\n companyLogoFallbackUrl?: string;\n subTextType?: VideoSubTextType;\n}\n\nexport const MixedSearchResults = React.memo(function(props: MixedSearchResultsProps): JSX.Element {\n const breakpoints = useBreakpoints();\n const useSmallComponent = breakpoints.xs || breakpoints.sm;\n\n if (!props.results?.length && !props.topics?.totalResults && !props.companies?.totalResults)\n return <></>;\n\n const companiesAndTopics = [\n ...props.companies?.results ?? [],\n ...props.topics?.results ?? []\n ];\n\n const childProps: BaseMixedSearchResultItemProps = {\n useLargeStyle: companiesAndTopics.length < 4,\n ...props\n };\n\n return (\n <div className='position-relative'>\n {!!companiesAndTopics.length && (\n <Row className='g-0 pb-3 mx-n1'>\n {companiesAndTopics.slice(0, TOPIC_DISPLAY_LIMIT).map((c, itemIndex) => {\n switch (c.type.toLowerCase()) {\n case 'company':\n return (\n <CompanyResult\n key={itemIndex}\n item={c as SearchResultsObject<Company>}\n itemIndex={itemIndex}\n {...childProps}\n />\n );\n case 'subject': {\n return (\n <SubjectResult\n key={itemIndex}\n item={c as SearchResultsObject<Classification>}\n itemIndex={itemIndex}\n {...childProps}\n />\n );\n }\n }\n })}\n </Row>\n )}\n\n {props.results?.map((result, index) => {\n const pagePositionIndex = companiesAndTopics.length ? index + 1 : index;\n\n if ('isExchangeVideoGroup' in result && result.isExchangeVideoGroup) {\n return (\n <ExchangeVideoGroup\n key={index}\n item={result}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n \n\n switch (result.type?.toLowerCase()) {\n case 'interactive':\n case 'clip':\n case 'video': {\n if (index === 0 && result._featured && VideoHelper.isVideo(result)) {\n return (\n <FeaturedVideoResult\n key={index}\n item={result as SearchResultsObject<Video>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n return (\n <VideoResult\n key={index}\n item={result as SearchResultsObject<Video>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n case 'playlist': {\n if (useSmallComponent) {\n return (\n <SmallPlaylistResult\n key={index}\n item={result as SearchResultsObject<Playlist>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n return (\n <LargePlaylistResult\n key={index}\n item={result as SearchResultsObject<Playlist>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n case 'series': {\n const series = result as Series;\n\n if (useSmallComponent || !series.tallPoster?.id) {\n return (\n <SmallSeriesResult\n key={index}\n item={result as SearchResultsObject<Series>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n return (\n <LargeSeriesResult\n key={index}\n item={result as SearchResultsObject<Series>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n }\n })}\n </div>\n );\n});","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'search.searchSubstitute';\n\ninterface SearchSubstituteProps {\n substitute: string;\n queryParams: HashObject;\n getAppLink: (query: string, queryParams: HashObject) => Core.AppLink\n}\n\nexport function SearchSubstitute(props: SearchSubstituteProps): JSX.Element {\n if (!props.substitute)\n return <></>;\n\n return (\n <div className='pb-3'>\n <p className='mb-1 h6'>\n <Text namespace={namespace} phrase='showingFor' /> \n <AppLink\n className='info-link'\n appLink={props.getAppLink(props.substitute, props.queryParams)}\n appLinkOptions={{ replace: true }}\n >\n {props.substitute}\n </AppLink>\n </p>\n <p className='mb-0 h6 fw-normal'>\n <Text namespace={namespace} phrase='searchInsteadFor' />\n <AppLink\n className='info-link'\n appLink={props.getAppLink(props.queryParams.query, { ...props.queryParams, allowSubstitute: 'false' })}\n >\n {props.queryParams.query}\n </AppLink>\n <Text namespace={namespace} phrase='endOriginal' />\n </p>\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'search.searchSuggestions';\n\ninterface SearchSuggestionsProps {\n suggestions: string[];\n queryParams: HashObject;\n getAppLink: (query: string, queryParams: HashObject) => Core.AppLink\n}\n\nSearchSuggestions.defaultProps = {\n suggestions: [],\n queryParams: {}\n};\n\nexport function SearchSuggestions(props: SearchSuggestionsProps): JSX.Element {\n if (!props.suggestions?.length)\n return <></>;\n\n return (\n <div className='d-flex align-items-center mb-3'>\n <Text namespace={namespace} phrase='didYouMean' />\n \n\n {props.suggestions.map((suggestion, index) => (\n <React.Fragment key={`${suggestion}:${index}`}>\n {index !== 0 && <span className='mx-1'>•</span>}\n\n <AppLink\n className='info-link'\n appLink={props.getAppLink(suggestion, props.queryParams)}\n appLinkOptions={{ replace: true }}\n >\n {suggestion}\n </AppLink>\n </React.Fragment>\n ))}\n </div>\n );\n}","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { FilterConstants } from 'libs/shared/apps/search/constants/FilterConstants';\nimport { SearchIndices, SearchResultObjectTypes, SearchResults, SearchResultsObject } from 'libs/shared/apps/search/interfaces';\nimport { SharedSearchHelper } from 'libs/shared/apps/search/utils/SharedSearchHelper';\nimport { Playlist, Series } from 'libs/shared/interfaces';\n\nfunction formatSearchResponse(response: SearchResults<SearchResultObjectTypes>) {\n /**\n * Until playlists and series are regionalised, search will always return every series/playlist that exists\n * even if the current user doesn't have access to the content inside (which will happen for example when playlists/series)\n * contain all UK library content but is being searched for by an AU user.\n *\n * For some search queries, this may result in search showing a bunch of \"empty\" playlists/series, which sucks.\n * This will filter all empty collections out and decrement the `totalResults` to avoid this and make search a better\n * experience.\n *\n * Ideally this will be removed one day when this regionalisation is no longer an issue.\n */\n let totalResults = response.totalResults;\n\n const results = response?.results?.filter(result => {\n if (result._index !== 'series' && result._index !== 'playlist')\n return true;\n\n if (result._index === 'playlist') {\n const playlist = result as SearchResultsObject<Playlist>;\n\n if (playlist.clips?.data?.length ||\n playlist.interactives?.data?.length ||\n playlist.videos?.data?.length)\n return true;\n\n totalResults--;\n return false;\n }\n\n if ((result as SearchResultsObject<Series>).videos?.data?.length === 0) {\n totalResults--;\n return false;\n }\n\n return true;\n }) ?? [];\n\n response.results = results;\n response.totalResults = totalResults;\n\n // The first search result will always have the highest score value.\n // We store it so that we can access it for subsequent results pages\n const resultMaxScore = results[0]?._score;\n\n return {\n ...response,\n results: SharedSearchHelper.mapMaxScoreToSearchResults(results, resultMaxScore)\n };\n}\n\nexport const SharedSearchRequests = {\n searchV4(\n query: string,\n indicesArr: SearchIndices[],\n filters: HashObject = {},\n allowSubstitute: boolean = true,\n cursor?: string,\n limit?: number\n ): Flight.PublicRequest {\n let key = `search:v4:${query}:${allowSubstitute}:${indicesArr}:${cursor}`;\n\n key += Object.keys(filters).map(filterName => {\n const filter = filters[filterName];\n return Array.isArray(filter) ? filter.join(';') : filter;\n }).join(';');\n\n const {\n [`${FilterConstants.FILTER_PARAM_PREFIX}excludeLibraryExclusive`]: excludeLibraryExclusive,\n isLearner,\n ...genericFilters\n } = filters;\n\n const indices = indicesArr.map(index => {\n if (index !== 'video' || !excludeLibraryExclusive)\n return { index };\n\n return { index, filters: { excludeLibraryExclusive } };\n });\n\n const data = {\n searchType: 'content',\n indices,\n filters: Object.entries(genericFilters)\n .reduce((prev, [ key, value ]) =>\n ({ ...prev, [key.replace('filters.', '')]: value }), {}),\n query,\n allowSubstitute,\n cursor: cursor ?? undefined,\n isLearner: !!isLearner,\n limit\n };\n\n return {\n url: '{gateway}/v4/search',\n publicUrl: '/api/search/v4',\n type: HttpVerbs.POST,\n data,\n key,\n formatData: formatSearchResponse\n };\n },\n\n search(\n query: string,\n indices: SearchIndices[],\n filters: HashObject = {},\n allowSubstitute: boolean = true,\n cursor?: string,\n limit?: number,\n success?: (results: SearchResults) => void,\n error?: (xhr: Xhr) => void\n ): Flight.PublicRequest {\n let key = `search:${query}:${allowSubstitute}:${indices}:${cursor}`;\n\n key += Object.keys(filters).map(filterName => {\n const filter = filters[filterName];\n return Array.isArray(filter) ? filter.join(';') : filter;\n }).join(';');\n\n const params = Object.assign({}, {\n index: indices,\n cursor: cursor ?? undefined,\n query,\n allowSubstitute,\n limit,\n ...filters\n });\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v3/search', params),\n publicUrl: UrlHelper.urlBuilder('/api/search', params),\n key,\n formatData: formatSearchResponse,\n success,\n error\n };\n },\n\n tagsAndClassifications(\n query: string,\n indices: SearchIndices[],\n filters: HashObject = {},\n cursor?: string,\n success?: (results: string[]) => void,\n error?: () => void\n ): Flight.PublicRequest {\n const params = Object.assign({}, {\n index: indices,\n cursor,\n query,\n ...filters\n });\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v3/search/tags-and-classifications', params),\n publicUrl: UrlHelper.urlBuilder('/api/search/tags-and-classifications', params),\n key: `filter:options:${query}:${indices.join(':')}:${cursor}`,\n success,\n error,\n normalize: false\n };\n }\n};","import { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { SharedSearchRequests } from 'libs/shared/apps/search/flight-requests/SharedSearchRequests';\nimport { SearchResults, SearchResultsObject } from 'libs/shared/apps/search/interfaces';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { ClassificationStatus } from 'libs/shared/enums/ClassificationStatus';\nimport { ClassificationType } from 'libs/shared/enums/ClassificationType';\nimport { CurationTag } from 'libs/shared/enums/CurationTag';\nimport { Classification, Presentation, Rating } from 'libs/shared/interfaces';\n\nimport { SearchHelper } from 'apps/search/utils';\n\nconst TEACHER_FILTERS = [ 'filters.classification', 'filters.presentation' ];\nconst STUDENT_FILTERS = [ 'filters.classification', 'filters.presentation', 'isLearner' ];\n\ntype TopicSearchResults = SearchResults<SearchResultsObject<Classification>>;\n\nexport function useSearchTopics(\n queryParams: HashObject,\n ratings: Rating[] = [],\n presentationId: string,\n availablePresentations: Presentation[],\n isStudent: boolean\n): Flight.Response<SearchResults> {\n const rawFilters = ratings?.length && FilterHelper.buildBackendFilterParams(\n queryParams,\n ratings,\n [presentationId],\n isStudent,\n []\n );\n\n const filters = ObjectHelper.pick(rawFilters, isStudent ? STUDENT_FILTERS : TEACHER_FILTERS);\n filters[`filters.classificationType`] = ClassificationType.Subject;\n filters[`filters.status`] = ClassificationStatus.Published;\n\n if (queryParams?.moviesAndTv)\n filters[`filters.curationTag`] = CurationTag.MOVIES_AND_TV;\n\n if (availablePresentations.length) {\n filters[`filters.presentation`] = availablePresentations.map(presentation => presentation.id);\n }\n\n const presentationMap = availablePresentations?.reduce((acc: HashObject, presentation) => {\n acc[presentation.id] = presentation;\n return acc;\n }, {}) ?? {};\n\n const indices = FilterHelper.getAppliedIndices(queryParams);\n\n const hasFilteredOutTopics = !indices.includes('classification');\n\n const request = SharedSearchRequests.search(\n SearchHelper.getQuery(queryParams),\n ['classification'],\n filters,\n queryParams.allowSubstitute !== 'false'\n );\n\n const shouldFetch = !hasFilteredOutTopics;\n\n const response = Flight.useBasicFetch<TopicSearchResults>(shouldFetch && request);\n\n if (!shouldFetch)\n return null;\n\n if (!response.data)\n return response;\n\n if (!availablePresentations || availablePresentations?.length < 2)\n return response;\n\n const results = [...response.data.results];\n\n /**\n * If the customer has more than 1 presentation, and they search for something that returns 2 topics\n * with the same score, then we want to order those topics based on the presentation's learning level.\n * This is achieved by checking the `value` on the presentation.\n */\n const sortedResults = results.sort((a, b) => {\n // If the scores are different, then keep the original ordering\n if (a._score !== b._score)\n return 0;\n\n const presentationA = presentationMap[a.presentationId];\n const presentationB = presentationMap[b.presentationId];\n\n if (!presentationA)\n return 1;\n\n if (!presentationB)\n return -1;\n\n // Order by presentation value\n return presentationA.value - presentationB.value;\n });\n\n return {\n ...response,\n data: {\n ...response.data,\n results: sortedResults\n }\n };\n}\n","import { Flight } from 'libs/common/flight';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport { TopicResults } from 'libs/shared/apps/search/interfaces';\nimport { MasterObjectTypes } from 'libs/shared/enums/MasterObjectTypes';\nimport { LocalPermissionName, PermissionName } from 'libs/shared/enums/PermissionName';\nimport { PresentationLearningLevel } from 'libs/shared/enums/PresentationLearningLevel';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { DomainMasterCollectionType, LibraryRequests } from 'libs/shared/flight-requests/LibraryRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, CurrentUser, DashboardTargetType, Library, Rating, User, YearGroup } from 'libs/shared/interfaces';\nimport { TopicsHelper } from 'libs/shared/utils/topics-helper/TopicsHelper';\n\nimport { RatingRequests } from 'shared/flight-requests/RatingRequests';\nimport { useCurriculums } from 'shared/hooks/useCurriculums';\nimport { usePresentation } from 'shared/hooks/usePresentation';\nimport { usePresentationAudiences } from 'shared/hooks/usePresentationAudiences';\nimport { useFetchCuratedDashboard } from 'shared/utils/DashboardHelper';\n\nimport { useFetchSchoolLevels } from 'apps/search/hooks/useFetchSchoolLevels';\nimport { useSearchCompanies } from 'apps/search/hooks/useSearchCompanies';\nimport { useSearchTopics } from 'apps/search/hooks/useSearchTopics';\n\n/**\n * We need to fetch libraries in order to support the sources filter. \n * However we need to exclude the streamable library, and additionally we need to exclude\n * the exchange library if the user has decided they don't want to see exchange results.\n * \n * We then need to return both of these ids so that the FilterHelper.getBackendFilters()\n * can add them as excludeLibraryExclusive filters\n * \n * - Sha\n */\nfunction useGetLibraries() {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const products = useProducts();\n const settings = useSettings(null);\n\n const streamableLibrary = Flight.useBasicFetch<HashObject>(LibraryRequests.streamableLearning());\n const streamableLibraryId = streamableLibrary.data?.objectId;\n\n const showExchangeSearchResults = products.hasProduct(ProductId.Exchange) && settings.showExchangeSearchResults;\n\n const libraryTypes: DomainMasterCollectionType[] = [ 'sharedLibrary', 'customLibrary', 'workspace', 'hostedLibrary', 'exchange' ];\n const librariesRequest = Flight.useBasicFetch<Library[]>(\n currentUser.data?.isAuthenticated && LibraryRequests.domainLibraries(libraryTypes)\n );\n\n let libraries = librariesRequest.data ?? [];\n const exchangeLibraryIndex = libraries?.findIndex(l => l.type === MasterObjectTypes.Exchange);\n const exchangeLibraryId = libraries[exchangeLibraryIndex]?.id;\n\n if (!showExchangeSearchResults)\n libraries = [ ...libraries.slice(0, exchangeLibraryIndex), ...libraries.slice(exchangeLibraryIndex + 1) ];\n\n if (streamableLibraryId) {\n const streamableIndex = libraries?.findIndex(l => l.id.toString() === streamableLibraryId.toString());\n libraries = [ ...libraries.slice(0, streamableIndex), ...libraries.slice(streamableIndex + 1) ];\n }\n\n const hasLibrariesCompleted = (\n streamableLibrary.hasCompleted &&\n (!currentUser.data?.isAuthenticated || librariesRequest.hasCompleted)\n );\n\n return {\n hasLibrariesCompleted,\n libraries,\n exchangeLibraryId,\n streamableLibraryId,\n showExchangeSearchResults\n };\n}\n\nfunction useGetRatings() {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const ratings = Flight.useBasicFetch<Rating[]>(RatingRequests.ratings(currentUser.data?.countryCode));\n\n const {\n activePresentation, availablePresentations, getFallbackPresentation, hasPresentationsLoaded\n } = usePresentation();\n\n const currentPresentation = activePresentation || getFallbackPresentation();\n\n if (!hasPresentationsLoaded)\n return ratings;\n\n if (availablePresentations?.length > 1 || !currentPresentation)\n return ratings;\n\n const learningLevel = TopicsHelper.getMappedPresentationLevel(currentPresentation.learningLevel);\n if (learningLevel !== PresentationLearningLevel.Level_1)\n return ratings;\n\n return {\n ...ratings,\n data: ratings.data?.filter(rating => {\n // Primary schools shouldn't see ratings higher than PG\n return rating.code && rating.value < 64;\n })\n };\n}\n\n/**\n * This hook contains all the simple data fetching that normally sits in the view.\n * I've done this to help promote readability of of the SearchResultsView - Sha\n */\nexport function useFetchSearchData(queryParams: HashObject) {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const userDetails = Flight.useBasicFetch<User>(currentUser.data?.id && UserRequests.user(currentUser.data.id));\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n const products = useProducts();\n const settings = useSettings(null);\n\n const {\n hasLibrariesCompleted,\n libraries,\n exchangeLibraryId,\n streamableLibraryId,\n showExchangeSearchResults\n } = useGetLibraries();\n\n const {\n activePresentation, availablePresentations, getFallbackPresentation, hasPresentationsLoaded\n } = usePresentation();\n\n const currentPresentation = activePresentation || getFallbackPresentation();\n const currentPresentationId = currentPresentation?.id;\n\n const curriculums = useCurriculums();\n\n const audiences = usePresentationAudiences();\n\n const schoolLevels = useFetchSchoolLevels(currentPresentation);\n const schoolLevelIds = schoolLevels.data?.schoolLevels?.map(o => o.id);\n const availableTopics = Flight.useBasicFetch<TopicResults>(schoolLevels?.data &&\n ClassificationRequests.topicsFromAllAvailablePresentations(schoolLevelIds));\n\n const ratings = useGetRatings();\n\n const { hasPermissions, hasLocalPermissions } = usePermissions();\n\n const isLearner = hasPermissions(PermissionName.StudentExperience);\n const canViewCurriculums = hasPermissions(PermissionName.ViewCurriculums);\n const canUseSeriesActions = hasLocalPermissions(LocalPermissionName.UseSeriesActions);\n\n const topics = useSearchTopics(\n queryParams,\n ratings.data,\n currentPresentationId,\n availablePresentations,\n isLearner\n );\n\n const companies = useSearchCompanies(\n queryParams,\n ratings.data,\n availablePresentations,\n settings.hasNewMoviesAndTv\n );\n\n const {\n dashboard: moviesAndTvDashboard\n } = useFetchCuratedDashboard({\n targetType: DashboardTargetType.MoviesAndTv,\n queryParams\n });\n\n const hasDataLoaded = (\n audiences.hasCompleted &&\n hasPresentationsLoaded &&\n currentUser.hasCompleted &&\n (!currentUser.data?.isAuthenticated || userDetails.hasCompleted) &&\n ratings.hasCompleted &&\n config.hasCompleted &&\n availablePresentations &&\n (!currentUser.data?.isAuthenticated || !products.isLoadingProducts) &&\n !settings.isLoadingSettings &&\n hasLibrariesCompleted\n );\n\n return {\n queryParams,\n currentUser,\n userDetails,\n config,\n yearGroups,\n products,\n settings,\n curriculums,\n audiences,\n schoolLevels,\n currentPresentation,\n availablePresentations,\n availableTopics,\n ratings,\n topics,\n companies,\n moviesAndTvDashboard,\n currentPresentationId,\n isLearner,\n canViewCurriculums,\n canUseSeriesActions,\n libraries,\n hasDataLoaded,\n exchangeLibraryId,\n streamableLibraryId,\n showExchangeSearchResults,\n hasPermissions\n };\n}\n","import { Flight } from 'libs/common/flight';\n\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { Presentation, SchoolLevels } from 'libs/shared/interfaces';\n\nimport { usePresentation } from 'shared/hooks/usePresentation';\n\nimport { SearchRequests } from 'apps/search/flight-requests/SearchRequests';\n\nexport function useFetchSchoolLevels(presentation: Presentation) {\n const { hasPermissions } = usePermissions();\n const isLearner = hasPermissions(PermissionName.StudentExperience);\n\n const {\n availablePresentations,\n hasPresentationsLoaded\n } = usePresentation();\n\n function getPresentationIds() {\n if (isLearner)\n return presentation ? [presentation?.id] : null;\n\n return availablePresentations?.map(o => o.id);\n }\n\n const presentationIds = getPresentationIds();\n\n return Flight.useBasicFetch<SchoolLevels>(\n hasPresentationsLoaded &&\n presentationIds &&\n SearchRequests.schoolLevels(presentationIds)\n );\n}","import { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { SharedSearchRequests } from 'libs/shared/apps/search/flight-requests/SharedSearchRequests';\nimport { SearchResults, SearchResultsObject } from 'libs/shared/apps/search/interfaces';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { Company, Presentation, Rating } from 'libs/shared/interfaces';\n\nimport { SearchHelper } from 'apps/search/utils';\n\ntype CompanySearchResults = SearchResults<SearchResultsObject<Company>>;\n\nexport function useSearchCompanies(\n queryParams: HashObject,\n ratings: Rating[] = [],\n availablePresentations: Presentation[],\n hasMoviesAndTv: boolean\n): Flight.Response<SearchResults> {\n const availablePresentationIds = availablePresentations.map(p => p.id);\n\n const rawFilters = ratings?.length && FilterHelper.buildBackendFilterParams(\n queryParams,\n ratings,\n availablePresentationIds,\n false,\n []\n );\n \n const filters = rawFilters || {};\n\n /**\n * For other uses of FilterHelper.buildBackendFilterParams, the presentaiton ids will only be added for students,\n * but as a temporary fix for searching companies, we always filter by the current presentation - Sha\n */\n if (availablePresentationIds?.length)\n filters[`filters.presentation`] = availablePresentationIds;\n\n const indices = FilterHelper.getAppliedIndices(queryParams);\n\n const hasFilteredOutCompanies = !indices.includes('company');\n\n const request = SharedSearchRequests.search(\n SearchHelper.getQuery(queryParams),\n ['company'],\n filters,\n queryParams.allowSubstitute !== 'false'\n );\n\n const shouldFetch = !hasFilteredOutCompanies && hasMoviesAndTv;\n\n const response = Flight.useBasicFetch<CompanySearchResults>(shouldFetch && request);\n\n if (!shouldFetch)\n return null;\n\n if (!response.data)\n return response;\n\n return {\n ...response,\n data: {\n ...response.data,\n results: [...response.data.results]\n }\n };\n}\n","import { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport { FilterConstants } from 'libs/shared/apps/search/constants/FilterConstants';\nimport { SharedSearchRequests } from 'libs/shared/apps/search/flight-requests/SharedSearchRequests';\nimport { SearchIndices, SearchResultObjectTypes, SearchResults } from 'libs/shared/apps/search/interfaces';\nimport { handleHttpError } from 'libs/shared/errors/handlers/HttpErrorHandlers';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useInfiniteList } from 'libs/shared/hooks/UseInfiniteList';\nimport { UseProductsResponse } from 'libs/shared/hooks/UseProducts';\nimport { SettingsHash } from 'libs/shared/hooks/useSettings';\nimport { Video } from 'libs/shared/interfaces';\n\nimport { useVideoMixin } from 'shared/hooks/useVideoMixin';\n\nimport { ExchangeGroupingType, useGroupExchangeResults } from './useGroupExchangeResults';\n\nexport const namespace = 'search.utils';\n\ninterface UseGetSearchResultsOptions {\n queryParams: HashObject;\n appliedIndices: SearchIndices[];\n backendFilters: HashObject;\n products: UseProductsResponse;\n settings: SettingsHash;\n hasDataLoaded: boolean;\n exchangeLibraryId: string;\n showExchangeSearchResults: boolean;\n}\nexport function useGetSearchResults(options: UseGetSearchResultsOptions) {\n const { queryParams, appliedIndices, backendFilters } = options;\n\n const alerts = useAlerts();\n const fetch = Flight.useGetFetch();\n\n const searchResultsResponse = Flight.useGetResponse<SearchResults>(getSearchRequest()?.key);\n const hasExchangeLibraryFilter = hasLibraryFilter(options.exchangeLibraryId?.toString());\n const fetchMixedExchangeResults = (\n options.hasDataLoaded &&\n appliedIndices?.length &&\n options.showExchangeSearchResults &&\n !hasExchangeLibraryFilter\n );\n const mixedExchangeSearchResults = Flight.useBasicFetch<SearchResults>(\n fetchMixedExchangeResults && getMixedExchangeSearchRequest()\n );\n\n function hasLibraryFilter(libraryId: string): boolean {\n if (!libraryId) return false;\n\n return options.backendFilters?.[`${FilterConstants.FILTER_PARAM_PREFIX}library`]\n ?.some?.((l: string) => l.toString() === libraryId);\n }\n\n function getMixedExchangeSearchRequest() {\n return SharedSearchRequests.searchV4(\n queryParams.query,\n appliedIndices,\n backendFilters,\n queryParams.allowSubstitute !== 'false',\n null,\n 10\n );\n }\n\n function getSearchRequest(cursor?: string) {\n if (!options.hasDataLoaded || !appliedIndices?.length) return;\n\n let backendFilters = { ...options.backendFilters };\n\n if (options.showExchangeSearchResults && !hasExchangeLibraryFilter) {\n const excludeLibraryFilter = `${FilterConstants.FILTER_PARAM_PREFIX}excludeLibraryExclusive`;\n backendFilters = {\n ...backendFilters,\n [excludeLibraryFilter]: [ ...backendFilters[excludeLibraryFilter], options.exchangeLibraryId ]\n };\n }\n \n return SharedSearchRequests.searchV4(\n queryParams.query,\n appliedIndices,\n backendFilters,\n queryParams.allowSubstitute !== 'false',\n cursor\n );\n }\n\n function fetchNext(cursor?: string) {\n fetch(getSearchRequest(cursor));\n }\n\n function onError(pageNumber: number, httpStatus: HttpStatus): void {\n if (pageNumber === 1)\n return handleHttpError(httpStatus);\n\n alerts.error(LanguageService.getPhrase(namespace, 'error'));\n }\n\n const searchResults = useInfiniteList<SearchResultObjectTypes, SearchResults>(\n getSearchRequest,\n fetchNext,\n onError,\n data => data.results\n );\n\n function getExchangeGroupingType(): ExchangeGroupingType {\n if (!options.showExchangeSearchResults)\n return 'omit';\n\n return hasExchangeLibraryFilter ? 'untouched' : 'group';\n }\n\n const videos = searchResults.items?.filter(r => r._index === 'video' || r._index === 'clip');\n useVideoMixin(videos as Video[]);\n\n const items = useGroupExchangeResults({\n searchResults: searchResults.items,\n mixedExchangeSearchResults: mixedExchangeSearchResults.data?.results,\n searchResultsResponse: searchResultsResponse.data,\n groupingType: getExchangeGroupingType()\n });\n\n return {\n ...searchResults,\n hasFirstPageCompleted: searchResults.hasFirstPageCompleted || !options.hasDataLoaded || !appliedIndices?.length,\n items,\n fetchNext,\n substituteQuery: searchResultsResponse.data?.substituteQuery,\n suggestions: searchResultsResponse.data?.suggestions\n };\n}\n","import React from 'react';\n\nimport { ExchangeVideoGroup, SearchResultObjectTypes, SearchResults, SearchResultsObject } from 'libs/shared/apps/search/interfaces';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { Video } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nexport type ExchangeGroupingType =\n 'omit' | // Don't show exchange results at all\n 'group' | // Group exchange results into a component\n 'untouched'; // Leave exchange results untouched\n\ninterface UseGroupExchangeResults {\n searchResults: SearchResultObjectTypes[];\n mixedExchangeSearchResults: SearchResultObjectTypes[];\n searchResultsResponse: SearchResults;\n groupingType: ExchangeGroupingType;\n}\n\nexport function useGroupExchangeResults(options: UseGroupExchangeResults) {\n return React.useMemo(() => {\n if (!options.searchResults?.length || !options.mixedExchangeSearchResults?.length || options.groupingType === 'untouched')\n return options.searchResults;\n\n const mixedExchangeResults: SearchResultObjectTypes[] = [...options.searchResults];\n const exchangeResults: SearchResultsObject<Video>[] = [];\n let exchangeIndex: number;\n let exchangeShowCount: number;\n let consecutive = false;\n\n options.mixedExchangeSearchResults.forEach((item, index) => {\n if (exchangeResults.length === 3) return;\n\n const isExchangeVideo = VideoHelper.isVideo(item) &&\n item.libraries.data?.length === 1 &&\n item.libraries.data?.[0]?.typeId === MasterType.ExchangeCollection;\n\n if (isExchangeVideo) {\n if (exchangeIndex === undefined) {\n exchangeIndex = index;\n exchangeShowCount = 0;\n consecutive = true;\n }\n\n if (consecutive)\n exchangeShowCount++;\n\n exchangeResults.push(item);\n return;\n }\n\n consecutive = false;\n });\n\n const exchangeVideoGroup: SearchResultsObject<ExchangeVideoGroup> = {\n id: null,\n type: null,\n name: null,\n videos: exchangeResults,\n showCount: exchangeIndex === 0 ? 1 : exchangeShowCount,\n isExchangeVideoGroup: true,\n _index: null\n };\n \n if (options.groupingType === 'group' && exchangeResults.length)\n mixedExchangeResults.splice(exchangeIndex, 0, exchangeVideoGroup);\n\n return mixedExchangeResults;\n }, [\n options.searchResultsResponse,\n options.searchResults?.length,\n options.mixedExchangeSearchResults?.length,\n options.groupingType\n ]);\n}","import React from 'react';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'search.searchResultsEmptyState';\n\ninterface SearchResultsEmptyStateProps {\n query?: string;\n scotland?: boolean;\n}\n\nexport function SearchResultsEmptyState(props: SearchResultsEmptyStateProps): JSX.Element {\n const imageUrl = (props.scotland && props.query?.trim()?.toLowerCase() === 'nessie')\n ? ImageUrls.EmptyStates.Search.RESULTS_SCOTLAND\n : ImageUrls.EmptyStates.Search.RESULTS;\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={imageUrl} />\n\n <EmptyState.Heading>\n {props.query\n ? <Text phrase='headingWithQuery' options={{ query: props.query }} />\n : <Text phrase='headingWithoutQuery' />\n }\n </EmptyState.Heading>\n\n <EmptyState.Info>\n <Text phrase='info' />\n <AppLink\n className='info-link'\n appLink={{ application: AppChannels.SUBJECT, action: Actions.Subjects.CLASSIFICATION_ALL }}\n >\n <Text phrase='topicsAppLink' />\n </AppLink>\n </EmptyState.Info>\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType, HashObject, LocationContext } from 'libs/analytics/interfaces';\n\nimport { MixedSearchResults } from 'libs/shared/apps/search/components/mixed-search-results/MixedSearchResults';\nimport { SearchFilters } from 'libs/shared/apps/search/components/search-filters/SearchFilters';\nimport { SearchSubstitute } from 'libs/shared/apps/search/components/search-substitute/SearchSubstitute';\nimport { SearchSuggestions } from 'libs/shared/apps/search/components/search-suggestions/SearchSuggestions';\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { usePluginHelper } from 'shared/hooks/use-plugin-helper/usePluginHelper';\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\n\nimport { useFetchSearchData } from 'apps/search/hooks/useFetchSearchData';\nimport { useGetSearchResults } from 'apps/search/hooks/useGetSearchResults';\nimport { useGetTagsAndClassifications } from 'apps/search/hooks/useGetTagsAndClassifications';\nimport { useSearchMask } from 'apps/search/hooks/useSearchMask';\nimport { SearchHelper } from 'apps/search/utils';\n\nimport { SearchResultsEmptyState } from './empty-state/SearchResultsEmptyState';\n\nexport const namespace = 'search.searchResults';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SearchResultsView2Props {\n queryParams: HashObject\n}\n\nexport function SearchResultsView(props: SearchResultsView2Props): JSX.Element {\n const { queryParams = {} } = props;\n\n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem });\n const { setFavourite, canFavourite } = useLiteFavourites(LocationContext.VideoThumbnail);\n const { isPlugin } = usePluginHelper();\n\n const searchData = useFetchSearchData(queryParams);\n\n const searchFilters = SearchHelper.getBackendFilters(searchData);\n\n const hasIndices = !!searchFilters?.appliedIndices.length;\n const tagsAndClassifications = useGetTagsAndClassifications(hasIndices && searchFilters);\n const searchResults = useGetSearchResults({ ...searchFilters, ...searchData });\n\n const filters = SearchHelper.getFilters(\n searchData,\n searchFilters?.inaccessibleIndices,\n hasIndices && tagsAndClassifications\n );\n \n useSetPageMetadata(PageMetadataHelper.getDefaultMetadata({\n title: queryParams.query ?? '',\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n },\n allowIndexing: false\n }));\n\n /**\n * Do we have the data we need for the entire view to render\n */\n const hasLoaded = (\n searchData.hasDataLoaded && filters\n );\n\n /**\n * Do we have the data we need to render our results\n */\n const hasSearchCompleted = (\n searchResults.hasFirstPageCompleted &&\n // Topic and Company requests won't exist if they aren't being fetched\n (!searchData.topics || searchData.topics.hasCompleted) &&\n (!searchData.companies || searchData.companies.hasCompleted) &&\n (!hasIndices || tagsAndClassifications.hasCompleted) &&\n !!filters\n );\n\n /**\n * Do we actually have results\n */\n const hasResults = (\n searchResults.items?.length ||\n searchData.topics?.data?.totalResults ||\n searchData.companies?.data?.totalResults\n );\n\n useSearchMask(hasSearchCompleted);\n\n if (!hasLoaded)\n return <></>;\n\n return (\n <div className='px-4'>\n <SearchSubstitute\n substitute={searchResults.substituteQuery}\n queryParams={queryParams}\n getAppLink={SearchHelper.getSearchAppLink}\n />\n\n {!searchResults.substituteQuery && (\n <SearchSuggestions\n suggestions={searchResults.suggestions}\n queryParams={queryParams}\n getAppLink={SearchHelper.getSearchAppLink}\n />\n )}\n\n {(!!searchData.audiences.data && !!searchData.ratings.data && !!searchData.availableTopics.data) && (\n <SearchFilters\n queryParams={queryParams}\n mainFilters={filters?.mainFilters}\n moreFilters={filters?.moreFilters}\n analyticsOptions={{\n entity: EntityType.SearchResults,\n location: LocationContext.SearchFilters\n }}\n appLink={{ application: AppChannels.SEARCH, action: Actions.Search.HOME }}\n isFetchingOptions={tagsAndClassifications.isFetching}\n />\n )}\n\n {hasSearchCompleted &&\n <section>\n {hasResults\n ? (\n <VideoActionsContext.Provider value={videoActions}>\n <MixedSearchResults\n queryParams={queryParams}\n results={searchResults.items}\n topics={searchData.topics?.data}\n companies={searchData.companies?.data}\n setFavourite={setFavourite}\n canFavourite={canFavourite}\n audiences={!queryParams.moviesAndTv && searchData.audiences.data}\n currentUser={searchData.currentUser.data}\n imageCdnUrl={searchData.config.data.imageCdnUrl}\n availablePresentations={searchData.availablePresentations}\n showActions={(!searchData.isLearner && searchData.canUseSeriesActions)}\n hasPermissions={searchData.hasPermissions}\n yearGroups={searchData.yearGroups.data}\n isPlugin={isPlugin}\n appLinks={SearchHelper.getAppLinks(\n searchData.currentPresentation,\n searchData.availablePresentations,\n queryParams.moviesAndTv\n )}\n subTextType='series'\n />\n </VideoActionsContext.Provider>\n ) : (\n <SearchResultsEmptyState\n query={queryParams.query}\n scotland={!!searchData.currentPresentation?.description?.toLowerCase().includes('scotland') ?? false}\n />\n )\n }\n {/* XOR */}\n {(searchResults.hasMore || searchResults.isFetching) && (\n <InfiniteScrollFooter\n isFetching={searchResults.isFetching}\n fetchNext={searchResults.fetchNext}\n nextCursor={searchResults.nextCursor}\n fetchOnScroll\n />\n )}\n </section>\n }\n </div>\n );\n}","import { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { SharedSearchRequests } from 'libs/shared/apps/search/flight-requests/SharedSearchRequests';\nimport { SearchIndices } from 'libs/shared/apps/search/interfaces';\n\nexport interface UseGetTagsAndClassificationsOptions {\n queryParams: HashObject;\n appliedIndices: SearchIndices[];\n backendFilters: HashObject;\n}\n\nexport function useGetTagsAndClassifications(options: UseGetTagsAndClassificationsOptions) {\n return Flight.useBasicFetch<string[]>(options && SharedSearchRequests.tagsAndClassifications(\n options.queryParams.query,\n options.appliedIndices,\n options.backendFilters\n ));\n}\n","import React from 'react';\n\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { ViewModelKeys } from 'shared/constants/LiteViewModels';\n\nexport function useSearchMask(hasCompleted: boolean): void {\n const [ showMask, setShowMask ] = useViewModel(ViewModelKeys.SHOW_SEARCH_MASK, true);\n\n React.useEffect(() => {\n showMask && hasCompleted && setShowMask(false);\n }, [hasCompleted]);\n}\n","import { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { Rating } from 'libs/shared/interfaces';\n\nexport const RatingRequests = {\n ratings(countryCode?: string): Flight.PublicRequest {\n return {\n url: '/api/domain/v2/me/ratings',\n publicUrl: UrlHelper.urlBuilder('/api/domain/v2/me/ratings', { countryCode }),\n key: 'ratings',\n // v2/me/ratings doesn't support `query={orderby:value}`. Adding this due to time constraints\n formatData: (ratings: Rating[]) => {\n return ratings.sort((a, b) => a.value - b.value);\n }\n };\n }\n};","import { Flight } from 'libs/common/react/index';\n\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\nimport { usePresentation } from 'shared/hooks/usePresentation';\n\nexport const usePresentationAudiences = () => {\n const { activePresentation, getFallbackPresentation } = usePresentation({ redirectOnError: true });\n\n const presentation = activePresentation || getFallbackPresentation();\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n !!presentation &&\n AudienceRequests.presentationAudiences(presentation.id)\n );\n\n return audiences;\n};","import React from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { CurrentUser, Video, VideoCollection } from 'libs/shared/interfaces';\n\ninterface VideoMixinOptions {\n /**\n * If the videos that are having new data mixed into are sitting on an explicit Flight namespace,\n * providing that namespace here is required\n */\n flightNamespace?: string;\n}\n\nexport function useVideoMixin(videos: VideoCollection | Video[], options: VideoMixinOptions = {}): void {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const hydratedVideos = React.useRef<Set<string>>(new Set<string>());\n\n const videoIds = videos && (Array.isArray(videos)\n ? videos.filter(Boolean).map(v => v.id)\n : videos.data.filter(Boolean).map(v => v.id));\n\n const [ request, setRequest ] = React.useState<Flight.Request[]>([]);\n\n React.useEffect(() => {\n if (!videoIds?.length || !currentUser.hasCompleted)\n return;\n\n const unhydratedVideos: string[] = [];\n\n videoIds.forEach(id => {\n if (!hydratedVideos.current.has(id)) {\n unhydratedVideos.push(id);\n hydratedVideos.current.add(id);\n }\n });\n \n if (!unhydratedVideos.length)\n return;\n\n setRequest(r => {\n const newRequests = [\n ...r,\n VideoRequests.videoMixinAssocs(unhydratedVideos, options.flightNamespace)\n ];\n\n if (currentUser.data?.isAuthenticated)\n newRequests.push(ClassificationRequests.hasCurriculumLinks(unhydratedVideos, null, options.flightNamespace));\n\n return newRequests;\n });\n }, [ videoIds?.length, currentUser.hasCompleted ]);\n\n Flight.useBasicFetchAll(request);\n}"],"names":["InfiniteScrollFooter","props","ref","inView","fetchOnScroll","isFetching","fetchNext","nextCursor","className","Spinner","as","animation","role","SvgContainer","svgName","size","S","onClick","defaultProps","WidgetButtonDirection","WidgetButton","isLeft","direction","Left","arrowSvg","hide","style","state","contents","paddingBottom","viewableItems","height","useGradientBackdrop","leftGradientClassName","rightGradientClassName","hideExtendedClickableArea","leftButtonClassName","rightButtonClassName","hoverText","SCROLL_TOLERANCE","useInfiniteList","getRequest","onError","getItems","getCursor","scrollContainer","options","handleScroll","useState","pagesFetched","setPagesFetched","fetchNextFn","response","cursor","request","key","fetchNextPage","currentVal","hasMore","getBoundingClientRect","scrollTop","scrollHeight","window","innerHeight","document","documentElement","useEffect","onScroll","FunctionHelper","addEventListener","removeEventListener","shouldInitialFetch","statusCode","httpStatusClass","toString","substr","HttpStatus","items","totalItems","hasFirstPageCompleted","CompanyWidgetItem","analyticsData","id","data","name","analyticsOptions","location","actionType","entity","descriptor","CoverPill","coverUrl","logo","url","CompanyResult","Col","sm","md","useLargeStyle","lg","item","getChildAppLink","appLinks","getCompanyAppLink","getChildAppLinkOptions","getCompanyAppLinkOptions","itemIndex","search","query","queryParams","score","_score","maxScore","_maxScore","featured","_featured","pagePositionIndex","isLarge","namespace","ExchangeVideoGroup","limit","showCount","currentAppLink","currentParams","params","currentSource","source","Array","isArray","searchAppLink","AppLink","appLink","Text","phrase","searchSettings","videos","slice","map","v","i","VideoItem","video","yearGroups","getVideoAppLink","getSubTextAppLink","presentationAudiences","audiences","setFavourite","canFavourite","companyLogoFallbackUrl","subTextType","hasPermissions","getClassroomGuideAppLink","getResourceGuidanceAppLink","getInteractiveGuidanceAppLink","isPlugin","FeaturedVideoResult","HeroVideo","opts","subTextAppLink","hideInteractiveBadge","showVideoGuidance","VideoHelper","imageCdnUrl","PlaylistWithVideos","breakpoints","maxVideos","useBreakpoints","xl","xxl","playlist","playlistAnalyticsOption","playlistAnalyticsData","Row","xs","playlistAppLink","bgColourClassNames","itemStyle","currentUser","showOwner","videoAnalyticsData","videoId","videoName","LargePlaylistResult","getPlaylistAppLink","preloadImage","SeriesWithVideos","series","seriesAnalyticsOption","seriesAnalyticsData","seriesAppLink","SeriesTallPoster","imageClass","hideVideoGuidance","LargeSeriesResult","getSeriesAppLink","CollectionVideoList","analyticsProps","hasSeasonEpisode","episodeNumber","season","collectionId","CollectionThumbnail","isSmall","VideoListHelper","hasVideos","collection","length","firstVideoWithThumbnail","find","thumbnail","isSeries","collectionType","BaseImage","imageType","Mask","type","maskType","ImageFallback","imageFallbackType","Actions","actions","getCollectionActions","showActions","actionsDropdownClassName","hideBadges","BadgeListContainer","Badge","rating","metadata","year","SmallPlaylistResult","SmallSeriesResult","SubjectResult","getClassificationAppLink","getClassificationAppLinkOptions","availablePresentations","VideoResult","Component","ClipItem","InteractiveItem","getPreviewQuestionsAppLink","MixedSearchResults","useSmallComponent","results","topics","totalResults","companies","companiesAndTopics","childProps","c","toLowerCase","result","index","isExchangeVideoGroup","tallPoster","SearchSubstitute","substitute","getAppLink","appLinkOptions","replace","allowSubstitute","SearchSuggestions","suggestions","suggestion","formatSearchResponse","filter","_index","clips","interactives","resultMaxScore","SharedSearchHelper","SharedSearchRequests","searchV4","indicesArr","filters","Object","keys","filterName","join","FilterConstants","excludeLibraryExclusive","isLearner","genericFilters","searchType","indices","entries","reduce","prev","value","undefined","publicUrl","HttpVerbs","formatData","success","error","assign","UrlHelper","tagsAndClassifications","normalize","TEACHER_FILTERS","STUDENT_FILTERS","useFetchSearchData","UserRequests","userDetails","config","ConfigRequests","isAuthenticated","CustomerRequests","customerId","products","settings","useSettings","streamableLibrary","LibraryRequests","streamableLibraryId","objectId","showExchangeSearchResults","hasProduct","ProductId","librariesRequest","libraries","exchangeLibraryIndex","findIndex","l","MasterObjectTypes","exchangeLibraryId","streamableIndex","hasLibrariesCompleted","hasCompleted","useGetLibraries","usePresentation","activePresentation","getFallbackPresentation","hasPresentationsLoaded","currentPresentation","currentPresentationId","curriculums","useCurriculums","usePresentationAudiences","schoolLevels","presentation","usePermissions","PermissionName","presentationIds","o","SearchRequests","useFetchSchoolLevels","schoolLevelIds","availableTopics","ClassificationRequests","ratings","RatingRequests","countryCode","TopicsHelper","learningLevel","PresentationLearningLevel","code","useGetRatings","hasLocalPermissions","canViewCurriculums","canUseSeriesActions","presentationId","isStudent","rawFilters","FilterHelper","ObjectHelper","ClassificationType","ClassificationStatus","moviesAndTv","CurationTag","presentationMap","acc","hasFilteredOutTopics","includes","shouldFetch","sortedResults","sort","a","b","presentationA","presentationB","useSearchTopics","hasMoviesAndTv","availablePresentationIds","p","hasFilteredOutCompanies","useSearchCompanies","hasNewMoviesAndTv","moviesAndTvDashboard","targetType","dashboard","hasDataLoaded","isLoadingProducts","isLoadingSettings","useGetSearchResults","appliedIndices","backendFilters","alerts","fetch","searchResultsResponse","getSearchRequest","hasExchangeLibraryFilter","libraryId","some","hasLibraryFilter","fetchMixedExchangeResults","mixedExchangeSearchResults","excludeLibraryFilter","searchResults","pageNumber","httpStatus","LanguageService","r","useVideoMixin","groupingType","exchangeIndex","exchangeShowCount","mixedExchangeResults","exchangeResults","consecutive","forEach","typeId","MasterType","push","exchangeVideoGroup","splice","useGroupExchangeResults","substituteQuery","SearchResultsEmptyState","imageUrl","scotland","trim","ImageUrls","EmptyState","src","application","action","getPhrase","SearchResultsView","videoActions","useVideoActions","useLiteFavourites","u","usePluginHelper","searchData","searchFilters","hasIndices","inaccessibleIndices","useSetPageMetadata","PageMetadataHelper","title","phraseContext","phraseHandler","titlePhrase","descriptionPhrase","allowIndexing","showMask","setShowMask","hasLoaded","hasSearchCompleted","hasResults","SearchFilters","mainFilters","moreFilters","isFetchingOptions","VideoActionsContext","description","redirectOnError","hydratedVideos","Set","videoIds","Boolean","setRequest","unhydratedVideos","current","has","add","newRequests","flightNamespace"],"sourceRoot":""}
|