@clickview/streamable-learning 0.48.0-rc.0 → 0.48.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.vite/manifest.json +646 -646
- package/dist/bundles.json +1 -1
- package/dist/css/DU3tPCD_.chunk.css +12 -0
- package/dist/en.json +1 -1
- package/dist/scripts/{m9QbGES0.chunk.js → ACTQklJQ.chunk.js} +2 -2
- package/dist/scripts/{m9QbGES0.chunk.js.map → ACTQklJQ.chunk.js.map} +1 -1
- package/dist/scripts/{B7if0Lk52.chunk.js → B-qOny0I2.chunk.js} +2 -2
- package/dist/scripts/{B7if0Lk52.chunk.js.map → B-qOny0I2.chunk.js.map} +1 -1
- package/dist/scripts/{BSjm_rCE.chunk.js → B5jBIPaP.chunk.js} +2 -2
- package/dist/scripts/{BSjm_rCE.chunk.js.map → B5jBIPaP.chunk.js.map} +1 -1
- package/dist/scripts/{CPkKuTSK2.chunk.js → B703cBe72.chunk.js} +2 -2
- package/dist/scripts/{CPkKuTSK2.chunk.js.map → B703cBe72.chunk.js.map} +1 -1
- package/dist/scripts/{DNNNPLMp.chunk.js → B7iwtSij.chunk.js} +2 -2
- package/dist/scripts/{DNNNPLMp.chunk.js.map → B7iwtSij.chunk.js.map} +1 -1
- package/dist/scripts/{CXNve4Wq2.chunk.js → BCBfXCYM2.chunk.js} +2 -2
- package/dist/scripts/{CXNve4Wq2.chunk.js.map → BCBfXCYM2.chunk.js.map} +1 -1
- package/dist/scripts/{CoYNU7We2.chunk.js → BKnxYKDu2.chunk.js} +2 -2
- package/dist/scripts/{CoYNU7We2.chunk.js.map → BKnxYKDu2.chunk.js.map} +1 -1
- package/dist/scripts/{BoxedFO8.chunk.js → BLrjbrp8.chunk.js} +2 -2
- package/dist/scripts/{BoxedFO8.chunk.js.map → BLrjbrp8.chunk.js.map} +1 -1
- package/dist/scripts/{CibcLNJP2.chunk.js → BTYwcYPL2.chunk.js} +2 -2
- package/dist/scripts/{CibcLNJP2.chunk.js.map → BTYwcYPL2.chunk.js.map} +1 -1
- package/dist/scripts/{CwI-7tep2.chunk.js → BXJetawx2.chunk.js} +2 -2
- package/dist/scripts/{CwI-7tep2.chunk.js.map → BXJetawx2.chunk.js.map} +1 -1
- package/dist/scripts/{BV74ZRR22.chunk.js → BZOcEcTA2.chunk.js} +2 -2
- package/dist/scripts/{BV74ZRR22.chunk.js.map → BZOcEcTA2.chunk.js.map} +1 -1
- package/dist/scripts/{DxsW8K0n2.chunk.js → BaMNOAYj2.chunk.js} +2 -2
- package/dist/scripts/{DxsW8K0n2.chunk.js.map → BaMNOAYj2.chunk.js.map} +1 -1
- package/dist/scripts/{DrDQfaFN2.chunk.js → BihZ4r0z2.chunk.js} +3 -3
- package/dist/scripts/{DrDQfaFN2.chunk.js.map → BihZ4r0z2.chunk.js.map} +1 -1
- package/dist/scripts/{CK6c6uHp2.chunk.js → BpgHKWR52.chunk.js} +2 -2
- package/dist/scripts/{CK6c6uHp2.chunk.js.map → BpgHKWR52.chunk.js.map} +1 -1
- package/dist/scripts/{JtFbyaXc.chunk.js → Br0Uc4GG.chunk.js} +2 -2
- package/dist/scripts/{JtFbyaXc.chunk.js.map → Br0Uc4GG.chunk.js.map} +1 -1
- package/dist/scripts/{Dd8r1SE32.chunk.js → BsAo7Lri2.chunk.js} +2 -2
- package/dist/scripts/{Dd8r1SE32.chunk.js.map → BsAo7Lri2.chunk.js.map} +1 -1
- package/dist/scripts/{BMjES83N2.chunk.js → BvJXPFoz2.chunk.js} +2 -2
- package/dist/scripts/{BMjES83N2.chunk.js.map → BvJXPFoz2.chunk.js.map} +1 -1
- package/dist/scripts/{CpFOQcL7.chunk.js → BxypZGPK.chunk.js} +2 -2
- package/dist/scripts/{CpFOQcL7.chunk.js.map → BxypZGPK.chunk.js.map} +1 -1
- package/dist/scripts/C4MLxDS-.chunk.js +1 -0
- package/dist/scripts/{DLp7yHzT2.chunk.js → C5i1HsPp2.chunk.js} +2 -2
- package/dist/scripts/{DLp7yHzT2.chunk.js.map → C5i1HsPp2.chunk.js.map} +1 -1
- package/dist/scripts/{Bkv1Tbyu.chunk.js → CCoZQmgX.chunk.js} +2 -2
- package/dist/scripts/{Bkv1Tbyu.chunk.js.map → CCoZQmgX.chunk.js.map} +1 -1
- package/dist/scripts/{Clh6wBrg.chunk.js → CGxa1Jzq.chunk.js} +2 -2
- package/dist/scripts/{Clh6wBrg.chunk.js.map → CGxa1Jzq.chunk.js.map} +1 -1
- package/dist/scripts/{DAvXFgC62.chunk.js → CKdklY2o2.chunk.js} +2 -2
- package/dist/scripts/{DAvXFgC62.chunk.js.map → CKdklY2o2.chunk.js.map} +1 -1
- package/dist/scripts/{CeWjJPIz.chunk.js → CN8PeBwg.chunk.js} +2 -2
- package/dist/scripts/{CeWjJPIz.chunk.js.map → CN8PeBwg.chunk.js.map} +1 -1
- package/dist/scripts/{B1jitqYS2.chunk.js → CNJrD44-2.chunk.js} +2 -2
- package/dist/scripts/{B1jitqYS2.chunk.js.map → CNJrD44-2.chunk.js.map} +1 -1
- package/dist/scripts/{DIHDe4Sg.chunk.js → CNmmq34f.chunk.js} +2 -2
- package/dist/scripts/{DIHDe4Sg.chunk.js.map → CNmmq34f.chunk.js.map} +1 -1
- package/dist/scripts/{CikSQKH-.chunk.js → CUUUI6pl.chunk.js} +2 -2
- package/dist/scripts/{CikSQKH-.chunk.js.map → CUUUI6pl.chunk.js.map} +1 -1
- package/dist/scripts/{DNO0KpY72.chunk.js → CWFInhB82.chunk.js} +2 -2
- package/dist/scripts/{DNO0KpY72.chunk.js.map → CWFInhB82.chunk.js.map} +1 -1
- package/dist/scripts/{i2-k6ULv2.chunk.js → CbLL7dIz2.chunk.js} +2 -2
- package/dist/scripts/{i2-k6ULv2.chunk.js.map → CbLL7dIz2.chunk.js.map} +1 -1
- package/dist/scripts/{KCdpQ8qv2.chunk.js → Ce1TZZdV2.chunk.js} +2 -2
- package/dist/scripts/{KCdpQ8qv2.chunk.js.map → Ce1TZZdV2.chunk.js.map} +1 -1
- package/dist/scripts/{NV4_mMU8.chunk.js → Ces-KTwe.chunk.js} +2 -2
- package/dist/scripts/{NV4_mMU8.chunk.js.map → Ces-KTwe.chunk.js.map} +1 -1
- package/dist/scripts/{0xQRFMBY.chunk.js → CkYqp83j.chunk.js} +2 -2
- package/dist/scripts/{0xQRFMBY.chunk.js.map → CkYqp83j.chunk.js.map} +1 -1
- package/dist/scripts/{DvL3J2BU.chunk.js → CrCAJmt6.chunk.js} +2 -2
- package/dist/scripts/{DvL3J2BU.chunk.js.map → CrCAJmt6.chunk.js.map} +1 -1
- package/dist/scripts/{CcDgbmw52.chunk.js → CsC3VVvE2.chunk.js} +2 -2
- package/dist/scripts/{CcDgbmw52.chunk.js.map → CsC3VVvE2.chunk.js.map} +1 -1
- package/dist/scripts/{C9UjF0q6.chunk.js → D0SYGnyF.chunk.js} +2 -2
- package/dist/scripts/{C9UjF0q6.chunk.js.map → D0SYGnyF.chunk.js.map} +1 -1
- package/dist/scripts/{BqO6i89w2.chunk.js → D7tastET2.chunk.js} +2 -2
- package/dist/scripts/{BqO6i89w2.chunk.js.map → D7tastET2.chunk.js.map} +1 -1
- package/dist/scripts/{CeI-LCE-.chunk.js → DIavEegC.chunk.js} +2 -2
- package/dist/scripts/{CeI-LCE-.chunk.js.map → DIavEegC.chunk.js.map} +1 -1
- package/dist/scripts/{BKbKu9Rp.chunk.js → DK3xia1t.chunk.js} +2 -2
- package/dist/scripts/{BKbKu9Rp.chunk.js.map → DK3xia1t.chunk.js.map} +1 -1
- package/dist/scripts/{BCdnm1Nn.chunk.js → DKnZ8BaN.chunk.js} +2 -2
- package/dist/scripts/{BCdnm1Nn.chunk.js.map → DKnZ8BaN.chunk.js.map} +1 -1
- package/dist/scripts/{awemA_vU2.chunk.js → DO8_mR5i2.chunk.js} +2 -2
- package/dist/scripts/{awemA_vU2.chunk.js.map → DO8_mR5i2.chunk.js.map} +1 -1
- package/dist/scripts/{DlQrdOls.chunk.js → DR80oZtZ.chunk.js} +2 -2
- package/dist/scripts/{DlQrdOls.chunk.js.map → DR80oZtZ.chunk.js.map} +1 -1
- package/dist/scripts/{DMq5Gp-U2.chunk.js → DU1SE31v2.chunk.js} +2 -2
- package/dist/scripts/{DMq5Gp-U2.chunk.js.map → DU1SE31v2.chunk.js.map} +1 -1
- package/dist/scripts/{XnBhLH-02.chunk.js → Dj4AeYQQ2.chunk.js} +2 -2
- package/dist/scripts/{XnBhLH-02.chunk.js.map → Dj4AeYQQ2.chunk.js.map} +1 -1
- package/dist/scripts/{CmrPRojb.chunk.js → DnSy_Myx.chunk.js} +2 -2
- package/dist/scripts/{CmrPRojb.chunk.js.map → DnSy_Myx.chunk.js.map} +1 -1
- package/dist/scripts/{D0vsmyva.chunk.js → Dr1flAez.chunk.js} +2 -2
- package/dist/scripts/{D0vsmyva.chunk.js.map → Dr1flAez.chunk.js.map} +1 -1
- package/dist/scripts/{BXT8nHry2.chunk.js → DwzBzBlI2.chunk.js} +2 -2
- package/dist/scripts/{BXT8nHry2.chunk.js.map → DwzBzBlI2.chunk.js.map} +1 -1
- package/dist/scripts/{CvqqZmNo2.chunk.js → DyT1OGvP2.chunk.js} +2 -2
- package/dist/scripts/{CvqqZmNo2.chunk.js.map → DyT1OGvP2.chunk.js.map} +1 -1
- package/dist/scripts/{E9tNds1l.chunk.js → Llxar-VU.chunk.js} +2 -2
- package/dist/scripts/{E9tNds1l.chunk.js.map → Llxar-VU.chunk.js.map} +1 -1
- package/dist/scripts/{app-B1XBsz23.js → app-BIigh9wv.js} +4 -4
- package/dist/scripts/{app-B1XBsz23.js.map → app-BIigh9wv.js.map} +1 -1
- package/dist/scripts/{BMl02f_62.chunk.js → bycmewy72.chunk.js} +2 -2
- package/dist/scripts/{BMl02f_62.chunk.js.map → bycmewy72.chunk.js.map} +1 -1
- package/dist/scripts/{DmfbtOlu.chunk.js → jWpq99N3.chunk.js} +2 -2
- package/dist/scripts/{DmfbtOlu.chunk.js.map → jWpq99N3.chunk.js.map} +1 -1
- package/dist/scripts/{BDliRFoa.chunk.js → oTYyWWB-.chunk.js} +2 -2
- package/dist/scripts/{BDliRFoa.chunk.js.map → oTYyWWB-.chunk.js.map} +1 -1
- package/dist/scripts/{lokG7Sha2.chunk.js → qcrBN1zR2.chunk.js} +2 -2
- package/dist/scripts/{lokG7Sha2.chunk.js.map → qcrBN1zR2.chunk.js.map} +1 -1
- package/dist/scripts/{UAcFqQzZ.chunk.js → smdLElLq.chunk.js} +2 -2
- package/dist/scripts/{UAcFqQzZ.chunk.js.map → smdLElLq.chunk.js.map} +1 -1
- package/dist/scripts/{D8_5yfHY2.chunk.js → tYi-sUb22.chunk.js} +2 -2
- package/dist/scripts/{D8_5yfHY2.chunk.js.map → tYi-sUb22.chunk.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/D5Jnyjf8.chunk.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CXNve4Wq2.chunk.js","names":[],"sources":["../../../../libs/shared/src/components/widgets/items/subject-widget-item/CompanyWidgetItem.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/CompanyResult.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/mixed-search-results.module.scss","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/exchange-video-group/ExchangeVideoGroup.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/FeaturedVideoResult.tsx","../../../../libs/shared/src/apps/search/components/playlist-with-videos/playlist-with-videos.module.scss","../../../../libs/shared/src/apps/search/components/playlist-with-videos/PlaylistWithVideos.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/LargePlaylistResults.tsx","../../../../libs/shared/src/apps/search/components/series-with-videos/series-with-videos.module.scss","../../../../libs/shared/src/apps/search/components/series-with-videos/SeriesWithVideos.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/LargeSeriesResult.tsx","../../../../libs/shared/src/apps/search/components/collection-video-list/CollectionVideoList.tsx","../../../../libs/shared/src/apps/search/components/collection-thumbnail/collection-thumbnail.module.scss","../../../../libs/shared/src/apps/search/components/collection-thumbnail/CollectionThumbnail.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/SmallPlaylistResult.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/SmallSeriesResults.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/SubjectResult.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/VideoResult.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/MixedSearchResults.tsx","../../../../libs/shared/src/apps/search/components/search-substitute/SearchSubstitute.tsx","../../../../libs/shared/src/apps/search/components/search-suggestions/SearchSuggestions.tsx","../../src/apps/search/flight-requests/SearchRequests.ts","../../src/apps/search/hooks/useFetchSchoolLevels.ts","../../../../libs/shared/src/apps/search/constants/SearchOGQL.ts","../../../../libs/shared/src/apps/search/flight-requests/SharedSearchRequests.ts","../../src/apps/search/hooks/useSearchCompanies.ts","../../src/apps/search/hooks/useSearchTopics.ts","../../src/apps/search/hooks/useFetchSearchData.tsx","../../src/apps/search/hooks/useGetSearchResults.tsx","../../src/apps/search/hooks/useGetTagsAndClassifications.tsx","../../src/apps/search/hooks/useSearchMask.tsx","../../src/apps/search/views/search-results/empty-state/SearchResultsEmptyState.tsx","../../src/apps/search/views/search-results/SearchResultsView.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { CoverPillWidgetContentWrapper, CoverPillWidgetItemProps } from 'libs/shared/components/widgets/items/subject-widget-item/CoverPill';\nimport { Company } from 'libs/shared/interfaces';\n\nexport function CompanyWidgetItem(props: CoverPillWidgetItemProps<Company>): JSX.Element {\n const analyticsData = {\n ...props.analyticsData,\n id: props.data?.id,\n name: props.data?.name\n };\n\n const analyticsOptions = {\n location: LocationContext.ClassificationListItem,\n ...props.analyticsOptions,\n actionType: UserAction.Click,\n entity: EntityType.Company,\n descriptor: ClickDescriptor.Cover\n };\n\n return (\n <CoverPillWidgetContentWrapper\n {...props}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n coverUrl={props.data.logo?.url}\n coverBgColor={props.data.metadata?.colour}\n />\n );\n}\n","import React from 'react';\nimport { Col } from 'react-bootstrap';\n\nimport { CompanyWidgetItem } from 'libs/shared/components/widgets/items/subject-widget-item/CompanyWidgetItem';\nimport { Company } from 'libs/shared/interfaces';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function CompanyResult(props: MixedSearchResultItemProps<Company>): JSX.Element {\n return (\n <Col as='li' sm={6} md={props.useLargeStyle ? 6 : 4} lg={props.useLargeStyle ? 4 : 3}>\n <div className='position-relative px-1 mb-2'>\n <CompanyWidgetItem\n data={props.item}\n getChildAppLink={props.appLinks.getCompanyAppLink}\n getChildAppLinkOptions={() => props.appLinks.getCompanyAppLinkOptions?.(props.item)}\n analyticsData={{\n itemIndex: props.itemIndex,\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: 0\n }}\n isLarge={props.useLargeStyle}\n />\n </div>\n </Col>\n );\n}\n","@import '~styles/utils/include-media';\n:local {\n .videoList {\n margin: 0 -#{map-get($spacers, 2)};\n \n @include media('<=md') {\n margin: 0;\n }\n }\n}","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 { type ExchangeVideoGroup as ExchangeVideoGroupData } 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.module.scss';\n\nconst namespace = 'search.exchangeVideoGroup';\n\nconst EXCHANGE_RESULT_DISPLAY_LIMIT = 3;\n\nexport function ExchangeVideoGroup(props: MixedSearchResultItemProps<ExchangeVideoGroupData>): JSX.Element {\n const limit = props.item.showCount >= EXCHANGE_RESULT_DISPLAY_LIMIT ?\n EXCHANGE_RESULT_DISPLAY_LIMIT :\n props.item.showCount;\n\n function getContainerClassName(): string {\n if (props.pagePositionIndex === 0)\n return 'border-bottom pb-1 mb-3';\n\n return 'border-top border-bottom pt-3 mt-2 pb-1 mb-3';\n }\n\n const currentAppLink = Core.AppLinkHelper.getCurrentAppLink();\n const currentParams = (currentAppLink.params as HashObject) ?? {};\n let currentSource = currentParams?.source ?? [];\n\n if (currentSource && !Array.isArray(currentSource))\n currentSource = [currentSource];\n\n const searchAppLink = {\n ...currentAppLink,\n params: {\n ...currentParams,\n source: [ ...(currentSource), SourceFilterOptions.ExchangeArchive ]\n }\n };\n\n const analyticsData = {\n query: props.queryParams.query,\n itemIndex: props.itemIndex,\n pagePositionIndex: props.pagePositionIndex\n };\n const analyticsOptions = {\n entity: EntityType.SearchResults,\n location: LocationContext.ExchangeSearchGroupItem,\n actionType: UserAction.Click,\n descriptor: SearchSourceDescriptor.ExchangeArchive\n };\n\n return (\n <div className={getContainerClassName()}>\n <AppLink\n appLink={searchAppLink}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n >\n <h2 className='h4'>\n <Text namespace={namespace} phrase='heading' />\n </h2>\n </AppLink>\n <p>\n <Text namespace={namespace} phrase='message' />\n \n <AppLink\n appLink={props.appLinks.searchSettings}\n className='text-info'\n analyticsData={analyticsData}\n analyticsOptions={{\n ...analyticsOptions,\n descriptor: ClickDescriptor.Settings\n }}\n >\n <Text namespace={namespace} phrase='searchSettings' />\n </AppLink>\n .\n </p>\n\n <div className={`position-relative ${styles.videoList}`}>\n {props.item.videos.slice(0, limit).map((v, i) => {\n return (\n <VideoItem\n key={i}\n video={v}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n presentationAudiences={props.audiences}\n analyticsData= {{\n search: {\n query: props.queryParams.query,\n score: v._score,\n maxScore: v._maxScore,\n featured: v._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n />\n );\n })}\n </div>\n <div className='text-center py-2'>\n <AppLink\n className='text-secondary'\n appLink={searchAppLink}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n >\n <Text namespace={namespace} phrase='seeMore' />\n </AppLink>\n </div>\n </div>\n );\n}\n","import React from 'react';\n\nimport { HeroVideo } from 'libs/shared/apps/subjects/components/hero-video/HeroVideo';\nimport { Video } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function FeaturedVideoResult(props: MixedSearchResultItemProps<Video>): JSX.Element {\n return (\n <div className='pb-3'>\n <HeroVideo\n video={props.item}\n presentationAudiences={props.audiences}\n getVideoAppLink={(v, opts) => props.appLinks.getVideoAppLink(v, opts)}\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n hideInteractiveBadge\n showVideoGuidance={VideoHelper.showVideoGuidance(props.hasPermissions)}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n}\n","@import '~styles/utils/include-media';\n:local {\n .videoList {\n width: 63%;\n\n @include media('<=xl') {\n width: 75%;\n }\n\n @include media('<=lg') {\n width: 88%;\n }\n }\n}","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { PlaylistItem } from 'libs/shared/apps/playlists/components/playlist-list';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoItem } from 'libs/shared/components/video-list/video-item/VideoItem';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { CurrentUser, Playlist, PresentationAudience, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\n\nimport styles from './playlist-with-videos.module.scss';\n\nconst namespace = 'search.playlistWithVideos';\n\nfunction useGetMaxVideos(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xl || breakpoints.xxl)\n return 3;\n \n return 2;\n}\n\ninterface PlaylistWithVideoProps {\n playlist: Playlist;\n playlistAppLink: Core.AppLink;\n presentationAudiences: PresentationAudience[];\n preloadImage: boolean;\n analyticsData: HashObject;\n currentUser: CurrentUser;\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n hasPermissions: HasPermissionsFunc;\n commonVideoProps: CommonVideoProps;\n}\n\nexport function PlaylistWithVideos(props: PlaylistWithVideoProps): JSX.Element {\n const maxVideos = useGetMaxVideos();\n\n const videos = props.playlist.videos.data.slice(0, maxVideos);\n\n const playlistAnalyticsOption: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Playlist,\n location: LocationContext.PlaylistWithVideos\n };\n\n const playlistAnalyticsData: HashObject = {\n ...props.analyticsData,\n id: props.playlist.id,\n name: props.playlist.name\n };\n\n return (\n <div className='ps-2 py-2'>\n <Row className='g-0 border rounded-3'>\n <Col xs={4} lg={3} className='pe-3'>\n <PlaylistItem\n appLink={props.playlistAppLink}\n analyticsData={props.analyticsData}\n analyticsOptions={{\n ...playlistAnalyticsOption,\n descriptor: ClickDescriptor.Cover\n }}\n data={props.playlist}\n presentationAudiences={props.presentationAudiences}\n bgColourClassNames={BG_COLOUR_CLASS_NAMES}\n itemStyle='round-left'\n imageCdnUrl={props.commonVideoProps.imageCdnUrl}\n currentUser={props.currentUser}\n showCount={false}\n showOwner\n />\n </Col>\n <Col xs={8} lg={9}>\n <div className='d-flex justify-content-between'>\n <div className={`pt-3 mb-n2 ${styles.videoList}`}>\n {videos?.map(video => {\n const videoAnalyticsData: HashObject = {\n ...playlistAnalyticsData,\n videoId: video.id,\n videoName: video.name\n };\n\n return (\n <div key={video.id} className='mb-2'>\n <VideoItem\n video={video}\n getVideoAppLink={props.getVideoAppLink}\n analyticsData={videoAnalyticsData}\n analyticsOptions={{\n entity: EntityType.Video,\n location: LocationContext.PlaylistWithVideos\n }}\n size='sm'\n hasPermissions={props.hasPermissions}\n hideVideoGuidance\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n })}\n </div>\n <div className='text-end pt-3 pe-3'>\n <AppLink\n className='info-link fw-semibold'\n appLink={props.playlistAppLink}\n analyticsData={playlistAnalyticsData}\n analyticsOptions={{\n ...playlistAnalyticsOption,\n descriptor: ClickDescriptor.Link\n }}\n >\n <Text namespace={namespace} phrase='seeAllVideos' />\n </AppLink>\n </div>\n </div>\n </Col>\n </Row>\n </div>\n );\n}\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 playlistAppLink={props.appLinks.getPlaylistAppLink(props.item)}\n presentationAudiences={props.audiences}\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n currentUser={props.currentUser}\n preloadImage\n getVideoAppLink={props.appLinks.getVideoAppLink}\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n}\n","@import '~styles/utils/include-media';\n:local {\n .videoList {\n width: 63%;\n\n @include media('<=xl') {\n width: 75%;\n }\n\n @include media('<=lg') {\n width: 88%;\n }\n }\n}","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SeriesTallPoster } from 'libs/shared/components/series-tall-poster/SeriesTallPoster';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoItem } from 'libs/shared/components/video-list/video-item/VideoItem';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { PresentationAudience, Series, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\n\nimport styles from './series-with-videos.module.scss';\n\nconst namespace = 'search.seriesWithVideos';\n\nfunction useGetMaxVideos(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xl || breakpoints.xxl)\n return 5;\n \n if (breakpoints.lg || breakpoints.md)\n return 4;\n\n return 3;\n}\n\ninterface SeriesWithVideoProps {\n series: Series;\n seriesAppLink: Core.AppLink;\n presentationAudiences: PresentationAudience[];\n preloadImage: boolean;\n analyticsData: HashObject;\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n hasPermissions: HasPermissionsFunc;\n commonVideoProps: CommonVideoProps;\n}\n\nexport function SeriesWithVideos(props: SeriesWithVideoProps): JSX.Element {\n const maxVideos = useGetMaxVideos();\n\n const videos = props.series.videos.data.slice(0, maxVideos);\n\n const seriesAnalyticsOption: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Series,\n location: LocationContext.SeriesWithVideos\n };\n\n const seriesAnalyticsData: HashObject = {\n ...props.analyticsData,\n id: props.series.id,\n name: props.series.name\n };\n\n return (\n <div className='ps-2 py-2'>\n <Row className='g-0 border rounded-3'>\n <Col xs={4} lg={3} className='pe-3'>\n <AppLink\n appLink={props.seriesAppLink}\n className='position-relative'\n analyticsData={seriesAnalyticsData}\n analyticsOptions={{\n ...seriesAnalyticsOption,\n descriptor: ClickDescriptor.TallPoster\n }}\n >\n <SeriesTallPoster\n series={props.series}\n presentationAudiences={props.presentationAudiences}\n preloadImage={props.preloadImage}\n imageClass='rounded-start-lg'\n />\n </AppLink>\n </Col>\n <Col xs={8} lg={9}>\n <div className='d-flex justify-content-between'>\n <div className={`pt-3 mb-n2 ${styles.videoList}`}>\n {videos?.map(video => {\n const videoAnalyticsData: HashObject = {\n ...seriesAnalyticsData,\n videoId: video.id,\n videoName: video.name\n };\n\n // insert parent series into video object\n video = {\n ...video,\n series: props.series\n };\n\n return (\n <div key={video.id} className='mb-2'>\n <VideoItem\n video={video}\n getVideoAppLink={props.getVideoAppLink}\n analyticsData={videoAnalyticsData}\n analyticsOptions={{\n entity: EntityType.Video,\n location: LocationContext.SeriesWithVideos\n }}\n size='sm'\n hasPermissions={props.hasPermissions}\n hideVideoGuidance\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n })}\n </div>\n <div className='text-end pt-3 pe-3'>\n <AppLink\n className='info-link fw-semibold'\n appLink={props.seriesAppLink}\n analyticsData={seriesAnalyticsData}\n analyticsOptions={{\n ...seriesAnalyticsOption,\n descriptor: ClickDescriptor.Link\n }}\n >\n <Text namespace={namespace} phrase='seeAllVideos' />\n </AppLink>\n </div>\n </div>\n </Col>\n </Row>\n </div>\n );\n}\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 presentationAudiences={props.audiences}\n series={props.item}\n seriesAppLink={props.appLinks.getSeriesAppLink(props.item)}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n preloadImage\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n}\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}\n",":local {\n .overlayContainer {\n position: absolute;\n width: 100%;\n height: 100%;\n z-index: 1;\n padding: map-get($spacers, 1);\n color: $white;\n }\n\n .overlay {\n background-color: darken($dark, 30%);\n opacity: .7;\n width: 40%;\n position: absolute;\n right: 0;\n z-index: 1;\n }\n}","import React from 'react';\nimport { Col } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor } from 'libs/analytics/interfaces';\n\nimport { CollectionVideoList } from 'libs/shared/apps/search/components/collection-video-list/CollectionVideoList';\nimport { ActionOptions, Actions as ActionsComponent } from 'libs/shared/components/actions/Actions';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BadgeListContainer } from 'libs/shared/components/badges/BadgeListContainer';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { Mask, MaskType } from 'libs/shared/components/mask/Mask';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoListHelper } from 'libs/shared/components/video-list/VideoListHelper';\nimport { ImageType } from 'libs/shared/enums/Images';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Playlist, Series, Video } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { SeriesHelper } from 'libs/shared/utils/SeriesHelper';\n\nimport styles from './collection-thumbnail.module.scss';\n\nconst namespace = 'search.collectionThumbnail';\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={SeriesHelper.getRating((props.collection as Series))} />\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}\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.module.scss';\n\nexport function SmallPlaylistResult(props: MixedSearchResultItemProps<Playlist>): JSX.Element {\n return (\n <div className={`position-relative ${styles.videoList}`}>\n <CollectionThumbnail\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n analyticsOptions={{\n entity: EntityType.Playlist,\n actionType: UserAction.Click,\n location: LocationContext.PlaylistListItem\n }}\n appLink={props.appLinks.getPlaylistAppLink(props.item)}\n showActions={props.showActions}\n collection={props.item}\n collectionType='playlist'\n maskType={MaskType.Playlist}\n imageFallbackType={ImageFallbackType.PlaylistThumbnail}\n isPlugin={props.commonVideoProps.isPlugin}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getCollectionActions={props.appLinks.getCollectionActions}\n />\n </div>\n );\n}\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.module.scss';\n\nexport function SmallSeriesResult(props: MixedSearchResultItemProps<Series>): JSX.Element {\n return (\n <div className={`position-relative ${styles.videoList}`}>\n <CollectionThumbnail\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n analyticsOptions={{\n entity: EntityType.Series,\n actionType: UserAction.Click,\n location: LocationContext.SeriesListItem\n }}\n appLink={props.appLinks.getSeriesAppLink(props.item)}\n collectionType='series'\n collection={props.item}\n showActions={props.showActions}\n maskType={MaskType.Series}\n imageFallbackType={ImageFallbackType.SeriesThumbnail}\n hideBadges\n isPlugin={props.commonVideoProps.isPlugin}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getCollectionActions={props.appLinks.getCollectionActions}\n />\n </div>\n );\n}\n","import React from 'react';\nimport { Col } from 'react-bootstrap';\n\nimport { SubjectWidgetItem } from 'libs/shared/components/widgets/items/subject-widget-item';\nimport { Classification } from 'libs/shared/interfaces';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function SubjectResult(props: MixedSearchResultItemProps<Classification>): JSX.Element {\n return (\n <Col as='li' sm={6} md={props.useLargeStyle ? 6 : 4} lg={props.useLargeStyle ? 4 : 3}>\n <div className='position-relative px-1 mb-2'>\n <SubjectWidgetItem\n data={props.item}\n getChildAppLink={props.appLinks.getClassificationAppLink}\n getChildAppLinkOptions={\n () => props.appLinks.getClassificationAppLinkOptions?.(props.item)\n }\n availablePresentations={props.availablePresentations}\n analyticsData={{\n itemIndex: props.itemIndex,\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: 0\n }}\n isLarge={props.useLargeStyle}\n highlightOnHover={props.commonVideoProps.showNewVideoIndicator}\n />\n </div>\n </Col>\n );\n}\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.module.scss';\n\nexport function VideoResult(props: MixedSearchResultItemProps<VideoTypes>): JSX.Element {\n function getItemComponent(\n video: VideoTypes\n ): (props: ClipItemProps | InteractiveItemProps | VideoItemProps) => JSX.Element {\n if (VideoHelper.isClip(video))\n return ClipItem;\n \n if (VideoHelper.isInteractive(video))\n return InteractiveItem;\n \n return VideoItem;\n }\n\n const Component = getItemComponent(props.item);\n\n return (\n <div className={`position-relative ${styles.videoList}`}>\n <Component\n video={props.item}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getPreviewQuestionsAppLink={props.appLinks.getPreviewQuestionsAppLink}\n presentationAudiences={props.audiences}\n analyticsData= {{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n}\n","import React from 'react';\nimport { Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { Classification, Company, CurrentUser, InteractiveMetadata, Playlist, Presentation, PresentationAudience, Series, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { SearchResultObjectTypes, SearchResults, SearchResultsObject } from '../../interfaces';\nimport { GetCollectionActions } from '../collection-thumbnail/CollectionThumbnail';\n\nimport { CompanyResult } from './components/CompanyResult';\nimport { ExchangeVideoGroup } from './components/exchange-video-group/ExchangeVideoGroup';\nimport { FeaturedVideoResult } from './components/FeaturedVideoResult';\nimport { LargePlaylistResult } from './components/LargePlaylistResults';\nimport { LargeSeriesResult } from './components/LargeSeriesResult';\nimport { BaseMixedSearchResultItemProps } from './components/MixedSearchResultItemProps';\nimport { SmallPlaylistResult } from './components/SmallPlaylistResult';\nimport { SmallSeriesResult } from './components/SmallSeriesResults';\nimport { SubjectResult } from './components/SubjectResult';\nimport { VideoResult } from './components/VideoResult';\n\nconst namespace = 'shared.mixedSearchResults';\n\nconst TOPIC_DISPLAY_LIMIT = 8;\n\nexport interface MixedSearchResultAppLinks {\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n getSeriesAppLink: (series: Series) => Core.AppLink;\n getCompanyAppLink: (company: Company) => Core.AppLink;\n getCompanyAppLinkOptions?: (company: Company) => Core.AppLinkOptions;\n getClassificationAppLink: (classification: Classification) => Core.AppLink;\n getClassificationAppLinkOptions?: (classification: Classification) => Core.AppLinkOptions;\n getPlaylistAppLink: (playlist: Playlist) => Core.AppLink;\n getPreviewQuestionsAppLink: (interactive: InteractiveMetadata) => Core.AppLink;\n getCollectionActions: GetCollectionActions;\n searchSettings?: Core.AppLink;\n}\n\ninterface MixedSearchResultsProps {\n queryParams: HashObject;\n results: SearchResultObjectTypes[];\n topics?: SearchResults;\n companies?: SearchResults;\n audiences: PresentationAudience[];\n currentUser: CurrentUser;\n availablePresentations: Presentation[];\n showActions: boolean;\n hasPermissions: HasPermissionsFunc;\n appLinks: MixedSearchResultAppLinks;\n commonVideoProps: CommonVideoProps;\n}\n\nexport const MixedSearchResults = React.memo(function(props: MixedSearchResultsProps): JSX.Element {\n const breakpoints = useBreakpoints();\n const useSmallComponent = breakpoints.xs || breakpoints.sm;\n\n if (!props.results?.length && !props.topics?.totalResults && !props.companies?.totalResults)\n return <></>;\n\n const companiesAndTopics = [\n ...props.companies?.results ?? [],\n ...props.topics?.results ?? []\n ];\n\n const childProps: BaseMixedSearchResultItemProps = {\n useLargeStyle: companiesAndTopics.length < 4,\n ...props\n };\n\n return (\n <div className='position-relative'>\n <p role='status' className='visually-hidden'><Text namespace={namespace} phrase='ariaSearch' /></p>\n\n {!!companiesAndTopics.length && (\n <Row as='ul' className='list-unstyled g-0 pb-3 mx-n1'>\n {companiesAndTopics.slice(0, TOPIC_DISPLAY_LIMIT).map((c, itemIndex) => {\n switch (c.type.toLowerCase()) {\n case 'company':\n return (\n <CompanyResult\n key={itemIndex}\n item={c as SearchResultsObject<Company>}\n itemIndex={itemIndex}\n {...childProps}\n />\n );\n case 'subject': {\n return (\n <SubjectResult\n key={itemIndex}\n item={c as SearchResultsObject<Classification>}\n itemIndex={itemIndex}\n {...childProps}\n />\n );\n }\n }\n })}\n </Row>\n )}\n\n {props.results?.map((result, index) => {\n const pagePositionIndex = companiesAndTopics.length ? index + 1 : index;\n\n if ('isExchangeVideoGroup' in result && result.isExchangeVideoGroup) {\n return (\n <ExchangeVideoGroup\n key={index}\n item={result}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n 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});\n","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'search.searchSubstitute';\n\ninterface SearchSubstituteProps {\n substitute: string;\n queryParams: HashObject;\n getAppLink: (query: string, queryParams: HashObject) => Core.AppLink;\n}\n\nexport function SearchSubstitute(props: SearchSubstituteProps): JSX.Element {\n if (!props.substitute)\n return <></>;\n\n return (\n <div className='pb-3'>\n <p className='mb-1 h6'>\n <Text namespace={namespace} phrase='showingFor' /> \n <AppLink\n className='info-link'\n appLink={props.getAppLink(props.substitute, props.queryParams)}\n appLinkOptions={{ replace: true }}\n >\n {props.substitute}\n </AppLink>\n </p>\n <p className='mb-0 h6 fw-normal'>\n <Text namespace={namespace} phrase='searchInsteadFor' />\n <AppLink\n className='info-link'\n appLink={props.getAppLink(props.queryParams.query, { ...props.queryParams, allowSubstitute: 'false' })}\n >\n {props.queryParams.query}\n </AppLink>\n <Text namespace={namespace} phrase='endOriginal' />\n </p>\n </div>\n );\n}\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}\n","import { 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 { SearchIndices, SearchResults } from 'libs/shared/apps/search/interfaces';\n\nexport const SearchRequests = {\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 => filters[filterName]).join(';');\n\n const params = Object.assign({}, {\n index: indices,\n cursor: cursor ?? undefined,\n query,\n ...filters\n });\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/search', params),\n publicUrl: UrlHelper.urlBuilder('/api/search', params),\n key,\n success,\n error\n };\n },\n\n schoolLevels(presentationIds: string[]): Flight.PublicRequest {\n const params = {\n filterType: 'schoolLevels',\n presentationId: presentationIds\n };\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/search/filters', params),\n publicUrl: UrlHelper.urlBuilder('/api/search/filters', params),\n key: 'school-levels'\n };\n }\n};\n","import { Flight } from 'libs/common/flight';\n\nimport { SchoolLevels } from 'libs/shared/interfaces';\n\nimport { SearchRequests } from 'apps/search/flight-requests/SearchRequests';\n\nexport function useFetchSchoolLevels(presentationId: string) {\n return Flight.useBasicFetch<SchoolLevels>(\n presentationId && SearchRequests.schoolLevels([presentationId])\n );\n}\n","import { SharedWithStatements } from 'libs/shared/constants/WithStatements';\nimport { TagType } from 'libs/shared/enums/TagType';\n\n/**\n * OGQL used for search V5 endpoint\n */\nexport const SearchOGQL = {\n video: SharedWithStatements.VIDEO_COLLECTION,\n series: 'rating,tallPoster',\n playlist:\n 'videos[count(),thumbnail]{limit:1},interactives[count(),_thumbnail]{limit:1},' +\n 'clips[count(),_thumbnail]{limit:1}',\n classification: `_theme[banner,cover,tallposter,thumbnail,icon],cover,thumbnail,tags{tagtype:${TagType.Curation}}`,\n clip: SharedWithStatements.CLIP_COLLECTION,\n interactive: SharedWithStatements.INTERACTIVE_COLLECTION,\n company: 'logo',\n category: 'libraries[_logo],thumbnail',\n partner_profile: SharedWithStatements.PARTNER_PROFILE\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 { SearchOGQL } from 'libs/shared/apps/search/constants/SearchOGQL';\nimport { SearchIndices, SearchResultObjectTypes, SearchResults, SearchResultsObject } from 'libs/shared/apps/search/interfaces';\nimport type { WidgetFilter } from 'libs/shared/apps/search/interfaces/WidgetSearchResults';\nimport { SharedSearchHelper } from 'libs/shared/apps/search/utils/SharedSearchHelper';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport type { Playlist, Series } from 'libs/shared/interfaces';\nimport { ThemeAssetHelper } from 'libs/shared/utils/ThemeAssetHelper';\n\nfunction formatSearchResponse(response: SearchResults<SearchResultObjectTypes>) {\n /**\n * Until playlists and series are regionalised, search will always return every series/playlist that exists\n * even if the current user doesn't have access to the content inside (which will happen for example when playlists/series)\n * contain all UK library content but is being searched for by an AU user.\n *\n * For some search queries, this may result in search showing a bunch of \"empty\" playlists/series, which sucks.\n * This will filter all empty collections out and decrement the `totalResults` to avoid this and make search a better\n * experience.\n *\n * Ideally this will be removed one day when this regionalisation is no longer an issue.\n */\n let totalResults = response.totalResults;\n\n const results = response?.results?.filter(result => {\n if (result._index !== 'series' && result._index !== 'playlist')\n return true;\n\n if (result._index === 'playlist') {\n const playlist = result as SearchResultsObject<Playlist>;\n\n if (playlist.clips?.data?.length ||\n playlist.interactives?.data?.length ||\n playlist.videos?.data?.length)\n return true;\n\n totalResults--;\n return false;\n }\n\n if ((result as SearchResultsObject<Series>).videos?.data?.length === 0) {\n totalResults--;\n return false;\n }\n\n return true;\n }) ?? [];\n\n response.results = results;\n response.totalResults = totalResults;\n\n // The first search result will always have the highest score value.\n // We store it so that we can access it for subsequent results pages\n const resultMaxScore = results[0]?._score;\n\n return {\n ...response,\n results: SharedSearchHelper.mapMaxScoreToSearchResults(results, resultMaxScore)\n };\n}\n\nfunction stringifyObject(obj: HashObject): string {\n return Object.entries(obj).reduce((prev, [ , value ]) => {\n let stringifiedValue = value;\n\n if (typeof value === 'object') {\n stringifiedValue = stringifyObject(value);\n } else if ([ 'number', 'boolean', 'string' ].includes(typeof value)) {\n stringifiedValue = value.toString();\n }\n\n if (!prev.length)\n return stringifiedValue;\n\n return `${prev},${stringifiedValue}`;\n }, '');\n}\n\n/**\n * We want to map the filters to the global filters object but we need to remove the filter prefix\n * and exclude the presentation filter\n */\nfunction getGlobalFilters(filters: HashObject, widgetTypeId: WidgetTypeId | null): Record<string, any> {\n return Object.entries(filters)\n .reduce((prev, [ key, value ]) => {\n const actualKey = key.replace(FilterConstants.FILTER_PARAM_PREFIX, '');\n if (actualKey === 'presentation' &&\n widgetTypeId !== WidgetTypeId.SearchTopResults &&\n widgetTypeId !== WidgetTypeId.SearchRelatedResults &&\n widgetTypeId !== WidgetTypeId.SearchSeries\n ) {\n return prev;\n }\n\n return { ...prev, [actualKey]: value };\n }, {});\n}\n\nexport const SharedSearchRequests = {\n searchDashboard(\n query: string,\n filters: HashObject,\n widgets: WidgetFilter[] = []\n ): Flight.PublicRequest {\n const widgetData = widgets.sort((a, b) => a.id.localeCompare(b.id)).map(w => [ w.id, w?.cursor ]);\n const filterData = stringifyObject(filters);\n \n const key = `search:v5:dashboard:${query}:${widgetData}:${filterData}`;\n \n const {\n [`${FilterConstants.FILTER_PARAM_PREFIX}indicesFilters`]: indicesFilter,\n isLearner,\n ...genericFilters\n } = filters;\n\n const data = {\n widgets,\n indices: indicesFilter,\n filters: getGlobalFilters(genericFilters, null),\n query,\n includeAllIndices: false,\n isLearner: !!isLearner\n };\n\n return {\n url: '{gateway}/v5/search/widgets',\n publicUrl: '/api/search/v5/widgets',\n type: HttpVerbs.POST,\n data,\n key\n };\n },\n\n searchDashboardWidget(\n widgetTypeId: WidgetTypeId,\n query: string,\n filters: HashObject,\n widgets: WidgetFilter[] = []\n ): Flight.PublicRequest {\n const widgetData = widgets.sort((a, b) => a.id.localeCompare(b.id)).map(w => [ w.id, w?.cursor ]);\n const filterData = stringifyObject(filters);\n \n const key = `search:v5:dashboard:${widgetTypeId}:widget:${query}:${widgetData}:${filterData}`;\n \n const {\n [`${FilterConstants.FILTER_PARAM_PREFIX}indicesFilters`]: indicesFilter,\n isLearner,\n excludeVideoIds,\n ...genericFilters\n } = filters;\n\n const data = {\n widgets,\n indices: indicesFilter,\n filters: getGlobalFilters(genericFilters, widgetTypeId),\n query,\n includeAllIndices: false,\n isLearner: !!isLearner,\n ogql: SearchOGQL,\n excludeVideoIds\n };\n\n return {\n url: `{gateway}/v5/search/widgets/${widgetTypeId}`,\n publicUrl: `/api/search/v5/widgets/${widgetTypeId}`,\n type: HttpVerbs.POST,\n data,\n key,\n formatData: (data: HashObject) => {\n if (!data)\n return data;\n\n return {\n ...data,\n content: data.content?.data ?\n { ...data.content, data: data.content.data.map(ThemeAssetHelper.applyThemeToClassification) } :\n data.content\n };\n }\n };\n },\n\n searchV5(\n query: string,\n filters: HashObject,\n widgets: WidgetFilter[] = []\n ): Flight.PublicRequest {\n const widgetData = widgets.sort((a, b) => a.id.localeCompare(b.id)).map(w => [ w.id, w?.cursor ]);\n const filterData = stringifyObject(filters);\n \n const key = `search:v5:${query}:${widgetData}:${filterData}`;\n \n const {\n [`${FilterConstants.FILTER_PARAM_PREFIX}indicesFilters`]: indicesFilter,\n isLearner,\n ...genericFilters\n } = filters;\n\n const data = {\n widgets,\n indices: indicesFilter,\n filters: Object.entries(genericFilters)\n .reduce((prev, [ key, value ]) =>\n ({ ...prev, [key.replace('filters.', '')]: value }), {}),\n query,\n includeAllIndices: false,\n isLearner: !!isLearner,\n ogql: SearchOGQL\n };\n\n return {\n url: '{gateway}/v5/search',\n publicUrl: '/api/search/v5',\n type: HttpVerbs.POST,\n data,\n key\n };\n },\n \n searchV4(options: {\n query: string,\n indices: SearchIndices[],\n filters: HashObject,\n sorts?: HashObject,\n allowSubstitute: boolean,\n cursor?: string,\n limit?: number\n }): Flight.PublicRequest {\n const { query, indices, filters = {}, sorts = {}, allowSubstitute = true, cursor, limit } = options;\n\n let key = `search:v4:${query}:${allowSubstitute}:${indices}:${cursor}`;\n\n key += Object.keys(filters).map(filterName => {\n const filter = filters[filterName];\n return Array.isArray(filter) ? filter.join(';') : filter;\n }).join(';');\n\n const {\n [`${FilterConstants.FILTER_PARAM_PREFIX}excludeLibraryExclusive`]: excludeLibraryExclusive,\n isLearner,\n ...genericFilters\n } = filters;\n\n const indexObjects = indices.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: indexObjects,\n filters: Object.entries(genericFilters)\n .reduce((prev, [ key, value ]) =>\n ({ ...prev, [key.replace('filters.', '')]: value }), {}),\n sorts,\n query,\n allowSubstitute,\n cursor: cursor ?? undefined,\n isLearner: !!isLearner,\n limit\n };\n\n return {\n url: '{gateway}/v4/search',\n publicUrl: '/api/search/v4',\n type: HttpVerbs.POST,\n data,\n key,\n formatData: formatSearchResponse\n };\n },\n\n search(options: {\n query: string,\n indices: SearchIndices[],\n filters?: HashObject,\n allowSubstitute?: boolean,\n cursor?: string,\n limit?: number,\n success?: (results: SearchResults) => void,\n error?: (xhr: Xhr) => void\n }): Flight.PublicRequest {\n const { query, indices, filters, allowSubstitute, cursor, limit, success, error } = options;\n\n let key = `search:${query}:${allowSubstitute}:${indices}:${cursor}`;\n\n key += Object.keys(filters).map(filterName => {\n const filter = filters[filterName];\n return Array.isArray(filter) ? filter.join(';') : filter;\n }).join(';');\n\n const params = Object.assign({}, {\n index: indices,\n cursor: cursor ?? undefined,\n query,\n allowSubstitute,\n limit,\n ...filters\n });\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v3/search', params),\n publicUrl: UrlHelper.urlBuilder('/api/search', params),\n key,\n formatData: formatSearchResponse,\n success,\n error\n };\n },\n\n tagsAndClassifications(\n query: string,\n indices: SearchIndices[],\n filters: HashObject = {},\n cursor?: string,\n success?: (results: string[]) => void,\n error?: () => void\n ): Flight.PublicRequest {\n const params = {\n index: indices,\n cursor,\n query,\n ...filters\n };\n\n let key = `filter:options:${query}:${indices.join(':')}:${cursor}`;\n\n key += Object.keys(filters).map(filterName => {\n const filter = filters[filterName];\n return Array.isArray(filter) ? filter.join(';') : filter;\n }).join(';');\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v3/search/tags-and-classifications', params),\n publicUrl: UrlHelper.urlBuilder('/api/search/tags-and-classifications', params),\n key,\n success,\n error,\n normalize: false\n };\n }\n};\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 } from 'libs/shared/interfaces';\n\nimport { SearchHelper } from 'apps/search/utils/SearchHelper';\n\ntype CompanySearchResults = SearchResults<SearchResultsObject<Company>>;\n\nexport function useSearchCompanies(\n queryParams: HashObject,\n presentationId: string\n): Flight.Response<SearchResults> {\n const rawFilters = FilterHelper.buildBackendFilterParams(\n queryParams,\n null,\n [presentationId],\n false,\n []\n );\n \n const filters = rawFilters || {};\n filters[`filters.presentation`] = presentationId;\n\n const request = SharedSearchRequests.search({\n query: SearchHelper.getQuery(queryParams),\n indices: ['company'],\n filters,\n allowSubstitute: queryParams.allowSubstitute !== 'false'\n });\n\n return Flight.useBasicFetch<CompanySearchResults>(request);\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 { Classification } from 'libs/shared/interfaces';\n\nimport { SearchHelper } from 'apps/search/utils/SearchHelper';\n\ntype TopicSearchResults = SearchResults<SearchResultsObject<Classification>>;\n\nexport function useSearchTopics(\n queryParams: HashObject,\n presentationId: string\n): Flight.Response<SearchResults> {\n const rawFilters = FilterHelper.buildBackendFilterParams(\n queryParams,\n null,\n [presentationId],\n false,\n []\n );\n\n const filters = ObjectHelper.pick<HashObject>(rawFilters, [ 'filters.classification', 'filters.presentation' ]);\n filters[`filters.classificationType`] = ClassificationType.Subject;\n filters[`filters.status`] = ClassificationStatus.Published;\n filters['filters.presentation'] = presentationId;\n\n const indices = FilterHelper.getAppliedIndices(queryParams);\n\n const hasFilteredOutTopics = !indices.includes('classification');\n\n const request = SharedSearchRequests.search({\n query: SearchHelper.getQuery(queryParams),\n indices: ['classification'],\n filters,\n allowSubstitute: queryParams.allowSubstitute !== 'false'\n });\n\n const shouldFetch = !hasFilteredOutTopics;\n\n const response = Flight.useBasicFetch<TopicSearchResults>(shouldFetch && request);\n\n if (!shouldFetch)\n return null;\n\n return response;\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 { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { LibraryRequests } from 'libs/shared/flight-requests/LibraryRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { Config, CurrentUser, Presentation, PresentationAudience } from 'libs/shared/interfaces';\n\nimport { PresentationRequests } from 'shared/flight-requests/PresentationRequests';\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 * 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 config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const presentation = Flight.useBasicFetch<Presentation>(\n PresentationRequests.streamablePresentation()\n );\n\n const currentPresentation = presentation.data;\n\n const streamableLibrary = Flight.useBasicFetch<HashObject>(LibraryRequests.streamableLearning());\n const streamableLibraryId = streamableLibrary.data?.objectId;\n\n const currentPresentationId = currentPresentation?.id;\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(presentation.data &&\n AudienceRequests.presentationAudiences(PresentationType.StreamableLearning, presentation.data.id));\n\n const schoolLevels = useFetchSchoolLevels(presentation.data?.id);\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 topics = useSearchTopics(\n queryParams,\n currentPresentationId\n );\n\n const companies = useSearchCompanies(\n queryParams,\n currentPresentationId\n );\n\n const hasDataLoaded = (\n audiences.hasCompleted &&\n currentUser.hasCompleted &&\n config.hasCompleted\n );\n\n return {\n queryParams,\n currentUser,\n config,\n audiences,\n schoolLevels,\n availableTopics,\n topics,\n companies,\n currentPresentationId,\n streamableLibraryId,\n hasDataLoaded\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 { 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';\n\nexport const namespace = 'search.utils';\n\ninterface UseGetSearchResultsOptions {\n queryParams: HashObject;\n appliedIndices: SearchIndices[];\n backendFilters: HashObject;\n hasDataLoaded: 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\n function getSearchRequest(cursor?: string) {\n return options.hasDataLoaded && !!appliedIndices?.length &&\n SharedSearchRequests.searchV4({\n query: queryParams.query,\n indices: appliedIndices,\n filters: backendFilters,\n // This filter has caused a bunch of controversy, because while it does bring the most recent results to the top, \n // it also impacts the relevance of the results. As such, we are going to remove this sort for now.\n // sorts: { dateReleased: 'desc' },\n allowSubstitute: queryParams.allowSubstitute !== 'false',\n cursor\n });\n }\n\n function fetchNext(cursor?: string) {\n fetch(getSearchRequest(cursor));\n }\n\n function onError(pageNumber: number, httpStatus: HttpStatus): void {\n if (pageNumber === 1)\n return handleHttpError(httpStatus);\n\n alerts.error(LanguageService.getPhrase(namespace, 'error'));\n }\n\n const searchResults = useInfiniteList<SearchResultObjectTypes, SearchResults>(\n getSearchRequest,\n fetchNext,\n onError,\n data => data.results\n );\n\n return {\n ...searchResults,\n hasFirstPageCompleted: searchResults.hasFirstPageCompleted || !options.hasDataLoaded || !appliedIndices?.length,\n fetchNext,\n substituteQuery: searchResultsResponse.data?.substituteQuery,\n suggestions: searchResultsResponse.data?.suggestions\n };\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 { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\n\nexport function useSearchMask(hasCompleted: boolean): void {\n const [ showMask, setShowMask ] = useViewModel(SharedViewModelKeys.SHOW_SEARCH_MASK, true);\n\n React.useEffect(() => {\n showMask && hasCompleted && setShowMask(false);\n }, [hasCompleted]);\n}\n","import React from 'react';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/StreamableActions';\nimport { AppChannels } from 'shared/constants/StreamableRadioChannels';\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 = ImageUrls.EmptyStates.SEARCH;\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.SUBJECTS, action: Actions.Subjects.CLASSIFICATION_ALL }}\n >\n <Text phrase='topicsAppLink' />\n </AppLink>\n </EmptyState.Info>\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\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/StreamableActions';\nimport { StreamableConstants } from 'shared/constants/StreamableConstants';\nimport { AppChannels } from 'shared/constants/StreamableRadioChannels';\nimport { useCommonVideoProps } from 'shared/hooks/useCommonVideoProps';\nimport { useStreamableVideoActions } from 'shared/hooks/useStreamableVideoActions';\nimport { StreamableAppLinks } from 'shared/utils/StreamableAppLinks';\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/SearchHelper';\n\nimport { SearchResultsEmptyState } from './empty-state/SearchResultsEmptyState';\n\nexport const namespace = 'search.searchResults';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SearchResultsViewProps {\n queryParams: HashObject;\n}\n\nexport function SearchResultsView(props: SearchResultsViewProps): JSX.Element {\n const { queryParams = {} } = props;\n \n const { commonVideoProps } = useCommonVideoProps();\n\n const getVideoActions = useStreamableVideoActions('video-list');\n\n const searchData = useFetchSearchData(queryParams);\n\n const searchFilters = SearchHelper.getBackendFilters(searchData);\n\n const tagsAndClassifications = useGetTagsAndClassifications(searchFilters);\n const searchResults = useGetSearchResults({ ...searchFilters, ...searchData });\n\n const filters = SearchHelper.getFilters(searchData, tagsAndClassifications);\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 product: StreamableConstants.PRODUCT_NAME\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 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={StreamableAppLinks.search}\n />\n\n {!searchResults.substituteQuery && (\n <SearchSuggestions\n suggestions={searchResults.suggestions}\n queryParams={queryParams}\n getAppLink={StreamableAppLinks.search}\n />\n )}\n\n {(!!searchData.audiences.data && !!searchData.availableTopics.data) && (\n <SearchFilters\n queryParams={queryParams}\n mainFilters={filters?.mainFilters}\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={{ getVideoActions }}>\n <MixedSearchResults\n queryParams={queryParams}\n results={searchResults.items}\n topics={searchData.topics?.data}\n companies={searchData.companies?.data}\n audiences={!queryParams.moviesAndTv && searchData.audiences.data}\n currentUser={searchData.currentUser.data}\n availablePresentations={null}\n showActions\n appLinks={SearchHelper.getAppLinks()}\n hasPermissions={() => false}\n commonVideoProps={commonVideoProps}\n />\n </VideoActionsContext.Provider>\n ) : (\n <SearchResultsEmptyState query={queryParams.query} />\n )\n }\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}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BCBfXCYM2.chunk.js","names":[],"sources":["../../../../libs/shared/src/components/widgets/items/subject-widget-item/CompanyWidgetItem.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/CompanyResult.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/mixed-search-results.module.scss","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/exchange-video-group/ExchangeVideoGroup.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/FeaturedVideoResult.tsx","../../../../libs/shared/src/apps/search/components/playlist-with-videos/playlist-with-videos.module.scss","../../../../libs/shared/src/apps/search/components/playlist-with-videos/PlaylistWithVideos.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/LargePlaylistResults.tsx","../../../../libs/shared/src/apps/search/components/series-with-videos/series-with-videos.module.scss","../../../../libs/shared/src/apps/search/components/series-with-videos/SeriesWithVideos.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/LargeSeriesResult.tsx","../../../../libs/shared/src/apps/search/components/collection-video-list/CollectionVideoList.tsx","../../../../libs/shared/src/apps/search/components/collection-thumbnail/collection-thumbnail.module.scss","../../../../libs/shared/src/apps/search/components/collection-thumbnail/CollectionThumbnail.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/SmallPlaylistResult.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/SmallSeriesResults.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/SubjectResult.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/components/VideoResult.tsx","../../../../libs/shared/src/apps/search/components/mixed-search-results/MixedSearchResults.tsx","../../../../libs/shared/src/apps/search/components/search-substitute/SearchSubstitute.tsx","../../../../libs/shared/src/apps/search/components/search-suggestions/SearchSuggestions.tsx","../../src/apps/search/flight-requests/SearchRequests.ts","../../src/apps/search/hooks/useFetchSchoolLevels.ts","../../../../libs/shared/src/apps/search/constants/SearchOGQL.ts","../../../../libs/shared/src/apps/search/flight-requests/SharedSearchRequests.ts","../../src/apps/search/hooks/useSearchCompanies.ts","../../src/apps/search/hooks/useSearchTopics.ts","../../src/apps/search/hooks/useFetchSearchData.tsx","../../src/apps/search/hooks/useGetSearchResults.tsx","../../src/apps/search/hooks/useGetTagsAndClassifications.tsx","../../src/apps/search/hooks/useSearchMask.tsx","../../src/apps/search/views/search-results/empty-state/SearchResultsEmptyState.tsx","../../src/apps/search/views/search-results/SearchResultsView.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { CoverPillWidgetContentWrapper, CoverPillWidgetItemProps } from 'libs/shared/components/widgets/items/subject-widget-item/CoverPill';\nimport { Company } from 'libs/shared/interfaces';\n\nexport function CompanyWidgetItem(props: CoverPillWidgetItemProps<Company>): JSX.Element {\n const analyticsData = {\n ...props.analyticsData,\n id: props.data?.id,\n name: props.data?.name\n };\n\n const analyticsOptions = {\n location: LocationContext.ClassificationListItem,\n ...props.analyticsOptions,\n actionType: UserAction.Click,\n entity: EntityType.Company,\n descriptor: ClickDescriptor.Cover\n };\n\n return (\n <CoverPillWidgetContentWrapper\n {...props}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n coverUrl={props.data.logo?.url}\n coverBgColor={props.data.metadata?.colour}\n />\n );\n}\n","import React from 'react';\nimport { Col } from 'react-bootstrap';\n\nimport { CompanyWidgetItem } from 'libs/shared/components/widgets/items/subject-widget-item/CompanyWidgetItem';\nimport { Company } from 'libs/shared/interfaces';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function CompanyResult(props: MixedSearchResultItemProps<Company>): JSX.Element {\n return (\n <Col as='li' sm={6} md={props.useLargeStyle ? 6 : 4} lg={props.useLargeStyle ? 4 : 3}>\n <div className='position-relative px-1 mb-2'>\n <CompanyWidgetItem\n data={props.item}\n getChildAppLink={props.appLinks.getCompanyAppLink}\n getChildAppLinkOptions={() => props.appLinks.getCompanyAppLinkOptions?.(props.item)}\n analyticsData={{\n itemIndex: props.itemIndex,\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: 0\n }}\n isLarge={props.useLargeStyle}\n />\n </div>\n </Col>\n );\n}\n","@import '~styles/utils/include-media';\n:local {\n .videoList {\n margin: 0 -#{map-get($spacers, 2)};\n \n @include media('<=md') {\n margin: 0;\n }\n }\n}","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 { type ExchangeVideoGroup as ExchangeVideoGroupData } 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.module.scss';\n\nconst namespace = 'search.exchangeVideoGroup';\n\nconst EXCHANGE_RESULT_DISPLAY_LIMIT = 3;\n\nexport function ExchangeVideoGroup(props: MixedSearchResultItemProps<ExchangeVideoGroupData>): JSX.Element {\n const limit = props.item.showCount >= EXCHANGE_RESULT_DISPLAY_LIMIT ?\n EXCHANGE_RESULT_DISPLAY_LIMIT :\n props.item.showCount;\n\n function getContainerClassName(): string {\n if (props.pagePositionIndex === 0)\n return 'border-bottom pb-1 mb-3';\n\n return 'border-top border-bottom pt-3 mt-2 pb-1 mb-3';\n }\n\n const currentAppLink = Core.AppLinkHelper.getCurrentAppLink();\n const currentParams = (currentAppLink.params as HashObject) ?? {};\n let currentSource = currentParams?.source ?? [];\n\n if (currentSource && !Array.isArray(currentSource))\n currentSource = [currentSource];\n\n const searchAppLink = {\n ...currentAppLink,\n params: {\n ...currentParams,\n source: [ ...(currentSource), SourceFilterOptions.ExchangeArchive ]\n }\n };\n\n const analyticsData = {\n query: props.queryParams.query,\n itemIndex: props.itemIndex,\n pagePositionIndex: props.pagePositionIndex\n };\n const analyticsOptions = {\n entity: EntityType.SearchResults,\n location: LocationContext.ExchangeSearchGroupItem,\n actionType: UserAction.Click,\n descriptor: SearchSourceDescriptor.ExchangeArchive\n };\n\n return (\n <div className={getContainerClassName()}>\n <AppLink\n appLink={searchAppLink}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n >\n <h2 className='h4'>\n <Text namespace={namespace} phrase='heading' />\n </h2>\n </AppLink>\n <p>\n <Text namespace={namespace} phrase='message' />\n \n <AppLink\n appLink={props.appLinks.searchSettings}\n className='text-info'\n analyticsData={analyticsData}\n analyticsOptions={{\n ...analyticsOptions,\n descriptor: ClickDescriptor.Settings\n }}\n >\n <Text namespace={namespace} phrase='searchSettings' />\n </AppLink>\n .\n </p>\n\n <div className={`position-relative ${styles.videoList}`}>\n {props.item.videos.slice(0, limit).map((v, i) => {\n return (\n <VideoItem\n key={i}\n video={v}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n presentationAudiences={props.audiences}\n analyticsData= {{\n search: {\n query: props.queryParams.query,\n score: v._score,\n maxScore: v._maxScore,\n featured: v._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n />\n );\n })}\n </div>\n <div className='text-center py-2'>\n <AppLink\n className='text-secondary'\n appLink={searchAppLink}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n >\n <Text namespace={namespace} phrase='seeMore' />\n </AppLink>\n </div>\n </div>\n );\n}\n","import React from 'react';\n\nimport { HeroVideo } from 'libs/shared/apps/subjects/components/hero-video/HeroVideo';\nimport { Video } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function FeaturedVideoResult(props: MixedSearchResultItemProps<Video>): JSX.Element {\n return (\n <div className='pb-3'>\n <HeroVideo\n video={props.item}\n presentationAudiences={props.audiences}\n getVideoAppLink={(v, opts) => props.appLinks.getVideoAppLink(v, opts)}\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n hideInteractiveBadge\n showVideoGuidance={VideoHelper.showVideoGuidance(props.hasPermissions)}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n}\n","@import '~styles/utils/include-media';\n:local {\n .videoList {\n width: 63%;\n\n @include media('<=xl') {\n width: 75%;\n }\n\n @include media('<=lg') {\n width: 88%;\n }\n }\n}","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { PlaylistItem } from 'libs/shared/apps/playlists/components/playlist-list';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoItem } from 'libs/shared/components/video-list/video-item/VideoItem';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { CurrentUser, Playlist, PresentationAudience, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\n\nimport styles from './playlist-with-videos.module.scss';\n\nconst namespace = 'search.playlistWithVideos';\n\nfunction useGetMaxVideos(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xl || breakpoints.xxl)\n return 3;\n \n return 2;\n}\n\ninterface PlaylistWithVideoProps {\n playlist: Playlist;\n playlistAppLink: Core.AppLink;\n presentationAudiences: PresentationAudience[];\n preloadImage: boolean;\n analyticsData: HashObject;\n currentUser: CurrentUser;\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n hasPermissions: HasPermissionsFunc;\n commonVideoProps: CommonVideoProps;\n}\n\nexport function PlaylistWithVideos(props: PlaylistWithVideoProps): JSX.Element {\n const maxVideos = useGetMaxVideos();\n\n const videos = props.playlist.videos.data.slice(0, maxVideos);\n\n const playlistAnalyticsOption: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Playlist,\n location: LocationContext.PlaylistWithVideos\n };\n\n const playlistAnalyticsData: HashObject = {\n ...props.analyticsData,\n id: props.playlist.id,\n name: props.playlist.name\n };\n\n return (\n <div className='ps-2 py-2'>\n <Row className='g-0 border rounded-3'>\n <Col xs={4} lg={3} className='pe-3'>\n <PlaylistItem\n appLink={props.playlistAppLink}\n analyticsData={props.analyticsData}\n analyticsOptions={{\n ...playlistAnalyticsOption,\n descriptor: ClickDescriptor.Cover\n }}\n data={props.playlist}\n presentationAudiences={props.presentationAudiences}\n bgColourClassNames={BG_COLOUR_CLASS_NAMES}\n itemStyle='round-left'\n imageCdnUrl={props.commonVideoProps.imageCdnUrl}\n currentUser={props.currentUser}\n showCount={false}\n showOwner\n />\n </Col>\n <Col xs={8} lg={9}>\n <div className='d-flex justify-content-between'>\n <div className={`pt-3 mb-n2 ${styles.videoList}`}>\n {videos?.map(video => {\n const videoAnalyticsData: HashObject = {\n ...playlistAnalyticsData,\n videoId: video.id,\n videoName: video.name\n };\n\n return (\n <div key={video.id} className='mb-2'>\n <VideoItem\n video={video}\n getVideoAppLink={props.getVideoAppLink}\n analyticsData={videoAnalyticsData}\n analyticsOptions={{\n entity: EntityType.Video,\n location: LocationContext.PlaylistWithVideos\n }}\n size='sm'\n hasPermissions={props.hasPermissions}\n hideVideoGuidance\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n })}\n </div>\n <div className='text-end pt-3 pe-3'>\n <AppLink\n className='info-link fw-semibold'\n appLink={props.playlistAppLink}\n analyticsData={playlistAnalyticsData}\n analyticsOptions={{\n ...playlistAnalyticsOption,\n descriptor: ClickDescriptor.Link\n }}\n >\n <Text namespace={namespace} phrase='seeAllVideos' />\n </AppLink>\n </div>\n </div>\n </Col>\n </Row>\n </div>\n );\n}\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 playlistAppLink={props.appLinks.getPlaylistAppLink(props.item)}\n presentationAudiences={props.audiences}\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n currentUser={props.currentUser}\n preloadImage\n getVideoAppLink={props.appLinks.getVideoAppLink}\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n}\n","@import '~styles/utils/include-media';\n:local {\n .videoList {\n width: 63%;\n\n @include media('<=xl') {\n width: 75%;\n }\n\n @include media('<=lg') {\n width: 88%;\n }\n }\n}","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SeriesTallPoster } from 'libs/shared/components/series-tall-poster/SeriesTallPoster';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoItem } from 'libs/shared/components/video-list/video-item/VideoItem';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { PresentationAudience, Series, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\n\nimport styles from './series-with-videos.module.scss';\n\nconst namespace = 'search.seriesWithVideos';\n\nfunction useGetMaxVideos(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xl || breakpoints.xxl)\n return 5;\n \n if (breakpoints.lg || breakpoints.md)\n return 4;\n\n return 3;\n}\n\ninterface SeriesWithVideoProps {\n series: Series;\n seriesAppLink: Core.AppLink;\n presentationAudiences: PresentationAudience[];\n preloadImage: boolean;\n analyticsData: HashObject;\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n hasPermissions: HasPermissionsFunc;\n commonVideoProps: CommonVideoProps;\n}\n\nexport function SeriesWithVideos(props: SeriesWithVideoProps): JSX.Element {\n const maxVideos = useGetMaxVideos();\n\n const videos = props.series.videos.data.slice(0, maxVideos);\n\n const seriesAnalyticsOption: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Series,\n location: LocationContext.SeriesWithVideos\n };\n\n const seriesAnalyticsData: HashObject = {\n ...props.analyticsData,\n id: props.series.id,\n name: props.series.name\n };\n\n return (\n <div className='ps-2 py-2'>\n <Row className='g-0 border rounded-3'>\n <Col xs={4} lg={3} className='pe-3'>\n <AppLink\n appLink={props.seriesAppLink}\n className='position-relative'\n analyticsData={seriesAnalyticsData}\n analyticsOptions={{\n ...seriesAnalyticsOption,\n descriptor: ClickDescriptor.TallPoster\n }}\n >\n <SeriesTallPoster\n series={props.series}\n presentationAudiences={props.presentationAudiences}\n preloadImage={props.preloadImage}\n imageClass='rounded-start-lg'\n />\n </AppLink>\n </Col>\n <Col xs={8} lg={9}>\n <div className='d-flex justify-content-between'>\n <div className={`pt-3 mb-n2 ${styles.videoList}`}>\n {videos?.map(video => {\n const videoAnalyticsData: HashObject = {\n ...seriesAnalyticsData,\n videoId: video.id,\n videoName: video.name\n };\n\n // insert parent series into video object\n video = {\n ...video,\n series: props.series\n };\n\n return (\n <div key={video.id} className='mb-2'>\n <VideoItem\n video={video}\n getVideoAppLink={props.getVideoAppLink}\n analyticsData={videoAnalyticsData}\n analyticsOptions={{\n entity: EntityType.Video,\n location: LocationContext.SeriesWithVideos\n }}\n size='sm'\n hasPermissions={props.hasPermissions}\n hideVideoGuidance\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n })}\n </div>\n <div className='text-end pt-3 pe-3'>\n <AppLink\n className='info-link fw-semibold'\n appLink={props.seriesAppLink}\n analyticsData={seriesAnalyticsData}\n analyticsOptions={{\n ...seriesAnalyticsOption,\n descriptor: ClickDescriptor.Link\n }}\n >\n <Text namespace={namespace} phrase='seeAllVideos' />\n </AppLink>\n </div>\n </div>\n </Col>\n </Row>\n </div>\n );\n}\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 presentationAudiences={props.audiences}\n series={props.item}\n seriesAppLink={props.appLinks.getSeriesAppLink(props.item)}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n preloadImage\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n}\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}\n",":local {\n .overlayContainer {\n position: absolute;\n width: 100%;\n height: 100%;\n z-index: 1;\n padding: map-get($spacers, 1);\n color: $white;\n }\n\n .overlay {\n background-color: darken($dark, 30%);\n opacity: .7;\n width: 40%;\n position: absolute;\n right: 0;\n z-index: 1;\n }\n}","import React from 'react';\nimport { Col } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor } from 'libs/analytics/interfaces';\n\nimport { CollectionVideoList } from 'libs/shared/apps/search/components/collection-video-list/CollectionVideoList';\nimport { ActionOptions, Actions as ActionsComponent } from 'libs/shared/components/actions/Actions';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BadgeListContainer } from 'libs/shared/components/badges/BadgeListContainer';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { Mask, MaskType } from 'libs/shared/components/mask/Mask';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoListHelper } from 'libs/shared/components/video-list/VideoListHelper';\nimport { ImageType } from 'libs/shared/enums/Images';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Playlist, Series, Video } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { SeriesHelper } from 'libs/shared/utils/SeriesHelper';\n\nimport styles from './collection-thumbnail.module.scss';\n\nconst namespace = 'search.collectionThumbnail';\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={SeriesHelper.getRating((props.collection as Series))} />\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}\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.module.scss';\n\nexport function SmallPlaylistResult(props: MixedSearchResultItemProps<Playlist>): JSX.Element {\n return (\n <div className={`position-relative ${styles.videoList}`}>\n <CollectionThumbnail\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n analyticsOptions={{\n entity: EntityType.Playlist,\n actionType: UserAction.Click,\n location: LocationContext.PlaylistListItem\n }}\n appLink={props.appLinks.getPlaylistAppLink(props.item)}\n showActions={props.showActions}\n collection={props.item}\n collectionType='playlist'\n maskType={MaskType.Playlist}\n imageFallbackType={ImageFallbackType.PlaylistThumbnail}\n isPlugin={props.commonVideoProps.isPlugin}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getCollectionActions={props.appLinks.getCollectionActions}\n />\n </div>\n );\n}\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.module.scss';\n\nexport function SmallSeriesResult(props: MixedSearchResultItemProps<Series>): JSX.Element {\n return (\n <div className={`position-relative ${styles.videoList}`}>\n <CollectionThumbnail\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n analyticsOptions={{\n entity: EntityType.Series,\n actionType: UserAction.Click,\n location: LocationContext.SeriesListItem\n }}\n appLink={props.appLinks.getSeriesAppLink(props.item)}\n collectionType='series'\n collection={props.item}\n showActions={props.showActions}\n maskType={MaskType.Series}\n imageFallbackType={ImageFallbackType.SeriesThumbnail}\n hideBadges\n isPlugin={props.commonVideoProps.isPlugin}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getCollectionActions={props.appLinks.getCollectionActions}\n />\n </div>\n );\n}\n","import React from 'react';\nimport { Col } from 'react-bootstrap';\n\nimport { SubjectWidgetItem } from 'libs/shared/components/widgets/items/subject-widget-item';\nimport { Classification } from 'libs/shared/interfaces';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function SubjectResult(props: MixedSearchResultItemProps<Classification>): JSX.Element {\n return (\n <Col as='li' sm={6} md={props.useLargeStyle ? 6 : 4} lg={props.useLargeStyle ? 4 : 3}>\n <div className='position-relative px-1 mb-2'>\n <SubjectWidgetItem\n data={props.item}\n getChildAppLink={props.appLinks.getClassificationAppLink}\n getChildAppLinkOptions={\n () => props.appLinks.getClassificationAppLinkOptions?.(props.item)\n }\n availablePresentations={props.availablePresentations}\n analyticsData={{\n itemIndex: props.itemIndex,\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: 0\n }}\n isLarge={props.useLargeStyle}\n highlightOnHover={props.commonVideoProps.showNewVideoIndicator}\n />\n </div>\n </Col>\n );\n}\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.module.scss';\n\nexport function VideoResult(props: MixedSearchResultItemProps<VideoTypes>): JSX.Element {\n function getItemComponent(\n video: VideoTypes\n ): (props: ClipItemProps | InteractiveItemProps | VideoItemProps) => JSX.Element {\n if (VideoHelper.isClip(video))\n return ClipItem;\n \n if (VideoHelper.isInteractive(video))\n return InteractiveItem;\n \n return VideoItem;\n }\n\n const Component = getItemComponent(props.item);\n\n return (\n <div className={`position-relative ${styles.videoList}`}>\n <Component\n video={props.item}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getPreviewQuestionsAppLink={props.appLinks.getPreviewQuestionsAppLink}\n presentationAudiences={props.audiences}\n analyticsData= {{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n}\n","import React from 'react';\nimport { Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { Classification, Company, CurrentUser, InteractiveMetadata, Playlist, Presentation, PresentationAudience, Series, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { SearchResultObjectTypes, SearchResults, SearchResultsObject } from '../../interfaces';\nimport { GetCollectionActions } from '../collection-thumbnail/CollectionThumbnail';\n\nimport { CompanyResult } from './components/CompanyResult';\nimport { ExchangeVideoGroup } from './components/exchange-video-group/ExchangeVideoGroup';\nimport { FeaturedVideoResult } from './components/FeaturedVideoResult';\nimport { LargePlaylistResult } from './components/LargePlaylistResults';\nimport { LargeSeriesResult } from './components/LargeSeriesResult';\nimport { BaseMixedSearchResultItemProps } from './components/MixedSearchResultItemProps';\nimport { SmallPlaylistResult } from './components/SmallPlaylistResult';\nimport { SmallSeriesResult } from './components/SmallSeriesResults';\nimport { SubjectResult } from './components/SubjectResult';\nimport { VideoResult } from './components/VideoResult';\n\nconst namespace = 'shared.mixedSearchResults';\n\nconst TOPIC_DISPLAY_LIMIT = 8;\n\nexport interface MixedSearchResultAppLinks {\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n getSeriesAppLink: (series: Series) => Core.AppLink;\n getCompanyAppLink: (company: Company) => Core.AppLink;\n getCompanyAppLinkOptions?: (company: Company) => Core.AppLinkOptions;\n getClassificationAppLink: (classification: Classification) => Core.AppLink;\n getClassificationAppLinkOptions?: (classification: Classification) => Core.AppLinkOptions;\n getPlaylistAppLink: (playlist: Playlist) => Core.AppLink;\n getPreviewQuestionsAppLink: (interactive: InteractiveMetadata) => Core.AppLink;\n getCollectionActions: GetCollectionActions;\n searchSettings?: Core.AppLink;\n}\n\ninterface MixedSearchResultsProps {\n queryParams: HashObject;\n results: SearchResultObjectTypes[];\n topics?: SearchResults;\n companies?: SearchResults;\n audiences: PresentationAudience[];\n currentUser: CurrentUser;\n availablePresentations: Presentation[];\n showActions: boolean;\n hasPermissions: HasPermissionsFunc;\n appLinks: MixedSearchResultAppLinks;\n commonVideoProps: CommonVideoProps;\n}\n\nexport const MixedSearchResults = React.memo(function(props: MixedSearchResultsProps): JSX.Element {\n const breakpoints = useBreakpoints();\n const useSmallComponent = breakpoints.xs || breakpoints.sm;\n\n if (!props.results?.length && !props.topics?.totalResults && !props.companies?.totalResults)\n return <></>;\n\n const companiesAndTopics = [\n ...props.companies?.results ?? [],\n ...props.topics?.results ?? []\n ];\n\n const childProps: BaseMixedSearchResultItemProps = {\n useLargeStyle: companiesAndTopics.length < 4,\n ...props\n };\n\n return (\n <div className='position-relative'>\n <p role='status' className='visually-hidden'><Text namespace={namespace} phrase='ariaSearch' /></p>\n\n {!!companiesAndTopics.length && (\n <Row as='ul' className='list-unstyled g-0 pb-3 mx-n1'>\n {companiesAndTopics.slice(0, TOPIC_DISPLAY_LIMIT).map((c, itemIndex) => {\n switch (c.type.toLowerCase()) {\n case 'company':\n return (\n <CompanyResult\n key={itemIndex}\n item={c as SearchResultsObject<Company>}\n itemIndex={itemIndex}\n {...childProps}\n />\n );\n case 'subject': {\n return (\n <SubjectResult\n key={itemIndex}\n item={c as SearchResultsObject<Classification>}\n itemIndex={itemIndex}\n {...childProps}\n />\n );\n }\n }\n })}\n </Row>\n )}\n\n {props.results?.map((result, index) => {\n const pagePositionIndex = companiesAndTopics.length ? index + 1 : index;\n\n if ('isExchangeVideoGroup' in result && result.isExchangeVideoGroup) {\n return (\n <ExchangeVideoGroup\n key={index}\n item={result}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n 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});\n","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'search.searchSubstitute';\n\ninterface SearchSubstituteProps {\n substitute: string;\n queryParams: HashObject;\n getAppLink: (query: string, queryParams: HashObject) => Core.AppLink;\n}\n\nexport function SearchSubstitute(props: SearchSubstituteProps): JSX.Element {\n if (!props.substitute)\n return <></>;\n\n return (\n <div className='pb-3'>\n <p className='mb-1 h6'>\n <Text namespace={namespace} phrase='showingFor' /> \n <AppLink\n className='info-link'\n appLink={props.getAppLink(props.substitute, props.queryParams)}\n appLinkOptions={{ replace: true }}\n >\n {props.substitute}\n </AppLink>\n </p>\n <p className='mb-0 h6 fw-normal'>\n <Text namespace={namespace} phrase='searchInsteadFor' />\n <AppLink\n className='info-link'\n appLink={props.getAppLink(props.queryParams.query, { ...props.queryParams, allowSubstitute: 'false' })}\n >\n {props.queryParams.query}\n </AppLink>\n <Text namespace={namespace} phrase='endOriginal' />\n </p>\n </div>\n );\n}\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}\n","import { 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 { SearchIndices, SearchResults } from 'libs/shared/apps/search/interfaces';\n\nexport const SearchRequests = {\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 => filters[filterName]).join(';');\n\n const params = Object.assign({}, {\n index: indices,\n cursor: cursor ?? undefined,\n query,\n ...filters\n });\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/search', params),\n publicUrl: UrlHelper.urlBuilder('/api/search', params),\n key,\n success,\n error\n };\n },\n\n schoolLevels(presentationIds: string[]): Flight.PublicRequest {\n const params = {\n filterType: 'schoolLevels',\n presentationId: presentationIds\n };\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/search/filters', params),\n publicUrl: UrlHelper.urlBuilder('/api/search/filters', params),\n key: 'school-levels'\n };\n }\n};\n","import { Flight } from 'libs/common/flight';\n\nimport { SchoolLevels } from 'libs/shared/interfaces';\n\nimport { SearchRequests } from 'apps/search/flight-requests/SearchRequests';\n\nexport function useFetchSchoolLevels(presentationId: string) {\n return Flight.useBasicFetch<SchoolLevels>(\n presentationId && SearchRequests.schoolLevels([presentationId])\n );\n}\n","import { SharedWithStatements } from 'libs/shared/constants/WithStatements';\nimport { TagType } from 'libs/shared/enums/TagType';\n\n/**\n * OGQL used for search V5 endpoint\n */\nexport const SearchOGQL = {\n video: SharedWithStatements.VIDEO_COLLECTION,\n series: 'rating,tallPoster',\n playlist:\n 'videos[count(),thumbnail]{limit:1},interactives[count(),_thumbnail]{limit:1},' +\n 'clips[count(),_thumbnail]{limit:1}',\n classification: `_theme[banner,cover,tallposter,thumbnail,icon],cover,thumbnail,tags{tagtype:${TagType.Curation}}`,\n clip: SharedWithStatements.CLIP_COLLECTION,\n interactive: SharedWithStatements.INTERACTIVE_COLLECTION,\n company: 'logo',\n category: 'libraries[_logo],thumbnail',\n partner_profile: SharedWithStatements.PARTNER_PROFILE\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 { SearchOGQL } from 'libs/shared/apps/search/constants/SearchOGQL';\nimport { SearchIndices, SearchResultObjectTypes, SearchResults, SearchResultsObject } from 'libs/shared/apps/search/interfaces';\nimport type { WidgetFilter } from 'libs/shared/apps/search/interfaces/WidgetSearchResults';\nimport { SharedSearchHelper } from 'libs/shared/apps/search/utils/SharedSearchHelper';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport type { Playlist, Series } from 'libs/shared/interfaces';\nimport { ThemeAssetHelper } from 'libs/shared/utils/ThemeAssetHelper';\n\nfunction formatSearchResponse(response: SearchResults<SearchResultObjectTypes>) {\n /**\n * Until playlists and series are regionalised, search will always return every series/playlist that exists\n * even if the current user doesn't have access to the content inside (which will happen for example when playlists/series)\n * contain all UK library content but is being searched for by an AU user.\n *\n * For some search queries, this may result in search showing a bunch of \"empty\" playlists/series, which sucks.\n * This will filter all empty collections out and decrement the `totalResults` to avoid this and make search a better\n * experience.\n *\n * Ideally this will be removed one day when this regionalisation is no longer an issue.\n */\n let totalResults = response.totalResults;\n\n const results = response?.results?.filter(result => {\n if (result._index !== 'series' && result._index !== 'playlist')\n return true;\n\n if (result._index === 'playlist') {\n const playlist = result as SearchResultsObject<Playlist>;\n\n if (playlist.clips?.data?.length ||\n playlist.interactives?.data?.length ||\n playlist.videos?.data?.length)\n return true;\n\n totalResults--;\n return false;\n }\n\n if ((result as SearchResultsObject<Series>).videos?.data?.length === 0) {\n totalResults--;\n return false;\n }\n\n return true;\n }) ?? [];\n\n response.results = results;\n response.totalResults = totalResults;\n\n // The first search result will always have the highest score value.\n // We store it so that we can access it for subsequent results pages\n const resultMaxScore = results[0]?._score;\n\n return {\n ...response,\n results: SharedSearchHelper.mapMaxScoreToSearchResults(results, resultMaxScore)\n };\n}\n\nfunction stringifyObject(obj: HashObject): string {\n return Object.entries(obj).reduce((prev, [ , value ]) => {\n let stringifiedValue = value;\n\n if (typeof value === 'object') {\n stringifiedValue = stringifyObject(value);\n } else if ([ 'number', 'boolean', 'string' ].includes(typeof value)) {\n stringifiedValue = value.toString();\n }\n\n if (!prev.length)\n return stringifiedValue;\n\n return `${prev},${stringifiedValue}`;\n }, '');\n}\n\n/**\n * We want to map the filters to the global filters object but we need to remove the filter prefix\n * and exclude the presentation filter\n */\nfunction getGlobalFilters(filters: HashObject, widgetTypeId: WidgetTypeId | null): Record<string, any> {\n return Object.entries(filters)\n .reduce((prev, [ key, value ]) => {\n const actualKey = key.replace(FilterConstants.FILTER_PARAM_PREFIX, '');\n if (actualKey === 'presentation' &&\n widgetTypeId !== WidgetTypeId.SearchTopResults &&\n widgetTypeId !== WidgetTypeId.SearchRelatedResults &&\n widgetTypeId !== WidgetTypeId.SearchSeries\n ) {\n return prev;\n }\n\n return { ...prev, [actualKey]: value };\n }, {});\n}\n\nexport const SharedSearchRequests = {\n searchDashboard(\n query: string,\n filters: HashObject,\n widgets: WidgetFilter[] = []\n ): Flight.PublicRequest {\n const widgetData = widgets.sort((a, b) => a.id.localeCompare(b.id)).map(w => [ w.id, w?.cursor ]);\n const filterData = stringifyObject(filters);\n \n const key = `search:v5:dashboard:${query}:${widgetData}:${filterData}`;\n \n const {\n [`${FilterConstants.FILTER_PARAM_PREFIX}indicesFilters`]: indicesFilter,\n isLearner,\n ...genericFilters\n } = filters;\n\n const data = {\n widgets,\n indices: indicesFilter,\n filters: getGlobalFilters(genericFilters, null),\n query,\n includeAllIndices: false,\n isLearner: !!isLearner\n };\n\n return {\n url: '{gateway}/v5/search/widgets',\n publicUrl: '/api/search/v5/widgets',\n type: HttpVerbs.POST,\n data,\n key\n };\n },\n\n searchDashboardWidget(\n widgetTypeId: WidgetTypeId,\n query: string,\n filters: HashObject,\n widgets: WidgetFilter[] = []\n ): Flight.PublicRequest {\n const widgetData = widgets.sort((a, b) => a.id.localeCompare(b.id)).map(w => [ w.id, w?.cursor ]);\n const filterData = stringifyObject(filters);\n \n const key = `search:v5:dashboard:${widgetTypeId}:widget:${query}:${widgetData}:${filterData}`;\n \n const {\n [`${FilterConstants.FILTER_PARAM_PREFIX}indicesFilters`]: indicesFilter,\n isLearner,\n excludeVideoIds,\n ...genericFilters\n } = filters;\n\n const data = {\n widgets,\n indices: indicesFilter,\n filters: getGlobalFilters(genericFilters, widgetTypeId),\n query,\n includeAllIndices: false,\n isLearner: !!isLearner,\n ogql: SearchOGQL,\n excludeVideoIds\n };\n\n return {\n url: `{gateway}/v5/search/widgets/${widgetTypeId}`,\n publicUrl: `/api/search/v5/widgets/${widgetTypeId}`,\n type: HttpVerbs.POST,\n data,\n key,\n formatData: (data: HashObject) => {\n if (!data)\n return data;\n\n return {\n ...data,\n content: data.content?.data ?\n { ...data.content, data: data.content.data.map(ThemeAssetHelper.applyThemeToClassification) } :\n data.content\n };\n }\n };\n },\n\n searchV5(\n query: string,\n filters: HashObject,\n widgets: WidgetFilter[] = []\n ): Flight.PublicRequest {\n const widgetData = widgets.sort((a, b) => a.id.localeCompare(b.id)).map(w => [ w.id, w?.cursor ]);\n const filterData = stringifyObject(filters);\n \n const key = `search:v5:${query}:${widgetData}:${filterData}`;\n \n const {\n [`${FilterConstants.FILTER_PARAM_PREFIX}indicesFilters`]: indicesFilter,\n isLearner,\n ...genericFilters\n } = filters;\n\n const data = {\n widgets,\n indices: indicesFilter,\n filters: Object.entries(genericFilters)\n .reduce((prev, [ key, value ]) =>\n ({ ...prev, [key.replace('filters.', '')]: value }), {}),\n query,\n includeAllIndices: false,\n isLearner: !!isLearner,\n ogql: SearchOGQL\n };\n\n return {\n url: '{gateway}/v5/search',\n publicUrl: '/api/search/v5',\n type: HttpVerbs.POST,\n data,\n key\n };\n },\n \n searchV4(options: {\n query: string,\n indices: SearchIndices[],\n filters: HashObject,\n sorts?: HashObject,\n allowSubstitute: boolean,\n cursor?: string,\n limit?: number\n }): Flight.PublicRequest {\n const { query, indices, filters = {}, sorts = {}, allowSubstitute = true, cursor, limit } = options;\n\n let key = `search:v4:${query}:${allowSubstitute}:${indices}:${cursor}`;\n\n key += Object.keys(filters).map(filterName => {\n const filter = filters[filterName];\n return Array.isArray(filter) ? filter.join(';') : filter;\n }).join(';');\n\n const {\n [`${FilterConstants.FILTER_PARAM_PREFIX}excludeLibraryExclusive`]: excludeLibraryExclusive,\n isLearner,\n ...genericFilters\n } = filters;\n\n const indexObjects = indices.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: indexObjects,\n filters: Object.entries(genericFilters)\n .reduce((prev, [ key, value ]) =>\n ({ ...prev, [key.replace('filters.', '')]: value }), {}),\n sorts,\n query,\n allowSubstitute,\n cursor: cursor ?? undefined,\n isLearner: !!isLearner,\n limit\n };\n\n return {\n url: '{gateway}/v4/search',\n publicUrl: '/api/search/v4',\n type: HttpVerbs.POST,\n data,\n key,\n formatData: formatSearchResponse\n };\n },\n\n search(options: {\n query: string,\n indices: SearchIndices[],\n filters?: HashObject,\n allowSubstitute?: boolean,\n cursor?: string,\n limit?: number,\n success?: (results: SearchResults) => void,\n error?: (xhr: Xhr) => void\n }): Flight.PublicRequest {\n const { query, indices, filters, allowSubstitute, cursor, limit, success, error } = options;\n\n let key = `search:${query}:${allowSubstitute}:${indices}:${cursor}`;\n\n key += Object.keys(filters).map(filterName => {\n const filter = filters[filterName];\n return Array.isArray(filter) ? filter.join(';') : filter;\n }).join(';');\n\n const params = Object.assign({}, {\n index: indices,\n cursor: cursor ?? undefined,\n query,\n allowSubstitute,\n limit,\n ...filters\n });\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v3/search', params),\n publicUrl: UrlHelper.urlBuilder('/api/search', params),\n key,\n formatData: formatSearchResponse,\n success,\n error\n };\n },\n\n tagsAndClassifications(\n query: string,\n indices: SearchIndices[],\n filters: HashObject = {},\n cursor?: string,\n success?: (results: string[]) => void,\n error?: () => void\n ): Flight.PublicRequest {\n const params = {\n index: indices,\n cursor,\n query,\n ...filters\n };\n\n let key = `filter:options:${query}:${indices.join(':')}:${cursor}`;\n\n key += Object.keys(filters).map(filterName => {\n const filter = filters[filterName];\n return Array.isArray(filter) ? filter.join(';') : filter;\n }).join(';');\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v3/search/tags-and-classifications', params),\n publicUrl: UrlHelper.urlBuilder('/api/search/tags-and-classifications', params),\n key,\n success,\n error,\n normalize: false\n };\n }\n};\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 } from 'libs/shared/interfaces';\n\nimport { SearchHelper } from 'apps/search/utils/SearchHelper';\n\ntype CompanySearchResults = SearchResults<SearchResultsObject<Company>>;\n\nexport function useSearchCompanies(\n queryParams: HashObject,\n presentationId: string\n): Flight.Response<SearchResults> {\n const rawFilters = FilterHelper.buildBackendFilterParams(\n queryParams,\n null,\n [presentationId],\n false,\n []\n );\n \n const filters = rawFilters || {};\n filters[`filters.presentation`] = presentationId;\n\n const request = SharedSearchRequests.search({\n query: SearchHelper.getQuery(queryParams),\n indices: ['company'],\n filters,\n allowSubstitute: queryParams.allowSubstitute !== 'false'\n });\n\n return Flight.useBasicFetch<CompanySearchResults>(request);\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 { Classification } from 'libs/shared/interfaces';\n\nimport { SearchHelper } from 'apps/search/utils/SearchHelper';\n\ntype TopicSearchResults = SearchResults<SearchResultsObject<Classification>>;\n\nexport function useSearchTopics(\n queryParams: HashObject,\n presentationId: string\n): Flight.Response<SearchResults> {\n const rawFilters = FilterHelper.buildBackendFilterParams(\n queryParams,\n null,\n [presentationId],\n false,\n []\n );\n\n const filters = ObjectHelper.pick<HashObject>(rawFilters, [ 'filters.classification', 'filters.presentation' ]);\n filters[`filters.classificationType`] = ClassificationType.Subject;\n filters[`filters.status`] = ClassificationStatus.Published;\n filters['filters.presentation'] = presentationId;\n\n const indices = FilterHelper.getAppliedIndices(queryParams);\n\n const hasFilteredOutTopics = !indices.includes('classification');\n\n const request = SharedSearchRequests.search({\n query: SearchHelper.getQuery(queryParams),\n indices: ['classification'],\n filters,\n allowSubstitute: queryParams.allowSubstitute !== 'false'\n });\n\n const shouldFetch = !hasFilteredOutTopics;\n\n const response = Flight.useBasicFetch<TopicSearchResults>(shouldFetch && request);\n\n if (!shouldFetch)\n return null;\n\n return response;\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 { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { LibraryRequests } from 'libs/shared/flight-requests/LibraryRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { Config, CurrentUser, Presentation, PresentationAudience } from 'libs/shared/interfaces';\n\nimport { PresentationRequests } from 'shared/flight-requests/PresentationRequests';\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 * 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 config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const presentation = Flight.useBasicFetch<Presentation>(\n PresentationRequests.streamablePresentation()\n );\n\n const currentPresentation = presentation.data;\n\n const streamableLibrary = Flight.useBasicFetch<HashObject>(LibraryRequests.streamableLearning());\n const streamableLibraryId = streamableLibrary.data?.objectId;\n\n const currentPresentationId = currentPresentation?.id;\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(presentation.data &&\n AudienceRequests.presentationAudiences(PresentationType.StreamableLearning, presentation.data.id));\n\n const schoolLevels = useFetchSchoolLevels(presentation.data?.id);\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 topics = useSearchTopics(\n queryParams,\n currentPresentationId\n );\n\n const companies = useSearchCompanies(\n queryParams,\n currentPresentationId\n );\n\n const hasDataLoaded = (\n audiences.hasCompleted &&\n currentUser.hasCompleted &&\n config.hasCompleted\n );\n\n return {\n queryParams,\n currentUser,\n config,\n audiences,\n schoolLevels,\n availableTopics,\n topics,\n companies,\n currentPresentationId,\n streamableLibraryId,\n hasDataLoaded\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 { 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';\n\nexport const namespace = 'search.utils';\n\ninterface UseGetSearchResultsOptions {\n queryParams: HashObject;\n appliedIndices: SearchIndices[];\n backendFilters: HashObject;\n hasDataLoaded: 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\n function getSearchRequest(cursor?: string) {\n return options.hasDataLoaded && !!appliedIndices?.length &&\n SharedSearchRequests.searchV4({\n query: queryParams.query,\n indices: appliedIndices,\n filters: backendFilters,\n // This filter has caused a bunch of controversy, because while it does bring the most recent results to the top, \n // it also impacts the relevance of the results. As such, we are going to remove this sort for now.\n // sorts: { dateReleased: 'desc' },\n allowSubstitute: queryParams.allowSubstitute !== 'false',\n cursor\n });\n }\n\n function fetchNext(cursor?: string) {\n fetch(getSearchRequest(cursor));\n }\n\n function onError(pageNumber: number, httpStatus: HttpStatus): void {\n if (pageNumber === 1)\n return handleHttpError(httpStatus);\n\n alerts.error(LanguageService.getPhrase(namespace, 'error'));\n }\n\n const searchResults = useInfiniteList<SearchResultObjectTypes, SearchResults>(\n getSearchRequest,\n fetchNext,\n onError,\n data => data.results\n );\n\n return {\n ...searchResults,\n hasFirstPageCompleted: searchResults.hasFirstPageCompleted || !options.hasDataLoaded || !appliedIndices?.length,\n fetchNext,\n substituteQuery: searchResultsResponse.data?.substituteQuery,\n suggestions: searchResultsResponse.data?.suggestions\n };\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 { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\n\nexport function useSearchMask(hasCompleted: boolean): void {\n const [ showMask, setShowMask ] = useViewModel(SharedViewModelKeys.SHOW_SEARCH_MASK, true);\n\n React.useEffect(() => {\n showMask && hasCompleted && setShowMask(false);\n }, [hasCompleted]);\n}\n","import React from 'react';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/StreamableActions';\nimport { AppChannels } from 'shared/constants/StreamableRadioChannels';\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 = ImageUrls.EmptyStates.SEARCH;\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.SUBJECTS, action: Actions.Subjects.CLASSIFICATION_ALL }}\n >\n <Text phrase='topicsAppLink' />\n </AppLink>\n </EmptyState.Info>\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\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/StreamableActions';\nimport { StreamableConstants } from 'shared/constants/StreamableConstants';\nimport { AppChannels } from 'shared/constants/StreamableRadioChannels';\nimport { useCommonVideoProps } from 'shared/hooks/useCommonVideoProps';\nimport { useStreamableVideoActions } from 'shared/hooks/useStreamableVideoActions';\nimport { StreamableAppLinks } from 'shared/utils/StreamableAppLinks';\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/SearchHelper';\n\nimport { SearchResultsEmptyState } from './empty-state/SearchResultsEmptyState';\n\nexport const namespace = 'search.searchResults';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SearchResultsViewProps {\n queryParams: HashObject;\n}\n\nexport function SearchResultsView(props: SearchResultsViewProps): JSX.Element {\n const { queryParams = {} } = props;\n \n const { commonVideoProps } = useCommonVideoProps();\n\n const getVideoActions = useStreamableVideoActions('video-list');\n\n const searchData = useFetchSearchData(queryParams);\n\n const searchFilters = SearchHelper.getBackendFilters(searchData);\n\n const tagsAndClassifications = useGetTagsAndClassifications(searchFilters);\n const searchResults = useGetSearchResults({ ...searchFilters, ...searchData });\n\n const filters = SearchHelper.getFilters(searchData, tagsAndClassifications);\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 product: StreamableConstants.PRODUCT_NAME\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 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={StreamableAppLinks.search}\n />\n\n {!searchResults.substituteQuery && (\n <SearchSuggestions\n suggestions={searchResults.suggestions}\n queryParams={queryParams}\n getAppLink={StreamableAppLinks.search}\n />\n )}\n\n {(!!searchData.audiences.data && !!searchData.availableTopics.data) && (\n <SearchFilters\n queryParams={queryParams}\n mainFilters={filters?.mainFilters}\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={{ getVideoActions }}>\n <MixedSearchResults\n queryParams={queryParams}\n results={searchResults.items}\n topics={searchData.topics?.data}\n companies={searchData.companies?.data}\n audiences={!queryParams.moviesAndTv && searchData.audiences.data}\n currentUser={searchData.currentUser.data}\n availablePresentations={null}\n showActions\n appLinks={SearchHelper.getAppLinks()}\n hasPermissions={() => false}\n commonVideoProps={commonVideoProps}\n />\n </VideoActionsContext.Provider>\n ) : (\n <SearchResultsEmptyState query={queryParams.query} />\n )\n }\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}\n"],"mappings":"4mEAOA,SAAgB,GAAkB,EAAuD,CACvF,IAAM,EAAgB,CACpB,GAAG,EAAM,cACT,GAAI,EAAM,MAAM,GAChB,KAAM,EAAM,MAAM,KACnB,CAEK,EAAmB,CACvB,SAAU,EAAgB,uBAC1B,GAAG,EAAM,iBACT,WAAY,EAAW,MACvB,OAAQ,EAAW,QACnB,WAAY,EAAgB,MAC7B,CAED,OACE,EAAA,EAAA,KAAC,GAAD,CACE,GAAI,EACW,gBACG,mBAClB,SAAU,EAAM,KAAK,MAAM,IAC3B,aAAc,EAAM,KAAK,UAAU,OACnC,CAAA,CCrBN,SAAgB,GAAc,EAAyD,CACrF,OACE,EAAA,EAAA,KAAC,EAAD,CAAK,GAAG,KAAK,GAAI,EAAG,GAAI,EAAM,cAAgB,EAAI,EAAG,GAAI,EAAM,cAAgB,EAAI,YACjF,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,wCACb,EAAA,EAAA,KAAC,GAAD,CACE,KAAM,EAAM,KACZ,gBAAiB,EAAM,SAAS,kBAChC,2BAA8B,EAAM,SAAS,2BAA2B,EAAM,KAAK,CACnF,cAAe,CACb,UAAW,EAAM,UACjB,OAAQ,CACN,MAAO,EAAM,YAAY,MACzB,MAAO,EAAM,KAAK,OAClB,SAAU,EAAM,KAAK,UACrB,SAAU,EAAM,KAAK,UACtB,CACD,kBAAmB,EACpB,CACD,QAAS,EAAM,cACf,CAAA,CACE,CAAA,CACF,CAAA,wCEbJ,EAAY,4BAEZ,EAAgC,EAEtC,SAAgB,GAAmB,EAAwE,CACzG,IAAM,EAAQ,EAAM,KAAK,WAAa,EACpC,EACA,EAAM,KAAK,UAEb,SAAS,GAAgC,CAIvC,OAHI,EAAM,oBAAsB,EACvB,0BAEF,+CAGT,IAAM,EAAA,EAAoC,mBAAmB,CACvD,EAAiB,EAAe,QAAyB,EAAE,CAC7D,EAAgB,GAAe,QAAU,EAAE,CAE3C,GAAiB,CAAC,MAAM,QAAQ,EAAc,GAChD,EAAgB,CAAC,EAAc,EAEjC,IAAM,EAAgB,CACpB,GAAG,EACH,OAAQ,CACN,GAAG,EACH,OAAQ,CAAE,GAAI,EAAgB,GAAoB,gBAAA,EAErD,CAEK,EAAgB,CACpB,MAAO,EAAM,YAAY,MACzB,UAAW,EAAM,UACjB,kBAAmB,EAAM,kBAC1B,CACK,EAAmB,CACvB,OAAQ,EAAW,cACnB,SAAU,EAAgB,wBAC1B,WAAY,EAAW,MACvB,WAAY,EAAuB,gBACpC,CAED,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAW,GAAuB,UAAvC,EACE,EAAA,EAAA,KAAC,EAAD,CACE,QAAS,EACM,gBACG,6BAElB,EAAA,EAAA,KAAC,KAAD,CAAI,UAAU,eACZ,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,EAAW,OAAO,UAAY,CAAA,CAC5C,CAAA,CACG,CAAA,EACV,EAAA,EAAA,MAAC,IAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,EAAW,OAAO,UAAY,CAAA,SAE/C,EAAA,EAAA,KAAC,EAAD,CACE,QAAS,EAAM,SAAS,eACxB,UAAU,YACK,gBACf,iBAAkB,CAChB,GAAG,EACH,WAAY,EAAgB,SAC7B,WAED,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,EAAW,OAAO,iBAAmB,CAAA,CAC9C,CAAA,KAER,CAAA,CAAA,EAEJ,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,qBAAqB,EAAO,qBACzC,EAAM,KAAK,OAAO,MAAM,EAAG,EAAM,CAAC,KAAK,EAAG,KAEvC,EAAA,EAAA,KAAC,EAAD,CAEE,MAAO,EACP,gBAAiB,EAAM,SAAS,gBAChC,sBAAuB,EAAM,UAC7B,cAAgB,CACd,OAAQ,CACN,MAAO,EAAM,YAAY,MACzB,MAAO,EAAE,OACT,SAAU,EAAE,UACZ,SAAU,EAAE,UACb,CACD,kBAAmB,EAAM,kBAC1B,CACD,eAAgB,EAAM,eACtB,iBAAkB,EAAM,iBACxB,CAfK,EAeL,EAGF,CAAA,EACN,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,6BACb,EAAA,EAAA,KAAC,EAAD,CACE,UAAU,iBACV,QAAS,EACM,gBACG,6BAElB,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,EAAW,OAAO,UAAY,CAAA,CACvC,CAAA,CACN,CAAA,IC/GZ,SAAgB,GAAoB,EAAuD,CACzF,OACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,iBACb,EAAA,EAAA,KAAC,GAAD,CACE,MAAO,EAAM,KACb,sBAAuB,EAAM,UAC7B,iBAAkB,EAAG,IAAS,EAAM,SAAS,gBAAgB,EAAG,EAAK,CACrE,cAAe,CACb,OAAQ,CACN,MAAO,EAAM,YAAY,MACzB,MAAO,EAAM,KAAK,OAClB,SAAU,EAAM,KAAK,UACrB,SAAU,EAAM,KAAK,UACtB,CACD,kBAAmB,EAAM,kBAC1B,CACD,qBAAA,GACA,kBAAmB,EAAY,kBAAkB,EAAM,eAAe,CACtE,iBAAkB,EAAM,iBACxB,CAAA,CACE,CAAA,yCEPJ,GAAY,4BAElB,SAAS,IAA0B,CACjC,IAAM,EAAc,GAAgB,CAKpC,OAHI,EAAY,IAAM,EAAY,IACzB,EAEF,EAeT,SAAgB,GAAmB,EAA4C,CAC7E,IAAM,EAAY,IAAiB,CAE7B,EAAS,EAAM,SAAS,OAAO,KAAK,MAAM,EAAG,EAAU,CAEvD,EAA4C,CAChD,WAAY,EAAW,MACvB,OAAQ,EAAW,SACnB,SAAU,EAAgB,mBAC3B,CAEK,EAAoC,CACxC,GAAG,EAAM,cACT,GAAI,EAAM,SAAS,GACnB,KAAM,EAAM,SAAS,KACtB,CAED,OACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,sBACb,EAAA,EAAA,MAAC,EAAD,CAAK,UAAU,gCAAf,EACE,EAAA,EAAA,KAAC,EAAD,CAAK,GAAI,EAAG,GAAI,EAAG,UAAU,iBAC3B,EAAA,EAAA,KAAC,GAAD,CACE,QAAS,EAAM,gBACf,cAAe,EAAM,cACrB,iBAAkB,CAChB,GAAG,EACH,WAAY,EAAgB,MAC7B,CACD,KAAM,EAAM,SACZ,sBAAuB,EAAM,sBAC7B,mBAAoB,GACpB,UAAU,aACV,YAAa,EAAM,iBAAiB,YACpC,YAAa,EAAM,YACnB,UAAW,GACX,UAAA,GACA,CAAA,CACE,CAAA,EACN,EAAA,EAAA,KAAC,EAAD,CAAK,GAAI,EAAG,GAAI,YACd,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,0CAAf,EACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,cAAc,GAAO,qBAClC,GAAQ,IAAI,GAAS,CACpB,IAAM,EAAiC,CACrC,GAAG,EACH,QAAS,EAAM,GACf,UAAW,EAAM,KAClB,CAED,OACE,EAAA,EAAA,KAAC,MAAD,CAAoB,UAAU,iBAC5B,EAAA,EAAA,KAAC,EAAD,CACS,QACP,gBAAiB,EAAM,gBACvB,cAAe,EACf,iBAAkB,CAChB,OAAQ,EAAW,MACnB,SAAU,EAAgB,mBAC3B,CACD,KAAK,KACL,eAAgB,EAAM,eACtB,kBAAA,GACA,iBAAkB,EAAM,iBACxB,CAAA,CACE,CAdI,EAAM,GAcV,GAGN,CAAA,EACN,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,+BACb,EAAA,EAAA,KAAC,EAAD,CACE,UAAU,wBACV,QAAS,EAAM,gBACf,cAAe,EACf,iBAAkB,CAChB,GAAG,EACH,WAAY,EAAgB,KAC7B,WAED,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,GAAW,OAAO,eAAiB,CAAA,CAC5C,CAAA,CACN,CAAA,CAAA,GAEJ,CAAA,CAAA,GAEJ,CAAA,CCvHV,SAAgB,GAAoB,EAA0D,CAC5F,OACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,kBACb,EAAA,EAAA,KAAC,GAAD,CACE,SAAU,EAAM,KAChB,gBAAiB,EAAM,SAAS,mBAAmB,EAAM,KAAK,CAC9D,sBAAuB,EAAM,UAC7B,cAAe,CACb,OAAQ,CACN,MAAO,EAAM,YAAY,MACzB,MAAO,EAAM,KAAK,OAClB,SAAU,EAAM,KAAK,UACrB,SAAU,EAAM,KAAK,UACtB,CACD,kBAAmB,EAAM,kBAC1B,CACD,YAAa,EAAM,YACnB,aAAA,GACA,gBAAiB,EAAM,SAAS,gBAChC,eAAgB,EAAM,eACtB,iBAAkB,EAAM,iBACxB,CAAA,CACE,CAAA,yCEVJ,GAAY,0BAElB,SAAS,IAA0B,CACjC,IAAM,EAAc,GAAgB,CAQpC,OANI,EAAY,IAAM,EAAY,IACzB,EAEL,EAAY,IAAM,EAAY,GACzB,EAEF,EAcT,SAAgB,GAAiB,EAA0C,CACzE,IAAM,EAAY,IAAiB,CAE7B,EAAS,EAAM,OAAO,OAAO,KAAK,MAAM,EAAG,EAAU,CAErD,EAA0C,CAC9C,WAAY,EAAW,MACvB,OAAQ,EAAW,OACnB,SAAU,EAAgB,iBAC3B,CAEK,EAAkC,CACtC,GAAG,EAAM,cACT,GAAI,EAAM,OAAO,GACjB,KAAM,EAAM,OAAO,KACpB,CAED,OACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,sBACb,EAAA,EAAA,MAAC,EAAD,CAAK,UAAU,gCAAf,EACE,EAAA,EAAA,KAAC,EAAD,CAAK,GAAI,EAAG,GAAI,EAAG,UAAU,iBAC3B,EAAA,EAAA,KAAC,EAAD,CACE,QAAS,EAAM,cACf,UAAU,oBACV,cAAe,EACf,iBAAkB,CAChB,GAAG,EACH,WAAY,EAAgB,WAC7B,WAED,EAAA,EAAA,KAAC,GAAD,CACE,OAAQ,EAAM,OACd,sBAAuB,EAAM,sBAC7B,aAAc,EAAM,aACpB,WAAW,mBACX,CAAA,CACM,CAAA,CACN,CAAA,EACN,EAAA,EAAA,KAAC,EAAD,CAAK,GAAI,EAAG,GAAI,YACd,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,0CAAf,EACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,cAAc,GAAO,qBAClC,GAAQ,IAAI,GAAS,CACpB,IAAM,EAAiC,CACrC,GAAG,EACH,QAAS,EAAM,GACf,UAAW,EAAM,KAClB,CAQD,MALA,GAAQ,CACN,GAAG,EACH,OAAQ,EAAM,OACf,EAGC,EAAA,EAAA,KAAC,MAAD,CAAoB,UAAU,iBAC5B,EAAA,EAAA,KAAC,EAAD,CACS,QACP,gBAAiB,EAAM,gBACvB,cAAe,EACf,iBAAkB,CAChB,OAAQ,EAAW,MACnB,SAAU,EAAgB,iBAC3B,CACD,KAAK,KACL,eAAgB,EAAM,eACtB,kBAAA,GACA,iBAAkB,EAAM,iBACxB,CAAA,CACE,CAdI,EAAM,GAcV,GAGN,CAAA,EACN,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,+BACb,EAAA,EAAA,KAAC,EAAD,CACE,UAAU,wBACV,QAAS,EAAM,cACf,cAAe,EACf,iBAAkB,CAChB,GAAG,EACH,WAAY,EAAgB,KAC7B,WAED,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,GAAW,OAAO,eAAiB,CAAA,CAC5C,CAAA,CACN,CAAA,CAAA,GAEJ,CAAA,CAAA,GAEJ,CAAA,CC9HV,SAAgB,GAAkB,EAAwD,CACxF,OACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,kBACb,EAAA,EAAA,KAAC,GAAD,CACE,sBAAuB,EAAM,UAC7B,OAAQ,EAAM,KACd,cAAe,EAAM,SAAS,iBAAiB,EAAM,KAAK,CAC1D,gBAAiB,EAAM,SAAS,gBAChC,cAAe,CACb,OAAQ,CACN,MAAO,EAAM,YAAY,MACzB,MAAO,EAAM,KAAK,OAClB,SAAU,EAAM,KAAK,UACrB,SAAU,EAAM,KAAK,UACtB,CACD,kBAAmB,EAAM,kBAC1B,CACD,aAAA,GACA,eAAgB,EAAM,eACtB,iBAAkB,EAAM,iBACxB,CAAA,CACE,CAAA,CCjBV,IAAM,GAAY,6BAWlB,SAAS,IAA0B,CACjC,IAAM,EAAc,GAAgB,CAQpC,OANI,EAAY,GACP,EAEL,EAAY,GACP,EAEF,EAGT,SAAgB,GAAoB,EAA8C,CAChF,IAAM,EAAY,IAAiB,CAE7B,EAAiB,CACrB,cAAe,EAAM,cACrB,iBAAkB,EAAM,iBACzB,CAED,OACE,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,KAAD,CAAI,UAAU,8BACX,EAAM,OAAO,MAAM,EAAG,EAAU,CAAC,IAAI,GAAK,CACzC,IAAM,EAAmB,CAAC,CAAC,EAAE,eAAiB,CAAC,CAAC,EAAE,QAAQ,GAE1D,OACE,EAAA,EAAA,KAAC,KAAD,CAA0C,UAAU,sCAClD,EAAA,EAAA,MAAC,EAAD,CACE,GAAI,EACJ,UAAU,UACV,QAAS,EAAM,gBAAgB,EAAE,UAHnC,CAKG,IAAoB,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EAAE,EAAA,EAAA,KAAC,GAAD,CAAe,MAAO,EAAK,CAAA,CAAA,OAAS,CAAA,CAAA,CAC1D,EAAE,KAAA,GAEF,CATI,GAAG,EAAM,aAAa,GAAG,EAAE,KAS/B,GAGN,CAAA,EAEL,EAAA,EAAA,KAAC,EAAD,CACE,GAAI,EACJ,UAAU,YACV,QAAS,EAAM,kBAEf,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,GAAW,OAAO,SAAW,CAAA,CACtC,CAAA,CACT,CAAA,CAAA,kFE7CD,GAAY,6BA2BlB,SAAgB,EAAoB,EAA8C,CAChF,IAAM,EAAc,GAAgB,CAE9B,EADO,EAAgB,QAAQ,EAAa,KAAK,GAC9B,KAEnB,EAAY,CAAC,CAAC,EAAM,WAAW,QAAQ,MAAM,OAE7C,EAA0B,GAAa,EAAM,WAAW,OAAO,KAAK,KAAK,GAAK,CAAC,CAAC,EAAE,WAAW,IAAI,CAEvG,SAAS,GAA+B,CACtC,IAAM,EAAmB,CACvB,GAAG,EAAM,cACT,GAAI,EAAM,WAAW,GACrB,KAAM,EAAM,WAAW,KACxB,CAOD,OALI,IACF,EAAK,QAAU,EAAwB,GACvC,EAAK,UAAY,EAAwB,MAGpC,EAGT,IAAM,EAAgB,GAAkB,CAClC,EAAW,EAAM,iBAAmB,SAE1C,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAW,WAAW,EAAU,GAAK,kBAA1C,EACE,EAAA,EAAA,KAAC,EAAD,CAAK,GAAI,EAAgB,qBAAqB,CAAE,UAAW,sCAAsC,EAAU,YAAc,wBACvH,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,qCAAqC,EAAU,UAAY,wBACzE,EAAA,EAAA,MAAC,GAAD,CACE,KAAM,GAAyB,UAC/B,QAAS,EAAM,QACf,UAAW,GAAU,WACN,gBACf,iBAAkB,CAChB,GAAG,EAAM,iBACT,WAAY,EAAgB,UAC7B,UARH,EAUE,EAAA,EAAA,KAAC,GAAD,CAAM,KAAM,EAAM,SAAY,CAAA,EAC9B,EAAA,EAAA,KAAC,GAAD,CAAe,KAAM,EAAM,kBAAqB,CAAA,EAEhD,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,iFAAiF,GAAO,oBACtG,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,GAAW,OAAO,SAAW,CAAA,CAC1C,CAAA,IAEJ,CAAA,CACF,CAAA,EAEN,EAAA,EAAA,MAAC,EAAD,CAAK,GAAI,EAAgB,mBAAmB,CAAE,UAAW,EAAU,OAAS,gBAA5E,CACG,CAAC,EAAM,WACN,EAAA,EAAA,KAAC,GAAD,CACE,QAAS,EAAM,qBACb,EAAM,WACN,EAAM,YACN,EAAM,eACN,EAAM,iBACP,CACD,UAAU,kBACV,yBAAyB,oBACzB,CAAA,EAGJ,EAAA,EAAA,KAAC,EAAD,CACE,QAAS,EAAM,QACA,gBACf,iBAAkB,CAChB,GAAG,EAAM,iBACT,WAAY,EAAgB,MAC7B,WAED,EAAA,EAAA,KAAC,KAAD,CAAI,UAAU,qBAAW,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,mBAAW,EAAM,WAAW,KAAY,CAAA,CAAK,CAAA,CAC9E,CAAA,CAET,GAAY,CAAC,EAAM,aAClB,EAAA,EAAA,MAAC,GAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAD,CAAO,KAAM,EAAU,OAAQ,KAAM,GAAa,UAAW,EAAM,WAAA,CAA0B,CAAA,EAC7F,EAAA,EAAA,KAAC,EAAD,CAAO,KAAM,EAAU,eAAgB,KAAO,EAAM,WAAsB,UAAU,KAAQ,CAAA,CACzE,CAAA,CAAA,CAGtB,IACC,EAAA,EAAA,KAAC,GAAD,CACE,aAAc,EAAM,WAAW,GAC/B,OAAQ,EAAM,WAAW,OAAO,KAChC,QAAS,EAAM,QACA,gBACf,iBAAkB,CAChB,GAAG,EAAM,iBACT,WAAY,EAAgB,KAC7B,CACD,gBAAiB,EAAM,gBACvB,CAAA,OCrIZ,SAAgB,GAAoB,EAA0D,CAC5F,OACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,qBAAqB,EAAO,sBAC1C,EAAA,EAAA,KAAC,EAAD,CACE,cAAe,CACb,OAAQ,CACN,MAAO,EAAM,YAAY,MACzB,MAAO,EAAM,KAAK,OAClB,SAAU,EAAM,KAAK,UACrB,SAAU,EAAM,KAAK,UACtB,CACD,kBAAmB,EAAM,kBAC1B,CACD,iBAAkB,CAChB,OAAQ,EAAW,SACnB,WAAY,EAAW,MACvB,SAAU,EAAgB,iBAC3B,CACD,QAAS,EAAM,SAAS,mBAAmB,EAAM,KAAK,CACtD,YAAa,EAAM,YACnB,WAAY,EAAM,KAClB,eAAe,WACf,SAAU,EAAS,SACnB,kBAAmB,EAAkB,kBACrC,SAAU,EAAM,iBAAiB,SACjC,gBAAiB,EAAM,SAAS,gBAChC,qBAAsB,EAAM,SAAS,qBACrC,CAAA,CACE,CAAA,CC5BV,SAAgB,GAAkB,EAAwD,CACxF,OACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,qBAAqB,EAAO,sBAC1C,EAAA,EAAA,KAAC,EAAD,CACE,cAAe,CACb,OAAQ,CACN,MAAO,EAAM,YAAY,MACzB,MAAO,EAAM,KAAK,OAClB,SAAU,EAAM,KAAK,UACrB,SAAU,EAAM,KAAK,UACtB,CACD,kBAAmB,EAAM,kBAC1B,CACD,iBAAkB,CAChB,OAAQ,EAAW,OACnB,WAAY,EAAW,MACvB,SAAU,EAAgB,eAC3B,CACD,QAAS,EAAM,SAAS,iBAAiB,EAAM,KAAK,CACpD,eAAe,SACf,WAAY,EAAM,KAClB,YAAa,EAAM,YACnB,SAAU,EAAS,OACnB,kBAAmB,EAAkB,gBACrC,WAAA,GACA,SAAU,EAAM,iBAAiB,SACjC,gBAAiB,EAAM,SAAS,gBAChC,qBAAsB,EAAM,SAAS,qBACrC,CAAA,CACE,CAAA,CCnCV,SAAgB,GAAc,EAAgE,CAC5F,OACE,EAAA,EAAA,KAAC,EAAD,CAAK,GAAG,KAAK,GAAI,EAAG,GAAI,EAAM,cAAgB,EAAI,EAAG,GAAI,EAAM,cAAgB,EAAI,YACjF,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,wCACb,EAAA,EAAA,KAAC,GAAD,CACE,KAAM,EAAM,KACZ,gBAAiB,EAAM,SAAS,yBAChC,2BACQ,EAAM,SAAS,kCAAkC,EAAM,KAAK,CAEpE,uBAAwB,EAAM,uBAC9B,cAAe,CACb,UAAW,EAAM,UACjB,OAAQ,CACN,MAAO,EAAM,YAAY,MACzB,MAAO,EAAM,KAAK,OAClB,SAAU,EAAM,KAAK,UACrB,SAAU,EAAM,KAAK,UACtB,CACD,kBAAmB,EACpB,CACD,QAAS,EAAM,cACf,iBAAkB,EAAM,iBAAiB,sBACzC,CAAA,CACE,CAAA,CACF,CAAA,CCrBV,SAAgB,GAAY,EAA4D,CACtF,SAAS,EACP,EAC+E,CAO/E,OANI,EAAY,OAAO,EAAM,CACpB,GAEL,EAAY,cAAc,EAAM,CAC3B,GAEF,EAGT,IAAM,EAAY,EAAiB,EAAM,KAAK,CAE9C,OACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,qBAAqB,EAAO,sBAC1C,EAAA,EAAA,KAAC,EAAD,CACE,MAAO,EAAM,KACb,gBAAiB,EAAM,SAAS,gBAChC,2BAA4B,EAAM,SAAS,2BAC3C,sBAAuB,EAAM,UAC7B,cAAgB,CACd,OAAQ,CACN,MAAO,EAAM,YAAY,MACzB,MAAO,EAAM,KAAK,OAClB,SAAU,EAAM,KAAK,UACrB,SAAU,EAAM,KAAK,UACtB,CACD,kBAAmB,EAAM,kBAC1B,CACD,eAAgB,EAAM,eACtB,iBAAkB,EAAM,iBACxB,CAAA,CACE,CAAA,CClBV,IAAM,GAAY,4BAEZ,GAAsB,EA6Bf,GAAA,EAA2B,KAAK,SAAS,EAA6C,CACjG,IAAM,EAAc,GAAgB,CAC9B,EAAoB,EAAY,IAAM,EAAY,GAExD,GAAI,CAAC,EAAM,SAAS,QAAU,CAAC,EAAM,QAAQ,cAAgB,CAAC,EAAM,WAAW,aAC7E,OAAO,EAAA,EAAA,KAAA,EAAA,SAAA,EAAK,CAAA,CAEd,IAAM,EAAqB,CACzB,GAAG,EAAM,WAAW,SAAW,EAAE,CACjC,GAAG,EAAM,QAAQ,SAAW,EAAE,CAC/B,CAEK,EAA6C,CACjD,cAAe,EAAmB,OAAS,EAC3C,GAAG,EACJ,CAED,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,6BAAf,EACE,EAAA,EAAA,KAAC,IAAD,CAAG,KAAK,SAAS,UAAU,4BAAkB,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,GAAW,OAAO,aAAe,CAAA,CAAI,CAAA,CAElG,CAAC,CAAC,EAAmB,SACpB,EAAA,EAAA,KAAC,EAAD,CAAK,GAAG,KAAK,UAAU,wCACpB,EAAmB,MAAM,EAAG,GAAoB,CAAC,KAAK,EAAG,IAAc,CACtE,OAAQ,EAAE,KAAK,aAAa,CAA5B,CACE,IAAK,UACH,OACE,EAAA,EAAA,KAAC,GAAD,CAEE,KAAM,EACK,YACX,GAAI,EACJ,CAJK,EAIL,CAEN,IAAK,UACH,OACE,EAAA,EAAA,KAAC,GAAD,CAEE,KAAM,EACK,YACX,GAAI,EACJ,CAJK,EAIL,GAIR,CACE,CAAA,CAGP,EAAM,SAAS,KAAK,EAAQ,IAAU,CACrC,IAAM,EAAoB,EAAmB,OAAS,EAAQ,EAAI,EAElE,GAAI,yBAA0B,GAAU,EAAO,qBAC7C,OACE,EAAA,EAAA,KAAC,GAAD,CAEE,KAAM,EACa,oBACnB,GAAI,EACJ,CAJK,EAIL,CAIN,OAAQ,EAAO,MAAM,aAAa,CAAlC,CACE,IAAK,cACL,IAAK,OACL,IAAK,QAYH,OAXI,IAAU,GAAK,EAAO,WAAa,EAAY,QAAQ,EAAO,EAE9D,EAAA,EAAA,KAAC,GAAD,CAEE,KAAM,EACa,oBACnB,GAAI,EACJ,CAJK,EAIL,EAKJ,EAAA,EAAA,KAAC,GAAD,CAEE,KAAM,EACa,oBACnB,GAAI,EACJ,CAJK,EAIL,CAIN,IAAK,WAYH,OAXI,GAEA,EAAA,EAAA,KAAC,GAAD,CAEE,KAAM,EACa,oBACnB,GAAI,EACJ,CAJK,EAIL,EAKJ,EAAA,EAAA,KAAC,GAAD,CAEE,KAAM,EACa,oBACnB,GAAI,EACJ,CAJK,EAIL,CAIN,IAAK,SAcH,OAXI,GAAqB,CAFV,EAEkB,YAAY,IAEzC,EAAA,EAAA,KAAC,GAAD,CAEE,KAAM,EACa,oBACnB,GAAI,EACJ,CAJK,EAIL,EAKJ,EAAA,EAAA,KAAC,GAAD,CAEE,KAAM,EACa,oBACnB,GAAI,EACJ,CAJK,EAIL,GAIR,CACE,IAER,CC5LI,EAAY,0BAQlB,SAAgB,GAAiB,EAA2C,CAI1E,OAHK,EAAM,YAIT,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,gBAAf,EACE,EAAA,EAAA,MAAC,IAAD,CAAG,UAAU,mBAAb,EACE,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,EAAW,OAAO,aAAe,CAAA,SAClD,EAAA,EAAA,KAAC,EAAD,CACE,UAAU,YACV,QAAS,EAAM,WAAW,EAAM,WAAY,EAAM,YAAY,CAC9D,eAAgB,CAAE,QAAS,GAAM,UAEhC,EAAM,WACC,CAAA,CACR,IACJ,EAAA,EAAA,MAAC,IAAD,CAAG,UAAU,6BAAb,EACE,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,EAAW,OAAO,mBAAqB,CAAA,EACxD,EAAA,EAAA,KAAC,EAAD,CACE,UAAU,YACV,QAAS,EAAM,WAAW,EAAM,YAAY,MAAO,CAAE,GAAG,EAAM,YAAa,gBAAiB,QAAS,CAAC,UAErG,EAAM,YAAY,MACX,CAAA,EACV,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,EAAW,OAAO,cAAgB,CAAA,CACjD,GACA,IAxBC,EAAA,EAAA,KAAA,EAAA,SAAA,EAAK,CAAA,CCVhB,IAAM,GAAY,2BAQlB,EAAkB,aAAe,CAC/B,YAAa,EAAE,CACf,YAAa,EAAA,CACd,CAED,SAAgB,EAAkB,EAA4C,CAI5E,OAHK,EAAM,aAAa,QAItB,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,0CAAf,EACE,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,GAAW,OAAO,aAAe,CAAA,QAGjD,EAAM,YAAY,KAAK,EAAY,KAClC,EAAA,EAAA,MAAA,EAAO,SAAP,CAAA,SAAA,CACG,IAAU,IAAK,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,gBAAO,IAAa,CAAA,EAEpD,EAAA,EAAA,KAAC,EAAD,CACE,UAAU,YACV,QAAS,EAAM,WAAW,EAAY,EAAM,YAAY,CACxD,eAAgB,CAAE,QAAS,GAAM,UAEhC,EACO,CAAA,CACK,CAAA,CAVI,GAAG,EAAW,GAAG,IAUrB,CAAA,KAlBd,EAAA,EAAA,KAAA,EAAA,SAAA,EAAK,CAAA,CChBhB,IAAa,GAAiB,CAC5B,OACE,EACA,EACA,EAAsB,EAAE,CACxB,EACA,EACA,EACsB,CACtB,IAAI,EAAM,UAAU,EAAM,GAAG,EAAQ,GAAG,IAExC,GAAO,OAAO,KAAK,EAAQ,CAAC,IAAI,GAAc,EAAQ,GAAY,CAAC,KAAK,IAAI,CAE5E,IAAM,EAAS,OAAO,OAAO,EAAE,CAAE,CAC/B,MAAO,EACP,OAAQ,GAAU,IAAA,GAClB,QACA,GAAG,EACJ,CAAC,CAEF,MAAO,CACL,IAAK,EAAU,WAAW,sBAAuB,EAAO,CACxD,UAAW,EAAU,WAAW,cAAe,EAAO,CACtD,MACA,UACA,QACD,EAGH,aAAa,EAAiD,CAC5D,IAAM,EAAS,CACb,WAAY,eACZ,eAAgB,EACjB,CAED,MAAO,CACL,IAAK,EAAU,WAAW,8BAA+B,EAAO,CAChE,UAAW,EAAU,WAAW,sBAAuB,EAAO,CAC9D,IAAK,gBACN,EAEJ,CC1CD,SAAgB,GAAqB,EAAwB,CAC3D,OAAO,EACL,GAAkB,GAAe,aAAa,CAAC,EAAe,CAAC,CAChE,CCHH,IAAa,EAAa,CACxB,MAAO,EAAqB,iBAC5B,OAAQ,oBACR,SACE,kHAEF,eAAgB,+EAA+E,GAAQ,SAAS,GAChH,KAAM,EAAqB,gBAC3B,YAAa,EAAqB,uBAClC,QAAS,OACT,SAAU,6BACV,gBAAiB,EAAqB,gBACvC,CCHD,SAAS,EAAqB,EAAkD,CAY9E,IAAI,EAAe,EAAS,aAEtB,EAAU,GAAU,SAAS,OAAO,GAAU,CAClD,GAAI,EAAO,SAAW,UAAY,EAAO,SAAW,WAClD,MAAO,GAET,GAAI,EAAO,SAAW,WAAY,CAChC,IAAM,EAAW,EAQjB,OANI,EAAS,OAAO,MAAM,QACtB,EAAS,cAAc,MAAM,QAC7B,EAAS,QAAQ,MAAM,OAClB,IAET,IACO,IAQT,OALK,EAAuC,QAAQ,MAAM,SAAW,GACnE,IACO,IAGF,IACP,EAAI,EAAE,CAER,EAAS,QAAU,EACnB,EAAS,aAAe,EAIxB,IAAM,EAAiB,EAAQ,IAAI,OAEnC,MAAO,CACL,GAAG,EACH,QAAS,GAAmB,2BAA2B,EAAS,EAAA,CACjE,CAGH,SAAS,EAAgB,EAAyB,CAChD,OAAO,OAAO,QAAQ,EAAI,CAAC,QAAQ,EAAM,EAAI,KAAY,CACvD,IAAI,EAAmB,EAWvB,OATI,OAAO,GAAU,SACnB,EAAmB,EAAgB,EAAM,CAChC,CAAE,SAAU,UAAW,SAAU,CAAC,SAAS,OAAO,EAAM,GACjE,EAAmB,EAAM,UAAU,EAGhC,EAAK,OAGH,GAAG,EAAK,GAAG,IAFT,GAGR,GAAG,CAOR,SAAS,EAAiB,EAAqB,EAAwD,CACrG,OAAO,OAAO,QAAQ,EAAQ,CAC3B,QAAQ,EAAM,CAAE,EAAK,KAAY,CAChC,IAAM,EAAY,EAAI,QAAQ,EAAgB,oBAAqB,GAAG,CAStE,OARI,IAAc,gBAChB,IAAiB,EAAa,kBAC9B,IAAiB,EAAa,sBAC9B,IAAiB,EAAa,aAEvB,EAGF,CAAE,GAAG,GAAO,GAAY,EAAO,EACrC,EAAE,CAAC,CAGV,IAAa,EAAuB,CAClC,gBACE,EACA,EACA,EAA0B,EAAE,CACN,CAItB,IAAM,EAAM,uBAAuB,EAAM,GAHtB,EAAQ,MAAM,EAAG,IAAM,EAAE,GAAG,cAAc,EAAE,GAAG,CAAC,CAAC,IAAI,GAAK,CAAE,EAAE,GAAI,GAAG,OAAQ,CAAC,CAG1C,GAFpC,EAAgB,EAAQ,GAIrC,EACH,GAAG,EAAgB,oBAAoB,iBAAkB,EAC1D,YACA,GAAG,GACD,EAEE,EAAO,CACX,UACA,QAAS,EACT,QAAS,EAAiB,EAAgB,KAAK,CAC/C,QACA,kBAAmB,GACnB,UAAW,CAAC,CAAC,EACd,CAED,MAAO,CACL,IAAK,8BACL,UAAW,yBACX,KAAM,EAAU,KAChB,OACA,MACD,EAGH,sBACE,EACA,EACA,EACA,EAA0B,EAAE,CACN,CAItB,IAAM,EAAM,uBAAuB,EAAa,UAAU,EAAM,GAH7C,EAAQ,MAAM,EAAG,IAAM,EAAE,GAAG,cAAc,EAAE,GAAG,CAAC,CAAC,IAAI,GAAK,CAAE,EAAE,GAAI,GAAG,OAAQ,CAAC,CAGnB,GAF3D,EAAgB,EAAQ,GAIrC,EACH,GAAG,EAAgB,oBAAoB,iBAAkB,EAC1D,YACA,kBACA,GAAG,GACD,EAEE,EAAO,CACX,UACA,QAAS,EACT,QAAS,EAAiB,EAAgB,EAAa,CACvD,QACA,kBAAmB,GACnB,UAAW,CAAC,CAAC,EACb,KAAM,EACN,kBACD,CAED,MAAO,CACL,IAAK,+BAA+B,IACpC,UAAW,0BAA0B,IACrC,KAAM,EAAU,KAChB,OACA,MACA,WAAa,GACN,GAGE,CACL,GAAG,EACH,QAAS,EAAK,SAAS,KACrB,CAAE,GAAG,EAAK,QAAS,KAAM,EAAK,QAAQ,KAAK,IAAI,GAAiB,2BAAA,CAA6B,CAC7F,EAAK,QACR,CAEJ,EAGH,SACE,EACA,EACA,EAA0B,EAAE,CACN,CAItB,IAAM,EAAM,aAAa,EAAM,GAHZ,EAAQ,MAAM,EAAG,IAAM,EAAE,GAAG,cAAc,EAAE,GAAG,CAAC,CAAC,IAAI,GAAK,CAAE,EAAE,GAAI,GAAG,OAAQ,CAAC,CAGpD,GAF1B,EAAgB,EAAQ,GAIrC,EACH,GAAG,EAAgB,oBAAoB,iBAAkB,EAC1D,YACA,GAAG,GACD,EAEE,EAAO,CACX,UACA,QAAS,EACT,QAAS,OAAO,QAAQ,EAAe,CACpC,QAAQ,EAAM,CAAE,EAAK,MACnB,CAAE,GAAG,GAAO,EAAI,QAAQ,WAAY,GAAG,EAAG,EAAO,EAAG,EAAE,CAAC,CAC5D,QACA,kBAAmB,GACnB,UAAW,CAAC,CAAC,EACb,KAAM,EACP,CAED,MAAO,CACL,IAAK,sBACL,UAAW,iBACX,KAAM,EAAU,KAChB,OACA,MACD,EAGH,SAAS,EAQgB,CACvB,GAAM,CAAE,QAAO,UAAS,UAAU,EAAE,CAAE,QAAQ,EAAE,CAAE,kBAAkB,GAAM,SAAQ,SAAU,EAExF,EAAM,aAAa,EAAM,GAAG,EAAgB,GAAG,EAAQ,GAAG,IAE9D,GAAO,OAAO,KAAK,EAAQ,CAAC,IAAI,GAAc,CAC5C,IAAM,EAAS,EAAQ,GACvB,OAAO,MAAM,QAAQ,EAAO,CAAG,EAAO,KAAK,IAAI,CAAG,GAClD,CAAC,KAAK,IAAI,CAEZ,GAAM,EACH,GAAG,EAAgB,oBAAoB,0BAA2B,EACnE,YACA,GAAG,GACD,EASE,EAAO,CACX,WAAY,UACZ,QATmB,EAAQ,IAAI,GAC3B,IAAU,SAAW,CAAC,EACjB,CAAE,QAAO,CAEX,CAAE,QAAO,QAAS,CAAE,0BAAA,CAA2B,CACtD,CAKA,QAAS,OAAO,QAAQ,EAAe,CACpC,QAAQ,EAAM,CAAE,EAAK,MACnB,CAAE,GAAG,GAAO,EAAI,QAAQ,WAAY,GAAG,EAAG,EAAO,EAAG,EAAE,CAAC,CAC5D,QACA,QACA,kBACA,OAAQ,GAAU,IAAA,GAClB,UAAW,CAAC,CAAC,EACb,QACD,CAED,MAAO,CACL,IAAK,sBACL,UAAW,iBACX,KAAM,EAAU,KAChB,OACA,MACA,WAAY,EACb,EAGH,OAAO,EASkB,CACvB,GAAM,CAAE,QAAO,UAAS,UAAS,kBAAiB,SAAQ,QAAO,UAAS,SAAU,EAEhF,EAAM,UAAU,EAAM,GAAG,EAAgB,GAAG,EAAQ,GAAG,IAE3D,GAAO,OAAO,KAAK,EAAQ,CAAC,IAAI,GAAc,CAC5C,IAAM,EAAS,EAAQ,GACvB,OAAO,MAAM,QAAQ,EAAO,CAAG,EAAO,KAAK,IAAI,CAAG,GAClD,CAAC,KAAK,IAAI,CAEZ,IAAM,EAAS,OAAO,OAAO,EAAE,CAAE,CAC/B,MAAO,EACP,OAAQ,GAAU,IAAA,GAClB,QACA,kBACA,QACA,GAAG,EACJ,CAAC,CAEF,MAAO,CACL,IAAK,EAAU,WAAW,sBAAuB,EAAO,CACxD,UAAW,EAAU,WAAW,cAAe,EAAO,CACtD,MACA,WAAY,EACZ,UACA,QACD,EAGH,uBACE,EACA,EACA,EAAsB,EAAE,CACxB,EACA,EACA,EACsB,CACtB,IAAM,EAAS,CACb,MAAO,EACP,SACA,QACA,GAAG,EACJ,CAEG,EAAM,kBAAkB,EAAM,GAAG,EAAQ,KAAK,IAAI,CAAC,GAAG,IAO1D,MALA,IAAO,OAAO,KAAK,EAAQ,CAAC,IAAI,GAAc,CAC5C,IAAM,EAAS,EAAQ,GACvB,OAAO,MAAM,QAAQ,EAAO,CAAG,EAAO,KAAK,IAAI,CAAG,GAClD,CAAC,KAAK,IAAI,CAEL,CACL,IAAK,EAAU,WAAW,+CAAgD,EAAO,CACjF,UAAW,EAAU,WAAW,uCAAwC,EAAO,CAC/E,MACA,UACA,QACA,UAAW,GACZ,EAEJ,CChVD,SAAgB,GACd,EACA,EACgC,CAShC,IAAM,EARa,EAAa,yBAC9B,EACA,KACA,CAAC,EAAe,CAChB,GACA,EAAE,CACH,EAE6B,EAAE,CAUhC,MATA,GAAQ,wBAA0B,EAS3B,EAPS,EAAqB,OAAO,CAC1C,MAAO,EAAa,SAAS,EAAY,CACzC,QAAS,CAAC,UAAU,CACpB,UACA,gBAAiB,EAAY,kBAAoB,QAClD,CAAC,CAEwD,CCnB5D,SAAgB,GACd,EACA,EACgC,CAChC,IAAM,EAAa,EAAa,yBAC9B,EACA,KACA,CAAC,EAAe,CAChB,GACA,EAAE,CACH,CAEK,EAAU,EAAa,KAAiB,EAAY,CAAE,yBAA0B,uBAAwB,CAAC,CAC/G,EAAQ,8BAAgC,GAAmB,QAC3D,EAAQ,kBAAoB,GAAqB,UACjD,EAAQ,wBAA0B,EAIlC,IAAM,EAAuB,CAFb,EAAa,kBAAkB,EAAY,CAErB,SAAS,iBAAiB,CAE1D,EAAU,EAAqB,OAAO,CAC1C,MAAO,EAAa,SAAS,EAAY,CACzC,QAAS,CAAC,iBAAiB,CAC3B,UACA,gBAAiB,EAAY,kBAAoB,QAClD,CAAC,CAEI,EAAc,CAAC,EAEf,EAAW,EAAyC,GAAe,EAAQ,CAKjF,OAHK,EAGE,EAFE,KCzBX,SAAgB,EAAmB,EAAyB,CAC1D,IAAM,EAAc,EAAkC,GAAa,aAAa,CAAC,CAC3E,EAAS,EAA6B,GAAe,QAAQ,CAAC,CAE9D,EAAe,EACnB,GAAqB,wBAAwB,CAC9C,CAEK,EAAsB,EAAa,KAGnC,EADoB,EAAiC,GAAgB,oBAAoB,CAAC,CAClD,MAAM,SAE9C,EAAwB,GAAqB,GAE7C,EAAY,EAA6C,EAAa,MAC1E,EAAiB,sBAAsB,GAAiB,mBAAoB,EAAa,KAAK,GAAG,CAAC,CAE9F,EAAe,GAAqB,EAAa,MAAM,GAAG,CAC1D,EAAiB,EAAa,MAAM,cAAc,IAAI,GAAK,EAAE,GAAG,CAoBtE,MAAO,CACL,cACA,cACA,SACA,YACA,eACA,gBAzBsB,EAAmC,EAAa,MACtE,EAAuB,oCAAoC,EAAe,CAAC,CAyB3E,OAvBa,GACb,EACA,EACD,CAqBC,UAnBgB,GAChB,EACA,EACD,CAiBC,wBACA,sBACA,cAhBA,EAAU,cACV,EAAY,cACZ,EAAO,aAeR,CC9DH,IAAa,GAAY,eAQzB,SAAgB,GAAoB,EAAqC,CACvE,GAAM,CAAE,cAAa,iBAAgB,kBAAmB,EAElD,EAAS,IAAW,CACpB,EAAQ,GAAoB,CAE5B,EAAwB,EAAqC,GAAkB,EAAE,IAAI,CAE3F,SAAS,EAAiB,EAAiB,CACzC,OAAO,EAAQ,eAAiB,CAAC,CAAC,GAAgB,QAChD,EAAqB,SAAS,CAC5B,MAAO,EAAY,MACnB,QAAS,EACT,QAAS,EAIT,gBAAiB,EAAY,kBAAoB,QACjD,SACD,CAAC,CAGN,SAAS,EAAU,EAAiB,CAClC,EAAM,EAAiB,EAAO,CAAC,CAGjC,SAAS,EAAQ,EAAoB,EAA8B,CACjE,GAAI,IAAe,EACjB,OAAO,GAAgB,EAAW,CAEpC,EAAO,MAAM,EAAgB,UAAU,GAAW,QAAQ,CAAC,CAG7D,IAAM,EAAgB,GACpB,EACA,EACA,EACA,GAAQ,EAAK,QACd,CAED,MAAO,CACL,GAAG,EACH,sBAAuB,EAAc,uBAAyB,CAAC,EAAQ,eAAiB,CAAC,GAAgB,OACzG,YACA,gBAAiB,EAAsB,MAAM,gBAC7C,YAAa,EAAsB,MAAM,YAC1C,CCtDH,SAAgB,GAA6B,EAA8C,CACzF,OAAO,EAA+B,GAAW,EAAqB,uBACpE,EAAQ,YAAY,MACpB,EAAQ,eACR,EAAQ,eACT,CAAC,CCXJ,SAAgB,GAAc,EAA6B,CACzD,GAAM,CAAE,EAAU,GAAgB,GAAa,GAAoB,iBAAkB,GAAK,CAE1F,EAAM,cAAgB,CACpB,GAAY,GAAgB,EAAY,GAAM,EAC7C,CAAC,EAAa,CAAC,CCDpB,IAAM,GAAY,iCAOlB,SAAgB,GAAwB,EAAkD,CACxF,IAAM,EAAW,GAAU,YAAY,OAEvC,OACE,EAAA,EAAA,KAAC,GAAyB,SAA1B,CAAmC,MAAO,aACxC,EAAA,EAAA,MAAC,EAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAW,MAAZ,CAAkB,IAAK,EAAY,CAAA,EAEnC,EAAA,EAAA,KAAC,EAAW,QAAZ,CAAA,SACG,EAAM,OACL,EAAA,EAAA,KAAC,EAAD,CAAM,OAAO,mBAAmB,QAAS,CAAE,MAAO,EAAM,MAAO,CAAI,CAAA,EACnE,EAAA,EAAA,KAAC,EAAD,CAAM,OAAO,sBAAwB,CAAA,CAEpB,CAAA,EAErB,EAAA,EAAA,MAAC,EAAW,KAAZ,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAD,CAAM,OAAO,OAAS,CAAA,EACtB,EAAA,EAAA,KAAC,EAAD,CACE,UAAU,YACV,QAAS,CAAE,YAAa,EAAY,SAAU,OAAQ,EAAQ,SAAS,mBAAoB,WAE3F,EAAA,EAAA,KAAC,EAAD,CAAM,OAAO,gBAAkB,CAAA,CACvB,CAAA,CACM,CAAA,CAAA,CACP,CAAA,CAAA,CACqB,CAAA,CCXxC,IAAM,GAAY,EAAgB,iBADT,uBACoC,CAM7D,SAAgB,GAAkB,EAA4C,CAC5E,GAAM,CAAE,cAAc,EAAE,EAAK,EAEvB,CAAE,oBAAqB,IAAqB,CAE5C,EAAkB,GAA0B,aAAa,CAEzD,EAAa,EAAmB,EAAY,CAE5C,EAAgB,EAAa,kBAAkB,EAAW,CAE1D,EAAyB,GAA6B,EAAc,CACpE,EAAgB,GAAoB,CAAE,GAAG,EAAe,GAAG,EAAY,CAAC,CAExE,EAAU,EAAa,WAAW,EAAY,EAAuB,CAE3E,EAAmB,GAAmB,mBAAmB,CACvD,MAAO,EAAY,OAAS,GAC5B,cAAe,CACb,cAAe,GACf,YAAa,YACb,kBAAmB,kBACpB,CACD,cAAe,GACf,QAAS,GAAoB,aAC9B,CAAC,CAAC,CAKH,IAAM,EACJ,EAAW,eAAiB,EAMxB,EACJ,EAAc,wBAEb,CAAC,EAAW,QAAU,EAAW,OAAO,gBACxC,CAAC,EAAW,WAAa,EAAW,UAAU,eAC/C,EAAuB,cACvB,CAAC,CAAC,EAME,EACJ,EAAc,OAAO,QACrB,EAAW,QAAQ,MAAM,cACzB,EAAW,WAAW,MAAM,aAQ9B,OALA,GAAc,EAAmB,CAE5B,GAIH,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,gBAAf,EACE,EAAA,EAAA,KAAC,GAAD,CACE,WAAY,EAAc,gBACb,cACb,WAAY,EAAmB,OAC/B,CAAA,CAED,CAAC,EAAc,kBACd,EAAA,EAAA,KAAC,EAAD,CACE,YAAa,EAAc,YACd,cACb,WAAY,EAAmB,OAC/B,CAAA,CAGF,CAAC,CAAC,EAAW,UAAU,MAAQ,CAAC,CAAC,EAAW,gBAAgB,OAC5D,EAAA,EAAA,KAAC,GAAD,CACe,cACb,YAAa,GAAS,YACtB,iBAAkB,CAChB,OAAQ,EAAW,cACnB,SAAU,EAAgB,cAC3B,CACD,QAAS,CAAE,YAAa,EAAY,OAAQ,OAAQ,EAAQ,OAAO,KAAM,CACzE,kBAAmB,EAAuB,WAC1C,CAAA,CAGH,IACC,EAAA,EAAA,MAAC,UAAD,CAAA,SAAA,CACG,GAEG,EAAA,EAAA,KAAC,GAAoB,SAArB,CAA8B,MAAO,CAAE,kBAAiB,WACtD,EAAA,EAAA,KAAC,GAAD,CACe,cACb,QAAS,EAAc,MACvB,OAAQ,EAAW,QAAQ,KAC3B,UAAW,EAAW,WAAW,KACjC,UAAW,CAAC,EAAY,aAAe,EAAW,UAAU,KAC5D,YAAa,EAAW,YAAY,KACpC,uBAAwB,KACxB,YAAA,GACA,SAAU,EAAa,aAAa,CACpC,mBAAsB,GACJ,mBAClB,CAAA,CAC2B,CAAA,EAE/B,EAAA,EAAA,KAAC,GAAD,CAAyB,MAAO,EAAY,MAAS,CAAA,EAGvD,EAAc,SAAW,EAAc,cACvC,EAAA,EAAA,KAAC,GAAD,CACE,WAAY,EAAc,WAC1B,UAAW,EAAc,UACzB,WAAY,EAAc,WAC1B,cAAA,GACA,CAAA,CAEI,CAAA,CAAA,CAER,IAhEC,EAAA,EAAA,KAAA,EAAA,SAAA,EAAK,CAAA"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{gt as e}from"./Dp9qJj1C.chunk.js";import{ut as t}from"./Dun43GrB.chunk.js";import{t as n}from"./
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{gt as e}from"./Dp9qJj1C.chunk.js";import{ut as t}from"./Dun43GrB.chunk.js";import{t as n}from"./jWpq99N3.chunk.js";var r=e(t());function i(e){return e.map(e=>e.statusCode).join(`:`)}function a(e,t,a){let o=Array.isArray(e)?e:[e];(0,r.useEffect)(()=>{o.forEach(e=>{n(e.statusCode,t,a)})},[i(o),t,a])}export{a as t};
|
|
2
|
+
//# sourceMappingURL=BKnxYKDu2.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"BKnxYKDu2.chunk.js","names":[],"sources":["../../../../libs/shared/src/hooks/UseHandleObjectError.ts"],"sourcesContent":["import { useEffect } from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { handleHttpError, HttpErrorMap, IgnoreHttpErrorMap } from 'libs/shared/errors/handlers/HttpErrorHandlers';\n\nfunction generateCacheKey(flightObjs: Array<Flight.Response<any>>): string {\n return flightObjs.map(obj => obj.statusCode).join(':');\n}\n\n// TODO: Change this to just `useHandleHttpError` and only accept a status code.\nexport function useHandleObjectError(\n _flightObjs: Flight.Response<any> | Array<Flight.Response<any>>,\n customErrors?: HttpErrorMap,\n ignoreErrors?: IgnoreHttpErrorMap\n): void {\n const flightObjs = Array.isArray(_flightObjs) ? _flightObjs : [_flightObjs];\n\n useEffect(() => {\n flightObjs.forEach(obj => {\n handleHttpError(obj.statusCode, customErrors, ignoreErrors);\n });\n }, [ generateCacheKey(flightObjs), customErrors, ignoreErrors ]);\n}\n"],"mappings":"uIAMA,SAAS,EAAiB,EAAiD,CACzE,OAAO,EAAW,IAAI,GAAO,EAAI,WAAW,CAAC,KAAK,IAAI,CAIxD,SAAgB,EACd,EACA,EACA,EACM,CACN,IAAM,EAAa,MAAM,QAAQ,EAAY,CAAG,EAAc,CAAC,EAAY,EAE3E,EAAA,EAAA,eAAgB,CACd,EAAW,QAAQ,GAAO,CACxB,EAAgB,EAAI,WAAY,EAAc,EAAa,EAC3D,EACD,CAAE,EAAiB,EAAW,CAAE,EAAc,EAAc,CAAC"}
|