{"version":3,"file":"static/js/service-game-runner.7c73f5da.chunk.js","mappings":"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","sources":["app-react/basic-components/loading-dots/boxes/loading-dot.box.ts","app-react/basic-components/loading-dots/boxes/loading-dots.box.ts","app-react/basic-components/loading-dots/loading-dots.component.tsx","app-react/components/game-window/game-css-constants.ts","app-react/components/game-window/header-bar/common/boxes/close-game-button/game-header-bar-close-button.box.ts","app-react/services/game-runner/running-game-browser-tab-controller.ts","app-react/services/game-runner/loading-indicators/game-loading-indicator-base.model.ts","app-react/components/game-window/loading-indicators/hybrid-embedded/boxes/root/hybrid-embedded-game-loading-indicator-root.box.ts","app-react/components/game-window/loading-indicators/hybrid-embedded/boxes/header/hybrid-embedded-game-loading-indicator-header.box.ts","app-react/components/game-window/loading-indicators/hybrid-embedded/boxes/content/hybrid-embedded-game-loading-indicator-content.box.ts","app-react/components/game-window/loading-indicators/hybrid-embedded/boxes/spinner/hybrid-embedded-game-loading-indicator-spinner.box.ts","app-react/components/game-window/loading-indicators/hybrid-embedded/boxes/progress/hybrid-embedded-game-loading-indicator-progress.box.ts","app-react/themes/defaults/icons/loading-circle-large.icon.tsx","app-react/components/game-window/loading-indicators/hybrid-embedded/hybrid-embedded-game-loading-indicator.component.tsx","app-react/services/game-runner/loading-indicators/hybrid-embedded-game-loading-indicator.model.tsx","app-react/components/game-window/loading-indicators/web-app/web-app-game-loading-indicator.component.tsx","app-react/services/game-runner/loading-indicators/web-app-game-loading-indicator.model.tsx","app-react/services/game-runner/last-game-played.model.ts","app-react/services/game-runner/game-runner.service.ts","app-react/services/storage/session-storage-keys.ts"],"sourcesContent":["import styled, {keyframes} from \"styled-components\";\n\nconst Load = keyframes`\n 0%,\n 80%,\n 100% {\n box-shadow: 0 1.5em 0 -1.3em;\n }\n 40% {\n box-shadow: 0 1.5em 0 0;\n }\n`;\n\nexport const LoadingDotBox = styled.div<{animationDelay: string}>`\n border-radius: 50%;\n width: 1.6rem;\n height: 1.5rem;\n margin-left: 25px;\n animation: ${Load} 1.7s infinite ease-in-out;\n animation-delay: ${props => props.animationDelay};\n`","import styled from \"styled-components\";\n\n\nexport const LoadingDotsBox = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n align-content: center;\n`","import React from \"react\";\nimport {OrbitComponent} from \"../../components/base-components/orbit-component/orbit-component\";\nimport {observer} from \"mobx-react\";\nimport {LoadingDotBox} from \"./boxes/loading-dot.box\";\nimport {LoadingDotsBox} from \"./boxes/loading-dots.box\";\n\nexport const LoadingDotsComponent = observer(class LoadingDotsComponent extends OrbitComponent {\n render() {\n return (\n \n \n \n );\n }\n\n});","\nexport const GAME_PC_BUTTON_WIDTH = '20px';\nexport const GAME_PC_BUTTON_HEIGHT = '20px';\n\n\nexport const GAME_MOBILE_BUTTON_WIDTH = '14px';\nexport const GAME_MOBILE_BUTTON_HEIGHT = '14px';","import styled from \"styled-components\";\nimport {XCloseButtonBox} from \"../../../../../../basic-ui-components/x-close-button/x-close-button.box\";\nimport {\n GAME_MOBILE_BUTTON_HEIGHT,\n GAME_MOBILE_BUTTON_WIDTH, GAME_PC_BUTTON_HEIGHT, GAME_PC_BUTTON_WIDTH\n} from \"../../../../game-css-constants\";\n\nexport const GameHeaderBarCloseButtonBox = styled(XCloseButtonBox)`\n width: ${GAME_PC_BUTTON_WIDTH};\n height: ${GAME_PC_BUTTON_HEIGHT};\n\n @media ${props => props.theme.mediaQuery.sAndBelow} {\n width: ${GAME_MOBILE_BUTTON_WIDTH};\n height: ${GAME_MOBILE_BUTTON_HEIGHT};\n }\n`\n\n","import {IServiceFactoryExtended} from \"../service-factory-extended.interface\";\nimport {GameRunnerService} from \"./game-runner.service\";\nimport {reaction} from \"mobx\";\nimport {GameInfo} from \"../games/game-info\";\nimport {Check} from \"@sparkware/app-utils\";\nimport {IRunningGameBrowserTabController} from \"./running-game-browser-tab-controller.interface\";\nimport {NullableString} from \"../../../common/types/nullable-types\";\nimport {LocalStorageKeys} from \"../storage/local-storage-keys\";\n\nexport class RunningGameBrowserTabController implements IRunningGameBrowserTabController {\n constructor(private readonly gameRunner: GameRunnerService,\n private readonly services: IServiceFactoryExtended) {\n reaction(() => gameRunner.currentRunningGame,\n (runningGame) => {\n if(runningGame) {\n this._setActiveGame(runningGame.gameContext.gameInfo.gameType);\n this._activeGameInAnotherTabDetectionTimer = setInterval(this._detectActiveGameInAnotherTab, 1000);\n } else {\n clearTimeout(this._activeGameInAnotherTabDetectionTimer);\n this._onGameClosed();\n }\n },{fireImmediately:true});\n }\n\n private _activeGameInAnotherTabDetectionTimer: any = null;\n\n private _detectActiveGameInAnotherTab = () => {\n if(this.isGameRunningInAnotherTab) {\n this.gameRunner.currentRunningGame.closeGame({\n shouldSuggestNextGame: false\n });\n }\n }\n\n get isGameRunningInAnotherTab(): boolean {\n if(!this.activeGame) {\n return false;\n }\n\n return this._currentBrowserTabId !== this._activeGameTabId;\n }\n\n private get _currentBrowserTabId(): string {\n return this.services.sdk.getCurrentBrowserTabId();\n }\n\n private get _activeGameTabId(): NullableString {\n return this.services.localStorage.getItem(LocalStorageKeys.currentRunningGameTab);\n }\n\n private _setActiveGame(gameType: number): void {\n this.services.localStorage.setItem(LocalStorageKeys.currentRunningGameType, gameType);\n this.services.localStorage.setItem(LocalStorageKeys.currentRunningGameTab, this._currentBrowserTabId);\n }\n\n private _onGameClosed(): void {\n if(!this.isGameRunningInAnotherTab) {\n // On game close we clear local storage only if the closed game was in the current tab otherwise\n // we might also kill the game that was just opened in another tab\n this.services.localStorage.removeItem(LocalStorageKeys.currentRunningGameType);\n this.services.localStorage.removeItem(LocalStorageKeys.currentRunningGameTab);\n }\n }\n\n\n get activeGame(): GameInfo | null {\n const gameType = parseInt(this.services.localStorage.getItem(LocalStorageKeys.currentRunningGameType));\n if(Check.isNumber(gameType)) {\n return this.services.games.gamesMap[gameType];\n }\n\n return null;\n }\n}","import React from \"react\";\nimport {IServiceFactoryExtended} from \"../../service-factory-extended.interface\";\nimport {IGameLoadingIndicatorModel} from \"./game-loading-indicator-model.interface\";\n\nexport abstract class GameLoadingIndicatorBaseModel implements IGameLoadingIndicatorModel {\n constructor(protected readonly services: IServiceFactoryExtended) {\n }\n\n abstract render(): React.ReactElement;\n\n get isHidden(): boolean {\n return this.services.dialog.hasOpenDialogs || this.services.sdk.hasOpenOverlays;\n }\n\n dispose(): void {\n\n }\n}","import styled from \"styled-components\";\n\nexport const HybridEmbeddedGameLoadingIndicatorRootBox = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n align-content: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n`","import styled from \"styled-components\";\nimport {PC_HORIZONTAL_SPACE_BETWEEN_ITEMS} from \"../../../../../../basic-components/space-between-items-consts\";\n\n\nexport const HybridEmbeddedGameLoadingIndicatorHeaderBox = styled.div`\n display: flex;\n flex-direction: row;\n align-items: flex-end;\n justify-content: flex-end;\n align-content: flex-end;\n width: 100%;\n padding: 4px ${PC_HORIZONTAL_SPACE_BETWEEN_ITEMS()} 4px 4px;\n \n`","import styled from \"styled-components\";\n\nexport const HybridEmbeddedGameLoadingIndicatorContentBox = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n align-content: center;\n height: 100%;\n width: 100%;\n font-size: 1.3rem;\n`","import styled from \"styled-components\";\n\nexport const HybridEmbeddedGameLoadingIndicatorSpinnerBox = styled.div`\n width: 100px;\n height: 100px;\n border-radius: 50%;\n margin-top: 10px;\n`","import styled from \"styled-components\";\n\nexport const HybridEmbeddedGameLoadingIndicatorProgressCircle1Box = styled.div`\n height:100px;\n width:100px;\n border-radius: 50%;\n background: ${props => props.theme.colors.boxBorderContrast};\n margin-top: 10px;\n`\n\nexport const HybridEmbeddedGameLoadingIndicatorProgressCircle2Box = styled.div<{angle: number}>`\n height: 100%;\n width: 100%;\n border-radius: 50%;\n background: conic-gradient(${props => props.theme.colors.brandPrimary} ${props => props.angle}deg, transparent ${props => props.angle}deg 100%);\n`\n\nexport const HybridEmbeddedGameLoadingIndicatorProgressCircle3Box = styled.div`\n position:relative;\n display: flex;\n justify-content: center;\n align-items: center;\n align-content: center;\n height:92%;\n width:92%;\n top:4%;\n left:4%;\n border-radius: 50%;\n background-color: ${props => props.theme.colors.backgroundDark};\n color: ${props => props.theme.colors.brandPrimary};\n`\n","import * as React from \"react\";\nimport {ISvgIconProps, SvgIcon} from \"../../../basic-ui-components/icon/svg-icon/svg.icon\";\n\nexport class LoadingCircleLargeIcon extends React.Component {\n render() {\n return \n \n \n\n \n \n \n \n\n \n \n\n \n \n \n ;\n }\n}\n","import React from \"react\";\nimport {OrbitComponent} from \"../../../base-components/orbit-component/orbit-component\";\nimport {observer} from \"mobx-react\";\nimport {\n IHybridEmbeddedGameLoadingIndicatorViewModel\n} from \"../../../../services/game-runner/loading-indicators/hybrid-embedded-game-loading-indicator-view-model.interface\";\nimport {HybridEmbeddedGameLoadingIndicatorRootBox} from \"./boxes/root/hybrid-embedded-game-loading-indicator-root.box\";\nimport {\n HybridEmbeddedGameLoadingIndicatorHeaderBox\n} from \"./boxes/header/hybrid-embedded-game-loading-indicator-header.box\";\nimport {\n HybridEmbeddedGameLoadingIndicatorContentBox\n} from \"./boxes/content/hybrid-embedded-game-loading-indicator-content.box\";\nimport {\n HybridEmbeddedGameLoadingIndicatorSpinnerBox\n} from \"./boxes/spinner/hybrid-embedded-game-loading-indicator-spinner.box\";\nimport {\n HybridEmbeddedGameLoadingIndicatorProgressCircle1Box,\n HybridEmbeddedGameLoadingIndicatorProgressCircle2Box, HybridEmbeddedGameLoadingIndicatorProgressCircle3Box\n} from \"./boxes/progress/hybrid-embedded-game-loading-indicator-progress.box\";\nimport {LoadingCircleLargeIcon} from \"../../../../themes/defaults/icons/loading-circle-large.icon\";\nimport {\n GameHeaderBarCloseButtonBox\n} from \"../../header-bar/common/boxes/close-game-button/game-header-bar-close-button.box\";\n\ninterface HybridEmbeddedGameLoadingIndicatorComponentProps {\n viewModel: IHybridEmbeddedGameLoadingIndicatorViewModel;\n}\n\nexport const HybridEmbeddedGameLoadingIndicatorComponent = observer(\n class HybridEmbeddedGameLoadingIndicatorComponent extends OrbitComponent {\n\n private _onCloseButtonClick = () => {\n this.props.viewModel.closeLoadingIndicator();\n }\n\n private _renderPackageDownloadStatusLabel() {\n if(this.props.viewModel.totalPackages > 1) {\n return (\n
\n {this.services.translation.translate('HYBRID_EMBEDDED_GAME_LOADING_PACKAGES_PROGRESS', {packagesStatus: `${this.props.viewModel.currentPackage}/${this.props.viewModel.totalPackages}`})}\n
\n );\n }\n\n return null;\n }\n\n private _renderConnectingSpinner() {\n return (\n <>\n
\n {this.services.translation.translate('HYBRID_EMBEDDED_GAME_LOADING_SPINNER_LABEL')}\n
\n \n \n \n \n );\n }\n\n private _renderProgressIndicator() {\n return (\n <>\n {this._renderPackageDownloadStatusLabel()}\n \n \n \n {`${this.props.viewModel.downloadPercentage}%`}\n \n \n \n \n\n )\n }\n\n private _renderContent() {\n if(this.props.viewModel.downloadPercentage === 0 && this.props.viewModel.currentPackage === 1) {\n return this._renderConnectingSpinner();\n } else {\n return this._renderProgressIndicator();\n }\n }\n\n render() {\n return (\n \n \n \n \n \n {this._renderContent()}\n \n \n )\n }\n }\n);","import React from \"react\";\nimport {GameLoadingIndicatorBaseModel} from \"./game-loading-indicator-base.model\";\nimport {\n HybridEmbeddedGameLoadingIndicatorComponent\n} from \"../../../components/game-window/loading-indicators/hybrid-embedded/hybrid-embedded-game-loading-indicator.component\";\nimport {\n IHybridEmbeddedGameLoadingIndicatorViewModel\n} from \"./hybrid-embedded-game-loading-indicator-view-model.interface\";\nimport {IServiceFactoryExtended} from \"../../service-factory-extended.interface\";\nimport {CGPEventSubscription} from \"../../sdk/cgp-sdk.interface\";\nimport { observable, runInAction, makeObservable } from \"mobx\";\nimport {GameRunnerService} from \"../game-runner.service\";\nimport {ON_DEMAND} from \"../../../../sdk/src/services/hybrid/native/native_const\";\nimport {Check, TimeSpan} from \"@sparkware/app-utils\";\n\n\nconst TOASTER_TIMEOUT = TimeSpan.fromSeconds(15);\n\nexport class HybridEmbeddedGameLoadingIndicatorModel extends GameLoadingIndicatorBaseModel implements IHybridEmbeddedGameLoadingIndicatorViewModel {\n constructor(services: IServiceFactoryExtended, private readonly gameRunner: GameRunnerService) {\n super(services);\n\n makeObservable(this, {\n downloadPercentage: observable.ref,\n currentPackage: observable.ref,\n totalPackages: observable.ref\n });\n\n this._sdkEventsSubscriptions.push(services.sdk.events.onHybridEmbeddedGameLoadingIndicatorUpdateV1(percentage => {\n this._updateProgress({\n percentage: percentage,\n numberOfPackages: '1/1'\n });\n }));\n\n this._sdkEventsSubscriptions.push(services.sdk.events.onHybridEmbeddedGameLoadingIndicatorUpdateV2(data => {\n this._updateProgress({\n percentage: data.statusBar,\n numberOfPackages: data.numberOfPackages\n });\n }));\n\n\n this._slowConnectionToasterTimer = setTimeout(this._showToaster, TOASTER_TIMEOUT.totalMilliseconds);\n\n this.services.analytics.sendAnalytics(ON_DEMAND.ON_DEMAND_CATEGORY, 'show_hybrid_loader');\n }\n\n\n private _sdkEventsSubscriptions: CGPEventSubscription[] = [];\n private _slowConnectionToasterTimer: any = null;\n\n private _showToaster = () => {\n this.services.toaster.showStandardToast({\n id: 'hybrid_embedded_game_loading_indicator_toaster',\n toastOptions: {\n timeout: TimeSpan.fromSeconds(10)\n },\n contentProps: {\n title: this.services.translation.translate('HYBRID_EMBEDDED_GAME_LOADING_SLOW_CONNECTION_TOASTER_TITLE'),\n message: this.services.translation.translate('HYBRID_EMBEDDED_GAME_LOADING_SLOW_CONNECTION_TOASTER_SUBTITLE'),\n },\n onToastShown: () => {\n this.services.analytics.sendAnalytics(ON_DEMAND.ON_DEMAND_CATEGORY, 'slow_internet_toaster', TOASTER_TIMEOUT.totalSeconds.toString(), this.downloadPercentage);\n }\n })\n\n }\n\n private _clearToasterTimer(): void {\n if(this._slowConnectionToasterTimer) {\n clearTimeout(this._slowConnectionToasterTimer);\n this._slowConnectionToasterTimer = null;\n }\n }\n\n private _updateProgress = (data: {percentage: number | string; numberOfPackages: string}) => {\n runInAction(() => {\n if(Check.isNumber(data.percentage)) {\n this.downloadPercentage = data.percentage\n } else {\n const percentage = parseInt(data.percentage);\n if(!Check.isNumber(percentage)) {\n this.services.logger.error('Hybrid embedded game download percentage is not a number!');\n this.downloadPercentage = 50; // just put something there\n } else {\n this.downloadPercentage = percentage;\n }\n }\n\n const parts = data.numberOfPackages.split('/');\n this.currentPackage = parseInt(parts[0]?.trim());\n this.totalPackages = parseInt(parts[1]?.trim());\n\n if(!Check.isNumber(this.currentPackage)) {\n this.currentPackage = 1;\n }\n\n if(!Check.isNumber(this.totalPackages)) {\n this.totalPackages = this.currentPackage;\n }\n\n //if download percentage is more than 10% then we don't show the slow connection toaster anymore\n if(this.downloadPercentage >= 10) {\n this._clearToasterTimer();\n }\n });\n }\n\n downloadPercentage: number = 0;\n\n currentPackage: number = 1;\n\n totalPackages: number = 1;\n\n\n dispose() {\n super.dispose();\n this._sdkEventsSubscriptions.forEach(s => s.off());\n this._sdkEventsSubscriptions = [];\n this._clearToasterTimer();\n }\n\n render(): React.ReactElement {\n return (\n \n );\n }\n\n closeLoadingIndicator(): void {\n\n this.gameRunner.closeGameLoadingIndicator();\n this.services.sdk.eventsTrigger.hybridGameLoadingIndicatorClosed();\n\n }\n}","import React from \"react\";\nimport {OrbitComponent} from \"../../../base-components/orbit-component/orbit-component\";\nimport {LoadingDotsComponent} from \"../../../../basic-components/loading-dots/loading-dots.component\";\nimport {observer} from \"mobx-react\";\n\nexport const WebAppGameLoadingIndicatorComponent = observer(class WebAppGameLoadingIndicatorComponent extends OrbitComponent {\n render() {\n return (\n \n );\n }\n});","import React from \"react\";\nimport {GameLoadingIndicatorBaseModel} from \"./game-loading-indicator-base.model\";\nimport {\n WebAppGameLoadingIndicatorComponent\n} from \"../../../components/game-window/loading-indicators/web-app/web-app-game-loading-indicator.component\";\n\nexport class WebAppGameLoadingIndicatorModel extends GameLoadingIndicatorBaseModel {\n render(): React.ReactElement {\n return (\n \n );\n }\n}","import {IServiceFactoryExtended} from \"../service-factory-extended.interface\";\nimport {ILastGamePlayedViewModel} from \"./last-game-played.view-model.interface\";\nimport {action, makeObservable, observable} from \"mobx\";\nimport {GameInfo} from \"../games/game-info\";\nimport {OnGameCloseParams, OnGameOpenParams} from \"../sdk/sdk-events\";\n\nexport class LastGamePlayedModel implements ILastGamePlayedViewModel{\n constructor(private readonly services: IServiceFactoryExtended) {\n makeObservable(this);\n }\n\n @observable.ref\n lastPlayedRealGame: GameInfo = null;\n\n @observable.ref\n correlatedGamesForLastPlayedRealGame: GameInfo[] = [];\n\n private _listenForLastRealGame = false;\n\n @action.bound\n _setLastPlayedRealGame(lastGameInfo: GameInfo) {\n this.lastPlayedRealGame = lastGameInfo;\n }\n\n @action.bound\n _setCorrelatedGamesForLastPlayedRealGame(gameInfos: GameInfo[]) {\n this.correlatedGamesForLastPlayedRealGame = gameInfos;\n }\n\n listenForLastPlayedRealGame() {\n if (this._listenForLastRealGame) {\n return;\n }\n\n this.services.sdk.events.onGameClose((closeOptions: OnGameCloseParams) => {\n // showNextGameSuggestion should be filled as true when player itself closes the game (press on X button)\n if (closeOptions.isReal && closeOptions.isGamePlayed && closeOptions.showNextGameSuggestion) {\n this.setLastPlayedRealGame(closeOptions.gameType);\n }\n });\n\n this._listenForLastRealGame = true;\n }\n\n async setLastPlayedRealGame(gameType: number): Promise {\n const lastGameInfo = await this.services.games.getGameInfo(gameType);\n const correlatedGames = await this.services.games.getCorrelatedGames(gameType, 50);\n let gameInfosArray = (await this.services.games.getGamesInfoArray(correlatedGames)) || [];\n\n this._setLastPlayedRealGame(lastGameInfo);\n this._setCorrelatedGamesForLastPlayedRealGame(gameInfosArray);\n }\n\n private _listenForLastOpenDemoGame = false;\n\n @observable.ref\n lastOpenDemoGame: GameInfo = null;\n\n listenForLastOpenDemoGame() {\n if (this._listenForLastOpenDemoGame) {\n return;\n }\n\n this.services.sdk.events.onGameOpen((options: OnGameOpenParams) => {\n if (!options.isReal) {\n this.setLastOpenDemoGame(options.gameType);\n }\n });\n\n this._listenForLastOpenDemoGame = true;\n }\n\n async setLastOpenDemoGame(gameType: number): Promise {\n const gameInfo = await this.services.games.getGameInfo(gameType);\n this._setLastOpenDemoGame(gameInfo);\n }\n\n @action.bound\n _setLastOpenDemoGame(lastGameInfo: GameInfo) {\n this.lastOpenDemoGame = lastGameInfo;\n }\n}","import {\n IGameRunnerService,\n IInitialOpenGameParams,\n IPersistedInitialOpenGameParams\n} from \"./game-runner.service.interface\";\nimport {ServiceBase} from \"../ServiceBase\";\nimport {\n ICloseGameParams,\n IRunningGameController,\n IRunningGameControllerViewModel\n} from \"./interfaces/game-controller/running-game-controller.interface\";\nimport { observable, runInAction, makeObservable } from \"mobx\";\nimport {IRegulatedCompanyModel} from \"../companies/regulated-company-model.interface\";\nimport {GameModeEnum} from \"./interfaces/game-context/game-context-view-model.interface\";\nimport {IServiceFactoryExtended} from \"../service-factory-extended.interface\";\nimport {SessionStorageKeys} from \"../storage/session-storage-keys\";\nimport {GNWP_SOURCES} from \"../gnwp/gnwp-consts\";\nimport {IGameRunnerProxy} from \"../../../common/interfaces/game-runner-proxy.interface\";\nimport {Check} from \"@sparkware/app-utils\";\nimport {DialogButtonClickHandleResultEnum} from \"../dialog/dialog.service.interface\";\nimport {UndefinedString} from \"../../../common/types/nullable-types\";\nimport {RunningGameBrowserTabController} from \"./running-game-browser-tab-controller\";\nimport {\n HybridEmbeddedGameLoadingIndicatorModel\n} from \"./loading-indicators/hybrid-embedded-game-loading-indicator.model\";\nimport {WebAppGameLoadingIndicatorModel} from \"./loading-indicators/web-app-game-loading-indicator.model\";\nimport {IGameLoadingIndicatorModel} from \"./loading-indicators/game-loading-indicator-model.interface\";\nimport {GameStepsExecutionResultEnum} from \"./interfaces/game-step/game-run-step.interface\";\nimport {OpenGameParameters} from \"../games/game-info\";\nimport {LastGamePlayedModel} from \"./last-game-played.model\";\n\nexport class GameRunnerService extends ServiceBase implements IGameRunnerService, IGameRunnerProxy {\n constructor(services: IServiceFactoryExtended) {\n super(services);\n\n makeObservable(this);\n\n this.gameTabController = new RunningGameBrowserTabController(this, this.services);\n\n this._reOpenPendingGame();\n\n this._subscribeToSdkEvents();\n\n this.reaction(() => this.services.user.isAuthorized,\n async () => {\n await this.currentRunningGame?.closeGame({\n shouldSuggestNextGame: false\n });\n });\n\n this.lastPlayedGame = new LastGamePlayedModel(this.services);\n }\n\n readonly gameTabController: RunningGameBrowserTabController;\n\n readonly lastPlayedGame: LastGamePlayedModel;\n\n get gameFrameZIndex(): number {\n return this.services.sdk.overlayZIndex.GAME_FRAME;\n }\n\n private async _reOpenPendingGame(): Promise {\n const persistedGameParams = this.services.sessionStorage.getJson(SessionStorageKeys.currentGameParams);\n if (!persistedGameParams) {\n return;\n }\n\n try {\n const {gameType, ...initialGameParams} = persistedGameParams;\n\n const gameInfo = await this.services.games.getGameInfo(gameType);\n\n if (!gameInfo) {\n return;\n }\n\n await this.openGame({\n ...initialGameParams,\n gameInfo: gameInfo\n });\n } finally {\n this.services.sessionStorage.removeItem(SessionStorageKeys.currentGameParams);\n }\n\n }\n\n private _subscribeToSdkEvents(): void {\n this.services.sdk.events.onDepositWidgetClosed(() => {\n this._refreshCurrentGameBalance();\n });\n\n this.services.sdk.events.onExternalLinkClosed((linkSource) => {\n if (GNWP_SOURCES.CASHIER === linkSource) {\n this._refreshCurrentGameBalance();\n }\n });\n }\n\n private _refreshCurrentGameBalance(): void {\n if (this.currentRunningGame && this.currentRunningGame.gameCommunicationChannel.supportsBalanceRefresh) {\n this.currentRunningGame.gameCommunicationChannel.refreshBalance();\n }\n }\n\n\n async openGame(initialRunGameParams: IInitialOpenGameParams): Promise {\n\n\n try {\n switch (initialRunGameParams.gameMode) {\n case GameModeEnum.Real:\n return await this._openRealGame(initialRunGameParams);\n case GameModeEnum.Demo:\n return await this._openDemoGame(initialRunGameParams);\n case GameModeEnum.History:\n return await this._openHistoryGame(initialRunGameParams);\n default:\n throw new Error(`Invalid gameMode ${initialRunGameParams.gameInfo}`);\n }\n } catch (err) {\n this.services.logger.error(`Failed to open game ${initialRunGameParams.gameInfo.gameType} in mode ${initialRunGameParams.gameMode}`, err);\n this._logOpenGameError(err, initialRunGameParams);\n this._showGameOpenError(err);\n }\n }\n\n async closeCurrentGame(params: ICloseGameParams): Promise {\n if(this.currentRunningGame) {\n await this.currentRunningGame.closeGame(params);\n }\n }\n private _showGameOpenError(err: any): void {\n let messageText = null;\n if (err?.error_code) {\n messageText = this.services.regulation.getErrorMessage(err.error_code);\n }\n\n if (!messageText) {\n messageText = this.services.regulation.getGeneralErrorMessage();\n }\n\n this.services.dialog.showSimpleTextModal({\n text: messageText,\n showEmptyTitle: true,\n buttons: [\n {\n text: this.services.translation.translate('OK'),\n buttonPreset: 'primary',\n onClick: async () => DialogButtonClickHandleResultEnum.CloseDialogAndContinue\n }\n ]\n });\n\n }\n\n private _logOpenGameError(err: any, initialRunGameParams: IInitialOpenGameParams): void {\n try {\n let errMsgToLog: string;\n if (Check.isObject(err)) {\n errMsgToLog = JSON.stringify(err);\n } else {\n errMsgToLog = err?.toString();\n }\n this.services.analytics.sendAnalytics(\"game_load_error\", errMsgToLog, initialRunGameParams.gameInfo.gameType.toString());\n } catch (logError) {\n this.services.logger.error('Failed to log game error', logError);\n }\n\n }\n\n private async _openRealGame(initialRunGameParams: IInitialOpenGameParams): Promise {\n return await this._runGame(initialRunGameParams, company => company.openRealGame(initialRunGameParams));\n }\n\n private async _openDemoGame(initialRunGameParams: IInitialOpenGameParams): Promise {\n return await this._runGame(initialRunGameParams, company => company.openDemoGame(initialRunGameParams));\n }\n\n private async _openHistoryGame(initialRunGameParams: IInitialOpenGameParams): Promise {\n if (!initialRunGameParams.historyGameParams) {\n throw new Error('Missing history game params');\n }\n return await this._runGame(initialRunGameParams, company => company.openHistoryGame(initialRunGameParams));\n }\n\n @observable.ref\n gameLoadingIndicator: IGameLoadingIndicatorModel | null = null;\n\n private _setGameLoadingIndicator(loadingIndicator: IGameLoadingIndicatorModel | null): void {\n runInAction(() => {\n this.gameLoadingIndicator?.dispose();\n this.gameLoadingIndicator = loadingIndicator;\n })\n }\n\n private _createGameLoadingIndicator(): IGameLoadingIndicatorModel {\n if (this.services.device.hybrid.isEmbedded) {\n return new HybridEmbeddedGameLoadingIndicatorModel(this.services, this);\n } else {\n return new WebAppGameLoadingIndicatorModel(this.services);\n }\n }\n\n private async _closeCurrentRunningGame(): Promise {\n if(this.currentRunningGame) {\n return await this.currentRunningGame.closeGame({\n shouldSuggestNextGame: false\n });\n }\n\n return GameStepsExecutionResultEnum.Continue;\n }\n\n private _runGameStarted = false;\n private async _runGame(initialRunGameParams: IInitialOpenGameParams, openGame: (company: IRegulatedCompanyModel) => Promise): Promise {\n if (this._runGameStarted) { //to prevent the case when the user double-click on the game\n return;\n }\n\n try {\n this._runGameStarted = true;\n const closeCurrentGameResult = await this._closeCurrentRunningGame()\n\n if (closeCurrentGameResult !== GameStepsExecutionResultEnum.Continue) {\n return;\n }\n\n this._setGameLoadingIndicator(this._createGameLoadingIndicator());\n\n\n const company = await (await this.services.companies).getRegulatedCompany(initialRunGameParams.gameInfo.companyName);\n const gameController = await openGame(company);\n\n if (!gameController) {\n return null;\n }\n this._setCurrentRunningGame(gameController);\n return gameController;\n } finally {\n this._runGameStarted = false;\n this._setGameLoadingIndicator(null);\n }\n }\n\n @observable.ref\n currentRunningGame: IRunningGameController | null = null;\n\n private _setCurrentRunningGame(gameController: IRunningGameController): void {\n gameController.createWaitForClosePromise();\n\n runInAction(() => {\n this.currentRunningGame = gameController;\n });\n\n gameController.triggerLegacyGameOpenEvent();\n this.services.overlay.disableScrolling();\n gameController.waitForGameToClose().then(() => {\n runInAction(() => {\n this.currentRunningGame = null\n });\n gameController.triggerLegacyGameCloseEvent();\n this.services.overlay.enableScrolling();\n });\n }\n\n closeGameLoadingIndicator(): void {\n this._setGameLoadingIndicator(null);\n }\n\n\n /**\n * Legacy adapter implementations\n */\n\n /**\n * This should not be used in Orbit code it is only for old SDK use\n * @deprecated\n */\n async closeRunningGame(): Promise {\n if (this.currentRunningGame) {\n await this.currentRunningGame.closeGame({\n shouldSuggestNextGame: false\n });\n }\n }\n\n /**\n * This should not be used in Orbit code it is only for old SDK use\n * @deprecated\n */\n get isGameRunningLegacy(): Promise {\n return Promise.resolve(Boolean(this.currentRunningGame) && this.currentRunningGame.gameContext.gameMode !== GameModeEnum.History);\n }\n\n /**\n * This should not be used in Orbit code it is only for old SDK use\n * @deprecated\n */\n get isGameRunningInFreePlayModeLegacy(): Promise {\n return Promise.resolve(Boolean(this.currentRunningGame?.gameContext.freePlayContext.isFreePlay));\n }\n\n /**\n * This should not be used in Orbit code it is only for old SDK use\n * @deprecated\n */\n get currentRunningGameCompanyNameLegacy(): Promise {\n return Promise.resolve(this.currentRunningGame?.gameContext.company.companyName);\n }\n\n /**\n * This should not be used in Orbit code it is only for old SDK use\n * @deprecated\n */\n async stopCurrentGameAutoplayLegacy(): Promise {\n await this.currentRunningGame?.gameCommunicationChannel.stopAutoplay();\n }\n /**\n * This should not be used in Orbit code it is only for old SDK use\n * @deprecated\n */\n async continuePlayCurrentGameLegacy(): Promise {\n await this.currentRunningGame?.gameCommunicationChannel.resumeGamePlay();\n }\n\n /**\n * This should not be used in Orbit code it is only for old SDK use\n * @deprecated\n */\n async shouldShowRealityCheckMessageWhileGameIsOpenLegacy(): Promise {\n if(this.currentRunningGame) {\n return (this.currentRunningGame.gameContext.gameInternalRealityCheckInterval.getRealityCheckExpectedByTheGame().expectedValueByTheGame === 0\n || this.currentRunningGame.company.shouldShowRealityCheckMessageWhileGameIsOpen());\n }\n return false;\n }\n\n /**\n * This should not be used in Orbit code it is only for old SDK use\n * @deprecated\n */\n async shouldShowTimeLimitMessageWhileGameIsOpenLegacy(): Promise {\n return Boolean(this.currentRunningGame?.company.shouldShowTimeLimitMessageWhileGameIsOpen());\n }\n\n /**\n * This should not be used in Orbit code it is only for old SDK use\n * @deprecated\n */\n get isOpenGameInProgress(): Promise\n {\n return Promise.resolve(Boolean(this.gameLoadingIndicator));\n }\n\n /**\n * This should not be used in Orbit code it is only for old SDK use\n * @deprecated\n */\n async openRealGameFromSdkRequest(gameType: number, options?: OpenGameParameters): Promise {\n const gameInfo = await this.services.games.getGameInfo(gameType);\n if(!gameInfo) {\n throw new Error(`There is no game in layout with gameType ${gameType}`);\n }\n\n await gameInfo.open({\n isRealMode: true,\n ...options\n });\n }\n\n /**\n * This should not be used in Orbit code it is only for old SDK use\n * @deprecated\n */\n async openDemoGameFromSdkRequest(gameType: number, options?: OpenGameParameters): Promise {\n const gameInfo = await this.services.games.getGameInfo(gameType);\n if(!gameInfo) {\n throw new Error(`There is no game in layout with gameType ${gameType}`);\n }\n\n await gameInfo.open({\n isRealMode: false,\n ...options\n });\n }\n}\n","export enum SessionStorageKeys {\n currentGameParams = 'OrbitCurrentGameParams',\n retryGeoOnLoad = \"OrbitRetryGeoOnLoad\"\n}"],"names":["Load","keyframes","LoadingDotBox","styled","props","animationDelay","LoadingDotsBox","LoadingDotsComponent","observer","OrbitComponent","GAME_PC_BUTTON_WIDTH","GAME_PC_BUTTON_HEIGHT","GAME_MOBILE_BUTTON_WIDTH","GAME_MOBILE_BUTTON_HEIGHT","GameHeaderBarCloseButtonBox","XCloseButtonBox","theme","mediaQuery","sAndBelow","RunningGameBrowserTabController","gameRunner","services","_activeGameInAnotherTabDetectionTimer","_detectActiveGameInAnotherTab","isGameRunningInAnotherTab","currentRunningGame","closeGame","shouldSuggestNextGame","reaction","runningGame","_setActiveGame","gameContext","gameInfo","gameType","setInterval","clearTimeout","_onGameClosed","fireImmediately","this","activeGame","_currentBrowserTabId","_activeGameTabId","sdk","getCurrentBrowserTabId","localStorage","getItem","LocalStorageKeys","setItem","removeItem","parseInt","Check","games","gamesMap","GameLoadingIndicatorBaseModel","dialog","hasOpenDialogs","hasOpenOverlays","HybridEmbeddedGameLoadingIndicatorRootBox","HybridEmbeddedGameLoadingIndicatorHeaderBox","PC_HORIZONTAL_SPACE_BETWEEN_ITEMS","HybridEmbeddedGameLoadingIndicatorContentBox","HybridEmbeddedGameLoadingIndicatorSpinnerBox","HybridEmbeddedGameLoadingIndicatorProgressCircle1Box","colors","boxBorderContrast","HybridEmbeddedGameLoadingIndicatorProgressCircle2Box","brandPrimary","angle","HybridEmbeddedGameLoadingIndicatorProgressCircle3Box","backgroundDark","LoadingCircleLargeIcon","viewBox","d","id","gradientUnits","x1","y1","x2","y2","gradientTransform","offset","stopColor","stopOpacity","className","fill","accumulate","additive","attributeName","attributeType","calcMode","dur","from","repeatCount","restart","to","type","React","HybridEmbeddedGameLoadingIndicatorComponent","_onCloseButtonClick","viewModel","closeLoadingIndicator","totalPackages","translation","translate","packagesStatus","currentPackage","size","_renderPackageDownloadStatusLabel","downloadPercentage","_renderConnectingSpinner","_renderProgressIndicator","onClick","_renderContent","TOASTER_TIMEOUT","TimeSpan","HybridEmbeddedGameLoadingIndicatorModel","_sdkEventsSubscriptions","_slowConnectionToasterTimer","_showToaster","toaster","showStandardToast","toastOptions","timeout","contentProps","title","message","onToastShown","analytics","sendAnalytics","ON_DEMAND","totalSeconds","toString","_updateProgress","data","runInAction","percentage","logger","error","parts","numberOfPackages","split","trim","_clearToasterTimer","makeObservable","observable","push","events","onHybridEmbeddedGameLoadingIndicatorUpdateV1","onHybridEmbeddedGameLoadingIndicatorUpdateV2","statusBar","setTimeout","totalMilliseconds","forEach","s","off","closeGameLoadingIndicator","eventsTrigger","hybridGameLoadingIndicatorClosed","WebAppGameLoadingIndicatorComponent","WebAppGameLoadingIndicatorModel","LastGamePlayedModel","action","_listenForLastRealGame","_listenForLastOpenDemoGame","lastGameInfo","lastPlayedRealGame","gameInfos","correlatedGamesForLastPlayedRealGame","onGameClose","closeOptions","isReal","isGamePlayed","showNextGameSuggestion","setLastPlayedRealGame","getGameInfo","getCorrelatedGames","correlatedGames","getGamesInfoArray","gameInfosArray","_setLastPlayedRealGame","_setCorrelatedGamesForLastPlayedRealGame","onGameOpen","options","setLastOpenDemoGame","_setLastOpenDemoGame","lastOpenDemoGame","GameRunnerService","gameTabController","lastPlayedGame","_runGameStarted","_reOpenPendingGame","_subscribeToSdkEvents","user","isAuthorized","overlayZIndex","GAME_FRAME","persistedGameParams","sessionStorage","getJson","SessionStorageKeys","initialGameParams","openGame","onDepositWidgetClosed","_refreshCurrentGameBalance","onExternalLinkClosed","linkSource","GNWP_SOURCES","gameCommunicationChannel","supportsBalanceRefresh","refreshBalance","initialRunGameParams","gameMode","GameModeEnum","_openRealGame","_openDemoGame","_openHistoryGame","Error","_logOpenGameError","_showGameOpenError","params","err","messageText","error_code","regulation","getErrorMessage","getGeneralErrorMessage","showSimpleTextModal","text","showEmptyTitle","buttons","buttonPreset","DialogButtonClickHandleResultEnum","errMsgToLog","JSON","stringify","logError","_runGame","company","openRealGame","openDemoGame","historyGameParams","openHistoryGame","loadingIndicator","gameLoadingIndicator","dispose","device","hybrid","isEmbedded","GameStepsExecutionResultEnum","_closeCurrentRunningGame","_setGameLoadingIndicator","_createGameLoadingIndicator","companies","getRegulatedCompany","companyName","gameController","_setCurrentRunningGame","createWaitForClosePromise","triggerLegacyGameOpenEvent","overlay","disableScrolling","waitForGameToClose","then","triggerLegacyGameCloseEvent","enableScrolling","Promise","resolve","Boolean","freePlayContext","isFreePlay","stopAutoplay","resumeGamePlay","gameInternalRealityCheckInterval","getRealityCheckExpectedByTheGame","expectedValueByTheGame","shouldShowRealityCheckMessageWhileGameIsOpen","shouldShowTimeLimitMessageWhileGameIsOpen","open","isRealMode","ServiceBase"],"sourceRoot":""}