{"version":3,"file":"static/js/service-game-search.3ee3b5c7.chunk.js","mappings":"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","sources":["app-react/services/game-search/game-search-result.ts","app-react/services/game-search/game-search.service.tsx","app-react/services/menu-items-common/menu-item-config-reader/menu-item-config-reader-base.ts","app-react/services/menu-items-common/menu-item-config-reader/menu-item-default-config-reader.ts"],"sourcesContent":["import {GameInfo, OpenGameParameters} from '../games/game-info';\r\nimport {IServiceFactoryExtended} from '../service-factory-extended.interface';\r\nimport {SuggestedLinkConfiguration} from '../configurations/config-data-sections/game-search-box.configuration';\r\nimport {OrbitUserFlowAnalyticsCategory} from \"../analytics/analytics.service.interface\";\r\n\r\nexport interface ISearchSuggestion {\r\n readonly key: string;\r\n readonly text: string;\r\n readonly linkIconClass: string;\r\n readonly type: string;\r\n readonly gameInfo: GameInfo | null;\r\n executeAction(): Promise;\r\n}\r\n\r\nexport const SUGGESTED_CATEGORIES = \"Suggested_Categories\";\r\n\r\n\r\nexport class GameSuggestion implements ISearchSuggestion {\r\n constructor(private services: IServiceFactoryExtended,\r\n private _gameInfo: GameInfo,\r\n private _analyticsLabel: string,\r\n private _index?: number,\r\n private _aiSortingType?: string) {\r\n\r\n }\r\n\r\n get gameInfo(): GameInfo {\r\n return this._gameInfo;\r\n }\r\n\r\n get type(): string {\r\n return this._analyticsLabel;\r\n }\r\n\r\n get key(): string {\r\n return this._gameInfo.gameType + '_' + this._gameInfo.title;\r\n }\r\n\r\n get text(): string {\r\n return this._gameInfo.title;\r\n }\r\n\r\n get linkIconClass(): string {\r\n return this._gameInfo.gameCategory;\r\n }\r\n\r\n async executeAction(): Promise {\r\n\r\n const openGameParams: OpenGameParameters = {\r\n isRealMode: true,\r\n pageName: 'Search',\r\n gameIndex: this._index,\r\n listTitle: this.type,\r\n aiSortingType: this._aiSortingType,\r\n showIntermediatePage: (await this.services.cmsSegmentation).isCstatus === false //Show intermediate page only for user with cStatus == false, TASK 1832892\r\n };\r\n\r\n await this._gameInfo.open(openGameParams);\r\n }\r\n}\r\n\r\n\r\nexport class SearchLinkSuggestion implements ISearchSuggestion {\r\n constructor(private _linkConfig: SuggestedLinkConfiguration,\r\n private services: IServiceFactoryExtended,\r\n private _analyticsAction: string) {\r\n if(this._linkConfig.menuItemKey) {\r\n\r\n }\r\n }\r\n\r\n\r\n\r\n get gameInfo(): GameInfo | null{\r\n return null;\r\n }\r\n\r\n get type(): string {\r\n return this._analyticsAction;\r\n }\r\n\r\n get key(): string {\r\n return this._linkConfig.text;\r\n }\r\n\r\n get text(): string {\r\n return this.services.translation.translate(this._linkConfig.text);\r\n }\r\n\r\n get linkIconClass(): string {\r\n return 'link';\r\n }\r\n\r\n async executeAction(): Promise {\r\n this.services.analytics.sendOrbitUserFlowEvent(OrbitUserFlowAnalyticsCategory.Search, this.type, this.text);\r\n if(this._linkConfig.linkId) {\r\n await this.services.linksNavigation.navigateLink({\r\n linkId: this._linkConfig.linkId,\r\n linkHash: this._linkConfig.linkHash\r\n });\r\n }\r\n else if(this._linkConfig.menuItemKey) {\r\n const menuItem = (await this.services.gameSearch).getMenuItemAction(this._linkConfig.menuItemKey);\r\n if(menuItem) {\r\n await menuItem.execute({\r\n linkHash: this._linkConfig.linkHash\r\n });\r\n } else {\r\n this.services.logger.error(`Could not find menu item action ${this._linkConfig.menuItemKey} for search suggestion link ${this.key}`);\r\n }\r\n } else {\r\n this.services.logger.error(`Navigation for search suggestion link ${this.key} not specified`)\r\n }\r\n\r\n }\r\n}\r\n\r\n\r\nexport class GameSearchResult {\r\n constructor(private _games: ISearchSuggestion[], private _suggestedCategories: ISearchSuggestion[], private _suggestedGames: ISearchSuggestion[]) {}\r\n\r\n get suggestedGames(): ISearchSuggestion[] {\r\n return this._suggestedGames;\r\n }\r\n\r\n get games(): ISearchSuggestion[] {\r\n return this._games;\r\n }\r\n\r\n get suggestedCategories(): ISearchSuggestion[] {\r\n return this._suggestedCategories;\r\n }\r\n}\r\n","import React, {createRef} from \"react\";\r\nimport {ServiceBase} from '../ServiceBase';\r\nimport {IGameSearchService} from './game-search.service.interface';\r\nimport {DomEventSubscription} from '../../../utils/event-listener-registration';\r\nimport {action, computed, observable, makeObservable} from 'mobx';\r\nimport {\r\n SearchLinkSuggestion,\r\n GameSearchResult,\r\n GameSuggestion,\r\n ISearchSuggestion,\r\n SUGGESTED_CATEGORIES\r\n} from './game-search-result';\r\nimport {SuggestedLinkConfiguration} from '../configurations/config-data-sections/game-search-box.configuration';\r\nimport {Check} from '@sparkware/app-utils';\r\nimport {IServiceFactoryExtended} from '../service-factory-extended.interface';\r\nimport {GameInfo, gameInfoComparerByTitle} from '../games/game-info';\r\nimport {IModalDialogHandler} from \"../dialog/dialog.service.interface\";\r\nimport {GameSearchComponent} from \"../../components/game-search/game-search.component\";\r\nimport {removeSpecialCharacters} from \"../../../utils/string-helpers\";\r\nimport {LIST_TYPE_ID} from \"../../../common/const/ai-trending-list-ids-map\";\r\nimport {IOverlayConsumer} from \"../overlay/overlay-consumer.interface\";\r\nimport {MenuItemKey} from \"../configurations/config-data-sections/generated-config-const\";\r\nimport {IMenuItemAction} from \"../menu-item-action-factory/menu-item-action.interface\";\r\nimport {\r\n MenuItemDefaultConfigReader\r\n} from \"../menu-items-common/menu-item-config-reader/menu-item-default-config-reader\";\r\nimport {OrbitUserFlowAnalyticsCategory} from \"../analytics/analytics.service.interface\";\r\nimport {IMenuItemActionFactoryService} from \"../menu-item-action-factory/menu-item-action-factory.service.interface\";\r\n\r\nexport class GameSearchService extends ServiceBase implements IGameSearchService, IOverlayConsumer {\r\n\r\n private _closeMobileSideMenuOnSearchClose: boolean = false;\r\n\r\n constructor(services: IServiceFactoryExtended,\r\n private readonly menuItemActionFactory: IMenuItemActionFactoryService) {\r\n super(services);\r\n\r\n makeObservable(this);\r\n\r\n this.services.overlay.registerConsumer(this);\r\n\r\n this._menuItemConfigReader = new MenuItemDefaultConfigReader(services);\r\n\r\n\r\n this.reaction(() => this.services.games.gamesMap,\r\n () => {\r\n //this is to avoid circular dependency between this service and ISearchSuggestion implementations\r\n setTimeout(() => {\r\n this._resetGamesSearchListCache();\r\n this.search(this.currentSearchText);\r\n });\r\n\r\n }, {\r\n fireImmediately: true\r\n });\r\n\r\n this.reaction(() => {\r\n return {\r\n trendingRecommendedGamesForPlayerByBets: this.services.aiEngine.trendingRecommendedGamesForPlayerByBets,\r\n aiRecommendedGames: this.services.aiEngine.aiRecommendedGames\r\n }\r\n },\r\n () => {\r\n if (!this.isSearchInProgress) {\r\n this._setDefaultSearchResult();\r\n }\r\n });\r\n\r\n this._setDefaultSearchResult();\r\n }\r\n\r\n private readonly _menuItemConfigReader: MenuItemDefaultConfigReader;\r\n\r\n private _miniOrbitSearchBoxDialogHandler: IModalDialogHandler | null = null;\r\n\r\n private _searchInputRef: React.RefObject = createRef();\r\n private _searchComponentRef: React.RefObject = createRef();\r\n private _searchResultComponentRef: React.RefObject = createRef();\r\n\r\n private _gamesSearchListCache: GameInfo[] | null = null;\r\n private get gamesSearchList(): GameInfo[] {\r\n if (!this._gamesSearchListCache) {\r\n this._gamesSearchListCache = this._buildGamesSearchList()\r\n }\r\n\r\n return this._gamesSearchListCache;\r\n }\r\n\r\n getMenuItemAction(key: MenuItemKey): IMenuItemAction {\r\n return this.menuItemActionFactory.getMenuItemAction(key, this._menuItemConfigReader);\r\n }\r\n _resetGamesSearchListCache() {\r\n this._gamesSearchListCache = null;\r\n }\r\n\r\n private _buildGamesSearchList(): GameInfo[] {\r\n return Object.values(this.services.games.gamesMap).sort(gameInfoComparerByTitle);\r\n }\r\n\r\n private _openMiniOrbitSearchDialog(): void {\r\n this.services.dialog.showModal((dialogHandler) => {\r\n this._miniOrbitSearchBoxDialogHandler = dialogHandler;\r\n return ();\r\n }, {\r\n title: ' ',\r\n onClosed: () => this.closeSearchResult(),\r\n forceFullscreenTablet: true\r\n });\r\n }\r\n\r\n get needsOverlay(): boolean {\r\n return this.isSearchBoxOpened;\r\n }\r\n\r\n getOverlayZIndex(): number | undefined {\r\n return undefined;\r\n }\r\n\r\n onOverlayClicked() {\r\n this.closeSearchResult();\r\n }\r\n\r\n private _openFullOrbitSearchResult() {\r\n this._disposeDocumentClickSubscription();\r\n /*\r\n * Handle search result close on document click\r\n * Wonder why we use setTimeout? From React 17 the events are bound to react-dom root element instead of window.document\r\n * Read more here: https://github.com/facebook/react/issues/20636\r\n */\r\n setTimeout(() => {\r\n this._documentClickSubscription = this.services.dom.subscribeTo.click(this._handleClickOutsideSearchComponent);\r\n });\r\n\r\n }\r\n\r\n get searchInputRef() {\r\n return this._searchInputRef;\r\n }\r\n\r\n get searchComponentRef() {\r\n return this._searchComponentRef;\r\n }\r\n\r\n get searchResultComponentRef() {\r\n return this._searchResultComponentRef;\r\n }\r\n\r\n async openSearchResult(): Promise {\r\n if (this.isSearchBoxOpened) { //No need to open it if is already opened\r\n return;\r\n }\r\n\r\n if (this.services.miniOrbit.isEnabled) {\r\n this._openMiniOrbitSearchDialog();\r\n } else {\r\n this._openFullOrbitSearchResult();\r\n }\r\n\r\n this._setIsSearchBoxOpened(true);\r\n\r\n this.searchInputRef?.current?.focus();\r\n\r\n if (this.services.device.isMobile) {\r\n const sideMenu = await this.services.sideMenu;\r\n this._closeMobileSideMenuOnSearchClose = !sideMenu.isMobileMenuOpen;\r\n if (!sideMenu.isMobileMenuOpen) {\r\n sideMenu.openMobileMenu();\r\n }\r\n }\r\n\r\n this.services.analytics.sendOrbitUserFlowEvent(\"Navigation\", this.services.routing.currentRoute?.data?.arenaType || 'Header', 'Search_Open');\r\n }\r\n\r\n\r\n private _documentClickSubscription: DomEventSubscription | null = null;\r\n\r\n private _disposeDocumentClickSubscription() {\r\n if (this._documentClickSubscription) {\r\n this._documentClickSubscription.dispose();\r\n this._documentClickSubscription = null;\r\n }\r\n }\r\n\r\n\r\n private _closeMiniOrbitSearchDialog = () => {\r\n if (this._miniOrbitSearchBoxDialogHandler) {\r\n this._miniOrbitSearchBoxDialogHandler.close();\r\n this._miniOrbitSearchBoxDialogHandler = null;\r\n }\r\n };\r\n\r\n\r\n private _closeFullOrbitSearchResult = () => {\r\n this._disposeDocumentClickSubscription();\r\n };\r\n\r\n private _handleClickOutsideSearchComponent = (event) => {\r\n if (this._searchComponentRef.current && !this._searchComponentRef.current.contains(event.target)) {\r\n this.closeSearchResult();\r\n }\r\n }\r\n\r\n closeSearchResult = async () => {\r\n if (!this.isSearchBoxOpened) { //if is already closed don't close it again\r\n return;\r\n }\r\n if (this.services.miniOrbit.isEnabled) {\r\n this._closeMiniOrbitSearchDialog();\r\n } else {\r\n this._closeFullOrbitSearchResult();\r\n }\r\n\r\n if (this._closeMobileSideMenuOnSearchClose) {\r\n this._closeMobileSideMenuOnSearchClose = false;\r\n (await this.services.sideMenu).closeMobileMenu();\r\n }\r\n\r\n this._setIsSearchBoxOpened(false);\r\n\r\n //Will called when search box close or when game is selected (And closing the results as well)\r\n if (this.isSearchInProgress)\r\n this.services.analytics.sendOrbitUserFlowEvent(OrbitUserFlowAnalyticsCategory.Search, 'Entry', this.currentSearchText);\r\n\r\n this._setCurrentSearchText('');\r\n this._setDefaultSearchResult();\r\n };\r\n\r\n private _getGameSuggestion() {\r\n const gamesSuggestions: GameSuggestion[] = [];\r\n let aiSortingTypeForAnalytics: string = \"byactiveusers\";\r\n let aiGames = this.services.aiEngine.trendingRecommendedGamesForPlayerByActiveUsers;\r\n\r\n if (!(aiGames?.length > 0)) {\r\n aiSortingTypeForAnalytics = 'config';\r\n aiGames = this.services.configuration.data.search.suggestedGames;\r\n }\r\n\r\n aiGames.forEach(gameType => {\r\n const gameInfo = this.services.games.gamesMap[gameType];\r\n\r\n if (!Check.isNullOrUndefined(gameInfo)) {\r\n gamesSuggestions.push(new GameSuggestion(this.services, gameInfo, `Suggested_Games_${aiSortingTypeForAnalytics}`, gamesSuggestions.length, aiSortingTypeForAnalytics))\r\n }\r\n });\r\n\r\n return gamesSuggestions.slice(0, 6);\r\n }\r\n\r\n private _setDefaultSearchResult() {\r\n const quickLinks = this.services.configuration.data.search.quickLinks\r\n .map(quickLinkConfig => new SearchLinkSuggestion(quickLinkConfig, this.services, 'Quick_Links'));\r\n\r\n this._setSearchResult(new GameSearchResult([], quickLinks, this._getGameSuggestion()));\r\n }\r\n\r\n @computed\r\n get isSearchInProgress(): boolean {\r\n return this.currentSearchText.length >= 2;\r\n }\r\n\r\n @observable.ref\r\n isSearchBoxOpened: boolean = false;\r\n @action.bound\r\n private _setIsSearchBoxOpened(value: boolean) {\r\n this.isSearchBoxOpened = value;\r\n }\r\n\r\n @observable.ref\r\n currentSearchText: string = '';\r\n\r\n @action.bound\r\n private _setCurrentSearchText(value: string): void {\r\n this.currentSearchText = value;\r\n }\r\n\r\n search(text: string): void {\r\n text = text || '';\r\n\r\n if (!this.isSearchBoxOpened && text.length > 0) {\r\n this.openSearchResult();\r\n }\r\n\r\n this._setCurrentSearchText(text);\r\n\r\n if (this.isSearchInProgress) { //we only search if there are at least 2 characters typed in the search box\r\n let regEx = new RegExp(removeSpecialCharacters(text), 'gi');\r\n this._setSearchResult(this._getSearchResult(regEx));\r\n } else {\r\n this._setDefaultSearchResult();\r\n }\r\n }\r\n\r\n\r\n private _getSearchResult(regEx: RegExp): GameSearchResult {\r\n let games = this._searchForGames(regEx);\r\n let suggestedCategories: ISearchSuggestion[];\r\n if (games.length === 0) {\r\n suggestedCategories = this._getDefaultSuggestedCategories();\r\n } else {\r\n suggestedCategories = this._searchForSuggestedCategories(regEx);\r\n }\r\n\r\n return new GameSearchResult(games, suggestedCategories, this._getGameSuggestion());\r\n }\r\n\r\n @observable.ref\r\n searchResult: GameSearchResult;\r\n\r\n @action.bound\r\n private _setSearchResult(value: GameSearchResult) {\r\n this.searchResult = value;\r\n }\r\n\r\n private _searchForGames(regEx: RegExp): ISearchSuggestion[] {\r\n\r\n const result: GameInfo[] = [];\r\n const gameTypeToGameInfoObj = {};\r\n const themesIds = this.services.gamesTheme.findThemes(regEx);\r\n const vendorsIds = this.services.gamesVendor.findVendors(regEx);\r\n\r\n this.gamesSearchList.forEach((gameInfo) => {\r\n if (removeSpecialCharacters(gameInfo.title).match(regEx)\r\n || this._matchGameByTheme(gameInfo, themesIds)\r\n || this._matchGameByVendor(gameInfo, vendorsIds)) {\r\n result.push(gameInfo);\r\n gameTypeToGameInfoObj[gameInfo.gameType] = gameInfo;\r\n }\r\n });\r\n\r\n const sortedResultGameTypes = this.services.aiEngine.sortGamesByAI(result.map(gameInfo => gameInfo.gameType), LIST_TYPE_ID.ACTIVE_USERS);\r\n return sortedResultGameTypes.map((gameType, index) => new GameSuggestion(this.services, gameTypeToGameInfoObj[gameType], `Search_Results`, index, 'byactiveusers'));\r\n }\r\n\r\n private _matchGameByTheme(gameInfo: GameInfo, themesIds: number[]) {\r\n for (let themeId of gameInfo.themeIds) {\r\n if (themesIds.includes(themeId)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private _matchGameByVendor(gameInfo: GameInfo, vendorsIds: number[]) {\r\n return vendorsIds.includes(gameInfo.vendorId)\r\n }\r\n\r\n private _searchForSuggestedCategories(regEx: RegExp): ISearchSuggestion[] {\r\n let suggestedCategoriesOptions = this.services.configuration.data.search.suggestedCategories.suggestedCategoriesOptions;\r\n if (!suggestedCategoriesOptions) {\r\n return this._getDefaultSuggestedCategories();\r\n }\r\n\r\n for (let i = 0; i < suggestedCategoriesOptions.length; i++) {\r\n let option = suggestedCategoriesOptions[i];\r\n let result: ISearchSuggestion[] = [];\r\n if (option.search.match(regEx) && option.categories && option.categories.length > 0) {\r\n result = option.categories.map(categoryConfig => this._createSuggestedCategory(categoryConfig))\r\n // TODO: Remove this after updating the Check signatures. Let type inference do the magic\r\n .filter((categorySuggestion): categorySuggestion is ISearchSuggestion => !Check.isNullOrUndefined(categorySuggestion));\r\n }\r\n\r\n if (result.length > 0) {\r\n return result;\r\n }\r\n }\r\n\r\n return this._getDefaultSuggestedCategories();\r\n }\r\n\r\n private _getDefaultSuggestedCategories(): ISearchSuggestion[] {\r\n return this.services.configuration.data.search.suggestedCategories.defaultSuggestedCategories\r\n .map(suggestedCategory => this._createSuggestedCategory(suggestedCategory))\r\n // TODO: Remove this after updating the Check signatures. Let type inference do the magic\r\n .filter((suggestion): suggestion is ISearchSuggestion => !Check.isNullOrUndefined(suggestion));\r\n }\r\n\r\n _createSuggestedCategory(categoryConfig: SuggestedLinkConfiguration): ISearchSuggestion | null {\r\n if (categoryConfig.gameID) {\r\n let gameInfo = this.services.games.gamesMap[categoryConfig.gameID];\r\n if (!gameInfo) {\r\n this.services.logger.error(`Game type ${categoryConfig.gameID} is in the search suggested categories but this game is not configured to be in this site!`);\r\n return null;\r\n }\r\n return new GameSuggestion(this.services, gameInfo, SUGGESTED_CATEGORIES);\r\n }\r\n return new SearchLinkSuggestion(categoryConfig, this.services, SUGGESTED_CATEGORIES);\r\n }\r\n}\r\n","import {\r\n IMenuItemConfigReader,\r\n MenuItemAnalyticsCategoryAndLabel,\r\n MenuItemConfigurationExtended\r\n} from \"./menu-item-config-reader.interface\";\r\nimport {\r\n MenuItemConfiguration,\r\n MenuItemsConfiguration\r\n} from \"../../configurations/config-data-sections/menu-items.configuration\";\r\nimport {IServiceFactoryExtended} from \"../../service-factory-extended.interface\";\r\nimport {Check} from \"@sparkware/app-utils\";\r\nimport {AnalyticsConfiguration} from \"../../configurations/config-data-sections/analytics.configuration\";\r\n\r\nexport abstract class MenuItemConfigReaderBase implements IMenuItemConfigReader {\r\n constructor(protected readonly services: IServiceFactoryExtended) {\r\n }\r\n\r\n protected abstract _getMenuItemsConfigOverrides(): MenuItemsConfiguration | undefined;\r\n protected abstract _getAnalyticsCategoryAndLabel(): MenuItemAnalyticsCategoryAndLabel | null;\r\n\r\n getMenuItemConfig(key: string): MenuItemConfigurationExtended {\r\n const allConfigs = this.services.configuration.data;\r\n const menuItemConfig: MenuItemConfiguration | undefined = allConfigs.menuItems[key];\r\n if(!menuItemConfig) {\r\n throw new Error(`Missing configuration for ${key} menu item`);\r\n }\r\n\r\n const menuItemsOverrides = this._getMenuItemsConfigOverrides();\r\n\r\n const menuItemConfigOverride: MenuItemConfiguration | undefined = menuItemsOverrides && menuItemsOverrides[key];\r\n\r\n\r\n\r\n const menuItemConfigProxyHandler = {\r\n get: (target: any, prop: string) => {\r\n if(prop === 'analytics') {\r\n const categoryAndLabel = this._getAnalyticsCategoryAndLabel();\r\n if(categoryAndLabel) {\r\n const analyticsConfig: AnalyticsConfiguration = {\r\n action: key,\r\n ...categoryAndLabel\r\n }\r\n return analyticsConfig;\r\n } else {\r\n return null;\r\n }\r\n } else {\r\n const overridePropValue = menuItemConfigOverride && menuItemConfigOverride[prop];\r\n if(Check.isUndefined(overridePropValue)) {\r\n return target[prop];\r\n } else {\r\n return overridePropValue;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return new Proxy(menuItemConfig, menuItemConfigProxyHandler);\r\n\r\n\r\n }\r\n}\r\n\r\n","import {MenuItemConfigReaderBase} from \"./menu-item-config-reader-base\";\r\nimport {\r\n MenuItemsConfiguration\r\n} from \"../../configurations/config-data-sections/menu-items.configuration\";\r\nimport {MenuItemAnalyticsCategoryAndLabel} from \"./menu-item-config-reader.interface\";\r\n\r\nexport class MenuItemDefaultConfigReader extends MenuItemConfigReaderBase {\r\n protected _getMenuItemsConfigOverrides(): MenuItemsConfiguration | undefined {\r\n return undefined;\r\n }\r\n\r\n protected _getAnalyticsCategoryAndLabel(): MenuItemAnalyticsCategoryAndLabel | null {\r\n return null;\r\n }\r\n}"],"names":["SUGGESTED_CATEGORIES","GameSuggestion","services","_gameInfo","_analyticsLabel","_index","_aiSortingType","this","gameType","title","gameCategory","type","cmsSegmentation","isCstatus","openGameParams","isRealMode","pageName","gameIndex","listTitle","aiSortingType","showIntermediatePage","open","SearchLinkSuggestion","_linkConfig","_analyticsAction","menuItemKey","text","translation","translate","analytics","sendOrbitUserFlowEvent","OrbitUserFlowAnalyticsCategory","linkId","linksNavigation","navigateLink","linkHash","gameSearch","menuItem","getMenuItemAction","execute","logger","error","key","GameSearchResult","_games","_suggestedCategories","_suggestedGames","GameSearchService","observable","action","menuItemActionFactory","_closeMobileSideMenuOnSearchClose","_menuItemConfigReader","_miniOrbitSearchBoxDialogHandler","_searchInputRef","createRef","_searchComponentRef","_searchResultComponentRef","_gamesSearchListCache","_documentClickSubscription","_closeMiniOrbitSearchDialog","close","_closeFullOrbitSearchResult","_disposeDocumentClickSubscription","_handleClickOutsideSearchComponent","event","current","contains","target","closeSearchResult","isSearchBoxOpened","miniOrbit","isEnabled","sideMenu","closeMobileMenu","_setIsSearchBoxOpened","isSearchInProgress","currentSearchText","_setCurrentSearchText","_setDefaultSearchResult","makeObservable","overlay","registerConsumer","MenuItemDefaultConfigReader","reaction","games","gamesMap","setTimeout","_resetGamesSearchListCache","search","fireImmediately","trendingRecommendedGamesForPlayerByBets","aiEngine","aiRecommendedGames","_buildGamesSearchList","Object","values","sort","gameInfoComparerByTitle","dialog","showModal","dialogHandler","onClosed","forceFullscreenTablet","dom","subscribeTo","click","_openMiniOrbitSearchDialog","_openFullOrbitSearchResult","searchInputRef","focus","device","isMobile","isMobileMenuOpen","openMobileMenu","routing","currentRoute","data","arenaType","dispose","gamesSuggestions","aiSortingTypeForAnalytics","aiGames","trendingRecommendedGamesForPlayerByActiveUsers","length","configuration","suggestedGames","forEach","gameInfo","Check","push","slice","quickLinks","map","quickLinkConfig","_setSearchResult","_getGameSuggestion","value","openSearchResult","regEx","RegExp","removeSpecialCharacters","_getSearchResult","suggestedCategories","_searchForGames","_getDefaultSuggestedCategories","_searchForSuggestedCategories","searchResult","result","gameTypeToGameInfoObj","themesIds","gamesTheme","findThemes","vendorsIds","gamesVendor","findVendors","gamesSearchList","match","_matchGameByTheme","_matchGameByVendor","sortGamesByAI","LIST_TYPE_ID","index","themeIds","themeId","includes","vendorId","suggestedCategoriesOptions","i","option","categories","categoryConfig","_createSuggestedCategory","filter","categorySuggestion","defaultSuggestedCategories","suggestedCategory","suggestion","gameID","ServiceBase","computed","MenuItemConfigReaderBase","menuItemConfig","menuItems","Error","menuItemsOverrides","_getMenuItemsConfigOverrides","menuItemConfigOverride","Proxy","get","prop","categoryAndLabel","_getAnalyticsCategoryAndLabel","overridePropValue"],"sourceRoot":""}