@clickview/lite 0.72.0 → 0.72.2
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/1109-4f5b0dab9b-lite.chunk.js +2 -0
- package/dist/scripts/1109-4f5b0dab9b-lite.chunk.js.map +1 -0
- package/dist/scripts/1667-fcdff22585-lite.chunk.js +3 -0
- package/dist/scripts/1667-fcdff22585-lite.chunk.js.map +1 -0
- package/dist/scripts/{3596-d760a67a58-lite.chunk.js → 3596-89a39d3781-lite.chunk.js} +3 -3
- package/dist/scripts/{3596-d760a67a58-lite.chunk.js.map → 3596-89a39d3781-lite.chunk.js.map} +1 -1
- package/dist/scripts/3816-ca44792dca-lite.chunk.js +2 -0
- package/dist/scripts/3816-ca44792dca-lite.chunk.js.map +1 -0
- package/dist/scripts/7601-c1b07b72c6-lite.chunk.js +2 -0
- package/dist/scripts/7601-c1b07b72c6-lite.chunk.js.map +1 -0
- package/dist/scripts/{bundle-6e723fdeb1.min.js → bundle-23f3b64e36.min.js} +3 -3
- package/dist/scripts/{bundle-6e723fdeb1.min.js.map → bundle-23f3b64e36.min.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/1109-98508a03fe-lite.chunk.js +0 -2
- package/dist/scripts/1109-98508a03fe-lite.chunk.js.map +0 -1
- package/dist/scripts/1667-ac162f04d0-lite.chunk.js +0 -3
- package/dist/scripts/1667-ac162f04d0-lite.chunk.js.map +0 -1
- package/dist/scripts/3816-abed23a1ce-lite.chunk.js +0 -2
- package/dist/scripts/3816-abed23a1ce-lite.chunk.js.map +0 -1
- package/dist/scripts/7601-b439c82e82-lite.chunk.js +0 -2
- package/dist/scripts/7601-b439c82e82-lite.chunk.js.map +0 -1
- /package/dist/scripts/{1667-ac162f04d0-lite.chunk.js.LICENSE.txt → 1667-fcdff22585-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{3596-d760a67a58-lite.chunk.js.LICENSE.txt → 3596-89a39d3781-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{bundle-6e723fdeb1.min.js.LICENSE.txt → bundle-23f3b64e36.min.js.LICENSE.txt} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts/3816-ca44792dca-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/hooks/UseBatchFetch.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteScroll.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteList.ts","file:///app/packages/libs/shared/src/views/feedback/enums/FeedbackOption.ts","file:///app/packages/projects/lite/src/apps/libraries/views/library-folder/LibraryFolderViewUtils.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/PlaylistWithVideos.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/mixed-search-results/components/LargePlaylistResults.tsx","file:///app/packages/libs/shared/src/apps/search/components/series-with-videos/SeriesWithVideos.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/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/CollectionThumbnail.tsx","file:///app/packages/libs/shared/src/apps/search/components/collection-thumbnail/collection-thumbnail.scss","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/projects/lite/src/apps/search/hooks/useFetchSchoolLevels.ts","file:///app/packages/libs/shared/src/apps/search/constants/SearchOGQL.ts","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/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/hooks/useGetTagsAndClassifications.tsx","file:///app/packages/projects/lite/src/apps/search/hooks/useSearchMask.tsx","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/libs/shared/src/apps/search/components/mixed-widget-search-results/components/search-widget-tooltip/SearchWidgetTooltip.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-widget-search-results/mixed-widget-search-results.scss","file:///app/packages/libs/shared/src/apps/search/components/mixed-widget-search-results/MixedWidgetSearchResults.tsx","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/components/partial-loading/PartialSearchResults.tsx","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/components/search-results-request-video/SearchResultsRequestVideo.tsx","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/components/search-results-empty-state/SearchResultsEmptyState.tsx","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/utils/SearchResultsFilterHelper.ts","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/hooks/useTransformer.tsx","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/hooks/use-get-search-results/transformations/results/mergeSearchResults.ts","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/hooks/use-get-search-results/transformations/widget-item/transformSearchRelevantTopics.ts","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/hooks/use-get-search-results/transformations/widget-item/transformSearchTags.ts","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/hooks/use-get-search-results/useGetSearchResultsV2.tsx","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/utils/SearchResultsAppLinkHelper.ts","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/SearchResultsViewV2.tsx","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/hooks/useCurriculumCodeSearch.ts","file:///app/packages/projects/lite/src/apps/search/views/lite-search-results-view/LiteSearchResultsView.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":["import React from 'react';\n\nimport { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { BaseObject } from 'libs/shared/interfaces';\n\nconst CHUNK_SIZE = 50;\n\nexport interface UseBatchFetchResult<T extends BaseObject> {\n itemsArr: T[];\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 chunks = ArrayHelper.chunk<string>(itemIds, CHUNK_SIZE);\n\n const requests = chunks.map(chunk => getRequest(ArrayHelper.uniq(chunk)));\n\n const responses = Flight.useBasicFetchAll<T[]>(requests);\n\n const itemsArr = ArrayHelper.flatten(responses.data);\n const items = responses.data.length\n ? itemsArr.reduce((acc, item) => ({ ...acc, [item.id]: item }), {})\n : null;\n\n return {\n itemsArr,\n items,\n isFetching: responses.isFetching\n };\n}\n\n/**\n * When you need the useBatchFetch() behavior, but your list of objects to hydrate\n * will grow, such as on a scrolling page. useGrowingBatchFetch() will use local state\n * to determine what we've already built a request for and what items are new\n * as to not re-fetch items - Sha\n */\nexport function useGrowingBatchFetch<T>(\n objs: T[],\n getRequest: (items: T[]) => Flight.Request,\n _getKey?: (obj: T) => string\n) {\n const getKey = _getKey || ((obj: any) => {\n if (typeof obj === 'object')\n return obj.id;\n\n return obj;\n });\n\n const fetchedItems = React.useRef<Set<string>>(new Set<string>());\n\n const [ requests, setRequests ] = React.useState<Flight.Request[]>([]);\n\n React.useEffect(() => {\n if (!objs?.length)\n return;\n\n const unfetchedItems: T[] = [];\n \n objs.forEach(obj => {\n const key = getKey(obj);\n\n if (fetchedItems.current.has(key))\n return;\n\n unfetchedItems.push(obj);\n fetchedItems.current.add(key);\n });\n \n if (!unfetchedItems.length)\n return;\n\n setRequests(r => ([ ...r, ...ArrayHelper.chunk<T>(unfetchedItems, CHUNK_SIZE).map(getRequest) ]));\n }, [objs?.length]);\n\n const responses = Flight.useBasicFetchAll<T[]>(requests);\n\n const itemsArr = ArrayHelper.flatten(responses.data);\n const items = responses.data.length\n ? itemsArr.reduce((acc, item) => ({ ...acc, [getKey(item)]: item }), {})\n : null;\n\n return {\n hasFirstRequestCompleted: !!responses.responses?.[0]?.hasCompleted,\n itemsArr,\n items,\n isFetching: responses.isFetching\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}","export enum FeedbackOption {\n SUGGEST_IMPROVEMENT = 'suggestImprovement',\n REPORT_BUG = 'reportBug',\n REQUEST_VIDEO = 'requestVideo',\n REQUEST_LIVESTREAM = 'requestLivestream',\n GIVE_PRAISE = 'givePraise',\n RAISE_ISSUE = 'raiseIssue',\n OTHER = 'other'\n}","import { Core } from 'libs/common/core';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { Folder, Library } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nexport function getFolderAppLink(libraryId: string, folder: Folder, sort: string): Core.AppLink {\n if (!libraryId || !folder)\n return null;\n\n return {\n application: AppChannels.LIBRARIES,\n action: Actions.Libraries.FOLDER,\n args: [ libraryId, folder.id, TextHelper.slugify(folder.name) ],\n params: {\n sort\n }\n };\n}\n\nexport function getFolderBgColourClass(folder: Folder | Library): string {\n let charCode = 0;\n\n for (let i = 0; i < folder.name?.length ?? 0; i++) {\n charCode += folder.name.charCodeAt(i);\n }\n\n return BG_COLOUR_CLASS_NAMES[charCode % BG_COLOUR_CLASS_NAMES.length];\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 coverBgColor={props.data.metadata?.colour}\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 as='li' 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 getVideoAppLink={props.appLinks.getVideoAppLink}\n presentationAudiences={props.audiences}\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 hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\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 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 showVideoGuidance={VideoHelper.showVideoGuidance(props.hasPermissions)}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n}","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 { 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 } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\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 playlistAppLink: Core.AppLink;\n presentationAudiences: PresentationAudience[];\n preloadImage: boolean;\n analyticsData: HashObject;\n currentUser: CurrentUser;\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n hasPermissions: HasPermissionsFunc;\n commonVideoProps: CommonVideoProps;\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 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.commonVideoProps.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 mb-n2 ${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 <div key={video.id} className='mb-2'>\n <VideoItem\n video={video}\n getVideoAppLink={props.getVideoAppLink}\n analyticsData={videoAnalyticsData}\n analyticsOptions={{\n entity: EntityType.Video,\n location: LocationContext.PlaylistWithVideos\n }}\n size='sm'\n hasPermissions={props.hasPermissions}\n hideVideoGuidance\n commonVideoProps={props.commonVideoProps}\n />\n </div>\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}","// extracted by mini-css-extract-plugin\nexport default {\"videoList\":\"eEZEe\"};","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 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 currentUser={props.currentUser}\n preloadImage\n getVideoAppLink={props.appLinks.getVideoAppLink}\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n}","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 { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { PresentationAudience, Series, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\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 seriesAppLink: Core.AppLink;\n presentationAudiences: PresentationAudience[];\n preloadImage: boolean;\n analyticsData: HashObject;\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n hasPermissions: HasPermissionsFunc;\n commonVideoProps: CommonVideoProps;\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 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 mb-n2 ${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 <div key={video.id} className='mb-2'>\n <VideoItem\n video={video}\n getVideoAppLink={props.getVideoAppLink}\n analyticsData={videoAnalyticsData}\n analyticsOptions={{\n entity: EntityType.Video,\n location: LocationContext.SeriesWithVideos\n }}\n size='sm'\n hasPermissions={props.hasPermissions}\n hideVideoGuidance\n commonVideoProps={props.commonVideoProps}\n />\n </div>\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}","// extracted by mini-css-extract-plugin\nexport default {\"videoList\":\"UT8bc\"};","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 presentationAudiences={props.audiences}\n series={props.item}\n seriesAppLink={props.appLinks.getSeriesAppLink(props.item)}\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 hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\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}","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}","// extracted by mini-css-extract-plugin\nexport default {\"overlayContainer\":\"MnBcv\",\"overlay\":\"AZSmh\"};","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.commonVideoProps.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.commonVideoProps.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 as='li' 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 highlightOnHover={props.commonVideoProps.showNewVideoIndicator}\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 getVideoAppLink={props.appLinks.getVideoAppLink}\n getPreviewQuestionsAppLink={props.appLinks.getPreviewQuestionsAppLink}\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 hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\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 { Text } from 'libs/shared/components/text/Text';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { Classification, Company, CurrentUser, InteractiveMetadata, Playlist, Presentation, PresentationAudience, Series, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\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 namespace = 'shared.mixedSearchResults';\n\nconst TOPIC_DISPLAY_LIMIT = 8;\n\nexport interface MixedSearchResultAppLinks {\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 searchSettings?: Core.AppLink;\n}\n\ninterface MixedSearchResultsProps {\n queryParams: HashObject;\n results: SearchResultObjectTypes[];\n topics?: SearchResults;\n companies?: SearchResults;\n audiences: PresentationAudience[];\n currentUser: CurrentUser;\n availablePresentations: Presentation[]\n showActions: boolean;\n hasPermissions: HasPermissionsFunc;\n appLinks: MixedSearchResultAppLinks;\n commonVideoProps: CommonVideoProps;\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 <p role='status' className='visually-hidden'><Text namespace={namespace} phrase='ariaSearch' /></p>\n\n {!!companiesAndTopics.length && (\n <Row as='ul' className='list-unstyled 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 { 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 { SharedWithStatements } from 'libs/shared/constants/WithStatements';\nimport { TagType } from 'libs/shared/enums/TagType';\n\n/**\n * OGQL used for search V5 endpoint\n */\nexport const SearchOGQL = {\n video: SharedWithStatements.VIDEO_COLLECTION,\n series: 'rating,tallPoster',\n playlist:\n 'videos[count(),thumbnail]{limit:1},interactives[count(),_thumbnail]{limit:1},' +\n 'clips[count(),_thumbnail]{limit:1}',\n classification: `cover,thumbnail,tags{tagtype:${TagType.Curation}}`,\n clip: SharedWithStatements.CLIP_COLLECTION,\n interactive: SharedWithStatements.INTERACTIVE_COLLECTION,\n company: 'logo',\n category: 'libraries[_logo],thumbnail'\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 { SearchOGQL } from 'libs/shared/apps/search/constants/SearchOGQL';\nimport { SearchIndices, SearchResultObjectTypes, SearchResults, SearchResultsObject } from 'libs/shared/apps/search/interfaces';\nimport type { WidgetFilter } from 'libs/shared/apps/search/interfaces/WidgetSearchResults';\nimport { SharedSearchHelper } from 'libs/shared/apps/search/utils/SharedSearchHelper';\nimport type { 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\nfunction stringifyObject(obj: HashObject): string {\n return Object.entries(obj).reduce((prev, [ , value ]) => {\n let stringifiedValue = value;\n\n if (typeof value === 'object') {\n stringifiedValue = stringifyObject(value);\n } else if ([ 'number', 'boolean', 'string' ].includes(typeof value)) {\n stringifiedValue = value.toString();\n }\n\n if (!prev.length)\n return stringifiedValue;\n\n return `${prev},${stringifiedValue}`;\n }, '');\n}\n\nexport const SharedSearchRequests = {\n searchV5(\n query: string,\n filters: HashObject,\n widgets: WidgetFilter[] = []\n ): Flight.PublicRequest {\n const widgetData = widgets.map(w => [ w.id, w?.cursor ]);\n const filterData = stringifyObject(filters);\n \n const key = `search:v5:${query}:${widgetData}:${filterData}`;\n \n const {\n [`${FilterConstants.FILTER_PARAM_PREFIX}indicesFilters`]: indicesFilter,\n isLearner,\n ...genericFilters\n } = filters;\n\n const data = {\n widgets,\n indices: indicesFilter,\n filters: Object.entries(genericFilters)\n .reduce((prev, [ key, value ]) =>\n ({ ...prev, [key.replace('filters.', '')]: value }), {}),\n query,\n includeAllIndices: false,\n isLearner: !!isLearner,\n ogql: SearchOGQL\n };\n\n return {\n url: '{gateway}/v5/search',\n publicUrl: '/api/search/v5',\n type: HttpVerbs.POST,\n data,\n key\n };\n },\n \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 = {\n index: indices,\n cursor,\n query,\n ...filters\n };\n\n let key = `filter:options:${query}:${indices.join(':')}:${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 return {\n url: UrlHelper.urlBuilder('{gateway}/v3/search/tags-and-classifications', params),\n publicUrl: UrlHelper.urlBuilder('/api/search/tags-and-classifications', params),\n key,\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(\n queryParams: HashObject\n) {\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 canUseSeriesActions = hasLocalPermissions(LocalPermissionName.UseSeriesActions);\n const hasCustomLibraries = hasPermissions(PermissionName.ViewLibraries);\n const hasMoviesAndTv = hasPermissions(PermissionName.ViewMoviesTv);\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 hasMoviesAndTv\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 canUseSeriesActions,\n libraries,\n hasDataLoaded,\n exchangeLibraryId,\n streamableLibraryId,\n showExchangeSearchResults,\n hasPermissions,\n hasLocalPermissions,\n hasCustomLibraries,\n hasMoviesAndTv\n };\n}\n\nexport function useFetchSearchDataV2(\n queryParams: HashObject\n) {\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 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 hasCustomLibraries = hasPermissions(PermissionName.ViewLibraries);\n const hasMoviesAndTv = hasPermissions(PermissionName.ViewMoviesTv);\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 yearGroups,\n products,\n settings,\n audiences,\n schoolLevels,\n currentPresentation,\n availablePresentations,\n availableTopics,\n ratings,\n moviesAndTvDashboard,\n currentPresentationId,\n isLearner,\n libraries,\n hasDataLoaded,\n exchangeLibraryId,\n streamableLibraryId,\n showExchangeSearchResults,\n hasPermissions,\n hasLocalPermissions,\n hasCustomLibraries,\n hasMoviesAndTv\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,\n options.groupingType\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 { FilterConstants } from 'libs/shared/apps/search/constants/FilterConstants';\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\nconst invalidBackendFilters = [\n `${FilterConstants.FILTER_PARAM_PREFIX}indicesFilters`\n];\n\nfunction getCleanBackendFilters(backendFilters: HashObject) {\n return ObjectHelper.omit(backendFilters, invalidBackendFilters);\n}\n\nexport function useGetTagsAndClassificationsV2(options: UseGetTagsAndClassificationsOptions) {\n const backendFilters = getCleanBackendFilters(options.backendFilters);\n \n return Flight.useBasicFetch<string[]>(options && SharedSearchRequests.tagsAndClassifications(\n options.queryParams.query,\n options.appliedIndices,\n backendFilters\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 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.PRESENTATION_TOPICS }}\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';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { EntityType, 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 { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { useCommonVideoProps } from 'shared/hooks/useCommonVideoProps';\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 SearchResultsViewProps {\n queryParams: HashObject;\n}\n\nexport function SearchResultsView(props: SearchResultsViewProps): JSX.Element {\n const { queryParams = {} } = props;\n\n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem });\n const { commonVideoProps } = useCommonVideoProps({\n locationContext: LocationContext.VideoThumbnail,\n mtv: queryParams.moviesAndTv\n });\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 data: searchData,\n inaccessibleIndices: searchFilters?.inaccessibleIndices,\n tagsAndClassifications: 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 audiences={!queryParams.moviesAndTv && searchData.audiences.data}\n currentUser={searchData.currentUser.data}\n availablePresentations={searchData.availablePresentations}\n showActions={(!searchData.isLearner && searchData.canUseSeriesActions)}\n hasPermissions={searchData.hasPermissions}\n appLinks={SearchHelper.getAppLinks(\n searchData.currentPresentation,\n searchData.availablePresentations,\n queryParams.moviesAndTv === 'true'\n )}\n commonVideoProps={commonVideoProps}\n />\n </VideoActionsContext.Provider>\n ) : (\n <SearchResultsEmptyState\n query={queryParams.query}\n scotland={!!searchData.currentPresentation?.description?.toLowerCase().includes('scotland')}\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 React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'search.searchWidgetTooltip';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SearchWidgetTooltipProps {\n widgetId: WidgetTypeId;\n isTertiary: boolean;\n}\n\nfunction getWidgetPhrase(widgetId: WidgetTypeId, isTertiary: boolean) {\n const widgetTooltipPhraseMap: {[key in WidgetTypeId]?: string} = {\n [WidgetTypeId.SearchRelevantTopics]: 'relevantTopicsTooltip',\n [WidgetTypeId.SearchCompanies]: 'studiosAndChannelsTooltip',\n [WidgetTypeId.SearchTopResults]: 'topResultsTooltip',\n [WidgetTypeId.SearchSeries]: 'seriesTooltip',\n [WidgetTypeId.SearchPlaylists]: 'playlistsTooltip',\n [WidgetTypeId.SearchMyVideosFolder]: 'myVideosFoldersTooltip',\n [WidgetTypeId.SearchMySchoolLibraryFolder]: isTertiary ? 'mySchoolFoldersTooltipTertiary' : 'mySchoolFoldersTooltip',\n [WidgetTypeId.SearchMyVideos]: 'myVideosTooltip',\n [WidgetTypeId.SearchMySchoolLibraryVideos]: isTertiary ? 'mySchoolVideosTooltipTertiary' : 'mySchoolVideosTooltip',\n [WidgetTypeId.SearchExchangeArchive]: 'exchangeArchiveTooltip',\n [WidgetTypeId.SearchRelatedResults]: 'relatedResultsTooltip'\n };\n\n return widgetTooltipPhraseMap[widgetId];\n}\n\nexport function SearchWidgetTooltip(props: SearchWidgetTooltipProps): JSX.Element {\n const phrase = getWidgetPhrase(props.widgetId, props.isTertiary);\n\n if (!phrase)\n return <></>;\n\n return (\n <SvgContainer\n className={`svg-container text-secondary`}\n svgName={cvSvgLibrary.Info}\n title={getPhrase(phrase)}\n tooltipPlacement='top'\n tooltipSpanHack\n tooltipSpanHackClassName='ms-2'\n />\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"searchResultsWidgetsContainer\":\"Z5jXs\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport type { WidgetSearchItem } from 'libs/shared/apps/search/interfaces/WidgetSearchResults';\nimport { WidgetContainerView } from 'libs/shared/components/widgets/curated-widgets/WidgetContainerView';\nimport { AllSearchWidgetTemplates } from 'libs/shared/components/widgets/curated-widgets/WidgetProps';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { type HasLocalPermissionsFunc, type HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { type BaseObject, type CurrentUser, DashboardTargetType, type Presentation, type PresentationAudience, WidgetMetadata } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\n\nimport { SearchWidgetTooltip } from './components/search-widget-tooltip/SearchWidgetTooltip';\n\nimport styles from './mixed-widget-search-results.scss';\n\nconst namespace = 'search.mixedWidgetSearchResults';\n\nfunction getName(widget: WidgetSearchItem, isTertiary: boolean): string {\n if (widget.widgetId === WidgetTypeId.SearchMySchoolLibraryFolder)\n return isTertiary ? LanguageService.getPhrase(namespace, 'tertiaryFolderHeading') : widget.name;\n\n if (widget.widgetId === WidgetTypeId.SearchMySchoolLibraryVideos)\n return isTertiary ? LanguageService.getPhrase(namespace, 'tertiaryLibraryVideoHeading') : widget.name;\n\n return widget.name;\n}\n\nfunction getWidgetMetadata(widget: WidgetSearchItem): Partial<WidgetMetadata> {\n if (widget.widgetId === WidgetTypeId.SearchCurriculumCode) {\n return {\n curriculumLeafName: widget.content.name,\n curriculumLeafDescription: widget.content.description\n };\n }\n\n return {};\n}\n\nexport interface MixedWidgetSearchResultsProps {\n data: WidgetSearchItem[];\n widgetAppLinks: AllSearchWidgetTemplates['appLinks'];\n audiences: PresentationAudience[];\n availablePresentations: Presentation[];\n currentUser: CurrentUser;\n commonVideoProps: CommonVideoProps;\n isTertiary: boolean;\n\n getAnalyticsData?: (widget: WidgetSearchItem, yIndex: number, xIndex: number) => HashObject;\n \n getSeeMoreLink: (widget: WidgetSearchItem) => Core.AppLink;\n hasPermissions: HasPermissionsFunc;\n hasLocalPermissions: HasLocalPermissionsFunc;\n getSelectedItems: (type: WidgetTypeId) => BaseObject[];\n}\n\nexport function MixedWidgetSearchResults(props: MixedWidgetSearchResultsProps): JSX.Element {\n if (!props.data || !props.data.length)\n return <></>;\n\n return (\n <div className={styles.searchResultsWidgetsContainer}>\n {props.data.map((widget, idx) => {\n return (\n <WidgetContainerView\n widgetCollection={DashboardTargetType.Search}\n \n key={idx}\n widgetIndex={idx}\n id={idx.toString()}\n \n name={getName(widget, props.isTertiary)}\n content={widget.content.data}\n templateId={widget.templateId}\n widgetTypeId={widget.widgetId}\n \n audiences={props.audiences}\n currentUser={props.currentUser}\n appLinks={props.widgetAppLinks}\n availablePresentations={props.availablePresentations}\n hasPermissions={props.hasPermissions}\n seeMoreLink={props.getSeeMoreLink(widget)}\n commonVideoProps={props.commonVideoProps}\n getAnalyticsData={xIndex => props.getAnalyticsData(widget, idx, xIndex)}\n badgeComponent={\n <SearchWidgetTooltip\n widgetId={widget.widgetId}\n isTertiary={props.isTertiary}\n />\n }\n getSelectedItems={props.getSelectedItems}\n \n description={null}\n metadata={getWidgetMetadata(widget)}\n isPreviewing={false}\n settings={null}\n onClickRemoveItem={null}\n />\n );\n })}\n </div>\n );\n}","import React from 'react';\n\nimport { PartialWidgetHeader } from 'libs/shared/components/widgets/curated-widgets/components/header/partial-loading/PartialWidgetHeader';\nimport { PartialTagSlidingListWidgetTemplate } from 'libs/shared/components/widgets/curated-widgets/templates/tag-sliding-list/partial-loading/PartialTagSlidingListWidgetTemplate';\nimport { PartialThumbnailFixedListMediaSmallWidgetTemplate } from 'libs/shared/components/widgets/curated-widgets/templates/thumbnail-fixed-list-media-small/partial-loading/PartialThumbnailFixedListMediaSmallWidgetTemplate';\nimport { PartialThumbnailFixedSmallWidgetTemplate } from 'libs/shared/components/widgets/curated-widgets/templates/thumbnail-fixed-list-small/partial-loading/PartialThumbnailFixedListSmallWidgetTemplate';\nimport { PartialThumbnailVerticalListWidgetTemplate } from 'libs/shared/components/widgets/curated-widgets/templates/thumbnail-vertical-list/partial-loading/PartialThumbnailVerticalListWidgetTemplate';\n\nexport function PartialSearchResults(): JSX.Element {\n return (\n <div className='d-flex flex-column gap-4 mb-3'>\n <div className='border-bottom border-gray-300 pb-3'>\n <PartialTagSlidingListWidgetTemplate />\n </div>\n <div>\n <PartialThumbnailFixedSmallWidgetTemplate hideDescription />\n </div>\n <div>\n <PartialWidgetHeader hideDescription />\n <PartialThumbnailVerticalListWidgetTemplate />\n </div>\n <PartialThumbnailFixedListMediaSmallWidgetTemplate hideDescription />\n <div>\n <PartialWidgetHeader hideDescription />\n <PartialThumbnailVerticalListWidgetTemplate />\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { FeedbackOption } from 'libs/shared/views/feedback/enums/FeedbackOption';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'search.searchResultsRequestVideo';\n\ninterface SearchResultsRequestVideo {\n skipBeforeRequestingVideoStep?: boolean;\n description?: string;\n}\n\nexport function SearchResultsRequestVideo(props: SearchResultsRequestVideo): JSX.Element {\n const { skipBeforeRequestingVideoStep = true } = props;\n \n return (\n <div className='d-flex flex-column align-items-center justify-content-center gap-3 mb-3'>\n {props.description\n ? <span>{props.description}</span>\n : <Text phrase='description' namespace={namespace} />\n }\n <AppLink\n appLink={{\n application: AppChannels.DEFAULT,\n action: Actions.Default.GIVE_FEEDBACK,\n params: {\n selectedOption: FeedbackOption.REQUEST_VIDEO,\n skipBeforeRequestingVideoStep: !!skipBeforeRequestingVideoStep\n }\n }}\n className='btn btn-outline-dark'\n >\n <Text phrase='requestVideo' namespace={namespace} />\n </AppLink>\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\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\nimport { SearchResultsRequestVideo } from '../search-results-request-video/SearchResultsRequestVideo';\n\nconst namespace = 'search.searchResultsEmptyStateV2';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SearchResultsEmptyStateProps {\n query?: string;\n scotland?: boolean;\n hideRequestVideo?: 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 className='w-50 m-0'>\n <Text phrase='info' />\n <AppLink\n className='info-link'\n appLink={{ application: AppChannels.SUBJECT, action: Actions.Subjects.PRESENTATION_TOPICS }}\n >\n <Text phrase='topicsAppLink' />\n </AppLink>\n </EmptyState.Info>\n </EmptyState>\n \n {!props.hideRequestVideo &&\n <SearchResultsRequestVideo description={getPhrase('requestVideoInfo')} />\n }\n </LanguageNamespaceContext.Provider>\n );\n}","import { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { SourceFilterOptions, TypeFilterOptions } from 'libs/shared/apps/search/interfaces';\nimport { WidgetFilter } from 'libs/shared/apps/search/interfaces/WidgetSearchResults';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { BaseObject } from 'libs/shared/interfaces';\n\ninterface HasQueryParamOptions {\n queryParams: HashObject;\n key: string;\n value: string;\n}\n\nconst SupportedSearchWidgetTypeIds: WidgetTypeId[] = [\n WidgetTypeId.SearchRelevantTopics,\n WidgetTypeId.SearchCompanies,\n WidgetTypeId.SearchPlaylists,\n WidgetTypeId.SearchSeries,\n WidgetTypeId.SearchTopResults,\n WidgetTypeId.SearchMyVideos,\n WidgetTypeId.SearchMyVideosFolder,\n WidgetTypeId.SearchMySchoolLibraryVideos,\n WidgetTypeId.SearchMySchoolLibraryFolder,\n WidgetTypeId.SearchExchangeArchive,\n WidgetTypeId.SearchRelatedResults,\n WidgetTypeId.SearchCurriculumCode\n];\n\nfunction hasQueryParam(options: HasQueryParamOptions) {\n const targetParam = options.queryParams?.[options.key];\n \n if (typeof targetParam === 'string') {\n return targetParam === options.value;\n }\n\n if (!Array.isArray(targetParam)) {\n return false;\n }\n\n return targetParam.includes(options.value);\n}\n\nexport interface CursorContext {\n cursor: string;\n widgetTypeId: WidgetTypeId;\n}\n\n/**\n * The `cursor` param is a stringified object with `CursorContext` type\n */\nfunction getCursorContext(cursor: string): CursorContext {\n if (!cursor || !cursor.length)\n return;\n \n let context: CursorContext;\n try {\n const parsed: CursorContext = JSON.parse(cursor);\n\n if (!parsed.cursor || !parsed.widgetTypeId)\n return;\n\n if (!SupportedSearchWidgetTypeIds.includes(parsed.widgetTypeId))\n return;\n\n context = parsed;\n } catch {\n return;\n }\n\n return context;\n}\n\nfunction getValidFocusedWidget(queryParams: HashObject): WidgetTypeId {\n if (!queryParams?.focus)\n return;\n\n if (typeof queryParams.focus === 'string') {\n return SupportedSearchWidgetTypeIds.find(w => w === queryParams.focus);\n }\n\n if (Array.isArray(queryParams.focus) && queryParams.focus.length === 1) {\n return SupportedSearchWidgetTypeIds.find(w => w === queryParams.focus[0]);\n }\n\n return;\n}\n\nfunction getWidgetIdsFromQueryParams(queryParams: HashObject): WidgetTypeId[] {\n const widgets: WidgetTypeId[] = [];\n\n const focusedWidget = getValidFocusedWidget(queryParams);\n\n if (focusedWidget) {\n return [ focusedWidget, WidgetTypeId.SearchTags ];\n }\n \n if (hasQueryParam({ key: 'type', value: TypeFilterOptions.Classification, queryParams })) {\n widgets.push(WidgetTypeId.SearchRelevantTopics);\n }\n \n if (hasQueryParam({ key: 'type', value: TypeFilterOptions.Company, queryParams })) {\n widgets.push(WidgetTypeId.SearchCompanies);\n }\n \n if (hasQueryParam({ key: 'type', value: TypeFilterOptions.Series, queryParams })) {\n widgets.push(WidgetTypeId.SearchSeries);\n }\n \n if (hasQueryParam({ key: 'type', value: TypeFilterOptions.Playlist, queryParams })) {\n widgets.push(WidgetTypeId.SearchPlaylists);\n }\n\n if (hasQueryParam({ key: 'type', value: TypeFilterOptions.Category, queryParams })) {\n widgets.push(WidgetTypeId.SearchMySchoolLibraryFolder, WidgetTypeId.SearchMyVideosFolder);\n }\n \n if (hasQueryParam({ key: 'source', value: SourceFilterOptions.ExchangeArchive, queryParams })) {\n widgets.push(WidgetTypeId.SearchExchangeArchive);\n }\n \n if (hasQueryParam({ key: 'source', value: SourceFilterOptions.MyVideos, queryParams })) {\n widgets.push(WidgetTypeId.SearchMyVideos, WidgetTypeId.SearchMyVideosFolder);\n }\n\n if (hasQueryParam({ key: 'source', value: SourceFilterOptions.ClickView, queryParams })) {\n widgets.push(WidgetTypeId.SearchTopResults, WidgetTypeId.SearchRelatedResults);\n }\n\n if (hasQueryParam({ key: 'source', value: SourceFilterOptions.School, queryParams })) {\n widgets.push(WidgetTypeId.SearchMySchoolLibraryVideos, WidgetTypeId.SearchMySchoolLibraryFolder);\n }\n\n if (hasQueryParam({ key: 'type', value: TypeFilterOptions.Video, queryParams }) ||\n hasQueryParam({ key: 'type', value: TypeFilterOptions.Clip, queryParams }) ||\n hasQueryParam({ key: 'type', value: TypeFilterOptions.Interactive, queryParams })) {\n widgets.push(\n WidgetTypeId.SearchTopResults,\n WidgetTypeId.SearchRelatedResults,\n WidgetTypeId.SearchMySchoolLibraryVideos,\n WidgetTypeId.SearchMyVideos,\n WidgetTypeId.SearchExchangeArchive,\n WidgetTypeId.SearchCurriculumCode\n );\n }\n\n if (widgets.length) {\n widgets.push(WidgetTypeId.SearchTags);\n }\n\n return ArrayHelper.uniq(widgets);\n}\n\nexport const SearchResultsFilterHelper = {\n isOnlyActiveWidget(widgetId: WidgetTypeId, queryParams: HashObject): boolean {\n const targetParam = queryParams?.['focus'];\n \n if (typeof targetParam === 'string')\n return targetParam.toLowerCase() === widgetId.toLowerCase();\n \n if (!Array.isArray(targetParam))\n return false;\n \n if (targetParam.length !== 1)\n return false;\n \n return !!targetParam.find(p => p.toLowerCase() === widgetId.toLowerCase());\n },\n\n getActiveWidgetFilters(\n queryParams: HashObject,\n cursor?: string\n ): WidgetFilter[] {\n const cursorContext = getCursorContext(cursor);\n\n /**\n * Having a cursor context means we will only fetch\n * the specified widget data - this is usually\n * the last widget's cursor from the search response\n */\n if (cursorContext) {\n return [{\n id: cursorContext.widgetTypeId,\n cursor: cursorContext.cursor\n }];\n }\n \n /**\n * We build widget filters based on query params\n */\n const widgets: WidgetTypeId[] = getWidgetIdsFromQueryParams(queryParams);\n \n return widgets.map(w => ({ id: w }));\n },\n\n getSelectedTagOrClassification(queryParams: HashObject): BaseObject[] {\n if (typeof queryParams?.tagOrClassification === 'string')\n return [{ id: queryParams.tagOrClassification, name: queryParams.tagOrClassification }];\n\n if (Array.isArray(queryParams?.tagOrClassification))\n return queryParams.tagOrClassification.map((tag: string) => ({\n id: tag,\n name: tag\n }));\n\n return [];\n },\n\n getSearchWidgetSelectedItems(queryParams: HashObject, widgetTypeId: WidgetTypeId): BaseObject[] {\n if (widgetTypeId !== WidgetTypeId.SearchTags)\n return [];\n\n return SearchResultsFilterHelper.getSelectedTagOrClassification(queryParams);\n }\n};","import React from 'react';\n\nimport { Middleware, type MiddlewareFunctionSync } from 'libs/common/backbone/core';\n\nexport function useTransformer<T>(transformations?: MiddlewareFunctionSync<T>[]) {\n const middleware = React.useMemo(() => new Middleware<T>(), []);\n\n React.useEffect(() => {\n if (!transformations || !transformations.length)\n return;\n\n transformations.forEach(fn => middleware.useSync(fn));\n }, []);\n\n function push(fn: MiddlewareFunctionSync<T>): void {\n if (!middleware)\n return;\n\n middleware.useSync(fn);\n }\n\n function execute(options: T): T {\n if (!middleware)\n return;\n \n return middleware.goSync(options);\n }\n \n return {\n push,\n execute\n };\n}","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { WidgetSearchItem } from 'libs/shared/apps/search/interfaces/WidgetSearchResults';\n\nimport { SearchResultsTransformOptions } from '../../interfaces/SearchResultsTransformOptions';\n\n/**\n * Paginated data returns more widgets so if we dont merge the widget content by widget type id\n * it would add another widget to the page rather than appending content to the relevant\n * search result index\n */\nexport function mergeSearchResults(options: SearchResultsTransformOptions): SearchResultsTransformOptions {\n const { data } = options;\n \n if (!data) return options;\n \n const items = [...data];\n\n const groupedWidgets = ArrayHelper.groupBy(items, 'widgetId');\n\n const mergedWidgets: WidgetSearchItem[] = [];\n\n for (const widgetGroup of Object.values(groupedWidgets)) {\n let currentMergedWidget: WidgetSearchItem = null;\n const widgets: WidgetSearchItem[] = [];\n\n for (const widget of widgetGroup) {\n if (!currentMergedWidget) {\n currentMergedWidget = widget;\n continue;\n }\n\n /**\n * Widgets of the same type may have different templates. When this occurs,\n * we want to make sure each widgetType + template combo is pushed\n * as a separate widget.\n */\n if (widget.templateId !== currentMergedWidget.templateId) {\n widgets.push(currentMergedWidget);\n currentMergedWidget = widget;\n continue;\n }\n\n currentMergedWidget.content.data = [\n ...(currentMergedWidget.content.data || []),\n ...widget.content.data\n ];\n }\n\n widgets.push(currentMergedWidget);\n mergedWidgets.push(...widgets);\n }\n\n return {\n ...options,\n data: mergedWidgets\n };\n}","import { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport type { Classification } from 'libs/shared/interfaces';\nimport { MasterTypeHelper } from 'libs/shared/utils/MasterTypeHelper';\nimport { TopicsHelper } from 'libs/shared/utils/topics-helper/TopicsHelper';\n\nimport type { WidgetSearchItemTransformOptions } from '../../interfaces/WidgetSearchItemTransformOptions';\n\n/**\n * Sort first six Relevant topics widget by Exact matches and then by presentation level \n */\nexport function transformSearchRelevantTopics(\n options: WidgetSearchItemTransformOptions\n): WidgetSearchItemTransformOptions {\n if (options.data.widgetId !== WidgetTypeId.SearchRelevantTopics)\n return options;\n\n function sortByLearningLevel(a: Classification, b: Classification) {\n return TopicsHelper.sortByLearningLevel(a, b, options.availablePresentations);\n }\n\n /**\n * We only want to sort the first 6 items.\n * Anything after that are items added\n * through pagination.\n */\n const relevantTopicsData = options.data.content.data.slice(0, 6);\n const remainingTopicsData = options.data.content.data.slice(6);\n \n const exactMatchSortedTopics: Classification[] = [];\n const remainingSortedTopics: Classification[] = [];\n \n relevantTopicsData.forEach(topic => {\n if (!MasterTypeHelper.isClassification(topic))\n return;\n \n if (topic?.name?.toLowerCase() === options.query.toLowerCase()) {\n exactMatchSortedTopics.push(topic);\n return;\n }\n \n remainingSortedTopics.push(topic);\n });\n \n exactMatchSortedTopics.sort(sortByLearningLevel);\n remainingSortedTopics.sort(sortByLearningLevel);\n \n const sortedItem = {\n ...options.data,\n content: {\n ...options.data.content,\n data: [\n ...exactMatchSortedTopics,\n ...remainingSortedTopics,\n ...remainingTopicsData\n ]\n }\n };\n \n options = {\n ...options,\n data: sortedItem\n };\n\n return options;\n}","import { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\n\nimport type { WidgetSearchItemTransformOptions } from '../../interfaces/WidgetSearchItemTransformOptions';\n\n/**\n * Transform search tag data so that its id is its name\n */\nexport function transformSearchTags(options: WidgetSearchItemTransformOptions): WidgetSearchItemTransformOptions {\n if (options.data.widgetId !== WidgetTypeId.SearchTags)\n return options;\n\n const normalizedItemData = options.data.content.data.map(x => ({\n id: x.name,\n ...x\n }));\n\n options.data = {\n ...options.data,\n content: {\n ...options.data.content,\n data: normalizedItemData\n }\n };\n\n return options;\n}","import { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport { SharedSearchRequests } from 'libs/shared/apps/search/flight-requests/SharedSearchRequests';\nimport { SearchIndices } from 'libs/shared/apps/search/interfaces';\nimport { WidgetFilter, WidgetSearchItem, WidgetSearchResults } from 'libs/shared/apps/search/interfaces/WidgetSearchResults';\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 { Presentation } from 'libs/shared/interfaces';\n\nimport { useVideoMixin } from 'shared/hooks/useVideoMixin';\n\nimport { SearchResultsFilterHelper } from '../../utils/SearchResultsFilterHelper';\nimport { useTransformer } from '../useTransformer';\n\nimport { SearchResultsTransformOptions } from './interfaces/SearchResultsTransformOptions';\nimport { WidgetSearchItemTransformOptions } from './interfaces/WidgetSearchItemTransformOptions';\nimport { mergeSearchResults } from './transformations/results/mergeSearchResults';\nimport { transformSearchRelevantTopics } from './transformations/widget-item/transformSearchRelevantTopics';\nimport { transformSearchTags } from './transformations/widget-item/transformSearchTags';\n\ninterface UseGetSearchResultsOptionsV2 {\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 availablePresentations: Presentation[];\n}\n\nconst namespace = 'search.useGetSearchResultsV2';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function useGetSearchResultsV2(options: UseGetSearchResultsOptionsV2) {\n const { queryParams, appliedIndices, backendFilters } = options;\n\n const fetch = Flight.useGetFetch();\n const alerts = useAlerts();\n\n const searchResultsTransformer = useTransformer<SearchResultsTransformOptions>([\n mergeSearchResults\n ]);\n \n const widgetItemTransformer = useTransformer<WidgetSearchItemTransformOptions>([\n transformSearchTags,\n transformSearchRelevantTopics\n ]);\n\n /**\n * Apply tranformations to the search response\n */\n function transformSearchResults(data: WidgetSearchItem[]): WidgetSearchItem[] {\n if (!data || !data.length)\n return data;\n\n const searchResults = searchResultsTransformer.execute({ data });\n \n return searchResults.data.map(item => {\n const transformOptions: WidgetSearchItemTransformOptions = {\n data: item,\n availablePresentations: options.availablePresentations,\n query: options.queryParams?.query || ''\n };\n\n const transformed = widgetItemTransformer.execute(transformOptions);\n\n return transformed.data;\n }, [] as WidgetSearchItem[]);\n }\n\n function getDataFromResponse() {\n if (searchResults.isFetching || !items?.length)\n return [];\n\n return items.reduce((outer, widget) => {\n return widget.content.data.reduce((inner, video) => ([ ...inner, video ]), outer);\n }, []);\n }\n\n function getSearchRequest(cursor?: string): Flight.Request {\n if (!options.hasDataLoaded || !appliedIndices?.length) return;\n\n const widgetsFilter: WidgetFilter[] =\n SearchResultsFilterHelper.getActiveWidgetFilters(queryParams, cursor);\n\n return SharedSearchRequests.searchV5(\n queryParams.query,\n backendFilters,\n widgetsFilter\n );\n }\n\n function fetchNext(cursor?: string) {\n return 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(getPhrase('error'));\n }\n\n /**\n * Gets the widget cursor and widgetTypeId.\n * The returned string is a stringified object of\n * those both.\n */\n function getCursor(response: WidgetSearchResults): string {\n const responseWidgets = [...response.widgets];\n\n if (!responseWidgets.length) {\n return;\n }\n\n const lastWidget = ArrayHelper.last(responseWidgets);\n\n if (lastWidget?.content?.cursor) {\n const cursorContext = {\n widgetTypeId: lastWidget.widgetId,\n cursor: lastWidget?.content?.cursor\n };\n return JSON.stringify(cursorContext);\n }\n\n return;\n }\n\n const searchResults = useInfiniteList<WidgetSearchItem, WidgetSearchResults>(\n getSearchRequest,\n fetchNext,\n onError,\n data => data.widgets,\n getCursor\n );\n\n const items = transformSearchResults(searchResults.items);\n \n const objects = getDataFromResponse();\n useVideoMixin(objects);\n\n return {\n ...searchResults,\n items,\n fetchNext\n };\n}","import { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { MixedWidgetSearchResultsProps } from 'libs/shared/apps/search/components/mixed-widget-search-results/MixedWidgetSearchResults';\nimport { WidgetSearchItem } from 'libs/shared/apps/search/interfaces/WidgetSearchResults';\nimport { WidgetTypeIdConfig } from 'libs/shared/constants/WidgetTypeIdConfig';\nimport type { AudienceFilterParams, BaseObject, Classification, Company, Folder, GetClassificationAppLinkOptions, Playlist, VideoTypes } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { TopicsHelper } from 'libs/shared/utils/topics-helper/TopicsHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { ClassificationAppLinkHelper } from 'shared/utils/ClassificationAppLinkHelper';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { getFolderAppLink } from 'apps/libraries/views/library-folder/LibraryFolderViewUtils';\nimport { SeriesAppLinkHelper } from 'apps/series/SeriesAppLinkHelper';\n\nimport { SearchResultsFilterHelper } from './SearchResultsFilterHelper';\n\ninterface GetSeeMoreAppLinkOptions {\n appLinks: MixedWidgetSearchResultsProps['widgetAppLinks'];\n widget: WidgetSearchItem;\n queryParams: HashObject;\n data: WidgetSearchItem[];\n}\n\nfunction hasMoreContent(widget: WidgetSearchItem): boolean {\n return !!widget.content.cursor;\n}\n\nexport const SearchResultsAppLinkHelper = {\n getSearchWidgetAppLinks(\n queryParams: HashObject,\n audienceParams: AudienceFilterParams = {}\n ): MixedWidgetSearchResultsProps['widgetAppLinks'] {\n return {\n classification: (classification?: Classification) => {\n const options: GetClassificationAppLinkOptions = {\n ...audienceParams,\n moviesAndTv: TopicsHelper.isMtv(classification)\n };\n\n return ClassificationAppLinkHelper.getAppLink(classification, options);\n },\n \n videoType: (video: VideoTypes, opts: GetVideoAppLinkOptions) => (\n VideoAppLinkHelper.getAppLink(video, {\n ...opts,\n includeContext: false\n })\n ),\n \n series: SeriesAppLinkHelper.getSeriesAppLink,\n \n playlist: (playlist: Playlist) => ({\n application: AppChannels.PLAYLISTS,\n action: Actions.Playlists.PLAYLIST,\n args: [ playlist.id, TextHelper.slugify(playlist.name) ]\n }),\n \n \n company: (company: Company) => ({\n application: AppChannels.MOVIES_AND_TV,\n action: Actions.MoviesAndTv.COMPANY_DASHBOARD,\n args: [ company.id, TextHelper.slugify(company.name) ]\n }),\n \n folder: (folder: Folder, opts?: {libraryId?: string}) => {\n if (!opts?.libraryId) {\n return {\n application: AppChannels.MY_VIDEOS,\n action: Actions.MyVideos.MY_VIDEOS_FOLDER,\n args: [ folder.id, TextHelper.slugify(folder.name) ]\n };\n }\n \n return getFolderAppLink(opts?.libraryId, folder, null);\n },\n \n searchSettings: () => ({\n application: AppChannels.SETTINGS,\n action: Actions.Settings.SEARCH_SETTINGS\n }),\n \n searchHome: (filterParams?: HashObject, options?: {replace: boolean}) => {\n let params: HashObject = { ...filterParams };\n \n if (!options?.replace) {\n params = {\n ...queryParams,\n ...params\n };\n }\n \n return ({\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n // This empty args array needs to be here otherwise FixedWidget will try to\n // populate it with some junk that'll break the query params.\n // This is tech debt that needs to be cleaned up.\n args: [],\n params\n });\n },\n\n tag: (tag: BaseObject) => {\n let tagOrClassification: string[] =\n SearchResultsFilterHelper.getSelectedTagOrClassification(queryParams).map(x => x.name);\n \n if (tagOrClassification.includes(tag.name)) {\n tagOrClassification = tagOrClassification.filter(x => x !== tag.name);\n } else {\n tagOrClassification.push(tag.name);\n }\n\n return ({\n action: Actions.Search.HOME,\n application: AppChannels.SEARCH,\n params: {\n ...queryParams,\n tagOrClassification\n }\n });\n }\n };\n },\n \n getSeeMoreAppLink(options: GetSeeMoreAppLinkOptions): Core.AppLink {\n if (!hasMoreContent(options.widget))\n return;\n \n const getAppLinkFunc = WidgetTypeIdConfig[options.widget.widgetId]?.getCollectionAppLink;\n \n if (!getAppLinkFunc || SearchResultsFilterHelper.isOnlyActiveWidget(options.widget.widgetId, options.queryParams))\n return;\n \n /**\n * If its the only widget search result item rendered we infinitely\n * load the widget (if we can) therefore we need to hide 'See all' applink\n * - Nish\n */\n if (options.data.length === 1 && options.data[0].widgetId === options.widget.widgetId)\n return;\n \n return getAppLinkFunc(options.appLinks);\n }\n};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { StorageType } from 'libs/common/backbone/utils/LocalStorageHelper';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { EntityType, HashObject, LocationContext } from 'libs/analytics/interfaces';\n\nimport { MixedWidgetSearchResults } from 'libs/shared/apps/search/components/mixed-widget-search-results/MixedWidgetSearchResults';\nimport { SearchFilters } from 'libs/shared/apps/search/components/search-filters/SearchFilters';\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { ContentRegion } from 'libs/shared/enums/ContentRegion';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { PresentationAudience } from 'libs/shared/interfaces';\nimport { AudienceHelper } from 'libs/shared/utils/audience-helper/AudienceHelper';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { useCommonVideoProps } from 'shared/hooks/useCommonVideoProps';\n\nimport { useIsTertiary } from 'apps/onboarding/hooks/useIsTertiary';\nimport { useFetchSearchDataV2 } from 'apps/search/hooks/useFetchSearchData';\nimport { useSearchMask } from 'apps/search/hooks/useSearchMask';\nimport { SearchHelper } from 'apps/search/utils';\n\nimport { PartialSearchResults } from './components/partial-loading/PartialSearchResults';\nimport { SearchResultsEmptyState } from './components/search-results-empty-state/SearchResultsEmptyState';\nimport { SearchResultsRequestVideo } from './components/search-results-request-video/SearchResultsRequestVideo';\nimport { useGetSearchResultsV2 } from './hooks/use-get-search-results/useGetSearchResultsV2';\nimport { useCurriculumCodeSearch } from './hooks/useCurriculumCodeSearch';\nimport { SearchResultsAppLinkHelper } from './utils/SearchResultsAppLinkHelper';\nimport { SearchResultsFilterHelper } from './utils/SearchResultsFilterHelper';\n\nexport const namespace = 'search.searchResultsV2';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SearchResultsViewV2Props {\n queryParams: HashObject\n}\n\nexport function SearchResultsViewV2(props: SearchResultsViewV2Props): JSX.Element {\n const { queryParams = {} } = props;\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 const [activeAudiences] = useViewModel<PresentationAudience[]>(\n SharedViewModelKeys.AUDIENCE_FILTER,\n undefined,\n { storage: StorageType.SessionStorage }\n );\n\n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem });\n const { commonVideoProps } = useCommonVideoProps({\n locationContext: LocationContext.VideoThumbnail,\n mtv: queryParams.moviesAndTv\n });\n const isTertiary = useIsTertiary();\n\n /**\n * Data required for search view to render\n */\n const searchData = useFetchSearchDataV2(queryParams);\n\n /**\n * Filters to be applied globally or on indices\n */\n const searchFilters = SearchHelper.getBackendFiltersV2(searchData);\n\n /**\n * Actually fetch the search results with the filters\n */\n const searchResults = useGetSearchResultsV2({ ...searchFilters, ...searchData });\n\n /**\n * Update the search bar UI when we detect that a curriculum code has been searched for\n */\n useCurriculumCodeSearch(searchResults, queryParams);\n\n /**\n * State of the current filters\n */\n const filters = SearchHelper.getFilters({\n data: searchData,\n inaccessibleIndices: searchFilters?.inaccessibleIndices,\n _hasNewSearch: true\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 !!filters\n );\n\n /**\n * Do we actually have results\n */\n const hasResults = (\n searchResults.items?.length\n );\n\n const hideDivider = (\n (!searchResults.hasFirstPageCompleted && searchResults.isFetching) ||\n (hasResults && !!searchResults.items.find(item => item.widgetId === WidgetTypeId.SearchTags))\n );\n\n const widgetAppLinks = SearchResultsAppLinkHelper.getSearchWidgetAppLinks(\n queryParams,\n AudienceHelper.getAudienceParams(activeAudiences)\n );\n \n useSearchMask(hasSearchCompleted);\n\n if (!hasLoaded)\n return <></>;\n\n return (\n <div className='px-4'>\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 hideDivider={hideDivider}\n _hasNewSearch\n />\n )}\n\n {(() => {\n if (!searchResults.hasFirstPageCompleted && searchResults.isFetching) {\n return <PartialSearchResults />;\n }\n\n if (!hasResults) {\n return (\n <SearchResultsEmptyState\n query={queryParams.query}\n scotland={searchData.currentUser.data?.contentRegion === ContentRegion.SCOT}\n hideRequestVideo={searchData.isLearner}\n />\n );\n }\n\n return (\n <section>\n <VideoActionsContext.Provider value={videoActions}>\n <MixedWidgetSearchResults\n data={searchResults.items}\n widgetAppLinks={widgetAppLinks}\n audiences={searchData.audiences.data}\n availablePresentations={searchData.availablePresentations}\n currentUser={searchData.currentUser.data}\n isTertiary={isTertiary}\n \n getSeeMoreLink={widget => SearchResultsAppLinkHelper.getSeeMoreAppLink({\n widget,\n queryParams,\n data: searchResults.items,\n appLinks: widgetAppLinks\n })}\n hasPermissions={searchData.hasPermissions}\n hasLocalPermissions={searchData.hasLocalPermissions}\n commonVideoProps={commonVideoProps}\n getAnalyticsData={(widget, yIndex, xIndex) => ({\n widgetId: widget.widgetId,\n widgetName: widget.name,\n templateId: widget.templateId,\n widgetIndex: yIndex,\n itemIndex: xIndex,\n search: {\n query: queryParams.query || ''\n }\n })}\n getSelectedItems={widget =>\n SearchResultsFilterHelper.getSearchWidgetSelectedItems(queryParams, widget)\n }\n />\n \n {(!searchData.isLearner && !searchResults.isFetching && !searchResults.nextCursor) &&\n <SearchResultsRequestVideo />\n }\n \n {(searchResults.hasMore || searchResults.isFetching) &&\n <InfiniteScrollFooter\n isFetching={searchResults.isFetching}\n fetchNext={searchResults.fetchNext}\n nextCursor={searchResults.nextCursor}\n fetchOnScroll={true}\n />\n }\n </VideoActionsContext.Provider>\n </section>\n );\n })()}\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { SEARCH_CURRICULUM_CODE_PARAM } from 'libs/shared/apps/search/utils/SharedSearchHelper';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\n\nimport { useGetSearchResultsV2 } from './use-get-search-results/useGetSearchResultsV2';\n\nexport function useCurriculumCodeSearch(\n searchResults: ReturnType<typeof useGetSearchResultsV2>,\n queryParams: HashObject\n) {\n React.useEffect(() => {\n if (!searchResults.hasFirstPageCompleted)\n return;\n \n const curriculumCodeWidget = searchResults.items.find(widget => {\n return widget.widgetId === WidgetTypeId.SearchCurriculumCode;\n });\n \n const hasSearchedCode = !!curriculumCodeWidget?.content?.name && !!curriculumCodeWidget?.content?.description;\n \n if (queryParams?.[SEARCH_CURRICULUM_CODE_PARAM] && !hasSearchedCode) {\n Core.AppLinkHelper.trigger({\n ...Core.AppLinkHelper.getCurrentAppLink(),\n params: {\n ...((Core.AppLinkHelper.getCurrentAppLink().params || {}) as HashObject),\n [SEARCH_CURRICULUM_CODE_PARAM]: undefined\n }\n }, { replace: true });\n return;\n }\n \n if (!queryParams?.[SEARCH_CURRICULUM_CODE_PARAM] && hasSearchedCode) {\n Core.AppLinkHelper.trigger({\n ...Core.AppLinkHelper.getCurrentAppLink(),\n params: {\n ...((Core.AppLinkHelper.getCurrentAppLink().params || {}) as HashObject),\n [SEARCH_CURRICULUM_CODE_PARAM]: true\n }\n }, { replace: true });\n }\n }, [searchResults.hasFirstPageCompleted]);\n}","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { useSettings } from 'libs/shared/hooks/useSettings';\n\nimport { SearchResultsView } from '../search-results/SearchResultsView';\nimport { SearchResultsViewV2 } from '../search-results-v2/SearchResultsViewV2';\n\ninterface SearchResultsView2Props {\n queryParams: HashObject;\n}\n\n/**\n * Staging View until we migrate to new search results page completely\n */\n// eslint-disable-next-line rulesdir/require-view-title\nexport function LiteSearchResultsView(props: SearchResultsView2Props): JSX.Element {\n const { queryParams = {} } = props;\n\n const { hasNewSearch } = useSettings(null);\n\n if (hasNewSearch) {\n return <SearchResultsViewV2 queryParams={queryParams} />;\n }\n\n return <SearchResultsView queryParams={queryParams} />;\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 { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useGrowingBatchFetch } from 'libs/shared/hooks/UseBatchFetch';\nimport { Clip, ClipCollection, Video, VideoCollection } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\ntype Types = Video[] | VideoCollection | Clip[] | ClipCollection;\n\nfunction getValidObjects(objects: Types): (Video | Clip)[] {\n if (!objects)\n return [];\n\n if (Array.isArray(objects))\n return objects.filter(o => !!o && (VideoHelper.isVideo(o) || VideoHelper.isClip(o)));\n\n if ('data' in objects)\n return objects.data.filter(o => !!o && (VideoHelper.isVideo(o) || VideoHelper.isClip(o)));\n\n return [];\n}\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(objects: Types, options: VideoMixinOptions = {}): void {\n const videoIds = getValidObjects(objects).map(v => v.id);\n\n useGrowingBatchFetch(videoIds, ids => VideoRequests.videoMixinAssocs(ids, options.flightNamespace));\n}"],"names":["CHUNK_SIZE","useBatchFetch","itemIds","getRequest","requests","map","chunk","responses","itemsArr","data","items","length","reduce","acc","item","id","isFetching","useGrowingBatchFetch","objs","_getKey","getKey","obj","fetchedItems","Set","setRequests","unfetchedItems","forEach","key","current","has","push","add","r","hasFirstRequestCompleted","hasCompleted","SCROLL_TOLERANCE","useInfiniteList","fetchNext","onError","getItems","getCursor","scrollContainer","options","handleScroll","useState","pagesFetched","setPagesFetched","fetchNextFn","response","cursor","request","fetchNextPage","currentVal","nextCursor","hasMore","getBoundingClientRect","height","scrollTop","scrollHeight","window","innerHeight","document","documentElement","useEffect","onScroll","FunctionHelper","addEventListener","removeEventListener","shouldInitialFetch","statusCode","httpStatusClass","toString","substr","HttpStatus","totalItems","hasFirstPageCompleted","FeedbackOption","getFolderAppLink","libraryId","folder","sort","application","action","args","name","params","getFolderBgColourClass","charCode","i","charCodeAt","CompanyWidgetItem","props","analyticsData","analyticsOptions","location","actionType","entity","descriptor","CoverPill","coverUrl","logo","url","coverBgColor","metadata","colour","CompanyResult","Col","as","sm","md","useLargeStyle","lg","className","getChildAppLink","appLinks","getCompanyAppLink","getChildAppLinkOptions","getCompanyAppLinkOptions","itemIndex","search","query","queryParams","score","_score","maxScore","_maxScore","featured","_featured","pagePositionIndex","isLarge","namespace","ExchangeVideoGroup","limit","showCount","currentAppLink","currentParams","currentSource","source","Array","isArray","searchAppLink","AppLink","appLink","Text","phrase","searchSettings","videos","slice","v","VideoItem","video","getVideoAppLink","presentationAudiences","audiences","hasPermissions","commonVideoProps","FeaturedVideoResult","HeroVideo","opts","hideInteractiveBadge","showVideoGuidance","VideoHelper","PlaylistWithVideos","breakpoints","maxVideos","useBreakpoints","xl","xxl","playlist","playlistAnalyticsOption","playlistAnalyticsData","Row","xs","playlistAppLink","bgColourClassNames","itemStyle","imageCdnUrl","currentUser","showOwner","videoAnalyticsData","videoId","videoName","size","hideVideoGuidance","LargePlaylistResult","getPlaylistAppLink","preloadImage","SeriesWithVideos","series","seriesAnalyticsOption","seriesAnalyticsData","seriesAppLink","SeriesTallPoster","imageClass","LargeSeriesResult","getSeriesAppLink","CollectionVideoList","analyticsProps","hasSeasonEpisode","episodeNumber","season","collectionId","CollectionThumbnail","isSmall","VideoListHelper","hasVideos","collection","firstVideoWithThumbnail","find","thumbnail","isSeries","collectionType","BaseImage","imageType","Mask","type","maskType","ImageFallback","imageFallbackType","isPlugin","Actions","actions","getCollectionActions","showActions","actionsDropdownClassName","hideBadges","BadgeListContainer","Badge","rating","year","SmallPlaylistResult","SmallSeriesResult","SubjectResult","getClassificationAppLink","getClassificationAppLinkOptions","availablePresentations","highlightOnHover","showNewVideoIndicator","VideoResult","Component","ClipItem","InteractiveItem","getPreviewQuestionsAppLink","MixedSearchResults","useSmallComponent","results","topics","totalResults","companies","companiesAndTopics","childProps","role","c","toLowerCase","result","index","isExchangeVideoGroup","tallPoster","SearchSubstitute","substitute","getAppLink","appLinkOptions","replace","allowSubstitute","SearchSuggestions","suggestions","suggestion","defaultProps","useFetchSchoolLevels","presentation","isLearner","usePermissions","PermissionName","usePresentation","hasPresentationsLoaded","presentationIds","o","SearchRequests","SearchOGQL","classification","TagType","clip","interactive","company","category","formatSearchResponse","filter","_index","clips","interactives","resultMaxScore","SharedSearchHelper","stringifyObject","Object","entries","prev","value","stringifiedValue","includes","searchV5","filters","widgets","widgetData","w","filterData","FilterConstants","indicesFilter","genericFilters","indices","includeAllIndices","ogql","publicUrl","HttpVerbs","searchV4","indicesArr","keys","filterName","join","excludeLibraryExclusive","searchType","undefined","formatData","success","error","assign","UrlHelper","tagsAndClassifications","normalize","TEACHER_FILTERS","STUDENT_FILTERS","useGetLibraries","UserRequests","products","settings","useSettings","streamableLibrary","LibraryRequests","streamableLibraryId","objectId","showExchangeSearchResults","hasProduct","ProductId","librariesRequest","isAuthenticated","libraries","exchangeLibraryIndex","findIndex","l","MasterObjectTypes","exchangeLibraryId","streamableIndex","hasLibrariesCompleted","useGetRatings","ratings","RatingRequests","countryCode","activePresentation","getFallbackPresentation","currentPresentation","TopicsHelper","learningLevel","PresentationLearningLevel","code","useFetchSearchData","userDetails","config","ConfigRequests","yearGroups","CustomerRequests","customerId","currentPresentationId","curriculums","useCurriculums","usePresentationAudiences","schoolLevels","schoolLevelIds","availableTopics","ClassificationRequests","hasLocalPermissions","canUseSeriesActions","hasCustomLibraries","hasMoviesAndTv","presentationId","isStudent","rawFilters","FilterHelper","ClassificationType","ClassificationStatus","moviesAndTv","CurationTag","presentationMap","hasFilteredOutTopics","shouldFetch","sortedResults","a","b","presentationA","presentationB","useSearchTopics","availablePresentationIds","p","hasFilteredOutCompanies","useSearchCompanies","moviesAndTvDashboard","targetType","dashboard","hasDataLoaded","isLoadingProducts","isLoadingSettings","useGetSearchResults","appliedIndices","backendFilters","alerts","fetch","searchResultsResponse","getSearchRequest","hasExchangeLibraryFilter","some","hasLibraryFilter","fetchMixedExchangeResults","mixedExchangeSearchResults","excludeLibraryFilter","searchResults","pageNumber","httpStatus","LanguageService","useVideoMixin","groupingType","exchangeIndex","exchangeShowCount","mixedExchangeResults","exchangeResults","consecutive","typeId","MasterType","exchangeVideoGroup","splice","useGroupExchangeResults","substituteQuery","useSearchMask","showMask","setShowMask","SearchResultsEmptyState","imageUrl","scotland","trim","ImageUrls","EmptyState","src","getPhrase","SearchResultsView","videoActions","useVideoActions","useCommonVideoProps","locationContext","mtv","searchData","searchFilters","hasIndices","inaccessibleIndices","useSetPageMetadata","PageMetadataHelper","title","phraseContext","phraseHandler","titlePhrase","descriptionPhrase","allowIndexing","hasLoaded","hasSearchCompleted","hasResults","SearchFilters","mainFilters","moreFilters","isFetchingOptions","VideoActionsContext","description","InfiniteScrollFooter","fetchOnScroll","SearchWidgetTooltip","widgetId","isTertiary","WidgetTypeId","SvgContainer","svgName","tooltipPlacement","tooltipSpanHack","tooltipSpanHackClassName","getName","widget","getWidgetMetadata","curriculumLeafName","content","curriculumLeafDescription","MixedWidgetSearchResults","idx","WidgetContainerView","widgetCollection","widgetIndex","templateId","widgetTypeId","widgetAppLinks","seeMoreLink","getSeeMoreLink","getAnalyticsData","xIndex","badgeComponent","getSelectedItems","isPreviewing","onClickRemoveItem","PartialSearchResults","PartialTagSlidingListWidgetTemplate","hideDescription","PartialWidgetHeader","PartialThumbnailVerticalListWidgetTemplate","PartialThumbnailFixedListMediaSmallWidgetTemplate","SearchResultsRequestVideo","skipBeforeRequestingVideoStep","selectedOption","hideRequestVideo","SupportedSearchWidgetTypeIds","hasQueryParam","targetParam","SearchResultsFilterHelper","isOnlyActiveWidget","getActiveWidgetFilters","cursorContext","context","parsed","JSON","parse","getCursorContext","focusedWidget","focus","getValidFocusedWidget","ArrayHelper","getWidgetIdsFromQueryParams","getSelectedTagOrClassification","tagOrClassification","tag","getSearchWidgetSelectedItems","useTransformer","transformations","middleware","fn","useSync","execute","goSync","mergeSearchResults","groupedWidgets","mergedWidgets","values","currentMergedWidget","transformSearchRelevantTopics","sortByLearningLevel","relevantTopicsData","remainingTopicsData","exactMatchSortedTopics","remainingSortedTopics","topic","MasterTypeHelper","sortedItem","transformSearchTags","normalizedItemData","x","SearchResultsAppLinkHelper","getSearchWidgetAppLinks","audienceParams","ClassificationAppLinkHelper","videoType","VideoAppLinkHelper","includeContext","SeriesAppLinkHelper","TextHelper","searchHome","filterParams","getSeeMoreAppLink","getAppLinkFunc","WidgetTypeIdConfig","getCollectionAppLink","SearchResultsViewV2","activeAudiences","SharedViewModelKeys","storage","useIsTertiary","useFetchSearchDataV2","searchResultsTransformer","widgetItemTransformer","widgetsFilter","responseWidgets","lastWidget","stringify","transformOptions","objects","outer","inner","useGetSearchResultsV2","curriculumCodeWidget","hasSearchedCode","useCurriculumCodeSearch","_hasNewSearch","hideDivider","AudienceHelper","yIndex","widgetName","contentRegion","ContentRegion","LiteSearchResultsView","hasNewSearch","redirectOnError","videoIds","getValidObjects","ids","flightNamespace"],"sourceRoot":""}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[7601],{5798:(e,t,n)=>{n.d(t,{b:()=>l});var a=n(32735);const r={globalIdpButton:"tAlj0",globalIdpImage:"O94yo"};function i(e){var t=e.idp,n=e.onClick,i=e.backgroundColour,c=void 0===i?"F8981D":i,l=e.foregroundColour,o=void 0===l?"FFF":l,u=e.last,s=e.isGlobalIdp,d=u?"":"mb-3",m={backgroundColor:"#".concat(t.backgroundColour||c),color:"#".concat(t.foregroundColour||o)},p=s?"btn btn-lg btn-outline-dark w-100 ".concat(d," ").concat(r.globalIdpButton):"btn btn-lg w-100 ".concat(d),g=s?{}:m,b=s?"Continue with ".concat(t.name):t.name;return a.createElement("button",{className:p,style:g,onClick:function(){return n(t)}},s&&t.logoUrl&&a.createElement("img",{src:t.logoUrl,className:r.globalIdpImage,alt:"".concat(t.name," logo")}),b)}const c={divider:"FfyN0"};function l(e){var t;if(!(null===(t=e.idps)||void 0===t?void 0:t.length))return a.createElement(a.Fragment,null);function n(t){var n=window.location.pathname+window.location.search,a="/challenge?idp=".concat(t.id)+"&redirectUrl="+encodeURIComponent(n);"attribution"in e&&(a+="&attribution="+encodeURIComponent(e.attribution)),window.location.href=a}return a.createElement("div",{className:"".concat(e.className?e.className:"")},a.createElement("div",{className:"my-3 border-bottom position-relative ".concat(c.divider)}),e.idps.map((function(t,r){return a.createElement(i,{key:r,idp:t,onClick:"onClick"in e?e.onClick:n,attribution:"attribution"in e?e.attribution:null,isGlobalIdp:!0})})))}},53475:(e,t,n)=>{n.d(t,{N:()=>a});var a={globalIdps:function(e,t){return{url:"{gateway}/v1/auth/identity-providers?countryCode=".concat(e,"&product=").concat(t),key:"global:idps"}}}},48015:(e,t,n)=>{n.d(t,{M:()=>l});var a=n(39202),r=n(20354),i=n(39151),c={countryCode:"us",isFallback:!0};function l(){var e,t,n=r.a.useBasicFetch(i.L.geoLocation()),l=null===(t=null===(e=a.Ab.GetQuery())||void 0===e?void 0:e.countryCode)||void 0===t?void 0:t.toLowerCase();return l?{countryCode:l}:n.hasCompleted&&!n.data?c:n.data}},19623:(e,t,n)=>{n.d(t,{P:()=>g});var a=n(32735),r=n(81886),i=n(23481),c=n(5798),l=n(98027),o=n(15611),u=n(83345),s=n(14070),d=n(97291),m="launchpad.signInButtons",p=i.T.encloseNamespace(m);function g(e){a.useEffect((function(){e.skipPrompt&&r.Q.Ab.PageLoad(r.Q.C$.getHref(t))}),[]);var t=function(){var t=r.Q.Ab.GetQuery(),n={};if(e.customerId&&(n.customerId=e.customerId,delete t.customerId),e.skipPrompt&&delete t.skipPrompt,e.redirectUrl)n.redirectUrl=e.redirectUrl;else{var a=r.Q.Ab.SerializeQueryParams(t);n.redirectUrl=r.Q.Ab.GetCurrentPath()+(a?"?"+a:"")}return e.showSignUp&&(n.showSignUp=!0),{application:d.O.DEFAULT,action:s.e.Default.CHALLENGE,params:n}}();return a.createElement(a.Fragment,null,a.createElement(o.F,{className:"btn btn-lg btn-dark w-100 mt-4",appLink:t},a.createElement(u.x,{namespace:m,phrase:e.pageAppLinkString?"signInToWatch":"signIn"})),e.showJoinCode?a.createElement(o.F,{className:"btn btn-link info-link btn-lg w-100 mt-2",appLink:{application:d.O.LAUNCHPAD,action:s.e.Launchpad.JOIN_CLASSROOM_PROMPT}},p("enterCode")):a.createElement(a.Fragment,null,a.createElement(o.F,{className:"btn btn-lg btn-outline-dark w-100 mt-3",appLink:{application:d.O.LAUNCHPAD,action:s.e.SignUp.SIGN_UP,params:{pageAppLinkString:e.pageAppLinkString}}},p("signUp")),a.createElement(c.b,{idps:e.globalIdps,attribution:(0,l.w)()})))}},77601:(e,t,n)=>{n.r(t),n.d(t,{ShareLinkSignInView:()=>E});var a=n(32735),r=n(23481),i=n(20354),c=n(65858),l=n(64249),o=n(2786),u=n(26339),s=n(4594),d=n(12754),m=n(53475),p=n(48015),g=n(97027),b=n(7179),f=n(19623),h=n(75608),v=n(408);const y={logo:"Nbzoq",container:"hKyDn"};var C="launchpad.shareLinkSignIn";function E(e){var t=e.shareId,n=e.redirectUrl,E=e.customerId,I=(0,h.a)(t),k=(0,b.P)(function(e,t){return{id:null==t?void 0:t.id,app:(0,b.e)(null==t?void 0:t.typeId),shareId:e}}(t,I),c.LZ.Launchpad),U=k.deepLink,P=k.showDeepLink,L=k.onClickDeepLink,w=(0,v.B)().trialAppLinkString,N=(0,p.M)(),S=i.a.useBasicFetch((null==N?void 0:N.countryCode)&&m.N.globalIdps(N.countryCode,d.x.Primary));return I&&S.hasCompleted?a.createElement(g.Zf,{title:I.name,imageUrl:l.I.getImageUrl(I),objectType:I.typeId,links:[{text:r.T.getPhrase(C,"openInApp"),url:U,hide:!P,onClick:L}]},a.createElement("div",{className:"".concat(y.container," m-auto")},a.createElement("div",{className:"".concat(y.logo," mb-4 mx-auto")},a.createElement(o.$S,null)),!!I.name&&a.createElement("h1",{className:"h3"},I.typeId===s.E.Video&&a.createElement(u.$,{type:"series",video:I,analyticsOptions:{},size:"sm"}),I.name),"description"in I&&a.createElement("p",{className:"mb-0 clamp-3"},I.description),a.createElement(f.P,{globalIdps:S.data,customerId:E,redirectUrl:n,skipPrompt:!1,showJoinCode:!1,pageAppLinkString:w,showSignUp:!0}))):a.createElement(a.Fragment,null)}},75608:(e,t,n)=>{n.d(t,{a:()=>p});var a=n(20354),r=n(30439),i=n(4594),c=n(21750),l=n(43012),o=n(20768),u=n(5112),s=n(60011),d=n(31949),m=n(1575);function p(e){var t=a.a.useBasicFetch(d.N.currentUser()),n=a.a.useBasicFetch(r.o.getShareObject(e)),p=function(){if(!n.data||!t.data)return null;switch(n.data.objectTypeId){case i.E.Video:return m.R.publicVideo(n.data.objectId,e);case i.E.Clip:return l.e.publicClip(n.data.objectId,e);case i.E.Interactive:return o.b.publicInteractiveMetadata(n.data.objectId,e);case i.E.Playlist:return u.C.getSharedPlaylist(n.data.objectId,e);case i.E.Subject:return c.x.classification(n.data.objectId,t.data.id);case i.E.Series:return s.J.sharedSeries(n.data.objectId,e)}}();return a.a.useBasicFetch(p).data}},408:(e,t,n)=>{n.d(t,{B:()=>c});var a=n(2948),r=n(86702);function i(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}function c(){var e,t,n=(e=(0,a.D)(r.y.OPEN_IN_APP_DATA),t=1,function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,i,c,l=[],o=!0,u=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;o=!1}else for(;!(o=(a=i.call(n)).done)&&(l.push(a.value),l.length!==t);o=!0);}catch(e){u=!0,r=e}finally{try{if(!o&&null!=n.return&&(c=n.return(),Object(c)!==c))return}finally{if(u)throw r}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return i(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?i(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0];return{trialAppLinkString:function(){if(n&&["videos","clips","series","playlists","topics","interactives"].includes(n.app)){var e=n.id;switch(n.app){case"videos":return"video:".concat(e);case"playlists":return"playlist:".concat(e);case"series":return"series:".concat(e);case"topics":return"topic:".concat(e);case"interactives":return"interactive:".concat(e);case"clips":return"clip:".concat(e)}}}()}}},97027:(e,t,n)=>{n.d(t,{Hq:()=>d,Zf:()=>g});var a=n(32735),r=n(54610),i=n(4594),c=n(67453),l=n(99742);const o={left:"vIypY",leftTextImage:"YViNj",right:"MkD4u",blur:"X6mCh",imageContainer:"bc7kz",imagePosition:"JOhEj",image:"Ef2QR",thumbnail:"Gdurb",tallposter:"fjVNK",cover:"o3j31",linksContainer:"AT9Dk"};function u(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,i,c,l=[],o=!0,u=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;o=!1}else for(;!(o=(a=i.call(n)).done)&&(l.push(a.value),l.length!==t);o=!0);}catch(e){u=!0,r=e}finally{try{if(!o&&null!=n.return&&(c=n.return(),Object(c)!==c))return}finally{if(u)throw r}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return s(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var d=[{bgUrl:l.W.LaunchPad.BG_1},{bgUrl:l.W.LaunchPad.BG_2},{bgUrl:l.W.LaunchPad.BG_3},{bgUrl:l.W.LaunchPad.BG_4},{bgUrl:l.W.LaunchPad.BG_5}],m=[{bgUrl:l.W.LaunchPad.PRODUCT.BG_1},{bgUrl:l.W.LaunchPad.PRODUCT.BG_2},{bgUrl:l.W.LaunchPad.PRODUCT.BG_3},{bgUrl:l.W.LaunchPad.PRODUCT.BG_4},{bgUrl:l.W.LaunchPad.PRODUCT.BG_5},{bgUrl:l.W.LaunchPad.PRODUCT.BG_6},{bgUrl:l.W.LaunchPad.PRODUCT.BG_7},{bgUrl:l.W.LaunchPad.PRODUCT.BG_8},{bgUrl:l.W.LaunchPad.PRODUCT.BG_9}];function p(e){switch(e){case i.E.Video:case i.E.Interactive:case i.E.Clip:return o.thumbnail;case i.E.Subject:case i.E.Playlist:return o.cover;case i.E.Series:return o.tallposter;default:return""}}function g(e){var t,n=u(a.useState(!1),2),i=n[0],l=n[1],s=u(a.useState(""),2),d=s[0],g=s[1],b=c.j.createUrl(e.imageUrl,{size:r.h2.Large}),f=m;return a.useEffect((function(){if(!b&&f&&0!==f.length){var e,t=(e=f)[Math.floor(Math.random()*e.length)];t.bgUrl&&g(t.bgUrl)}}),[]),a.useEffect((function(){if(b){var e=new Image;return e.onload=function(){return l(!0)},e.src=b,function(){return e.onload=null}}}),[]),a.createElement("div",{className:"d-flex"},e.leftComponent?e.leftComponent():a.createElement("div",{className:"".concat(o.left," ").concat(d?"bg-blue d-flex align-items-center":"bg-light")},d?a.createElement("img",{className:"img-fluid",src:d,draggable:!1}):i&&a.createElement(a.Fragment,null,a.createElement("div",{className:o.blur,style:{backgroundImage:"url('".concat(b,"')")}}),a.createElement("div",{className:"".concat(o.imageContainer," ").concat(p(e.objectType))},a.createElement("div",{className:o.imagePosition},a.createElement("img",{className:o.image,src:b,alt:e.title}))))),a.createElement("div",{className:"".concat(o.right," bg-white d-flex flex-column")},a.createElement("div",{className:"position-absolute d-flex align-items-center ".concat(o.linksContainer)},null===(t=e.links)||void 0===t?void 0:t.map((function(e,t){return e.hide?a.createElement(a.Fragment,{key:t}):a.createElement("a",{key:t,href:e.url,className:"info-link fw-semibold",onClick:e.onClick},e.text)}))),e.children))}}}]);
|
|
2
|
+
//# sourceMappingURL=7601-c1b07b72c6-lite.chunk.js.map
|