@clickview/lite 0.48.0-rc.7 → 0.48.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundles.json +1 -1
- package/dist/scripts/{170-1f815b85a1-lite.chunk.js → 170-2d124965b7-lite.chunk.js} +2 -2
- package/dist/scripts/{170-1f815b85a1-lite.chunk.js.map → 170-2d124965b7-lite.chunk.js.map} +1 -1
- package/dist/scripts/{1818-b9f9297d6d-lite.chunk.js → 1818-72409e60a9-lite.chunk.js} +1 -1
- package/dist/scripts/{1818-b9f9297d6d-lite.chunk.js.map → 1818-72409e60a9-lite.chunk.js.map} +1 -1
- package/dist/scripts/{1863-cf9df40052-lite.chunk.js → 1863-e7c4a6f342-lite.chunk.js} +1 -1
- package/dist/scripts/{1863-cf9df40052-lite.chunk.js.map → 1863-e7c4a6f342-lite.chunk.js.map} +1 -1
- package/dist/scripts/{1958-9889c1ad24-lite.chunk.js → 1958-5336189397-lite.chunk.js} +1 -1
- package/dist/scripts/{1958-9889c1ad24-lite.chunk.js.map → 1958-5336189397-lite.chunk.js.map} +1 -1
- package/dist/scripts/{2086-a247f6e201-lite.chunk.js → 2086-f7082703d0-lite.chunk.js} +1 -1
- package/dist/scripts/{2086-a247f6e201-lite.chunk.js.map → 2086-f7082703d0-lite.chunk.js.map} +1 -1
- package/dist/scripts/{2118-462a279c5a-lite.chunk.js → 2118-ec2a5f1e9b-lite.chunk.js} +2 -2
- package/dist/scripts/{2118-462a279c5a-lite.chunk.js.map → 2118-ec2a5f1e9b-lite.chunk.js.map} +1 -1
- package/dist/scripts/{2182-5c9db07f5b-lite.chunk.js → 2182-8e4d603a1b-lite.chunk.js} +1 -1
- package/dist/scripts/{2182-5c9db07f5b-lite.chunk.js.map → 2182-8e4d603a1b-lite.chunk.js.map} +1 -1
- package/dist/scripts/{2279-5e92c84310-lite.chunk.js → 2279-252e92e1d8-lite.chunk.js} +1 -1
- package/dist/scripts/{2279-5e92c84310-lite.chunk.js.map → 2279-252e92e1d8-lite.chunk.js.map} +1 -1
- package/dist/scripts/{2355-6cd89fa80d-lite.chunk.js → 2355-c588dc3ce2-lite.chunk.js} +1 -1
- package/dist/scripts/{2355-6cd89fa80d-lite.chunk.js.map → 2355-c588dc3ce2-lite.chunk.js.map} +1 -1
- package/dist/scripts/{2469-aa5bbbb17f-lite.chunk.js → 2469-46411b862e-lite.chunk.js} +1 -1
- package/dist/scripts/{2469-aa5bbbb17f-lite.chunk.js.map → 2469-46411b862e-lite.chunk.js.map} +1 -1
- package/dist/scripts/{2672-0fc559f1d1-lite.chunk.js → 2672-b01985cee8-lite.chunk.js} +1 -1
- package/dist/scripts/{2672-0fc559f1d1-lite.chunk.js.map → 2672-b01985cee8-lite.chunk.js.map} +1 -1
- package/dist/scripts/{2734-6c6d57d0f3-lite.chunk.js → 2734-6a7beb2ce2-lite.chunk.js} +1 -1
- package/dist/scripts/{2734-6c6d57d0f3-lite.chunk.js.map → 2734-6a7beb2ce2-lite.chunk.js.map} +1 -1
- package/dist/scripts/{287-ba98be7f21-lite.chunk.js → 287-3cbed16363-lite.chunk.js} +1 -1
- package/dist/scripts/{287-ba98be7f21-lite.chunk.js.map → 287-3cbed16363-lite.chunk.js.map} +1 -1
- package/dist/scripts/{2875-0e5f209e47-lite.chunk.js → 2875-aefd69a61f-lite.chunk.js} +1 -1
- package/dist/scripts/{2875-0e5f209e47-lite.chunk.js.map → 2875-aefd69a61f-lite.chunk.js.map} +1 -1
- package/dist/scripts/{3042-6650521d8b-lite.chunk.js → 3042-7c1b5e4ff7-lite.chunk.js} +1 -1
- package/dist/scripts/{3042-6650521d8b-lite.chunk.js.map → 3042-7c1b5e4ff7-lite.chunk.js.map} +1 -1
- package/dist/scripts/{3158-31baada6cc-lite.chunk.js → 3158-2147de456d-lite.chunk.js} +1 -1
- package/dist/scripts/{3158-31baada6cc-lite.chunk.js.map → 3158-2147de456d-lite.chunk.js.map} +1 -1
- package/dist/scripts/{3296-6d80e4dd56-lite.chunk.js → 3296-f3732c93d9-lite.chunk.js} +1 -1
- package/dist/scripts/{3296-6d80e4dd56-lite.chunk.js.map → 3296-f3732c93d9-lite.chunk.js.map} +1 -1
- package/dist/scripts/{3541-7ebd9db295-lite.chunk.js → 3541-15581012d3-lite.chunk.js} +1 -1
- package/dist/scripts/{3541-7ebd9db295-lite.chunk.js.map → 3541-15581012d3-lite.chunk.js.map} +1 -1
- package/dist/scripts/{3841-95df66e647-lite.chunk.js → 3841-bfae79638b-lite.chunk.js} +2 -2
- package/dist/scripts/{3841-95df66e647-lite.chunk.js.map → 3841-bfae79638b-lite.chunk.js.map} +1 -1
- package/dist/scripts/{3888-0bee9a9309-lite.chunk.js → 3888-87c1075a1b-lite.chunk.js} +1 -1
- package/dist/scripts/{3888-0bee9a9309-lite.chunk.js.map → 3888-87c1075a1b-lite.chunk.js.map} +1 -1
- package/dist/scripts/{4138-75a2bb69ab-lite.chunk.js → 4138-b9b03c9900-lite.chunk.js} +1 -1
- package/dist/scripts/{4138-75a2bb69ab-lite.chunk.js.map → 4138-b9b03c9900-lite.chunk.js.map} +1 -1
- package/dist/scripts/{4778-ebe369973c-lite.chunk.js → 4778-3c9f2b7f76-lite.chunk.js} +2 -2
- package/dist/scripts/{4778-ebe369973c-lite.chunk.js.map → 4778-3c9f2b7f76-lite.chunk.js.map} +1 -1
- package/dist/scripts/{4942-a27a31e79e-lite.chunk.js → 4942-acce40b333-lite.chunk.js} +2 -2
- package/dist/scripts/{4942-a27a31e79e-lite.chunk.js.map → 4942-acce40b333-lite.chunk.js.map} +1 -1
- package/dist/scripts/{5075-f8719465be-lite.chunk.js → 5075-53172298fe-lite.chunk.js} +1 -1
- package/dist/scripts/{5075-f8719465be-lite.chunk.js.map → 5075-53172298fe-lite.chunk.js.map} +1 -1
- package/dist/scripts/{5157-cd12e2e443-lite.chunk.js → 5157-47a0f5c088-lite.chunk.js} +1 -1
- package/dist/scripts/{5157-cd12e2e443-lite.chunk.js.map → 5157-47a0f5c088-lite.chunk.js.map} +1 -1
- package/dist/scripts/{5268-f4db3933ff-lite.chunk.js → 5268-9b7560f3b1-lite.chunk.js} +2 -2
- package/dist/scripts/{5268-f4db3933ff-lite.chunk.js.map → 5268-9b7560f3b1-lite.chunk.js.map} +1 -1
- package/dist/scripts/{5442-01ffd95162-lite.chunk.js → 5442-5ddfa2d951-lite.chunk.js} +1 -1
- package/dist/scripts/{5442-01ffd95162-lite.chunk.js.map → 5442-5ddfa2d951-lite.chunk.js.map} +1 -1
- package/dist/scripts/{5591-98cfe6c6e5-lite.chunk.js → 5591-119d72ede5-lite.chunk.js} +1 -1
- package/dist/scripts/{5591-98cfe6c6e5-lite.chunk.js.map → 5591-119d72ede5-lite.chunk.js.map} +1 -1
- package/dist/scripts/{5595-3763b14d77-lite.chunk.js → 5595-628d4f252c-lite.chunk.js} +2 -2
- package/dist/scripts/5595-628d4f252c-lite.chunk.js.map +1 -0
- package/dist/scripts/{6102-4d948a5e48-lite.chunk.js → 6102-751dbbbf33-lite.chunk.js} +3 -3
- package/dist/scripts/{6102-4d948a5e48-lite.chunk.js.map → 6102-751dbbbf33-lite.chunk.js.map} +1 -1
- package/dist/scripts/{6158-0c5e44f800-lite.chunk.js → 6158-d123add596-lite.chunk.js} +1 -1
- package/dist/scripts/{6158-0c5e44f800-lite.chunk.js.map → 6158-d123add596-lite.chunk.js.map} +1 -1
- package/dist/scripts/{6263-8957d50afe-lite.chunk.js → 6263-24e67b7df2-lite.chunk.js} +1 -1
- package/dist/scripts/{6263-8957d50afe-lite.chunk.js.map → 6263-24e67b7df2-lite.chunk.js.map} +1 -1
- package/dist/scripts/{6330-c66465bd6d-lite.chunk.js → 6330-9a2a5fc07e-lite.chunk.js} +1 -1
- package/dist/scripts/{6330-c66465bd6d-lite.chunk.js.map → 6330-9a2a5fc07e-lite.chunk.js.map} +1 -1
- package/dist/scripts/{671-003843ca84-lite.chunk.js → 671-5571f33165-lite.chunk.js} +1 -1
- package/dist/scripts/{671-003843ca84-lite.chunk.js.map → 671-5571f33165-lite.chunk.js.map} +1 -1
- package/dist/scripts/{7167-efe85af16e-lite.chunk.js → 7167-dc4c954c2b-lite.chunk.js} +1 -1
- package/dist/scripts/{7167-efe85af16e-lite.chunk.js.map → 7167-dc4c954c2b-lite.chunk.js.map} +1 -1
- package/dist/scripts/7293-58f4a7cf47-lite.chunk.js +2 -0
- package/dist/scripts/{7293-afd3349468-lite.chunk.js.map → 7293-58f4a7cf47-lite.chunk.js.map} +1 -1
- package/dist/scripts/{7301-f20e4bdb8f-lite.chunk.js → 7301-7c9342ef0c-lite.chunk.js} +1 -1
- package/dist/scripts/{7301-f20e4bdb8f-lite.chunk.js.map → 7301-7c9342ef0c-lite.chunk.js.map} +1 -1
- package/dist/scripts/{7708-ece31b78a9-lite.chunk.js → 7708-e91903481a-lite.chunk.js} +1 -1
- package/dist/scripts/{7708-ece31b78a9-lite.chunk.js.map → 7708-e91903481a-lite.chunk.js.map} +1 -1
- package/dist/scripts/{771-eb60e33941-lite.chunk.js → 771-5612b4ffc2-lite.chunk.js} +2 -2
- package/dist/scripts/{771-eb60e33941-lite.chunk.js.map → 771-5612b4ffc2-lite.chunk.js.map} +1 -1
- package/dist/scripts/{7855-37bcdd134e-lite.chunk.js → 7855-4b69540a71-lite.chunk.js} +1 -1
- package/dist/scripts/{7855-37bcdd134e-lite.chunk.js.map → 7855-4b69540a71-lite.chunk.js.map} +1 -1
- package/dist/scripts/{8024-66413cc05b-lite.chunk.js → 8024-765a4170c7-lite.chunk.js} +2 -2
- package/dist/scripts/{8024-66413cc05b-lite.chunk.js.map → 8024-765a4170c7-lite.chunk.js.map} +1 -1
- package/dist/scripts/{823-58d27c255b-lite.chunk.js → 823-33c5207c68-lite.chunk.js} +1 -1
- package/dist/scripts/{823-58d27c255b-lite.chunk.js.map → 823-33c5207c68-lite.chunk.js.map} +1 -1
- package/dist/scripts/8261-69854ff4d5-lite.chunk.js +2 -0
- package/dist/scripts/8261-69854ff4d5-lite.chunk.js.map +1 -0
- package/dist/scripts/{8466-ee9d40ee97-lite.chunk.js → 8466-cea62163e8-lite.chunk.js} +1 -1
- package/dist/scripts/{8466-ee9d40ee97-lite.chunk.js.map → 8466-cea62163e8-lite.chunk.js.map} +1 -1
- package/dist/scripts/{8681-41edd08b98-lite.chunk.js → 8681-49db3daae6-lite.chunk.js} +2 -2
- package/dist/scripts/{8681-41edd08b98-lite.chunk.js.map → 8681-49db3daae6-lite.chunk.js.map} +1 -1
- package/dist/scripts/{8772-9ae4d77363-lite.chunk.js → 8772-6c11095cea-lite.chunk.js} +1 -1
- package/dist/scripts/{8772-9ae4d77363-lite.chunk.js.map → 8772-6c11095cea-lite.chunk.js.map} +1 -1
- package/dist/scripts/{8906-b75b51bd0f-lite.chunk.js → 8906-2f6b5e4c5c-lite.chunk.js} +2 -2
- package/dist/scripts/{8906-b75b51bd0f-lite.chunk.js.map → 8906-2f6b5e4c5c-lite.chunk.js.map} +1 -1
- package/dist/scripts/{920-4de8efbcf1-lite.chunk.js → 920-acc6596891-lite.chunk.js} +1 -1
- package/dist/scripts/{920-4de8efbcf1-lite.chunk.js.map → 920-acc6596891-lite.chunk.js.map} +1 -1
- package/dist/scripts/{9212-8f95fbd9b9-lite.chunk.js → 9212-cc987a13bf-lite.chunk.js} +1 -1
- package/dist/scripts/{9212-8f95fbd9b9-lite.chunk.js.map → 9212-cc987a13bf-lite.chunk.js.map} +1 -1
- package/dist/scripts/{9242-2e533bdc0d-lite.chunk.js → 9242-144e7728ad-lite.chunk.js} +1 -1
- package/dist/scripts/{9242-2e533bdc0d-lite.chunk.js.map → 9242-144e7728ad-lite.chunk.js.map} +1 -1
- package/dist/scripts/{9264-d2285d4310-lite.chunk.js → 9264-518952f13f-lite.chunk.js} +1 -1
- package/dist/scripts/{9264-d2285d4310-lite.chunk.js.map → 9264-518952f13f-lite.chunk.js.map} +1 -1
- package/dist/scripts/{9478-8eacf2fe47-lite.chunk.js → 9478-4b3c088537-lite.chunk.js} +2 -2
- package/dist/scripts/{9478-8eacf2fe47-lite.chunk.js.map → 9478-4b3c088537-lite.chunk.js.map} +1 -1
- package/dist/scripts/{9484-be04a34bbf-lite.chunk.js → 9484-b85011dbea-lite.chunk.js} +2 -2
- package/dist/scripts/{9484-be04a34bbf-lite.chunk.js.map → 9484-b85011dbea-lite.chunk.js.map} +1 -1
- package/dist/scripts/{bundle-8f540a1154.min.js → bundle-c158cdd3a9.min.js} +3 -3
- package/dist/scripts/{bundle-8f540a1154.min.js.map → bundle-c158cdd3a9.min.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/5595-3763b14d77-lite.chunk.js.map +0 -1
- package/dist/scripts/7293-afd3349468-lite.chunk.js +0 -2
- package/dist/scripts/8261-72453f1978-lite.chunk.js +0 -2
- package/dist/scripts/8261-72453f1978-lite.chunk.js.map +0 -1
- /package/dist/scripts/{170-1f815b85a1-lite.chunk.js.LICENSE.txt → 170-2d124965b7-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{2118-462a279c5a-lite.chunk.js.LICENSE.txt → 2118-ec2a5f1e9b-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{3841-95df66e647-lite.chunk.js.LICENSE.txt → 3841-bfae79638b-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{4778-ebe369973c-lite.chunk.js.LICENSE.txt → 4778-3c9f2b7f76-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{4942-a27a31e79e-lite.chunk.js.LICENSE.txt → 4942-acce40b333-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{5268-f4db3933ff-lite.chunk.js.LICENSE.txt → 5268-9b7560f3b1-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{6102-4d948a5e48-lite.chunk.js.LICENSE.txt → 6102-751dbbbf33-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{771-eb60e33941-lite.chunk.js.LICENSE.txt → 771-5612b4ffc2-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{8024-66413cc05b-lite.chunk.js.LICENSE.txt → 8024-765a4170c7-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{8681-41edd08b98-lite.chunk.js.LICENSE.txt → 8681-49db3daae6-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{8906-b75b51bd0f-lite.chunk.js.LICENSE.txt → 8906-2f6b5e4c5c-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{9478-8eacf2fe47-lite.chunk.js.LICENSE.txt → 9478-4b3c088537-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{9484-be04a34bbf-lite.chunk.js.LICENSE.txt → 9484-b85011dbea-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{bundle-8f540a1154.min.js.LICENSE.txt → bundle-c158cdd3a9.min.js.LICENSE.txt} +0 -0
package/dist/scripts/{2734-6c6d57d0f3-lite.chunk.js.map → 2734-6a7beb2ce2-lite.chunk.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/2734-6c6d57d0f3-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/infinite-scroll-footer/infinite-scroll-footer.scss","file:///app/packages/libs/shared/src/components/infinite-scroll-footer/InfiniteScrollFooter.tsx","file:///app/packages/libs/shared/src/components/widgets/widget-button/widget-button.scss","file:///app/packages/libs/shared/src/components/widgets/widget-button/WidgetButton.tsx","file:///app/packages/libs/shared/src/hooks/UseInfiniteScroll.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteList.ts","file:///app/packages/libs/shared/src/components/widgets/items/subject-widget-item/CompanyWidgetItem.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/CompanyResult.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/mixed-search-results.scss","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/exchange-video-group/ExchangeVideoGroup.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/FeaturedVideoResult.tsx","file:///app/packages/libs/shared/src/apps/search/components/playlist-with-videos/playlist-with-videos.scss","file:///app/packages/libs/shared/src/apps/search/components/playlist-with-videos/PlaylistWithVideos.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/LargePlaylistResults.tsx","file:///app/packages/libs/shared/src/apps/search/components/series-with-videos/series-with-videos.scss","file:///app/packages/libs/shared/src/apps/search/components/series-with-videos/SeriesWithVideos.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/LargeSeriesResult.tsx","file:///app/packages/libs/shared/src/apps/search/components/collection-video-list/CollectionVideoList.tsx","file:///app/packages/libs/shared/src/apps/search/components/collection-thumbnail/collection-thumbnail.scss","file:///app/packages/libs/shared/src/apps/search/components/collection-thumbnail/CollectionThumbnail.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/SmallPlaylistResult.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/SmallSeriesResults.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/SubjectResult.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/VideoResult.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/MixedSearchResults.tsx","file:///app/packages/libs/shared/src/apps/search/components/search-substitute/SearchSubstitute.tsx","file:///app/packages/libs/shared/src/apps/search/components/search-suggestions/SearchSuggestions.tsx","file:///app/packages/libs/shared/src/apps/search/flight-requests/SharedSearchRequests.ts","file:///app/packages/projects/lite/src/apps/search/hooks/useSearchTopics.ts","file:///app/packages/projects/lite/src/apps/search/hooks/useFetchSearchData.tsx","file:///app/packages/projects/lite/src/apps/search/hooks/useFetchSchoolLevels.ts","file:///app/packages/projects/lite/src/apps/search/hooks/useSearchCompanies.ts","file:///app/packages/projects/lite/src/apps/search/hooks/useGetSearchResults.tsx","file:///app/packages/projects/lite/src/apps/search/hooks/useGroupExchangeResults.ts","file:///app/packages/projects/lite/src/apps/search/views/search-results/empty-state/SearchResultsEmptyState.tsx","file:///app/packages/projects/lite/src/apps/search/views/search-results/SearchResultsView.tsx","file:///app/packages/projects/lite/src/apps/search/hooks/useGetTagsAndClassifications.tsx","file:///app/packages/projects/lite/src/apps/search/hooks/useSearchMask.tsx","file:///app/packages/projects/lite/src/shared/flight-requests/RatingRequests.ts","file:///app/packages/projects/lite/src/shared/hooks/usePresentationAudiences.ts","file:///app/packages/projects/lite/src/shared/hooks/useVideoMixin.ts","file:///app/node_modules/react-bootstrap/esm/Row.js"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"container\":\"VwD1b\",\"spinner\":\"eJ85e\"};","import * as React from 'react';\nimport { Spinner } from 'react-bootstrap';\nimport { useInView } from 'react-intersection-observer';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './infinite-scroll-footer.scss';\n\ninterface InfiniteScrollFooterProps {\n isFetching: boolean;\n fetchNext?: (nextCursor: string) => void;\n nextCursor?: string;\n fetchOnScroll?: boolean;\n}\n\nInfiniteScrollFooter.defaultProps = {\n fetchOnScroll: false\n};\n\nexport function InfiniteScrollFooter(props: InfiniteScrollFooterProps): React.ReactElement {\n const [ ref, inView ] = useInView();\n\n React.useEffect(() => {\n if (!props.fetchOnScroll)\n return;\n\n if (!inView || props.isFetching)\n return;\n\n props.fetchNext?.(props.nextCursor);\n }, [ inView, props.isFetching ]);\n\n return (\n <div className={`p-3 text-center ${styles.container}`} ref={ref}>\n {props.isFetching\n ? <Spinner as='span' animation='border' role='status' className={styles.spinner} />\n : (\n <SvgContainer\n svgName={cvSvgLibrary.ChevronDown}\n className='svg-container cursor-pointer'\n size={SvgContainerSize.Large}\n onClick={() => props.fetchNext?.(props.nextCursor)}\n />\n )\n }\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"buttonContainer\":\"_ejId\",\"left\":\"VSAPU\",\"right\":\"kgeXh\",\"button\":\"gAsE9\",\"hoverText\":\"APA36\",\"buttonHover\":\"cqD75\",\"chevron\":\"Ev4hr\",\"extendedClickableArea\":\"AtsWP\",\"gradientRight\":\"ZuAif\",\"gradientLeft\":\"Pt3nx\",\"topPos\":\"BVcIS\"};","import * as React from 'react';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { FixedWidgetState } from 'libs/shared/components/widgets/fixed-widget';\nimport { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './widget-button.scss';\n\nexport enum WidgetButtonDirection {\n Left,\n Right\n}\n\ninterface WidgetButtonProps {\n onClick: (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => void;\n direction: WidgetButtonDirection;\n hide: boolean;\n contents?: WidgetContents;\n useGradientBackdrop?: boolean;\n className?: string;\n hoverText?: string;\n hideExtendedClickableArea?: boolean;\n state?: FixedWidgetState;\n\n leftButtonClassName?: string;\n rightButtonClassName?: string;\n leftGradientClassName?: string;\n rightGradientClassName?: string;\n}\n\nexport const WidgetButton = React.memo(function(props: WidgetButtonProps): JSX.Element {\n const isLeft = props.direction === WidgetButtonDirection.Left;\n\n const arrowSvg = isLeft ? cvSvgLibrary.ChevronLeft : cvSvgLibrary.ChevronRight;\n\n function getPositionClass(): string {\n let className = styles.topPos;\n \n // Left / Right\n if (isLeft)\n className += ` ${styles.left} ${props.leftButtonClassName}`;\n else\n className += ` ${styles.right} ${props.rightButtonClassName}`;\n \n return className;\n }\n\n function getStyle(): React.CSSProperties {\n if (props.state?.contents === 'videos')\n return { paddingBottom: (56.25 / props.state?.viewableItems) + '%' };\n\n return { height: '100%' };\n }\n\n if (props.hide)\n return <></>;\n\n return (\n <div className={styles.buttonContainer} style={getStyle()}>\n {props.useGradientBackdrop &&\n <div className={isLeft ? `${styles.gradientLeft} ${props.leftGradientClassName}` : `${styles.gradientRight} ${props.rightGradientClassName}`} />\n }\n\n {!props.hideExtendedClickableArea && (\n <div\n role='button'\n onClick={props.onClick}\n className={`${styles.extendedClickableArea} ${isLeft ? styles.left : styles.right}`}\n />\n )}\n\n <div\n role='button'\n className={`${getPositionClass()} ${styles.button} ${props.className || ''}`}\n onClick={props.onClick}\n >\n {props.hoverText && (\n <span className={`ps-3 pe-2 ${styles.hoverText}`}>{props.hoverText}</span>\n )}\n <SvgContainer\n svgName={arrowSvg}\n size={SvgContainerSize.Medium}\n className={`svg-container d-inline-block ${styles.chevron}`}\n />\n </div>\n </div>\n );\n});","import { useEffect } from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst SCROLL_TOLERANCE = 400; // value in px\n\ninterface UseInfiniteScrollOptions {\n fetchNextPage: () => void;\n hasMore: boolean;\n isFetching: boolean;\n scrollContainer?: HTMLElement;\n}\n\nexport function useInfiniteScroll(options: UseInfiniteScrollOptions): void {\n const handleScroll = (): void => {\n if (options.isFetching)\n return;\n\n if (!options.scrollContainer) {\n const currentScrollHeight = window.innerHeight + document.documentElement.scrollTop;\n \n const totalHeight = document.documentElement.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n } else {\n const { scrollContainer } = options;\n const currentScrollHeight = scrollContainer.getBoundingClientRect().height + scrollContainer.scrollTop;\n \n const totalHeight = scrollContainer.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n }\n\n options.fetchNextPage();\n };\n\n useEffect(() => {\n const onScroll = FunctionHelper.throttle(handleScroll, 200);\n\n const scrollContainer = options.scrollContainer || window;\n\n if (options.hasMore)\n scrollContainer.addEventListener('scroll', onScroll);\n\n return () => scrollContainer.removeEventListener('scroll', onScroll);\n }, [ options.hasMore, options.fetchNextPage, options.scrollContainer ]);\n}","import { useEffect, useState } from 'react';\n\nimport { HttpStatus, HttpStatusClass } from 'libs/common/backbone/enums/HttpStatus';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { BaseObject, BasePaginatedCollection } from 'libs/shared/interfaces';\n\nimport { useInfiniteScroll } from './UseInfiniteScroll';\nimport { useSelectAllPages } from './UseSelectAllPages';\n\nexport interface UseInfiniteListResult<T extends BaseObject> {\n items: T[];\n hasMore: boolean;\n isFetching: boolean;\n nextCursor: string;\n totalItems?: number;\n hasFirstPageCompleted: boolean;\n}\n\n/**\n * Hook to extract an infinite list from the application state,\n * save it locally in state and only update when new data\n * is fetched.\n * \n * @param getRequest - callback function to get the request for each page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n * \n * @param fetchNext - callback function to fetch a page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n */\nexport function useInfiniteList<TObject = BaseObject, TResponse = BasePaginatedCollection<TObject>>(\n getRequest: ((cursor?: string) => Flight.Request) | false,\n fetchNext: ((cursor?: string) => void) | false,\n onError?: (pageNumber: number, statusCode: HttpStatus) => void,\n getItems?: (responseData: TResponse) => TObject[],\n getCursor?: (responseData: TResponse) => string,\n scrollContainer?: HTMLElement\n): UseInfiniteListResult<TObject> {\n const [ pagesFetched, setPagesFetched ] = useState(0);\n\n const fetchNextFn = fetchNext as (cursor?: string) => void;\n\n function getKey(cursor?: string): string {\n if (!getRequest)\n return null;\n\n const request = getRequest(cursor);\n\n if (!request)\n return null;\n\n return request.key;\n }\n\n const response = useSelectAllPages<TObject, TResponse>(\n getKey,\n getItems,\n getCursor\n );\n\n function fetchNextPage(): void {\n if (!fetchNext || !getRequest || !response)\n return;\n\n setPagesFetched(currentVal => currentVal + 1);\n return fetchNextFn(response.nextCursor);\n }\n\n useInfiniteScroll({\n fetchNextPage,\n hasMore: !!response?.nextCursor,\n isFetching: response?.isFetching,\n scrollContainer\n });\n\n useEffect(() => {\n if (!response)\n return;\n\n if (response.shouldInitialFetch && fetchNext) {\n fetchNextFn();\n setPagesFetched(currentVal => currentVal + 1);\n }\n }, [ response?.shouldInitialFetch, fetchNext ]);\n\n useEffect(() => {\n if (!response?.statusCode || !FunctionHelper.isFunction(onError))\n return;\n\n const httpStatusClass: HttpStatusClass = +(response.statusCode?.toString()?.substr(0, 1));\n\n if (httpStatusClass !== HttpStatusClass.ClientError && httpStatusClass !== HttpStatusClass.ServerError)\n return;\n\n onError(pagesFetched, response.statusCode);\n }, [response?.statusCode]);\n\n return {\n items: response?.items,\n hasMore: !!response?.nextCursor,\n nextCursor: response?.nextCursor,\n isFetching: response?.isFetching,\n totalItems: response?.totalItems,\n hasFirstPageCompleted: response?.hasFirstPageCompleted\n };\n}","import * as React from 'react';\n\nimport { ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { CoverPillWidgetContentWrapper, CoverPillWidgetItemProps } from 'libs/shared/components/widgets/items/subject-widget-item/CoverPill';\nimport { Company } from 'libs/shared/interfaces';\n\nexport function CompanyWidgetItem(props: CoverPillWidgetItemProps<Company>): JSX.Element {\n const analyticsData = {\n ...props.analyticsData,\n id: props.data?.id,\n name: props.data?.name\n };\n\n const analyticsOptions = {\n location: LocationContext.ClassificationListItem,\n ...props.analyticsOptions,\n actionType: UserAction.Click,\n entity: EntityType.Company,\n descriptor: ClickDescriptor.Cover\n };\n\n return (\n <CoverPillWidgetContentWrapper\n {...props}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n coverUrl={props.data.logo?.url}\n />\n );\n}","import React from 'react';\nimport { Col } from 'react-bootstrap';\n\nimport { CompanyWidgetItem } from 'libs/shared/components/widgets/items/subject-widget-item/CompanyWidgetItem';\nimport { Company } from 'libs/shared/interfaces';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function CompanyResult(props: MixedSearchResultItemProps<Company>): JSX.Element {\n return (\n <Col sm={6} md={props.useLargeStyle ? 6 : 4} lg={props.useLargeStyle ? 4 : 3}>\n <div className={`position-relative px-1 mb-2`}>\n <CompanyWidgetItem\n data={props.item}\n getChildAppLink={props.appLinks.getCompanyAppLink}\n getChildAppLinkOptions={() => props.appLinks.getCompanyAppLinkOptions?.(props.item)}\n analyticsData={{\n itemIndex: props.itemIndex,\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: 0\n }}\n isLarge={props.useLargeStyle}\n />\n </div>\n </Col>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"videoList\":\"ZhLPS\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { ClickDescriptor, EntityType, HashObject, LocationContext, SearchSourceDescriptor, UserAction } from 'libs/analytics/interfaces';\n\nimport { SourceFilterOptions } from 'libs/shared/apps/search/interfaces';\nimport { ExchangeVideoGroup } from 'libs/shared/apps/search/interfaces/SearchResults';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoItem } from 'libs/shared/components/video-list/video-item/VideoItem';\n\nimport { MixedSearchResultItemProps } from './../MixedSearchResultItemProps';\n\nimport styles from '../../mixed-search-results.scss';\n\nconst namespace = 'search.exchangeVideoGroup';\n\nconst EXCHANGE_RESULT_DISPLAY_LIMIT = 3;\n\nexport function ExchangeVideoGroup(props: MixedSearchResultItemProps<ExchangeVideoGroup>): JSX.Element {\n const limit = props.item.showCount >= EXCHANGE_RESULT_DISPLAY_LIMIT\n ? EXCHANGE_RESULT_DISPLAY_LIMIT\n : props.item.showCount;\n\n function getContainerClassName(): string {\n if (props.pagePositionIndex === 0)\n return 'border-bottom pb-1 mb-3';\n\n return 'border-top border-bottom pt-3 mt-2 pb-1 mb-3';\n }\n\n const currentAppLink = Core.AppLinkHelper.getCurrentAppLink();\n const currentParams = (currentAppLink.params as HashObject) ?? {};\n let currentSource = currentParams?.source ?? [];\n\n if (currentSource && !Array.isArray(currentSource))\n currentSource = [currentSource];\n\n const searchAppLink = {\n ...currentAppLink,\n params: {\n ...currentParams,\n source: [ ...(currentSource), SourceFilterOptions.ExchangeArchive ]\n }\n };\n\n const analyticsData = {\n query: props.queryParams.query,\n itemIndex: props.itemIndex,\n pagePositionIndex: props.pagePositionIndex\n };\n const analyticsOptions = {\n entity: EntityType.SearchResults,\n location: LocationContext.ExchangeSearchGroupItem,\n actionType: UserAction.Click,\n descriptor: SearchSourceDescriptor.ExchangeArchive\n };\n\n return (\n <div className={getContainerClassName()}>\n <AppLink\n appLink={searchAppLink}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n >\n <h2 className='h4'>\n <Text namespace={namespace} phrase='heading' />\n </h2>\n </AppLink>\n <p>\n <Text namespace={namespace} phrase='message' />\n \n <AppLink\n appLink={props.appLinks.searchSettings}\n className='text-info'\n analyticsData={analyticsData}\n analyticsOptions={{\n ...analyticsOptions,\n descriptor: ClickDescriptor.Settings\n }}\n >\n <Text namespace={namespace} phrase='searchSettings' />\n </AppLink>\n .\n </p>\n\n <div className={`position-relative ${styles.videoList}`}>\n {props.item.videos.slice(0, limit).map((v, i) => {\n return (\n <VideoItem\n key={i}\n video={v}\n yearGroups={props.yearGroups}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getSubTextAppLink={props.appLinks.getSubTextAppLink}\n presentationAudiences={props.audiences}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n analyticsData= {{\n search: {\n query: props.queryParams.query,\n score: v._score,\n maxScore: v._maxScore,\n featured: v._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n companyLogoFallbackUrl={props.companyLogoFallbackUrl}\n subTextType={props.subTextType}\n hasPermissions={props.hasPermissions}\n />\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 />\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"videoList\":\"eEZEe\"};","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { PlaylistItem } from 'libs/shared/apps/playlists/components/playlist-list';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoItem } from 'libs/shared/components/video-list/video-item/VideoItem';\nimport { VideoSubTextType } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { CurrentUser, Playlist, PresentationAudience, Video, YearGroup } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\n\nimport styles from './playlist-with-videos.scss';\n\nconst namespace = 'search.playlistWithVideos';\n\nfunction useGetMaxVideos(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xl || breakpoints.xxl)\n return 3;\n \n return 2;\n}\n\ninterface PlaylistWithVideoProps {\n playlist: Playlist;\n yearGroups: YearGroup[];\n playlistAppLink: Core.AppLink;\n presentationAudiences: PresentationAudience[];\n preloadImage: boolean;\n analyticsData: HashObject;\n imageCdnUrl: string;\n currentUser: CurrentUser;\n getSubTextAppLink: (video: Video) => Core.AppLink;\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n companyLogoFallbackUrl?: string;\n subTextType?: VideoSubTextType;\n hasPermissions: HasPermissionsFunc;\n}\n\nexport function PlaylistWithVideos(props: PlaylistWithVideoProps): JSX.Element {\n const maxVideos = useGetMaxVideos();\n\n const videos = props.playlist.videos.data.slice(0, maxVideos);\n\n const playlistAnalyticsOption: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Playlist,\n location: LocationContext.PlaylistWithVideos\n };\n\n const playlistAnalyticsData: HashObject = {\n ...props.analyticsData,\n id: props.playlist.id,\n name: props.playlist.name\n };\n\n return (\n <div className='ps-2 py-2'>\n <Row className='g-0 border border-light rounded-3'>\n <Col xs={4} lg={3} className='pe-3'>\n <PlaylistItem\n appLink={props.playlistAppLink}\n analyticsData={props.analyticsData}\n analyticsOptions={{\n ...playlistAnalyticsOption,\n descriptor: ClickDescriptor.Cover\n }}\n data={props.playlist}\n presentationAudiences={props.presentationAudiences}\n bgColourClassNames={BG_COLOUR_CLASS_NAMES}\n itemStyle='round-left'\n imageCdnUrl={props.imageCdnUrl}\n currentUser={props.currentUser}\n showCount={false}\n showOwner\n />\n </Col>\n <Col xs={8} lg={9}>\n <div className='d-flex justify-content-between'>\n <div className={`pt-3 ${styles.videoList}`}>\n {videos?.map(video => {\n const videoAnalyticsData: HashObject = {\n ...playlistAnalyticsData,\n videoId: video.id,\n videoName: video.name\n };\n\n return (\n <VideoItem\n key={video.id}\n video={video}\n getSubTextAppLink={props.getSubTextAppLink}\n canFavourite={() => false}\n setFavourite={null}\n getVideoAppLink={props.getVideoAppLink}\n analyticsData={videoAnalyticsData}\n analyticsOptions={{\n entity: EntityType.Video,\n location: LocationContext.PlaylistWithVideos\n }}\n size='sm'\n yearGroups={props.yearGroups}\n companyLogoFallbackUrl={props.companyLogoFallbackUrl}\n subTextType={props.subTextType}\n hasPermissions={props.hasPermissions}\n />\n );\n })}\n </div>\n <div className='text-end pt-3 pe-3'>\n <AppLink\n className='info-link fw-semibold'\n appLink={props.playlistAppLink}\n analyticsData={playlistAnalyticsData}\n analyticsOptions={{\n ...playlistAnalyticsOption,\n descriptor: ClickDescriptor.Link\n }}\n >\n <Text namespace={namespace} phrase='seeAllVideos' />\n </AppLink>\n </div>\n </div>\n </Col>\n </Row>\n </div>\n );\n}","import React from 'react';\n\nimport { Playlist } from 'libs/shared/interfaces';\n\nimport { PlaylistWithVideos } from '../../playlist-with-videos/PlaylistWithVideos';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function LargePlaylistResult(props: MixedSearchResultItemProps<Playlist>): JSX.Element {\n return (\n <div className='mx-n2'>\n <PlaylistWithVideos\n playlist={props.item}\n yearGroups={props.yearGroups}\n playlistAppLink={props.appLinks.getPlaylistAppLink(props.item)}\n presentationAudiences={props.audiences}\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n imageCdnUrl={props.imageCdnUrl}\n currentUser={props.currentUser}\n preloadImage\n getSubTextAppLink={props.appLinks.getSubTextAppLink}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n companyLogoFallbackUrl={props.companyLogoFallbackUrl}\n subTextType={props.subTextType}\n hasPermissions={props.hasPermissions}\n />\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"videoList\":\"UT8bc\"};","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SeriesTallPoster } from 'libs/shared/components/series-tall-poster/SeriesTallPoster';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoItem } from 'libs/shared/components/video-list/video-item/VideoItem';\nimport { VideoSubTextType } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { PresentationAudience, Series, Video, YearGroup } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\n\nimport styles from './series-with-videos.scss';\n\nconst namespace = 'search.seriesWithVideos';\n\nfunction useGetMaxVideos(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xl || breakpoints.xxl)\n return 5;\n \n if (breakpoints.lg || breakpoints.md)\n return 4;\n\n return 3;\n}\n\ninterface SeriesWithVideoProps {\n series: Series;\n yearGroups: YearGroup[];\n seriesAppLink: Core.AppLink;\n subTextAppLink: (video: Video) => Core.AppLink;\n presentationAudiences: PresentationAudience[];\n preloadImage: boolean;\n analyticsData: HashObject;\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n companyLogoFallbackUrl?: string;\n subTextType?: VideoSubTextType;\n hasPermissions: HasPermissionsFunc;\n}\n\nexport function SeriesWithVideos(props: SeriesWithVideoProps): JSX.Element {\n const maxVideos = useGetMaxVideos();\n\n const videos = props.series.videos.data.slice(0, maxVideos);\n\n const seriesAnalyticsOption: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Series,\n location: LocationContext.SeriesWithVideos\n };\n\n const seriesAnalyticsData: HashObject = {\n ...props.analyticsData,\n id: props.series.id,\n name: props.series.name\n };\n\n return (\n <div className='ps-2 py-2'>\n <Row className='g-0 border border-light rounded-3'>\n <Col xs={4} lg={3} className='pe-3'>\n <AppLink\n appLink={props.seriesAppLink}\n className='position-relative'\n analyticsData={seriesAnalyticsData}\n analyticsOptions={{\n ...seriesAnalyticsOption,\n descriptor: ClickDescriptor.TallPoster\n }}\n >\n <SeriesTallPoster\n series={props.series}\n presentationAudiences={props.presentationAudiences}\n preloadImage={props.preloadImage}\n imageClass='rounded-start-lg'\n />\n </AppLink>\n </Col>\n <Col xs={8} lg={9}>\n <div className='d-flex justify-content-between'>\n <div className={`pt-3 ${styles.videoList}`}>\n {videos?.map(video => {\n const videoAnalyticsData: HashObject = {\n ...seriesAnalyticsData,\n videoId: video.id,\n videoName: video.name\n };\n\n // insert parent series into video object\n video = {\n ...video,\n series: props.series\n };\n\n return (\n <VideoItem\n key={video.id}\n video={video}\n getSubTextAppLink={props.subTextAppLink}\n canFavourite={() => false}\n setFavourite={null}\n getVideoAppLink={props.getVideoAppLink}\n analyticsData={videoAnalyticsData}\n analyticsOptions={{\n entity: EntityType.Video,\n location: LocationContext.SeriesWithVideos\n }}\n size='sm'\n yearGroups={props.yearGroups}\n companyLogoFallbackUrl={props.companyLogoFallbackUrl}\n subTextType={props.subTextType}\n hasPermissions={props.hasPermissions}\n />\n );\n })}\n </div>\n <div className='text-end pt-3 pe-3'>\n <AppLink\n className='info-link fw-semibold'\n appLink={props.seriesAppLink}\n analyticsData={seriesAnalyticsData}\n analyticsOptions={{\n ...seriesAnalyticsOption,\n descriptor: ClickDescriptor.Link\n }}\n >\n <Text namespace={namespace} phrase='seeAllVideos' />\n </AppLink>\n </div>\n </div>\n </Col>\n </Row>\n </div>\n );\n}","import React from 'react';\n\nimport { Series } from 'libs/shared/interfaces';\n\nimport { SeriesWithVideos } from '../../series-with-videos/SeriesWithVideos';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function LargeSeriesResult(props: MixedSearchResultItemProps<Series>): JSX.Element {\n return (\n <div className='mx-n2'>\n <SeriesWithVideos\n yearGroups={props.yearGroups}\n presentationAudiences={props.audiences}\n series={props.item}\n seriesAppLink={props.appLinks.getSeriesAppLink(props.item)}\n subTextAppLink={props.appLinks.getSubTextAppLink}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n preloadImage\n companyLogoFallbackUrl={props.companyLogoFallbackUrl}\n subTextType={props.subTextType}\n hasPermissions={props.hasPermissions}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { SeasonEpisode } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Video } from 'libs/shared/interfaces';\n\nconst namespace = 'search.collectionVideoList';\n\ninterface CollectionVideoListProps {\n videos: Video[];\n collectionId: string;\n appLink: Core.AppLink;\n analyticsOptions: AnalyticsOptions;\n analyticsData?: HashObject;\n getVideoAppLink: (video: Video) => Core.AppLink;\n}\n\nfunction useGetMaxVideos(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xs)\n return 2;\n\n if (breakpoints.sm)\n return 1;\n\n return 3;\n}\n\nexport function CollectionVideoList(props: CollectionVideoListProps): JSX.Element {\n const maxVideos = useGetMaxVideos();\n\n const analyticsProps = {\n analyticsData: props.analyticsData,\n analyticsOptions: props.analyticsOptions\n };\n\n return (\n <>\n <ul className='list-unstyled my-1'>\n {props.videos.slice(0, maxVideos).map(v => {\n const hasSeasonEpisode = !!v.episodeNumber && !!v.season?.id;\n\n return (\n <li key={`${props.collectionId}:${v.id}`} className='d-flex align-items-center'>\n <AppLink\n {...analyticsProps}\n className='clamp-1'\n appLink={props.getVideoAppLink(v)}\n >\n {hasSeasonEpisode && <><SeasonEpisode video={v} /> </>}\n {v.name}\n </AppLink>\n </li>\n );\n })}\n </ul>\n\n <AppLink\n {...analyticsProps}\n className='info-link'\n appLink={props.appLink}\n >\n <Text namespace={namespace} phrase='seeAll' />\n </AppLink>\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"overlayContainer\":\"MnBcv\",\"overlay\":\"AZSmh\"};","import React from 'react';\nimport { Col } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor } from 'libs/analytics/interfaces';\n\nimport { CollectionVideoList } from 'libs/shared/apps/search/components/collection-video-list/CollectionVideoList';\nimport { ActionOptions, Actions as ActionsComponent } from 'libs/shared/components/actions/Actions';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BadgeListContainer } from 'libs/shared/components/badges/BadgeListContainer';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { Mask, MaskType } from 'libs/shared/components/mask/Mask';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoListHelper } from 'libs/shared/components/video-list/VideoListHelper';\nimport { ImageType } from 'libs/shared/enums/Images';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Playlist, Series, Video } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\n\nimport styles from './collection-thumbnail.scss';\n\nconst namespace = 'search.collectionThumbnail';\n\n\nexport type GetCollectionActions = (\n collection: Collection,\n showActions: boolean,\n collectionType: CollectionType,\n baseAnalyticsOptions: AnalyticsOptions\n) => ActionOptions[]\n\ntype Collection = Series | Playlist;\ntype CollectionType = 'series' | 'playlist';\n\ninterface CollectionThumbnailProps {\n collection: Collection;\n collectionType: CollectionType;\n appLink: Core.AppLink;\n showActions: boolean;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n maskType?: MaskType;\n imageFallbackType?: ImageFallbackType;\n hideBadges?: boolean;\n isPlugin: boolean;\n getCollectionActions: GetCollectionActions;\n getVideoAppLink: (video: Video, opts?: GetVideoAppLinkOptions) => Core.AppLink;\n}\n\nexport function CollectionThumbnail(props: CollectionThumbnailProps): JSX.Element {\n const breakpoints = useBreakpoints();\n const size = VideoListHelper.getSize(breakpoints, 'md');\n const isSmall = size === 'sm';\n\n const hasVideos = !!props.collection.videos?.data?.length;\n\n const firstVideoWithThumbnail = hasVideos && props.collection.videos.data.find(v => !!v.thumbnail?.url);\n\n function getAnalyticsData(): HashObject {\n const data: HashObject = {\n ...props.analyticsData,\n id: props.collection.id,\n name: props.collection.name\n };\n\n if (firstVideoWithThumbnail) {\n data.videoId = firstVideoWithThumbnail.id;\n data.videoName = firstVideoWithThumbnail.name;\n }\n\n return data;\n }\n\n const analyticsData = getAnalyticsData();\n const isSeries = props.collectionType === 'series';\n\n return (\n <div className={`row g-0 ${isSmall ? '' : 'py-2'}`}>\n <Col {...VideoListHelper.getThumbnailColumns()} className={`flex-column align-items-flex-start ${isSmall ? `pb-2 pe-2` : 'mb-1 px-2'}`}>\n <div className={`position-relative overflow-hidden ${isSmall ? 'rounded' : 'rounded-3'}`}>\n <BaseImage\n data={firstVideoWithThumbnail?.thumbnail}\n appLink={props.appLink}\n imageType={ImageType.Thumbnails}\n analyticsData={analyticsData}\n analyticsOptions={{\n ...props.analyticsOptions,\n descriptor: ClickDescriptor.Thumbnail\n }}\n >\n <Mask type={props.maskType} />\n <ImageFallback type={props.imageFallbackType} />\n \n <div className={`d-flex flex-column align-items-center justify-content-center text-white h-100 ${styles.overlay}`}>\n <Text namespace={namespace} phrase='seeAll' />\n </div>\n </BaseImage>\n </div>\n </Col>\n\n <Col {...VideoListHelper.getDetailsColumns()} className={isSmall ? 'pb-2' : 'px-2'}>\n {!props.isPlugin &&\n <ActionsComponent\n actions={props.getCollectionActions(\n props.collection,\n props.showActions,\n props.collectionType,\n props.analyticsOptions\n )}\n className='float-end mt-n1'\n actionsDropdownClassName='btn btn-link ms-1'\n />\n }\n\n <AppLink\n appLink={props.appLink}\n analyticsData={analyticsData}\n analyticsOptions={{\n ...props.analyticsOptions,\n descriptor: ClickDescriptor.Title\n }}\n >\n <h5 className='m-0 mb-1'><span className='clamp-1'>{props.collection.name}</span></h5>\n </AppLink>\n\n {isSeries && !props.hideBadges && (\n <BadgeListContainer>\n <Badge type={BadgeType.Rating} data={(props.collection as Series).rating} />\n <Badge type={BadgeType.ProductionYear} data={(props.collection as Series).metadata?.year} />\n </BadgeListContainer>\n )}\n \n {hasVideos && (\n <CollectionVideoList\n collectionId={props.collection.id}\n videos={props.collection.videos.data}\n appLink={props.appLink}\n analyticsData={analyticsData}\n analyticsOptions={{\n ...props.analyticsOptions,\n descriptor: ClickDescriptor.Link\n }}\n getVideoAppLink={props.getVideoAppLink}\n />\n )}\n </Col>\n </div>\n );\n}","import React from 'react';\n\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { MaskType } from 'libs/shared/components/mask/Mask';\nimport { Playlist } from 'libs/shared/interfaces';\n\nimport { CollectionThumbnail } from '../../collection-thumbnail/CollectionThumbnail';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nimport styles from '../mixed-search-results.scss';\n\nexport function SmallPlaylistResult(props: MixedSearchResultItemProps<Playlist>): JSX.Element {\n return (\n <div className={`position-relative ${styles.videoList}`}>\n <CollectionThumbnail\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n analyticsOptions={{\n entity: EntityType.Playlist,\n actionType: UserAction.Click,\n location: LocationContext.PlaylistListItem\n }}\n appLink={props.appLinks.getPlaylistAppLink(props.item)}\n showActions={props.showActions}\n collection={props.item}\n collectionType='playlist'\n maskType={MaskType.Playlist}\n imageFallbackType={ImageFallbackType.PlaylistThumbnail}\n isPlugin={props.isPlugin}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getCollectionActions={props.appLinks.getCollectionActions}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { MaskType } from 'libs/shared/components/mask/Mask';\nimport { Series } from 'libs/shared/interfaces';\n\nimport { CollectionThumbnail } from '../../collection-thumbnail/CollectionThumbnail';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nimport styles from '../mixed-search-results.scss';\n\nexport function SmallSeriesResult(props: MixedSearchResultItemProps<Series>): JSX.Element {\n return (\n <div className={`position-relative ${styles.videoList}`}>\n <CollectionThumbnail\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n analyticsOptions={{\n entity: EntityType.Series,\n actionType: UserAction.Click,\n location: LocationContext.SeriesListItem\n }}\n appLink={props.appLinks.getSeriesAppLink(props.item)}\n collectionType='series'\n collection={props.item}\n showActions={props.showActions}\n maskType={MaskType.Series}\n imageFallbackType={ImageFallbackType.SeriesThumbnail}\n hideBadges\n isPlugin={props.isPlugin}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getCollectionActions={props.appLinks.getCollectionActions}\n />\n </div>\n );\n}","import React from 'react';\nimport { Col } from 'react-bootstrap';\n\nimport { SubjectWidgetItem } from 'libs/shared/components/widgets/items/subject-widget-item';\nimport { Classification } from 'libs/shared/interfaces';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function SubjectResult(props: MixedSearchResultItemProps<Classification>): JSX.Element {\n return (\n <Col sm={6} md={props.useLargeStyle ? 6 : 4} lg={props.useLargeStyle ? 4 : 3}>\n <div className={`position-relative px-1 mb-2`}>\n <SubjectWidgetItem\n data={props.item}\n getChildAppLink={props.appLinks.getClassificationAppLink}\n getChildAppLinkOptions={\n () => props.appLinks.getClassificationAppLinkOptions?.(props.item)\n }\n availablePresentations={props.availablePresentations}\n analyticsData={{\n itemIndex: props.itemIndex,\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: 0\n }}\n isLarge={props.useLargeStyle}\n />\n </div>\n </Col>\n );\n}","import React from 'react';\n\nimport { ClipItem, ClipItemProps } from 'libs/shared/components/video-list/clip-item/ClipItem';\nimport { InteractiveItem, InteractiveItemProps } from 'libs/shared/components/video-list/interactive-item/InteractiveItem';\nimport { VideoItem, VideoItemProps } from 'libs/shared/components/video-list/video-item/VideoItem';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nimport styles from '../mixed-search-results.scss';\n\nexport function VideoResult(props: MixedSearchResultItemProps<VideoTypes>): JSX.Element {\n function getItemComponent(\n video: VideoTypes\n ): (props: ClipItemProps | InteractiveItemProps | VideoItemProps) => JSX.Element {\n if (VideoHelper.isClip(video))\n return ClipItem;\n \n if (VideoHelper.isInteractive(video))\n return InteractiveItem;\n \n return VideoItem;\n }\n\n const Component = getItemComponent(props.item);\n\n return (\n <div className={`position-relative ${styles.videoList}`}>\n <Component\n video={props.item}\n yearGroups={props.yearGroups}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getSubTextAppLink={props.appLinks.getSubTextAppLink}\n getPreviewQuestionsAppLink={props.appLinks.getPreviewQuestionsAppLink}\n presentationAudiences={props.audiences}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n analyticsData= {{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n companyLogoFallbackUrl={props.companyLogoFallbackUrl}\n subTextType={props.subTextType}\n hasPermissions={props.hasPermissions}\n />\n </div>\n );\n}","import React from 'react';\nimport { Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { VideoSubTextType } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { CanFavouriteFunc, Classification, Company, CurrentUser, FavouriteFunc, InteractiveMetadata, Playlist, Presentation, PresentationAudience, Series, Video, YearGroup } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { SearchResultObjectTypes, SearchResults, SearchResultsObject } from '../../interfaces';\nimport { GetCollectionActions } from '../collection-thumbnail/CollectionThumbnail';\n\nimport { CompanyResult } from './components/CompanyResult';\nimport { ExchangeVideoGroup } from './components/exchange-video-group/ExchangeVideoGroup';\nimport { FeaturedVideoResult } from './components/FeaturedVideoResult';\nimport { LargePlaylistResult } from './components/LargePlaylistResults';\nimport { LargeSeriesResult } from './components/LargeSeriesResult';\nimport { BaseMixedSearchResultItemProps } from './components/MixedSearchResultItemProps';\nimport { SmallPlaylistResult } from './components/SmallPlaylistResult';\nimport { SmallSeriesResult } from './components/SmallSeriesResults';\nimport { SubjectResult } from './components/SubjectResult';\nimport { VideoResult } from './components/VideoResult';\n\nconst TOPIC_DISPLAY_LIMIT = 8;\n\nexport interface MixedSearchResultAppLinks {\n getSubTextAppLink: (video: Video) => Core.AppLink;\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n getSeriesAppLink: (series: Series) => Core.AppLink;\n getCompanyAppLink: (company: Company) => Core.AppLink;\n getCompanyAppLinkOptions?: (company: Company) => Core.AppLinkOptions;\n getClassificationAppLink: (classification: Classification) => Core.AppLink;\n getClassificationAppLinkOptions?: (classification: Classification) => Core.AppLinkOptions;\n getPlaylistAppLink: (playlist: Playlist) => Core.AppLink;\n getPreviewQuestionsAppLink: (interactive: InteractiveMetadata) => Core.AppLink;\n getCollectionActions: GetCollectionActions;\n searchSettings?: Core.AppLink;\n}\n\ninterface MixedSearchResultsProps {\n queryParams: HashObject;\n results: SearchResultObjectTypes[];\n topics?: SearchResults;\n companies?: SearchResults;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n audiences: PresentationAudience[];\n currentUser: CurrentUser;\n imageCdnUrl: string;\n availablePresentations: Presentation[]\n showActions: boolean;\n yearGroups: YearGroup[];\n hasPermissions: HasPermissionsFunc;\n isPlugin: boolean;\n appLinks: MixedSearchResultAppLinks;\n companyLogoFallbackUrl?: string;\n subTextType?: VideoSubTextType;\n}\n\nexport const MixedSearchResults = React.memo(function(props: MixedSearchResultsProps): JSX.Element {\n const breakpoints = useBreakpoints();\n const useSmallComponent = breakpoints.xs || breakpoints.sm;\n\n if (!props.results?.length && !props.topics?.totalResults && !props.companies?.totalResults)\n return <></>;\n\n const companiesAndTopics = [\n ...props.companies?.results ?? [],\n ...props.topics?.results ?? []\n ];\n\n const childProps: BaseMixedSearchResultItemProps = {\n useLargeStyle: companiesAndTopics.length < 4,\n ...props\n };\n\n return (\n <div className='position-relative'>\n {!!companiesAndTopics.length && (\n <Row className='g-0 pb-3 mx-n1'>\n {companiesAndTopics.slice(0, TOPIC_DISPLAY_LIMIT).map((c, itemIndex) => {\n switch (c.type.toLowerCase()) {\n case 'company':\n return (\n <CompanyResult\n key={itemIndex}\n item={c as SearchResultsObject<Company>}\n itemIndex={itemIndex}\n {...childProps}\n />\n );\n case 'subject': {\n return (\n <SubjectResult\n key={itemIndex}\n item={c as SearchResultsObject<Classification>}\n itemIndex={itemIndex}\n {...childProps}\n />\n );\n }\n }\n })}\n </Row>\n )}\n\n {props.results?.map((result, index) => {\n const pagePositionIndex = companiesAndTopics.length ? index + 1 : index;\n\n if ('isExchangeVideoGroup' in result && result.isExchangeVideoGroup) {\n return (\n <ExchangeVideoGroup\n key={index}\n item={result}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n \n\n switch (result.type?.toLowerCase()) {\n case 'interactive':\n case 'clip':\n case 'video': {\n if (index === 0 && result._featured && VideoHelper.isVideo(result)) {\n return (\n <FeaturedVideoResult\n key={index}\n item={result as SearchResultsObject<Video>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n return (\n <VideoResult\n key={index}\n item={result as SearchResultsObject<Video>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n case 'playlist': {\n if (useSmallComponent) {\n return (\n <SmallPlaylistResult\n key={index}\n item={result as SearchResultsObject<Playlist>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n return (\n <LargePlaylistResult\n key={index}\n item={result as SearchResultsObject<Playlist>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n case 'series': {\n const series = result as Series;\n\n if (useSmallComponent || !series.tallPoster?.id) {\n return (\n <SmallSeriesResult\n key={index}\n item={result as SearchResultsObject<Series>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n return (\n <LargeSeriesResult\n key={index}\n item={result as SearchResultsObject<Series>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n }\n })}\n </div>\n );\n});","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'search.searchSubstitute';\n\ninterface SearchSubstituteProps {\n substitute: string;\n queryParams: HashObject;\n getAppLink: (query: string, queryParams: HashObject) => Core.AppLink\n}\n\nexport function SearchSubstitute(props: SearchSubstituteProps): JSX.Element {\n if (!props.substitute)\n return <></>;\n\n return (\n <p className='mb-3'>\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 );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'search.searchSuggestions';\n\ninterface SearchSuggestionsProps {\n suggestions: string[];\n queryParams: HashObject;\n getAppLink: (query: string, queryParams: HashObject) => Core.AppLink\n}\n\nSearchSuggestions.defaultProps = {\n suggestions: [],\n queryParams: {}\n};\n\nexport function SearchSuggestions(props: SearchSuggestionsProps): JSX.Element {\n if (!props.suggestions?.length)\n return <></>;\n\n return (\n <div className='d-flex align-items-center mb-3'>\n <Text namespace={namespace} phrase='didYouMean' />\n \n\n {props.suggestions.map((suggestion, index) => (\n <React.Fragment key={`${suggestion}:${index}`}>\n {index !== 0 && <span className='mx-1'>•</span>}\n\n <AppLink\n className='info-link'\n appLink={props.getAppLink(suggestion, props.queryParams)}\n appLinkOptions={{ replace: true }}\n >\n {suggestion}\n </AppLink>\n </React.Fragment>\n ))}\n </div>\n );\n}","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { FilterConstants } from 'libs/shared/apps/search/constants/FilterConstants';\nimport { SearchIndices, SearchResultObjectTypes, SearchResults, SearchResultsObject } from 'libs/shared/apps/search/interfaces';\nimport { SharedSearchHelper } from 'libs/shared/apps/search/utils/SharedSearchHelper';\nimport { Playlist, Series } from 'libs/shared/interfaces';\n\nfunction formatSearchResponse(response: SearchResults<SearchResultObjectTypes>) {\n /**\n * Until playlists and series are regionalised, search will always return every series/playlist that exists\n * even if the current user doesn't have access to the content inside (which will happen for example when playlists/series)\n * contain all UK library content but is being searched for by an AU user.\n *\n * For some search queries, this may result in search showing a bunch of \"empty\" playlists/series, which sucks.\n * This will filter all empty collections out and decrement the `totalResults` to avoid this and make search a better\n * experience.\n *\n * Ideally this will be removed one day when this regionalisation is no longer an issue.\n */\n let totalResults = response.totalResults;\n\n const results = response?.results?.filter(result => {\n if (result._index !== 'series' && result._index !== 'playlist')\n return true;\n\n if (result._index === 'playlist') {\n const playlist = result as SearchResultsObject<Playlist>;\n\n if (playlist.clips?.data?.length ||\n playlist.interactives?.data?.length ||\n playlist.videos?.data?.length)\n return true;\n\n totalResults--;\n return false;\n }\n\n if ((result as SearchResultsObject<Series>).videos?.data?.length === 0) {\n totalResults--;\n return false;\n }\n\n return true;\n }) ?? [];\n\n response.results = results;\n response.totalResults = totalResults;\n\n // The first search result will always have the highest score value.\n // We store it so that we can access it for subsequent results pages\n const resultMaxScore = results[0]?._score;\n\n return {\n ...response,\n results: SharedSearchHelper.mapMaxScoreToSearchResults(results, resultMaxScore)\n };\n}\n\nexport const SharedSearchRequests = {\n searchV4(\n query: string,\n indicesArr: SearchIndices[],\n filters: HashObject = {},\n cursor?: string,\n limit?: number\n ): Flight.PublicRequest {\n let key = `search:v4:${query}:${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: true,\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 cursor?: string,\n success?: (results: SearchResults) => void,\n error?: (xhr: Xhr) => void\n ): Flight.PublicRequest {\n let key = `search:${query}:${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: true,\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 );\n\n const shouldFetch = !hasFilteredOutTopics;\n\n const response = Flight.useBasicFetch<TopicSearchResults>(shouldFetch && request);\n\n if (!shouldFetch)\n return null;\n\n if (!response.data)\n return response;\n\n if (!availablePresentations || availablePresentations?.length < 2)\n return response;\n\n const results = [...response.data.results];\n\n /**\n * If the customer has more than 1 presentation, and they search for something that returns 2 topics\n * with the same score, then we want to order those topics based on the presentation's learning level.\n * This is achieved by checking the `value` on the presentation.\n */\n const sortedResults = results.sort((a, b) => {\n // If the scores are different, then keep the original ordering\n if (a._score !== b._score)\n return 0;\n\n const presentationA = presentationMap[a.presentationId];\n const presentationB = presentationMap[b.presentationId];\n\n if (!presentationA)\n return 1;\n\n if (!presentationB)\n return -1;\n\n // Order by presentation value\n return presentationA.value - presentationB.value;\n });\n\n return {\n ...response,\n data: {\n ...response.data,\n results: sortedResults\n }\n };\n}\n","import { Flight } from 'libs/common/flight';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport { TopicResults } from 'libs/shared/apps/search/interfaces';\nimport { MasterObjectTypes } from 'libs/shared/enums/MasterObjectTypes';\nimport { LocalPermissionName, PermissionName } from 'libs/shared/enums/PermissionName';\nimport { PresentationLearningLevel } from 'libs/shared/enums/PresentationLearningLevel';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { DomainMasterCollectionType, LibraryRequests } from 'libs/shared/flight-requests/LibraryRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, CurrentUser, DashboardTargetType, Library, Rating, User, YearGroup } from 'libs/shared/interfaces';\nimport { TopicsHelper } from 'libs/shared/utils/topics-helper/TopicsHelper';\n\nimport { RatingRequests } from 'shared/flight-requests/RatingRequests';\nimport { useCurriculums } from 'shared/hooks/useCurriculums';\nimport { usePresentation } from 'shared/hooks/usePresentation';\nimport { usePresentationAudiences } from 'shared/hooks/usePresentationAudiences';\nimport { useFetchCuratedDashboard } from 'shared/utils/DashboardHelper';\n\nimport { useFetchSchoolLevels } from 'apps/search/hooks/useFetchSchoolLevels';\nimport { useSearchCompanies } from 'apps/search/hooks/useSearchCompanies';\nimport { useSearchTopics } from 'apps/search/hooks/useSearchTopics';\n\n/**\n * We need to fetch libraries in order to support the sources filter. \n * However we need to exclude the streamable library, and additionally we need to exclude\n * the exchange library if the user has decided they don't want to see exchange results.\n * \n * We then need to return both of these ids so that the FilterHelper.getBackendFilters()\n * can add them as excludeLibraryExclusive filters\n * \n * - Sha\n */\nfunction useGetLibraries() {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const products = useProducts();\n const settings = useSettings(null);\n\n const streamableLibrary = Flight.useBasicFetch<HashObject>(LibraryRequests.streamableLearning());\n const streamableLibraryId = streamableLibrary.data?.objectId;\n\n const showExchangeSearchResults = products.hasProduct(ProductId.Exchange) && settings.showExchangeSearchResults;\n\n const libraryTypes: DomainMasterCollectionType[] = [ 'sharedLibrary', 'customLibrary', 'workspace', 'hostedLibrary', 'exchange' ];\n const librariesRequest = Flight.useBasicFetch<Library[]>(\n currentUser.data?.isAuthenticated && LibraryRequests.domainLibraries(libraryTypes)\n );\n\n let libraries = librariesRequest.data ?? [];\n const exchangeLibraryIndex = libraries?.findIndex(l => l.type === MasterObjectTypes.Exchange);\n const exchangeLibraryId = libraries[exchangeLibraryIndex]?.id;\n\n if (!showExchangeSearchResults)\n libraries = [ ...libraries.slice(0, exchangeLibraryIndex), ...libraries.slice(exchangeLibraryIndex + 1) ];\n\n if (streamableLibraryId) {\n const streamableIndex = libraries?.findIndex(l => l.id.toString() === streamableLibraryId.toString());\n libraries = [ ...libraries.slice(0, streamableIndex), ...libraries.slice(streamableIndex + 1) ];\n }\n\n const hasLibrariesCompleted = (\n streamableLibrary.hasCompleted &&\n (!currentUser.data?.isAuthenticated || librariesRequest.hasCompleted)\n );\n\n return {\n hasLibrariesCompleted,\n libraries,\n exchangeLibraryId,\n streamableLibraryId,\n showExchangeSearchResults\n };\n}\n\nfunction useGetRatings() {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const ratings = Flight.useBasicFetch<Rating[]>(RatingRequests.ratings(currentUser.data?.countryCode));\n\n const {\n activePresentation, availablePresentations, getFallbackPresentation, hasPresentationsLoaded\n } = usePresentation();\n\n const currentPresentation = activePresentation || getFallbackPresentation();\n\n if (!hasPresentationsLoaded)\n return ratings;\n\n if (availablePresentations?.length > 1 || !currentPresentation)\n return ratings;\n\n const learningLevel = TopicsHelper.getMappedPresentationLevel(currentPresentation.learningLevel);\n if (learningLevel !== PresentationLearningLevel.Level_1)\n return ratings;\n\n return {\n ...ratings,\n data: ratings.data?.filter(rating => {\n // Primary schools shouldn't see ratings higher than PG\n return rating.code && rating.value < 64;\n })\n };\n}\n\n/**\n * This hook contains all the simple data fetching that normally sits in the view.\n * I've done this to help promote readability of of the SearchResultsView - Sha\n */\nexport function useFetchSearchData(queryParams: HashObject) {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const userDetails = Flight.useBasicFetch<User>(currentUser.data?.id && UserRequests.user(currentUser.data.id));\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n const products = useProducts();\n const settings = useSettings(null);\n\n const {\n hasLibrariesCompleted,\n libraries,\n exchangeLibraryId,\n streamableLibraryId,\n showExchangeSearchResults\n } = useGetLibraries();\n\n const {\n activePresentation, availablePresentations, getFallbackPresentation, hasPresentationsLoaded\n } = usePresentation();\n\n const currentPresentation = activePresentation || getFallbackPresentation();\n const currentPresentationId = currentPresentation?.id;\n\n const curriculums = useCurriculums();\n\n const audiences = usePresentationAudiences();\n\n const schoolLevels = useFetchSchoolLevels(currentPresentation);\n const schoolLevelIds = schoolLevels.data?.schoolLevels?.map(o => o.id);\n const availableTopics = Flight.useBasicFetch<TopicResults>(schoolLevels?.data &&\n ClassificationRequests.topicsFromAllAvailablePresentations(schoolLevelIds));\n\n const ratings = useGetRatings();\n\n const { hasPermissions, hasLocalPermissions } = usePermissions();\n\n const isLearner = hasPermissions(PermissionName.StudentExperience);\n const canViewCurriculums = hasPermissions(PermissionName.ViewCurriculums);\n const canUseSeriesActions = hasLocalPermissions(LocalPermissionName.UseSeriesActions);\n\n const topics = useSearchTopics(\n queryParams,\n ratings.data,\n currentPresentationId,\n availablePresentations,\n isLearner\n );\n\n const companies = useSearchCompanies(\n queryParams,\n ratings.data,\n availablePresentations,\n settings.hasNewMoviesAndTv\n );\n\n const {\n dashboard: moviesAndTvDashboard\n } = useFetchCuratedDashboard({\n targetType: DashboardTargetType.MoviesAndTv,\n queryParams\n });\n\n const hasDataLoaded = (\n audiences.hasCompleted &&\n hasPresentationsLoaded &&\n currentUser.hasCompleted &&\n (!currentUser.data?.isAuthenticated || userDetails.hasCompleted) &&\n ratings.hasCompleted &&\n config.hasCompleted &&\n availablePresentations &&\n (!currentUser.data?.isAuthenticated || !products.isLoadingProducts) &&\n !settings.isLoadingSettings &&\n hasLibrariesCompleted\n );\n\n return {\n queryParams,\n currentUser,\n userDetails,\n config,\n yearGroups,\n products,\n settings,\n curriculums,\n audiences,\n schoolLevels,\n currentPresentation,\n availablePresentations,\n availableTopics,\n ratings,\n topics,\n companies,\n moviesAndTvDashboard,\n currentPresentationId,\n isLearner,\n canViewCurriculums,\n canUseSeriesActions,\n libraries,\n hasDataLoaded,\n exchangeLibraryId,\n streamableLibraryId,\n showExchangeSearchResults,\n hasPermissions\n };\n}\n","import { Flight } from 'libs/common/flight';\n\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { Presentation, SchoolLevels } from 'libs/shared/interfaces';\n\nimport { usePresentation } from 'shared/hooks/usePresentation';\n\nimport { SearchRequests } from 'apps/search/flight-requests/SearchRequests';\n\nexport function useFetchSchoolLevels(presentation: Presentation) {\n const { hasPermissions } = usePermissions();\n const isLearner = hasPermissions(PermissionName.StudentExperience);\n\n const {\n availablePresentations,\n hasPresentationsLoaded\n } = usePresentation();\n\n function getPresentationIds() {\n if (isLearner)\n return presentation ? [presentation?.id] : null;\n\n return availablePresentations?.map(o => o.id);\n }\n\n const presentationIds = getPresentationIds();\n\n return Flight.useBasicFetch<SchoolLevels>(\n hasPresentationsLoaded &&\n presentationIds &&\n SearchRequests.schoolLevels(presentationIds)\n );\n}","import { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { SharedSearchRequests } from 'libs/shared/apps/search/flight-requests/SharedSearchRequests';\nimport { SearchResults, SearchResultsObject } from 'libs/shared/apps/search/interfaces';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { Company, Presentation, Rating } from 'libs/shared/interfaces';\n\nimport { SearchHelper } from 'apps/search/utils';\n\ntype CompanySearchResults = SearchResults<SearchResultsObject<Company>>;\n\nexport function useSearchCompanies(\n queryParams: HashObject,\n ratings: Rating[] = [],\n availablePresentations: Presentation[],\n hasMoviesAndTv: boolean\n): Flight.Response<SearchResults> {\n const availablePresentationIds = availablePresentations.map(p => p.id);\n\n const rawFilters = ratings?.length && FilterHelper.buildBackendFilterParams(\n queryParams,\n ratings,\n availablePresentationIds,\n false,\n []\n );\n \n const filters = rawFilters || {};\n\n /**\n * For other uses of FilterHelper.buildBackendFilterParams, the presentaiton ids will only be added for students,\n * but as a temporary fix for searching companies, we always filter by the current presentation - Sha\n */\n if (availablePresentationIds?.length)\n filters[`filters.presentation`] = availablePresentationIds;\n\n const indices = FilterHelper.getAppliedIndices(queryParams);\n\n const hasFilteredOutCompanies = !indices.includes('company');\n\n const request = SharedSearchRequests.search(\n SearchHelper.getQuery(queryParams),\n ['company'],\n filters\n );\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(queryParams.query, appliedIndices, backendFilters, null, 10);\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(queryParams.query, appliedIndices, backendFilters, cursor);\n }\n\n function fetchNext(cursor?: string) {\n fetch(getSearchRequest(cursor));\n }\n\n function onError(pageNumber: number, httpStatus: HttpStatus): void {\n if (pageNumber === 1)\n return handleHttpError(httpStatus);\n\n alerts.error(LanguageService.getPhrase(namespace, 'error'));\n }\n\n const searchResults = useInfiniteList<SearchResultObjectTypes, SearchResults>(\n getSearchRequest,\n fetchNext,\n onError,\n data => data.results\n );\n\n function getExchangeGroupingType(): ExchangeGroupingType {\n if (!options.showExchangeSearchResults)\n return 'omit';\n\n return hasExchangeLibraryFilter ? 'untouched' : 'group';\n }\n\n const videos = searchResults.items?.filter(r => r._index === 'video' || r._index === 'clip');\n useVideoMixin(videos as Video[]);\n\n const items = useGroupExchangeResults({\n searchResults: searchResults.items,\n mixedExchangeSearchResults: mixedExchangeSearchResults.data?.results,\n searchResultsResponse: searchResultsResponse.data,\n groupingType: getExchangeGroupingType()\n });\n\n return {\n ...searchResults,\n hasFirstPageCompleted: searchResults.hasFirstPageCompleted || !options.hasDataLoaded || !appliedIndices?.length,\n items,\n fetchNext,\n substituteQuery: searchResultsResponse.data?.substituteQuery,\n suggestions: searchResultsResponse.data?.suggestions\n };\n}\n","import React from 'react';\n\nimport { ExchangeVideoGroup, SearchResultObjectTypes, SearchResults, SearchResultsObject } from 'libs/shared/apps/search/interfaces';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { Video } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nexport type ExchangeGroupingType =\n 'omit' | // Don't show exchange results at all\n 'group' | // Group exchange results into a component\n 'untouched'; // Leave exchange results untouched\n\ninterface UseGroupExchangeResults {\n searchResults: SearchResultObjectTypes[];\n mixedExchangeSearchResults: SearchResultObjectTypes[];\n searchResultsResponse: SearchResults;\n groupingType: ExchangeGroupingType;\n}\n\nexport function useGroupExchangeResults(options: UseGroupExchangeResults) {\n return React.useMemo(() => {\n if (!options.searchResults?.length || !options.mixedExchangeSearchResults?.length || options.groupingType === 'untouched')\n return options.searchResults;\n\n const mixedExchangeResults: SearchResultObjectTypes[] = [...options.searchResults];\n const exchangeResults: SearchResultsObject<Video>[] = [];\n let exchangeIndex: number;\n let exchangeShowCount: number;\n let consecutive = false;\n\n options.mixedExchangeSearchResults.forEach((item, index) => {\n if (exchangeResults.length === 3) return;\n\n const isExchangeVideo = VideoHelper.isVideo(item) &&\n item.libraries.data?.length === 1 &&\n item.libraries.data?.[0]?.typeId === MasterType.ExchangeCollection;\n\n if (isExchangeVideo) {\n if (exchangeIndex === undefined) {\n exchangeIndex = index;\n exchangeShowCount = 0;\n consecutive = true;\n }\n\n if (consecutive)\n exchangeShowCount++;\n\n exchangeResults.push(item);\n return;\n }\n\n consecutive = false;\n });\n\n const exchangeVideoGroup: SearchResultsObject<ExchangeVideoGroup> = {\n id: null,\n type: null,\n name: null,\n videos: exchangeResults,\n showCount: exchangeIndex === 0 ? 1 : exchangeShowCount,\n isExchangeVideoGroup: true,\n _index: null\n };\n \n if (options.groupingType === 'group' && exchangeResults.length)\n mixedExchangeResults.splice(exchangeIndex, 0, exchangeVideoGroup);\n\n return mixedExchangeResults;\n }, [\n options.searchResultsResponse,\n options.searchResults?.length,\n options.mixedExchangeSearchResults?.length,\n options.groupingType\n ]);\n}","import React from 'react';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'search.searchResultsEmptyState';\n\ninterface SearchResultsEmptyStateProps {\n query?: string;\n scotland?: boolean;\n}\n\nexport function SearchResultsEmptyState(props: SearchResultsEmptyStateProps): JSX.Element {\n const imageUrl = (props.scotland && props.query?.trim()?.toLowerCase() === 'nessie')\n ? ImageUrls.EmptyStates.Search.RESULTS_SCOTLAND\n : ImageUrls.EmptyStates.Search.RESULTS;\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={imageUrl} />\n\n <EmptyState.Heading>\n {props.query\n ? <Text phrase='headingWithQuery' options={{ query: props.query }} />\n : <Text phrase='headingWithoutQuery' />\n }\n </EmptyState.Heading>\n\n <EmptyState.Info>\n <Text phrase='info' />\n <AppLink\n className='info-link'\n appLink={{ application: AppChannels.SUBJECT, action: Actions.Subjects.CLASSIFICATION_ALL }}\n >\n <Text phrase='topicsAppLink' />\n </AppLink>\n </EmptyState.Info>\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType, HashObject, LocationContext } from 'libs/analytics/interfaces';\n\nimport { MixedSearchResults } from 'libs/shared/apps/search/components/mixed-search-results/MixedSearchResults';\nimport { SearchFilters } from 'libs/shared/apps/search/components/search-filters/SearchFilters';\nimport { SearchSubstitute } from 'libs/shared/apps/search/components/search-substitute/SearchSubstitute';\nimport { SearchSuggestions } from 'libs/shared/apps/search/components/search-suggestions/SearchSuggestions';\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { usePluginHelper } from 'shared/hooks/use-plugin-helper/usePluginHelper';\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\n\nimport { useFetchSearchData } from 'apps/search/hooks/useFetchSearchData';\nimport { useGetSearchResults } from 'apps/search/hooks/useGetSearchResults';\nimport { useGetTagsAndClassifications } from 'apps/search/hooks/useGetTagsAndClassifications';\nimport { useSearchMask } from 'apps/search/hooks/useSearchMask';\nimport { SearchHelper } from 'apps/search/utils';\n\nimport { SearchResultsEmptyState } from './empty-state/SearchResultsEmptyState';\n\nexport const namespace = 'search.searchResults';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SearchResultsView2Props {\n queryParams: HashObject\n}\n\nexport function SearchResultsView(props: SearchResultsView2Props): JSX.Element {\n const { queryParams = {} } = props;\n\n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem });\n const { setFavourite, canFavourite } = useLiteFavourites(LocationContext.VideoThumbnail);\n const { isPlugin } = usePluginHelper();\n\n const searchData = useFetchSearchData(queryParams);\n\n const searchFilters = SearchHelper.getBackendFilters(searchData);\n\n const hasIndices = !!searchFilters?.appliedIndices.length;\n const tagsAndClassifications = useGetTagsAndClassifications(hasIndices && searchFilters);\n const searchResults = useGetSearchResults({ ...searchFilters, ...searchData });\n\n const filters = SearchHelper.getFilters(\n searchData,\n searchFilters?.inaccessibleIndices,\n hasIndices && tagsAndClassifications\n );\n \n useSetPageMetadata(PageMetadataHelper.getDefaultMetadata({\n title: queryParams.query ?? '',\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n },\n allowIndexing: false\n }));\n\n /**\n * Do we have the data we need for the entire view to render\n */\n const hasLoaded = (\n searchData.hasDataLoaded && filters\n );\n\n /**\n * Do we have the data we need to render our results\n */\n const hasSearchCompleted = (\n searchResults.hasFirstPageCompleted &&\n // Topic and Company requests won't exist if they aren't being fetched\n (!searchData.topics || searchData.topics.hasCompleted) &&\n (!searchData.companies || searchData.companies.hasCompleted) &&\n (!hasIndices || tagsAndClassifications.hasCompleted) &&\n !!filters\n );\n\n /**\n * Do we actually have results\n */\n const hasResults = (\n searchResults.items?.length ||\n searchData.topics?.data?.totalResults ||\n searchData.companies?.data?.totalResults\n );\n\n useSearchMask(hasSearchCompleted);\n\n if (!hasLoaded)\n return <></>;\n\n return (\n <div className='px-4'>\n <SearchSubstitute\n substitute={searchResults.substituteQuery}\n queryParams={queryParams}\n getAppLink={SearchHelper.getSearchAppLink}\n />\n\n {!searchResults.substituteQuery && (\n <SearchSuggestions\n suggestions={searchResults.suggestions}\n queryParams={queryParams}\n getAppLink={SearchHelper.getSearchAppLink}\n />\n )}\n\n {(!!searchData.audiences.data && !!searchData.ratings.data && !!searchData.availableTopics.data) && (\n <SearchFilters\n queryParams={queryParams}\n mainFilters={filters?.mainFilters}\n moreFilters={filters?.moreFilters}\n analyticsOptions={{\n entity: EntityType.SearchResults,\n location: LocationContext.SearchFilters\n }}\n appLink={{ application: AppChannels.SEARCH, action: Actions.Search.HOME }}\n isFetchingOptions={tagsAndClassifications.isFetching}\n />\n )}\n\n {hasSearchCompleted &&\n <section>\n {hasResults\n ? (\n <VideoActionsContext.Provider value={videoActions}>\n <MixedSearchResults\n queryParams={queryParams}\n results={searchResults.items}\n topics={searchData.topics?.data}\n companies={searchData.companies?.data}\n setFavourite={setFavourite}\n canFavourite={canFavourite}\n audiences={!queryParams.moviesAndTv && searchData.audiences.data}\n currentUser={searchData.currentUser.data}\n imageCdnUrl={searchData.config.data.imageCdnUrl}\n availablePresentations={searchData.availablePresentations}\n showActions={(!searchData.isLearner && searchData.canUseSeriesActions)}\n hasPermissions={searchData.hasPermissions}\n yearGroups={searchData.yearGroups.data}\n isPlugin={isPlugin}\n appLinks={SearchHelper.getAppLinks(\n searchData.currentPresentation,\n searchData.availablePresentations,\n queryParams.moviesAndTv\n )}\n subTextType='series'\n />\n </VideoActionsContext.Provider>\n ) : (\n <SearchResultsEmptyState\n query={queryParams.query}\n scotland={!!searchData.currentPresentation?.description?.toLowerCase().includes('scotland') ?? false}\n />\n )\n }\n {/* XOR */}\n {(searchResults.hasMore || searchResults.isFetching) && (\n <InfiniteScrollFooter\n isFetching={searchResults.isFetching}\n fetchNext={searchResults.fetchNext}\n nextCursor={searchResults.nextCursor}\n fetchOnScroll\n />\n )}\n </section>\n }\n </div>\n );\n}","import { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { SharedSearchRequests } from 'libs/shared/apps/search/flight-requests/SharedSearchRequests';\nimport { SearchIndices } from 'libs/shared/apps/search/interfaces';\n\nexport interface UseGetTagsAndClassificationsOptions {\n queryParams: HashObject;\n appliedIndices: SearchIndices[];\n backendFilters: HashObject;\n}\n\nexport function useGetTagsAndClassifications(options: UseGetTagsAndClassificationsOptions) {\n return Flight.useBasicFetch<string[]>(options && SharedSearchRequests.tagsAndClassifications(\n options.queryParams.query,\n options.appliedIndices,\n options.backendFilters\n ));\n}\n","import React from 'react';\n\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { ViewModelKeys } from 'shared/constants/LiteViewModels';\n\nexport function useSearchMask(hasCompleted: boolean): void {\n const [ showMask, setShowMask ] = useViewModel(ViewModelKeys.SHOW_SEARCH_MASK, true);\n\n React.useEffect(() => {\n showMask && hasCompleted && setShowMask(false);\n }, [hasCompleted]);\n}\n","import { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { Rating } from 'libs/shared/interfaces';\n\nexport const RatingRequests = {\n ratings(countryCode?: string): Flight.PublicRequest {\n return {\n url: '/api/domain/v2/me/ratings',\n publicUrl: UrlHelper.urlBuilder('/api/domain/v2/me/ratings', { countryCode }),\n key: 'ratings',\n // v2/me/ratings doesn't support `query={orderby:value}`. Adding this due to time constraints\n formatData: (ratings: Rating[]) => {\n return ratings.sort((a, b) => a.value - b.value);\n }\n };\n }\n};","import { Flight } from 'libs/common/react/index';\n\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\nimport { usePresentation } from 'shared/hooks/usePresentation';\n\nexport const usePresentationAudiences = () => {\n const { activePresentation, getFallbackPresentation } = usePresentation({ redirectOnError: true });\n\n const presentation = activePresentation || getFallbackPresentation();\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n !!presentation &&\n AudienceRequests.presentationAudiences(presentation.id)\n );\n\n return audiences;\n};","import React from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { CurrentUser, Video, VideoCollection } from 'libs/shared/interfaces';\n\ninterface VideoMixinOptions {\n /**\n * If the videos that are having new data mixed into are sitting on an explicit Flight namespace,\n * providing that namespace here is required\n */\n flightNamespace?: string;\n}\n\nexport function useVideoMixin(videos: VideoCollection | Video[], options: VideoMixinOptions = {}): void {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const hydratedVideos = React.useRef<Set<string>>(new Set<string>());\n\n const videoIds = videos && (Array.isArray(videos)\n ? videos.filter(Boolean).map(v => v.id)\n : videos.data.filter(Boolean).map(v => v.id));\n\n const [ request, setRequest ] = React.useState<Flight.Request[]>([]);\n\n React.useEffect(() => {\n if (!videoIds?.length || !currentUser.data?.isAuthenticated)\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 ...r,\n ClassificationRequests.hasCurriculumLinks(unhydratedVideos, null, options.flightNamespace),\n VideoRequests.videoMixinAssocs(unhydratedVideos, options.flightNamespace)\n ]);\n }, [ videoIds?.length, currentUser.data?.isAuthenticated ]);\n\n Flight.useBasicFetchAll(request);\n}","\"use client\";\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { useBootstrapPrefix, useBootstrapBreakpoints, useBootstrapMinBreakpoint } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst Row = /*#__PURE__*/React.forwardRef(({\n bsPrefix,\n className,\n // Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n as: Component = 'div',\n ...props\n}, ref) => {\n const decoratedBsPrefix = useBootstrapPrefix(bsPrefix, 'row');\n const breakpoints = useBootstrapBreakpoints();\n const minBreakpoint = useBootstrapMinBreakpoint();\n const sizePrefix = `${decoratedBsPrefix}-cols`;\n const classes = [];\n breakpoints.forEach(brkPoint => {\n const propValue = props[brkPoint];\n delete props[brkPoint];\n let cols;\n if (propValue != null && typeof propValue === 'object') {\n ({\n cols\n } = propValue);\n } else {\n cols = propValue;\n }\n const infix = brkPoint !== minBreakpoint ? `-${brkPoint}` : '';\n if (cols != null) classes.push(`${sizePrefix}${infix}-${cols}`);\n });\n return /*#__PURE__*/_jsx(Component, {\n ref: ref,\n ...props,\n className: classNames(className, decoratedBsPrefix, ...classes)\n });\n});\nRow.displayName = 'Row';\nexport default Row;"],"names":["InfiniteScrollFooter","props","ref","inView","fetchOnScroll","isFetching","fetchNext","nextCursor","className","Spinner","as","animation","role","SvgContainer","svgName","size","S","onClick","defaultProps","WidgetButtonDirection","WidgetButton","isLeft","direction","Left","arrowSvg","hide","style","state","contents","paddingBottom","viewableItems","height","useGradientBackdrop","leftGradientClassName","rightGradientClassName","hideExtendedClickableArea","leftButtonClassName","rightButtonClassName","hoverText","SCROLL_TOLERANCE","useInfiniteList","getRequest","onError","getItems","getCursor","scrollContainer","options","handleScroll","useState","pagesFetched","setPagesFetched","fetchNextFn","response","cursor","request","key","fetchNextPage","currentVal","hasMore","getBoundingClientRect","scrollTop","scrollHeight","window","innerHeight","document","documentElement","useEffect","onScroll","FunctionHelper","addEventListener","removeEventListener","shouldInitialFetch","statusCode","httpStatusClass","toString","substr","HttpStatus","items","totalItems","hasFirstPageCompleted","CompanyWidgetItem","analyticsData","id","data","name","analyticsOptions","location","actionType","entity","descriptor","CoverPill","coverUrl","logo","url","CompanyResult","Col","sm","md","useLargeStyle","lg","item","getChildAppLink","appLinks","getCompanyAppLink","getChildAppLinkOptions","getCompanyAppLinkOptions","itemIndex","search","query","queryParams","score","_score","maxScore","_maxScore","featured","_featured","pagePositionIndex","isLarge","namespace","ExchangeVideoGroup","limit","showCount","currentAppLink","currentParams","params","currentSource","source","Array","isArray","searchAppLink","AppLink","appLink","Text","phrase","searchSettings","videos","slice","map","v","i","VideoItem","video","yearGroups","getVideoAppLink","getSubTextAppLink","presentationAudiences","audiences","setFavourite","canFavourite","companyLogoFallbackUrl","subTextType","hasPermissions","FeaturedVideoResult","HeroVideo","opts","subTextAppLink","hideInteractiveBadge","showVideoGuidance","VideoHelper","PlaylistWithVideos","breakpoints","maxVideos","useBreakpoints","xl","xxl","playlist","playlistAnalyticsOption","playlistAnalyticsData","Row","xs","playlistAppLink","bgColourClassNames","itemStyle","imageCdnUrl","currentUser","showOwner","videoAnalyticsData","videoId","videoName","LargePlaylistResult","getPlaylistAppLink","preloadImage","SeriesWithVideos","series","seriesAnalyticsOption","seriesAnalyticsData","seriesAppLink","SeriesTallPoster","imageClass","LargeSeriesResult","getSeriesAppLink","CollectionVideoList","analyticsProps","hasSeasonEpisode","episodeNumber","season","collectionId","CollectionThumbnail","isSmall","VideoListHelper","hasVideos","collection","length","firstVideoWithThumbnail","find","thumbnail","isSeries","collectionType","BaseImage","imageType","Mask","type","maskType","ImageFallback","imageFallbackType","isPlugin","Actions","actions","getCollectionActions","showActions","actionsDropdownClassName","hideBadges","BadgeListContainer","Badge","rating","metadata","year","SmallPlaylistResult","SmallSeriesResult","SubjectResult","getClassificationAppLink","getClassificationAppLinkOptions","availablePresentations","VideoResult","Component","ClipItem","InteractiveItem","getPreviewQuestionsAppLink","MixedSearchResults","useSmallComponent","results","topics","totalResults","companies","companiesAndTopics","childProps","c","toLowerCase","result","index","isExchangeVideoGroup","tallPoster","SearchSubstitute","substitute","getAppLink","appLinkOptions","replace","SearchSuggestions","suggestions","suggestion","formatSearchResponse","filter","_index","clips","interactives","resultMaxScore","SharedSearchHelper","SharedSearchRequests","searchV4","indicesArr","filters","Object","keys","filterName","join","FilterConstants","excludeLibraryExclusive","isLearner","genericFilters","searchType","indices","entries","reduce","prev","value","allowSubstitute","undefined","publicUrl","HttpVerbs","formatData","success","error","assign","UrlHelper","tagsAndClassifications","normalize","TEACHER_FILTERS","STUDENT_FILTERS","useFetchSearchData","UserRequests","userDetails","config","ConfigRequests","isAuthenticated","CustomerRequests","customerId","products","settings","useSettings","streamableLibrary","LibraryRequests","streamableLibraryId","objectId","showExchangeSearchResults","hasProduct","ProductId","librariesRequest","libraries","exchangeLibraryIndex","findIndex","l","MasterObjectTypes","exchangeLibraryId","streamableIndex","hasLibrariesCompleted","hasCompleted","useGetLibraries","usePresentation","activePresentation","getFallbackPresentation","hasPresentationsLoaded","currentPresentation","currentPresentationId","curriculums","useCurriculums","usePresentationAudiences","schoolLevels","presentation","usePermissions","PermissionName","presentationIds","o","SearchRequests","useFetchSchoolLevels","schoolLevelIds","availableTopics","ClassificationRequests","ratings","RatingRequests","countryCode","TopicsHelper","learningLevel","PresentationLearningLevel","code","useGetRatings","hasLocalPermissions","canViewCurriculums","canUseSeriesActions","presentationId","isStudent","rawFilters","FilterHelper","ObjectHelper","ClassificationType","ClassificationStatus","moviesAndTv","CurationTag","presentationMap","acc","hasFilteredOutTopics","includes","shouldFetch","sortedResults","sort","a","b","presentationA","presentationB","useSearchTopics","hasMoviesAndTv","availablePresentationIds","p","hasFilteredOutCompanies","useSearchCompanies","hasNewMoviesAndTv","moviesAndTvDashboard","targetType","dashboard","hasDataLoaded","isLoadingProducts","isLoadingSettings","useGetSearchResults","appliedIndices","backendFilters","alerts","fetch","searchResultsResponse","getSearchRequest","hasExchangeLibraryFilter","libraryId","some","hasLibraryFilter","fetchMixedExchangeResults","mixedExchangeSearchResults","excludeLibraryFilter","searchResults","pageNumber","httpStatus","LanguageService","r","useVideoMixin","groupingType","exchangeIndex","exchangeShowCount","mixedExchangeResults","exchangeResults","consecutive","forEach","typeId","MasterType","push","exchangeVideoGroup","splice","useGroupExchangeResults","substituteQuery","SearchResultsEmptyState","imageUrl","scotland","trim","ImageUrls","EmptyState","src","application","action","getPhrase","SearchResultsView","videoActions","useVideoActions","useLiteFavourites","u","usePluginHelper","searchData","searchFilters","hasIndices","inaccessibleIndices","useSetPageMetadata","PageMetadataHelper","title","phraseContext","phraseHandler","titlePhrase","descriptionPhrase","allowIndexing","showMask","setShowMask","hasLoaded","hasSearchCompleted","hasResults","SearchFilters","mainFilters","moreFilters","isFetchingOptions","VideoActionsContext","description","redirectOnError","hydratedVideos","Set","videoIds","Boolean","setRequest","unhydratedVideos","current","has","add","flightNamespace","bsPrefix","decoratedBsPrefix","minBreakpoint","sizePrefix","classes","brkPoint","propValue","cols","infix","displayName"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"scripts/2734-6a7beb2ce2-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/infinite-scroll-footer/infinite-scroll-footer.scss","file:///app/packages/libs/shared/src/components/infinite-scroll-footer/InfiniteScrollFooter.tsx","file:///app/packages/libs/shared/src/components/widgets/widget-button/widget-button.scss","file:///app/packages/libs/shared/src/components/widgets/widget-button/WidgetButton.tsx","file:///app/packages/libs/shared/src/hooks/UseInfiniteScroll.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteList.ts","file:///app/packages/libs/shared/src/components/widgets/items/subject-widget-item/CompanyWidgetItem.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/CompanyResult.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/mixed-search-results.scss","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/exchange-video-group/ExchangeVideoGroup.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/FeaturedVideoResult.tsx","file:///app/packages/libs/shared/src/apps/search/components/playlist-with-videos/playlist-with-videos.scss","file:///app/packages/libs/shared/src/apps/search/components/playlist-with-videos/PlaylistWithVideos.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/LargePlaylistResults.tsx","file:///app/packages/libs/shared/src/apps/search/components/series-with-videos/series-with-videos.scss","file:///app/packages/libs/shared/src/apps/search/components/series-with-videos/SeriesWithVideos.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/LargeSeriesResult.tsx","file:///app/packages/libs/shared/src/apps/search/components/collection-video-list/CollectionVideoList.tsx","file:///app/packages/libs/shared/src/apps/search/components/collection-thumbnail/collection-thumbnail.scss","file:///app/packages/libs/shared/src/apps/search/components/collection-thumbnail/CollectionThumbnail.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/SmallPlaylistResult.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/SmallSeriesResults.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/SubjectResult.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/VideoResult.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/MixedSearchResults.tsx","file:///app/packages/libs/shared/src/apps/search/components/search-substitute/SearchSubstitute.tsx","file:///app/packages/libs/shared/src/apps/search/components/search-suggestions/SearchSuggestions.tsx","file:///app/packages/libs/shared/src/apps/search/flight-requests/SharedSearchRequests.ts","file:///app/packages/projects/lite/src/apps/search/hooks/useSearchTopics.ts","file:///app/packages/projects/lite/src/apps/search/hooks/useFetchSearchData.tsx","file:///app/packages/projects/lite/src/apps/search/hooks/useFetchSchoolLevels.ts","file:///app/packages/projects/lite/src/apps/search/hooks/useSearchCompanies.ts","file:///app/packages/projects/lite/src/apps/search/hooks/useGetSearchResults.tsx","file:///app/packages/projects/lite/src/apps/search/hooks/useGroupExchangeResults.ts","file:///app/packages/projects/lite/src/apps/search/views/search-results/empty-state/SearchResultsEmptyState.tsx","file:///app/packages/projects/lite/src/apps/search/views/search-results/SearchResultsView.tsx","file:///app/packages/projects/lite/src/apps/search/hooks/useGetTagsAndClassifications.tsx","file:///app/packages/projects/lite/src/apps/search/hooks/useSearchMask.tsx","file:///app/packages/projects/lite/src/shared/flight-requests/RatingRequests.ts","file:///app/packages/projects/lite/src/shared/hooks/usePresentationAudiences.ts","file:///app/packages/projects/lite/src/shared/hooks/useVideoMixin.ts","file:///app/node_modules/react-bootstrap/esm/Row.js"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"container\":\"VwD1b\",\"spinner\":\"eJ85e\"};","import * as React from 'react';\nimport { Spinner } from 'react-bootstrap';\nimport { useInView } from 'react-intersection-observer';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './infinite-scroll-footer.scss';\n\ninterface InfiniteScrollFooterProps {\n isFetching: boolean;\n fetchNext?: (nextCursor: string) => void;\n nextCursor?: string;\n fetchOnScroll?: boolean;\n}\n\nInfiniteScrollFooter.defaultProps = {\n fetchOnScroll: false\n};\n\nexport function InfiniteScrollFooter(props: InfiniteScrollFooterProps): React.ReactElement {\n const [ ref, inView ] = useInView();\n\n React.useEffect(() => {\n if (!props.fetchOnScroll)\n return;\n\n if (!inView || props.isFetching)\n return;\n\n props.fetchNext?.(props.nextCursor);\n }, [ inView, props.isFetching ]);\n\n return (\n <div className={`p-3 text-center ${styles.container}`} ref={ref}>\n {props.isFetching\n ? <Spinner as='span' animation='border' role='status' className={styles.spinner} />\n : (\n <SvgContainer\n svgName={cvSvgLibrary.ChevronDown}\n className='svg-container cursor-pointer'\n size={SvgContainerSize.Large}\n onClick={() => props.fetchNext?.(props.nextCursor)}\n />\n )\n }\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"buttonContainer\":\"_ejId\",\"left\":\"VSAPU\",\"right\":\"kgeXh\",\"button\":\"gAsE9\",\"hoverText\":\"APA36\",\"buttonHover\":\"cqD75\",\"chevron\":\"Ev4hr\",\"extendedClickableArea\":\"AtsWP\",\"gradientRight\":\"ZuAif\",\"gradientLeft\":\"Pt3nx\",\"topPos\":\"BVcIS\"};","import * as React from 'react';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { FixedWidgetState } from 'libs/shared/components/widgets/fixed-widget';\nimport { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './widget-button.scss';\n\nexport enum WidgetButtonDirection {\n Left,\n Right\n}\n\ninterface WidgetButtonProps {\n onClick: (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => void;\n direction: WidgetButtonDirection;\n hide: boolean;\n contents?: WidgetContents;\n useGradientBackdrop?: boolean;\n className?: string;\n hoverText?: string;\n hideExtendedClickableArea?: boolean;\n state?: FixedWidgetState;\n\n leftButtonClassName?: string;\n rightButtonClassName?: string;\n leftGradientClassName?: string;\n rightGradientClassName?: string;\n}\n\nexport const WidgetButton = React.memo(function(props: WidgetButtonProps): JSX.Element {\n const isLeft = props.direction === WidgetButtonDirection.Left;\n\n const arrowSvg = isLeft ? cvSvgLibrary.ChevronLeft : cvSvgLibrary.ChevronRight;\n\n function getPositionClass(): string {\n let className = styles.topPos;\n \n // Left / Right\n if (isLeft)\n className += ` ${styles.left} ${props.leftButtonClassName}`;\n else\n className += ` ${styles.right} ${props.rightButtonClassName}`;\n \n return className;\n }\n\n function getStyle(): React.CSSProperties {\n if (props.state?.contents === 'videos')\n return { paddingBottom: (56.25 / props.state?.viewableItems) + '%' };\n\n return { height: '100%' };\n }\n\n if (props.hide)\n return <></>;\n\n return (\n <div className={styles.buttonContainer} style={getStyle()}>\n {props.useGradientBackdrop &&\n <div className={isLeft ? `${styles.gradientLeft} ${props.leftGradientClassName}` : `${styles.gradientRight} ${props.rightGradientClassName}`} />\n }\n\n {!props.hideExtendedClickableArea && (\n <div\n role='button'\n onClick={props.onClick}\n className={`${styles.extendedClickableArea} ${isLeft ? styles.left : styles.right}`}\n />\n )}\n\n <div\n role='button'\n className={`${getPositionClass()} ${styles.button} ${props.className || ''}`}\n onClick={props.onClick}\n >\n {props.hoverText && (\n <span className={`ps-3 pe-2 ${styles.hoverText}`}>{props.hoverText}</span>\n )}\n <SvgContainer\n svgName={arrowSvg}\n size={SvgContainerSize.Medium}\n className={`svg-container d-inline-block ${styles.chevron}`}\n />\n </div>\n </div>\n );\n});","import { useEffect } from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst SCROLL_TOLERANCE = 400; // value in px\n\ninterface UseInfiniteScrollOptions {\n fetchNextPage: () => void;\n hasMore: boolean;\n isFetching: boolean;\n scrollContainer?: HTMLElement;\n}\n\nexport function useInfiniteScroll(options: UseInfiniteScrollOptions): void {\n const handleScroll = (): void => {\n if (options.isFetching)\n return;\n\n if (!options.scrollContainer) {\n const currentScrollHeight = window.innerHeight + document.documentElement.scrollTop;\n \n const totalHeight = document.documentElement.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n } else {\n const { scrollContainer } = options;\n const currentScrollHeight = scrollContainer.getBoundingClientRect().height + scrollContainer.scrollTop;\n \n const totalHeight = scrollContainer.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n }\n\n options.fetchNextPage();\n };\n\n useEffect(() => {\n const onScroll = FunctionHelper.throttle(handleScroll, 200);\n\n const scrollContainer = options.scrollContainer || window;\n\n if (options.hasMore)\n scrollContainer.addEventListener('scroll', onScroll);\n\n return () => scrollContainer.removeEventListener('scroll', onScroll);\n }, [ options.hasMore, options.fetchNextPage, options.scrollContainer ]);\n}","import { useEffect, useState } from 'react';\n\nimport { HttpStatus, HttpStatusClass } from 'libs/common/backbone/enums/HttpStatus';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { BaseObject, BasePaginatedCollection } from 'libs/shared/interfaces';\n\nimport { useInfiniteScroll } from './UseInfiniteScroll';\nimport { useSelectAllPages } from './UseSelectAllPages';\n\nexport interface UseInfiniteListResult<T extends BaseObject> {\n items: T[];\n hasMore: boolean;\n isFetching: boolean;\n nextCursor: string;\n totalItems?: number;\n hasFirstPageCompleted: boolean;\n}\n\n/**\n * Hook to extract an infinite list from the application state,\n * save it locally in state and only update when new data\n * is fetched.\n * \n * @param getRequest - callback function to get the request for each page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n * \n * @param fetchNext - callback function to fetch a page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n */\nexport function useInfiniteList<TObject = BaseObject, TResponse = BasePaginatedCollection<TObject>>(\n getRequest: ((cursor?: string) => Flight.Request) | false,\n fetchNext: ((cursor?: string) => void) | false,\n onError?: (pageNumber: number, statusCode: HttpStatus) => void,\n getItems?: (responseData: TResponse) => TObject[],\n getCursor?: (responseData: TResponse) => string,\n scrollContainer?: HTMLElement\n): UseInfiniteListResult<TObject> {\n const [ pagesFetched, setPagesFetched ] = useState(0);\n\n const fetchNextFn = fetchNext as (cursor?: string) => void;\n\n function getKey(cursor?: string): string {\n if (!getRequest)\n return null;\n\n const request = getRequest(cursor);\n\n if (!request)\n return null;\n\n return request.key;\n }\n\n const response = useSelectAllPages<TObject, TResponse>(\n getKey,\n getItems,\n getCursor\n );\n\n function fetchNextPage(): void {\n if (!fetchNext || !getRequest || !response)\n return;\n\n setPagesFetched(currentVal => currentVal + 1);\n return fetchNextFn(response.nextCursor);\n }\n\n useInfiniteScroll({\n fetchNextPage,\n hasMore: !!response?.nextCursor,\n isFetching: response?.isFetching,\n scrollContainer\n });\n\n useEffect(() => {\n if (!response)\n return;\n\n if (response.shouldInitialFetch && fetchNext) {\n fetchNextFn();\n setPagesFetched(currentVal => currentVal + 1);\n }\n }, [ response?.shouldInitialFetch, fetchNext ]);\n\n useEffect(() => {\n if (!response?.statusCode || !FunctionHelper.isFunction(onError))\n return;\n\n const httpStatusClass: HttpStatusClass = +(response.statusCode?.toString()?.substr(0, 1));\n\n if (httpStatusClass !== HttpStatusClass.ClientError && httpStatusClass !== HttpStatusClass.ServerError)\n return;\n\n onError(pagesFetched, response.statusCode);\n }, [response?.statusCode]);\n\n return {\n items: response?.items,\n hasMore: !!response?.nextCursor,\n nextCursor: response?.nextCursor,\n isFetching: response?.isFetching,\n totalItems: response?.totalItems,\n hasFirstPageCompleted: response?.hasFirstPageCompleted\n };\n}","import * as React from 'react';\n\nimport { ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { CoverPillWidgetContentWrapper, CoverPillWidgetItemProps } from 'libs/shared/components/widgets/items/subject-widget-item/CoverPill';\nimport { Company } from 'libs/shared/interfaces';\n\nexport function CompanyWidgetItem(props: CoverPillWidgetItemProps<Company>): JSX.Element {\n const analyticsData = {\n ...props.analyticsData,\n id: props.data?.id,\n name: props.data?.name\n };\n\n const analyticsOptions = {\n location: LocationContext.ClassificationListItem,\n ...props.analyticsOptions,\n actionType: UserAction.Click,\n entity: EntityType.Company,\n descriptor: ClickDescriptor.Cover\n };\n\n return (\n <CoverPillWidgetContentWrapper\n {...props}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n coverUrl={props.data.logo?.url}\n />\n );\n}","import React from 'react';\nimport { Col } from 'react-bootstrap';\n\nimport { CompanyWidgetItem } from 'libs/shared/components/widgets/items/subject-widget-item/CompanyWidgetItem';\nimport { Company } from 'libs/shared/interfaces';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function CompanyResult(props: MixedSearchResultItemProps<Company>): JSX.Element {\n return (\n <Col sm={6} md={props.useLargeStyle ? 6 : 4} lg={props.useLargeStyle ? 4 : 3}>\n <div className={`position-relative px-1 mb-2`}>\n <CompanyWidgetItem\n data={props.item}\n getChildAppLink={props.appLinks.getCompanyAppLink}\n getChildAppLinkOptions={() => props.appLinks.getCompanyAppLinkOptions?.(props.item)}\n analyticsData={{\n itemIndex: props.itemIndex,\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: 0\n }}\n isLarge={props.useLargeStyle}\n />\n </div>\n </Col>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"videoList\":\"ZhLPS\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { ClickDescriptor, EntityType, HashObject, LocationContext, SearchSourceDescriptor, UserAction } from 'libs/analytics/interfaces';\n\nimport { SourceFilterOptions } from 'libs/shared/apps/search/interfaces';\nimport { ExchangeVideoGroup } from 'libs/shared/apps/search/interfaces/SearchResults';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoItem } from 'libs/shared/components/video-list/video-item/VideoItem';\n\nimport { MixedSearchResultItemProps } from './../MixedSearchResultItemProps';\n\nimport styles from '../../mixed-search-results.scss';\n\nconst namespace = 'search.exchangeVideoGroup';\n\nconst EXCHANGE_RESULT_DISPLAY_LIMIT = 3;\n\nexport function ExchangeVideoGroup(props: MixedSearchResultItemProps<ExchangeVideoGroup>): JSX.Element {\n const limit = props.item.showCount >= EXCHANGE_RESULT_DISPLAY_LIMIT\n ? EXCHANGE_RESULT_DISPLAY_LIMIT\n : props.item.showCount;\n\n function getContainerClassName(): string {\n if (props.pagePositionIndex === 0)\n return 'border-bottom pb-1 mb-3';\n\n return 'border-top border-bottom pt-3 mt-2 pb-1 mb-3';\n }\n\n const currentAppLink = Core.AppLinkHelper.getCurrentAppLink();\n const currentParams = (currentAppLink.params as HashObject) ?? {};\n let currentSource = currentParams?.source ?? [];\n\n if (currentSource && !Array.isArray(currentSource))\n currentSource = [currentSource];\n\n const searchAppLink = {\n ...currentAppLink,\n params: {\n ...currentParams,\n source: [ ...(currentSource), SourceFilterOptions.ExchangeArchive ]\n }\n };\n\n const analyticsData = {\n query: props.queryParams.query,\n itemIndex: props.itemIndex,\n pagePositionIndex: props.pagePositionIndex\n };\n const analyticsOptions = {\n entity: EntityType.SearchResults,\n location: LocationContext.ExchangeSearchGroupItem,\n actionType: UserAction.Click,\n descriptor: SearchSourceDescriptor.ExchangeArchive\n };\n\n return (\n <div className={getContainerClassName()}>\n <AppLink\n appLink={searchAppLink}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n >\n <h2 className='h4'>\n <Text namespace={namespace} phrase='heading' />\n </h2>\n </AppLink>\n <p>\n <Text namespace={namespace} phrase='message' />\n \n <AppLink\n appLink={props.appLinks.searchSettings}\n className='text-info'\n analyticsData={analyticsData}\n analyticsOptions={{\n ...analyticsOptions,\n descriptor: ClickDescriptor.Settings\n }}\n >\n <Text namespace={namespace} phrase='searchSettings' />\n </AppLink>\n .\n </p>\n\n <div className={`position-relative ${styles.videoList}`}>\n {props.item.videos.slice(0, limit).map((v, i) => {\n return (\n <VideoItem\n key={i}\n video={v}\n yearGroups={props.yearGroups}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getSubTextAppLink={props.appLinks.getSubTextAppLink}\n presentationAudiences={props.audiences}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n analyticsData= {{\n search: {\n query: props.queryParams.query,\n score: v._score,\n maxScore: v._maxScore,\n featured: v._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n companyLogoFallbackUrl={props.companyLogoFallbackUrl}\n subTextType={props.subTextType}\n hasPermissions={props.hasPermissions}\n />\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 />\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"videoList\":\"eEZEe\"};","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { PlaylistItem } from 'libs/shared/apps/playlists/components/playlist-list';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoItem } from 'libs/shared/components/video-list/video-item/VideoItem';\nimport { VideoSubTextType } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { CurrentUser, Playlist, PresentationAudience, Video, YearGroup } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\n\nimport styles from './playlist-with-videos.scss';\n\nconst namespace = 'search.playlistWithVideos';\n\nfunction useGetMaxVideos(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xl || breakpoints.xxl)\n return 3;\n \n return 2;\n}\n\ninterface PlaylistWithVideoProps {\n playlist: Playlist;\n yearGroups: YearGroup[];\n playlistAppLink: Core.AppLink;\n presentationAudiences: PresentationAudience[];\n preloadImage: boolean;\n analyticsData: HashObject;\n imageCdnUrl: string;\n currentUser: CurrentUser;\n getSubTextAppLink: (video: Video) => Core.AppLink;\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n companyLogoFallbackUrl?: string;\n subTextType?: VideoSubTextType;\n hasPermissions: HasPermissionsFunc;\n}\n\nexport function PlaylistWithVideos(props: PlaylistWithVideoProps): JSX.Element {\n const maxVideos = useGetMaxVideos();\n\n const videos = props.playlist.videos.data.slice(0, maxVideos);\n\n const playlistAnalyticsOption: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Playlist,\n location: LocationContext.PlaylistWithVideos\n };\n\n const playlistAnalyticsData: HashObject = {\n ...props.analyticsData,\n id: props.playlist.id,\n name: props.playlist.name\n };\n\n return (\n <div className='ps-2 py-2'>\n <Row className='g-0 border border-light rounded-3'>\n <Col xs={4} lg={3} className='pe-3'>\n <PlaylistItem\n appLink={props.playlistAppLink}\n analyticsData={props.analyticsData}\n analyticsOptions={{\n ...playlistAnalyticsOption,\n descriptor: ClickDescriptor.Cover\n }}\n data={props.playlist}\n presentationAudiences={props.presentationAudiences}\n bgColourClassNames={BG_COLOUR_CLASS_NAMES}\n itemStyle='round-left'\n imageCdnUrl={props.imageCdnUrl}\n currentUser={props.currentUser}\n showCount={false}\n showOwner\n />\n </Col>\n <Col xs={8} lg={9}>\n <div className='d-flex justify-content-between'>\n <div className={`pt-3 ${styles.videoList}`}>\n {videos?.map(video => {\n const videoAnalyticsData: HashObject = {\n ...playlistAnalyticsData,\n videoId: video.id,\n videoName: video.name\n };\n\n return (\n <VideoItem\n key={video.id}\n video={video}\n getSubTextAppLink={props.getSubTextAppLink}\n canFavourite={() => false}\n setFavourite={null}\n getVideoAppLink={props.getVideoAppLink}\n analyticsData={videoAnalyticsData}\n analyticsOptions={{\n entity: EntityType.Video,\n location: LocationContext.PlaylistWithVideos\n }}\n size='sm'\n yearGroups={props.yearGroups}\n companyLogoFallbackUrl={props.companyLogoFallbackUrl}\n subTextType={props.subTextType}\n hasPermissions={props.hasPermissions}\n />\n );\n })}\n </div>\n <div className='text-end pt-3 pe-3'>\n <AppLink\n className='info-link fw-semibold'\n appLink={props.playlistAppLink}\n analyticsData={playlistAnalyticsData}\n analyticsOptions={{\n ...playlistAnalyticsOption,\n descriptor: ClickDescriptor.Link\n }}\n >\n <Text namespace={namespace} phrase='seeAllVideos' />\n </AppLink>\n </div>\n </div>\n </Col>\n </Row>\n </div>\n );\n}","import React from 'react';\n\nimport { Playlist } from 'libs/shared/interfaces';\n\nimport { PlaylistWithVideos } from '../../playlist-with-videos/PlaylistWithVideos';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function LargePlaylistResult(props: MixedSearchResultItemProps<Playlist>): JSX.Element {\n return (\n <div className='mx-n2'>\n <PlaylistWithVideos\n playlist={props.item}\n yearGroups={props.yearGroups}\n playlistAppLink={props.appLinks.getPlaylistAppLink(props.item)}\n presentationAudiences={props.audiences}\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n imageCdnUrl={props.imageCdnUrl}\n currentUser={props.currentUser}\n preloadImage\n getSubTextAppLink={props.appLinks.getSubTextAppLink}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n companyLogoFallbackUrl={props.companyLogoFallbackUrl}\n subTextType={props.subTextType}\n hasPermissions={props.hasPermissions}\n />\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"videoList\":\"UT8bc\"};","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SeriesTallPoster } from 'libs/shared/components/series-tall-poster/SeriesTallPoster';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoItem } from 'libs/shared/components/video-list/video-item/VideoItem';\nimport { VideoSubTextType } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { PresentationAudience, Series, Video, YearGroup } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\n\nimport styles from './series-with-videos.scss';\n\nconst namespace = 'search.seriesWithVideos';\n\nfunction useGetMaxVideos(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xl || breakpoints.xxl)\n return 5;\n \n if (breakpoints.lg || breakpoints.md)\n return 4;\n\n return 3;\n}\n\ninterface SeriesWithVideoProps {\n series: Series;\n yearGroups: YearGroup[];\n seriesAppLink: Core.AppLink;\n subTextAppLink: (video: Video) => Core.AppLink;\n presentationAudiences: PresentationAudience[];\n preloadImage: boolean;\n analyticsData: HashObject;\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n companyLogoFallbackUrl?: string;\n subTextType?: VideoSubTextType;\n hasPermissions: HasPermissionsFunc;\n}\n\nexport function SeriesWithVideos(props: SeriesWithVideoProps): JSX.Element {\n const maxVideos = useGetMaxVideos();\n\n const videos = props.series.videos.data.slice(0, maxVideos);\n\n const seriesAnalyticsOption: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Series,\n location: LocationContext.SeriesWithVideos\n };\n\n const seriesAnalyticsData: HashObject = {\n ...props.analyticsData,\n id: props.series.id,\n name: props.series.name\n };\n\n return (\n <div className='ps-2 py-2'>\n <Row className='g-0 border border-light rounded-3'>\n <Col xs={4} lg={3} className='pe-3'>\n <AppLink\n appLink={props.seriesAppLink}\n className='position-relative'\n analyticsData={seriesAnalyticsData}\n analyticsOptions={{\n ...seriesAnalyticsOption,\n descriptor: ClickDescriptor.TallPoster\n }}\n >\n <SeriesTallPoster\n series={props.series}\n presentationAudiences={props.presentationAudiences}\n preloadImage={props.preloadImage}\n imageClass='rounded-start-lg'\n />\n </AppLink>\n </Col>\n <Col xs={8} lg={9}>\n <div className='d-flex justify-content-between'>\n <div className={`pt-3 ${styles.videoList}`}>\n {videos?.map(video => {\n const videoAnalyticsData: HashObject = {\n ...seriesAnalyticsData,\n videoId: video.id,\n videoName: video.name\n };\n\n // insert parent series into video object\n video = {\n ...video,\n series: props.series\n };\n\n return (\n <VideoItem\n key={video.id}\n video={video}\n getSubTextAppLink={props.subTextAppLink}\n canFavourite={() => false}\n setFavourite={null}\n getVideoAppLink={props.getVideoAppLink}\n analyticsData={videoAnalyticsData}\n analyticsOptions={{\n entity: EntityType.Video,\n location: LocationContext.SeriesWithVideos\n }}\n size='sm'\n yearGroups={props.yearGroups}\n companyLogoFallbackUrl={props.companyLogoFallbackUrl}\n subTextType={props.subTextType}\n hasPermissions={props.hasPermissions}\n />\n );\n })}\n </div>\n <div className='text-end pt-3 pe-3'>\n <AppLink\n className='info-link fw-semibold'\n appLink={props.seriesAppLink}\n analyticsData={seriesAnalyticsData}\n analyticsOptions={{\n ...seriesAnalyticsOption,\n descriptor: ClickDescriptor.Link\n }}\n >\n <Text namespace={namespace} phrase='seeAllVideos' />\n </AppLink>\n </div>\n </div>\n </Col>\n </Row>\n </div>\n );\n}","import React from 'react';\n\nimport { Series } from 'libs/shared/interfaces';\n\nimport { SeriesWithVideos } from '../../series-with-videos/SeriesWithVideos';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function LargeSeriesResult(props: MixedSearchResultItemProps<Series>): JSX.Element {\n return (\n <div className='mx-n2'>\n <SeriesWithVideos\n yearGroups={props.yearGroups}\n presentationAudiences={props.audiences}\n series={props.item}\n seriesAppLink={props.appLinks.getSeriesAppLink(props.item)}\n subTextAppLink={props.appLinks.getSubTextAppLink}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n preloadImage\n companyLogoFallbackUrl={props.companyLogoFallbackUrl}\n subTextType={props.subTextType}\n hasPermissions={props.hasPermissions}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { SeasonEpisode } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Video } from 'libs/shared/interfaces';\n\nconst namespace = 'search.collectionVideoList';\n\ninterface CollectionVideoListProps {\n videos: Video[];\n collectionId: string;\n appLink: Core.AppLink;\n analyticsOptions: AnalyticsOptions;\n analyticsData?: HashObject;\n getVideoAppLink: (video: Video) => Core.AppLink;\n}\n\nfunction useGetMaxVideos(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xs)\n return 2;\n\n if (breakpoints.sm)\n return 1;\n\n return 3;\n}\n\nexport function CollectionVideoList(props: CollectionVideoListProps): JSX.Element {\n const maxVideos = useGetMaxVideos();\n\n const analyticsProps = {\n analyticsData: props.analyticsData,\n analyticsOptions: props.analyticsOptions\n };\n\n return (\n <>\n <ul className='list-unstyled my-1'>\n {props.videos.slice(0, maxVideos).map(v => {\n const hasSeasonEpisode = !!v.episodeNumber && !!v.season?.id;\n\n return (\n <li key={`${props.collectionId}:${v.id}`} className='d-flex align-items-center'>\n <AppLink\n {...analyticsProps}\n className='clamp-1'\n appLink={props.getVideoAppLink(v)}\n >\n {hasSeasonEpisode && <><SeasonEpisode video={v} /> </>}\n {v.name}\n </AppLink>\n </li>\n );\n })}\n </ul>\n\n <AppLink\n {...analyticsProps}\n className='info-link'\n appLink={props.appLink}\n >\n <Text namespace={namespace} phrase='seeAll' />\n </AppLink>\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"overlayContainer\":\"MnBcv\",\"overlay\":\"AZSmh\"};","import React from 'react';\nimport { Col } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor } from 'libs/analytics/interfaces';\n\nimport { CollectionVideoList } from 'libs/shared/apps/search/components/collection-video-list/CollectionVideoList';\nimport { ActionOptions, Actions as ActionsComponent } from 'libs/shared/components/actions/Actions';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BadgeListContainer } from 'libs/shared/components/badges/BadgeListContainer';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { Mask, MaskType } from 'libs/shared/components/mask/Mask';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoListHelper } from 'libs/shared/components/video-list/VideoListHelper';\nimport { ImageType } from 'libs/shared/enums/Images';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Playlist, Series, Video } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\n\nimport styles from './collection-thumbnail.scss';\n\nconst namespace = 'search.collectionThumbnail';\n\n\nexport type GetCollectionActions = (\n collection: Collection,\n showActions: boolean,\n collectionType: CollectionType,\n baseAnalyticsOptions: AnalyticsOptions\n) => ActionOptions[]\n\ntype Collection = Series | Playlist;\ntype CollectionType = 'series' | 'playlist';\n\ninterface CollectionThumbnailProps {\n collection: Collection;\n collectionType: CollectionType;\n appLink: Core.AppLink;\n showActions: boolean;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n maskType?: MaskType;\n imageFallbackType?: ImageFallbackType;\n hideBadges?: boolean;\n isPlugin: boolean;\n getCollectionActions: GetCollectionActions;\n getVideoAppLink: (video: Video, opts?: GetVideoAppLinkOptions) => Core.AppLink;\n}\n\nexport function CollectionThumbnail(props: CollectionThumbnailProps): JSX.Element {\n const breakpoints = useBreakpoints();\n const size = VideoListHelper.getSize(breakpoints, 'md');\n const isSmall = size === 'sm';\n\n const hasVideos = !!props.collection.videos?.data?.length;\n\n const firstVideoWithThumbnail = hasVideos && props.collection.videos.data.find(v => !!v.thumbnail?.url);\n\n function getAnalyticsData(): HashObject {\n const data: HashObject = {\n ...props.analyticsData,\n id: props.collection.id,\n name: props.collection.name\n };\n\n if (firstVideoWithThumbnail) {\n data.videoId = firstVideoWithThumbnail.id;\n data.videoName = firstVideoWithThumbnail.name;\n }\n\n return data;\n }\n\n const analyticsData = getAnalyticsData();\n const isSeries = props.collectionType === 'series';\n\n return (\n <div className={`row g-0 ${isSmall ? '' : 'py-2'}`}>\n <Col {...VideoListHelper.getThumbnailColumns()} className={`flex-column align-items-flex-start ${isSmall ? `pb-2 pe-2` : 'mb-1 px-2'}`}>\n <div className={`position-relative overflow-hidden ${isSmall ? 'rounded' : 'rounded-3'}`}>\n <BaseImage\n data={firstVideoWithThumbnail?.thumbnail}\n appLink={props.appLink}\n imageType={ImageType.Thumbnails}\n analyticsData={analyticsData}\n analyticsOptions={{\n ...props.analyticsOptions,\n descriptor: ClickDescriptor.Thumbnail\n }}\n >\n <Mask type={props.maskType} />\n <ImageFallback type={props.imageFallbackType} />\n \n <div className={`d-flex flex-column align-items-center justify-content-center text-white h-100 ${styles.overlay}`}>\n <Text namespace={namespace} phrase='seeAll' />\n </div>\n </BaseImage>\n </div>\n </Col>\n\n <Col {...VideoListHelper.getDetailsColumns()} className={isSmall ? 'pb-2' : 'px-2'}>\n {!props.isPlugin &&\n <ActionsComponent\n actions={props.getCollectionActions(\n props.collection,\n props.showActions,\n props.collectionType,\n props.analyticsOptions\n )}\n className='float-end mt-n1'\n actionsDropdownClassName='btn btn-link ms-1'\n />\n }\n\n <AppLink\n appLink={props.appLink}\n analyticsData={analyticsData}\n analyticsOptions={{\n ...props.analyticsOptions,\n descriptor: ClickDescriptor.Title\n }}\n >\n <h5 className='m-0 mb-1'><span className='clamp-1'>{props.collection.name}</span></h5>\n </AppLink>\n\n {isSeries && !props.hideBadges && (\n <BadgeListContainer>\n <Badge type={BadgeType.Rating} data={(props.collection as Series).rating} />\n <Badge type={BadgeType.ProductionYear} data={(props.collection as Series).metadata?.year} />\n </BadgeListContainer>\n )}\n \n {hasVideos && (\n <CollectionVideoList\n collectionId={props.collection.id}\n videos={props.collection.videos.data}\n appLink={props.appLink}\n analyticsData={analyticsData}\n analyticsOptions={{\n ...props.analyticsOptions,\n descriptor: ClickDescriptor.Link\n }}\n getVideoAppLink={props.getVideoAppLink}\n />\n )}\n </Col>\n </div>\n );\n}","import React from 'react';\n\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { MaskType } from 'libs/shared/components/mask/Mask';\nimport { Playlist } from 'libs/shared/interfaces';\n\nimport { CollectionThumbnail } from '../../collection-thumbnail/CollectionThumbnail';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nimport styles from '../mixed-search-results.scss';\n\nexport function SmallPlaylistResult(props: MixedSearchResultItemProps<Playlist>): JSX.Element {\n return (\n <div className={`position-relative ${styles.videoList}`}>\n <CollectionThumbnail\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n analyticsOptions={{\n entity: EntityType.Playlist,\n actionType: UserAction.Click,\n location: LocationContext.PlaylistListItem\n }}\n appLink={props.appLinks.getPlaylistAppLink(props.item)}\n showActions={props.showActions}\n collection={props.item}\n collectionType='playlist'\n maskType={MaskType.Playlist}\n imageFallbackType={ImageFallbackType.PlaylistThumbnail}\n isPlugin={props.isPlugin}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getCollectionActions={props.appLinks.getCollectionActions}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { MaskType } from 'libs/shared/components/mask/Mask';\nimport { Series } from 'libs/shared/interfaces';\n\nimport { CollectionThumbnail } from '../../collection-thumbnail/CollectionThumbnail';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nimport styles from '../mixed-search-results.scss';\n\nexport function SmallSeriesResult(props: MixedSearchResultItemProps<Series>): JSX.Element {\n return (\n <div className={`position-relative ${styles.videoList}`}>\n <CollectionThumbnail\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n analyticsOptions={{\n entity: EntityType.Series,\n actionType: UserAction.Click,\n location: LocationContext.SeriesListItem\n }}\n appLink={props.appLinks.getSeriesAppLink(props.item)}\n collectionType='series'\n collection={props.item}\n showActions={props.showActions}\n maskType={MaskType.Series}\n imageFallbackType={ImageFallbackType.SeriesThumbnail}\n hideBadges\n isPlugin={props.isPlugin}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getCollectionActions={props.appLinks.getCollectionActions}\n />\n </div>\n );\n}","import React from 'react';\nimport { Col } from 'react-bootstrap';\n\nimport { SubjectWidgetItem } from 'libs/shared/components/widgets/items/subject-widget-item';\nimport { Classification } from 'libs/shared/interfaces';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function SubjectResult(props: MixedSearchResultItemProps<Classification>): JSX.Element {\n return (\n <Col sm={6} md={props.useLargeStyle ? 6 : 4} lg={props.useLargeStyle ? 4 : 3}>\n <div className={`position-relative px-1 mb-2`}>\n <SubjectWidgetItem\n data={props.item}\n getChildAppLink={props.appLinks.getClassificationAppLink}\n getChildAppLinkOptions={\n () => props.appLinks.getClassificationAppLinkOptions?.(props.item)\n }\n availablePresentations={props.availablePresentations}\n analyticsData={{\n itemIndex: props.itemIndex,\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: 0\n }}\n isLarge={props.useLargeStyle}\n />\n </div>\n </Col>\n );\n}","import React from 'react';\n\nimport { ClipItem, ClipItemProps } from 'libs/shared/components/video-list/clip-item/ClipItem';\nimport { InteractiveItem, InteractiveItemProps } from 'libs/shared/components/video-list/interactive-item/InteractiveItem';\nimport { VideoItem, VideoItemProps } from 'libs/shared/components/video-list/video-item/VideoItem';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nimport styles from '../mixed-search-results.scss';\n\nexport function VideoResult(props: MixedSearchResultItemProps<VideoTypes>): JSX.Element {\n function getItemComponent(\n video: VideoTypes\n ): (props: ClipItemProps | InteractiveItemProps | VideoItemProps) => JSX.Element {\n if (VideoHelper.isClip(video))\n return ClipItem;\n \n if (VideoHelper.isInteractive(video))\n return InteractiveItem;\n \n return VideoItem;\n }\n\n const Component = getItemComponent(props.item);\n\n return (\n <div className={`position-relative ${styles.videoList}`}>\n <Component\n video={props.item}\n yearGroups={props.yearGroups}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getSubTextAppLink={props.appLinks.getSubTextAppLink}\n getPreviewQuestionsAppLink={props.appLinks.getPreviewQuestionsAppLink}\n presentationAudiences={props.audiences}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n analyticsData= {{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n companyLogoFallbackUrl={props.companyLogoFallbackUrl}\n subTextType={props.subTextType}\n hasPermissions={props.hasPermissions}\n />\n </div>\n );\n}","import React from 'react';\nimport { Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { VideoSubTextType } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { CanFavouriteFunc, Classification, Company, CurrentUser, FavouriteFunc, InteractiveMetadata, Playlist, Presentation, PresentationAudience, Series, Video, YearGroup } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { SearchResultObjectTypes, SearchResults, SearchResultsObject } from '../../interfaces';\nimport { GetCollectionActions } from '../collection-thumbnail/CollectionThumbnail';\n\nimport { CompanyResult } from './components/CompanyResult';\nimport { ExchangeVideoGroup } from './components/exchange-video-group/ExchangeVideoGroup';\nimport { FeaturedVideoResult } from './components/FeaturedVideoResult';\nimport { LargePlaylistResult } from './components/LargePlaylistResults';\nimport { LargeSeriesResult } from './components/LargeSeriesResult';\nimport { BaseMixedSearchResultItemProps } from './components/MixedSearchResultItemProps';\nimport { SmallPlaylistResult } from './components/SmallPlaylistResult';\nimport { SmallSeriesResult } from './components/SmallSeriesResults';\nimport { SubjectResult } from './components/SubjectResult';\nimport { VideoResult } from './components/VideoResult';\n\nconst TOPIC_DISPLAY_LIMIT = 8;\n\nexport interface MixedSearchResultAppLinks {\n getSubTextAppLink: (video: Video) => Core.AppLink;\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n getSeriesAppLink: (series: Series) => Core.AppLink;\n getCompanyAppLink: (company: Company) => Core.AppLink;\n getCompanyAppLinkOptions?: (company: Company) => Core.AppLinkOptions;\n getClassificationAppLink: (classification: Classification) => Core.AppLink;\n getClassificationAppLinkOptions?: (classification: Classification) => Core.AppLinkOptions;\n getPlaylistAppLink: (playlist: Playlist) => Core.AppLink;\n getPreviewQuestionsAppLink: (interactive: InteractiveMetadata) => Core.AppLink;\n getCollectionActions: GetCollectionActions;\n searchSettings?: Core.AppLink;\n}\n\ninterface MixedSearchResultsProps {\n queryParams: HashObject;\n results: SearchResultObjectTypes[];\n topics?: SearchResults;\n companies?: SearchResults;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n audiences: PresentationAudience[];\n currentUser: CurrentUser;\n imageCdnUrl: string;\n availablePresentations: Presentation[]\n showActions: boolean;\n yearGroups: YearGroup[];\n hasPermissions: HasPermissionsFunc;\n isPlugin: boolean;\n appLinks: MixedSearchResultAppLinks;\n companyLogoFallbackUrl?: string;\n subTextType?: VideoSubTextType;\n}\n\nexport const MixedSearchResults = React.memo(function(props: MixedSearchResultsProps): JSX.Element {\n const breakpoints = useBreakpoints();\n const useSmallComponent = breakpoints.xs || breakpoints.sm;\n\n if (!props.results?.length && !props.topics?.totalResults && !props.companies?.totalResults)\n return <></>;\n\n const companiesAndTopics = [\n ...props.companies?.results ?? [],\n ...props.topics?.results ?? []\n ];\n\n const childProps: BaseMixedSearchResultItemProps = {\n useLargeStyle: companiesAndTopics.length < 4,\n ...props\n };\n\n return (\n <div className='position-relative'>\n {!!companiesAndTopics.length && (\n <Row className='g-0 pb-3 mx-n1'>\n {companiesAndTopics.slice(0, TOPIC_DISPLAY_LIMIT).map((c, itemIndex) => {\n switch (c.type.toLowerCase()) {\n case 'company':\n return (\n <CompanyResult\n key={itemIndex}\n item={c as SearchResultsObject<Company>}\n itemIndex={itemIndex}\n {...childProps}\n />\n );\n case 'subject': {\n return (\n <SubjectResult\n key={itemIndex}\n item={c as SearchResultsObject<Classification>}\n itemIndex={itemIndex}\n {...childProps}\n />\n );\n }\n }\n })}\n </Row>\n )}\n\n {props.results?.map((result, index) => {\n const pagePositionIndex = companiesAndTopics.length ? index + 1 : index;\n\n if ('isExchangeVideoGroup' in result && result.isExchangeVideoGroup) {\n return (\n <ExchangeVideoGroup\n key={index}\n item={result}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n \n\n switch (result.type?.toLowerCase()) {\n case 'interactive':\n case 'clip':\n case 'video': {\n if (index === 0 && result._featured && VideoHelper.isVideo(result)) {\n return (\n <FeaturedVideoResult\n key={index}\n item={result as SearchResultsObject<Video>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n return (\n <VideoResult\n key={index}\n item={result as SearchResultsObject<Video>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n case 'playlist': {\n if (useSmallComponent) {\n return (\n <SmallPlaylistResult\n key={index}\n item={result as SearchResultsObject<Playlist>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n return (\n <LargePlaylistResult\n key={index}\n item={result as SearchResultsObject<Playlist>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n case 'series': {\n const series = result as Series;\n\n if (useSmallComponent || !series.tallPoster?.id) {\n return (\n <SmallSeriesResult\n key={index}\n item={result as SearchResultsObject<Series>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n return (\n <LargeSeriesResult\n key={index}\n item={result as SearchResultsObject<Series>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n }\n })}\n </div>\n );\n});","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'search.searchSubstitute';\n\ninterface SearchSubstituteProps {\n substitute: string;\n queryParams: HashObject;\n getAppLink: (query: string, queryParams: HashObject) => Core.AppLink\n}\n\nexport function SearchSubstitute(props: SearchSubstituteProps): JSX.Element {\n if (!props.substitute)\n return <></>;\n\n return (\n <p className='mb-3'>\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 );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'search.searchSuggestions';\n\ninterface SearchSuggestionsProps {\n suggestions: string[];\n queryParams: HashObject;\n getAppLink: (query: string, queryParams: HashObject) => Core.AppLink\n}\n\nSearchSuggestions.defaultProps = {\n suggestions: [],\n queryParams: {}\n};\n\nexport function SearchSuggestions(props: SearchSuggestionsProps): JSX.Element {\n if (!props.suggestions?.length)\n return <></>;\n\n return (\n <div className='d-flex align-items-center mb-3'>\n <Text namespace={namespace} phrase='didYouMean' />\n \n\n {props.suggestions.map((suggestion, index) => (\n <React.Fragment key={`${suggestion}:${index}`}>\n {index !== 0 && <span className='mx-1'>•</span>}\n\n <AppLink\n className='info-link'\n appLink={props.getAppLink(suggestion, props.queryParams)}\n appLinkOptions={{ replace: true }}\n >\n {suggestion}\n </AppLink>\n </React.Fragment>\n ))}\n </div>\n );\n}","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { FilterConstants } from 'libs/shared/apps/search/constants/FilterConstants';\nimport { SearchIndices, SearchResultObjectTypes, SearchResults, SearchResultsObject } from 'libs/shared/apps/search/interfaces';\nimport { SharedSearchHelper } from 'libs/shared/apps/search/utils/SharedSearchHelper';\nimport { Playlist, Series } from 'libs/shared/interfaces';\n\nfunction formatSearchResponse(response: SearchResults<SearchResultObjectTypes>) {\n /**\n * Until playlists and series are regionalised, search will always return every series/playlist that exists\n * even if the current user doesn't have access to the content inside (which will happen for example when playlists/series)\n * contain all UK library content but is being searched for by an AU user.\n *\n * For some search queries, this may result in search showing a bunch of \"empty\" playlists/series, which sucks.\n * This will filter all empty collections out and decrement the `totalResults` to avoid this and make search a better\n * experience.\n *\n * Ideally this will be removed one day when this regionalisation is no longer an issue.\n */\n let totalResults = response.totalResults;\n\n const results = response?.results?.filter(result => {\n if (result._index !== 'series' && result._index !== 'playlist')\n return true;\n\n if (result._index === 'playlist') {\n const playlist = result as SearchResultsObject<Playlist>;\n\n if (playlist.clips?.data?.length ||\n playlist.interactives?.data?.length ||\n playlist.videos?.data?.length)\n return true;\n\n totalResults--;\n return false;\n }\n\n if ((result as SearchResultsObject<Series>).videos?.data?.length === 0) {\n totalResults--;\n return false;\n }\n\n return true;\n }) ?? [];\n\n response.results = results;\n response.totalResults = totalResults;\n\n // The first search result will always have the highest score value.\n // We store it so that we can access it for subsequent results pages\n const resultMaxScore = results[0]?._score;\n\n return {\n ...response,\n results: SharedSearchHelper.mapMaxScoreToSearchResults(results, resultMaxScore)\n };\n}\n\nexport const SharedSearchRequests = {\n searchV4(\n query: string,\n indicesArr: SearchIndices[],\n filters: HashObject = {},\n cursor?: string,\n limit?: number\n ): Flight.PublicRequest {\n let key = `search:v4:${query}:${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: true,\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 cursor?: string,\n success?: (results: SearchResults) => void,\n error?: (xhr: Xhr) => void\n ): Flight.PublicRequest {\n let key = `search:${query}:${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: true,\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 );\n\n const shouldFetch = !hasFilteredOutTopics;\n\n const response = Flight.useBasicFetch<TopicSearchResults>(shouldFetch && request);\n\n if (!shouldFetch)\n return null;\n\n if (!response.data)\n return response;\n\n if (!availablePresentations || availablePresentations?.length < 2)\n return response;\n\n const results = [...response.data.results];\n\n /**\n * If the customer has more than 1 presentation, and they search for something that returns 2 topics\n * with the same score, then we want to order those topics based on the presentation's learning level.\n * This is achieved by checking the `value` on the presentation.\n */\n const sortedResults = results.sort((a, b) => {\n // If the scores are different, then keep the original ordering\n if (a._score !== b._score)\n return 0;\n\n const presentationA = presentationMap[a.presentationId];\n const presentationB = presentationMap[b.presentationId];\n\n if (!presentationA)\n return 1;\n\n if (!presentationB)\n return -1;\n\n // Order by presentation value\n return presentationA.value - presentationB.value;\n });\n\n return {\n ...response,\n data: {\n ...response.data,\n results: sortedResults\n }\n };\n}\n","import { Flight } from 'libs/common/flight';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport { TopicResults } from 'libs/shared/apps/search/interfaces';\nimport { MasterObjectTypes } from 'libs/shared/enums/MasterObjectTypes';\nimport { LocalPermissionName, PermissionName } from 'libs/shared/enums/PermissionName';\nimport { PresentationLearningLevel } from 'libs/shared/enums/PresentationLearningLevel';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { DomainMasterCollectionType, LibraryRequests } from 'libs/shared/flight-requests/LibraryRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, CurrentUser, DashboardTargetType, Library, Rating, User, YearGroup } from 'libs/shared/interfaces';\nimport { TopicsHelper } from 'libs/shared/utils/topics-helper/TopicsHelper';\n\nimport { RatingRequests } from 'shared/flight-requests/RatingRequests';\nimport { useCurriculums } from 'shared/hooks/useCurriculums';\nimport { usePresentation } from 'shared/hooks/usePresentation';\nimport { usePresentationAudiences } from 'shared/hooks/usePresentationAudiences';\nimport { useFetchCuratedDashboard } from 'shared/utils/DashboardHelper';\n\nimport { useFetchSchoolLevels } from 'apps/search/hooks/useFetchSchoolLevels';\nimport { useSearchCompanies } from 'apps/search/hooks/useSearchCompanies';\nimport { useSearchTopics } from 'apps/search/hooks/useSearchTopics';\n\n/**\n * We need to fetch libraries in order to support the sources filter. \n * However we need to exclude the streamable library, and additionally we need to exclude\n * the exchange library if the user has decided they don't want to see exchange results.\n * \n * We then need to return both of these ids so that the FilterHelper.getBackendFilters()\n * can add them as excludeLibraryExclusive filters\n * \n * - Sha\n */\nfunction useGetLibraries() {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const products = useProducts();\n const settings = useSettings(null);\n\n const streamableLibrary = Flight.useBasicFetch<HashObject>(LibraryRequests.streamableLearning());\n const streamableLibraryId = streamableLibrary.data?.objectId;\n\n const showExchangeSearchResults = products.hasProduct(ProductId.Exchange) && settings.showExchangeSearchResults;\n\n const libraryTypes: DomainMasterCollectionType[] = [ 'sharedLibrary', 'customLibrary', 'workspace', 'hostedLibrary', 'exchange' ];\n const librariesRequest = Flight.useBasicFetch<Library[]>(\n currentUser.data?.isAuthenticated && LibraryRequests.domainLibraries(libraryTypes)\n );\n\n let libraries = librariesRequest.data ?? [];\n const exchangeLibraryIndex = libraries?.findIndex(l => l.type === MasterObjectTypes.Exchange);\n const exchangeLibraryId = libraries[exchangeLibraryIndex]?.id;\n\n if (!showExchangeSearchResults)\n libraries = [ ...libraries.slice(0, exchangeLibraryIndex), ...libraries.slice(exchangeLibraryIndex + 1) ];\n\n if (streamableLibraryId) {\n const streamableIndex = libraries?.findIndex(l => l.id.toString() === streamableLibraryId.toString());\n libraries = [ ...libraries.slice(0, streamableIndex), ...libraries.slice(streamableIndex + 1) ];\n }\n\n const hasLibrariesCompleted = (\n streamableLibrary.hasCompleted &&\n (!currentUser.data?.isAuthenticated || librariesRequest.hasCompleted)\n );\n\n return {\n hasLibrariesCompleted,\n libraries,\n exchangeLibraryId,\n streamableLibraryId,\n showExchangeSearchResults\n };\n}\n\nfunction useGetRatings() {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const ratings = Flight.useBasicFetch<Rating[]>(RatingRequests.ratings(currentUser.data?.countryCode));\n\n const {\n activePresentation, availablePresentations, getFallbackPresentation, hasPresentationsLoaded\n } = usePresentation();\n\n const currentPresentation = activePresentation || getFallbackPresentation();\n\n if (!hasPresentationsLoaded)\n return ratings;\n\n if (availablePresentations?.length > 1 || !currentPresentation)\n return ratings;\n\n const learningLevel = TopicsHelper.getMappedPresentationLevel(currentPresentation.learningLevel);\n if (learningLevel !== PresentationLearningLevel.Level_1)\n return ratings;\n\n return {\n ...ratings,\n data: ratings.data?.filter(rating => {\n // Primary schools shouldn't see ratings higher than PG\n return rating.code && rating.value < 64;\n })\n };\n}\n\n/**\n * This hook contains all the simple data fetching that normally sits in the view.\n * I've done this to help promote readability of of the SearchResultsView - Sha\n */\nexport function useFetchSearchData(queryParams: HashObject) {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const userDetails = Flight.useBasicFetch<User>(currentUser.data?.id && UserRequests.user(currentUser.data.id));\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n const products = useProducts();\n const settings = useSettings(null);\n\n const {\n hasLibrariesCompleted,\n libraries,\n exchangeLibraryId,\n streamableLibraryId,\n showExchangeSearchResults\n } = useGetLibraries();\n\n const {\n activePresentation, availablePresentations, getFallbackPresentation, hasPresentationsLoaded\n } = usePresentation();\n\n const currentPresentation = activePresentation || getFallbackPresentation();\n const currentPresentationId = currentPresentation?.id;\n\n const curriculums = useCurriculums();\n\n const audiences = usePresentationAudiences();\n\n const schoolLevels = useFetchSchoolLevels(currentPresentation);\n const schoolLevelIds = schoolLevels.data?.schoolLevels?.map(o => o.id);\n const availableTopics = Flight.useBasicFetch<TopicResults>(schoolLevels?.data &&\n ClassificationRequests.topicsFromAllAvailablePresentations(schoolLevelIds));\n\n const ratings = useGetRatings();\n\n const { hasPermissions, hasLocalPermissions } = usePermissions();\n\n const isLearner = hasPermissions(PermissionName.StudentExperience);\n const canViewCurriculums = hasPermissions(PermissionName.ViewCurriculums);\n const canUseSeriesActions = hasLocalPermissions(LocalPermissionName.UseSeriesActions);\n\n const topics = useSearchTopics(\n queryParams,\n ratings.data,\n currentPresentationId,\n availablePresentations,\n isLearner\n );\n\n const companies = useSearchCompanies(\n queryParams,\n ratings.data,\n availablePresentations,\n settings.hasNewMoviesAndTv\n );\n\n const {\n dashboard: moviesAndTvDashboard\n } = useFetchCuratedDashboard({\n targetType: DashboardTargetType.MoviesAndTv,\n queryParams\n });\n\n const hasDataLoaded = (\n audiences.hasCompleted &&\n hasPresentationsLoaded &&\n currentUser.hasCompleted &&\n (!currentUser.data?.isAuthenticated || userDetails.hasCompleted) &&\n ratings.hasCompleted &&\n config.hasCompleted &&\n availablePresentations &&\n (!currentUser.data?.isAuthenticated || !products.isLoadingProducts) &&\n !settings.isLoadingSettings &&\n hasLibrariesCompleted\n );\n\n return {\n queryParams,\n currentUser,\n userDetails,\n config,\n yearGroups,\n products,\n settings,\n curriculums,\n audiences,\n schoolLevels,\n currentPresentation,\n availablePresentations,\n availableTopics,\n ratings,\n topics,\n companies,\n moviesAndTvDashboard,\n currentPresentationId,\n isLearner,\n canViewCurriculums,\n canUseSeriesActions,\n libraries,\n hasDataLoaded,\n exchangeLibraryId,\n streamableLibraryId,\n showExchangeSearchResults,\n hasPermissions\n };\n}\n","import { Flight } from 'libs/common/flight';\n\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { Presentation, SchoolLevels } from 'libs/shared/interfaces';\n\nimport { usePresentation } from 'shared/hooks/usePresentation';\n\nimport { SearchRequests } from 'apps/search/flight-requests/SearchRequests';\n\nexport function useFetchSchoolLevels(presentation: Presentation) {\n const { hasPermissions } = usePermissions();\n const isLearner = hasPermissions(PermissionName.StudentExperience);\n\n const {\n availablePresentations,\n hasPresentationsLoaded\n } = usePresentation();\n\n function getPresentationIds() {\n if (isLearner)\n return presentation ? [presentation?.id] : null;\n\n return availablePresentations?.map(o => o.id);\n }\n\n const presentationIds = getPresentationIds();\n\n return Flight.useBasicFetch<SchoolLevels>(\n hasPresentationsLoaded &&\n presentationIds &&\n SearchRequests.schoolLevels(presentationIds)\n );\n}","import { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { SharedSearchRequests } from 'libs/shared/apps/search/flight-requests/SharedSearchRequests';\nimport { SearchResults, SearchResultsObject } from 'libs/shared/apps/search/interfaces';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { Company, Presentation, Rating } from 'libs/shared/interfaces';\n\nimport { SearchHelper } from 'apps/search/utils';\n\ntype CompanySearchResults = SearchResults<SearchResultsObject<Company>>;\n\nexport function useSearchCompanies(\n queryParams: HashObject,\n ratings: Rating[] = [],\n availablePresentations: Presentation[],\n hasMoviesAndTv: boolean\n): Flight.Response<SearchResults> {\n const availablePresentationIds = availablePresentations.map(p => p.id);\n\n const rawFilters = ratings?.length && FilterHelper.buildBackendFilterParams(\n queryParams,\n ratings,\n availablePresentationIds,\n false,\n []\n );\n \n const filters = rawFilters || {};\n\n /**\n * For other uses of FilterHelper.buildBackendFilterParams, the presentaiton ids will only be added for students,\n * but as a temporary fix for searching companies, we always filter by the current presentation - Sha\n */\n if (availablePresentationIds?.length)\n filters[`filters.presentation`] = availablePresentationIds;\n\n const indices = FilterHelper.getAppliedIndices(queryParams);\n\n const hasFilteredOutCompanies = !indices.includes('company');\n\n const request = SharedSearchRequests.search(\n SearchHelper.getQuery(queryParams),\n ['company'],\n filters\n );\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(queryParams.query, appliedIndices, backendFilters, null, 10);\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(queryParams.query, appliedIndices, backendFilters, cursor);\n }\n\n function fetchNext(cursor?: string) {\n fetch(getSearchRequest(cursor));\n }\n\n function onError(pageNumber: number, httpStatus: HttpStatus): void {\n if (pageNumber === 1)\n return handleHttpError(httpStatus);\n\n alerts.error(LanguageService.getPhrase(namespace, 'error'));\n }\n\n const searchResults = useInfiniteList<SearchResultObjectTypes, SearchResults>(\n getSearchRequest,\n fetchNext,\n onError,\n data => data.results\n );\n\n function getExchangeGroupingType(): ExchangeGroupingType {\n if (!options.showExchangeSearchResults)\n return 'omit';\n\n return hasExchangeLibraryFilter ? 'untouched' : 'group';\n }\n\n const videos = searchResults.items?.filter(r => r._index === 'video' || r._index === 'clip');\n useVideoMixin(videos as Video[]);\n\n const items = useGroupExchangeResults({\n searchResults: searchResults.items,\n mixedExchangeSearchResults: mixedExchangeSearchResults.data?.results,\n searchResultsResponse: searchResultsResponse.data,\n groupingType: getExchangeGroupingType()\n });\n\n return {\n ...searchResults,\n hasFirstPageCompleted: searchResults.hasFirstPageCompleted || !options.hasDataLoaded || !appliedIndices?.length,\n items,\n fetchNext,\n substituteQuery: searchResultsResponse.data?.substituteQuery,\n suggestions: searchResultsResponse.data?.suggestions\n };\n}\n","import React from 'react';\n\nimport { ExchangeVideoGroup, SearchResultObjectTypes, SearchResults, SearchResultsObject } from 'libs/shared/apps/search/interfaces';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { Video } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nexport type ExchangeGroupingType =\n 'omit' | // Don't show exchange results at all\n 'group' | // Group exchange results into a component\n 'untouched'; // Leave exchange results untouched\n\ninterface UseGroupExchangeResults {\n searchResults: SearchResultObjectTypes[];\n mixedExchangeSearchResults: SearchResultObjectTypes[];\n searchResultsResponse: SearchResults;\n groupingType: ExchangeGroupingType;\n}\n\nexport function useGroupExchangeResults(options: UseGroupExchangeResults) {\n return React.useMemo(() => {\n if (!options.searchResults?.length || !options.mixedExchangeSearchResults?.length || options.groupingType === 'untouched')\n return options.searchResults;\n\n const mixedExchangeResults: SearchResultObjectTypes[] = [...options.searchResults];\n const exchangeResults: SearchResultsObject<Video>[] = [];\n let exchangeIndex: number;\n let exchangeShowCount: number;\n let consecutive = false;\n\n options.mixedExchangeSearchResults.forEach((item, index) => {\n if (exchangeResults.length === 3) return;\n\n const isExchangeVideo = VideoHelper.isVideo(item) &&\n item.libraries.data?.length === 1 &&\n item.libraries.data?.[0]?.typeId === MasterType.ExchangeCollection;\n\n if (isExchangeVideo) {\n if (exchangeIndex === undefined) {\n exchangeIndex = index;\n exchangeShowCount = 0;\n consecutive = true;\n }\n\n if (consecutive)\n exchangeShowCount++;\n\n exchangeResults.push(item);\n return;\n }\n\n consecutive = false;\n });\n\n const exchangeVideoGroup: SearchResultsObject<ExchangeVideoGroup> = {\n id: null,\n type: null,\n name: null,\n videos: exchangeResults,\n showCount: exchangeIndex === 0 ? 1 : exchangeShowCount,\n isExchangeVideoGroup: true,\n _index: null\n };\n \n if (options.groupingType === 'group' && exchangeResults.length)\n mixedExchangeResults.splice(exchangeIndex, 0, exchangeVideoGroup);\n\n return mixedExchangeResults;\n }, [\n options.searchResultsResponse,\n options.searchResults?.length,\n options.mixedExchangeSearchResults?.length,\n options.groupingType\n ]);\n}","import React from 'react';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'search.searchResultsEmptyState';\n\ninterface SearchResultsEmptyStateProps {\n query?: string;\n scotland?: boolean;\n}\n\nexport function SearchResultsEmptyState(props: SearchResultsEmptyStateProps): JSX.Element {\n const imageUrl = (props.scotland && props.query?.trim()?.toLowerCase() === 'nessie')\n ? ImageUrls.EmptyStates.Search.RESULTS_SCOTLAND\n : ImageUrls.EmptyStates.Search.RESULTS;\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={imageUrl} />\n\n <EmptyState.Heading>\n {props.query\n ? <Text phrase='headingWithQuery' options={{ query: props.query }} />\n : <Text phrase='headingWithoutQuery' />\n }\n </EmptyState.Heading>\n\n <EmptyState.Info>\n <Text phrase='info' />\n <AppLink\n className='info-link'\n appLink={{ application: AppChannels.SUBJECT, action: Actions.Subjects.CLASSIFICATION_ALL }}\n >\n <Text phrase='topicsAppLink' />\n </AppLink>\n </EmptyState.Info>\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType, HashObject, LocationContext } from 'libs/analytics/interfaces';\n\nimport { MixedSearchResults } from 'libs/shared/apps/search/components/mixed-search-results/MixedSearchResults';\nimport { SearchFilters } from 'libs/shared/apps/search/components/search-filters/SearchFilters';\nimport { SearchSubstitute } from 'libs/shared/apps/search/components/search-substitute/SearchSubstitute';\nimport { SearchSuggestions } from 'libs/shared/apps/search/components/search-suggestions/SearchSuggestions';\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { usePluginHelper } from 'shared/hooks/use-plugin-helper/usePluginHelper';\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\n\nimport { useFetchSearchData } from 'apps/search/hooks/useFetchSearchData';\nimport { useGetSearchResults } from 'apps/search/hooks/useGetSearchResults';\nimport { useGetTagsAndClassifications } from 'apps/search/hooks/useGetTagsAndClassifications';\nimport { useSearchMask } from 'apps/search/hooks/useSearchMask';\nimport { SearchHelper } from 'apps/search/utils';\n\nimport { SearchResultsEmptyState } from './empty-state/SearchResultsEmptyState';\n\nexport const namespace = 'search.searchResults';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SearchResultsView2Props {\n queryParams: HashObject\n}\n\nexport function SearchResultsView(props: SearchResultsView2Props): JSX.Element {\n const { queryParams = {} } = props;\n\n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem });\n const { setFavourite, canFavourite } = useLiteFavourites(LocationContext.VideoThumbnail);\n const { isPlugin } = usePluginHelper();\n\n const searchData = useFetchSearchData(queryParams);\n\n const searchFilters = SearchHelper.getBackendFilters(searchData);\n\n const hasIndices = !!searchFilters?.appliedIndices.length;\n const tagsAndClassifications = useGetTagsAndClassifications(hasIndices && searchFilters);\n const searchResults = useGetSearchResults({ ...searchFilters, ...searchData });\n\n const filters = SearchHelper.getFilters(\n searchData,\n searchFilters?.inaccessibleIndices,\n hasIndices && tagsAndClassifications\n );\n \n useSetPageMetadata(PageMetadataHelper.getDefaultMetadata({\n title: queryParams.query ?? '',\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n },\n allowIndexing: false\n }));\n\n /**\n * Do we have the data we need for the entire view to render\n */\n const hasLoaded = (\n searchData.hasDataLoaded && filters\n );\n\n /**\n * Do we have the data we need to render our results\n */\n const hasSearchCompleted = (\n searchResults.hasFirstPageCompleted &&\n // Topic and Company requests won't exist if they aren't being fetched\n (!searchData.topics || searchData.topics.hasCompleted) &&\n (!searchData.companies || searchData.companies.hasCompleted) &&\n (!hasIndices || tagsAndClassifications.hasCompleted) &&\n !!filters\n );\n\n /**\n * Do we actually have results\n */\n const hasResults = (\n searchResults.items?.length ||\n searchData.topics?.data?.totalResults ||\n searchData.companies?.data?.totalResults\n );\n\n useSearchMask(hasSearchCompleted);\n\n if (!hasLoaded)\n return <></>;\n\n return (\n <div className='px-4'>\n <SearchSubstitute\n substitute={searchResults.substituteQuery}\n queryParams={queryParams}\n getAppLink={SearchHelper.getSearchAppLink}\n />\n\n {!searchResults.substituteQuery && (\n <SearchSuggestions\n suggestions={searchResults.suggestions}\n queryParams={queryParams}\n getAppLink={SearchHelper.getSearchAppLink}\n />\n )}\n\n {(!!searchData.audiences.data && !!searchData.ratings.data && !!searchData.availableTopics.data) && (\n <SearchFilters\n queryParams={queryParams}\n mainFilters={filters?.mainFilters}\n moreFilters={filters?.moreFilters}\n analyticsOptions={{\n entity: EntityType.SearchResults,\n location: LocationContext.SearchFilters\n }}\n appLink={{ application: AppChannels.SEARCH, action: Actions.Search.HOME }}\n isFetchingOptions={tagsAndClassifications.isFetching}\n />\n )}\n\n {hasSearchCompleted &&\n <section>\n {hasResults\n ? (\n <VideoActionsContext.Provider value={videoActions}>\n <MixedSearchResults\n queryParams={queryParams}\n results={searchResults.items}\n topics={searchData.topics?.data}\n companies={searchData.companies?.data}\n setFavourite={setFavourite}\n canFavourite={canFavourite}\n audiences={!queryParams.moviesAndTv && searchData.audiences.data}\n currentUser={searchData.currentUser.data}\n imageCdnUrl={searchData.config.data.imageCdnUrl}\n availablePresentations={searchData.availablePresentations}\n showActions={(!searchData.isLearner && searchData.canUseSeriesActions)}\n hasPermissions={searchData.hasPermissions}\n yearGroups={searchData.yearGroups.data}\n isPlugin={isPlugin}\n appLinks={SearchHelper.getAppLinks(\n searchData.currentPresentation,\n searchData.availablePresentations,\n queryParams.moviesAndTv\n )}\n subTextType='series'\n />\n </VideoActionsContext.Provider>\n ) : (\n <SearchResultsEmptyState\n query={queryParams.query}\n scotland={!!searchData.currentPresentation?.description?.toLowerCase().includes('scotland') ?? false}\n />\n )\n }\n {/* XOR */}\n {(searchResults.hasMore || searchResults.isFetching) && (\n <InfiniteScrollFooter\n isFetching={searchResults.isFetching}\n fetchNext={searchResults.fetchNext}\n nextCursor={searchResults.nextCursor}\n fetchOnScroll\n />\n )}\n </section>\n }\n </div>\n );\n}","import { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { SharedSearchRequests } from 'libs/shared/apps/search/flight-requests/SharedSearchRequests';\nimport { SearchIndices } from 'libs/shared/apps/search/interfaces';\n\nexport interface UseGetTagsAndClassificationsOptions {\n queryParams: HashObject;\n appliedIndices: SearchIndices[];\n backendFilters: HashObject;\n}\n\nexport function useGetTagsAndClassifications(options: UseGetTagsAndClassificationsOptions) {\n return Flight.useBasicFetch<string[]>(options && SharedSearchRequests.tagsAndClassifications(\n options.queryParams.query,\n options.appliedIndices,\n options.backendFilters\n ));\n}\n","import React from 'react';\n\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { ViewModelKeys } from 'shared/constants/LiteViewModels';\n\nexport function useSearchMask(hasCompleted: boolean): void {\n const [ showMask, setShowMask ] = useViewModel(ViewModelKeys.SHOW_SEARCH_MASK, true);\n\n React.useEffect(() => {\n showMask && hasCompleted && setShowMask(false);\n }, [hasCompleted]);\n}\n","import { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { Rating } from 'libs/shared/interfaces';\n\nexport const RatingRequests = {\n ratings(countryCode?: string): Flight.PublicRequest {\n return {\n url: '/api/domain/v2/me/ratings',\n publicUrl: UrlHelper.urlBuilder('/api/domain/v2/me/ratings', { countryCode }),\n key: 'ratings',\n // v2/me/ratings doesn't support `query={orderby:value}`. Adding this due to time constraints\n formatData: (ratings: Rating[]) => {\n return ratings.sort((a, b) => a.value - b.value);\n }\n };\n }\n};","import { Flight } from 'libs/common/react/index';\n\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\nimport { usePresentation } from 'shared/hooks/usePresentation';\n\nexport const usePresentationAudiences = () => {\n const { activePresentation, getFallbackPresentation } = usePresentation({ redirectOnError: true });\n\n const presentation = activePresentation || getFallbackPresentation();\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n !!presentation &&\n AudienceRequests.presentationAudiences(presentation.id)\n );\n\n return audiences;\n};","import React from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { CurrentUser, Video, VideoCollection } from 'libs/shared/interfaces';\n\ninterface VideoMixinOptions {\n /**\n * If the videos that are having new data mixed into are sitting on an explicit Flight namespace,\n * providing that namespace here is required\n */\n flightNamespace?: string;\n}\n\nexport function useVideoMixin(videos: VideoCollection | Video[], options: VideoMixinOptions = {}): void {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const hydratedVideos = React.useRef<Set<string>>(new Set<string>());\n\n const videoIds = videos && (Array.isArray(videos)\n ? videos.filter(Boolean).map(v => v.id)\n : videos.data.filter(Boolean).map(v => v.id));\n\n const [ request, setRequest ] = React.useState<Flight.Request[]>([]);\n\n React.useEffect(() => {\n if (!videoIds?.length || !currentUser.data?.isAuthenticated)\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 ...r,\n ClassificationRequests.hasCurriculumLinks(unhydratedVideos, null, options.flightNamespace),\n VideoRequests.videoMixinAssocs(unhydratedVideos, options.flightNamespace)\n ]);\n }, [ videoIds?.length, currentUser.data?.isAuthenticated ]);\n\n Flight.useBasicFetchAll(request);\n}","\"use client\";\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { useBootstrapPrefix, useBootstrapBreakpoints, useBootstrapMinBreakpoint } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst Row = /*#__PURE__*/React.forwardRef(({\n bsPrefix,\n className,\n // Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n as: Component = 'div',\n ...props\n}, ref) => {\n const decoratedBsPrefix = useBootstrapPrefix(bsPrefix, 'row');\n const breakpoints = useBootstrapBreakpoints();\n const minBreakpoint = useBootstrapMinBreakpoint();\n const sizePrefix = `${decoratedBsPrefix}-cols`;\n const classes = [];\n breakpoints.forEach(brkPoint => {\n const propValue = props[brkPoint];\n delete props[brkPoint];\n let cols;\n if (propValue != null && typeof propValue === 'object') {\n ({\n cols\n } = propValue);\n } else {\n cols = propValue;\n }\n const infix = brkPoint !== minBreakpoint ? `-${brkPoint}` : '';\n if (cols != null) classes.push(`${sizePrefix}${infix}-${cols}`);\n });\n return /*#__PURE__*/_jsx(Component, {\n ref: ref,\n ...props,\n className: classNames(className, decoratedBsPrefix, ...classes)\n });\n});\nRow.displayName = 'Row';\nexport default Row;"],"names":["InfiniteScrollFooter","props","ref","inView","fetchOnScroll","isFetching","fetchNext","nextCursor","className","Spinner","as","animation","role","SvgContainer","svgName","size","S","onClick","defaultProps","WidgetButtonDirection","WidgetButton","isLeft","direction","Left","arrowSvg","hide","style","state","contents","paddingBottom","viewableItems","height","useGradientBackdrop","leftGradientClassName","rightGradientClassName","hideExtendedClickableArea","leftButtonClassName","rightButtonClassName","hoverText","SCROLL_TOLERANCE","useInfiniteList","getRequest","onError","getItems","getCursor","scrollContainer","options","handleScroll","useState","pagesFetched","setPagesFetched","fetchNextFn","response","cursor","request","key","fetchNextPage","currentVal","hasMore","getBoundingClientRect","scrollTop","scrollHeight","window","innerHeight","document","documentElement","useEffect","onScroll","FunctionHelper","addEventListener","removeEventListener","shouldInitialFetch","statusCode","httpStatusClass","toString","substr","HttpStatus","items","totalItems","hasFirstPageCompleted","CompanyWidgetItem","analyticsData","id","data","name","analyticsOptions","location","actionType","entity","descriptor","CoverPill","coverUrl","logo","url","CompanyResult","Col","sm","md","useLargeStyle","lg","item","getChildAppLink","appLinks","getCompanyAppLink","getChildAppLinkOptions","getCompanyAppLinkOptions","itemIndex","search","query","queryParams","score","_score","maxScore","_maxScore","featured","_featured","pagePositionIndex","isLarge","namespace","ExchangeVideoGroup","limit","showCount","currentAppLink","currentParams","params","currentSource","source","Array","isArray","searchAppLink","AppLink","appLink","Text","phrase","searchSettings","videos","slice","map","v","i","VideoItem","video","yearGroups","getVideoAppLink","getSubTextAppLink","presentationAudiences","audiences","setFavourite","canFavourite","companyLogoFallbackUrl","subTextType","hasPermissions","FeaturedVideoResult","HeroVideo","opts","subTextAppLink","hideInteractiveBadge","showVideoGuidance","VideoHelper","PlaylistWithVideos","breakpoints","maxVideos","useBreakpoints","xl","xxl","playlist","playlistAnalyticsOption","playlistAnalyticsData","Row","xs","playlistAppLink","bgColourClassNames","itemStyle","imageCdnUrl","currentUser","showOwner","videoAnalyticsData","videoId","videoName","LargePlaylistResult","getPlaylistAppLink","preloadImage","SeriesWithVideos","series","seriesAnalyticsOption","seriesAnalyticsData","seriesAppLink","SeriesTallPoster","imageClass","LargeSeriesResult","getSeriesAppLink","CollectionVideoList","analyticsProps","hasSeasonEpisode","episodeNumber","season","collectionId","CollectionThumbnail","isSmall","VideoListHelper","hasVideos","collection","length","firstVideoWithThumbnail","find","thumbnail","isSeries","collectionType","BaseImage","imageType","Mask","type","maskType","ImageFallback","imageFallbackType","isPlugin","Actions","actions","getCollectionActions","showActions","actionsDropdownClassName","hideBadges","BadgeListContainer","Badge","rating","metadata","year","SmallPlaylistResult","SmallSeriesResult","SubjectResult","getClassificationAppLink","getClassificationAppLinkOptions","availablePresentations","VideoResult","Component","ClipItem","InteractiveItem","getPreviewQuestionsAppLink","MixedSearchResults","useSmallComponent","results","topics","totalResults","companies","companiesAndTopics","childProps","c","toLowerCase","result","index","isExchangeVideoGroup","tallPoster","SearchSubstitute","substitute","getAppLink","appLinkOptions","replace","SearchSuggestions","suggestions","suggestion","formatSearchResponse","filter","_index","clips","interactives","resultMaxScore","SharedSearchHelper","SharedSearchRequests","searchV4","indicesArr","filters","Object","keys","filterName","join","FilterConstants","excludeLibraryExclusive","isLearner","genericFilters","searchType","indices","entries","reduce","prev","value","allowSubstitute","undefined","publicUrl","HttpVerbs","formatData","success","error","assign","UrlHelper","tagsAndClassifications","normalize","TEACHER_FILTERS","STUDENT_FILTERS","useFetchSearchData","UserRequests","userDetails","config","ConfigRequests","isAuthenticated","CustomerRequests","customerId","products","settings","useSettings","streamableLibrary","LibraryRequests","streamableLibraryId","objectId","showExchangeSearchResults","hasProduct","ProductId","librariesRequest","libraries","exchangeLibraryIndex","findIndex","l","MasterObjectTypes","exchangeLibraryId","streamableIndex","hasLibrariesCompleted","hasCompleted","useGetLibraries","usePresentation","activePresentation","getFallbackPresentation","hasPresentationsLoaded","currentPresentation","currentPresentationId","curriculums","useCurriculums","usePresentationAudiences","schoolLevels","presentation","usePermissions","PermissionName","presentationIds","o","SearchRequests","useFetchSchoolLevels","schoolLevelIds","availableTopics","ClassificationRequests","ratings","RatingRequests","countryCode","TopicsHelper","learningLevel","PresentationLearningLevel","code","useGetRatings","hasLocalPermissions","canViewCurriculums","canUseSeriesActions","presentationId","isStudent","rawFilters","FilterHelper","ObjectHelper","ClassificationType","ClassificationStatus","moviesAndTv","CurationTag","presentationMap","acc","hasFilteredOutTopics","includes","shouldFetch","sortedResults","sort","a","b","presentationA","presentationB","useSearchTopics","hasMoviesAndTv","availablePresentationIds","p","hasFilteredOutCompanies","useSearchCompanies","hasNewMoviesAndTv","moviesAndTvDashboard","targetType","dashboard","hasDataLoaded","isLoadingProducts","isLoadingSettings","useGetSearchResults","appliedIndices","backendFilters","alerts","fetch","searchResultsResponse","getSearchRequest","hasExchangeLibraryFilter","libraryId","some","hasLibraryFilter","fetchMixedExchangeResults","mixedExchangeSearchResults","excludeLibraryFilter","searchResults","pageNumber","httpStatus","LanguageService","r","useVideoMixin","groupingType","exchangeIndex","exchangeShowCount","mixedExchangeResults","exchangeResults","consecutive","forEach","typeId","MasterType","push","exchangeVideoGroup","splice","useGroupExchangeResults","substituteQuery","SearchResultsEmptyState","imageUrl","scotland","trim","ImageUrls","EmptyState","src","application","action","getPhrase","SearchResultsView","videoActions","useVideoActions","useLiteFavourites","u","usePluginHelper","searchData","searchFilters","hasIndices","inaccessibleIndices","useSetPageMetadata","PageMetadataHelper","title","phraseContext","phraseHandler","titlePhrase","descriptionPhrase","allowIndexing","showMask","setShowMask","hasLoaded","hasSearchCompleted","hasResults","SearchFilters","mainFilters","moreFilters","isFetchingOptions","VideoActionsContext","description","redirectOnError","hydratedVideos","Set","videoIds","Boolean","setRequest","unhydratedVideos","current","has","add","flightNamespace","bsPrefix","decoratedBsPrefix","minBreakpoint","sizePrefix","classes","brkPoint","propValue","cols","infix","displayName"],"sourceRoot":""}
|