@clickview/lite 0.64.0-rc.1 → 0.64.0-rc.3
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/css/{7153-lite-0cc5db0db7.chunk.css → 2962-lite-2002c62a24.chunk.css} +0 -1
- package/dist/css/{1857-lite-324255d395.chunk.css → 6173-lite-911f35513f.chunk.css} +0 -1
- package/dist/css/{2083-lite-6cb1775e12.chunk.css → 7324-lite-238bd550b7.chunk.css} +0 -1
- package/dist/css/{9013-lite-620f218839.chunk.css → 9013-lite-3c31b606c5.chunk.css} +2 -2
- package/dist/languages/en.json +1 -1
- package/dist/scripts/1216-899540dc73-lite.chunk.js +2 -0
- package/dist/scripts/1216-899540dc73-lite.chunk.js.map +1 -0
- package/dist/scripts/1820-b572681b3a-lite.chunk.js +2 -0
- package/dist/scripts/1820-b572681b3a-lite.chunk.js.map +1 -0
- package/dist/scripts/229-ac9f12e165-lite.chunk.js +2 -0
- package/dist/scripts/229-ac9f12e165-lite.chunk.js.map +1 -0
- package/dist/scripts/2712-a851ddc3c3-lite.chunk.js +2 -0
- package/dist/scripts/2712-a851ddc3c3-lite.chunk.js.map +1 -0
- package/dist/scripts/{2788-eca70707c6-lite.chunk.js → 2788-c8ae3be73f-lite.chunk.js} +1 -1
- package/dist/scripts/2788-c8ae3be73f-lite.chunk.js.map +1 -0
- package/dist/scripts/{7153-0ed8513e59-lite.chunk.js → 2962-7f2e4412f0-lite.chunk.js} +2 -2
- package/dist/scripts/{7153-0ed8513e59-lite.chunk.js.map → 2962-7f2e4412f0-lite.chunk.js.map} +1 -1
- package/dist/scripts/2988-b602b64344-lite.chunk.js +2 -0
- package/dist/scripts/2988-b602b64344-lite.chunk.js.map +1 -0
- package/dist/scripts/3180-c1f065183d-lite.chunk.js +2 -0
- package/dist/scripts/3180-c1f065183d-lite.chunk.js.map +1 -0
- package/dist/scripts/3549-111225ff0e-lite.chunk.js +2 -0
- package/dist/scripts/3549-111225ff0e-lite.chunk.js.map +1 -0
- package/dist/scripts/4591-f78fa6c784-lite.chunk.js +2 -0
- package/dist/scripts/4591-f78fa6c784-lite.chunk.js.map +1 -0
- package/dist/scripts/4667-5101904582-lite.chunk.js +2 -0
- package/dist/scripts/4667-5101904582-lite.chunk.js.map +1 -0
- package/dist/scripts/4718-1426986e1d-lite.chunk.js +2 -0
- package/dist/scripts/4718-1426986e1d-lite.chunk.js.map +1 -0
- package/dist/scripts/{5056-6057435479-lite.chunk.js → 5056-65c739468f-lite.chunk.js} +1 -1
- package/dist/scripts/5056-65c739468f-lite.chunk.js.map +1 -0
- package/dist/scripts/5201-98ee21febb-lite.chunk.js +2 -0
- package/dist/scripts/5201-98ee21febb-lite.chunk.js.map +1 -0
- package/dist/scripts/5595-79068997ce-lite.chunk.js +2 -0
- package/dist/scripts/5595-79068997ce-lite.chunk.js.map +1 -0
- package/dist/scripts/5770-f88f6d9c00-lite.chunk.js +2 -0
- package/dist/scripts/5770-f88f6d9c00-lite.chunk.js.map +1 -0
- package/dist/scripts/5896-60133bfdad-lite.chunk.js +3 -0
- package/dist/scripts/5896-60133bfdad-lite.chunk.js.map +1 -0
- package/dist/scripts/6173-7f9939c29e-lite.chunk.js +3 -0
- package/dist/scripts/6173-7f9939c29e-lite.chunk.js.map +1 -0
- package/dist/scripts/6181-9d7668c9e4-lite.chunk.js +3 -0
- package/dist/scripts/6181-9d7668c9e4-lite.chunk.js.map +1 -0
- package/dist/scripts/6455-37039eb687-lite.chunk.js +2 -0
- package/dist/scripts/6455-37039eb687-lite.chunk.js.map +1 -0
- package/dist/scripts/6623-84b33c6856-lite.chunk.js +3 -0
- package/dist/scripts/6623-84b33c6856-lite.chunk.js.map +1 -0
- package/dist/scripts/6919-8f60ca2263-lite.chunk.js +2 -0
- package/dist/scripts/6919-8f60ca2263-lite.chunk.js.map +1 -0
- package/dist/scripts/7267-1f5006c9c5-lite.chunk.js +2 -0
- package/dist/scripts/7267-1f5006c9c5-lite.chunk.js.map +1 -0
- package/dist/scripts/{2083-7daacf0112-lite.chunk.js → 7324-ee20e73ac1-lite.chunk.js} +2 -2
- package/dist/scripts/{2083-7daacf0112-lite.chunk.js.map → 7324-ee20e73ac1-lite.chunk.js.map} +1 -1
- package/dist/scripts/7434-fef3ea4e89-lite.chunk.js +2 -0
- package/dist/scripts/7434-fef3ea4e89-lite.chunk.js.map +1 -0
- package/dist/scripts/7443-4866d0c9ab-lite.chunk.js +3 -0
- package/dist/scripts/7443-4866d0c9ab-lite.chunk.js.map +1 -0
- package/dist/scripts/8416-7d71a55a14-lite.chunk.js +2 -0
- package/dist/scripts/8416-7d71a55a14-lite.chunk.js.map +1 -0
- package/dist/scripts/8465-01b0f72699-lite.chunk.js +2 -0
- package/dist/scripts/8465-01b0f72699-lite.chunk.js.map +1 -0
- package/dist/scripts/9013-6fcc58f028-lite.chunk.js +2 -0
- package/dist/scripts/9013-6fcc58f028-lite.chunk.js.map +1 -0
- package/dist/scripts/9264-998d93d1c2-lite.chunk.js +2 -0
- package/dist/scripts/9264-998d93d1c2-lite.chunk.js.map +1 -0
- package/dist/scripts/9894-0fba5cf702-lite.chunk.js +3 -0
- package/dist/scripts/9894-0fba5cf702-lite.chunk.js.map +1 -0
- package/dist/scripts/bundle-48f54fe5c2.min.js +3 -0
- package/dist/scripts/bundle-48f54fe5c2.min.js.map +1 -0
- package/package.json +1 -1
- package/dist/scripts/1755-462bcd99e9-lite.chunk.js +0 -2
- package/dist/scripts/1755-462bcd99e9-lite.chunk.js.map +0 -1
- package/dist/scripts/180-6c4779f6ab-lite.chunk.js +0 -2
- package/dist/scripts/180-6c4779f6ab-lite.chunk.js.map +0 -1
- package/dist/scripts/1820-3b5d0a340d-lite.chunk.js +0 -2
- package/dist/scripts/1820-3b5d0a340d-lite.chunk.js.map +0 -1
- package/dist/scripts/1857-d3af9d98eb-lite.chunk.js +0 -3
- package/dist/scripts/1857-d3af9d98eb-lite.chunk.js.map +0 -1
- package/dist/scripts/229-900e650427-lite.chunk.js +0 -2
- package/dist/scripts/229-900e650427-lite.chunk.js.map +0 -1
- package/dist/scripts/2788-eca70707c6-lite.chunk.js.map +0 -1
- package/dist/scripts/3180-22edf4c9fc-lite.chunk.js +0 -2
- package/dist/scripts/3180-22edf4c9fc-lite.chunk.js.map +0 -1
- package/dist/scripts/3549-30d3b1cd05-lite.chunk.js +0 -2
- package/dist/scripts/3549-30d3b1cd05-lite.chunk.js.map +0 -1
- package/dist/scripts/3776-0027340c98-lite.chunk.js +0 -2
- package/dist/scripts/3776-0027340c98-lite.chunk.js.map +0 -1
- package/dist/scripts/4591-3e8dddd0e9-lite.chunk.js +0 -2
- package/dist/scripts/4591-3e8dddd0e9-lite.chunk.js.map +0 -1
- package/dist/scripts/4667-f3882f2379-lite.chunk.js +0 -2
- package/dist/scripts/4667-f3882f2379-lite.chunk.js.map +0 -1
- package/dist/scripts/4718-16d6e39561-lite.chunk.js +0 -2
- package/dist/scripts/4718-16d6e39561-lite.chunk.js.map +0 -1
- package/dist/scripts/5056-6057435479-lite.chunk.js.map +0 -1
- package/dist/scripts/5201-7d3867d027-lite.chunk.js +0 -2
- package/dist/scripts/5201-7d3867d027-lite.chunk.js.map +0 -1
- package/dist/scripts/5595-10e586779d-lite.chunk.js +0 -2
- package/dist/scripts/5595-10e586779d-lite.chunk.js.map +0 -1
- package/dist/scripts/5896-5d2f32c59e-lite.chunk.js +0 -3
- package/dist/scripts/5896-5d2f32c59e-lite.chunk.js.map +0 -1
- package/dist/scripts/6181-50a39979ec-lite.chunk.js +0 -3
- package/dist/scripts/6181-50a39979ec-lite.chunk.js.map +0 -1
- package/dist/scripts/6455-2f45be17cf-lite.chunk.js +0 -2
- package/dist/scripts/6455-2f45be17cf-lite.chunk.js.map +0 -1
- package/dist/scripts/6623-ebbffb59b3-lite.chunk.js +0 -3
- package/dist/scripts/6623-ebbffb59b3-lite.chunk.js.map +0 -1
- package/dist/scripts/6919-cb2de57c2e-lite.chunk.js +0 -2
- package/dist/scripts/6919-cb2de57c2e-lite.chunk.js.map +0 -1
- package/dist/scripts/7267-c2d30dd339-lite.chunk.js +0 -2
- package/dist/scripts/7267-c2d30dd339-lite.chunk.js.map +0 -1
- package/dist/scripts/7434-c34ca23a21-lite.chunk.js +0 -2
- package/dist/scripts/7434-c34ca23a21-lite.chunk.js.map +0 -1
- package/dist/scripts/7443-7c72de0cb9-lite.chunk.js +0 -3
- package/dist/scripts/7443-7c72de0cb9-lite.chunk.js.map +0 -1
- package/dist/scripts/8022-0656cce655-lite.chunk.js +0 -2
- package/dist/scripts/8022-0656cce655-lite.chunk.js.map +0 -1
- package/dist/scripts/9013-adc5d3517a-lite.chunk.js +0 -2
- package/dist/scripts/9013-adc5d3517a-lite.chunk.js.map +0 -1
- package/dist/scripts/9155-87c9030ce9-lite.chunk.js +0 -2
- package/dist/scripts/9155-87c9030ce9-lite.chunk.js.map +0 -1
- package/dist/scripts/9264-750b3d6ea0-lite.chunk.js +0 -2
- package/dist/scripts/9264-750b3d6ea0-lite.chunk.js.map +0 -1
- package/dist/scripts/9894-bc34edcd67-lite.chunk.js +0 -3
- package/dist/scripts/9894-bc34edcd67-lite.chunk.js.map +0 -1
- package/dist/scripts/bundle-e02b7c5d7f.min.js +0 -3
- package/dist/scripts/bundle-e02b7c5d7f.min.js.map +0 -1
- package/dist/css/{6455-lite-fe0bc6d95f.chunk.css → 6455-lite-c07987d46c.chunk.css} +1 -1
- /package/dist/css/{9155-lite-447d345417.chunk.css → 8465-lite-447d345417.chunk.css} +0 -0
- /package/dist/scripts/{1857-d3af9d98eb-lite.chunk.js.LICENSE.txt → 5896-60133bfdad-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{5896-5d2f32c59e-lite.chunk.js.LICENSE.txt → 6173-7f9939c29e-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{6181-50a39979ec-lite.chunk.js.LICENSE.txt → 6181-9d7668c9e4-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{6623-ebbffb59b3-lite.chunk.js.LICENSE.txt → 6623-84b33c6856-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{7443-7c72de0cb9-lite.chunk.js.LICENSE.txt → 7443-4866d0c9ab-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{9894-bc34edcd67-lite.chunk.js.LICENSE.txt → 9894-0fba5cf702-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{bundle-e02b7c5d7f.min.js.LICENSE.txt → bundle-48f54fe5c2.min.js.LICENSE.txt} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/5201-7d3867d027-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/infinite-scroll-footer/infinite-scroll-footer.scss","file:///app/packages/libs/shared/src/components/infinite-scroll-footer/InfiniteScrollFooter.tsx","file:///app/packages/libs/shared/src/hooks/UseInfiniteScroll.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteList.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/MixedWidgetSearchResults.tsx","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/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/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/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":["// extracted by mini-css-extract-plugin\nexport default {\"container\":\"VwD1b\",\"spinner\":\"eJ85e\"};","import * as React from 'react';\nimport { Spinner } from 'react-bootstrap';\nimport { useInView } from 'react-intersection-observer';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './infinite-scroll-footer.scss';\n\ninterface InfiniteScrollFooterProps {\n isFetching: boolean;\n fetchNext?: (nextCursor: string) => void;\n nextCursor?: string;\n fetchOnScroll?: boolean;\n}\n\nInfiniteScrollFooter.defaultProps = {\n fetchOnScroll: false\n};\n\nexport function InfiniteScrollFooter(props: InfiniteScrollFooterProps): React.ReactElement {\n const [ ref, inView ] = useInView();\n\n React.useEffect(() => {\n if (!props.fetchOnScroll)\n return;\n\n if (!inView || props.isFetching)\n return;\n\n props.fetchNext?.(props.nextCursor);\n }, [ inView, props.isFetching ]);\n\n return (\n <div className={`p-3 text-center ${styles.container}`} ref={ref}>\n {props.isFetching\n ? <Spinner as='span' animation='border' role='status' className={styles.spinner} />\n : (\n <SvgContainer\n svgName={cvSvgLibrary.ChevronDown}\n className='svg-container cursor-pointer'\n size={SvgContainerSize.Large}\n onClick={() => props.fetchNext?.(props.nextCursor)}\n />\n )\n }\n </div>\n );\n}","import { useEffect } from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst SCROLL_TOLERANCE = 400; // value in px\n\ninterface UseInfiniteScrollOptions {\n fetchNextPage: () => void;\n hasMore: boolean;\n isFetching: boolean;\n scrollContainer?: HTMLElement;\n}\n\nexport function useInfiniteScroll(options: UseInfiniteScrollOptions): void {\n const handleScroll = (): void => {\n if (options.isFetching)\n return;\n\n if (!options.scrollContainer) {\n const currentScrollHeight = window.innerHeight + document.documentElement.scrollTop;\n \n const totalHeight = document.documentElement.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n } else {\n const { scrollContainer } = options;\n const currentScrollHeight = scrollContainer.getBoundingClientRect().height + scrollContainer.scrollTop;\n \n const totalHeight = scrollContainer.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n }\n\n options.fetchNextPage();\n };\n\n useEffect(() => {\n const onScroll = FunctionHelper.throttle(handleScroll, 200);\n\n const scrollContainer = options.scrollContainer || window;\n\n if (options.hasMore)\n scrollContainer.addEventListener('scroll', onScroll);\n\n return () => scrollContainer.removeEventListener('scroll', onScroll);\n }, [ options.hasMore, options.fetchNextPage, options.scrollContainer ]);\n}","import { useEffect, useState } from 'react';\n\nimport { HttpStatus, HttpStatusClass } from 'libs/common/backbone/enums/HttpStatus';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { BaseObject, BasePaginatedCollection } from 'libs/shared/interfaces';\n\nimport { useInfiniteScroll } from './UseInfiniteScroll';\nimport { useSelectAllPages } from './UseSelectAllPages';\n\nexport interface UseInfiniteListResult<T extends BaseObject> {\n items: T[];\n hasMore: boolean;\n isFetching: boolean;\n nextCursor: string;\n totalItems?: number;\n hasFirstPageCompleted: boolean;\n}\n\n/**\n * Hook to extract an infinite list from the application state,\n * save it locally in state and only update when new data\n * is fetched.\n * \n * @param getRequest - callback function to get the request for each page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n * \n * @param fetchNext - callback function to fetch a page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n */\nexport function useInfiniteList<TObject = BaseObject, TResponse = BasePaginatedCollection<TObject>>(\n getRequest: ((cursor?: string) => Flight.Request) | false,\n fetchNext: ((cursor?: string) => void) | false,\n onError?: (pageNumber: number, statusCode: HttpStatus) => void,\n getItems?: (responseData: TResponse) => TObject[],\n getCursor?: (responseData: TResponse) => string,\n scrollContainer?: HTMLElement\n): UseInfiniteListResult<TObject> {\n const [ pagesFetched, setPagesFetched ] = useState(0);\n\n const fetchNextFn = fetchNext as (cursor?: string) => void;\n\n function getKey(cursor?: string): string {\n if (!getRequest)\n return null;\n\n const request = getRequest(cursor);\n\n if (!request)\n return null;\n\n return request.key;\n }\n\n const response = useSelectAllPages<TObject, TResponse>(\n getKey,\n getItems,\n getCursor\n );\n\n function fetchNextPage(): void {\n if (!fetchNext || !getRequest || !response)\n return;\n\n setPagesFetched(currentVal => currentVal + 1);\n return fetchNextFn(response.nextCursor);\n }\n\n useInfiniteScroll({\n fetchNextPage,\n hasMore: !!response?.nextCursor,\n isFetching: response?.isFetching,\n scrollContainer\n });\n\n useEffect(() => {\n if (!response)\n return;\n\n if (response.shouldInitialFetch && fetchNext) {\n fetchNextFn();\n setPagesFetched(currentVal => currentVal + 1);\n }\n }, [ response?.shouldInitialFetch, fetchNext ]);\n\n useEffect(() => {\n if (!response?.statusCode || !FunctionHelper.isFunction(onError))\n return;\n\n const httpStatusClass: HttpStatusClass = +(response.statusCode?.toString()?.substr(0, 1));\n\n if (httpStatusClass !== HttpStatusClass.ClientError && httpStatusClass !== HttpStatusClass.ServerError)\n return;\n\n onError(pagesFetched, response.statusCode);\n }, [response?.statusCode]);\n\n return {\n items: response?.items,\n hasMore: !!response?.nextCursor,\n nextCursor: response?.nextCursor,\n isFetching: response?.isFetching,\n totalItems: response?.totalItems,\n hasFirstPageCompleted: response?.hasFirstPageCompleted\n };\n}","import { 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 />\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 yearGroups={props.yearGroups}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getSubTextAppLink={props.appLinks.getSubTextAppLink}\n presentationAudiences={props.audiences}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n analyticsData= {{\n search: {\n query: props.queryParams.query,\n score: v._score,\n maxScore: v._maxScore,\n featured: v._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n companyLogoFallbackUrl={props.companyLogoFallbackUrl}\n subTextType={props.subTextType}\n hasPermissions={props.hasPermissions}\n getClassroomGuideAppLink={props.appLinks.getClassroomGuideAppLink}\n getResourceGuidanceAppLink={props.appLinks.getResourceGuidanceAppLink}\n getInteractiveGuidanceAppLink={props.appLinks.getInteractiveGuidanceAppLink}\n isPlugin={props.isPlugin}\n />\n );\n })}\n </div>\n <div className='text-center py-2'>\n <AppLink\n className='text-secondary'\n appLink={searchAppLink}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n >\n <Text namespace={namespace} phrase='seeMore' />\n </AppLink>\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { HeroVideo } from 'libs/shared/apps/subjects/components/hero-video/HeroVideo';\nimport { Video } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function FeaturedVideoResult(props: MixedSearchResultItemProps<Video>): JSX.Element {\n return (\n <div className='pb-3'>\n <HeroVideo\n video={props.item}\n presentationAudiences={props.audiences}\n getVideoAppLink={(v, opts) => props.appLinks.getVideoAppLink(v, opts)}\n subTextAppLink={props.appLinks.getSubTextAppLink(props.item)}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n hideInteractiveBadge\n yearGroups={props.yearGroups}\n companyLogoFallbackUrl={props.companyLogoFallbackUrl}\n subTextType={props.subTextType}\n showVideoGuidance={VideoHelper.showVideoGuidance(props.hasPermissions)}\n imageCdnUrl={props.imageCdnUrl}\n isPlugin={props.isPlugin}\n showNewVideoIndicator={props.hasTopicDirectories}\n getInteractiveGuidanceAppLink={props.appLinks.getInteractiveGuidanceAppLink}\n getResourceGuidanceAppLink={props.appLinks.getResourceGuidanceAppLink}\n getClassroomGuideAppLink={props.appLinks.getClassroomGuideAppLink}\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 { VideoSubTextType } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { CurrentUser, Playlist, PresentationAudience, Video, YearGroup } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\n\nimport styles from './playlist-with-videos.scss';\n\nconst namespace = 'search.playlistWithVideos';\n\nfunction useGetMaxVideos(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xl || breakpoints.xxl)\n return 3;\n \n return 2;\n}\n\ninterface PlaylistWithVideoProps {\n playlist: Playlist;\n yearGroups: YearGroup[];\n playlistAppLink: Core.AppLink;\n presentationAudiences: PresentationAudience[];\n preloadImage: boolean;\n analyticsData: HashObject;\n imageCdnUrl: string;\n currentUser: CurrentUser;\n getSubTextAppLink: (video: Video) => Core.AppLink;\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n companyLogoFallbackUrl?: string;\n subTextType?: VideoSubTextType;\n hasPermissions: HasPermissionsFunc;\n isPlugin: boolean;\n}\n\nexport function PlaylistWithVideos(props: PlaylistWithVideoProps): JSX.Element {\n const maxVideos = useGetMaxVideos();\n\n const videos = props.playlist.videos.data.slice(0, maxVideos);\n\n const playlistAnalyticsOption: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Playlist,\n location: LocationContext.PlaylistWithVideos\n };\n\n const playlistAnalyticsData: HashObject = {\n ...props.analyticsData,\n id: props.playlist.id,\n name: props.playlist.name\n };\n\n return (\n <div className='ps-2 py-2'>\n <Row className='g-0 border border-light rounded-3'>\n <Col xs={4} lg={3} className='pe-3'>\n <PlaylistItem\n appLink={props.playlistAppLink}\n analyticsData={props.analyticsData}\n analyticsOptions={{\n ...playlistAnalyticsOption,\n descriptor: ClickDescriptor.Cover\n }}\n data={props.playlist}\n presentationAudiences={props.presentationAudiences}\n bgColourClassNames={BG_COLOUR_CLASS_NAMES}\n itemStyle='round-left'\n imageCdnUrl={props.imageCdnUrl}\n currentUser={props.currentUser}\n showCount={false}\n showOwner\n />\n </Col>\n <Col xs={8} lg={9}>\n <div className='d-flex justify-content-between'>\n <div className={`pt-3 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 getSubTextAppLink={props.getSubTextAppLink}\n canFavourite={() => false}\n setFavourite={null}\n getVideoAppLink={props.getVideoAppLink}\n analyticsData={videoAnalyticsData}\n analyticsOptions={{\n entity: EntityType.Video,\n location: LocationContext.PlaylistWithVideos\n }}\n size='sm'\n yearGroups={props.yearGroups}\n companyLogoFallbackUrl={props.companyLogoFallbackUrl}\n subTextType={props.subTextType}\n hasPermissions={props.hasPermissions}\n isPlugin={props.isPlugin}\n hideVideoGuidance\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 yearGroups={props.yearGroups}\n playlistAppLink={props.appLinks.getPlaylistAppLink(props.item)}\n presentationAudiences={props.audiences}\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n imageCdnUrl={props.imageCdnUrl}\n currentUser={props.currentUser}\n preloadImage\n getSubTextAppLink={props.appLinks.getSubTextAppLink}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n companyLogoFallbackUrl={props.companyLogoFallbackUrl}\n subTextType={props.subTextType}\n hasPermissions={props.hasPermissions}\n isPlugin={props.isPlugin}\n />\n </div>\n );\n}","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SeriesTallPoster } from 'libs/shared/components/series-tall-poster/SeriesTallPoster';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoItem } from 'libs/shared/components/video-list/video-item/VideoItem';\nimport { VideoSubTextType } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { PresentationAudience, Series, Video, YearGroup } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\n\nimport styles from './series-with-videos.scss';\n\nconst namespace = 'search.seriesWithVideos';\n\nfunction useGetMaxVideos(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xl || breakpoints.xxl)\n return 5;\n \n if (breakpoints.lg || breakpoints.md)\n return 4;\n\n return 3;\n}\n\ninterface SeriesWithVideoProps {\n series: Series;\n yearGroups: YearGroup[];\n seriesAppLink: Core.AppLink;\n subTextAppLink: (video: Video) => Core.AppLink;\n presentationAudiences: PresentationAudience[];\n preloadImage: boolean;\n analyticsData: HashObject;\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n companyLogoFallbackUrl?: string;\n subTextType?: VideoSubTextType;\n hasPermissions: HasPermissionsFunc;\n isPlugin: boolean;\n}\n\nexport function SeriesWithVideos(props: SeriesWithVideoProps): JSX.Element {\n const maxVideos = useGetMaxVideos();\n\n const videos = props.series.videos.data.slice(0, maxVideos);\n\n const seriesAnalyticsOption: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Series,\n location: LocationContext.SeriesWithVideos\n };\n\n const seriesAnalyticsData: HashObject = {\n ...props.analyticsData,\n id: props.series.id,\n name: props.series.name\n };\n\n return (\n <div className='ps-2 py-2'>\n <Row className='g-0 border border-light rounded-3'>\n <Col xs={4} lg={3} className='pe-3'>\n <AppLink\n appLink={props.seriesAppLink}\n className='position-relative'\n analyticsData={seriesAnalyticsData}\n analyticsOptions={{\n ...seriesAnalyticsOption,\n descriptor: ClickDescriptor.TallPoster\n }}\n >\n <SeriesTallPoster\n series={props.series}\n presentationAudiences={props.presentationAudiences}\n preloadImage={props.preloadImage}\n imageClass='rounded-start-lg'\n />\n </AppLink>\n </Col>\n <Col xs={8} lg={9}>\n <div className='d-flex justify-content-between'>\n <div className={`pt-3 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 getSubTextAppLink={props.subTextAppLink}\n canFavourite={() => false}\n setFavourite={null}\n getVideoAppLink={props.getVideoAppLink}\n analyticsData={videoAnalyticsData}\n analyticsOptions={{\n entity: EntityType.Video,\n location: LocationContext.SeriesWithVideos\n }}\n size='sm'\n yearGroups={props.yearGroups}\n companyLogoFallbackUrl={props.companyLogoFallbackUrl}\n subTextType={props.subTextType}\n hasPermissions={props.hasPermissions}\n isPlugin={props.isPlugin}\n hideVideoGuidance\n />\n </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 yearGroups={props.yearGroups}\n presentationAudiences={props.audiences}\n series={props.item}\n seriesAppLink={props.appLinks.getSeriesAppLink(props.item)}\n subTextAppLink={props.appLinks.getSubTextAppLink}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n preloadImage\n companyLogoFallbackUrl={props.companyLogoFallbackUrl}\n subTextType={props.subTextType}\n hasPermissions={props.hasPermissions}\n isPlugin={props.isPlugin}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { SeasonEpisode } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Video } from 'libs/shared/interfaces';\n\nconst namespace = 'search.collectionVideoList';\n\ninterface CollectionVideoListProps {\n videos: Video[];\n collectionId: string;\n appLink: Core.AppLink;\n analyticsOptions: AnalyticsOptions;\n analyticsData?: HashObject;\n getVideoAppLink: (video: Video) => Core.AppLink;\n}\n\nfunction useGetMaxVideos(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xs)\n return 2;\n\n if (breakpoints.sm)\n return 1;\n\n return 3;\n}\n\nexport function CollectionVideoList(props: CollectionVideoListProps): JSX.Element {\n const maxVideos = useGetMaxVideos();\n\n const analyticsProps = {\n analyticsData: props.analyticsData,\n analyticsOptions: props.analyticsOptions\n };\n\n return (\n <>\n <ul className='list-unstyled my-1'>\n {props.videos.slice(0, maxVideos).map(v => {\n const hasSeasonEpisode = !!v.episodeNumber && !!v.season?.id;\n\n return (\n <li key={`${props.collectionId}:${v.id}`} className='d-flex align-items-center'>\n <AppLink\n {...analyticsProps}\n className='clamp-1'\n appLink={props.getVideoAppLink(v)}\n >\n {hasSeasonEpisode && <><SeasonEpisode video={v} /> </>}\n {v.name}\n </AppLink>\n </li>\n );\n })}\n </ul>\n\n <AppLink\n {...analyticsProps}\n className='info-link'\n appLink={props.appLink}\n >\n <Text namespace={namespace} phrase='seeAll' />\n </AppLink>\n </>\n );\n}","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.isPlugin}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getCollectionActions={props.appLinks.getCollectionActions}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { MaskType } from 'libs/shared/components/mask/Mask';\nimport { Series } from 'libs/shared/interfaces';\n\nimport { CollectionThumbnail } from '../../collection-thumbnail/CollectionThumbnail';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nimport styles from '../mixed-search-results.scss';\n\nexport function SmallSeriesResult(props: MixedSearchResultItemProps<Series>): JSX.Element {\n return (\n <div className={`position-relative ${styles.videoList}`}>\n <CollectionThumbnail\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n analyticsOptions={{\n entity: EntityType.Series,\n actionType: UserAction.Click,\n location: LocationContext.SeriesListItem\n }}\n appLink={props.appLinks.getSeriesAppLink(props.item)}\n collectionType='series'\n collection={props.item}\n showActions={props.showActions}\n maskType={MaskType.Series}\n imageFallbackType={ImageFallbackType.SeriesThumbnail}\n hideBadges\n isPlugin={props.isPlugin}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getCollectionActions={props.appLinks.getCollectionActions}\n />\n </div>\n );\n}","import React from 'react';\nimport { Col } from 'react-bootstrap';\n\nimport { SubjectWidgetItem } from 'libs/shared/components/widgets/items/subject-widget-item';\nimport { Classification } from 'libs/shared/interfaces';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function SubjectResult(props: MixedSearchResultItemProps<Classification>): JSX.Element {\n return (\n <Col 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.hasTopicDirectories}\n />\n </div>\n </Col>\n );\n}","import React from 'react';\n\nimport { ClipItem, ClipItemProps } from 'libs/shared/components/video-list/clip-item/ClipItem';\nimport { InteractiveItem, InteractiveItemProps } from 'libs/shared/components/video-list/interactive-item/InteractiveItem';\nimport { VideoItem, VideoItemProps } from 'libs/shared/components/video-list/video-item/VideoItem';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nimport styles from '../mixed-search-results.scss';\n\nexport function VideoResult(props: MixedSearchResultItemProps<VideoTypes>): JSX.Element {\n function getItemComponent(\n video: VideoTypes\n ): (props: ClipItemProps | InteractiveItemProps | VideoItemProps) => JSX.Element {\n if (VideoHelper.isClip(video))\n return ClipItem;\n \n if (VideoHelper.isInteractive(video))\n return InteractiveItem;\n \n return VideoItem;\n }\n\n const Component = getItemComponent(props.item);\n\n return (\n <div className={`position-relative ${styles.videoList}`}>\n <Component\n video={props.item}\n yearGroups={props.yearGroups}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getSubTextAppLink={props.appLinks.getSubTextAppLink}\n getPreviewQuestionsAppLink={props.appLinks.getPreviewQuestionsAppLink}\n presentationAudiences={props.audiences}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n analyticsData= {{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n companyLogoFallbackUrl={props.companyLogoFallbackUrl}\n subTextType={props.subTextType}\n hasPermissions={props.hasPermissions}\n imageCdnUrl={props.imageCdnUrl}\n isPlugin={props.isPlugin}\n showNewVideoIndicator={props.hasTopicDirectories}\n getClassroomGuideAppLink={props.appLinks.getClassroomGuideAppLink}\n getResourceGuidanceAppLink={props.appLinks.getResourceGuidanceAppLink}\n getInteractiveGuidanceAppLink={props.appLinks.getInteractiveGuidanceAppLink}\n />\n </div>\n );\n}","import React from 'react';\nimport { Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoSubTextType } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { CanFavouriteFunc, Classification, Company, CurrentUser, FavouriteFunc, InteractiveMetadata, Playlist, Presentation, PresentationAudience, Series, Video, YearGroup } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { SearchResultObjectTypes, SearchResults, SearchResultsObject } from '../../interfaces';\nimport { GetCollectionActions } from '../collection-thumbnail/CollectionThumbnail';\n\nimport { CompanyResult } from './components/CompanyResult';\nimport { ExchangeVideoGroup } from './components/exchange-video-group/ExchangeVideoGroup';\nimport { FeaturedVideoResult } from './components/FeaturedVideoResult';\nimport { LargePlaylistResult } from './components/LargePlaylistResults';\nimport { LargeSeriesResult } from './components/LargeSeriesResult';\nimport { BaseMixedSearchResultItemProps } from './components/MixedSearchResultItemProps';\nimport { SmallPlaylistResult } from './components/SmallPlaylistResult';\nimport { SmallSeriesResult } from './components/SmallSeriesResults';\nimport { SubjectResult } from './components/SubjectResult';\nimport { VideoResult } from './components/VideoResult';\n\nconst namespace = 'shared.mixedSearchResults';\n\nconst TOPIC_DISPLAY_LIMIT = 8;\n\nexport interface MixedSearchResultAppLinks {\n getSubTextAppLink: (video: Video) => Core.AppLink;\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n getSeriesAppLink: (series: Series) => Core.AppLink;\n getCompanyAppLink: (company: Company) => Core.AppLink;\n getCompanyAppLinkOptions?: (company: Company) => Core.AppLinkOptions;\n getClassificationAppLink: (classification: Classification) => Core.AppLink;\n getClassificationAppLinkOptions?: (classification: Classification) => Core.AppLinkOptions;\n getPlaylistAppLink: (playlist: Playlist) => Core.AppLink;\n getPreviewQuestionsAppLink: (interactive: InteractiveMetadata) => Core.AppLink;\n getCollectionActions: GetCollectionActions;\n getInteractiveGuidanceAppLink: (id: string, type: MasterType) => Core.AppLink;\n getResourceGuidanceAppLink: (id: string, type: MasterType) => Core.AppLink;\n getClassroomGuideAppLink: (id: string, type: MasterType) => Core.AppLink;\n searchSettings?: Core.AppLink;\n}\n\ninterface MixedSearchResultsProps {\n queryParams: HashObject;\n hasTopicDirectories: boolean;\n results: SearchResultObjectTypes[];\n topics?: SearchResults;\n companies?: SearchResults;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n audiences: PresentationAudience[];\n currentUser: CurrentUser;\n imageCdnUrl: string;\n availablePresentations: Presentation[]\n showActions: boolean;\n yearGroups: YearGroup[];\n hasPermissions: HasPermissionsFunc;\n isPlugin: boolean;\n appLinks: MixedSearchResultAppLinks;\n companyLogoFallbackUrl?: string;\n subTextType?: VideoSubTextType;\n}\n\nexport const MixedSearchResults = React.memo(function(props: MixedSearchResultsProps): JSX.Element {\n const breakpoints = useBreakpoints();\n const useSmallComponent = breakpoints.xs || breakpoints.sm;\n\n if (!props.results?.length && !props.topics?.totalResults && !props.companies?.totalResults)\n return <></>;\n\n const companiesAndTopics = [\n ...props.companies?.results ?? [],\n ...props.topics?.results ?? []\n ];\n\n const childProps: BaseMixedSearchResultItemProps = {\n useLargeStyle: companiesAndTopics.length < 4,\n ...props\n };\n\n return (\n <div className='position-relative'>\n <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}","/**\n * OGQL used for search V5 endpoint\n */\nexport const SearchOGQL = {\n video:\n 'series,season,thumbnail' +\n ',_videoProgress,_canBeConsumed' +\n ',_restrictions' +\n ',_isClickViewCurated,resources[count()]',\n series:\n 'rating',\n playlist:\n 'videos[count(),thumbnail]{limit:1},interactives[count(),_thumbnail]{limit:1},' +\n 'clips[count(),_thumbnail]{limit:1}',\n classification:\n 'cover,thumbnail',\n clip:\n '_canBeConsumed,_restrictions,_thumbnail,_isClickViewCurated',\n interactive:\n '_thumbnail,_timepoints,_isClickViewCurated,_canBeConsumed,' +\n '_restrictions',\n company:\n 'logo',\n category:\n 'libraries,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.Request {\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 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 = Object.assign({}, {\n index: indices,\n cursor,\n query,\n ...filters\n });\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v3/search/tags-and-classifications', params),\n publicUrl: UrlHelper.urlBuilder('/api/search/tags-and-classifications', params),\n key: `filter:options:${query}:${indices.join(':')}:${cursor}`,\n success,\n error,\n normalize: false\n };\n }\n};","import { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { SharedSearchRequests } from 'libs/shared/apps/search/flight-requests/SharedSearchRequests';\nimport { SearchResults, SearchResultsObject } from 'libs/shared/apps/search/interfaces';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { ClassificationStatus } from 'libs/shared/enums/ClassificationStatus';\nimport { ClassificationType } from 'libs/shared/enums/ClassificationType';\nimport { CurationTag } from 'libs/shared/enums/CurationTag';\nimport { Classification, Presentation, Rating } from 'libs/shared/interfaces';\n\nimport { SearchHelper } from 'apps/search/utils';\n\nconst TEACHER_FILTERS = [ 'filters.classification', 'filters.presentation' ];\nconst STUDENT_FILTERS = [ 'filters.classification', 'filters.presentation', 'isLearner' ];\n\ntype TopicSearchResults = SearchResults<SearchResultsObject<Classification>>;\n\nexport function useSearchTopics(\n queryParams: HashObject,\n ratings: Rating[] = [],\n presentationId: string,\n availablePresentations: Presentation[],\n isStudent: boolean\n): Flight.Response<SearchResults> {\n const rawFilters = ratings?.length && FilterHelper.buildBackendFilterParams(\n queryParams,\n ratings,\n [presentationId],\n isStudent,\n []\n );\n\n const filters = ObjectHelper.pick(rawFilters, isStudent ? STUDENT_FILTERS : TEACHER_FILTERS);\n filters[`filters.classificationType`] = ClassificationType.Subject;\n filters[`filters.status`] = ClassificationStatus.Published;\n\n if (queryParams?.moviesAndTv)\n filters[`filters.curationTag`] = CurationTag.MOVIES_AND_TV;\n\n if (availablePresentations.length) {\n filters[`filters.presentation`] = availablePresentations.map(presentation => presentation.id);\n }\n\n const presentationMap = availablePresentations?.reduce((acc: HashObject, presentation) => {\n acc[presentation.id] = presentation;\n return acc;\n }, {}) ?? {};\n\n const indices = FilterHelper.getAppliedIndices(queryParams);\n\n const hasFilteredOutTopics = !indices.includes('classification');\n\n const request = SharedSearchRequests.search(\n SearchHelper.getQuery(queryParams),\n ['classification'],\n filters,\n queryParams.allowSubstitute !== 'false'\n );\n\n const shouldFetch = !hasFilteredOutTopics;\n\n const response = Flight.useBasicFetch<TopicSearchResults>(shouldFetch && request);\n\n if (!shouldFetch)\n return null;\n\n if (!response.data)\n return response;\n\n if (!availablePresentations || availablePresentations?.length < 2)\n return response;\n\n const results = [...response.data.results];\n\n /**\n * If the customer has more than 1 presentation, and they search for something that returns 2 topics\n * with the same score, then we want to order those topics based on the presentation's learning level.\n * This is achieved by checking the `value` on the presentation.\n */\n const sortedResults = results.sort((a, b) => {\n // If the scores are different, then keep the original ordering\n if (a._score !== b._score)\n return 0;\n\n const presentationA = presentationMap[a.presentationId];\n const presentationB = presentationMap[b.presentationId];\n\n if (!presentationA)\n return 1;\n\n if (!presentationB)\n return -1;\n\n // Order by presentation value\n return presentationA.value - presentationB.value;\n });\n\n return {\n ...response,\n data: {\n ...response.data,\n results: sortedResults\n }\n };\n}\n","import { Flight } from 'libs/common/flight';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport { TopicResults } from 'libs/shared/apps/search/interfaces';\nimport { MasterObjectTypes } from 'libs/shared/enums/MasterObjectTypes';\nimport { LocalPermissionName, PermissionName } from 'libs/shared/enums/PermissionName';\nimport { PresentationLearningLevel } from 'libs/shared/enums/PresentationLearningLevel';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { DomainMasterCollectionType, LibraryRequests } from 'libs/shared/flight-requests/LibraryRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, CurrentUser, DashboardTargetType, Library, Rating, User, YearGroup } from 'libs/shared/interfaces';\nimport { TopicsHelper } from 'libs/shared/utils/topics-helper/TopicsHelper';\n\nimport { RatingRequests } from 'shared/flight-requests/RatingRequests';\nimport { useCurriculums } from 'shared/hooks/useCurriculums';\nimport { usePresentation } from 'shared/hooks/usePresentation';\nimport { usePresentationAudiences } from 'shared/hooks/usePresentationAudiences';\nimport { useFetchCuratedDashboard } from 'shared/utils/DashboardHelper';\n\nimport { useFetchSchoolLevels } from 'apps/search/hooks/useFetchSchoolLevels';\nimport { useSearchCompanies } from 'apps/search/hooks/useSearchCompanies';\nimport { useSearchTopics } from 'apps/search/hooks/useSearchTopics';\n\n/**\n * We need to fetch libraries in order to support the sources filter. \n * However we need to exclude the streamable library, and additionally we need to exclude\n * the exchange library if the user has decided they don't want to see exchange results.\n * \n * We then need to return both of these ids so that the FilterHelper.getBackendFilters()\n * can add them as excludeLibraryExclusive filters\n * \n * - Sha\n */\nfunction useGetLibraries() {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const products = useProducts();\n const settings = useSettings(null);\n\n const streamableLibrary = Flight.useBasicFetch<HashObject>(LibraryRequests.streamableLearning());\n const streamableLibraryId = streamableLibrary.data?.objectId;\n\n const showExchangeSearchResults = products.hasProduct(ProductId.Exchange) && settings.showExchangeSearchResults;\n\n const libraryTypes: DomainMasterCollectionType[] = [ 'sharedLibrary', 'customLibrary', 'workspace', 'hostedLibrary', 'exchange' ];\n const librariesRequest = Flight.useBasicFetch<Library[]>(\n currentUser.data?.isAuthenticated && LibraryRequests.domainLibraries(libraryTypes)\n );\n\n let libraries = librariesRequest.data ?? [];\n const exchangeLibraryIndex = libraries?.findIndex(l => l.type === MasterObjectTypes.Exchange);\n const exchangeLibraryId = libraries[exchangeLibraryIndex]?.id;\n\n if (!showExchangeSearchResults)\n libraries = [ ...libraries.slice(0, exchangeLibraryIndex), ...libraries.slice(exchangeLibraryIndex + 1) ];\n\n if (streamableLibraryId) {\n const streamableIndex = libraries?.findIndex(l => l.id.toString() === streamableLibraryId.toString());\n libraries = [ ...libraries.slice(0, streamableIndex), ...libraries.slice(streamableIndex + 1) ];\n }\n\n const hasLibrariesCompleted = (\n streamableLibrary.hasCompleted &&\n (!currentUser.data?.isAuthenticated || librariesRequest.hasCompleted)\n );\n\n return {\n hasLibrariesCompleted,\n libraries,\n exchangeLibraryId,\n streamableLibraryId,\n showExchangeSearchResults\n };\n}\n\nfunction useGetRatings() {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const ratings = Flight.useBasicFetch<Rating[]>(RatingRequests.ratings(currentUser.data?.countryCode));\n\n const {\n activePresentation, availablePresentations, getFallbackPresentation, hasPresentationsLoaded\n } = usePresentation();\n\n const currentPresentation = activePresentation || getFallbackPresentation();\n\n if (!hasPresentationsLoaded)\n return ratings;\n\n if (availablePresentations?.length > 1 || !currentPresentation)\n return ratings;\n\n const learningLevel = TopicsHelper.getMappedPresentationLevel(currentPresentation.learningLevel);\n if (learningLevel !== PresentationLearningLevel.Level_1)\n return ratings;\n\n return {\n ...ratings,\n data: ratings.data?.filter(rating => {\n // Primary schools shouldn't see ratings higher than PG\n return rating.code && rating.value < 64;\n })\n };\n}\n\n/**\n * This hook contains all the simple data fetching that normally sits in the view.\n * I've done this to help promote readability of of the SearchResultsView - Sha\n */\nexport function useFetchSearchData(\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 canViewCurriculums = hasPermissions(PermissionName.ViewCurriculums);\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 canViewCurriculums,\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';\n\nimport { EntityType, HashObject, LocationContext } from 'libs/analytics/interfaces';\n\nimport { MixedSearchResults } from 'libs/shared/apps/search/components/mixed-search-results/MixedSearchResults';\nimport { SearchFilters } from 'libs/shared/apps/search/components/search-filters/SearchFilters';\nimport { SearchSubstitute } from 'libs/shared/apps/search/components/search-substitute/SearchSubstitute';\nimport { SearchSuggestions } from 'libs/shared/apps/search/components/search-suggestions/SearchSuggestions';\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { usePluginHelper } from 'shared/hooks/use-plugin-helper/usePluginHelper';\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\n\nimport { useFetchSearchData } from 'apps/search/hooks/useFetchSearchData';\nimport { useGetSearchResults } from 'apps/search/hooks/useGetSearchResults';\nimport { useGetTagsAndClassifications } from 'apps/search/hooks/useGetTagsAndClassifications';\nimport { useSearchMask } from 'apps/search/hooks/useSearchMask';\nimport { SearchHelper } from 'apps/search/utils';\n\nimport { SearchResultsEmptyState } from './empty-state/SearchResultsEmptyState';\n\nexport const namespace = 'search.searchResults';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface 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 { setFavourite, canFavourite } = useLiteFavourites(LocationContext.VideoThumbnail);\n const { isPlugin } = usePluginHelper();\n const { hasTopicDirectories } = useSettings(null);\n\n const searchData = useFetchSearchData(queryParams);\n\n const searchFilters = SearchHelper.getBackendFilters(searchData);\n\n const hasIndices = !!searchFilters?.appliedIndices.length;\n const tagsAndClassifications = useGetTagsAndClassifications(hasIndices && searchFilters);\n const searchResults = useGetSearchResults({ ...searchFilters, ...searchData });\n\n const filters = SearchHelper.getFilters(\n searchData,\n searchFilters?.inaccessibleIndices,\n hasIndices && tagsAndClassifications\n );\n \n useSetPageMetadata(PageMetadataHelper.getDefaultMetadata({\n title: queryParams.query ?? '',\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n },\n allowIndexing: false\n }));\n\n /**\n * Do we have the data we need for the entire view to render\n */\n const hasLoaded = (\n searchData.hasDataLoaded && filters\n );\n\n /**\n * Do we have the data we need to render our results\n */\n const hasSearchCompleted = (\n searchResults.hasFirstPageCompleted &&\n // Topic and Company requests won't exist if they aren't being fetched\n (!searchData.topics || searchData.topics.hasCompleted) &&\n (!searchData.companies || searchData.companies.hasCompleted) &&\n (!hasIndices || tagsAndClassifications.hasCompleted) &&\n !!filters\n );\n\n /**\n * Do we actually have results\n */\n const hasResults = (\n searchResults.items?.length ||\n searchData.topics?.data?.totalResults ||\n searchData.companies?.data?.totalResults\n );\n\n useSearchMask(hasSearchCompleted);\n\n if (!hasLoaded)\n return <></>;\n\n return (\n <div className='px-4'>\n <SearchSubstitute\n substitute={searchResults.substituteQuery}\n queryParams={queryParams}\n getAppLink={SearchHelper.getSearchAppLink}\n />\n\n {!searchResults.substituteQuery && (\n <SearchSuggestions\n suggestions={searchResults.suggestions}\n queryParams={queryParams}\n getAppLink={SearchHelper.getSearchAppLink}\n />\n )}\n\n {(!!searchData.audiences.data && !!searchData.ratings.data && !!searchData.availableTopics.data) && (\n <SearchFilters\n queryParams={queryParams}\n mainFilters={filters?.mainFilters}\n moreFilters={filters?.moreFilters}\n analyticsOptions={{\n entity: EntityType.SearchResults,\n location: LocationContext.SearchFilters\n }}\n appLink={{ application: AppChannels.SEARCH, action: Actions.Search.HOME }}\n isFetchingOptions={tagsAndClassifications.isFetching}\n />\n )}\n\n {hasSearchCompleted &&\n <section>\n {hasResults\n ? (\n <VideoActionsContext.Provider value={videoActions}>\n <MixedSearchResults\n queryParams={queryParams}\n results={searchResults.items}\n topics={searchData.topics?.data}\n companies={searchData.companies?.data}\n setFavourite={setFavourite}\n canFavourite={canFavourite}\n audiences={!queryParams.moviesAndTv && searchData.audiences.data}\n currentUser={searchData.currentUser.data}\n imageCdnUrl={searchData.config.data.imageCdnUrl}\n availablePresentations={searchData.availablePresentations}\n showActions={(!searchData.isLearner && searchData.canUseSeriesActions)}\n hasPermissions={searchData.hasPermissions}\n yearGroups={searchData.yearGroups.data}\n isPlugin={isPlugin}\n appLinks={SearchHelper.getAppLinks(\n searchData.currentPresentation,\n searchData.availablePresentations,\n queryParams.moviesAndTv\n )}\n hasTopicDirectories={hasTopicDirectories}\n subTextType='series'\n />\n </VideoActionsContext.Provider>\n ) : (\n <SearchResultsEmptyState\n query={queryParams.query}\n scotland={!!searchData.currentPresentation?.description?.toLowerCase().includes('scotland') ?? false}\n />\n )\n }\n {/* XOR */}\n {(searchResults.hasMore || searchResults.isFetching) && (\n <InfiniteScrollFooter\n isFetching={searchResults.isFetching}\n fetchNext={searchResults.fetchNext}\n nextCursor={searchResults.nextCursor}\n fetchOnScroll\n />\n )}\n </section>\n }\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport type { WidgetSearchItem } from 'libs/shared/apps/search/interfaces/WidgetSearchResults';\nimport { VideoSubTextType } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { WidgetContainerView } from 'libs/shared/components/widgets/curated-widgets/WidgetContainerView';\nimport { AllSearchWidgetTemplates } from 'libs/shared/components/widgets/curated-widgets/WidgetProps';\nimport { type HasLocalPermissionsFunc, type HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { type CanFavouriteFunc, type CurrentUser, DashboardTargetType, type FavouriteFunc, type Presentation, type PresentationAudience, type YearGroup } from 'libs/shared/interfaces';\n\nexport interface MixedWidgetSearchResultsProps {\n data: WidgetSearchItem[];\n widgetAppLinks: AllSearchWidgetTemplates['appLinks'];\n audiences: PresentationAudience[];\n availablePresentations: Presentation[];\n yearGroups: YearGroup[];\n currentUser: CurrentUser;\n subTextType: VideoSubTextType;\n isPlugin?: boolean;\n\n getSeeMoreLink: (widget: WidgetSearchItem) => Core.AppLink;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n hasPermissions: HasPermissionsFunc;\n hasLocalPermissions: HasLocalPermissionsFunc;\n}\n\nexport function MixedWidgetSearchResults(props: MixedWidgetSearchResultsProps): JSX.Element {\n if (!props.data || !props.data.length)\n return <></>;\n \n return (\n <>\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={widget.name}\n content={widget.content.data}\n templateId={widget.templateId}\n widgetTypeId={widget.widgetId}\n \n isPlugin={props.isPlugin}\n audiences={props.audiences}\n currentUser={props.currentUser}\n appLinks={props.widgetAppLinks}\n subTextType={props.subTextType}\n availablePresentations={props.availablePresentations}\n hasPermissions={props.hasPermissions}\n canFavourite={props.canFavourite}\n setFavourite={props.setFavourite}\n seeMoreLink={props.getSeeMoreLink(widget)}\n \n description=''\n metadata={{}}\n isPreviewing={false}\n settings={undefined}\n />\n );\n })}\n </>\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 { 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';\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];\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];\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 );\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};","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 { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\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 { Classification, Presentation } from 'libs/shared/interfaces';\nimport { MasterTypeHelper } from 'libs/shared/utils/MasterTypeHelper';\nimport { TopicsHelper } from 'libs/shared/utils/topics-helper/TopicsHelper';\n\nimport { SearchResultsFilterHelper } from '../utils/SearchResultsFilterHelper';\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 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 /**\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 */\n function mergeSearchResults(data: WidgetSearchItem[]): WidgetSearchItem[] {\n if (!data) return;\n \n const items = [...data];\n\n const groupedData = ArrayHelper.groupBy(items, 'widgetId');\n \n const mergedData = Object.keys(groupedData).map(key => {\n let res: WidgetSearchItem;\n groupedData[key].forEach(obj => {\n res = {\n ...obj,\n content: {\n ...obj.content,\n data: [\n ...(res?.content?.data ? res.content.data : []),\n ...obj.content.data\n ]\n }\n };\n });\n return res;\n });\n\n return mergedData;\n }\n\n function sortByLearningLevel(a: Classification, b: Classification) {\n return TopicsHelper.sortByLearningLevel(a, b, options.availablePresentations);\n }\n\n function transformSearchResults(data: WidgetSearchItem[]): WidgetSearchItem[] {\n if (!data || !data.length)\n return data;\n\n /**\n * Sort first six Relevant topics widget by Exact matches and then by presentation level \n */\n const transformedSearchResults = data.map(item => {\n if (item.widgetId !== WidgetTypeId.SearchRelevantTopics) {\n return item;\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 = item.content.data.slice(0, 6);\n const remainingTopicsData = item.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() === queryParams?.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 ...item,\n content: {\n ...item.content,\n data: [\n ...exactMatchSortedTopics,\n ...remainingSortedTopics,\n ...remainingTopicsData\n ]\n }\n };\n \n return sortedItem;\n }, [] as WidgetSearchItem[]);\n\n return transformedSearchResults;\n }\n\n const items = transformSearchResults(\n mergeSearchResults(\n searchResults.items\n )\n );\n\n return {\n ...searchResults,\n items,\n fetchNext\n };\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 { Classification, Company, CurrentUser, Folder, Playlist, VideoTypes } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\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 params: HashObject,\n queryParams: HashObject,\n currentUser: CurrentUser\n ): MixedWidgetSearchResultsProps['widgetAppLinks'] {\n return {\n classification: (classification?: Classification) =>\n ClassificationAppLinkHelper.getAppLink(classification, params || {}),\n \n videoType: (video: VideoTypes, opts: GetVideoAppLinkOptions) => (\n VideoAppLinkHelper.getAppLink(video, {\n ...opts,\n includeContext: currentUser?.isAuthenticated\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) => ({\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n params: {\n ...queryParams,\n ...filterParams\n }\n }),\n \n classroomGuide: VideoAppLinkHelper.getClassroomGuideAppLink,\n interactiveGuidance: VideoAppLinkHelper.getInteractiveGuidanceAppLink,\n resourceGuidance: VideoAppLinkHelper.getResourceGuidanceAppLink\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 { 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 { usePluginHelper } from 'shared/hooks/use-plugin-helper/usePluginHelper';\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\n\nimport { useFetchSearchDataV2 } from 'apps/search/hooks/useFetchSearchData';\nimport { useSearchMask } from 'apps/search/hooks/useSearchMask';\nimport { SearchHelper } from 'apps/search/utils';\n\nimport { SearchResultsEmptyState } from './empty-state/SearchResultsEmptyState';\nimport { useGetSearchResultsV2 } from './hooks/useGetSearchResultsV2';\nimport { SearchResultsAppLinkHelper } from './utils/SearchResultsAppLinkHelper';\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 { setFavourite, canFavourite } = useLiteFavourites(LocationContext.VideoThumbnail);\n const { isPlugin } = usePluginHelper();\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 * State of the current filters\n */\n const filters = SearchHelper.getFilters(\n searchData,\n searchFilters?.inaccessibleIndices,\n null,\n 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 widgetAppLinks = SearchResultsAppLinkHelper.getSearchWidgetAppLinks(\n AudienceHelper.getAudienceParams(activeAudiences),\n queryParams,\n searchData.currentUser?.data\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 _hasNewSearch={true}\n />\n )}\n\n {hasSearchCompleted &&\n <section>\n {hasResults\n ?\n (\n <VideoActionsContext.Provider value={videoActions}>\n <MixedWidgetSearchResults\n data={searchResults.items}\n widgetAppLinks={widgetAppLinks}\n audiences={searchData.audiences.data}\n isPlugin={isPlugin}\n subTextType='series'\n availablePresentations={searchData.availablePresentations}\n yearGroups={searchData.yearGroups.data}\n currentUser={searchData.currentUser.data}\n \n getSeeMoreLink={widget => SearchResultsAppLinkHelper.getSeeMoreAppLink({\n widget,\n queryParams,\n data: searchResults.items,\n appLinks: widgetAppLinks\n })}\n setFavourite={setFavourite}\n canFavourite={canFavourite}\n hasPermissions={searchData.hasPermissions}\n hasLocalPermissions={searchData.hasLocalPermissions}\n />\n {(searchResults.isFetching || searchResults.nextCursor) &&\n <InfiniteScrollFooter\n isFetching={searchResults.isFetching}\n fetchNext={searchResults.fetchNext}\n nextCursor={searchResults.nextCursor}\n fetchOnScroll={true}\n />\n }\n </VideoActionsContext.Provider>\n ) : (\n <SearchResultsEmptyState\n query={queryParams.query}\n scotland={searchData.currentUser.data?.contentRegion === ContentRegion.SCOT}\n />\n )\n }\n \n </section>\n }\n </div>\n );\n}","import React from 'react';\n\nimport { HashObject } from 'libs/analytics/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 React from 'react';\n\nimport { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { Clip, ClipCollection, CurrentUser, Video, VideoCollection } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nconst CHUNK_SIZE = 50;\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 currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const hydratedVideos = React.useRef<Set<string>>(new Set<string>());\n\n const videos = getValidObjects(objects);\n\n const videoIds = videos.map(v => v.id);\n\n const [ request, setRequest ] = React.useState<Flight.Request[]>([]);\n\n React.useEffect(() => {\n if (!videoIds?.length || !currentUser.hasCompleted)\n return;\n\n const unhydratedVideos: string[] = [];\n\n videoIds.forEach(id => {\n if (!hydratedVideos.current.has(id)) {\n unhydratedVideos.push(id);\n hydratedVideos.current.add(id);\n }\n });\n \n if (!unhydratedVideos.length)\n return;\n\n setRequest(r => {\n const newRequests = [...r] ;\n\n ArrayHelper.chunk<string>(unhydratedVideos, CHUNK_SIZE).forEach(chunk => {\n newRequests.push(VideoRequests.videoMixinAssocs(chunk, options.flightNamespace));\n\n if (currentUser.data?.isAuthenticated)\n newRequests.push(ClassificationRequests.hasCurriculumLinks(chunk, null, options.flightNamespace));\n });\n\n return newRequests;\n });\n }, [ videoIds?.length, currentUser.hasCompleted ]);\n\n Flight.useBasicFetchAll(request);\n}"],"names":["InfiniteScrollFooter","props","ref","inView","fetchOnScroll","isFetching","fetchNext","nextCursor","className","Spinner","as","animation","role","SvgContainer","svgName","size","S","onClick","defaultProps","SCROLL_TOLERANCE","useInfiniteList","getRequest","onError","getItems","getCursor","scrollContainer","options","handleScroll","useState","pagesFetched","setPagesFetched","fetchNextFn","response","cursor","request","key","fetchNextPage","currentVal","hasMore","getBoundingClientRect","height","scrollTop","scrollHeight","window","innerHeight","document","documentElement","useEffect","onScroll","FunctionHelper","addEventListener","removeEventListener","shouldInitialFetch","statusCode","httpStatusClass","toString","substr","HttpStatus","items","totalItems","hasFirstPageCompleted","getFolderAppLink","libraryId","folder","sort","application","action","args","id","name","params","getFolderBgColourClass","charCode","i","length","charCodeAt","CompanyWidgetItem","analyticsData","data","analyticsOptions","location","actionType","entity","descriptor","CoverPill","coverUrl","logo","url","CompanyResult","Col","sm","md","useLargeStyle","lg","item","getChildAppLink","appLinks","getCompanyAppLink","getChildAppLinkOptions","getCompanyAppLinkOptions","itemIndex","search","query","queryParams","score","_score","maxScore","_maxScore","featured","_featured","pagePositionIndex","isLarge","namespace","ExchangeVideoGroup","limit","showCount","currentAppLink","currentParams","currentSource","source","Array","isArray","searchAppLink","AppLink","appLink","Text","phrase","searchSettings","videos","slice","map","v","VideoItem","video","yearGroups","getVideoAppLink","getSubTextAppLink","presentationAudiences","audiences","setFavourite","canFavourite","companyLogoFallbackUrl","subTextType","hasPermissions","getClassroomGuideAppLink","getResourceGuidanceAppLink","getInteractiveGuidanceAppLink","isPlugin","FeaturedVideoResult","HeroVideo","opts","subTextAppLink","hideInteractiveBadge","showVideoGuidance","VideoHelper","imageCdnUrl","showNewVideoIndicator","hasTopicDirectories","PlaylistWithVideos","breakpoints","maxVideos","useBreakpoints","xl","xxl","playlist","playlistAnalyticsOption","playlistAnalyticsData","Row","xs","playlistAppLink","bgColourClassNames","itemStyle","currentUser","showOwner","videoAnalyticsData","videoId","videoName","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","Actions","actions","getCollectionActions","showActions","actionsDropdownClassName","hideBadges","BadgeListContainer","Badge","rating","metadata","year","SmallPlaylistResult","SmallSeriesResult","SubjectResult","getClassificationAppLink","getClassificationAppLinkOptions","availablePresentations","highlightOnHover","VideoResult","Component","ClipItem","InteractiveItem","getPreviewQuestionsAppLink","MixedSearchResults","useSmallComponent","results","topics","totalResults","companies","companiesAndTopics","childProps","c","toLowerCase","result","index","isExchangeVideoGroup","tallPoster","SearchSubstitute","substitute","getAppLink","appLinkOptions","replace","allowSubstitute","SearchSuggestions","suggestions","suggestion","useFetchSchoolLevels","presentation","isLearner","usePermissions","PermissionName","usePresentation","hasPresentationsLoaded","presentationIds","o","SearchRequests","SearchOGQL","classification","clip","interactive","company","category","formatSearchResponse","filter","_index","clips","interactives","resultMaxScore","SharedSearchHelper","stringifyObject","obj","Object","entries","reduce","prev","value","stringifiedValue","includes","searchV5","filters","widgets","widgetData","w","filterData","FilterConstants","indicesFilter","genericFilters","indices","includeAllIndices","ogql","HttpVerbs","searchV4","indicesArr","keys","filterName","join","excludeLibraryExclusive","searchType","undefined","publicUrl","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","hasCompleted","useGetRatings","ratings","RatingRequests","countryCode","activePresentation","getFallbackPresentation","currentPresentation","TopicsHelper","learningLevel","PresentationLearningLevel","code","useFetchSearchData","userDetails","config","ConfigRequests","CustomerRequests","customerId","currentPresentationId","curriculums","useCurriculums","usePresentationAudiences","schoolLevels","schoolLevelIds","availableTopics","ClassificationRequests","hasLocalPermissions","canViewCurriculums","canUseSeriesActions","hasCustomLibraries","hasMoviesAndTv","presentationId","isStudent","rawFilters","FilterHelper","ClassificationType","ClassificationStatus","moviesAndTv","CurationTag","presentationMap","acc","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","r","useVideoMixin","groupingType","exchangeIndex","exchangeShowCount","mixedExchangeResults","exchangeResults","consecutive","forEach","typeId","MasterType","push","exchangeVideoGroup","splice","useGroupExchangeResults","substituteQuery","useSearchMask","showMask","setShowMask","SearchResultsEmptyState","imageUrl","scotland","trim","ImageUrls","EmptyState","src","getPhrase","SearchResultsView","videoActions","useVideoActions","useLiteFavourites","u","usePluginHelper","searchData","searchFilters","hasIndices","inaccessibleIndices","useSetPageMetadata","PageMetadataHelper","title","phraseContext","phraseHandler","titlePhrase","descriptionPhrase","allowIndexing","hasLoaded","hasSearchCompleted","hasResults","SearchFilters","mainFilters","moreFilters","isFetchingOptions","VideoActionsContext","description","MixedWidgetSearchResults","widget","idx","WidgetContainerView","widgetCollection","widgetIndex","content","templateId","widgetTypeId","widgetId","widgetAppLinks","seeMoreLink","getSeeMoreLink","isPreviewing","SupportedSearchWidgetTypeIds","WidgetTypeId","hasQueryParam","targetParam","SearchResultsFilterHelper","isOnlyActiveWidget","getActiveWidgetFilters","cursorContext","context","parsed","JSON","parse","getCursorContext","focusedWidget","focus","getValidFocusedWidget","ArrayHelper","getWidgetIdsFromQueryParams","SearchResultsAppLinkHelper","getSearchWidgetAppLinks","ClassificationAppLinkHelper","videoType","VideoAppLinkHelper","includeContext","SeriesAppLinkHelper","TextHelper","searchHome","filterParams","classroomGuide","interactiveGuidance","resourceGuidance","getSeeMoreAppLink","getAppLinkFunc","WidgetTypeIdConfig","getCollectionAppLink","SearchResultsViewV2","activeAudiences","SharedViewModelKeys","storage","useFetchSearchDataV2","widgetsFilter","responseWidgets","lastWidget","stringify","sortByLearningLevel","groupedData","res","mergeSearchResults","relevantTopicsData","remainingTopicsData","exactMatchSortedTopics","remainingSortedTopics","topic","MasterTypeHelper","useGetSearchResultsV2","AudienceHelper","_hasNewSearch","contentRegion","ContentRegion","LiteSearchResultsView","hasNewSearch","redirectOnError","CHUNK_SIZE","objects","hydratedVideos","Set","getValidObjects","videoIds","setRequest","unhydratedVideos","current","has","add","newRequests","chunk","flightNamespace"],"sourceRoot":""}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[5595],{50690:(e,a,t)=>{t.d(a,{b:()=>r});var n=t(12788),r={renderInPortalIfExists:function(e,a){return a?(0,n.createPortal)(e,a):e}}},84963:(e,a,t)=>{t.d(a,{r:()=>d});var n=t(32735),r=t(23481),o=t(83914),l=t(36532),i=t(35223);const c={tag:"XRj8d",tooltip:"X6mLk"};var s="specialEventCalendar.comingSoonTag";function d(e){return n.createElement(l.u,{title:r.T.getPhrase(s,"tooltip"),spanHackClassName:"d-block ".concat(c.tooltip),spanHack:!0},n.createElement("div",{className:"d-flex text-dark align-items-center ".concat(c.tag," ").concat(e.className)},n.createElement(o.x,{svgName:i.vn.Timer}),!e.onlyIcon&&r.T.getPhrase(s,"comingSoon")))}},73679:(e,a,t)=>{t.d(a,{s:()=>l});var n=t(32735),r=t(36848);const o={dateItem:"I3SBm",label:"PRORs",body:"RfiM_",bodyDay:"ZOVny",bodyRange:"vYhXN",bodyMonth:"mYslO",month:"EPkkQ"};function l(e){var a,t,l;return n.createElement(r.F,{appLink:null===(a=e.getAppLink)||void 0===a?void 0:a.call(e),className:"text-decoration-none text-center bg-white text-dark border border-3 ".concat(null===(t=e.theme)||void 0===t?void 0:t.border," rounded-3 d-block fw-semibold ").concat(e.className),analyticsData:e.analyticsData,analyticsOptions:e.analyticsOptions},n.createElement("div",{className:"position-relative ".concat(o.dateItem)},n.createElement("div",{className:"".concat(null===(l=e.theme)||void 0===l?void 0:l.background," py-1 ").concat(o.label," d-flex align-items-center justify-content-center")},e.label?e.label:n.createElement(n.Fragment,null," ")),n.createElement("div",{className:"".concat(function(){switch(e.body.type){case"range":return o.bodyRange;case"day":return o.bodyDay;case"month":return o.bodyMonth}}()," ").concat(o.body," my-2")},e.body.text),n.createElement("div",{className:"mb-0 ".concat(o.month)},e.month)))}},83657:(e,a,t)=>{t.d(a,{e:()=>s});var n=t(32735),r=t(91967),o=t(10874),l=t(36532),i=t(42735),c=t(86509);function s(e){var a=n.useMemo((function(){return e.actions.sort((function(e,a){return e.order-a.order}))}),[e.actions]),t=[],s=[];a.forEach((function(e){e.button?t.push(e):s.push(e)}));var d="d-flex";return e.className&&(d+=" ".concat(e.className)),t.length||s.length?n.createElement("div",{className:d},t.length?t.map((function(a,t){return n.createElement(n.Fragment,{key:t},function(){if(a.label){var t=r.q.isFunction(a.label)?a.label:function(){return n.createElement(n.Fragment,null,a.label)};return n.createElement(i.K,{appLink:a.appLink,href:a.href,onClick:a.onClick,svgName:a.svgName,svgSize:e.dropdownToggleSvgSize,className:a.className,tooltip:a.tooltip,showSpinner:a.showSpinner,analyticsData:a.analyticsData,analyticsOptions:a.analyticsOptions,openInNewTab:a.openInNewTab,disabled:a.disabled},t())}var c=n.createElement(o.h,{appLink:a.appLink,href:a.href,onClick:a.onClick,svgName:a.svgName,className:a.className,analyticsData:a.analyticsData,analyticsOptions:a.analyticsOptions,openInNewTab:a.openInNewTab,disabled:a.disabled,showBorder:a.showBorder,customSize:e.customSize,ariaLabel:a.tooltip});return a.tooltip?n.createElement(l.u,{title:a.tooltip,spanHack:!0},c):c}())})):n.createElement(n.Fragment,null),e.sortComponent&&e.sortComponent,s.length?n.createElement(c.m,{actions:s,dropdownToggleClassName:e.actionsDropdownClassName,dropdownToggleSvgSize:e.dropdownToggleSvgSize,fetchMore:e.fetchMore}):n.createElement(n.Fragment,null)):n.createElement(n.Fragment,null)}},86509:(e,a,t)=>{t.d(a,{m:()=>b});var n=t(32735),r=t(91967),o=t(81886),l=t(45157),i=t(49985),c=t(36848),s=t(83914),d=t(36532),m=t(35223);const u={dropdownToggle:"UCAnJ"};function g(){return n.createElement(n.Fragment,null,n.createElement("div",{style:{padding:"0.53125rem 1rem"}},n.createElement("div",{className:"partial-loading-background",style:{height:"1.0625rem",width:"8rem"}})),n.createElement("div",{style:{padding:"0.53125rem 1rem"}},n.createElement("div",{className:"partial-loading-background",style:{height:"1.0625rem",width:"12rem"}})),n.createElement("div",{style:{padding:"0.53125rem 1rem"}},n.createElement("div",{className:"partial-loading-background",style:{height:"1.0625rem",width:"11rem"}})),n.createElement("div",{style:{padding:"0.53125rem 1rem"}},n.createElement("div",{className:"partial-loading-background",style:{height:"1.0625rem",width:"9rem"}})))}function p(e){var a="dropdown-item";return e&&(a+=" ".concat(e)),a}function v(e){var a=r.q.isFunction(e.action.label)?e.action.label:function(){return n.createElement(n.Fragment,null,e.action.label)};if(e.action.appLink)return n.createElement(c.F,{appLink:e.action.appLink,onClick:e.action.onClick,className:p(e.action.className),analyticsData:e.action.analyticsData,analyticsOptions:e.action.analyticsOptions,openInNewTab:e.action.openInNewTab,disabled:e.action.disabled},e.action.svgName&&n.createElement(s.x,{svgName:e.action.svgName,className:"d-inline-block svg-container me-2 align-middle"}),n.createElement("span",{className:"align-middle"},a()));function t(a){a.preventDefault(),e.action.analyticsData&&e.action.analyticsOptions&&i.k.logUserAction(e.action.analyticsData,e.action.analyticsOptions),r.q.isFunction(e.action.onClick)&&e.action.onClick(),e.action.href&&o.Q.Ab.PageLoad(e.action.href,e.action.openInNewTab)}return e.action.href?n.createElement("a",{className:p(e.action.className),onClick:t,href:e.action.href},e.action.svgName&&n.createElement(s.x,{svgName:e.action.svgName,className:"d-inline-block svg-container me-2 align-middle"}),n.createElement("span",{className:"align-middle"},a())):n.createElement("span",{className:"cursor-pointer ".concat(p(e.action.className)),onClick:t,role:"button",tabIndex:0,onKeyDown:function(e){return"Enter"===e.key&&t(e)}},e.action.svgName&&n.createElement(s.x,{svgName:e.action.svgName,className:"d-inline-block svg-container me-2"}),a())}function b(e){if(!e.actions||!e.actions.length)return n.createElement(n.Fragment,null);var a=e.actions.some((function(e){return e.lazyPlaceholder})),t="dropdown";e.className&&(t+=" ".concat(e.className));var r,o="actions-dropdown-".concat(l.Y.getRandomInt()),i="dropdown-toggle px-0 ".concat(u.dropdownToggle);return e.dropdownToggleClassName&&(i+=" ".concat(e.dropdownToggleClassName)),n.createElement("div",{className:t},n.createElement("button",{className:i,type:"button",id:o,"data-bs-toggle":"dropdown","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false","aria-label":"More actions dropdown",onClick:a?e.fetchMore:null},n.createElement(s.x,{svgName:m.vn.More,size:e.dropdownToggleSvgSize})),n.createElement("ul",{className:"dropdown-menu dropdown-menu-end dropdown-menu-right font-size-normal","aria-labelledby":o},a?n.createElement(g,null):e.actions.map((function(e,a){var t=void 0!==r&&r!==e.group;return r=e.group,e.tooltip?n.createElement("li",{key:a},t&&n.createElement("hr",{className:"dropdown-divider",role:"separator"}),n.createElement(d.u,{title:e.tooltip,spanHack:!0},n.createElement(v,{action:e}))):n.createElement("li",{key:a},t&&n.createElement("hr",{className:"dropdown-divider",role:"separator"}),n.createElement(v,{action:e}))}))))}b.defaultProps={dropdownToggleClassName:"btn btn-light",dropdownToggleSvgSize:s.S.Small}},44522:(e,a,t)=>{t.d(a,{p:()=>x,v:()=>S});var n=t(32735),r=t(110),o=t(50690),l=t(84963),i=t(73679),c=t(83657),s=t(23481),d=t(36848),m=t(83914),u=t(35223),g="shared.backButton";function p(e){var a=Object.assign({textShadow:!0},e),t=a.backToName,r=a.appLink,o=a.color,l=a.extraClasses,i=a.textShadow,c=t?s.T.getPhrase(g,"backTo",{backToName:t}):s.T.getPhrase(g,"back"),p="black"===o?"":"text-white",v=i?"text-shadow":"";return n.createElement(d.F,{appLink:r,className:"d-inline-flex align-items-center h5 mb-0 ".concat(l," ").concat(p," ").concat(v)},n.createElement(m.x,{svgName:u.vn.ChevronLeft,size:m.S.Medium}),n.createElement("span",{className:"ms-1"},c))}p.defaultProps={color:"black",extraClasses:""};var v=t(36518),b=t(83345),f=t(10587),h=t(94232),E=t(54610),y=t(79967),N=t(67453);const k={bannerContent:"sSCTB",actionsContainer:"Z5WI2",bannerContentWithLogo:"rgs7Q",container:"M51HJ",logoContainer:"vkeJk",logoContainerLeft:"M3U9B",logoHeading:"EtRwC",specialEventContainer:"rOxDc",headingLarge:"_8pnV",heading:"JXVBH"};var w="".concat(f.y[E.__.Banners].width,":").concat(f.y[E.__.Banners].height);function C(e){return e.length<160?"h1":k.headingLarge}var x=n.memo((function(e){var a,t,s,d,m=e.heading,u=e.banner,g=e.imageCdnUrl,f=e.actions,x=e.sortComponent,S=e.blockColourClass,L=e.specialEvent,D=n.useContext(h.n),F=(0,y.k)().xxl?1920:1200,O=n.useMemo((function(){if(!L||e.showComingSoon)return!1;var a=r.O.format(new Date,"YYYY-MM-DD");return L.endDate?L.startDate<=a&&L.endDate>=a:L.startDate===a}),[L]),T=e.imageOptions||{width:F,ratio:w,resizeType:E.Nq.Cover},M=!!u&&!!g&&N.j.createBannerUrl(u,{fallbackBaseUrl:g,fallbackCategoryName:m,type:E.__.Banners},T),A={className:"banner banner-header ".concat(e.bannerClassName),style:M?{backgroundImage:"url('".concat(M,"')")}:{}};!u&&S&&(delete A.style,A.className+=" ".concat(S));var I=e.detailsComponent;return o.b.renderInPortalIfExists(n.createElement("header",Object.assign({},A),n.createElement("div",{className:"container ".concat(k.container," position-relative inner-banner")},e.backButtonAppLink&&n.createElement("div",{className:"pt-3"},n.createElement(p,{appLink:e.backButtonAppLink,backToName:e.backButtonText,extraClasses:e.backButtonClasses,color:"white"})),n.createElement("div",{className:"".concat(e.alignLogoLeft?"position-absolute top-50 start-0 translate-middle-y w-100 ps-4":"".concat(k.bannerContent," px-2 ").concat((null===(a=e.logo)||void 0===a?void 0:a.url)?k.bannerContentWithLogo:""))},!!L&&n.createElement("div",{className:"position-relative ".concat(k.specialEventContainer)},n.createElement(i.s,{body:{type:L.endDate?"range":"day",text:L.endDate?"".concat(r.O.format(L.startDate,"DD"),"-").concat(r.O.format(L.endDate,"DD")):r.O.format(L.startDate,"DD")},month:function(e){return e.endDate?r.O.isSame(e.startDate,e.endDate,"month")?r.O.format(e.startDate,"MMMM"):"".concat(r.O.format(e.startDate,"MMM")," - ").concat(r.O.format(e.endDate,"MMM")):r.O.format(e.startDate,"MMMM")}(L),theme:e.calendarTheme})),n.createElement("div",null,O&&n.createElement("div",{className:"rounded-pill py-1 px-2 my-1 me-1 fw-semibold bg-light-blue lh-1 d-inline-block"},n.createElement(b.x,{namespace:"shared.bannerHeader",phrase:"onToday"})),e.showComingSoon&&n.createElement(l.r,{className:"pe-2 fw-semibold mb-1 rounded-pill justify-content-start text-nowrap"}),n.createElement("div",{className:"d-flex align-items-center"},e.alignLogoLeft&&n.createElement("div",{className:"".concat(k.logoContainerLeft," d-none d-md-block partial-loading-background rounded-circle overflow-hidden me-3")},(null===(t=e.logo)||void 0===t?void 0:t.url)&&n.createElement(v.w,{src:N.j.createUrl(null===(s=e.logo)||void 0===s?void 0:s.url,{size:E.h2.Medium})})),n.createElement("h1",{className:"text-white text-shadow pe-3 position-static ".concat(k.heading," ").concat(C(m)," ").concat(e.alignLogoLeft?"w-50":"")},m,I&&n.createElement(I,null)))),!!f&&n.createElement("div",{className:k.actionsContainer},n.createElement(c.e,{actions:f,sortComponent:x,actionsDropdownClassName:e.actionsDropdownClassName}))),!e.alignLogoLeft&&!!(null===(d=e.logo)||void 0===d?void 0:d.url)&&n.createElement("div",{className:k.logoContainer},n.createElement("img",{src:N.j.createUrl(e.logo.url,{size:E.h2.Small}),className:"rounded-circle"})))),null==D?void 0:D.container)}),(function(e,a){var t,n;return e.actions===a.actions&&e.heading===a.heading&&(null===(t=e.logo)||void 0===t?void 0:t.url)===(null===(n=a.logo)||void 0===n?void 0:n.url)}));function S(){var e=n.useContext(h.n);return o.b.renderInPortalIfExists(n.createElement("div",{className:"partial-banner partial-loading-background ".concat(k.banner)}),null==e?void 0:e.container)}},11921:(e,a,t)=>{t.d(a,{F:()=>i});var n=t(32735),r=t(35223),o=t(83914);var l=function(e){switch(e){case"up":return"JAT0R";case"down":return"ld41u";case"right":return"HHkPe";case"left":return"jZTRR"}};function i(e){return n.createElement(o.x,{svgName:r.vn.Caret,className:"".concat(l(e.direction)," svg-container d-inline-block ").concat(e.className)})}i.defaultProps={direction:"right"}},88711:(e,a,t)=>{t.d(a,{j:()=>o});var n=t(32735),r=t(20455);function o(e){var a,t,o=(0,r.O1)(Object.assign(Object.assign({},e.draggable),{disabled:!e.draggable,attributes:{role:"drag",tabIndex:-1}})),l=o.active,i=o.isDragging,c=o.attributes,s=o.listeners,d=o.setNodeRef,m=(0,r.Zj)(Object.assign(Object.assign({},e.droppable),{disabled:!e.droppable})),u=m.isOver,g=m.over,p=m.active,v=m.setNodeRef;return n.useEffect((function(){var a,t,n,r=null===(a=e.draggable)||void 0===a?void 0:a.data;Array.isArray(r)&&(null==r?void 0:r.includes(null==l?void 0:l.id.toString()))?null===(t=e.setIsDragging)||void 0===t||t.call(e,i):null===(n=e.setIsDragging)||void 0===n||n.call(e,!1)}),[i]),n.createElement("div",Object.assign({ref:d},s,c,{className:"".concat(e.draggable?"cursor-grab":"cursor-default"," ").concat(i&&l||e.isDragging&&(t=null===(a=e.draggable)||void 0===a?void 0:a.data,Array.isArray(t)&&t.includes(e.draggable.id.toString()))?e.dragStyle:null)}),n.createElement("div",{ref:v,className:p&&u&&(null==l?void 0:l.id)!==(null==g?void 0:g.id)?e.dropStye:null},e.children))}},39958:(e,a,t)=>{t.d(a,{$:()=>g});var n=t(32735),r=t(57900),o=t(11921),l=t(11607),i=t(20710),c=t(83345),s=t(79967);function d(e,a){(null==a||a>e.length)&&(a=e.length);for(var t=0,n=Array(a);t<a;t++)n[t]=e[t];return n}var m="libraries.folderList",u="has:expanded:library:folders";function g(e){var a,t,g,p=(t=n.useState(r.SG.get(u)||!1),g=2,function(e){if(Array.isArray(e))return e}(t)||function(e,a){var t=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=t){var n,r,o,l,i=[],c=!0,s=!1;try{if(o=(t=t.call(e)).next,0===a){if(Object(t)!==t)return;c=!1}else for(;!(c=(n=o.call(t)).done)&&(i.push(n.value),i.length!==a);c=!0);}catch(e){s=!0,r=e}finally{try{if(!c&&null!=t.return&&(l=t.return(),Object(l)!==l))return}finally{if(s)throw r}}return i}}(t,g)||function(e,a){if(e){if("string"==typeof e)return d(e,a);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?d(e,a):void 0}}(t,g)||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.")}()),v=p[0],b=p[1],f=e.expandFolders||v,h=(a=(0,s.k)()).xxl||a.xl||a.lg?6:a.md?4:3;function E(){b(!f),r.SG.set(u,!f)}var y=f?e.folders:e.folders.slice(0,h),N=e.folders.length>h&&!e.expandFolders;return n.createElement(n.Fragment,null,n.createElement("div",{className:"d-flex justify-content-between align-items-center"},e.showHeading&&n.createElement(l.L,{className:"d-inline-flex align-items-center mb-2 px-2 ".concat(N?"":"cursor-default"),onClick:E},N&&n.createElement(o.F,{direction:f?"down":"right"}),n.createElement("h2",{className:"h4 mb-0"},n.createElement(c.x,{namespace:m,phrase:"folders",options:{count:e.folders.length}}))),!(f||!N)&&n.createElement("div",{className:"d-flex justify-content-end justify-self-end px-2"},n.createElement(l.L,{onClick:E,className:"text-dark hover-text-underline d-inline-block"},n.createElement(c.x,{namespace:m,phrase:"seeAll",options:{count:e.folders.length}}))),!(!f||!N)&&n.createElement("div",{className:"d-flex justify-content-end justify-self-end px-2"},n.createElement(l.L,{onClick:E,className:"text-dark hover-text-underline d-inline-block"},n.createElement(c.x,{namespace:m,phrase:"seeLess"}))),e.extraButtons?e.extraButtons:n.createElement(n.Fragment,null)),n.createElement("div",{className:"row mx-1"},y.map((function(a){return n.createElement("div",{key:a.id,className:"col-4 col-md-3 col-lg-2 px-1 pb-3"},n.createElement(i.y,{folder:a,getAppLink:e.getAppLink,getFolderActions:e.getFolderActions,drag:e.drag,drop:e.drop}))}))))}g.defaultProps={showHeading:!0}},65403:(e,a,t)=>{t.d(a,{i:()=>l});var n=t(32735);const r={partialFolderHeading:"dhbsL",partialFolderThumbnail:"CI9vk",partialFolderName:"l0Nll"};var o=function(){return n.createElement("div",{className:"col-4 col-md-3 col-lg-2 px-1 pb-3"},n.createElement("div",{className:"".concat(r.partialFolderThumbnail," partial-loading-background rounded-top-lg")}),n.createElement("div",{className:"".concat(r.partialFolderName," partial-loading-background border-bottom rounded-bottom-lg font-size-normal mb-0 p-2")}," "))};function l(e){var a=e.count,t=void 0===a?3:a;return n.createElement(n.Fragment,null,n.createElement("div",{className:"".concat(r.partialFolderHeading," h4 mb-2 partial-loading-background")}," "),n.createElement("div",{className:"row mx-n1"},Array(t).fill(null).map((function(e,a){return n.createElement(o,{key:a})}))))}},20710:(e,a,t)=>{t.d(a,{y:()=>u});var n=t(32735),r=t(97395),o=t(83657),l=t(36848),i=t(88711),c=t(75163),s=t(5465),d=t(54610);const m={actions:"cN3nB",actionsContainer:"xM37V",dropStyle:"kvCLS",dragStyle:"md9Na"};function u(e){var a,t=e.folder.thumbnail?r._.urlBuilder(e.folder.thumbnail.url,{size:d.h2.Small}):null,u=null===(a=e.getFolderActions)||void 0===a?void 0:a.call(e,e.folder);return n.createElement(i.j,{draggable:e.drag&&{id:e.folder.id,data:e.folder},droppable:e.drop&&{id:e.folder.id,data:e.folder},dropStye:m.dropStyle,dragStyle:m.dragStyle},n.createElement("div",{className:"position-relative"},n.createElement(l.F,{className:"rounded-3 d-block text-decoration-none",appLink:e.getAppLink(e.folder),title:e.folder.name},n.createElement(c.Z,{data:t,imageType:d.__.Thumbnails,imageClassName:"rounded-top-lg"},n.createElement(s.oy,{name:e.folder.name,type:s.mS.Folder,extraClasses:"rounded-top-lg"})),n.createElement("h3",{className:"bg-white border-start border-end border-bottom rounded-bottom-lg font-size-normal fw-semibold mb-0 p-2"},n.createElement("span",{className:"text-truncate d-block"},e.folder.name))),(null==u?void 0:u.length)&&n.createElement(o.e,{actions:u,className:m.actionsContainer,actionsDropdownClassName:m.actions,dropdownToggleSvgSize:null})))}},94644:(e,a,t)=>{t.d(a,{r:()=>d});var n=t(50242),r=t(81886),o=t(67058),l=t(14553),i=t(49267),c=t(49075),s={notFound:o.d,forbidden:{rating:l.q,yearLevel:l.q,region:i.a,privacy:l.q},badRequest:c._,internalServerError:c._};function d(e){var a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e){var o;o="number"==typeof e?e:e.status;var l=Object.assign(Object.assign({},s),a);o&&r.Q.Ry.isStatusCodeError(o)&&(o!==n.o.InternalServer?o!==n.o.NotFound?o!==n.o.Forbidden?t.badRequest||r.Q.Ry.throw(new l.badRequest):t.forbidden||r.Q.Ry.throw(new l.forbidden.privacy):t.notFound||r.Q.Ry.throw(new l.notFound):t.internalServerError||r.Q.Ry.throw(new c._))}}},91286:(e,a,t)=>{t.d(a,{v:()=>l});var n=t(32735),r=t(94644);function o(e){return e.map((function(e){return e.statusCode})).join(":")}function l(e,a,t){var l=Array.isArray(e)?e:[e];(0,n.useEffect)((function(){l.forEach((function(e){(0,r.r)(e.statusCode,a,t)}))}),[o(l),a,t])}},98860:(e,a,t)=>{t.d(a,{P:()=>i});var n=t(20354),r=t(98064),o=t(3010),l=t(45719);function i(e){var a=n.a.useGetFetch();function t(a){return r.D.childFolders(e,a)}return(0,o.i)(!!e&&t,!!e&&function(e){a(t(e))}),(0,l.P)(!!e&&function(e){return t(e).key})}},21325:(e,a,t)=>{t.d(a,{o:()=>i});var n=t(32735),r=t(81886),o=t(96560),l=t(67058);function i(e){n.useEffect((function(){e.hasCompleted&&!e.hasError&&e.data.type!==o.r.CustomLibrary&&r.Q.Ry.throw(new l.d)}),[e.hasCompleted])}},8406:(e,a,t)=>{t.d(a,{W:()=>c,a:()=>i});var n=t(28400),r=t(7733),o=t(14070),l=t(97291);function i(e,a,t){return e&&a?{application:l.O.LIBRARIES,action:o.e.Libraries.FOLDER,args:[e,a.id,n.m.slugify(a.name)],params:{sort:t}}:null}function c(e){for(var a,t,n=0,o=0;null!==(t=o<(null===(a=e.name)||void 0===a?void 0:a.length))&&void 0!==t&&t;o++)n+=e.name.charCodeAt(o);return r.o[n%r.o.length]}},55595:(e,a,t)=>{t.r(a),t.d(a,{LibraryView:()=>x});var n=t(32735),r=t(20354),o=t(65858),l=t(43500),i=t(44522),c=t(39958),s=t(65403),d=t(10874),m=t(4201),u=t(83345),g=t(98064),p=t(31949),v=t(91286),b=t(79612),f=t(35223),h=t(68140),E=t(14070),y=t(97291),N=t(98860),k=t(21325),w=t(8406),C="libraries.library";function x(e){var a,t,x,S,L=(0,m.of)().focusSearchBar,D=r.a.useBasicFetch(g.D.domainLibraries(["customLibrary","sharedLibrary"])),F=r.a.useBasicFetch(g.D.library(e.id)),O=(0,N.P)(null===(t=null===(a=F.data)||void 0===a?void 0:a.categoryTree)||void 0===t?void 0:t.id),T=r.a.useBasicFetch(p.N.currentUser()),M=!!T.data&&h.d.getOrSetSortType(T.data.id,e.sort);return(0,b.M)({title:null===(x=F.data)||void 0===x?void 0:x.name}),(0,v.v)(F),(0,k.o)(F),n.createElement(n.Fragment,null,F.data?n.createElement(i.p,{heading:F.data.name,blockColourClass:(0,w.W)(F.data),logo:null===(S=F.data.owner)||void 0===S?void 0:S.logo}):n.createElement(i.v,null),function(){var a,t;return(null==O?void 0:O.items)?O.items.length?n.createElement("div",{className:"mt-3 px-2"},n.createElement(c.$,{folders:O.items,getAppLink:function(a){return(0,w.a)(e.id,a,M)},expandFolders:!0,extraButtons:n.createElement(d.h,{svgName:f.vn.Search,appLink:{application:y.O.SEARCH,action:E.e.Search.HOME,params:{source:l.fi.School}},className:"btn btn-outline-dark mb-3 me-2 d-none d-sm-inline-block",onClick:L,analyticsData:{},analyticsOptions:{entity:o.py.SearchResults,location:o.LZ.Libraries,actionType:o.Vw.Click,descriptor:o.Bk.School}},n.createElement(u.x,{namespace:C,phrase:"searchLibrary",options:{smartCount:null!==(t=null===(a=D.data)||void 0===a?void 0:a.length)&&void 0!==t?t:1}}))})):n.createElement(n.Fragment,null):n.createElement("div",{className:"mt-3 px-3"},n.createElement(s.i,{count:10}))}())}}}]);
|
|
2
|
-
//# sourceMappingURL=5595-10e586779d-lite.chunk.js.map
|