{"version":3,"sources":["redux/actionTypes/index.ts","redux/actionTypes/boosters.ts","redux/actionTypes/game.ts","redux/actionTypes/user.ts","redux/actionTypes/cheats.ts","redux/actionTypes/ads.ts","redux/actionTypes/purchases.ts","redux/actionTypes/lives.ts","redux/actionTypes/settings.ts","redux/actionTypes/header.ts","redux/actionTypes/adblock.ts","redux/actionTypes/secondSession.ts","redux/actionTypes/progress.ts","redux/actionTypes/worlds.ts","redux/actionTypes/tutorial.ts","redux/actionTypes/modals.ts","redux/actionTypes/hint.ts","shared/containers/PageHeaderManager/PageHeaderManager.js","shared/containers/PageHeaderManager/index.js","shared/components/withTracker/withTracker.js","shared/components/withTracker/index.js","shared/sdk/index.ts","containers/Header/Header.module.css","containers/LandingPage/LandingPage.module.css","shared/components/Stars/Stars.module.css","containers/WorldPage/WorldPage.module.css","shared/api/boostersAPI.js","shared/api/livesAPI.ts","shared/helpers/tabVisibility.js","redux/actions/tutorial.ts","redux/reducers/boosters.js","redux/reducers/game.js","redux/reducers/user.js","redux/reducers/cheats.js","redux/reducers/ads.js","redux/reducers/purchases.js","redux/reducers/lives.js","redux/reducers/adBlock.js","redux/reducers/secondSession.js","redux/reducers/header.js","redux/reducers/settings.js","redux/reducers/worlds.js","redux/reducers/progress.js","redux/reducers/tutorial.js","redux/reducers/modals.ts","redux/reducers/hint.js","redux/middlewares/lives.ts","redux/reducers/index.js","redux/middlewares/boosters.js","redux/middlewares/settings.js","redux/store.js","redux/middlewares/game.js","shared/containers/UserLives/UserLives.module.css","shared/containers/Tutorial/Tutorial.module.css","redux/actions/adBlock.ts","shared/helpers/adBlockDetector.ts","shared/helpers/locales.js","shared/locales/langCookieName.js","shared/modules/AnalyticsEvents.ts","shared/components/BackBtn/BackBtn.module.css","shared/components/LifeIcon/LifeIcon.module.css","shared/components/LivesNumber/LivesNumber.module.css","shared/components/AddBtn/AddBtn.module.css","shared/components/OKShareBtn/OKShareBtn.module.css","shared/components/StarsCounter/StarsCounter.module.css","shared/api/axiosInstance.ts","shared/constants.ts","shared/modules/TutorialManager.js","shared/api/progressAPI.ts","shared/schemas/progress.ts","redux/actions/progress.ts","redux/selectors/modals.js","shared/components/UpdateBtn/UpdateBtn.module.css","shared/components/Settings/Settings.module.css","shared/components/PayBtn/PayBtn.module.css","components/Footer/Footer.module.css","shared/api/purchasesAPI.ts","shared/components/BackBtn/props.js","shared/components/BackBtn/BackBtn.js","shared/components/BackBtn/index.js","shared/helpers/progress.ts","shared/components/Stars/props.js","shared/components/Stars/Stars.js","shared/components/Stars/index.js","shared/components/LifeIcon/LifeIcon.js","shared/components/LifeIcon/index.js","shared/helpers/schemas.ts","redux/selectors/progress.ts","shared/modules/AppSoundManager.ts","shared/helpers/sharing.ts","shared/config/boostersConfig.js","redux/actions/boosters.js","shared/helpers/user.ts","shared/components/UpdateBtn/props.js","shared/components/UpdateBtn/UpdateBtn.js","shared/components/UpdateBtn/index.js","shared/components/NewLifeTime/props.js","shared/components/NewLifeTime/NewLifeTime.js","shared/components/NewLifeTime/index.js","shared/components/Settings/Settings.js","shared/components/Settings/index.js","redux/selectors/worlds.ts","shared/components/NewLifeTime/NewLifeTime.module.css","shared/styles/Page.module.css","shared/containers/ModalManager/ModalManager.module.css","shared/components/PageTitle/PageTitle.module.css","redux/actions/settings.js","shared/helpers/analytics.ts","shared/adv/advStub.ts","shared/adv/Advertizer.ts","shared/components/OKShareBtn/OKShareBtn.js","shared/config.ts","redux/actions/game.ts","containers/LevelsPage/LevelsPage.module.css","redux/actions/modals.ts","shared/locales/lngDetector.js","shared/locales/languages.js","shared/i18n.js","shared/cssEnvironmentVariables.js","shared/components/CustomListItem/CustomListItem.module.css","shared/components/Preloader/Preloader.css","shared/styles/modalAnimation.css","shared/helpers/arrayIncludesPolyfill.js","shared/styles/animation.css","registerServiceWorker.js","shared/components/LivesNumber/props.js","shared/components/LivesNumber/LivesNumber.js","shared/api/adsAPI.ts","shared/components/LivesNumber/index.js","shared/components/AddBtn/index.js","shared/components/AddBtn/AddBtn.js","shared/components/PayBtn/index.js","shared/components/PayBtn/PayBtn.js","shared/containers/UserLives/UserLives.js","shared/containers/UserLives/index.js","containers/Header/Header.js","containers/Header/index.js","shared/contacts.js","components/Footer/Footer.tsx","components/Footer/index.js","shared/components/Preloader/index.js","shared/components/Preloader/Preloader.js","redux/actions/ads.js","shared/containers/OKAndroidManager/OKAndroidManager.js","shared/containers/OKAndroidManager/index.js","shared/components/PageWrap/index.ts","shared/components/PageWrap/PageWrap.tsx","shared/containers/Hint/props.js","shared/containers/Hint/Hint.js","shared/containers/Hint/index.js","shared/containers/Tutorial/Tutorial.tsx","shared/containers/Tutorial/index.js","redux/actions/hint.ts","shared/containers/ModalManager/ModalManager.tsx","shared/containers/ModalManager/index.js","shared/api/userAPI.ts","redux/actions/user.ts","shared/modules/Auth.ts","shared/schemas/worlds.ts","redux/actions/worlds.ts","shared/api/worldsAPI.ts","redux/actions/secondSession.js","shared/api/secondSessionAPI.js","shared/components/CustomListItem/props.js","shared/components/CustomListItem/CustomListItem.js","shared/components/CustomListItem/index.js","shared/helpers/lists.ts","shared/components/ScrollbarHeightAdjuster/props.js","shared/components/ScrollbarHeightAdjuster/ScrollbarHeightAdjuster.js","shared/components/ScrollbarHeightAdjuster/index.js","containers/LandingPage/LandingPage.js","containers/LandingPage/index.js","shared/components/PageTitle/index.js","shared/components/PageTitle/PageTitle.js","shared/components/StarsCounter/index.js","shared/components/StarsCounter/StarsCounter.js","shared/helpers/resize.js","containers/LevelsPage/LevelsPage.js","containers/LevelsPage/index.js","containers/WorldPage/WorldPage.js","containers/WorldPage/index.js","App.js","main.tsx","index.ts","shared/containers/Hint/Hint.module.css","redux/actions/lives.ts","redux/actions/header.ts","App.module.css","shared/config/tutorialConfig.js","shared/helpers/lives.ts","shared/api/settingsAPI.ts"],"names":["PageHeaderManager","this","updatePageHeader","prevProps","props","showBackBtn","updateVisibilityBackBtn","showUpdateBtn","updateVisibilityUpdateBtn","showUserLives","updateVisibilityUserLives","showSettings","updateVisibilitySettings","title","showTitle","updateTitle","headerBackBtnClick","onBackClick","headerUpdateBtnClick","onUpdateClick","reset","showHeaderBackBtn","showHeaderUpdateBtn","showHeaderUserLives","showHeaderSettings","showHeaderTitle","Component","connect","state","header","backBtnClick","updateBtnClick","dispatch","toggle","toggleSettings","toggleBackBtn","toggleUpdateBtn","toggleUserLives","toggleTitle","isAnalyticsEnabled","loadReactGA","then","initialize","getAnalyticsID","withTracker","WrappedComponent","options","trackPage","page","set","pageview","loadYandexMetrica","ym","default","HOC","location","pathname","search","currentPage","nextPage","LOAD_SEARCH_ADDRESS","window","load","test","Promise","reject","module","exports","fetchBoosters","axiosInstance","get","putBoosters","boostersData","put","fetchLives","putLives","data","deleteLivesNumber","delete","increaseLivesNumber","post","deleteLivesNumberSync","token","xhr","XMLHttpRequest","open","process","setRequestHeader","send","stateKey","eventKey","keys","hidden","webkitHidden","mozHidden","msHidden","document","visibilityListenersAdded","isSafari7","navigator","userAgent","match","tabVisibilitySubj","BehaviorSubject","tabVisibility$","asObservable","detectTabVisibility","addEventListener","next","event","isTabVisible","getValue","updateActiveLevelId","activeLevelId","type","UPDATE_ACTIVE_LEVEL_ID","resetTutorial","RESET_TUTORIAL","updateSettingsTutorial","initialState","hintCount","maxHintCount","moveBackCount","maxMoveBackCount","isGetBoostersInProcess","isGetBoostersError","isPutBoostersInProcess","isPutBoostersError","boosterHintX","boosterHintY","boosterHintR","boosterMoveBackX","boosterMoveBackY","boosterMoveBackR","hasBoosterHintClickRequire","hasBoosterMoveBackClickRequire","infiniteBoosterHint","infiniteBoosterMoveBack","worldId","packId","levelId","levelHash","stepsSpent","maxMovesCount","bestMovesCount","maxStars","achievedStars","cheatStars","passed","lost","movesRunOut","bestVertexX","bestVertexY","bestVertexR","graphX","graphY","graphR","hasBestVertexClickRequire","hasShowHintRequire","hasUpdateBestVertexCoordRequire","hasUpdateGraphCoordRequire","infiniteSteps","hasUpdateStepsLeftRequire","stepsLeft","hasUpdateNotBestVertexDataRequire","hasNotBestVertexClickRequire","notBestVertexIndex","notBestVertexX","notBestVertexY","notBestVertexR","id","userId","okUuid","uuid","secretApiToken","isAuth","isCheckUserInProcess","isCheckUserError","isCreateUserInProcess","isCreateUserError","isAuthUserInProcess","isAuthUserError","isDeleteUserInProcess","isDeleteUserError","isDeleteSessionInProcess","isDeleteSessionError","isCheatMode","finishLevelWithStars","isPageWithLifes","isPageWithGame","isGetAdsInProcess","isGetAdsError","androidOkAppSuggestDesktopIconTimeoutMinutes","isSetLifePurchaseInProcess","isSetLifePurchaseError","livesNumber","newLifeTimer","maxLivesNumber","infiniteLife","lifeRestoreMinutes","isGetLivesInProcess","isGetLivesError","isPutLivesInProcess","isPutLivesError","adBlockDetected","isSecondSession","getNextShowValue","actionToggle","currentShowValue","isNil","music","sounds","language","isGetSettingsInProcess","isGetSettingsError","isPutSettingsInProcess","isPutSettingsError","isGettingTutorialInProgress","isGettingTutorialError","tutorialProgress","entities","worldsMaxStars","isGetWorldsError","isGetWorldsSuccess","produce","draftState","action","CLEAR_PROGRESS_REQUEST","isClearProgressInProcess","isClearProgressError","CLEAR_PROGRESS_SUCCESS","CLEAR_PROGRESS_FAILURE","UPDATE_LEVEL_PROGRESS_SUCCESS","isUpdateLevelProgressError","progress","packEntityId","createPackEntityId","levelEntityId","createLevelEntityId","worldProgress","getWorldProgressById","packs","packProgress","getPackProgress","createPackProgress","currentLevelProgress","getLevelProgress","updatedLevelProgress","createLevelProgress","hash","completed","addMovesAttempts","levels","push","UPDATE_LEVEL_PROGRESS_FAILURE","GET_WORLDS_PROGRESS_SUCCESS","isGetWorldsProgressError","isGetWorldsProgressSuccess","GET_WORLDS_PROGRESS_FAILURE","RESET_WORLDS_PROGRESS","CALC_ALL_ACHIEVED_STARS","isAchievedStarsCalculated","reduce","getProgressArray","worldsData","result","world","getWorldPacks","Id","starsInAllWorlds","achievedStarsInWorld","worldResult","pack","achievedStarsInPack","calcAchievedStarsInPack","MaxStars","setWith","Object","all","SET_TUTORIAL_PASSED","tutorialPassed","SHOW_MODAL","activeModal","find","modals","active","remove","modalType","modalProps","metrica","show","HIDE_MODAL","modal","timer","circleX","circleY","circleR","text","textPosition","HINT_TEXT_BOTTOM","bgWidth","bgHeight","hintType","combineReducers","boosters","GET_BOOSTERS_REQUEST","GET_BOOSTERS_SUCCESS","Math","min","GET_BOOSTERS_FAILURE","PUT_BOOSTERS_REQUEST","PUT_BOOSTERS_SUCCESS","PUT_BOOSTERS_FAILURE","BOOSTER_HINT_INCREMENT","BOOSTER_HINT_DECREMENT","max","BOOSTER_MOVE_BACK_INCREMENT","BOOSTER_MOVE_BACK_DECREMENT","RESET_BOOSTERS","SET_BOOSTER_HINT_COORDS","x","y","r","SET_BOOSTER_MOVE_BACK_COORDS","BOOSTER_HINT_CLICK_REQUIRE","require","BOOSTER_MOVE_BACK_CLICK_REQUIRE","SET_INFINITE_BOOSTER_HINT","infinite","SET_INFINITE_BOOSTER_MOVE_BACK","game","SET_GAME","RESET_GAME","CLEAR_STEPS_SPENT","SET_STEPS_SPENT","SET_LEVEL_HASH","SET_MAX_STARS","SET_MAX_MOVES_COUNT","SET_BEST_MOVES_COUNT","SET_INFINITE_STEPS","SET_GAME_PASSED","cheatSteps","getStepsForCheatStars","getAchievedStarsAmount","SET_GAME_LOST","SET_MOVES_RUN_OUT","SET_CHEAT_STARS","SET_BEST_VERTEX_COORDS","SET_GRAPH_COORDS","SET_STEPS_LEFT","SET_NOT_BEST_VERTEX_DATA","index","BEST_VERTEX_CLICK_REQUIRE","NOT_BEST_VERTEX_CLICK_REQUIRE","UPDATE_BEST_VERTEX_COORD_REQUIRE","UPDATE_GRAPH_COORD_REQUIRE","SHOW_HINT_REQUIRE","UPDATE_STEPS_LEFT_REQUIRE","UPDATE_NOT_BEST_VERTEX_DATA_REQUIRE","user","SET_USER_ID","CHECK_USER_REQUEST","CHECK_USER_SUCCESS","CHECK_USER_FAILURE","CREATE_USER_REQUEST","CREATE_USER_SUCCESS","CREATE_USER_FAILURE","AUTH_USER_REQUEST","AUTH_USER_SUCCESS","authenticationToken","developer","AUTH_USER_FAILURE","DELETE_USER_REQUEST","DELETE_USER_SUCCESS","DELETE_USER_FAILURE","DELETE_SESSION_REQUEST","DELETE_SESSION_SUCCESS","DELETE_SESSION_FAILURE","cheats","SET_CHEAT_MODE","SET_FINISH_LEVEL_CHEAT","starsCount","CLEAR_FINISH_LEVEL_CHEAT","SET_PAGE_WITH_LIFES","SET_PAGE_WITH_GAME","ads","GET_ADS_REQUEST","GET_ADS_SUCCESS","GET_ADS_FAILURE","purchases","SET_LIFE_PURCHASE_REQUEST","SET_LIFE_PURCHASE_SUCCESS","SET_LIFE_PURCHASE_FAILURE","lives","GET_LIVES_REQUEST","GET_LIVES_SUCCESS","GET_LIVES_FAILURE","RESET_LIVES_NUMBER","SET_NEW_LIFE_TIMER","isUpdate","minToMs","Date","now","CLEAR_NEW_LIFE_TIMER","adBlock","SET_ADBLOCK_DETECTED","secondSession","SET_SECOND_SESSION","HEADER_RESET","HEADER_TOGGLE_SETTINGS","HEADER_TOGGLE_BACK_BTN","HEADER_TOGGLE_UPDATE_BTN","HEADER_TOGGLE_USER_LIFES","HEADER_TOGGLE_TITLE","HEADER_BACK_BTN_CLICK","HEADER_UPDATE_BTN_CLICK","settings","GET_SETTINGS_TUTORIAL_REQUEST","GET_SETTINGS_TUTORIAL_SUCCESS","GET_SETTINGS_TUTORIAL_ERROR","GET_SETTINGS_REQUEST","GET_SETTINGS_SUCCESS","GET_SETTINGS_FAILURE","SET_SETTINGS","PUT_SETTINGS_REQUEST","PUT_SETTINGS_SUCCESS","PUT_SETTINGS_FAILURE","worlds","GET_WORLDS_SUCCESS","calcMaxStarsInWorld","GET_WORLDS_FAILURE","tutorial","hint","SHOW_HINT","SET_HINT_TYPE","SET_HINT_CIRCLE","SET_HINT_TEXT","SET_HINT_BG_SIZE","fields","startTimer","store","getState","time","valueOf","setNewLifeTimer","setInterval","clearTimer","getLives","clearNewLifeTimer","clearInterval","composeEnhancers","__REDUX_DEVTOOLS_EXTENSION_COMPOSE__","compose","middlewares","thunkMiddleware","prevState","prevBoosters","pick","nextBoosters","isEqual","putBoostersRequest","boostersAPI","putBoostersSuccess","putBoostersFailure","prevSettings","nextSettings","putSettingsRequest","settingsAPI","putSettingsSuccess","putSettingsFailure","finishLevelWithStarsPrev","finishLevelWithStarsNext","setCheatStars","setGamePassed","createStore","rootReducer","applyMiddleware","setAdBlockDetected","checkAdBlock","fuckAdBlockInstance","check","initAdBlockDetector","setOption","FuckAdBlock","onDetected","onNotDetected","warningTextTypes","setLang","lang","cookies","langCookieName","i18n","changeLanguage","getTitleByLocale","item","locale","Name","getWorldDataLocale","worldData","worldDataLocale","Packs","forEach","updateWorldsLocales","enResouceBundle","ruResouceBundle","enWorlds","ruWorlds","addResourceBundle","withCount","params","LevelEndings","freeze","restart","leave","win","fail","WinPopupActions","LosePopupActions","exit","InfinityLivesPurchaseResults","success","AdWatchRewards","moves","live","moveBack","AdWatchResults","watched","blocked","notFound","AddMovesPopupResults","playAd","sendAnalyticsEvent","eventName","eventParams","composeAnalyticsEntityId","ids","join","instance","axios","create","baseURL","interceptors","request","use","config","headers","AxiousError","message","status","response","setPrototypeOf","prototype","Error","error","console","log","NOT_FOUND","ERROR","UUID_STORAGE_NAME","PAGE_ANIMATION_TIME","BOOSTER_HINT_TYPE","BOOSTER_MOVE_BACK_TYPE","MODAL_APPEAR_TIME","LIFE_REDUCE_MODAL_SHOW_TIME","AD_NOT_FOUND_MODAL_SHOW_TIME","MODAL_LIFE_PURCHASE","MODAL_CHANGE_PRICE","MODAL_LIFE_REDUCE","MODAL_SETTINGS","MODAL_AD_BLOCK","MODAL_SECOND_SESSION","MODAL_WATCH_AD","MODAL_AD_NOT_FOUND","MAX_ADD_MOVES_ATTEMPTS","CHANGE_STATE_DELAY","SUCCESS","HINT_BEST_VERTEX","HINT_AI_BEST_VERTEX","HINT_NOT_BEST_VERTEX","HINT_GENERAL","HINT_AI_GENERAL","HINT_BOOSTER_HINT","HINT_BOOSTER_MOVE_BACK","HINT_TEXT_TOP","HINT_TEXT_STEPS_REGEXP","BTN_SKIP_TOP","BTN_SKIP_BOTTOM","TutorialManager","tutorialConfigLevels","tutorialConfig","length","tutorialConfigMainLevels","value","key","isMainTutorialLevel","progressOfMainLevels","intersection","lastLevel","getLastPassedTutorialLevel","storeLevelsData","storeLevels","indexOf","url","isPassed","isMainTutorialPassed","levelForRedirect","getNextLevel","levelForRedirectData","parseLevelEntityId","replace","isInfiniteSteps","setInfiniteSteps","setBoosterHintCoords","setBoosterMoveBackCoords","setInfiniteBoosterHint","setInfiniteBoosterMoveBack","bestVertexClickRequire","notBestVertexClickRequire","showHintRequire","updateBestVertexCoordRequire","updateGraphCoordRequire","boosterHintClickRequire","boosterMoveBackClickRequire","updateStepsLeftRequire","updateNotBestVertexDataRequire","_hintType","deleteProgress","LevelProgressSchema","schema","Entity","idAttribute","parent","PackProgressSchema","processStrategy","ProgressListSchema","clearProgressRequest","clearProgressSuccess","clearProgressFailure","resetWorldsProgress","calcAchievedStars","calcAchievedStarsAsync","normalizedWorldsData","clearProgress","progressAPI","clearLastVisitedLevel","clearAllNextPackMsgShowed","resetBoosters","resetLivesNumber","getProgress","normalizedProgress","normalize","getWorldsProgressSuccess","updateLevelProgress","resolve","updateLevelProgressSuccess","modalsSelector","isModalShowedSelector","createSelector","memoize","filter","putPrices","price","name","amount","getPrices","catch","inline","postLifePurchase","loadSdk","p","showPayment","PropTypes","bool","BackBtn","btnClasses","classNames","styles","Reversed","reversed","Transparent","transparent","className","onClick","React","PureComponent","defaultProps","lastVisitedLevelName","String","packLevels","map","levelData","undefined","hasNextLevelInPack","levelIndex","findIndex","hasLevelAccess","progressEntities","prevLevel","hasPackAccess","starsRequired","achievedStarsInAllWorlds","getPackLevels","packLevelsProgress","getPackLevelsProgress","levelProgress","levelAchievedStars","Graph","MaxMovesCount","BestMovesCount","worldPacksData","Levels","saveLastVisitedLevel","ls","getLastVisitedLevel","currentMovesCount","lastRangeEndNumber","delta","boundariesNumber","rangeSize","round","i","rangeStartNumber","rangeEndNumber","getNextAvailablePackId","currIndex","nextPack","StarsRequired","getNextPackMsgShowedName","isNextPackMsgShowed","nextPackMsgShowedName","setNextPackMsgShowed","arrToRemove","lsKeys","number","isRequired","Stars","_setRange","resizeOnMobile","starsNumber","StarsWrap","ResizeOnMobile","starsRange","num","classes","Star","StarOutline","StarFilled","nextProps","range","LifeIcon","iconClasses","SizeBig","size","color","split","getAchievedStarsInWorldSelector","getPropsWorldID","getAchievedStarsInWorld","getAchievedStarsInPack","getAllAchievedStars","entityLevelId","values","AppSoundManager","randomizeBgSound","isInitialized","Howler","autoUnlock","_randomizeBgSoundOrder","_soundsList","soundItem","_howlSounds","Howl","pause","_bgSoundsList","howlInstance","playing","stop","off","_handlerBgSoundEndBind","stopBackgroundMusic","init","isMusicEnabled","activeBgSound","_getActiveBgSound","howlItem","_handlerBgSoundEnd","bind","once","play","setSettings","isSoundsEnabled","toggleMusicSetting","startBackgroundMusic","pauseBackgroundMusic","_playSoundById","soundId","warn","nextActiveIndex","nextActiveBgSound","shuffle","howlSound","seek","src","volume","html5","getSuccessShareText","movesCount","level","packName","suffix","services","pluralResolver","getSuffix","movePluralized","t","createOKSharing","attachmentConfig","FAPI","attachmentJSON","attachment","media","app","ok","appServerURL","appID","createAttachmentJSON","UI","postMediatopic","boostersConfig","hideBoosterHint","hideBoosterMoveBack","boosterHintInc","boosterHintDec","boosterMoveBackInc","boosterMoveBackDec","getBoosters","getBoostersSuccess","getUUID","createUUID","newUuid","uuidv4","UpdateBtn","NewLifeTime","handlerRenderer","hours","minutes","seconds","Fragment","handlerCountdownComplete","setState","countdownCompleted","onCountdownComplete","defer","checkCountdown","timerStartDate","maxLives","date","renderer","onComplete","nextState","getTimeDifference","withNamespaces","Settings","handlerSettingsBtnClick","wrapperClasses","SettingsBtn","playButtonSound","showSettingsModal","getEntitiesData","getWorldsData","getPropsPackID","getWorldsSelector","worldsEntity","getWorldSelector","getPackSelector","getPack","getLevelSelector","getLevel","getPackWithLevelsSelector","getWorldPacksSelector","worldsArray","firstWorld","firstPack","packLevelsIds","getLevelByEntityId","getMaxStarsInWorld","getSettingsRequest","getSettingsSuccess","getSettingsFailure","apiSettingsTutorial","fnDefer","arguments","args","Array","slice","call","apply","err","fetchSettingsTutorial","addSettingsTutorial","newProgress","concat","getSettings","analyticsName","analytics","loadable","lib","sendRouteMetric","currentRoute","previousRoute","fromRoute","divWrap","createElement","divVideoBlock","style","cssText","appendChild","Advertizer","purchaseItem","Observable","observer","complete","bodyEl","body","advStub","delay","removeChild","isInited","isAdvShowing","advKey","isSDKOK","sdk","YM","GA","reviewLink","logged_user_id_test","setGame","resetGame","clearStepsSpent","setStepsSpent","setGameLost","setMovesRunOut","setBestVertexCoords","setGraphCoords","setStepsLeft","setNotBestVertexData","showModal","hideModal","showLifePurchaseModal","priceBlob","showAdBlockModal","warningTextType","showSecondSessionModal","showWatchAdModal","showAdNotFoundModal","hideLifeReduceModal","hideLifePurchaseModal","hideSettingsModal","hideSecondSessionModal","hideWatchAdModal","hideAdNotFoundModal","showChangePriceModal","hideChangePriceModal","lookup","cookiesLang","lookupCookie","cacheUserLanguage","lng","resources","en","translation","translationEN","ru","translationRU","detectionOptions","order","caches","cookieMinutes","lngDetector","LngDetector","addDetector","thedollarGameLngDetector","reactI18nextModule","detection","debug","interpolation","escapeValue","DESKTOP_WIDTH","MOBILE_WIDTH","SMALL_MOBILE_WIDTH","TINY_MOBILE_WIDTH","LEVEL_ITEM_HEIGHT","LEVEL_ITEM_BOTTOM_OFFSET","MOBILE_LEVEL_ITEM_HEIGHT","MOBILE_LEVEL_ITEM_BOTTOM_OFFSET","CUSTOM_LIST_ITEM_HEIGHT","CUSTOM_LIST_ITEM_BOTTOM_OFFSET","includes","defineProperty","searchElement","fromIndex","TypeError","o","len","n","k","abs","isNaN","Boolean","hostname","LivesNumber","LivesNumberIcon","LivesNumberText","adsData","AddBtn","AddBtnDisabled","disabled","AddBtnPlusIcon","PayBtn","Icon","alt","UserLives","handlerShowADModalClick","handlerPayBtnClick","UserLivesNumberWrap","UserLifeTimeWrap","UserLivesAddButton","entryPoint","Header","handlerBackBtnClick","handlerUpdateBtnClick","headerClasses","dangerouslySetInnerHTML","__html","HeaderTitle","Settigs","click","Footer","shareText","fbShareLink","twShareLink","encodeURIComponent","twitterShareBtnRef","createRef","fbShareBtnRef","handlerOKShareClick","handlerOKGroupClick","waitTwitterInit","twttr","widgets","current","waitFBInit","FB","XFBML","parse","footerClasses","Line","Contacts","Tw","href","target","rel","Fb","Reddit","Sharings","ShareBtn","ref","data-href","data-layout","data-size","data-mobile-iframe","Info","i18nKey","Masked","FooterLink","Review","ReviewLink","Preloader","circlesRange","itemNumber","getAdsData","getAdsRequest","getAdsSuccess","getAdsFailure","OKAndroidManager","isSuggested","suggestTimeout","getAds","suggestCycle","suggestTime","clearTimeout","suggestDesktopIcon","OKApp","PageWrap","children","Page","string","func","circleDelta","Hint","handleRectClick","e","isInsideCircle","clientX","clientY","onCircleClick","animationDuration","hintClasses","textClasses","TextWrap","skipBtnText","HintWrap","viewBox","width","height","fill","node","circle","mask","fillOpacity","textWrap","Text","textNode","Btn","onBtnClick","btnNode","SkipBtn","SkipBtnPosition","onSkipBtnClick","skipBtnNode","innerHTML","btnText","classList","Hidden","sqrt","pow","btnSkipPosition","textWidth","textLeft","textBottom","innerHeight","textTop","setAttribute","getTextCSSProps","Visible","getSkipBtnPosition","anime","targets","easing","duration","anim","Tutorial","showHint","currTutorialHintIndex","defaultDeltaCircleR","tutorialLevels","isTransitionBetweenHints","resizeEventSubscr","isWaitingMode","waitingHintTimeout","handleBtnClick","currTutorialHint","showNextHint","handleCircleClick","tutorialLevelId","callGameBestVertexClick","setShowHint","subscribe","callWaitingHintIteration","callGameNotBestVertexClick","callBoosterHintClick","callBoosterMoveBackClick","handleSkipBtnClick","skipAllTutorials","executeWaitingHintIteration","callGameShowBestMoveHint","hintCircle","tutorialClasses","HintShow","hintTextData","handleHintText","deltaYOfCurrTutorialHint","hintBtnText","isLevelPassed","unsubscribe","hasTutorial","start","isGamePassed","setTutorialPassed","callUpdateGameData","tutorialHintsOfLevel","setCurrTutorialHintIndex","waitingHintOfLevel","startWaitingMode","startListeningResize","updateHintBgSize","resizeEvent$","fromEvent","pipe","debounceTime","updateBoostersCoords","animateDisappear","updateHint","animateAppear","updateBoostersInfinities","callGameUpdateStepsLeft","callGameShowNotBestMoveHint","innerWidth","stopWaitingMode","showHintDelay","setTimeout","callGameUpdateGraphCoord","callGameUpdateBestVertexCoord","callGameUpdateNotBestVertexData","boostersConfigOfLevel","movesText","rest","tutorialConfigOfLevel","createHintCircleData","deltaCircleR","createHintTextData","setHintBgSize","setHintCircle","hintActions","settingsActions","ModalsLoadable","ModalManager","handlerBackClick","loadedModals","SpecificModal","timeout","isOpen","ariaHideApp","onBackBtnClick","toggleSecondSessionModal","isLifeReduceModalShowed","removeLife","isModalShowed","checkUserExists","queryString","createUser","authUser","setUserUuid","checkUserRequest","checkUserSuccess","checkUserFailure","createUserRequest","createUserSuccess","createUserFailure","authUserRequest","authUserSuccess","authUserFailure","userAPI","sendUserLoginEvent","logins","UserId","Auth","LevelSchema","WorldId","PackSchema","WorldListSchema","getWorlds","normalizedData","checkSecondSession","setSecondSession","CustomListItem","isBlocked","starsAchieved","maxStarsCount","isVirtual","Blocked","Virtual","SizeSmall","CustomListItemTitle","CustomListItemRight","StarIcon","StarIconGrey","LockIcon","CustomListItemStarsRequired","CustomListItemStarsInfo","calcCustomListHeight","shape","marginBottom","maxAvailableHeight","listItem","fullHeight","visibleRowsCount","maxHeightWithItems","floor","ScrollbarHeightAdjuster","maxHeight","scrollWrapRef","clientHeight","LandingPage","isActive","hasContinueLevel","LogoWrap","Logo","LogoText","WorldsWrap","cssEnvVars","autoHide","worldItem","worldName","handlerWorldClick","lvl","history","firstWorldId","withRouter","PageTitle","titleClasses","StarsCounter","counterClasses","StarsIcon","currentStarsNumber","StarsSeparator","maxStarsNumber","windowInnerWidth","LevelsPage","goPageBack","routeBack","LevelsContent","LevelsShowed","LevelsPageTitle","LevelsListScrollWrap","LevelList","isLevelLocked","levelItemContentClasses","LevelItem","Locked","LevelItemWrap","handlerLevelClick","LevelItemNumber","LevelItemStars","LevelLocked","WorldPage","ContentWrap","WorldPageTitle","PacksWrap","packItem","isPackBlocked","handlerPackClick","ReactYMLoadable","PlaygroundPage","CheatPanel","App","setAutoFreeze","hiddenFooterPaths","path","exact","progressFetched","worldsFetched","isDeveloper","transitionClassName","hideFooter","some","matchPath","isLoading","PreloaderWrap","as","upperCase","childFactory","child","cloneElement","Switch","Route","render","Redirect","to","component","FooterHidden","OK","fallback","isAndroidOkApp","YMInitializer","accounts","clickmap","trackLinks","accurateTrackBounce","webvisor","version","setInfiniteBoosters","isAllowToRedirectActions","levelToRedirect","getLevelForRedirect","isTutorialLoad","updateSettings","fetchSettings","setSettingsLanguage","loadSDK","SdkOk","okParameters","logged_user_id","rootEl","getElementById","createBrowserHistory","ReactDOM","Router","serviceWorker","ready","registration","unregister","polyfillStable","of","flatMap","endsWith","padStart","repeat","entries","main","getLivesRequest","getLivesSuccess","getLivesFailure","getLivesPromise","promise","_","addLives","livesAPI","addLivesDeveloper","removeLivesDeveloper","tutorialHints","button","isInfiniteBoosterHint","deltaY","isInfiniteBoosterMoveBack","mins","exec","RegExp","$1","$2","v","parseInt","Number","putSettings","settingsData","putSettingsTutorial","items"],"mappings":"8HAAA,4BCAoC,0BDApC,4BCCoC,0BDDpC,4BCEoC,0BDFpC,6BCGoC,0BDHpC,6BCIoC,0BDJpC,6BCKoC,0BDLpC,6BCS8B,oBDT9B,4BCWsC,4BDXtC,4BCYsC,4BDZtC,4BCa2C,iCDb3C,4BCc2C,iCDd3C,6BCgBuC,6BDhBvC,6BCiB4C,kCDjB5C,4BCoB0C,gCDpB1C,4BCqB+C,qCDrB/C,6BCsByC,+BDtBzC,6BCuB8C,oCDvB9C,6BEAwB,cFAxB,6BEC0B,gBFD1B,4BEGiC,uBFHjC,6BEI+B,qBFJ/B,6BEK8B,oBFL9B,6BEM6B,mBFN7B,6BEOmC,yBFPnC,6BEQoC,0BFRpC,6BESkC,wBFTlC,4BEWsC,4BFXtC,4BEYsC,4BFZtC,4BEasC,4BFbtC,6BEe+B,qBFf/B,6BEgB6B,mBFhB7B,6BEiBiC,uBFjBjC,6BEkB+B,qBFlB/B,6BEoBsC,4BFpBtC,6BEqBgC,sBFrBhC,6BEuB8B,oBFvB9B,6BEwBwC,8BFxBxC,4BE2ByC,+BF3BzC,6BE4B6C,mCF5B7C,6BE6BiC,uBF7BjC,6BE8BgD,sCF9BhD,6BE+B0C,gCF/B1C,6BEgCyC,+BFhCzC,6BEiCmD,yCFjCnD,6BGA2B,iBHA3B,4BGEkC,wBHFlC,4BGGkC,wBHHlC,4BGIkC,wBHJlC,4BGMmC,yBHNnC,4BGOmC,yBHPnC,4BGQmC,yBHRnC,4BGUiC,uBHVjC,4BGWiC,uBHXjC,4BGYiC,uBHZjC,4BGcsC,4BHdtC,4BGesC,4BHftC,4BGgBsC,4BHhBtC,4BGkBmC,yBHlBnC,4BGmBmC,yBHnBnC,4BGoBmC,yBHpBnC,6BIA8B,oBJA9B,6BICsC,4BJDtC,4BIEwC,8BJFxC,6BIGmC,yBJHnC,6BIIkC,wBJJlC,4BKA+B,qBLA/B,4BKC+B,qBLD/B,4BKE+B,qBLF/B,6BMAyC,+BNAzC,6BMCyC,+BNDzC,6BMEyC,+BNFzC,4BOAiC,uBPAjC,4BOCiC,uBPDjC,4BOEiC,uBPFjC,6BOIkC,wBPJlC,6BOKkC,wBPLlC,4BOMoC,0BPNpC,4BQCoC,0BRDpC,4BQEoC,0BRFpC,4BQGoC,0BRHpC,6BQIoC,0BRJpC,6BQKoC,0BRLpC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","file":"static/js/main.f2eda17b.chunk.js","sourcesContent":["export * from './boosters';\nexport * from './game';\nexport * from './user';\nexport * from './cheats';\nexport * from './ads';\nexport * from './purchases';\nexport * from './lives';\nexport * from './settings';\nexport * from './header';\nexport * from './adblock';\nexport * from './secondSession';\nexport * from './progress';\nexport * from './worlds';\nexport * from './tutorial';\nexport * from './modals';\nexport * from './hint';\n","export const GET_BOOSTERS_REQUEST = 'GET_BOOSTERS_REQUEST';\nexport const GET_BOOSTERS_SUCCESS = 'GET_BOOSTERS_SUCCESS';\nexport const GET_BOOSTERS_FAILURE = 'GET_BOOSTERS_FAILURE';\nexport const PUT_BOOSTERS_REQUEST = 'PUT_BOOSTERS_REQUEST';\nexport const PUT_BOOSTERS_SUCCESS = 'PUT_BOOSTERS_SUCCESS';\nexport const PUT_BOOSTERS_FAILURE = 'PUT_BOOSTERS_FAILURE';\n\nexport const RECEIVED_BOOSTERS = 'RECEIVED_BOOSTERS';\nexport const SET_BOOSTERS = 'SET_BOOSTERS';\nexport const RESET_BOOSTERS = 'RESET_BOOSTERS';\n\nexport const BOOSTER_HINT_INCREMENT = 'BOOSTER_HINT_INCREMENT';\nexport const BOOSTER_HINT_DECREMENT = 'BOOSTER_HINT_DECREMENT';\nexport const BOOSTER_MOVE_BACK_INCREMENT = 'BOOSTER_MOVE_BACK_INCREMENT';\nexport const BOOSTER_MOVE_BACK_DECREMENT = 'BOOSTER_MOVE_BACK_DECREMENT';\n\nexport const SET_BOOSTER_HINT_COORDS = 'SET_BOOSTER_HINT_COORDS';\nexport const SET_BOOSTER_MOVE_BACK_COORDS = 'SET_BOOSTER_MOVE_BACK_COORDS';\n\n// actions for boosters component\nexport const BOOSTER_HINT_CLICK_REQUIRE = 'BOOSTER_HINT_CLICK_REQUIRE';\nexport const BOOSTER_MOVE_BACK_CLICK_REQUIRE = 'BOOSTER_MOVE_BACK_CLICK_REQUIRE';\nexport const SET_INFINITE_BOOSTER_HINT = 'SET_INFINITE_BOOSTER_HINT';\nexport const SET_INFINITE_BOOSTER_MOVE_BACK = 'SET_INFINITE_BOOSTER_MOVE_BACK';\n","export const SET_GAME = 'SET_GAME';\nexport const RESET_GAME = 'RESET_GAME';\n\nexport const CLEAR_STEPS_SPENT = 'CLEAR_STEPS_SPENT';\nexport const SET_STEPS_SPENT = 'SET_STEPS_SPENT';\nexport const SET_LEVEL_HASH = 'SET_LEVEL_HASH';\nexport const SET_MAX_STARS = 'SET_MAX_STARS';\nexport const SET_MAX_MOVES_COUNT = 'SET_MAX_MOVES_COUNT';\nexport const SET_BEST_MOVES_COUNT = 'SET_BEST_MOVES_COUNT';\nexport const SET_INFINITE_STEPS = 'SET_INFINITE_STEPS';\n\nexport const COMPLETE_LEVEL_REQUEST = 'COMPLETE_LEVEL_REQUEST';\nexport const COMPLETE_LEVEL_SUCCESS = 'COMPLETE_LEVEL_SUCCESS';\nexport const COMPLETE_LEVEL_FAILURE = 'COMPLETE_LEVEL_FAILURE';\n\nexport const SET_GAME_PASSED = 'SET_GAME_PASSED';\nexport const SET_GAME_LOST = 'SET_GAME_LOST';\nexport const SET_MOVES_RUN_OUT = 'SET_MOVES_RUN_OUT';\nexport const SET_CHEAT_STARS = 'SET_CHEAT_STARS';\n\nexport const SET_BEST_VERTEX_COORDS = 'SET_BEST_VERTEX_COORDS';\nexport const SET_GRAPH_COORDS = 'SET_GRAPH_COORDS';\n\nexport const SET_STEPS_LEFT = 'SET_STEPS_LEFT';\nexport const SET_NOT_BEST_VERTEX_DATA = 'SET_NOT_BEST_VERTEX_DATA';\n\n// actions for game component\nexport const BEST_VERTEX_CLICK_REQUIRE = 'BEST_VERTEX_CLICK_REQUIRE';\nexport const NOT_BEST_VERTEX_CLICK_REQUIRE = 'NOT_BEST_VERTEX_CLICK_REQUIRE';\nexport const SHOW_HINT_REQUIRE = 'SHOW_HINT_REQUIRE';\nexport const UPDATE_BEST_VERTEX_COORD_REQUIRE = 'UPDATE_BEST_VERTEX_COORD_REQUIRE';\nexport const UPDATE_GRAPH_COORD_REQUIRE = 'UPDATE_GRAPH_COORD_REQUIRE';\nexport const UPDATE_STEPS_LEFT_REQUIRE = 'UPDATE_STEPS_LEFT_REQUIRE';\nexport const UPDATE_NOT_BEST_VERTEX_DATA_REQUIRE = 'UPDATE_NOT_BEST_VERTEX_DATA_REQUIRE'; // for tutorial \"move back\"","export const SET_USER_ID = 'SET_USER_ID';\n\nexport const CHECK_USER_REQUEST = 'CHECK_USER_REQUEST';\nexport const CHECK_USER_SUCCESS = 'CHECK_USER_SUCCESS';\nexport const CHECK_USER_FAILURE = 'CHECK_USER_FAILURE';\n\nexport const CREATE_USER_REQUEST = 'CREATE_USER_REQUEST';\nexport const CREATE_USER_SUCCESS = 'CREATE_USER_SUCCESS';\nexport const CREATE_USER_FAILURE = 'CREATE_USER_FAILURE';\n\nexport const AUTH_USER_REQUEST = 'AUTH_USER_REQUEST';\nexport const AUTH_USER_SUCCESS = 'AUTH_USER_SUCCESS';\nexport const AUTH_USER_FAILURE = 'AUTH_USER_FAILURE';\n\nexport const DELETE_SESSION_REQUEST = 'DELETE_SESSION_REQUEST';\nexport const DELETE_SESSION_SUCCESS = 'DELETE_SESSION_SUCCESS';\nexport const DELETE_SESSION_FAILURE = 'DELETE_SESSION_FAILURE';\n\nexport const DELETE_USER_REQUEST = 'DELETE_USER_REQUEST';\nexport const DELETE_USER_SUCCESS = 'DELETE_USER_SUCCESS';\nexport const DELETE_USER_FAILURE = 'DELETE_USER_FAILURE';","export const SET_CHEAT_MODE = 'SET_CHEAT_MODE';\nexport const SET_FINISH_LEVEL_CHEAT = 'SET_FINISH_LEVEL_CHEAT';\nexport const CLEAR_FINISH_LEVEL_CHEAT = 'CLEAR_FINISH_LEVEL_CHEAT';\nexport const SET_PAGE_WITH_LIFES = 'SET_PAGE_WITH_LIFES';\nexport const SET_PAGE_WITH_GAME = 'SET_PAGE_WITH_GAME';\n","export const GET_ADS_REQUEST = 'GET_ADS_REQUEST';\nexport const GET_ADS_SUCCESS = 'GET_ADS_SUCCESS';\nexport const GET_ADS_FAILURE = 'GET_ADS_FAILURE';\n","export const SET_LIFE_PURCHASE_REQUEST = 'SET_LIFE_PURCHASE_REQUEST';\nexport const SET_LIFE_PURCHASE_SUCCESS = 'SET_LIFE_PURCHASE_SUCCESS';\nexport const SET_LIFE_PURCHASE_FAILURE = 'SET_LIFE_PURCHASE_FAILURE';\n","export const GET_LIVES_REQUEST = 'GET_LIVES_REQUEST';\nexport const GET_LIVES_SUCCESS = 'GET_LIVES_SUCCESS';\nexport const GET_LIVES_FAILURE = 'GET_LIVES_FAILURE';\n\nexport const RESET_LIVES_NUMBER = 'RESET_LIVES_NUMBER';\nexport const SET_NEW_LIFE_TIMER = 'SET_NEW_LIFE_TIMER';\nexport const CLEAR_NEW_LIFE_TIMER = 'CLEAR_NEW_LIFE_TIMER';\n","\nexport const GET_SETTINGS_REQUEST = 'GET_SETTINGS_REQUEST';\nexport const GET_SETTINGS_SUCCESS = 'GET_SETTINGS_SUCCESS';\nexport const GET_SETTINGS_FAILURE = 'GET_SETTINGS_FAILURE';\nexport const PUT_SETTINGS_REQUEST = 'PUT_SETTINGS_REQUEST';\nexport const PUT_SETTINGS_SUCCESS = 'PUT_SETTINGS_SUCCESS';\nexport const PUT_SETTINGS_FAILURE = 'PUT_SETTINGS_FAILURE';\nexport const SET_SETTINGS = 'SET_SETTINGS';\n\nexport const GET_SETTINGS_TUTORIAL_REQUEST = 'GET_SETTINGS_TUTORIAL_REQUEST';\nexport const GET_SETTINGS_TUTORIAL_SUCCESS = 'GET_SETTINGS_TUTORIAL_SUCCESS';\nexport const GET_SETTINGS_TUTORIAL_ERROR = 'GET_SETTINGS_TUTORIAL_ERROR';\n","export const HEADER_RESET = 'HEADER_RESET';\nexport const HEADER_TOGGLE_SETTINGS = 'HEADER_TOGGLE_SETTINGS';\nexport const HEADER_TOGGLE_BACK_BTN = 'HEADER_TOGGLE_BACK_BTN';\nexport const HEADER_TOGGLE_UPDATE_BTN = 'HEADER_TOGGLE_UPDATE_BTN';\nexport const HEADER_TOGGLE_USER_LIFES = 'HEADER_TOGGLE_USER_LIFES';\nexport const HEADER_TOGGLE_TITLE = 'HEADER_TOGGLE_TITLE';\nexport const HEADER_BACK_BTN_CLICK = 'HEADER_BACK_BTN_CLICK';\nexport const HEADER_UPDATE_BTN_CLICK = 'HEADER_UPDATE_BTN_CLICK';\n","export const SET_ADBLOCK_DETECTED = 'SET_ADBLOCK_DETECTED';\n","export const SET_SECOND_SESSION = 'SET_SECOND_SESSION';","export const CLEAR_PROGRESS_REQUEST = 'CLEAR_PROGRESS_REQUEST';\nexport const CLEAR_PROGRESS_SUCCESS = 'CLEAR_PROGRESS_SUCCESS';\nexport const CLEAR_PROGRESS_FAILURE = 'CLEAR_PROGRESS_FAILURE';\n\nexport const GET_WORLDS_PROGRESS_SUCCESS = 'GET_WORLDS_PROGRESS_SUCCESS';\nexport const GET_WORLDS_PROGRESS_FAILURE = 'GET_WORLDS_PROGRESS_FAILURE';\nexport const RESET_WORLDS_PROGRESS = 'RESET_WORLDS_PROGRESS';\n\nexport const UPDATE_LEVEL_PROGRESS_SUCCESS = 'UPDATE_LEVEL_PROGRESS_SUCCESS';\nexport const UPDATE_LEVEL_PROGRESS_FAILURE = 'UPDATE_LEVEL_PROGRESS_FAILURE';\n\nexport const CALC_ALL_ACHIEVED_STARS = 'CALC_ALL_ACHIEVED_STARS';\n","export const GET_WORLDS_SUCCESS = 'GET_WORLDS_SUCCESS';\nexport const GET_WORLDS_FAILURE = 'GET_WORLDS_FAILURE';\n","export const UPDATE_ACTIVE_LEVEL_ID = 'UPDATE_ACTIVE_LEVEL_ID';\nexport const SET_TUTORIAL_PASSED = 'SET_TUTORIAL_PASSED';\nexport const RESET_TUTORIAL = 'RESET_TUTORIAL';","export const SHOW_MODAL = 'SHOW_MODAL';\nexport const HIDE_MODAL = 'HIDE_MODAL';\n","export const SHOW_HINT = 'SHOW_HINT';\nexport const SET_HINT_TYPE = 'SET_HINT_TYPE';\nexport const SET_HINT_CIRCLE = 'SET_HINT_CIRCLE';\nexport const SET_HINT_TEXT = 'SET_HINT_TEXT';\nexport const SET_HINT_BG_SIZE = 'SET_HINT_BG_SIZE';","import { Component } from 'react';\nimport { connect } from 'react-redux';\n\n// redux\nimport {\n reset, toggleSettings, toggleBackBtn, toggleUpdateBtn,\n toggleUserLives, toggleTitle,\n} from 'redux/actions/header';\n\n\nconst mapStateToProps = state => ({\n headerBackBtnClick: state.header.backBtnClick,\n headerUpdateBtnClick: state.header.updateBtnClick,\n});\n\nconst mapDispatchToProps = dispatch => ({\n reset: () => dispatch(reset()),\n showHeaderSettings: (toggle) => dispatch(toggleSettings(toggle)),\n showHeaderBackBtn: (toggle) => dispatch(toggleBackBtn(toggle)),\n showHeaderUpdateBtn: (toggle) => dispatch(toggleUpdateBtn(toggle)),\n showHeaderUserLives: (toggle) => dispatch(toggleUserLives(toggle)),\n showHeaderTitle: (toggle, title) => dispatch(toggleTitle(toggle, title)),\n});\n\nclass PageHeaderManager extends Component {\n\n\t/******************************************\n\t* COMPONENT HOOKS\n\t******************************************/\n\n render() {\n return null;\n }\n\n componentDidMount() {\n this.updatePageHeader();\n }\n\n componentDidUpdate(prevProps) {\n // back btn visibility\n if (this.props.showBackBtn !== prevProps.showBackBtn) {\n this.updateVisibilityBackBtn();\n }\n \n // update btn visibility\n if (this.props.showUpdateBtn !== prevProps.showUpdateBtn) {\n this.updateVisibilityUpdateBtn();\n }\n \n // update user lives visibility\n if (this.props.showUserLives !== prevProps.showUserLives) {\n this.updateVisibilityUserLives();\n }\n \n // update settings visibility\n if (this.props.showSettings !== prevProps.showSettings) {\n this.updateVisibilitySettings();\n }\n \n // title changes\n if (this.props.title !== prevProps.title ||\n this.props.showTitle !== prevProps.showTitle) {\n this.updateTitle();\n }\n\n // back btn click\n if (this.props.headerBackBtnClick && this.props.headerBackBtnClick !== prevProps.headerBackBtnClick) {\n this.props.onBackClick();\n }\n \n // update btn click\n if (this.props.headerUpdateBtnClick && this.props.headerUpdateBtnClick !== prevProps.headerUpdateBtnClick) {\n this.props.onUpdateClick();\n }\n }\n\n\t/******************************************\n\t* COMPONENT METHODS\n\t******************************************/\n\n updatePageHeader() {\n // header management\n this.props.reset();\n this.updateVisibilityBackBtn();\n this.updateVisibilityUpdateBtn();\n this.updateVisibilityUserLives();\n this.updateVisibilitySettings();\n this.updateTitle();\n }\n\n updateVisibilityBackBtn() {\n this.props.showHeaderBackBtn(!!this.props.showBackBtn);\n }\n \n updateVisibilityUpdateBtn() {\n this.props.showHeaderUpdateBtn(!!this.props.showUpdateBtn);\n }\n\n updateVisibilityUserLives() {\n this.props.showHeaderUserLives(!!this.props.showUserLives);\n }\n \n updateVisibilitySettings() {\n this.props.showHeaderSettings(!!this.props.showSettings);\n }\n\n updateTitle() {\n this.props.showHeaderTitle(!!this.props.showTitle, this.props.title);\n }\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(PageHeaderManager);","import PageHeaderManager from './PageHeaderManager';\n\nexport default PageHeaderManager;\n","import React, { Component, } from 'react';\n\nimport { getAnalyticsID, isAnalyticsEnabled, loadYandexMetrica, loadReactGA } from 'shared/helpers/analytics';\n\nif (isAnalyticsEnabled) {\n loadReactGA().then(({ initialize }) => {\n initialize(getAnalyticsID('GA'));\n });\n}\n\nconst withTracker = (WrappedComponent, options = {}) => {\n const trackPage = page => {\n if (isAnalyticsEnabled) {\n loadReactGA().then(({ set, pageview }) => {\n set({\n page,\n ...options,\n });\n pageview(page);\n });\n loadYandexMetrica().then(({ default: ym }) => {\n ym('hit', page);\n })\n }\n };\n\n // eslint-disable-next-line\n const HOC = class extends Component {\n componentDidMount() {\n // eslint-disable-next-line\n const page = this.props.location.pathname + this.props.location.search;\n trackPage(page);\n }\n\n componentDidUpdate(prevProps) {\n const currentPage =\n prevProps.location.pathname + prevProps.location.search;\n const nextPage =\n this.props.location.pathname + this.props.location.search;\n\n if (currentPage !== nextPage) {\n trackPage(nextPage);\n }\n }\n\n render() {\n return ;\n }\n };\n\n return HOC;\n};\n\nexport default withTracker;","import withTracker from './withTracker';\n\nexport default withTracker;\n","const LOAD_SEARCH_ADDRESS = window.location.search;\nexport default function load() {\n\n // load ok sdk\n if (/web_server=https%3A%2F%2F(m\\.)?ok\\.ru/.test(LOAD_SEARCH_ADDRESS)) {\n return import('./SdkOk') as Promise\n }\n return Promise.reject();\n}\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"headerMaxWidth\":\"780px\",\"Header\":\"Header_Header__1xrSh\",\"HeaderTitle\":\"Header_HeaderTitle__mOAgj\",\"BackBtn\":\"Header_BackBtn__EF6Sr\",\"UpdateBtn\":\"Header_UpdateBtn__16sBI\",\"Settigs\":\"Header_Settigs__2juOz\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"cWhite\":\"#FFFFFF\",\"headerHorizontalOffset\":\"20px\",\"pageTopPadding\":\"65px\",\"LandingPage\":\"LandingPage_LandingPage__SzWht\",\"LogoWrap\":\"LandingPage_LogoWrap__3kXfC\",\"Logo\":\"LandingPage_Logo__2uGVc\",\"LogoText\":\"LandingPage_LogoText__2fRSV\",\"Title\":\"LandingPage_Title__100ae\",\"BtnsWrap\":\"LandingPage_BtnsWrap__1XW6W\",\"Btn\":\"LandingPage_Btn__1ErwP\",\"Text\":\"LandingPage_Text__x8Pzh\",\"Link\":\"LandingPage_Link__9njmX\",\"WorldsWrap\":\"LandingPage_WorldsWrap__DznCb\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"cWhite\":\"#FFFFFF\",\"StarsWrap\":\"Stars_StarsWrap__2noun\",\"ResizeOnMobile\":\"Stars_ResizeOnMobile__z9Gpc\",\"Star\":\"Stars_Star__2zudH\",\"StarOutline\":\"Stars_StarOutline__rHgmw\",\"StarFilled\":\"Stars_StarFilled__Nsf8R\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"cWhite\":\"#FFFFFF\",\"cTradewind\":\"#6BBCB4\",\"wLangBtn\":\"50px\",\"wLangBtnMobile\":\"43px\",\"WorldPage\":\"WorldPage_WorldPage__31cLX\",\"WorldPageTitle\":\"WorldPage_WorldPageTitle__aqpQx\",\"BackBtn\":\"WorldPage_BackBtn__1qROa\",\"ContentWrap\":\"WorldPage_ContentWrap__q3p6n\",\"PacksWrap\":\"WorldPage_PacksWrap__1xMeI\",\"StarsCounter\":\"WorldPage_StarsCounter__13fOK\"};","import axiosInstance from 'shared/api/axiosInstance';\n\n\nexport const fetchBoosters = () => {\n return axiosInstance.get('/boosters');\n};\n\nexport const putBoosters = boostersData => {\n return axiosInstance.put('/boosters', boostersData);\n};","import axiosInstance from 'shared/api/axiosInstance';\n\n\nexport interface IPutLivesParams {\n livesNumber: number;\n maxLivesNumber: number;\n newLifeTimer: number;\n infiniteLife: boolean;\n lifeRestoreMinutes: string;\n}\n\nexport const fetchLives = () =>\n axiosInstance.get('/lives') as any as Promise\n\nexport const putLives = (data: Partial) =>\n axiosInstance.put('/lives', data) as any as Promise;\n\nexport const deleteLivesNumber = () =>\n axiosInstance.delete('/lives') as any as Promise\n\nexport const increaseLivesNumber = () =>\n axiosInstance.post('/lives') as any as Promise\n\nexport const deleteLivesNumberSync = (token: string) => {\n const xhr = new XMLHttpRequest();\n xhr.open('DELETE', `${process.env.REACT_APP_API_SERVER}/lives`, false);\n xhr.setRequestHeader('Content-type', 'application/json; charset=utf-8');\n xhr.setRequestHeader('X-Session-Token', token);\n xhr.send();\n}\n","import { BehaviorSubject } from 'rxjs/BehaviorSubject';\n\nconst keys = {\n hidden: \"visibilitychange\",\n webkitHidden: \"webkitvisibilitychange\",\n mozHidden: \"mozvisibilitychange\",\n msHidden: \"msvisibilitychange\",\n};\n\nlet stateKey, eventKey;\nfor (stateKey in keys) {\n if (stateKey in document) {\n eventKey = keys[stateKey];\n break;\n }\n}\n\n// To be sure that event listeners are being added only one time\nlet visibilityListenersAdded = false;\n\n// iOS Safari 7.x - native support not working, polyfilled with pageshow/pagehide events\nconst isSafari7 = navigator.userAgent.match(/(iPad|iPhone|iPod touch);.*CPU.*OS 7_\\d/i);\n\nconst tabVisibilitySubj = new BehaviorSubject(eventKey ? !document[stateKey] : true);\n/**\n * Subscribe on tabVisibility$ observable for handling tab visibility change\n * Emit true if tab is active, false if inactive\n */\nexport const tabVisibility$ = tabVisibilitySubj.asObservable();\n\n/**\n * Add EventListeners, detect if browser tab is active\n * Must be called once after application init\n*/\nexport const detectTabVisibility = () => {\n if (visibilityListenersAdded) return;\n visibilityListenersAdded = true;\n if (isSafari7) {\n // Hack for iOS Safari 7.x\n // Safari reports that support Page Visibility API, but event 'visibilitychange' never happen\n document.addEventListener('pageshow', () => {\n tabVisibilitySubj.next(true);\n }, false);\n document.addEventListener('pagehide', () => {\n tabVisibilitySubj.next(false);\n }, false);\n } else if (eventKey) {\n // browsers supporting Page Visibility API\n document.addEventListener(eventKey, (event) => {\n if (!document[stateKey]) {\n // tab is active\n tabVisibilitySubj.next(true);\n } else {\n // tab is inactive\n tabVisibilitySubj.next(false);\n }\n });\n } else {\n // bind focus/blur event for browsers not supporting Page Visibility API\n document.addEventListener(\"focus\", (event) => {\n // tab is active\n tabVisibilitySubj.next(true);\n }, false);\n\n document.addEventListener(\"blur\", (event) => {\n // tab is inactive\n tabVisibilitySubj.next(false);\n }, false);\n }\n};\n\n/**\n * Check if tab is visible\n * @return {boolean}\n */\nexport const isTabVisible = () => {\n return tabVisibilitySubj.getValue();\n};\n","import { UPDATE_ACTIVE_LEVEL_ID, SET_TUTORIAL_PASSED, RESET_TUTORIAL } from '../../redux/actionTypes';\nimport { updateSettingsTutorial } from './settings';\n\n\nexport const updateActiveLevelId = (activeLevelId?: number) => ({\n type: UPDATE_ACTIVE_LEVEL_ID,\n activeLevelId\n});\n\nexport const passTutorial = () => {\n return function (dispatch: any) {\n dispatch({ type: SET_TUTORIAL_PASSED });\n updateSettingsTutorial()(dispatch);\n };\n};\n\nexport const resetTutorial = () => {\n return function (dispatch: any) {\n dispatch({ type: RESET_TUTORIAL });\n updateSettingsTutorial([])(dispatch);\n };\n};\n","import isNil from 'lodash/isNil';\nimport {\n GET_BOOSTERS_REQUEST, GET_BOOSTERS_SUCCESS, GET_BOOSTERS_FAILURE,\n PUT_BOOSTERS_REQUEST, PUT_BOOSTERS_SUCCESS, PUT_BOOSTERS_FAILURE,\n BOOSTER_HINT_INCREMENT, BOOSTER_HINT_DECREMENT,\n BOOSTER_MOVE_BACK_INCREMENT, BOOSTER_MOVE_BACK_DECREMENT, RESET_BOOSTERS,\n SET_BOOSTER_HINT_COORDS, SET_BOOSTER_MOVE_BACK_COORDS,\n BOOSTER_HINT_CLICK_REQUIRE, BOOSTER_MOVE_BACK_CLICK_REQUIRE,\n SET_INFINITE_BOOSTER_HINT, SET_INFINITE_BOOSTER_MOVE_BACK,\n} from 'redux/actionTypes';\n\n\nconst boosterHintIncCount = 3;\nconst boosterMoveBackIncCount = 1;\n\nconst initialState = {\n hintCount: null,\n maxHintCount: 15,\n moveBackCount: null,\n maxMoveBackCount: 5,\n // api requests\n isGetBoostersInProcess: false,\n isGetBoostersError: false,\n isPutBoostersInProcess: false,\n isPutBoostersError: false,\n // coords\n boosterHintX: 0,\n boosterHintY: 0,\n boosterHintR: 0,\n boosterMoveBackX: 0,\n boosterMoveBackY: 0,\n boosterMoveBackR: 0,\n // requests for actions\n hasBoosterHintClickRequire: false,\n hasBoosterMoveBackClickRequire: false,\n \n infiniteBoosterHint: false,\n infiniteBoosterMoveBack: false,\n};\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case GET_BOOSTERS_REQUEST: {\n return {\n ...state,\n isGetBoostersInProcess: true,\n isGetBoostersError: false,\n };\n }\n case GET_BOOSTERS_SUCCESS: {\n if (action.boosters) {\n const { hintCount, maxHintCount, moveBackCount, maxMoveBackCount } = action.boosters;\n return {\n ...state,\n hintCount: Math.min(hintCount, maxHintCount),\n maxHintCount,\n moveBackCount: Math.min(moveBackCount, maxMoveBackCount),\n maxMoveBackCount,\n isGetBoostersInProcess: false,\n isGetBoostersError: false,\n };\n }\n return {\n ...state,\n hintCount: state.maxHintCount,\n moveBackCount: state.maxMoveBackCount,\n isGetBoostersInProcess: false,\n isGetBoostersError: false,\n };\n }\n case GET_BOOSTERS_FAILURE: {\n return {\n ...state,\n isGetBoostersInProcess: false,\n isGetBoostersError: true,\n };\n }\n case PUT_BOOSTERS_REQUEST: {\n return {\n ...state,\n isPutBoostersInProcess: true,\n isPutBoostersError: false,\n };\n }\n case PUT_BOOSTERS_SUCCESS: {\n return {\n ...state,\n isPutBoostersInProcess: false,\n isPutBoostersError: false,\n };\n }\n case PUT_BOOSTERS_FAILURE: {\n return {\n ...state,\n isPutBoostersInProcess: false,\n isPutBoostersError: true,\n };\n }\n case BOOSTER_HINT_INCREMENT: {\n return {\n ...state,\n hintCount: state.hintCount + boosterHintIncCount,\n moveBackCount: state.moveBackCount,\n };\n }\n case BOOSTER_HINT_DECREMENT: {\n return {\n ...state,\n hintCount: Math.max(0, state.hintCount - 1),\n moveBackCount: state.moveBackCount,\n };\n }\n case BOOSTER_MOVE_BACK_INCREMENT: {\n return {\n ...state,\n hintCount: state.hintCount,\n moveBackCount: state.moveBackCount + boosterMoveBackIncCount,\n };\n }\n case BOOSTER_MOVE_BACK_DECREMENT: {\n return {\n ...state,\n hintCount: state.hintCount,\n moveBackCount: Math.max(0, state.moveBackCount - 1),\n };\n }\n case RESET_BOOSTERS: {\n return {\n ...state,\n hintCount: state.maxHintCount,\n moveBackCount: state.maxMoveBackCount,\n };\n }\n case SET_BOOSTER_HINT_COORDS: {\n return {\n ...state,\n boosterHintX: action.x,\n boosterHintY: action.y,\n boosterHintR: action.r,\n };\n }\n case SET_BOOSTER_MOVE_BACK_COORDS: {\n return {\n ...state,\n boosterMoveBackX: action.x,\n boosterMoveBackY: action.y,\n boosterMoveBackR: action.r,\n };\n }\n case BOOSTER_HINT_CLICK_REQUIRE: {\n return {\n ...state,\n hasBoosterHintClickRequire: isNil(action.require) ? true : action.require,\n };\n }\n case BOOSTER_MOVE_BACK_CLICK_REQUIRE: {\n return {\n ...state,\n hasBoosterMoveBackClickRequire: isNil(action.require) ? true : action.require,\n };\n }\n case SET_INFINITE_BOOSTER_HINT: {\n const infiniteBoosterHint = isNil(action.infinite) ? true : action.infinite;\n return {\n ...state,\n infiniteBoosterHint,\n }\n }\n case SET_INFINITE_BOOSTER_MOVE_BACK: {\n const infiniteBoosterMoveBack = isNil(action.infinite) ? true : action.infinite;\n return {\n ...state,\n infiniteBoosterMoveBack,\n }\n }\n default:\n return state;\n }\n}\n","import isNil from 'lodash/isNil';\nimport {\n SET_GAME, RESET_GAME,\n CLEAR_STEPS_SPENT, SET_STEPS_SPENT, SET_LEVEL_HASH,\n SET_MAX_STARS, SET_MAX_MOVES_COUNT, SET_BEST_MOVES_COUNT,\n SET_GAME_PASSED, SET_GAME_LOST, SET_MOVES_RUN_OUT, SET_CHEAT_STARS,\n SET_BEST_VERTEX_COORDS, SET_GRAPH_COORDS,\n SET_STEPS_LEFT, SET_NOT_BEST_VERTEX_DATA,\n BEST_VERTEX_CLICK_REQUIRE, NOT_BEST_VERTEX_CLICK_REQUIRE, SHOW_HINT_REQUIRE, \n UPDATE_BEST_VERTEX_COORD_REQUIRE, UPDATE_GRAPH_COORD_REQUIRE,\n SET_INFINITE_STEPS, UPDATE_STEPS_LEFT_REQUIRE, UPDATE_NOT_BEST_VERTEX_DATA_REQUIRE,\n} from 'redux/actionTypes';\nimport { getAchievedStarsAmount, getStepsForCheatStars } from 'shared/helpers/progress';\n\n\nconst initialState = {\n worldId: null,\n packId: null,\n levelId: null,\n levelHash: null,\n stepsSpent: 0,\n maxMovesCount: 0,\n bestMovesCount: 0,\n maxStars: 0,\n achievedStars: 0,\n cheatStars: 0, // if user passed it with cheat\n // final states\n passed: false,\n lost: false,\n movesRunOut: false,\n // coordinates\n bestVertexX: 0,\n bestVertexY: 0,\n bestVertexR: 0,\n graphX: 0,\n graphY: 0,\n graphR: 0,\n // requests for actions\n hasBestVertexClickRequire: false,\n hasShowHintRequire: false,\n hasUpdateBestVertexCoordRequire: false,\n hasUpdateGraphCoordRequire: false,\n infiniteSteps: false,\n \n // AI steps left & action require\n hasUpdateStepsLeftRequire: false,\n stepsLeft: null,\n\n // best vertex data & action require\n hasUpdateNotBestVertexDataRequire: false,\n hasNotBestVertexClickRequire: false,\n notBestVertexIndex: -1,\n notBestVertexX: 0,\n notBestVertexY: 0,\n notBestVertexR: 0,\n};\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case SET_GAME: {\n return {\n ...initialState,\n worldId: action.worldId,\n packId: action.packId,\n levelId: action.levelId,\n levelHash: action.levelHash,\n maxMovesCount: action.maxMovesCount,\n bestMovesCount: action.bestMovesCount,\n maxStars: action.maxStars,\n stepsSpent: 0,\n achievedStars: 0,\n cheatStars: 0, // if user passed it with cheat\n passed: false,\n lost: false,\n movesRunOut: false,\n };\n }\n case RESET_GAME: {\n return {\n ...state,\n stepsSpent: 0,\n achievedStars: 0,\n cheatStars: 0, // if user passed it with cheat\n passed: false,\n lost: false,\n movesRunOut: false,\n };\n }\n case CLEAR_STEPS_SPENT: {\n return {\n ...state,\n stepsSpent: initialState.stepsSpent,\n };\n }\n case SET_STEPS_SPENT: {\n return {\n ...state,\n stepsSpent: action.stepsSpent,\n };\n }\n case SET_LEVEL_HASH: {\n return {\n ...state,\n levelHash: action.levelHash,\n };\n }\n case SET_MAX_STARS: {\n return {\n ...state,\n maxStars: action.maxStars,\n };\n }\n case SET_MAX_MOVES_COUNT: {\n return {\n ...state,\n maxMovesCount: action.maxMovesCount,\n };\n }\n case SET_BEST_MOVES_COUNT: {\n return {\n ...state,\n bestMovesCount: action.bestMovesCount,\n };\n }\n case SET_INFINITE_STEPS: {\n return {\n ...state,\n infiniteSteps: !!action.infiniteSteps,\n };\n }\n case SET_GAME_PASSED: {\n const cheatSteps = (state.cheatStars > 0) ?\n getStepsForCheatStars(\n state.maxMovesCount,\n state.bestMovesCount,\n state.maxStars,\n state.cheatStars,\n ) : 0;\n \n const achievedStars = getAchievedStarsAmount(\n state.maxMovesCount,\n state.bestMovesCount,\n state.stepsSpent,\n state.maxStars,\n state.cheatStars,\n );\n\n return {\n ...state,\n stepsSpent: cheatSteps ? cheatSteps : state.stepsSpent,\n passed: isNil(action.passed) || action.passed,\n lost: false,\n movesRunOut: false,\n achievedStars,\n };\n }\n case SET_GAME_LOST: {\n return {\n ...state,\n passed: false,\n lost: isNil(action.lost) || action.lost,\n movesRunOut: false,\n };\n }\n case SET_MOVES_RUN_OUT: {\n return {\n ...state,\n passed: false,\n lost: false,\n movesRunOut: isNil(action.movesRunOut) || action.movesRunOut,\n };\n }\n case SET_CHEAT_STARS: {\n return {\n ...state,\n cheatStars: action.cheatStars,\n };\n }\n case SET_BEST_VERTEX_COORDS: {\n return {\n ...state,\n bestVertexX: action.x,\n bestVertexY: action.y,\n bestVertexR: action.r,\n };\n }\n case SET_GRAPH_COORDS: {\n return {\n ...state,\n graphX: action.x,\n graphY: action.y,\n graphR: action.r,\n };\n }\n case SET_STEPS_LEFT: {\n return {\n ...state,\n stepsLeft: action.stepsLeft,\n };\n }\n case SET_NOT_BEST_VERTEX_DATA: {\n return {\n ...state,\n notBestVertexIndex: action.index,\n notBestVertexX: action.x,\n notBestVertexY: action.y,\n notBestVertexR: action.r,\n };\n }\n case BEST_VERTEX_CLICK_REQUIRE: {\n return {\n ...state,\n hasBestVertexClickRequire: isNil(action.require) ? true : action.require,\n };\n }\n case NOT_BEST_VERTEX_CLICK_REQUIRE: {\n return {\n ...state,\n hasNotBestVertexClickRequire: isNil(action.require) ? true : action.require,\n };\n }\n case UPDATE_BEST_VERTEX_COORD_REQUIRE: {\n return {\n ...state,\n hasUpdateBestVertexCoordRequire: isNil(action.require) ? true : action.require,\n };\n }\n case UPDATE_GRAPH_COORD_REQUIRE: {\n return {\n ...state,\n hasUpdateGraphCoordRequire: isNil(action.require) ? true : action.require,\n };\n }\n case SHOW_HINT_REQUIRE: {\n return {\n ...state,\n hasShowHintRequire: isNil(action.require) ? true : action.require,\n };\n }\n case UPDATE_STEPS_LEFT_REQUIRE: {\n return {\n ...state,\n hasUpdateStepsLeftRequire: isNil(action.require) ? true : action.require,\n };\n }\n case UPDATE_NOT_BEST_VERTEX_DATA_REQUIRE: {\n return {\n ...state,\n hasUpdateNotBestVertexDataRequire: isNil(action.require) ? true : action.require,\n };\n }\n default:\n return state;\n }\n}\n","import {\n SET_USER_ID, CHECK_USER_REQUEST, CHECK_USER_SUCCESS, CHECK_USER_FAILURE,\n CREATE_USER_REQUEST, CREATE_USER_SUCCESS, CREATE_USER_FAILURE,\n AUTH_USER_REQUEST, AUTH_USER_SUCCESS, AUTH_USER_FAILURE,\n DELETE_USER_REQUEST, DELETE_USER_SUCCESS, DELETE_USER_FAILURE,\n DELETE_SESSION_REQUEST, DELETE_SESSION_SUCCESS, DELETE_SESSION_FAILURE\n} from 'redux/actionTypes';\n\n\nconst initialState = {\n id: null,\n userId: null,\n okUuid: null,\n uuid: null,\n secretApiToken: null,\n token: null,\n isAuth: false,\n // requests statuses\n isCheckUserInProcess: false,\n isCheckUserError: false,\n isCreateUserInProcess: false,\n isCreateUserError: false,\n isAuthUserInProcess: false,\n isAuthUserError: false,\n isDeleteUserInProcess: false,\n isDeleteUserError: false,\n isDeleteSessionInProcess: false,\n isDeleteSessionError: false,\n};\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n\n // SET USER ID\n\n case SET_USER_ID: {\n return {\n ...state,\n uuid: action.uuid,\n }\n }\n\n // CHECK USER\n\n case CHECK_USER_REQUEST: {\n return {\n ...state,\n isCheckUserInProcess: true,\n isCheckUserError: false,\n }\n }\n case CHECK_USER_SUCCESS: {\n return {\n ...state,\n isCheckUserInProcess: false,\n isCheckUserError: false,\n };\n }\n case CHECK_USER_FAILURE: {\n return {\n ...state,\n isCheckUserInProcess: false,\n isCheckUserError: true,\n };\n }\n\n // CREATE USER\n\n case CREATE_USER_REQUEST: {\n return {\n ...state,\n isCreateUserInProcess: true,\n isCreateUserError: false,\n }\n }\n case CREATE_USER_SUCCESS: {\n return {\n ...state,\n isCreateUserInProcess: false,\n isCreateUserError: false,\n };\n }\n case CREATE_USER_FAILURE: {\n return {\n ...state,\n isCreateUserInProcess: false,\n isCreateUserError: true,\n };\n }\n\n // AUTH USER\n\n case AUTH_USER_REQUEST: {\n return {\n ...state,\n isAuthUserInProcess: true,\n isAuthUserError: false,\n }\n }\n case AUTH_USER_SUCCESS: {\n return {\n ...state,\n isAuth: true,\n id: action.user.id,\n userId: action.user.userId,\n token: action.user.authenticationToken,\n isAuthUserInProcess: false,\n isAuthUserError: false,\n developer: !!action.user.developer\n };\n }\n case AUTH_USER_FAILURE: {\n return {\n ...state,\n isAuth: false,\n isAuthUserInProcess: false,\n isAuthUserError: true,\n };\n }\n\n // DELETE USER\n\n case DELETE_USER_REQUEST: {\n return {\n ...state,\n isDeleteUserInProcess: true,\n isDeleteUserError: false,\n }\n }\n case DELETE_USER_SUCCESS: {\n return {\n ...state,\n id: initialState.id,\n token: initialState.token,\n userId: initialState.id,\n isAuth: false,\n isDeleteUserInProcess: false,\n isDeleteUserError: false,\n };\n }\n case DELETE_USER_FAILURE: {\n return {\n ...state,\n isDeleteUserInProcess: false,\n isDeleteUserError: true,\n };\n }\n\n // DELETE SESSION\n\n case DELETE_SESSION_REQUEST: {\n return {\n ...state,\n isDeleteSessionInProcess: true,\n isDeleteSessionError: false,\n }\n }\n case DELETE_SESSION_SUCCESS: {\n return {\n ...state,\n id: initialState.id,\n token: initialState.token,\n isAuth: false,\n isDeleteSessionInProcess: false,\n isDeleteSessionError: false,\n };\n }\n case DELETE_SESSION_FAILURE: {\n return {\n ...state,\n isDeleteSessionInProcess: false,\n isDeleteSessionError: true,\n };\n }\n default:\n return {...state};\n }\n}\n","\nimport isNil from 'lodash/isNil';\n import {\n SET_CHEAT_MODE, SET_FINISH_LEVEL_CHEAT, CLEAR_FINISH_LEVEL_CHEAT,\n SET_PAGE_WITH_LIFES, SET_PAGE_WITH_GAME,\n} from 'redux/actionTypes';\n\n\nconst initialState = {\n isCheatMode: false,\n finishLevelWithStars: null,\n isPageWithLifes: false,\n isPageWithGame: false,\n};\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case SET_CHEAT_MODE: {\n return {\n ...state,\n isCheatMode: isNil(action.isCheatMode) ? true : action.isCheatMode,\n }\n }\n case SET_FINISH_LEVEL_CHEAT: {\n return {\n ...state,\n finishLevelWithStars: action.starsCount,\n }\n }\n case CLEAR_FINISH_LEVEL_CHEAT: {\n return {\n ...state,\n finishLevelWithStars: initialState.finishLevelWithStars,\n }\n }\n case SET_PAGE_WITH_LIFES: {\n return {\n ...state,\n isPageWithLifes: !!action.isPageWithLifes,\n }\n }\n case SET_PAGE_WITH_GAME: {\n return {\n ...state,\n isPageWithGame: !!action.isPageWithGame,\n }\n }\n default:\n return {...state};\n }\n}\n","import get from 'lodash/get';\nimport { GET_ADS_REQUEST, GET_ADS_SUCCESS, GET_ADS_FAILURE } from 'redux/actionTypes';\n\n\nconst initialState = {\n isGetAdsInProcess: false,\n isGetAdsError: false,\n androidOkAppSuggestDesktopIconTimeoutMinutes: 0,\n};\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case GET_ADS_REQUEST: {\n return {\n ...state,\n isGetAdsInProcess: true,\n }\n }\n case GET_ADS_SUCCESS: {\n return {\n ...state,\n androidOkAppSuggestDesktopIconTimeoutMinutes: get(action.ads, 'AndroidOkAppSuggestDesktopIconTimeoutMinutes', 1),\n isGetAdsInProcess: false,\n isGetAdsError: false,\n };\n }\n case GET_ADS_FAILURE: {\n return {\n ...state,\n isGetAdsInProcess: false,\n isGetAdsError: true,\n };\n }\n default:\n return {...state};\n }\n}\n","import {\n SET_LIFE_PURCHASE_REQUEST, SET_LIFE_PURCHASE_SUCCESS, SET_LIFE_PURCHASE_FAILURE,\n} from 'redux/actionTypes';\n\n\nconst initialState = {\n isSetLifePurchaseInProcess: false,\n isSetLifePurchaseError: false,\n};\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case SET_LIFE_PURCHASE_REQUEST: {\n return {\n ...state,\n isSetLifePurchaseInProcess: true,\n isSetLifePurchaseError: false,\n }\n }\n case SET_LIFE_PURCHASE_SUCCESS: {\n return {\n ...state,\n isSetLifePurchaseInProcess: false,\n isSetLifePurchaseError: false,\n }\n }\n case SET_LIFE_PURCHASE_FAILURE: {\n return {\n ...state,\n isSetLifePurchaseInProcess: false,\n isSetLifePurchaseError: true,\n }\n }\n default:\n return state;\n }\n}\n","import isNil from 'lodash/isNil';\nimport {\n minToMs\n} from 'shared/helpers/lives';\nimport {\n GET_LIVES_REQUEST,\n GET_LIVES_SUCCESS,\n GET_LIVES_FAILURE,\n RESET_LIVES_NUMBER,\n SET_NEW_LIFE_TIMER,\n CLEAR_NEW_LIFE_TIMER,\n} from 'redux/actionTypes';\n\nconst initialState = {\n livesNumber: 5,\n newLifeTimer: null, // timestamp (ms) when timer started (not when it's expected to be finished)\n maxLivesNumber: 5,\n infiniteLife: false,\n lifeRestoreMinutes: '20:00',\n // api requests\n isGetLivesInProcess: false,\n isGetLivesError: false,\n isPutLivesInProcess: false,\n isPutLivesError: false,\n};\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n\n case GET_LIVES_REQUEST: {\n return {\n ...state,\n isGetLivesInProcess: true,\n isGetLivesError: false,\n };\n }\n case GET_LIVES_SUCCESS: {\n if (action.lives) {\n let {\n newLifeTimer,\n maxLivesNumber,\n infiniteLife,\n lifeRestoreMinutes,\n livesNumber\n } = action.lives;\n\n maxLivesNumber = isNil(maxLivesNumber) ? initialState.maxLivesNumber : maxLivesNumber;\n livesNumber = isNil(livesNumber) ? 0 : livesNumber;\n lifeRestoreMinutes = isNil(lifeRestoreMinutes) ? initialState.lifeRestoreMinutes : lifeRestoreMinutes;\n\n return {\n ...state,\n livesNumber,\n maxLivesNumber,\n newLifeTimer,\n infiniteLife,\n lifeRestoreMinutes,\n isGetLivesInProcess: false,\n isGetLivesError: false,\n };\n }\n return {\n ...state,\n livesNumber: state.maxLivesNumber,\n isGetLivesInProcess: false,\n isGetLivesError: false,\n };\n }\n case GET_LIVES_FAILURE: {\n return {\n ...state,\n isGetLivesInProcess: false,\n isGetLivesError: true,\n };\n }\n\n case RESET_LIVES_NUMBER: {\n return {\n ...state,\n livesNumber: state.maxLivesNumber,\n }\n }\n\n case SET_NEW_LIFE_TIMER: {\n const isUpdate = !state.newLifeTimer ? true : state.newLifeTimer + minToMs(state.lifeRestoreMinutes) < Date.now();\n if (isUpdate) {\n return {\n ...state,\n newLifeTimer: Date.now(),\n }\n }\n return state;\n }\n case CLEAR_NEW_LIFE_TIMER: {\n return {\n ...state,\n newLifeTimer: null,\n }\n }\n default:\n return state;\n }\n}\n","import { SET_ADBLOCK_DETECTED } from '../actionTypes';\n\n\nconst initialState = {\n adBlockDetected: false,\n};\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case SET_ADBLOCK_DETECTED: {\n return {\n ...state,\n adBlockDetected: action.adBlockDetected,\n }\n }\n default:\n return state;\n }\n}\n","import { SET_SECOND_SESSION } from 'redux/actionTypes';\n\nconst initialState = {\n isSecondSession: false,\n};\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case SET_SECOND_SESSION: {\n return {\n ...state,\n isSecondSession: action.isSecondSession,\n }\n }\n default:\n return state;\n }\n}\n","/*\n REDUCERS FOR HEADER MANAGEMENT\n*/\nimport isNil from 'lodash/isNil';\n\nimport {\n HEADER_RESET, HEADER_TOGGLE_SETTINGS, HEADER_TOGGLE_BACK_BTN,\n HEADER_TOGGLE_UPDATE_BTN, HEADER_TOGGLE_USER_LIFES, HEADER_TOGGLE_TITLE,\n HEADER_BACK_BTN_CLICK, HEADER_UPDATE_BTN_CLICK,\n} from 'redux/actionTypes';\n\n\nconst initialState = {\n showSettings: false,\n showBackBtn: false,\n showUpdateBtn: false,\n showUserLives: false,\n showTitle: false,\n backBtnClick: false,\n updateBtnClick: false,\n};\n\nconst getNextShowValue = (actionToggle, currentShowValue) => {\n return isNil(actionToggle) ? !currentShowValue : actionToggle;\n};\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case HEADER_RESET:\n return {\n ...initialState,\n };\n case HEADER_TOGGLE_SETTINGS:\n return {\n ...state,\n showSettings: getNextShowValue(action.toggle, state.showSettings),\n };\n case HEADER_TOGGLE_BACK_BTN:\n return {\n ...state,\n showBackBtn: getNextShowValue(action.toggle, state.showBackBtn),\n };\n case HEADER_TOGGLE_UPDATE_BTN:\n return {\n ...state,\n showUpdateBtn: getNextShowValue(action.toggle, state.showUpdateBtn),\n };\n case HEADER_TOGGLE_USER_LIFES:\n return {\n ...state,\n showUserLives: getNextShowValue(action.toggle, state.showUserLives),\n };\n case HEADER_TOGGLE_TITLE:\n return {\n ...state,\n showTitle: getNextShowValue(action.toggle, state.showTitle),\n title: action.title,\n };\n case HEADER_BACK_BTN_CLICK:\n return {\n ...state,\n backBtnClick: !isNil(action.backBtnClick) ? action.backBtnClick : true,\n };\n case HEADER_UPDATE_BTN_CLICK:\n return {\n ...state,\n updateBtnClick: !isNil(action.updateBtnClick) ? action.updateBtnClick : true,\n };\n default:\n return state;\n }\n}\n","import {\n GET_SETTINGS_REQUEST, GET_SETTINGS_SUCCESS, GET_SETTINGS_FAILURE,\n PUT_SETTINGS_REQUEST, PUT_SETTINGS_SUCCESS, PUT_SETTINGS_FAILURE,\n SET_SETTINGS,\n GET_SETTINGS_TUTORIAL_REQUEST,\n GET_SETTINGS_TUTORIAL_SUCCESS,\n GET_SETTINGS_TUTORIAL_ERROR\n} from 'redux/actionTypes';\n\n\nconst initialState = {\n music: true,\n sounds: true,\n language: null,\n isGetSettingsInProcess: false,\n isGetSettingsError: false,\n isPutSettingsInProcess: false,\n isPutSettingsError: false,\n isGettingTutorialInProgress: false,\n isGettingTutorialError: false,\n tutorialProgress: null\n};\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case GET_SETTINGS_TUTORIAL_REQUEST: {\n return {\n ...state,\n isGettingTutorialInProgress: true,\n isGettingTutorialError: false\n }\n }\n case GET_SETTINGS_TUTORIAL_SUCCESS: {\n return {\n ...state,\n tutorialProgress: action.data,\n isGettingTutorialInProgress: false,\n isGettingTutorialError: false\n }\n }\n case GET_SETTINGS_TUTORIAL_ERROR: {\n return {\n ...state,\n isGettingTutorialInProgress: false,\n isGettingTutorialError: true\n }\n }\n case GET_SETTINGS_REQUEST: {\n return {\n ...state,\n isGetSettingsInProcess: true,\n isGetSettingsError: false,\n }\n }\n case GET_SETTINGS_SUCCESS: {\n return {\n ...state,\n ...action.settings,\n isGetSettingsInProcess: false,\n isGetSettingsError: false,\n };\n }\n case GET_SETTINGS_FAILURE: {\n return {\n ...state,\n isGetSettingsInProcess: false,\n isGetSettingsError: true,\n };\n }\n case SET_SETTINGS: {\n return {\n ...state,\n ...action.settings,\n };\n }\n case PUT_SETTINGS_REQUEST: {\n return {\n ...state,\n isPutSettingsInProcess: true,\n isPutSettingsError: false,\n }\n }\n case PUT_SETTINGS_SUCCESS: {\n return {\n ...state,\n ...action.settings,\n isPutSettingsInProcess: false,\n isPutSettingsError: false,\n };\n }\n case PUT_SETTINGS_FAILURE: {\n return {\n ...state,\n isPutSettingsInProcess: false,\n isPutSettingsError: true,\n };\n }\n default:\n return state;\n }\n}\n","import reduce from 'lodash/reduce';\n\nimport { GET_WORLDS_SUCCESS, GET_WORLDS_FAILURE } from 'redux/actionTypes';\nimport { calcMaxStarsInWorld } from 'shared/helpers/progress';\nimport { getWorldPacks } from 'redux/selectors/worlds';\n\nconst initialState = {\n // Contains normalized data! See shared/schemas/worlds\n entities: null,\n worldsMaxStars: {}, // {[worldId]: number}, stars maximum that is achievable in the world\n isGetWorldsError: false,\n isGetWorldsSuccess: false,\n};\n\nexport default (state = initialState, action) => {\n switch (action.type) {\n case GET_WORLDS_SUCCESS: {\n return {\n ...state,\n isGetWorldsError: false,\n isGetWorldsSuccess: true,\n entities: action.worlds || {},\n worldsMaxStars: reduce(action.worlds.worlds, (result, world) => {\n result[world.Id] = calcMaxStarsInWorld(getWorldPacks(world.Id, action.worlds));\n return result;\n }, {}),\n };\n }\n case GET_WORLDS_FAILURE: {\n return {\n ...state,\n isGetWorldsError: true,\n isGetWorldsSuccess: false,\n entities: {},\n worldsMaxStars: {},\n };\n }\n default:\n return state;\n }\n};\n","import produce from 'immer';\nimport reduce from 'lodash/reduce';\nimport set from 'lodash/set';\nimport setWith from 'lodash/setWith';\nimport isNil from 'lodash/isNil';\n\nimport {\n CLEAR_PROGRESS_REQUEST, CLEAR_PROGRESS_SUCCESS, CLEAR_PROGRESS_FAILURE,\n GET_WORLDS_PROGRESS_SUCCESS, GET_WORLDS_PROGRESS_FAILURE, RESET_WORLDS_PROGRESS, UPDATE_LEVEL_PROGRESS_SUCCESS, UPDATE_LEVEL_PROGRESS_FAILURE, CALC_ALL_ACHIEVED_STARS,\n} from 'redux/actionTypes';\nimport {\n createPackProgress, createLevelProgress, calcAchievedStarsInPack\n} from 'shared/helpers/progress';\nimport { createPackEntityId, createLevelEntityId } from 'shared/helpers/schemas';\nimport {\n getPackProgress, getLevelProgress, getProgressArray, getWorldProgressById,\n} from 'redux/selectors/progress';\nimport { getWorldPacks } from 'redux/selectors/worlds';\n\n\nconst initialState = {\n isClearProgressInProcess: false,\n isClearProgressError: false,\n isGetWorldsProgressError: false,\n isGetWorldsProgressSuccess: false,\n isUpdateLevelProgressError: false,\n // Default null, after data fetching, it must become an object\n // Contains normalized data! See shared/schemas/progress\n progress: null,\n isAchievedStarsCalculated: false, // used in App.js on init (do not render page until it has all progress data)\n achievedStars: {},\n};\n\nexport default produce((draftState, action) => {\n switch (action.type) {\n case CLEAR_PROGRESS_REQUEST: {\n draftState.isClearProgressInProcess = true;\n draftState.isClearProgressError = false;\n break;\n }\n case CLEAR_PROGRESS_SUCCESS: {\n draftState.isClearProgressInProcess = false;\n draftState.isClearProgressError = false;\n draftState.achievedStars = {};\n break;\n }\n case CLEAR_PROGRESS_FAILURE: {\n draftState.isClearProgressInProcess = false;\n draftState.isClearProgressError = true;\n break;\n }\n case UPDATE_LEVEL_PROGRESS_SUCCESS: {\n draftState.isUpdateLevelProgressError = false;\n if (!draftState.progress) draftState.progress = {};\n const packEntityId = createPackEntityId(action.worldId, action.packId);\n const levelEntityId = createLevelEntityId(action.worldId, action.packId, action.levelId);\n // try to find level's world progress in the state\n let worldProgress = getWorldProgressById(action.worldId, draftState.progress);\n if (!worldProgress) {\n // if world progress doesn't exist, then create it along with pack progress structure\n worldProgress = { worldId: action.worldId, packs: [packEntityId] };\n set(draftState.progress, `worlds.${action.worldId}`, worldProgress);\n }\n // try to find pack progress\n let packProgress = getPackProgress(action.worldId, action.packId, draftState.progress);\n if (!packProgress) {\n // if pack progress doesn't exist, then create it\n packProgress = createPackProgress(action.worldId, action.packId, []);\n set(draftState.progress, `packs.${packEntityId}`, packProgress);\n }\n // get level's progress in the progress entities\n let currentLevelProgress = getLevelProgress(action.worldId, action.packId, action.levelId, draftState.progress);\n // create new progress for the level according on data from action\n const updatedLevelProgress = createLevelProgress(action.levelId, action.hash, action.stepsSpent, action.completed, action.addMovesAttempts);\n if (!currentLevelProgress) {\n // if pack doesn't have this level yet, then push its entityId to the pack's progress array\n packProgress.levels.push(levelEntityId);\n }\n // update level's data\n set(draftState.progress, `levels.${levelEntityId}`, updatedLevelProgress);\n break;\n }\n case UPDATE_LEVEL_PROGRESS_FAILURE: {\n draftState.isUpdateLevelProgressError = true;\n break;\n }\n case GET_WORLDS_PROGRESS_SUCCESS: {\n draftState.isGetWorldsProgressError = false;\n draftState.isGetWorldsProgressSuccess = true;\n draftState.progress = action.progress ? action.progress : {};\n break;\n }\n case GET_WORLDS_PROGRESS_FAILURE: {\n draftState.isGetWorldsProgressError = true;\n draftState.isGetWorldsProgressSuccess = false;\n break;\n }\n case RESET_WORLDS_PROGRESS: {\n draftState.progress = {};\n break;\n }\n\n /*\n * Achieved stars calculates once and recalculates everytime after passing a game\n * Structure:\n * {\n * worldId: {\n * stars: number // stars number in the world\n * packs: {\n * packId: number // stars number in the pack\n * }\n * }\n * all: number // stars number in all worlds\n * }\n */\n case CALC_ALL_ACHIEVED_STARS: {\n draftState.isAchievedStarsCalculated = true;\n draftState.achievedStars = reduce(getProgressArray(action.worldsData), (result, world) => {\n const packs = getWorldPacks(world.Id, action.worldsData);\n if (!packs) {\n // if world doesn't have packs, then don't calculate stars\n set(result, `${world.Id}.stars`, 0);\n return result;\n };\n\n const achievedStarsInWorld = packs.reduce((worldResult, pack) => {\n const achievedStarsInPack = calcAchievedStarsInPack(world.Id, pack.Id, pack.MaxStars, action.worldsData, draftState.progress);\n // set achieved stars in pack\n setWith(result, `${world.Id}.packs.${pack.Id}`, achievedStarsInPack, Object);\n return worldResult + achievedStarsInPack;\n }, 0);\n set(result, `${world.Id}.stars`, achievedStarsInWorld);\n // calculate stars in all worlds\n let starsInAllWorlds;\n if (isNil(result.all)) {\n starsInAllWorlds = achievedStarsInWorld;\n } else {\n starsInAllWorlds = result.all + achievedStarsInWorld;\n }\n set(result, 'all', starsInAllWorlds);\n return result;\n }, {});\n break;\n }\n default: {\n break;\n }\n }\n}, initialState);\n","import produce from 'immer';\n\nimport { UPDATE_ACTIVE_LEVEL_ID, SET_TUTORIAL_PASSED, RESET_TUTORIAL } from 'redux/actionTypes';\n\nconst initialState = {\n activeLevelId: null,\n tutorialPassed: false,\n};\n\nexport default produce((draftState, action) => {\n switch (action.type) {\n case UPDATE_ACTIVE_LEVEL_ID: {\n draftState.activeLevelId = action.activeLevelId;\n break;\n }\n case SET_TUTORIAL_PASSED: {\n draftState.tutorialPassed = true;\n break;\n }\n case RESET_TUTORIAL: {\n draftState.tutorialPassed = false;\n draftState.activeLevelId = null;\n break;\n }\n default: {\n break;\n }\n }\n}, initialState);","/*\n REDUCERS FOR MODALS MANAGEMENT\n*/\nimport find from 'lodash/find';\nimport remove from 'lodash/remove';\nimport produce from 'immer';\n\nimport { SHOW_MODAL, HIDE_MODAL } from 'redux/actionTypes';\nimport { ModalAction, ModalType } from 'redux/actions/modals';\nexport interface IModal {\n type: ModalType;\n props: any;\n show: boolean;\n active?: boolean;\n metrica?: any\n}\n\ninterface InitialStateProps {\n modals: IModal[]\n}\n\nconst initialState: InitialStateProps = {\n modals: [],\n};\n\nexport default produce((draftState, action: ModalAction) => {\n switch (action.type) {\n case SHOW_MODAL: {\n const activeModal = find(draftState.modals, { active: true });\n if (activeModal) activeModal.active = false;\n\n remove(draftState.modals, {type: action.modalType});\n\n draftState.modals.push({\n type: action.modalType,\n props: action.modalProps ? action.modalProps : {},\n metrica: action.metrica,\n show: true,\n active: true,\n });\n break;\n }\n case HIDE_MODAL: {\n const modal = find(draftState.modals, {type: action.modalType});\n\n if (modal) {\n modal.show = false;\n }\n break;\n }\n }\n}, initialState)\n","import isNil from 'lodash/isNil';\nimport {\n SHOW_HINT, SET_HINT_TYPE, SET_HINT_CIRCLE, SET_HINT_TEXT, SET_HINT_BG_SIZE,\n} from 'redux/actionTypes';\n\nimport { HINT_TEXT_BOTTOM } from 'shared/constants';\n\n\nconst initialState = {\n circleX: 0,\n circleY: 0,\n circleR: 0,\n text: null,\n textPosition: HINT_TEXT_BOTTOM,\n bgWidth: 0,\n bgHeight: 0,\n show: false,\n hintType: null,\n};\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case SHOW_HINT: {\n return {\n ...state,\n show: isNil(action.show) ? true : action.show,\n };\n }\n case SET_HINT_TYPE: {\n return {\n ...state,\n hintType: action.hintType,\n };\n }\n case SET_HINT_CIRCLE: {\n return {\n ...state,\n circleX: action.x,\n circleY: action.y,\n circleR: action.r,\n };\n }\n case SET_HINT_TEXT: {\n return {\n ...state,\n text: action.text,\n textPosition: action.textPosition ? action.textPosition : state.textPosition,\n };\n }\n case SET_HINT_BG_SIZE: {\n return {\n ...state,\n bgWidth: action.bgWidth,\n bgHeight: action.bgHeight,\n };\n }\n default:\n return state;\n }\n}\n","import { minToMs } from 'shared/helpers/lives';\nimport {\n getLives,\n setNewLifeTimer,\n clearNewLifeTimer\n} from 'redux/actions/lives';\nimport { GET_LIVES_SUCCESS } from 'redux/actionTypes';\n\nexport const updateNewLifeTimerMiddleware = () => (store: any) => (\n next: any\n) => (action: any) => {\n next(action);\n const { livesNumber, maxLivesNumber } = store.getState().lives;\n if (action.type === GET_LIVES_SUCCESS) {\n if (livesNumber < maxLivesNumber) {\n startTimer(store);\n }\n }\n};\n\nlet timer: any;\n\nconst startTimer = (store: any) => {\n const { lives } = store.getState();\n const { newLifeTimer, lifeRestoreMinutes } = lives;\n if (!newLifeTimer) {\n store.dispatch(setNewLifeTimer());\n } else {\n const time = newLifeTimer + minToMs(lifeRestoreMinutes);\n const now = new Date().valueOf();\n if (now > time) {\n store.dispatch(setNewLifeTimer());\n }\n }\n\n if (!timer) {\n timer = setInterval(() => {\n const lives = store.getState().lives;\n const { lifeRestoreMinutes, newLifeTimer } = lives;\n if (newLifeTimer) {\n const time = newLifeTimer + minToMs(lifeRestoreMinutes);\n const now = new Date().valueOf();\n // if timer is finished (or it's null) - add lives & clear timer\n if (now > time) {\n clearTimer(store);\n store.dispatch(getLives());\n }\n }\n }, 1000);\n }\n};\n\nconst clearTimer = (store: any) => {\n store.dispatch(clearNewLifeTimer());\n\n if (timer) {\n clearInterval(timer);\n timer = null;\n }\n};\n","import { combineReducers } from 'redux';\nimport boosters from './boosters';\nimport game from './game';\nimport user from './user';\nimport cheats from './cheats';\nimport ads from './ads';\nimport purchases from './purchases';\nimport lives from './lives';\nimport adBlock from './adBlock';\nimport secondSession from './secondSession';\nimport header from './header';\nimport settings from './settings';\nimport worlds from './worlds';\nimport progress from './progress';\nimport tutorial from './tutorial';\nimport modals from './modals';\nimport hint from './hint';\n\n\nexport default combineReducers({\n boosters, game, user, cheats, ads, purchases,\n lives, adBlock, secondSession, header, settings,\n worlds, progress, tutorial, modals, hint,\n});\n","import isEqual from 'lodash/isEqual';\nimport pick from 'lodash/pick';\n\nimport * as boostersAPI from 'shared/api/boostersAPI';\n\nimport {\n putBoostersRequest, putBoostersSuccess, putBoostersFailure,\n} from 'redux/actions/boosters';\n\n\nconst fields = ['hintCount', 'moveBackCount', 'maxHintCount', 'maxMoveBackCount'];\n\nexport const saveBoostersOnChangeMiddleware = () => store => next => action => {\n // Get the state before and after the action was performed\n const prevState = store.getState();\n const isGetBoostersInProcess = prevState.boosters.isGetBoostersInProcess;\n\n const prevBoosters = pick(prevState.boosters, fields);\n next(action);\n const nextBoosters = pick(store.getState().boosters, fields);\n\n // Save data via API on changes\n // If it wasn't change after GET request\n if (!isEqual(prevBoosters, nextBoosters) && !isGetBoostersInProcess) {\n store.dispatch(putBoostersRequest());\n return boostersAPI.putBoosters(nextBoosters)\n .then(() => {\n store.dispatch(putBoostersSuccess());\n }, () => {\n store.dispatch(putBoostersFailure());\n });\n }\n};\n","import isEqual from 'lodash/isEqual';\nimport pick from 'lodash/pick';\n\nimport * as settingsAPI from 'shared/api/settingsAPI';\n\nimport {\n putSettingsRequest, putSettingsSuccess, putSettingsFailure,\n} from 'redux/actions/settings';\n\n\nconst fields = ['music', 'sounds', 'language'];\n\nexport const saveSettingsOnChangeMiddleware = () => store => next => action => {\n // Get the state before and after the action was performed\n const prevState = store.getState();\n const isGetSettingsInProcess = prevState.settings.isGetSettingsInProcess;\n \n const prevSettings = pick(prevState.settings, fields);\n next(action);\n const nextSettings = pick(store.getState().settings, fields);\n \n // Save data via API on changes\n // If it wasn't change after GET request\n if (!isEqual(prevSettings, nextSettings) && !isGetSettingsInProcess) {\n store.dispatch(putSettingsRequest());\n return settingsAPI.putSettings(nextSettings)\n .then(() => {\n store.dispatch(putSettingsSuccess());\n }, () => {\n store.dispatch(putSettingsFailure());\n });\n }\n};\n","import { createStore, compose, applyMiddleware } from 'redux';\nimport thunkMiddleware from 'redux-thunk';\n\nimport rootReducer from './reducers';\nimport { saveBoostersOnChangeMiddleware } from './middlewares/boosters';\nimport { updateNewLifeTimerMiddleware } from './middlewares/lives';\nimport { saveSettingsOnChangeMiddleware } from './middlewares/settings';\nimport { finishGameCheatMiddleware } from './middlewares/game';\n\n\nconst composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;\n\nconst middlewares = [\n\tthunkMiddleware,\n\tsaveBoostersOnChangeMiddleware(),\n\tupdateNewLifeTimerMiddleware(),\n\tsaveSettingsOnChangeMiddleware(),\n finishGameCheatMiddleware(),\n];\n\nif (process.env.REACT_APP_MODE === 'stage' && process.env.REACT_APP_REDUX_LOGGER === 'true') {\n const logger = require('redux-logger');\n middlewares.push(logger);\n}\n\nexport default createStore(\n rootReducer,\n composeEnhancers(applyMiddleware(...middlewares)),\n);\n","import isEqual from 'lodash/isEqual';\nimport get from 'lodash/get';\n\nimport { setCheatStars, setGamePassed } from 'redux/actions/game';\n\n\nexport const finishGameCheatMiddleware = () => store => next => action => {\n // Get the state before and after the action was performed\n const finishLevelWithStarsPrev = get(store.getState(), 'cheats.finishLevelWithStars');\n \n next(action);\n const finishLevelWithStarsNext = get(store.getState(), 'cheats.finishLevelWithStars');\n\n if (!isEqual(finishLevelWithStarsPrev, finishLevelWithStarsNext) && finishLevelWithStarsNext > 0) {\n store.dispatch(setCheatStars(finishLevelWithStarsNext));\n store.dispatch(setGamePassed());\n }\n};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"cWhite\":\"#FFFFFF\",\"cTradewind\":\"#6BBCB4\",\"UserLives\":\"UserLives_UserLives__B1xg_\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"appearTime\":\"300ms\",\"Tutorial\":\"Tutorial_Tutorial__2VUcs\",\"HintShow\":\"Tutorial_HintShow__3BW8v\",\"Hint\":\"Tutorial_Hint__3mc_T\"};","import { SET_ADBLOCK_DETECTED } from '../actionTypes';\n\nexport const setAdBlockDetected = (adBlockDetected: boolean): any => ({\n type: SET_ADBLOCK_DETECTED,\n adBlockDetected,\n});\n","// redux\nimport store from 'redux/store';\nimport { setAdBlockDetected } from 'redux/actions/adBlock';\nimport { $Values } from 'shared/helpers/types';\n\nexport const checkAdBlock = () => {\n\twindow.fuckAdBlockInstance.check(true);\n}\n\nexport const initAdBlockDetector = () => {\n\tif (!window.fuckAdBlockInstance) {\n\t window.fuckAdBlockInstance = new window.FuckAdBlock();\n\t} else {\n\t\twindow.fuckAdBlockInstance.setOption('resetOnEnd', false);\n\t}\n\twindow.fuckAdBlockInstance.onDetected(() => {\n\t // console.log('%c nasty AdBLock has been detected!', 'color: #ff201b');\n\t store.dispatch(setAdBlockDetected(true));\n\t});\n\twindow.fuckAdBlockInstance.onNotDetected(() => {\n\t // console.log('%c no adBlocks in here..', 'color: #5fba7d');\n\t store.dispatch(setAdBlockDetected(false));\n\t});\n\tcheckAdBlock();\n}\n\n/**\n * Possible text types in the adBlockWarningModal\n * @type {Object}\n */\nexport const warningTextTypes = {\n\t'lives': 'lives',\n\t'boosters': 'boosters',\n\t'moves': 'moves',\n} as const;\n\nexport type WarningTextType = $Values;\n","import i18n from 'shared/i18n';\nimport cookies from 'browser-cookies';\n\nimport get from 'lodash/get';\n\nimport langCookieName from 'shared/locales/langCookieName';\n\n/*\n This function sets i18n language & updates cookie\n*/\nexport const setLang = (lang) => {\n cookies.set(langCookieName, lang);\n i18n.changeLanguage(lang);\n};\n\n/*\n for items like:\n {\n Name: string,\n Locales: {\n en: string,\n ru: string,\n ...\n }\n }\n*/\nconst getTitleByLocale = (item, locale) => {\n const title = get(item, `Locales.${locale}`);\n return title ? title : item.Name;\n}\n\n/* \n This function returns world locale data: e.g. for locale='en'\n \n {\n \"title\": \"World 1: Origins\",\n \"packs\": {\n \"1\": \"Cinque\"\n }\n }\n\n*/\nconst getWorldDataLocale = (worldData, locale) => {\n const worldDataLocale = {\n title: getTitleByLocale(worldData, locale),\n packs: {},\n };\n\n if (worldData.Packs) {\n const packs = {};\n worldData.Packs.forEach(pack => {\n packs[pack.Id] = getTitleByLocale(pack, locale);\n });\n worldDataLocale.packs = packs;\n }\n\n return worldDataLocale;\n}\n\n/*\n This function parses worlds data and adds locales, e.g. \n \n \"worlds\": {\n world.Id: {\n \"title\": \"World 1: Origins\",\n \"packs\": {\n pack.Id: \"Cinque\"\n }\n }\n }\n\n*/\nexport const updateWorldsLocales = (worldsData = []) => {\n const enResouceBundle = {};\n const ruResouceBundle = {};\n\n const enWorlds = {};\n const ruWorlds = {};\n\n worldsData.forEach(worldData => {\n enWorlds[worldData.Id] = getWorldDataLocale(worldData, 'en');\n ruWorlds[worldData.Id] = getWorldDataLocale(worldData, 'ru');\n });\n enResouceBundle.worlds = enWorlds;\n ruResouceBundle.worlds = ruWorlds;\n\n i18n.addResourceBundle('en', 'translation', enResouceBundle, true);\n i18n.addResourceBundle('ru', 'translation', ruResouceBundle, true);\n};","// cookie for keeping app language for user\nexport default 'AppLang';\n\n","import { isAnalyticsEnabled, loadYandexMetrica } from 'shared/helpers/analytics';\n\nexport interface WithCount {\n // service param to track\n // total number of events\n '!count': null\n};\n\nexport function withCount(params: T): WithCount & T {\n return {\n '!count': null,\n ...params\n }\n};\n\nexport type LoginParams = WithCount & {\n [userId: string]: WithCount & {\n logins: {\n today: number,\n daysInARow: number,\n total: number,\n }\n },\n};\n\nexport type WorldParams = WithCount & { worldId: string };\n\nexport type PackParams = WithCount & { packId: string };\n\n\nexport const LevelEndings = Object.freeze({\n restart: 'restart',\n leave: 'leave',\n win: 'win',\n fail:'fail'\n});\n\nexport type LevelParams = WithCount & {\n [levelId: string]: WithCount & {\n [ending: string]: WithCount & {\n uniqueStart: boolean,\n stepsCount: number,\n bestMovesPath: string,\n time: number,\n boostersUsed: {\n hint: number,\n moveBack: number\n },\n adsWatched: {\n hint: number,\n moveBack: number\n },\n }\n }\n};\n\nexport type LevelEnterParams = WithCount & {\n [levelId: string]: WithCount & {\n enter: {\n enterDate: string\n }\n }\n};\n\nexport type MoveBackUseParams = WithCount & {\n [levelId: string]: WithCount & {\n step: number,\n time: number,\n }\n};\n\nexport type HintUseParams = WithCount & {\n [levelId: string]: WithCount & {\n step: number,\n time: number,\n followed: boolean,\n }\n};\n\nexport type BoosterAdWatchParams = WithCount & {\n levelId: string\n};\n\nexport const WinPopupActions = Object.freeze({\n restart: 'restart',\n next: 'next',\n});\n\nexport type WinPopupActionParams = WithCount & {\n [levelId: string]: WithCount & {\n achievedStars: number,\n action: keyof typeof WinPopupActions\n }\n};\n\nexport const LosePopupActions = Object.freeze({\n restart: 'restart',\n exit: 'exit',\n});\n\nexport type LosePopupActionParams = WithCount & {\n [levelId: string]: WithCount & {\n achievedStars: number,\n action: keyof typeof LosePopupActions\n }\n};\n\nexport const InfinityLivesPurchaseResults = Object.freeze({\n success: 'success',\n fail: 'fail',\n exit: 'exit'\n})\n\nexport type InfinityLivesPurchaseParams = WithCount & {\n result: keyof typeof InfinityLivesPurchaseResults\n}\n\nexport const AdWatchRewards = Object.freeze({\n moves: 'moves',\n live: 'live',\n hint: 'hint',\n moveBack: 'moveBack',\n});\n\nexport const AdWatchResults = Object.freeze({\n watched: 'watched',\n blocked: 'blocked',\n notFound: 'notFound',\n});\n\nexport type AdWatchParams = WithCount & {\n [reward: string]: WithCount & {\n result: keyof typeof AdWatchResults\n }\n};\n\nexport const AddMovesPopupResults = Object.freeze({\n playAd: 'playAd',\n leave: 'leave'\n});\n\nexport type AddMovesPopupParams = WithCount & {\n [levelId: string]: WithCount & {\n [result: string]: WithCount & {\n adPlays: number,\n }\n }\n};\n\nexport type SkipTutorialParams = WithCount & {\n [levelId: string]: WithCount & {\n userId: string;\n }\n}\n\nexport type RouteParams = WithCount & {\n [pathName: string]: WithCount & {\n fromRoute?: string;\n };\n}\n\nexport function sendAnalyticsEvent(eventName: 'shareClick', eventParams?: any): void\nexport function sendAnalyticsEvent(eventName: 'groupClick', eventParams?: any): void\nexport function sendAnalyticsEvent(eventName: 'worldClick', eventParams:WorldParams): void\nexport function sendAnalyticsEvent(eventName: 'packClick', eventParams:PackParams): void\nexport function sendAnalyticsEvent(eventName: 'level', eventParams:LevelParams|LevelEnterParams): void\nexport function sendAnalyticsEvent(eventName: 'hintUse', eventParams:HintUseParams): void\nexport function sendAnalyticsEvent(eventName: 'hintAdWatch', eventParams:BoosterAdWatchParams): void\nexport function sendAnalyticsEvent(eventName: 'moveBackUse', eventParams:MoveBackUseParams) : void\nexport function sendAnalyticsEvent(eventName: 'moveBackAdWatch', eventParams:BoosterAdWatchParams) : void\nexport function sendAnalyticsEvent(eventName: 'winPopupAction', eventParams:WinPopupActionParams) : void\nexport function sendAnalyticsEvent(eventName: 'losePopupAction', eventParams:LosePopupActionParams) : void\nexport function sendAnalyticsEvent(eventName: 'infinityLivesPurchase', eventParams:InfinityLivesPurchaseParams): void\nexport function sendAnalyticsEvent(eventName: 'adWatch', eventParams:AdWatchParams) : void\nexport function sendAnalyticsEvent(eventName: 'addMovesPopup', eventParams:AddMovesPopupParams) : void\nexport function sendAnalyticsEvent(eventName: 'login', eventParams: LoginParams): void;\nexport function sendAnalyticsEvent(eventName: 'skipTutorial', eventParams: SkipTutorialParams): void;\nexport function sendAnalyticsEvent(eventName: 'route', eventParams: RouteParams): void;\nexport function sendAnalyticsEvent(eventName: any, eventParams: any = {}){\n if (isAnalyticsEnabled) {\n loadYandexMetrica().then(({ default: ym }) => {\n ym('reachGoal', eventName, {\n [eventName]: eventParams\n });\n });\n }\n};\n\nexport const composeAnalyticsEntityId = (...ids: number[]): string => ids.join('.');\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"BackBtn\":\"BackBtn_BackBtn__KQPMr\",\"Reversed\":\"BackBtn_Reversed__1Q-dC\",\"Transparent\":\"BackBtn_Transparent__1E67G\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"LifeIcon\":\"LifeIcon_LifeIcon__2AT37\",\"SizeBig\":\"LifeIcon_SizeBig__1WN03\",\"ColorGrey\":\"LifeIcon_ColorGrey__1IlA9\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"cWhite\":\"#FFFFFF\",\"LivesNumber\":\"LivesNumber_LivesNumber__3BlZE\",\"LivesNumberText\":\"LivesNumber_LivesNumberText__2wNLh\",\"LivesNumberIcon\":\"LivesNumber_LivesNumberIcon__Yj2hz\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"cWhite\":\"#FFFFFF\",\"cRed\":\"#ed0000\",\"AddBtn\":\"AddBtn_AddBtn__3inbU\",\"AddBtnDisabled\":\"AddBtn_AddBtnDisabled__28kOp\",\"AddBtnPlusIcon\":\"AddBtn_AddBtnPlusIcon__1o6Vh\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"cWhite\":\"#FFFFFF\",\"hOkShareBtn\":\"32px\",\"OKShareBtn\":\"OKShareBtn_OKShareBtn__3Uvz9\",\"OK\":\"OKShareBtn_OK__uqgxU\",\"OKShareBtnTitle\":\"OKShareBtn_OKShareBtnTitle__17jfU\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"cWhite\":\"#FFFFFF\",\"StarsCounter\":\"StarsCounter_StarsCounter__1hQku\",\"StarsIcon\":\"StarsCounter_StarsIcon__1jZSC\"};","import axios from 'axios';\nimport store from '../../redux/store';\n\nimport { NOT_FOUND, ERROR } from '../../shared/constants';\n\n\n// configure base url\nconst instance = axios.create({\n baseURL: process.env.REACT_APP_API_SERVER,\n});\n\n// intercept requests and add authorization token\ninstance.interceptors.request.use(config => {\n const token = store.getState().user.token;\n if (token) {\n config.headers['X-Session-Token'] = token;\n }\n return config;\n});\n\ntype IStatus = typeof NOT_FOUND | typeof ERROR;\n\nexport class AxiousError extends Error {\n public response: Response;\n public status: IStatus;\n\n constructor(message: string, status: IStatus, response: Response) {\n super(message);\n this.response = response;\n this.status = status;\n Object.setPrototypeOf(this, AxiousError.prototype);\n }\n}\n\ninstance.interceptors.response.use(\n response => response.data,\n error => {\n if (error.response) {\n console.log('error.response = ', error.response);\n if (error.response.status === 404) {\n return Promise.reject(new AxiousError(error.message, NOT_FOUND, error.response));\n }\n }\n return Promise.reject(new AxiousError(error.message || 'No Response', ERROR, error.response));\n }\n);\n\nexport default instance;\n(window as any).instance = instance;\n","/**\n * User ID is being stored in localStorage on App initialization\n * Used in the game statistics\n * @type {String}\n */\nexport const UUID_STORAGE_NAME = 'userId';\n\n/**\n * Page forward/back animation\n * You need to change shared/styles/animation.css after changing this variable\n * @type {Number}\n */\nexport const PAGE_ANIMATION_TIME = 500;\n\n// boosters\nexport const BOOSTER_HINT_TYPE = 'hint';\nexport const BOOSTER_MOVE_BACK_TYPE = 'move-back';\n\n\n// modals\nexport const MODAL_APPEAR_TIME = 1000;\nexport const LIFE_REDUCE_MODAL_SHOW_TIME = 2500;\nexport const AD_NOT_FOUND_MODAL_SHOW_TIME = 3000;\n/**\n * Types of modals\n * @type {String}\n */\nexport const MODAL_LIFE_PURCHASE = 'MODAL_LIFE_PURCHASE';\nexport const MODAL_CHANGE_PRICE = 'MODAL_CHANGE_PRICE';\nexport const MODAL_LIFE_REDUCE = 'MODAL_LIFE_REDUCE';\nexport const MODAL_SETTINGS = 'MODAL_SETTINGS';\nexport const MODAL_AD_BLOCK = 'MODAL_AD_BLOCK';\nexport const MODAL_SECOND_SESSION = 'MODAL_SECOND_SESSION';\nexport const MODAL_WATCH_AD = 'MODAL_WATCH_AD';\nexport const MODAL_AD_NOT_FOUND = 'MODAL_AD_NOT_FOUND';\n\n// game\n/**\n * Maximum abilities to add moves count per level\n * @type {Number}\n */\nexport const MAX_ADD_MOVES_ATTEMPTS = 3;\n\n/**\n * Game Win/Fail state change delay\n * @type {Number}\n */\nexport const CHANGE_STATE_DELAY = 1500;\n\n// Network statuses\nexport const SUCCESS = 'SUCCESS';\nexport const ERROR = 'ERROR';\nexport const NOT_FOUND = 'NOT_FOUND';\n\n/**\n * Maximum levels on tutorial page\n * @type {Number}\n */\nexport const MAX_TUTORIAL_LEVELS = 3;\n\n/**\n * Hints\n */\n// types\nexport const HINT_BEST_VERTEX = 'best-vertex';\nexport const HINT_AI_BEST_VERTEX = 'ai-best-vertex';\nexport const HINT_NOT_BEST_VERTEX = 'not-best-vertex';\nexport const HINT_GENERAL = 'general';\nexport const HINT_AI_GENERAL = 'ai-general';\nexport const HINT_BOOSTER_HINT = 'booster-hint';\nexport const HINT_BOOSTER_MOVE_BACK = 'booster-move-back';\n\n// text positions\nexport const HINT_TEXT_TOP = 'top';\nexport const HINT_TEXT_BOTTOM = 'bottom';\nexport const HINT_TEXT_STEPS_REGEXP = '%%steps%%';\n\n\n// button skip postion\nexport const BTN_SKIP_TOP = 'top';\nexport const BTN_SKIP_BOTTOM = 'bottom';\n","import store from 'redux/store';\nimport keys from 'lodash/keys';\nimport get from 'lodash/get';\nimport indexOf from 'lodash/indexOf';\nimport reduce from 'lodash/reduce';\nimport isEqual from 'lodash/isEqual';\nimport intersection from 'lodash/intersection';\n\nimport { createLevelEntityId, parseLevelEntityId } from 'shared/helpers/schemas';\n\n// redux\nimport { updateActiveLevelId } from 'redux/actions/tutorial';\nimport {\n\tboosterHintClickRequire, boosterMoveBackClickRequire,\n\tsetBoosterHintCoords, setBoosterMoveBackCoords,\n\tsetInfiniteBoosterHint, setInfiniteBoosterMoveBack,\n} from 'redux/actions/boosters';\nimport {\n\tsetCheatStars, bestVertexClickRequire, notBestVertexClickRequire,\n\tshowHintRequire, updateBestVertexCoordRequire, updateGraphCoordRequire,\n\tupdateStepsLeftRequire, updateNotBestVertexDataRequire,\n\tsetInfiniteSteps,\n} from 'redux/actions/game';\n\n// constants\nimport { tutorialConfig } from 'shared/config/tutorialConfig';\n\n\n/**\n * Tutorial logic, hint management\n */\nexport default class TutorialManager {\n\n\tstatic _hintType = null;\n\n\t/******************************************\n\t* CLASS METHODS\n\t******************************************/\n\n\tstatic isMainTutorialPassed() {\n\t\tconst { settings: { tutorialProgress } } = store.getState();\n\t\tif (tutorialProgress === null) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst tutorialConfigLevels = keys(tutorialConfig);\n\n\t\tif (!tutorialProgress) {\n\t\t\treturn tutorialConfigLevels.length === 0;\n\t\t}\n\n\t\tconst tutorialConfigMainLevels = reduce(tutorialConfig, (result, value, key) => {\n\t\t\tif (!!value.isMainTutorialLevel) {\n\t\t\t\tresult.push(key);\n\t\t\t}\n\t\t\treturn result;\n\t\t}, []);\n\t\tconst progressOfMainLevels = intersection(tutorialConfigMainLevels, tutorialProgress);\n\t\treturn isEqual(tutorialConfigMainLevels, progressOfMainLevels);\n\t}\n\n\tstatic getNextLevel() {\n\t\tconst lastLevel = this.getLastPassedTutorialLevel();\n\t\tconst storeLevelsData = get(store.getState(), 'worlds.entities.levels');\n\n\t\tif (!storeLevelsData) return null;\n\n\t\tconst storeLevels = keys(storeLevelsData);\n\n\t\tconst lastLevelIndex = indexOf(storeLevels, lastLevel);\n\t\treturn storeLevels[lastLevelIndex + 1];\n\t}\n\n\tstatic getLastPassedTutorialLevel() {\n\t\t\tconst { settings: { tutorialProgress } } = store.getState();\n\t\t\tif (!tutorialProgress) return null;\n\t\t\treturn tutorialProgress[tutorialProgress.length - 1];\n\t}\n\t/* it returns {\n\t\tworldId: string,\n\t\tpackId: string,\n\t\tlevelId: string,\n\t}\n\tif page need to be redirected to certain level\n\t*/\n\tstatic getLevelForRedirect(url) {\n\t\t// if tutorial is passed - no redirect is needed\n\t\tconst isPassed = this.isMainTutorialPassed();\n\n\t\tconsole.log(`TUTORIAL PASSED: ${isPassed}`);\n\n\t\tif (isPassed) return null;\n\n\t\tlet levelForRedirect = this.getNextLevel();\n\n\t\tif (!levelForRedirect) {\n\t\t\t// if it's totally new user - set leas level to the first in tutorial\n\t\t\tlevelForRedirect = keys(tutorialConfig)[0];\n\t\t}\n\n\t\t// get data about worldId, packId, levelId\n\t\tlet levelForRedirectData = parseLevelEntityId(levelForRedirect);\n\n\t\tif (url.indexOf('/game/level/') < 0) {\n\t\t\treturn levelForRedirectData;\n\t\t}\n\n\t\t// if we're not in this game page - set redirect to true\n\t\tif (levelForRedirect !== url.replace('/game/level/', '').replace(/\\//g, '-')) {\n\t\t\treturn levelForRedirectData;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tstatic start(worldId, packId, levelId) {\n\t\tconst levelEntityId = createLevelEntityId(worldId, packId, levelId);\n\n\t\t// if there's no tutorial for this level\n\t\tif (!tutorialConfig[levelEntityId]) return;\n\n\t\tconst isInfiniteSteps = !!tutorialConfig[levelEntityId].isInfiniteSteps;\n\n\t\tstore.dispatch(setInfiniteSteps(isInfiniteSteps));\n\t\tif (isInfiniteSteps) {\n\t\t\tstore.dispatch(setCheatStars(store.getState().game.maxStars));\n\t\t}\n\n\t\tstore.dispatch(updateActiveLevelId(levelEntityId));\n\t}\n\n\tstatic setBoosterHintCoords(x, y, r) {\n\t\tstore.dispatch(setBoosterHintCoords(x, y, r));\n\t}\n\n\tstatic setBoosterMoveBackCoords(x, y, r) {\n\t\tstore.dispatch(setBoosterMoveBackCoords(x, y, r));\n\t}\n\n\tstatic setInfiniteBoosterHint(infinite) {\n\t\tstore.dispatch(setInfiniteBoosterHint(infinite));\n\t}\n\n\tstatic setInfiniteBoosterMoveBack(infinite) {\n\t\tstore.dispatch(setInfiniteBoosterMoveBack(infinite));\n\t}\n\n\t// call game best vertex click if user is passing tutorial and clicks on hint circle\n\tstatic callGameBestVertexClick() {\n\t\tstore.dispatch(bestVertexClickRequire());\n\t}\n\n\t// call game not best vertex click if user is passing tutorial and clicks on hint circle\n\tstatic callGameNotBestVertexClick() {\n\t\tstore.dispatch(notBestVertexClickRequire());\n\t}\n\n\tstatic callGameShowBestMoveHint() {\n\t\tstore.dispatch(showHintRequire());\n\t}\n\n\tstatic callGameShowNotBestMoveHint() {\n\t\tstore.dispatch(showHintRequire());\n\t}\n\n\tstatic callGameUpdateBestVertexCoord() {\n\t\tstore.dispatch(updateBestVertexCoordRequire());\n\t}\n\n\tstatic callGameUpdateGraphCoord() {\n\t\tstore.dispatch(updateGraphCoordRequire());\n\t}\n\n\tstatic callBoosterHintClick() {\n\t\tstore.dispatch(boosterHintClickRequire());\n\t}\n\n\tstatic callBoosterMoveBackClick() {\n\t\tstore.dispatch(boosterMoveBackClickRequire());\n\t}\n\n\tstatic callGameUpdateStepsLeft() {\n\t\tstore.dispatch(updateStepsLeftRequire());\n\t}\n\n\tstatic callGameUpdateNotBestVertexData() {\n\t\tstore.dispatch(updateNotBestVertexDataRequire());\n\t}\n\n}\n","import axiosInstance from '../api/axiosInstance';\n\nexport interface LevelProgress {\n id: number;\n completed: boolean;\n stepsSpent?: number;\n hash?: string;\n addMovesAttempts: number;\n};\n\nexport interface PackProgress {\n packId: number;\n worldId?: number;\n levels: Array;\n};\n\nexport interface WorldProgress {\n worldId: number;\n packs: Array;\n}\n\n/**\n * Get all worlds progresses\n */\nexport const fetchProgress = (): Promise => {\n return axiosInstance.get('/progresses');\n};\n\n/**\n * Save new level's progress after passing a game\n */\nexport const postProgress = (\n worldId: number, packId: number, levelId: number, hash: string,\n completed: boolean, stepsSpent: number, addMovesAttempts: number,\n): Promise => {\n return axiosInstance.post('/progresses', {\n worldId, packId, levelId, hash,\n completed, stepsSpent, addMovesAttempts,\n });\n};\n\n/**\n * Update existing level's progress after passing a game\n */\nexport const putProgress = (\n worldId: number, packId: number, levelId: number, hash: string,\n completed: boolean, stepsSpent: number, addMovesAttempts: number,\n): Promise => {\n return axiosInstance.put(`/progresses/${worldId}`, {\n packId, levelId, hash, completed, stepsSpent, addMovesAttempts,\n });\n};\n\n/**\n * Delete all user's progress (all worlds)\n */\nexport const deleteProgress = (): Promise => {\n return axiosInstance.delete('/progresses/all');\n};\n","import { schema } from 'normalizr';\n\nimport { LevelProgress, PackProgress, WorldProgress } from '../../shared/api/progressAPI';\nimport { createPackEntityId, createLevelEntityId } from '../../shared/helpers/schemas';\n\n// Normalized Data interfaces\n\nexport type WorldsProgressEntity = Record;\n\nexport type PacksProgressEntity = Record;\n\n\nexport type LevelsProgressEntity = Record;\n\n/**\n * Structure Example:\n entities: {\n\t\tworlds: {\n\t\t\t1: {\n\t\t\t\tworldId: 1,\n\t\t\t\tpacks: ['1-1', '1-2']\n\t\t\t}\n\t\t\t2: {}\n\t\t},\n\t\tpacks: {\n\t\t\t'1-1': {\n\t\t\t\tpackId: number,\n\t\t\t\tlevels: ['1-1-1', '1-1-2', '1-1-3']\n\t\t\t},\n\t\t\t'1-2': {...}\n\t\t},\n\t\tlevels: {\n\t\t\t'1-1-1': {\n\t\t\t\tid: 1,\n\t\t\t\thash: 'level1hash',\n\t\t\t\tcompleted: true,\n\t\t\t\tstepsSpent: 42,\n\t\t\t\taddMovesAttempts: 3,\n\t\t\t},\n\t\t\t'1-1-2': Level,\n\t\t\t'1-1-3': Level,\n\t\t}\n }\n */\nexport interface ProgressEntities {\n\tworlds: WorldsProgressEntity;\n\tpacks: PacksProgressEntity;\n\tlevels: any; // LevelsEntity;\n};\n\nconst LevelProgressSchema = new schema.Entity('levels',\n\t{},\n\t{\n\t\tidAttribute: (value, parent, key) => createLevelEntityId(parent.worldId, parent.packId, value.id)\n\t}\n);\n\nconst PackProgressSchema = new schema.Entity('packs', {\n\tlevels: [LevelProgressSchema]\n}, {\n\tprocessStrategy: (value, parent, key) => ({ ...value, worldId: parent.worldId }),\n\tidAttribute: (value, parent, key) => createPackEntityId(parent.worldId, value.packId),\n});\n\nexport const WorldProgressSchema = new schema.Entity('worlds', {\n\tpacks: [PackProgressSchema]\n}, { idAttribute: 'worldId' });\n\nexport const ProgressListSchema = [WorldProgressSchema];\n","import { normalize } from 'normalizr';\n\nimport {\n CLEAR_PROGRESS_REQUEST, CLEAR_PROGRESS_SUCCESS, CLEAR_PROGRESS_FAILURE,\n GET_WORLDS_PROGRESS_SUCCESS, GET_WORLDS_PROGRESS_FAILURE, RESET_WORLDS_PROGRESS,\n UPDATE_LEVEL_PROGRESS_SUCCESS, UPDATE_LEVEL_PROGRESS_FAILURE,\n CALC_ALL_ACHIEVED_STARS,\n} from '../../redux/actionTypes';\nimport { getLevelProgress } from '../../redux/selectors/progress';\nimport { clearLastVisitedLevel, clearAllNextPackMsgShowed } from '../../shared/helpers/progress';\nimport { resetBoosters } from '../../redux/actions/boosters';\nimport { resetLivesNumber } from '../../redux/actions/lives';\nimport { resetTutorial, updateActiveLevelId } from '../../redux/actions/tutorial';\n\nimport * as progressAPI from '../../shared/api/progressAPI';\n// import { WorldProgress } from '../../shared/api/progressAPI';\n\nimport { ProgressListSchema, ProgressEntities } from '../../shared/schemas/progress';\nimport { WorldsEntities } from '../../shared/schemas/worlds';\n\n\nexport const clearProgressRequest = () => ({\n type: CLEAR_PROGRESS_REQUEST,\n});\n\nexport const clearProgressSuccess = () => ({\n type: CLEAR_PROGRESS_SUCCESS,\n});\n\nexport const clearProgressFailure = () => ({\n type: CLEAR_PROGRESS_FAILURE,\n});\n\nexport const getWorldsProgressSuccess = (progress: ProgressEntities) => ({\n type: GET_WORLDS_PROGRESS_SUCCESS,\n progress,\n});\n\nexport const getWorldsProgressFailure = () => ({\n type: GET_WORLDS_PROGRESS_FAILURE,\n});\n\nexport const resetWorldsProgress = () => ({\n type: RESET_WORLDS_PROGRESS,\n});\n\nexport const updateLevelProgressSuccess = (worldId: number, packId: number, levelId: number, hash: string, completed: boolean, stepsSpent: number, addMovesAttempts?: number, cheatStars?: number) => ({\n type: UPDATE_LEVEL_PROGRESS_SUCCESS,\n worldId, packId, levelId, hash, completed, stepsSpent,\n addMovesAttempts, cheatStars,\n});\n\nexport const updateLevelProgressFailure = () => ({\n type: UPDATE_LEVEL_PROGRESS_FAILURE,\n});\n\nexport const calcAchievedStars = (worldsData: WorldsEntities) => ({\n type: CALC_ALL_ACHIEVED_STARS,\n worldsData,\n});\n\n/**\n * Requires both worlds and progress data from the store!\n */\nexport function calcAchievedStarsAsync() {\n return function(dispatch: any, getState: any) {\n const normalizedWorldsData = getState().worlds.entities;\n dispatch(calcAchievedStars(normalizedWorldsData));\n };\n};\n\nexport function clearProgress() {\n return function(dispatch: any, getState: any) {\n dispatch(clearProgressRequest());\n return progressAPI.deleteProgress().then(() => {\n clearLastVisitedLevel();\n clearAllNextPackMsgShowed();\n dispatch(resetTutorial());\n dispatch(updateActiveLevelId());\n dispatch(resetBoosters());\n dispatch(resetLivesNumber());\n dispatch(resetWorldsProgress());\n dispatch(clearProgressSuccess());\n }, () => {\n dispatch(clearProgressFailure());\n });\n };\n};\n\nexport const getProgress = () => {\n return (dispatch: any, getState: any) => {\n return progressAPI.fetchProgress()\n .then((progress) => {\n // Normalize data, see ProgressEntities interface structure\n const normalizedProgress = normalize(progress, ProgressListSchema);\n dispatch(getWorldsProgressSuccess(normalizedProgress.entities));\n return normalizedProgress.entities;\n }, (error) => {\n dispatch(getWorldsProgressFailure());\n });\n };\n};\n\nexport const updateLevelProgress = (worldId: number, packId: number, levelId: number, hash: string, completed: boolean, stepsSpent: number, addMovesAttempts: number, cheatStars?: number) => {\n return (dispatch: any, getState: any) => {\n const progress = getState().progress.progress;\n let apiCall;\n if (getLevelProgress(worldId, packId, levelId, progress)) {\n apiCall = progressAPI.putProgress(worldId, packId, levelId, hash, completed, stepsSpent, addMovesAttempts);\n } else {\n apiCall = progressAPI.postProgress(worldId, packId, levelId, hash, completed, stepsSpent, addMovesAttempts);\n }\n return apiCall.then(() => {\n return new Promise((resolve) => {\n // Update level's progress in the store\n dispatch(updateLevelProgressSuccess(worldId, packId, levelId, hash, completed, stepsSpent, addMovesAttempts, cheatStars));\n // Recalculate achieved stars\n const normalizedWorldsData = getState().worlds.entities;\n dispatch(calcAchievedStars(normalizedWorldsData));\n resolve(true);\n });\n }, (error) => {\n dispatch(updateLevelProgressFailure());\n });\n };\n};\n","import { createSelector } from 'reselect';\nimport memoize from 'lodash/memoize';\nimport find from 'lodash/find';\nimport filter from 'lodash/filter';\n\n\nexport const modalsSelector = state => state.modals.modals;\n\nexport const isModalShowedSelector = createSelector(\n [modalsSelector],\n modals => memoize(\n modalType => {\n const modal = find(modals, { type: modalType });\n return modal ? modal.show : false;\n }\n )\n);\n\nexport const showedModalsSelector = createSelector(\n [modalsSelector],\n modals => filter(modals, {show: true})\n);","// extracted by mini-css-extract-plugin\nmodule.exports = {\"UpdateBtn\":\"UpdateBtn_UpdateBtn__3UUdo\",\"Transparent\":\"UpdateBtn_Transparent__2it5I\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"cWhite\":\"#FFFFFF\",\"Settings\":\"Settings_Settings__GthuT\",\"SettingsBtn\":\"Settings_SettingsBtn__3ujSU\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"cWhite\":\"#FFFFFF\",\"PayBtn\":\"PayBtn_PayBtn__1sGzr\",\"PayBtnDisabled\":\"PayBtn_PayBtnDisabled__1wMyj\",\"Icon\":\"PayBtn_Icon__2FWQF\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"cWhite\":\"#FFFFFF\",\"cOKorange\":\"#ed7a00\",\"Footer\":\"Footer_Footer__238hM\",\"Line\":\"Footer_Line__3sS2W\",\"Contacts\":\"Footer_Contacts__3RMt0\",\"Sharings\":\"Footer_Sharings__1Uzq3\",\"Tw\":\"Footer_Tw__2r9PQ\",\"Fb\":\"Footer_Fb__3kiqL\",\"Mail\":\"Footer_Mail__3ZX7B\",\"Reddit\":\"Footer_Reddit__1UHqe\",\"OK\":\"Footer_OK__3QBUp\",\"ShareBtn\":\"Footer_ShareBtn__22WcQ\",\"OKShareBtn\":\"Footer_OKShareBtn__1_zHh\",\"OKShareBtnTitle\":\"Footer_OKShareBtnTitle__UCwJY\",\"Info\":\"Footer_Info__2cltk\",\"Masked\":\"Footer_Masked__19nNZ\",\"FooterLink\":\"Footer_FooterLink__2S6Qk\",\"Link\":\"Footer_Link__2v7FB\",\"Review\":\"Footer_Review__1Ywtb\",\"ReviewLink\":\"Footer_ReviewLink__D24Ul\"};","import {\n SUCCESS\n} from 'shared/constants';\nimport loadSdk from 'shared/sdk';\nimport axiosInstance from 'shared/api/axiosInstance';\n\nexport interface IPrices {\n name: 'free_lives';\n amount: number;\n}\n\nexport const putPrices = (price: number, name: 'free_lives' = 'free_lives'): Promise =>\n axiosInstance.put('/prices', { name, amount: price }) as any\n\nexport const getPrices = (name: 'free_lives' = 'free_lives'): Promise =>\n axiosInstance.get(`/prices?name=${name}`).catch(() => {\n const amount = process.env.REACT_APP_MODE === 'prod' ? 99 : 1;\n const inline: IPrices = { amount, name };\n return Promise.resolve(inline);\n }) as Promise;\n\nexport const postLifePurchase = (price: number) => loadSdk().then(p => {\n return p.default.showPayment(price);\n}, () => Promise.resolve(SUCCESS));\n\nexport const deleteLifePurchase = () => Promise.resolve(SUCCESS);\n","import PropTypes from 'prop-types';\n\n\nexport const propTypes = {\n transparent: PropTypes.bool,\n};\n\nexport const defaultProps = {\n transparent: true,\n};","/* eslint react/jsx-pascal-case: [0, { ignore: 1 }] */\n\nimport React from 'react';\nimport classNames from 'classnames';\n\nimport { propTypes, defaultProps } from './props';\n\n// styles\nimport styles from './BackBtn.module.css';\n\n\nclass BackBtn extends React.PureComponent {\n\n /******************************************\n * COMPONENT HOOKS\n ******************************************/\n\n render() {\n const btnClasses = classNames({\n [styles.BackBtn]: true,\n [styles.Reversed]: this.props.reversed,\n [styles.Transparent]: this.props.transparent,\n [this.props.className]: !!this.props.className\n });\n\n return (\n \n );\n }\n}\n\nBackBtn.propTypes = propTypes;\nBackBtn.defaultProps = defaultProps;\n\nexport default BackBtn;","import BackBtn from './BackBtn';\n\nexport default BackBtn;\n","import findIndex from 'lodash/findIndex';\nimport map from 'lodash/map';\nimport get from 'lodash/get';\nimport reduce from 'lodash/reduce';\nimport isNil from 'lodash/isNil';\nimport keys from 'lodash/keys';\nimport forEach from 'lodash/forEach';\nimport * as ls from 'store2';\n\n\nimport { MAX_ADD_MOVES_ATTEMPTS } from '../../shared/constants';\nimport { Level, Pack } from '../../shared/api/worldsAPI';\nimport { PackProgress, LevelProgress } from '../../shared/api/progressAPI';\nimport { ProgressEntities } from '../../shared/schemas/progress';\nimport { WorldsEntities } from '../../shared/schemas/worlds';\nimport { getLevelProgress, getPackLevelsProgress } from '../../redux/selectors/progress';\nimport { getPackLevels } from '../../redux/selectors/worlds';\nimport { createLevelEntityId } from '../../shared/helpers/schemas';\n\n\nconst lastVisitedLevelName = `lastVisitedLevel__${String(process.env.REACT_APP_LEVELS_VERSION)}`;\n\ninterface LastVisitedLevel {\n worldId: number;\n packId: number;\n levelId: number;\n};\n\nconst nextPackMsgShowedPrefix = 'isNextPackMsgShowed__';\n\n/**\n * Creates empty pack progress\n * @param {number} worldId\n * @param {number} packId\n * @param {Array} packLevels - Passed Level's pack with all levels\n * @return {PackProgress}\n */\nexport const createPackProgress = (worldId: number, packId: number, packLevels: Array = []): PackProgress => {\n return {\n packId,\n worldId,\n levels: map(packLevels, (levelData) => {\n return createLevelEntityId(worldId, packId, levelData.Id);\n }),\n };\n};\n\n/**\n * Creates empty level progress\n * @param {number} levelId\n * @param {string} levelHash - Level's hash\n * @return {LevelProgress}\n */\nexport const createLevelProgress = (levelId: number, levelHash: string, stepsSpent: number, completed: boolean, addMovesAttempts: number): LevelProgress => {\n return {\n id: levelId,\n hash: levelHash ? levelHash : undefined,\n completed: !!completed,\n stepsSpent: stepsSpent ? stepsSpent : undefined,\n addMovesAttempts: !isNil(addMovesAttempts) ? addMovesAttempts : MAX_ADD_MOVES_ATTEMPTS,\n };\n};\n\n/**\n * Check if there is another level after levelId exists in the pack\n * @param {number} levelId\n * @param {Array} packLevels - Levels array of the pack\n * @return {boolean}\n */\nexport const hasNextLevelInPack = (levelId: number, packLevels: Array): boolean => {\n const levelIndex = findIndex(packLevels, { Id: levelId } as any);\n return (levelIndex >= 0 && levelIndex !== packLevels.length - 1);\n};\n\n/**\n * Check if user has access to the level\n * Previous level must be completed before next can be started\n * @param {number} worldId\n * @param {number} levelId\n * @param {number} packId\n * @param {ProgressEntities} normalized progress from store\n * @return {boolean}\n */\nexport const hasLevelAccess = (worldId: number, packId: number, levelId: number, progressEntities: ProgressEntities): boolean => {\n if (levelId === 1) return true;\n const prevLevel = getLevelProgress(worldId, packId, levelId - 1, progressEntities as any);\n return get(prevLevel, 'completed', false);\n};\n\nexport const hasPackAccess = (starsRequired: number, achievedStarsInAllWorlds: number): boolean => {\n return achievedStarsInAllWorlds >= starsRequired;\n};\n\n/**\n * Calculate pack's achieved stars according on progress in the localStorage\n * @param {number} worldId\n * @param {number} packId\n * @param {number} maxStars - pack.MaxStars\n * @param {WorldsEntities} worlds - normalized worlds data from store\n * @param {ProgressEntities} normalized progress from store\n * @return {number} - Number of achieved stars in the pack\n */\nexport const calcAchievedStarsInPack = (worldId: number, packId: number, maxStars: number, worlds: WorldsEntities, progress: ProgressEntities): number => {\n const packLevels = getPackLevels(worldId, packId, worlds);\n const packLevelsProgress = getPackLevelsProgress(worldId, packId, progress);\n if (!packLevelsProgress) return 0;\n return packLevelsProgress.reduce((result: any, levelProgress: any) => {\n if (!levelProgress.completed) return result;\n const levelData: any = packLevels.find((item) => item.Id === levelProgress.id);\n let levelAchievedStars = 0;\n\n if (levelData) {\n levelAchievedStars = getAchievedStarsAmount(\n levelData.Graph.MaxMovesCount,\n levelData.Graph.BestMovesCount,\n levelProgress.stepsSpent,\n maxStars,\n levelProgress.cheatStars,\n );\n }\n return result + levelAchievedStars;\n }, 0);\n};\n\nexport const calcMaxStarsInWorld = (worldPacksData: Array): number => {\n if (!worldPacksData) {\n return 0;\n }\n return reduce(worldPacksData, (result: number, pack: Pack) => {\n return pack.Levels.length * pack.MaxStars + result;\n }, 0);\n};\n\n// Saves level data (world,pack,level) of the last visited level\n// Proceed user to this level after continue button click\nexport const saveLastVisitedLevel = (worldId: number, packId: number, levelId: number) => {\n ls.set(lastVisitedLevelName, { worldId, packId, levelId });\n};\n\n// Gets last visited level data\nexport const getLastVisitedLevel = (): LastVisitedLevel => {\n return ls.get(lastVisitedLevelName);\n};\n\n// Clears last visited level data\nexport const clearLastVisitedLevel = (): void => {\n ls.remove(lastVisitedLevelName);\n};\n\n/*\n * Если пользователь прошел уровень за BestMovesCount или меньше, то возвращаем maxStars\n * В остальных случаях высчитываем диапазоны для оставшихся звезд\n * Example: MaxMovesCount = 50, BestMovesCount = 30\n * maxStars=3 => 30-1=3, 41-31=2, 42-50=1, 51 и больше=1\n * maxStars=5 => 1-30=5, 31-36=4, 37-42=3, 43-48=2, 49-50=1\n * https://trello.com/c/NmveTUtI\n * https://trello.com/c/OW8WlXOa\n*/\nexport const getAchievedStarsAmount = (maxMovesCount: number, bestMovesCount: number, currentMovesCount: number, maxStars: number, cheatStars?: number): number => {\n if (cheatStars) return cheatStars;\n // if user made less or equal moves count to bestMovesCount\n if (currentMovesCount <= bestMovesCount) {\n return maxStars;\n }\n // if user made more moves count as maxMovesCount (e.g. with advertisement)\n if (currentMovesCount > maxMovesCount) {\n return 1;\n }\n // else - calculate stars\n const delta = maxMovesCount - bestMovesCount;\n const boundariesNumber = maxStars - 1;\n const rangeSize = Math.round(delta/boundariesNumber);\n let lastRangeEndNumber;\n for (let i = boundariesNumber; i > 0; i--) {\n let rangeStartNumber: number;\n if (lastRangeEndNumber) {\n rangeStartNumber = lastRangeEndNumber + 1;\n } else {\n rangeStartNumber = bestMovesCount + 1;\n }\n let rangeEndNumber = rangeStartNumber + rangeSize;\n if (currentMovesCount >= rangeStartNumber && currentMovesCount <= rangeEndNumber) {\n return i;\n }\n lastRangeEndNumber = rangeEndNumber;\n }\n return 0;\n};\n\n/*\n * Если пользователь прошел уровень с читами, то возвращаем кол-во шагов,\n * Нужное для прохождения этого уровня с cheatStars\n*/\nexport const getStepsForCheatStars = (maxMovesCount: number, bestMovesCount: number, maxStars: number, cheatStars?: number): number => {\n const delta = maxMovesCount - bestMovesCount;\n const boundariesNumber = maxStars - 1;\n const rangeSize = Math.round(delta / boundariesNumber);\n\n return maxMovesCount - rangeSize * (cheatStars! - 1);\n};\n\n/**\n * Returns next available pack ID if we have one\n * @param {number} worldId\n * @param {number} packId\n * @param {Array} packs - normalized packs data from store (array of packs Id of the world)\n * @param {number} achievedStarsInWorld - number of current achieved stars in wirld\n * @return {string} - next pack ID\n*/\nexport const getNextAvailablePackId = (worldId: number, packId: number, packs: Array, achievedStarsInWorld: number): string | null => {\n const currIndex = findIndex(packs, {Id: packId} as any);\n if (currIndex < packs.length - 1) {\n const nextPack = packs[currIndex + 1];\n return achievedStarsInWorld >= nextPack.StarsRequired ? nextPack.Id : null;\n }\n return null;\n};\n\n\nconst getNextPackMsgShowedName = (worldId: number, packId: number): string => {\n return `${nextPackMsgShowedPrefix}${worldId}__${packId}`;\n};\n\nexport const isNextPackMsgShowed = (worldId: number, packId: number): boolean => {\n const nextPackMsgShowedName = getNextPackMsgShowedName(worldId, packId);\n const flag = ls.get(nextPackMsgShowedName);\n return !!flag;\n};\n\nexport const setNextPackMsgShowed = (worldId: number, packId: number): void => {\n const nextPackMsgShowedName = getNextPackMsgShowedName(worldId, packId);\n ls.set(nextPackMsgShowedName, true);\n};\n\nexport const clearNextPackMsgShowed = (worldId: number, packId: number): void => {\n const nextPackMsgShowedName = getNextPackMsgShowedName(worldId, packId);\n ls.remove(nextPackMsgShowedName);\n};\n\nexport const clearAllNextPackMsgShowed = (): void => {\n const arrToRemove: any[] = [];\n const lsKeys = keys(ls.getAll());\n\n // Iterate over localStorage and insert the keys into arr\n forEach(lsKeys, key => {\n if (key.indexOf(nextPackMsgShowedPrefix) >= 0) {\n arrToRemove.push(key);\n }\n });\n\n // Remove the items by key\n forEach(arrToRemove, key => {\n ls.remove(key);\n });\n};\n","import PropTypes from 'prop-types';\n\n\nexport const propTypes = {\n starsNumber: PropTypes.number.isRequired,\n resizeOnMobile: PropTypes.bool,\n maxStars: PropTypes.number.isRequired, // maximum stars user can achieve in level\n};\n\nexport const defaultProps = {\n starsNumber: 0,\n resizeOnMobile: false,\n maxStars: 3,\n};","/* eslint react/jsx-pascal-case: [0, { ignore: 1 }] */\nimport React, { PureComponent } from 'react';\nimport classNames from 'classnames';\nimport range from 'lodash/range';\n\nimport { propTypes, defaultProps } from './props';\n\n// styles\nimport styles from './Stars.module.css';\n\n\nclass Stars extends PureComponent {\n\n constructor(props) {\n super(props);\n this._setRange(props.maxStars);\n }\n\n /******************************************\n * COMPONENT HOOKS\n ******************************************/\n\n render() {\n const { resizeOnMobile, starsNumber } = this.props;\n return (\n
\n {this.starsRange.map((num) => {\n const classes = classNames([\n styles.Star,\n (num > starsNumber ? styles.StarOutline : styles.StarFilled)\n ]);\n return (
);\n })}\n
\n );\n }\n\n UNSAFE_componentWillReceiveProps(nextProps) {\n if (nextProps.maxStars !== this.props.maxStars) {\n this._setRange(nextProps.maxStars);\n }\n }\n\n /******************************************\n * COMPONENT METHODS\n ******************************************/\n\n _setRange(maxStars) {\n this.starsRange = range(1, maxStars + 1);\n }\n}\n\n\nStars.propTypes = propTypes;\nStars.defaultProps = defaultProps;\n\nexport default Stars;\n","import Stars from './Stars';\n\nexport default Stars;\n","/* eslint react/jsx-pascal-case: [0, { ignore: 1 }] */\n\nimport React from 'react';\nimport classNames from 'classnames';\nimport isNil from 'lodash/isNil';\n\n// styles\nimport styles from './LifeIcon.module.css';\n\n\nclass LifeIcon extends React.PureComponent {\n\n /******************************************\n * COMPONENT HOOKS\n ******************************************/\n\n render() {\n const iconClasses = classNames({\n [styles.LifeIcon]: true,\n [styles.SizeBig]: this.props.size === 'big',\n [styles[`Color${this.props.color}`]]: !isNil(this.props.color),\n [this.props.className]: !!this.props.className,\n });\n\n return (\n \n );\n }\n}\n\nexport default LifeIcon;\n","import LifeIcon from './LifeIcon';\n\nexport default LifeIcon;\n","const separator = '-';\n\n/**\n * Creates entity id of the pack in normalized data\n * @param {number} worldId\n * @param {number} packId\n * @return {string}\n */\nexport const createPackEntityId = (worldId: number, packId: number): string => {\n return `${worldId}${separator}${packId}`;\n};\n\n/**\n * Creates entity id of the level in normalized data\n * @param {number} worldId\n * @param {number} packId\n * @param {number} levelId\n * @return {string}\n */\nexport const createLevelEntityId = (worldId: number, packId: number, levelId: number): string => {\n return `${worldId}${separator}${packId}${separator}${levelId}`;\n};\n\nexport const parseLevelEntityId = (levelEntityId: string): any => {\n const data = levelEntityId.split(separator);\n return {\n worldId: data[0],\n packId: data[1],\n levelId: data[2]\n };\n};","import { createSelector } from 'reselect';\nimport get from 'lodash/get';\nimport values from 'lodash/values';\n\nimport { getPropsWorldID } from '../../redux/selectors/worlds';\nimport { WorldProgress, Level, Pack } from '../../shared/api/worldsAPI';\nimport { WorldsEntities } from '../../shared/schemas/worlds';\nimport {\n ProgressEntities,\n WorldsProgressEntity\n} from '../../shared/schemas/progress';\nimport {\n createPackEntityId,\n createLevelEntityId\n} from '../../shared/helpers/schemas';\n\n// reselect cached selectors\n\n\nexport type PackProgress = any;\n\n\nexport const getAchievedStarsInWorldSelector = createSelector(\n [getPropsWorldID, (state, props) => state.progress.achievedStars],\n (worldId, achievedStars) => getAchievedStarsInWorld(worldId, achievedStars)\n);\n\n// other selectors\n\nexport const getAchievedStarsInWorld = (worldId: any, achievedStars: any) => {\n return get(achievedStars, `${worldId}.stars`, 0);\n};\n\nexport const getAchievedStarsInPack = (\n worldId: any,\n packId: any,\n achievedStars: any\n) => {\n return get(achievedStars, `${worldId}.packs.${packId}`, 0);\n};\n\nexport const getAllAchievedStars = (achievedStars: any) => {\n return get(achievedStars, 'all', 0);\n};\n\nexport const getWorldProgressById = (\n worldId: number,\n progressEntities: ProgressEntities\n): WorldsProgressEntity => {\n return get(progressEntities, `worlds.${worldId}`);\n};\n\nexport const getPackLevelsProgress = (\n worldId: number,\n packId: number,\n progressEntities: ProgressEntities\n): PackProgress | undefined => {\n const packProgress: any = getPackProgress(worldId, packId, progressEntities as any);\n if (!packProgress) return undefined;\n return packProgress.levels.map((entityLevelId: any) =>\n get(progressEntities, `levels.${entityLevelId}`)\n );\n};\n\nexport const getLevelProgress = (\n worldId: number,\n packId: number,\n levelId: number,\n entities: WorldsEntities\n): Level => {\n return get(\n entities,\n `levels.${createLevelEntityId(worldId, packId, levelId)}`\n ) as any;\n};\n\nexport const getPackProgress = (\n worldId: number,\n packId: number,\n entities: WorldsEntities\n): Pack => {\n return get(entities, `packs.${createPackEntityId(worldId, packId)}`);\n};\n\nexport const getProgressArray = (\n entities: WorldsEntities\n): Array => {\n return values(get(entities, 'worlds'));\n};\n","import store from '../../redux/store';\n\nimport { Howl, Howler } from 'howler';\nimport forEach from 'lodash/forEach';\nimport size from 'lodash/size';\nimport shuffle from 'lodash/shuffle';\nimport get from 'lodash/get';\n\nimport { isTabVisible } from '../helpers/tabVisibility';\n\n// redux\nimport { setSettings } from '../../redux/actions/settings';\n\n\ninterface SoundItem {\n id: string; // howl instance id in the _howlSounds list (readonly)\n options: any; // howl options\n};\n\ninterface BgSoundItem extends SoundItem {\n active?: boolean; // indicate current playing or stopped track\n};\n\n/**\n * Manage sounds in applicaiton\n * Background sound on the PlaygroundPage, button sounds on click\n */\nexport default class AppSoundManager {\n\n\t/******************************************\n\t* CLASS PROPERTIES\n\t******************************************/\n\t/**\n\t * id - id of the sound in the _howlSounds array\n\t * options - Howl object options\n\t */\n\tstatic _soundsList: Array = [\n\t\t{\n\t\t\t'id': 'buttonDefault',\n\t\t\t'options': {\n\t\t\t\tsrc: ['/assets/sound/button.mp3'],\n\t\t\t\tvolume: 0.5,\n\t\t\t}\n\t\t}, {\n\t\t\t'id': 'win',\n\t\t\t'options': {\n\t\t\t\tsrc: ['/assets/sound/win.webm', '/assets/sound/win.mp3'],\n volume: 0.9,\n html5: true,\n\t\t\t}\n\t\t}, {\n\t\t\t'id': 'fail',\n\t\t\t'options': {\n\t\t\t\tsrc: ['/assets/sound/lose.mp3'],\n volume: 0.9,\n html5: true,\n\t\t\t}\n\t\t}, {\n\t\t\t'id': 'action',\n\t\t\t'options': {\n\t\t\t\tsrc: ['/assets/sound/any-other-action.mp3'],\n volume: 0.5,\n html5: true,\n\t\t\t}\n\t\t}, {\n\t\t\t'id': 'nodeClick',\n\t\t\t'options': {\n\t\t\t\tsrc: ['/assets/sound/node-click.mp3'],\n volume: 0.5,\n html5: true,\n\t\t\t}\n\t\t}, {\n\t\t\t'id': 'addMovesLifes',\n\t\t\t'options': {\n\t\t\t\tsrc: ['/assets/sound/add-moves-lifes.mp3'],\n volume: 0.5,\n html5: true,\n\t\t\t}\n\t\t}, {\n\t\t\t'id': 'boosterHint',\n\t\t\t'options': {\n\t\t\t\tsrc: ['/assets/sound/booster-hint.mp3'],\n volume: 0.5,\n html5: true,\n\t\t\t}\n\t\t}, {\n\t\t\t'id': 'boosterMoveBack',\n\t\t\t'options': {\n\t\t\t\tsrc: ['/assets/sound/booster-move-back.mp3'],\n volume: 0.5,\n html5: true,\n\t\t\t}\n\t\t},\n\t];\n\t/**\n\t * List of all bg sound, may be randomized by _randomizeBgSoundOrder method\n\t * Sounds are being loaded while playing\n\t * id - id of the sound in the _howlSounds array\n\t * active - indicate active playing or paused background sound\n\t * options - Howl object options\n\t */\n\tstatic _bgSoundsList: Array = [\n\t\t{\n\t\t\t'id': 'bg-1',\n\t\t\t'active': true,\n\t\t\t'options': {\n\t\t\t\tsrc: ['/assets/sound/DG-OST.mp3'],\n\t\t\t\tvolume: 0.8,\n\t\t\t\thtml5: true,\n\t\t\t}\n\t\t}, {\n\t\t\t'id': 'bg-2',\n\t\t\t'options': {\n\t\t\t\tsrc: ['/assets/sound/TDG-OST-2.mp3'],\n\t\t\t\tvolume: 0.8,\n\t\t\t\thtml5: true,\n\t\t\t}\n\t\t}, {\n\t\t\t'id': 'bg-3',\n\t\t\t'options': {\n\t\t\t\tsrc: ['/assets/sound/TDG-OST-3.mp3'],\n\t\t\t\tvolume: 0.8,\n\t\t\t\thtml5: true,\n\t\t\t}\n\t\t}, {\n\t\t\t'id': 'bg-4',\n\t\t\t'options': {\n\t\t\t\tsrc: ['/assets/sound/TDG-OST-4.mp3'],\n\t\t\t\tvolume: 0.8,\n\t\t\t\thtml5: true,\n\t\t\t}\n\t\t}\n\t];\n\tstatic _howlSounds: any = {}; // howl instances\n\t// when bg sound ended we run next one from the _bgSoundsList\n\tstatic _handlerBgSoundEndBind: any = null;\n\n\t/******************************************\n\t* CLASS GETTERS\n\t******************************************/\n\n\tstatic get isInitialized(): boolean {\n\t\treturn size(this._howlSounds) > 0;\n\t}\n\n\tstatic get isSoundsEnabled(): boolean {\n\t\treturn !!get(store.getState(), 'settings.sounds');\n\t}\n\n\tstatic get isMusicEnabled(): boolean {\n\t\treturn !!get(store.getState(), 'settings.music');\n\t}\n\n\t/******************************************\n\t* CLASS METHODS\n\t******************************************/\n\n\t/**\n\t\t* Creates howl instances, loades sounds\n\t\t* Run this method before working with sounds\n\t\t* @param {boolean} randomizeBgSound - shuffle _bgSoundsList if argument is true\n\t*/\n\tstatic init(randomizeBgSound?: boolean) {\n\t\tif (this.isInitialized) return;\n\t\twindow.Howler.autoUnlock = false;\n\t\tHowler.autoUnlock = false;\n\t\tif (randomizeBgSound) this._randomizeBgSoundOrder();\n // this._playBgMusicOnPageLoad();\n\t\t// load other app sounds\n\t\tforEach(this._soundsList, (soundItem) => {\n\t\t\tthis._howlSounds[soundItem.id] = new Howl(soundItem.options);\n\t\t});\n\t}\n\n\t/*\n\t\t* Stops playing background music\n\t*/\n\tstatic stopBackgroundMusic(pause: boolean) {\n\t\tif (!this.isInitialized) return;\n\t\tforEach(this._bgSoundsList, (soundItem) => {\n\t\t\tconst howlInstance = this._howlSounds[soundItem.id];\n\t\t\tif (howlInstance && howlInstance.playing()) {\n\t\t\t\tif (pause) {\n\t\t\t\t\thowlInstance.pause();\n\t\t\t\t} else {\n\t\t\t\t\thowlInstance.stop();\n\t\t\t\t}\n\t\t\t\thowlInstance.off('end', this._handlerBgSoundEndBind);\n\t\t\t}\n\t\t});\n\t}\n\n\t/*\n\t\t* Pause background music\n\t*/\n\tstatic pauseBackgroundMusic() {\n\t\tthis.stopBackgroundMusic(true);\n\t}\n\n\t/*\n\t\t* Starts active background sound\n\t*/\n\tstatic startBackgroundMusic() {\n\t\tif (!this.isInitialized) this.init();\n\t\tif (!this.isMusicEnabled) return;\n\t\tif (!isTabVisible()) return;\n\t\tlet activeBgSound = this._getActiveBgSound();\n\t\tif (!activeBgSound) {\n\t\t\tactiveBgSound = this._bgSoundsList[0];\n\t\t\tactiveBgSound.active = true;\n\t\t}\n\t\tlet howlItem = this._howlSounds[activeBgSound.id];\n\t\tif (!howlItem) {\n\t\t\thowlItem = this._howlSounds[activeBgSound.id] = new Howl(activeBgSound.options);\n\t\t}\n\t\tif (howlItem.playing()) return;\n\t\tif (!this._handlerBgSoundEndBind) {\n\t\t\tthis._handlerBgSoundEndBind = this._handlerBgSoundEnd.bind(this);\n\t\t}\n\t\thowlItem.off('end', this._handlerBgSoundEndBind);\n\t\thowlItem.once('end', this._handlerBgSoundEndBind);\n\t\thowlItem.play();\n\t}\n\n\t/*\n\t\t* Toggles sounds\n\t*/\n\tstatic toggleSounds() {\n\t\tstore.dispatch(setSettings({sounds: !this.isSoundsEnabled}));\n\t}\n\n\t/*\n\t\t* Toggles bg music according on localStorage value this.isMusicEnabled\n\t\t* Then play or stops music\n\t*/\n\tstatic toggleMusic() {\n\t\tthis.toggleMusicSetting();\n\t\tif (this.isMusicEnabled) {\n\t\t\tthis.startBackgroundMusic();\n\t\t} else {\n\t\t\tthis.pauseBackgroundMusic();\n\t\t}\n\t}\n\n\t/*\n\t\t* Toggles bg music\n\t*/\n\tstatic toggleMusicSetting() {\n\t\tstore.dispatch(setSettings({ music: !this.isMusicEnabled }));\n\t}\n\n\tstatic playButtonSound() {\n\t\tthis._playSoundById('buttonDefault');\n\t}\n\n\tstatic playFailSound() {\n\t\tthis._playSoundById('fail');\n\t}\n\n\tstatic playWinSound() {\n\t\tthis._playSoundById('win');\n\t}\n\n\tstatic playActionSound() {\n\t\tthis._playSoundById('action');\n\t}\n\n\tstatic playNodeClickSound() {\n\t\tthis._playSoundById('nodeClick');\n\t}\n\n\tstatic playAddMovesLifesSound() {\n\t\tthis._playSoundById('addMovesLifes');\n\t}\n\n\tstatic playBoosterHintSound() {\n\t\tthis._playSoundById('boosterHint');\n\t}\n\n\tstatic playBoosterMoveBackSound() {\n\t\tthis._playSoundById('boosterMoveBack');\n\t}\n\n\t/******************************************\n\t* CLASS PRIVATE METHODS\n\t******************************************/\n\n\tstatic _playSoundById(soundId: string) {\n\t\tif (!this.isInitialized) return;\n\t\tif (!this.isSoundsEnabled) return;\n\t\tif (!this._howlSounds[soundId]) {\n\t\t\tconsole.warn(`${soundId} sound not found!`);\n\t\t\treturn;\n\t\t}\n\t\tthis._howlSounds[soundId].play();\n\t}\n\n\t/**\n\t * After active bg sound end, play next one from the _bgSoundsList\n\t */\n\tstatic _handlerBgSoundEnd() {\n\t\tconst activeBgSound: any = this._getActiveBgSound();\n\t\tconst nextActiveIndex = this._bgSoundsList.indexOf(activeBgSound) + 1;\n\t\tlet nextActiveBgSound = this._bgSoundsList[nextActiveIndex];\n\t\tif (activeBgSound) activeBgSound.active = false;\n\t\tif (!nextActiveBgSound) {\n\t\t\tnextActiveBgSound = this._bgSoundsList[0];\n\t\t}\n\t\tnextActiveBgSound.active = true;\n\t\tif (!this._howlSounds[nextActiveBgSound.id]) {\n\t\t\t// create Howl instance for the new sound if it hasn't created yet\n\t\t\tthis._howlSounds[nextActiveBgSound.id] = new Howl(nextActiveBgSound.options);\n\t\t}\n\t\tthis.startBackgroundMusic();\n\t}\n\n\tstatic _getActiveBgSound(): BgSoundItem|void {\n\t\treturn this._bgSoundsList.find((soundItem) => soundItem.active === true);\n\t}\n\n\t/**\n\t * Shuffle _bgSoundsList array, reset active bg sound\n\t */\n\tstatic _randomizeBgSoundOrder() {\n\t\tconst activeBgSound = this._getActiveBgSound();\n\t\tif (activeBgSound) activeBgSound.active = false;\n\t\tthis._bgSoundsList = shuffle(this._bgSoundsList);\n\t\tthis._bgSoundsList[0].active = true;\n }\n \n static _playBgMusicOnPageLoad() {\n // load first active background sound\n let activeBgSound: any = this._getActiveBgSound();\n\t\tif (!activeBgSound) activeBgSound = this._bgSoundsList[0];\n this._howlSounds[activeBgSound.id] = new Howl(activeBgSound.options);\n const howlSound = this._howlSounds[activeBgSound.id];\n howlSound.once('unlock', () => {\n\t\t\t// console.log('unlocked');\n\t\t\t// can't play music until user performs interaction\n\t\t\t// Chrome autoplay policy changes https://goo.gl/7K7WLu\n\n\t\t\t// check that music is not playing\n\t\t\t// (playing() method doesn't work correctly in this case, therefore I had to use seek())\n\t\t\tif (howlSound.seek() === 0) {\n\t\t\t\thowlSound.stop();\n\t\t\t\tthis.startBackgroundMusic();\n\t\t\t}\n\t\t});\n }\n}\n","import get from 'lodash/get';\nimport size from 'lodash/size';\n\nimport i18n from '../../shared/i18n';\nimport config from '../../shared/config';\n\nexport const getSuccessShareText = (movesCount: number, level: number, packName: string): string => {\n\tconst suffix = i18n.services.pluralResolver.getSuffix(i18n.language, +movesCount);\n\tconst movePluralized = i18n.t(`playgroundPage.move${suffix}`);\n\treturn i18n.t('playgroundPage.winSharing', {level, movesCount, packName, movePluralized});\n};\n\n/**\n * Warning: Порядок элементов в массиве attachmentJSON имеет значение, так они будут отображаться в шеринге на странице\n */\nexport const createAttachmentJSON = (attachment: any): any => {\n\tconst attachmentJSON = {\n 'media': [] as any[]\n };\n\n const text = get(attachment, 'text', '');\n if (text) {\n attachmentJSON.media.push({\n 'type': 'text',\n 'text': text,\n })\n }\n\n const app = get(attachment, 'app');\n if (size(app)) {\n attachmentJSON.media.push({\n \"type\": \"app\",\n 'text': get(attachment, 'app.imageText', ''),\n 'images': [{\n \"url\": get(attachment, 'app.imageURL', `${config.ok.appServerURL}/assets/sharing/opg-sharing.png`),\n \"title\": get(attachment, 'app.imageTitle', '')\n }]\n })\n }\n\n attachmentJSON.media.push({\n 'type': 'app-ref',\n 'appId': `${config.ok.appID}`\n });\n\treturn attachmentJSON;\n}\n\n/**\n * POST via FAPI.UI.postMediatopic\n * Attachment config docs https://apiok.ru/dev/methods/rest/mediatopic/mediatopic.post#attachment\n */\nexport const createOKSharing = (attachmentConfig?: any): void => {\n if (!(window as any).FAPI) {\n console.warn('No FAPI for OK');\n return;\n }\n const attachmentJSON = createAttachmentJSON(attachmentConfig);\n (window as any).FAPI.UI.postMediatopic(attachmentJSON, false);\n}\n\nexport const openShareDialog = (linkToShare: string): void => {\n window.open(linkToShare, '', 'toolbar=0,status=0,width=626,height=436');\n}\n","export const boostersConfig = {\n // worldId = 1, packId = 1, levelId = 1\n '100-100-1': {\n hideBoosterHint: true,\n hideBoosterMoveBack: true,\n },\n // worldId = 1, packId = 1, levelId = 2\n '100-100-2': {\n hideBoosterMoveBack: true,\n },\n // worldId = 1, packId = 1, levelId = 3\n /*\n '100-100-3': {\n hideBoosterHint: true,\n hideBoosterMoveBack: true,\n },\n // worldId = 1, packId = 1, levelId = 4\n '10-10-4': {\n hideBoosterMoveBack: true,\n },\n // worldId = 1, packId = 1, levelId = 5\n '10-10-5': {\n hideBoosterMoveBack: false,\n },\n // worldId = 1, packId = 1, levelId = 6\n '10-10-6': {\n hideBoosterHint: true,\n hideBoosterMoveBack: true,\n },\n // worldId = 1, packId = 1, levelId = 7\n '10-10-7': {\n hideBoosterHint: true,\n hideBoosterMoveBack: true,\n },\n // worldId = 1, packId = 1, levelId = 8\n '10-10-8': {\n hideBoosterHint: true,\n hideBoosterMoveBack: true,\n },\n // worldId = 1, packId = 1, levelId = 9\n '10-10-9': {\n hideBoosterHint: true,\n hideBoosterMoveBack: true,\n },\n // worldId = 1, packId = 1, levelId = 10\n '10-10-10': {\n hideBoosterMoveBack: true,\n },\n // worldId = 1, packId = 1, levelId = 11\n '10-10-11': {\n hideBoosterMoveBack: true,\n },\n // worldId = 1, packId = 1, levelId = 12\n '10-10-12': {\n hideBoosterMoveBack: true,\n },\n // worldId = 1, packId = 1, levelId = 13\n '10-10-13': {\n hideBoosterMoveBack: true,\n },\n // worldId = 1, packId = 1, levelId = 14\n '10-10-14': {\n hideBoosterMoveBack: true,\n },\n // worldId = 1, packId = 1, levelId = 15\n '10-10-15': {\n hideBoosterMoveBack: true,\n },\n // worldId = 1, packId = 1, levelId = 16\n '10-10-16': {\n hideBoosterMoveBack: true,\n },\n // worldId = 1, packId = 1, levelId = 17\n '10-10-17': {\n hideBoosterMoveBack: true,\n },\n // worldId = 1, packId = 1, levelId = 18\n '10-10-18': {\n hideBoosterMoveBack: true,\n },\n // worldId = 1, packId = 1, levelId = 19\n '10-10-19': {\n hideBoosterMoveBack: true,\n },\n */\n};\n","import {\n GET_BOOSTERS_REQUEST, GET_BOOSTERS_SUCCESS, GET_BOOSTERS_FAILURE,\n PUT_BOOSTERS_REQUEST, PUT_BOOSTERS_SUCCESS, PUT_BOOSTERS_FAILURE,\n RESET_BOOSTERS,\n BOOSTER_HINT_INCREMENT, BOOSTER_HINT_DECREMENT,\n BOOSTER_MOVE_BACK_INCREMENT, BOOSTER_MOVE_BACK_DECREMENT,\n SET_BOOSTER_HINT_COORDS, SET_BOOSTER_MOVE_BACK_COORDS,\n BOOSTER_MOVE_BACK_CLICK_REQUIRE, BOOSTER_HINT_CLICK_REQUIRE,\n SET_INFINITE_BOOSTER_HINT, SET_INFINITE_BOOSTER_MOVE_BACK,\n} from 'redux/actionTypes';\nimport * as boostersAPI from 'shared/api/boostersAPI';\n\n\n/* SYNC ACTION CREATORS */\n\nexport const getBoostersRequest = () => ({\n type: GET_BOOSTERS_REQUEST,\n});\n\nexport const getBoostersSuccess = boosters => ({\n type: GET_BOOSTERS_SUCCESS,\n boosters,\n});\n\nexport const getBoostersFailure = () => ({\n type: GET_BOOSTERS_FAILURE,\n});\n\nexport const putBoostersRequest = () => ({\n type: PUT_BOOSTERS_REQUEST,\n});\n\nexport const putBoostersSuccess = () => ({\n type: PUT_BOOSTERS_SUCCESS,\n});\n\nexport const putBoostersFailure = () => ({\n type: PUT_BOOSTERS_FAILURE,\n});\n\nexport const boosterHintInc = () => ({\n type: BOOSTER_HINT_INCREMENT,\n});\n\nexport const boosterHintDec = () => ({\n type: BOOSTER_HINT_DECREMENT,\n});\n\nexport const boosterMoveBackInc = () => ({\n type: BOOSTER_MOVE_BACK_INCREMENT,\n});\n\nexport const boosterMoveBackDec = () => ({\n type: BOOSTER_MOVE_BACK_DECREMENT,\n});\n\nexport const resetBoosters = () => ({\n type: RESET_BOOSTERS,\n});\n\nexport const setBoosterHintCoords = (x, y, r) => ({\n type: SET_BOOSTER_HINT_COORDS,\n x,\n y,\n r,\n});\n\nexport const setBoosterMoveBackCoords = (x, y, r) => ({\n type: SET_BOOSTER_MOVE_BACK_COORDS,\n x,\n y,\n r,\n});\n\nexport const boosterHintClickRequire = require => ({\n type: BOOSTER_HINT_CLICK_REQUIRE,\n require,\n});\n\nexport const boosterMoveBackClickRequire = require => ({\n type: BOOSTER_MOVE_BACK_CLICK_REQUIRE,\n require,\n});\n\nexport const setInfiniteBoosterHint = infinite => ({\n type: SET_INFINITE_BOOSTER_HINT,\n infinite,\n});\n\nexport const setInfiniteBoosterMoveBack = infinite => ({\n type: SET_INFINITE_BOOSTER_MOVE_BACK,\n infinite,\n});\n\n/* ASYNC ACTION CREATORS */\n\nexport const getBoosters = () => {\n return function (dispatch) {\n dispatch(getBoostersRequest());\n\n return boostersAPI.fetchBoosters()\n .then(boosters => {\n dispatch(getBoostersSuccess(boosters));\n }, () => {\n dispatch(getBoostersFailure());\n });\n };\n};\n\nexport function putBoosters(boosters) {\n return function (dispatch) {\n dispatch(putBoostersRequest());\n\n return boostersAPI.putBoosters(boosters)\n .then(() => {\n dispatch(putBoostersSuccess());\n }, () => {\n dispatch(putBoostersFailure());\n });\n };\n};\n","import * as ls from 'store2';\nimport uuidv4 from 'uuid/v4';\n\n\nimport { UUID_STORAGE_NAME } from 'shared/constants';\n\nexport const getUUID = (): string => {\n\treturn ls.get(UUID_STORAGE_NAME);\n};\n \nexport const createUUID = (): string => {\n\tconst uuid = getUUID();\n\tif (uuid) return uuid;\n\n\tconst newUuid = uuidv4();\n\tls.set(UUID_STORAGE_NAME, newUuid);\n\treturn newUuid;\n};","import PropTypes from 'prop-types';\n\n\nexport const propTypes = {\n transparent: PropTypes.bool,\n};\n\nexport const defaultProps = {\n transparent: true,\n};","/* eslint react/jsx-pascal-case: [0, { ignore: 1 }] */\n\nimport React from 'react';\nimport classNames from 'classnames';\n\nimport { propTypes, defaultProps } from './props';\n\n// styles\nimport styles from './UpdateBtn.module.css';\n\n\nclass UpdateBtn extends React.PureComponent {\n\n /******************************************\n * COMPONENT HOOKS\n ******************************************/\n\n render() {\n const btnClasses = classNames({\n [styles.UpdateBtn]: true,\n [styles.Transparent]: this.props.transparent,\n [this.props.className]: !!this.props.className,\n });\n\n return (\n \n );\n }\n}\n\nUpdateBtn.propTypes = propTypes;\nUpdateBtn.defaultProps = defaultProps;\n\nexport default UpdateBtn;\n","import UpdateBtn from './UpdateBtn';\n\nexport default UpdateBtn;\n","import PropTypes from 'prop-types';\n\n\nexport const propTypes = {\n livesNumber: PropTypes.number,\n maxLives: PropTypes.number,\n timerStartDate: PropTypes.number,\n};\n\nexport const defaultProps = {\n livesNumber: 0,\n maxLives: 5,\n timerStartDate: 0,\n};","import React, { Component } from 'react';\nimport Countdown, { getTimeDifference } from 'react-countdown-now';\nimport defer from 'lodash/defer';\nimport { withNamespaces } from 'react-i18next';\nimport classNames from 'classnames';\n\nimport { propTypes, defaultProps } from './props';\nimport styles from './NewLifeTime.module.css';\n\n// helpers\nimport { minToMs } from 'shared/helpers/lives';\n\nclass NewLifeTime extends Component {\n\tconstructor(props) {\n\t super(props);\n\t this.state = {\n\t \tcountdownCompleted: false,\n\t\t};\n\t\tthis.checkCountdown();\n\t}\n\n\tget timerStartDate()/*: number|null*/ {\n\t\tif (this.props.newLifeTimer) {\n\t\t\treturn this.props.newLifeTimer + minToMs(this.props.lifeRestoreMinutes);\n\t\t}\n\t\treturn null;\n\t}\n\n\t/******************************************\n\t* COMPONENT HOOKS\n\t******************************************/\n\n\trender() {\n\t\tconst { t } = this.props;\n\t\tconst timerStartDate = this.timerStartDate;\n\t\treturn (\n\t\t\t\n\t\t\t\t{this.props.livesNumber >= this.props.maxLives ?\n\t\t\t\t\t{t('lives.maxLivesTitle')}\n\t\t\t\t: (\n\t\t\t\t\tthis.state.countdownCompleted || !timerStartDate ?\n\t\t\t\t\t\t'00:00' :\n\t\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\n\t\t);\n\t}\n\n\tshouldComponentUpdate(nextProps, nextState) {\n\t\tif (nextProps.newLifeTimer !== this.props.newLifeTimer) return true;\n\t\tif (nextProps.livesNumber === this.props.maxLives && nextProps.livesNumber !== this.props.livesNumber) {\n\t\t\treturn true;\n\t\t}\n\t\tif (nextState.countdownCompleted !== this.state.countdownCompleted) return true;\n\t\tif (nextProps.t !== this.props.t) return true;\n\t\treturn false;\n\t}\n\n\tUNSAFE_componentWillReceiveProps(nextProps) {\n\t\tif (nextProps.newLifeTimer !== this.props.newLifeTimer) {\n\t\t\tthis.setState({\n countdownCompleted: false,\n });\n\t\t}\n\t}\n\n\tcomponentDidUpdate(prevProps) {\n\t\tif (prevProps.newLifeTimer !== this.props.newLifeTimer) {\n\t\t\tthis.checkCountdown();\n\t\t}\n\t}\n\n\t/******************************************\n\t* COMPONENT HANDLERS\n\t******************************************/\n\n\thandlerRenderer = ({ hours, minutes, seconds, completed }) => {\n\t if (completed) {\n\t return '00:00';\n\t } else {\n\t // Render a countdown\n\t return {minutes}:{seconds};\n\t }\n\t};\n\n\thandlerCountdownComplete = () => {\n\t\tthis.setState({countdownCompleted: true});\n\t\tif (this.props.onCountdownComplete) {\n\t\t\tdefer(() => this.props.onCountdownComplete());\n\t\t}\n\t}\n\n\tcheckCountdown() {\n\t\tif (getTimeDifference(this.timerStartDate).completed) {\n\t\t\tif (this.props.livesNumber >= this.props.maxLives) return;\n\t\t\tthis.handlerCountdownComplete();\n\t\t}\n\t}\n}\n\nNewLifeTime.propTypes = propTypes;\nNewLifeTime.defaultProps = defaultProps;\n\nexport default withNamespaces()(NewLifeTime);\n","import NewLifeTime from './NewLifeTime';\n\nexport default NewLifeTime;","import React from 'react';\nimport classNames from 'classnames';\nimport { connect } from 'react-redux';\n\n// modules\nimport AppSoundManager from 'shared/modules/AppSoundManager';\n\n// redux\nimport { showSettingsModal } from 'redux/actions/modals';\n\nimport styles from './Settings.module.css';\n\n\nconst mapDispatchToProps = dispatch => ({\n\tshowSettingsModal: () => dispatch(showSettingsModal()),\n});\n\nclass Settings extends React.PureComponent {\n\tconstructor(props) {\n\t super(props);\n\t this.handlerSettingsBtnClick = this.handlerSettingsBtnClick.bind(this);\n\t}\n\n\t/******************************************\n\t* COMPONENT HOOKS\n\t******************************************/\n\n\trender() {\n\t\tconst wrapperClasses = classNames({\n\t\t [styles.Settings]: true,\n\t\t [this.props.className]: !!this.props.className,\n\t\t});\n\n\t\treturn (\n\t\t\t
\n\t\t\t\t\n\t\t\t
\n\t\t);\n\t}\n\n\t/******************************************\n\t* COMPONENT HANDLERS\n\t******************************************/\n\n\thandlerSettingsBtnClick() {\n\t\tAppSoundManager.playButtonSound();\n\t\tthis.props.showSettingsModal();\n\t}\n}\n\nexport default connect(null, mapDispatchToProps)(Settings);","import Settings from './Settings';\n\nexport default Settings;","import { createSelector } from 'reselect';\nimport get from 'lodash/get';\nimport values from 'lodash/values';\n\nimport { World, Pack, Level } from '../../shared/api/worldsAPI';\nimport { WorldsEntities, WorldsEntity } from '../../shared/schemas/worlds';\nimport { createPackEntityId, createLevelEntityId } from '../../shared/helpers/schemas';\n\nconst getEntitiesData = (state: any): WorldsEntities => state.worlds.entities;\nconst getWorldsData = (state: any, props: any): WorldsEntity => state.worlds.entities.worlds;\nconst getPropsPackID = (state: any, props: any): number => +props.match.params.packId;\nconst getPropsLevelID = (state: any, props: any): number => +props.match.params.levelId;\nexport const getPropsWorldID = (state: any, props: any): number => +props.match.params.worldId;\n\n// Reselect cached selectors\n\n/**\n * Converts entities.worlds object into array\n * @return {Array}\n */\nexport const getWorldsSelector = createSelector(\n [ getWorldsData ],\n (worldsEntity: WorldsEntity): Array => values(worldsEntity)\n);\n\nexport const getWorldSelector = createSelector(\n [ getWorldsData, getPropsWorldID ],\n (worlds: WorldsEntity, worldId: number): World => get(worlds, worldId)\n);\n\n/**\n * Warning: Pack levels array contains level id's only\n * E.g Pack.Levels = ['1-1-1', '1-1-2']\n */\nexport const getPackSelector = createSelector(\n [ getPropsWorldID, getPropsPackID, getEntitiesData ],\n (worldId: number, packId: number, entities: WorldsEntities): Pack => {\n \treturn getPack(worldId, packId, entities);\n }\n);\n\nexport const getLevelSelector = createSelector(\n [ getPropsWorldID, getPropsPackID, getPropsLevelID, getEntitiesData ],\n (worldId: number, packId: number, levelId: number, entities: WorldsEntities): Level => {\n return getLevel(worldId, packId, levelId, entities);\n }\n);\n\n/**\n * Finds Pack and fills Levels array with level entities\n * Pack.Levels = Array\n */\nexport const getPackWithLevelsSelector = createSelector(\n [ getPropsWorldID, getPropsPackID, getPackSelector, getEntitiesData ],\n (worldId: number, packId: number, pack: Pack, entities: WorldsEntities): Pack => {\n return {...pack, Levels: getPackLevels(worldId, packId, entities) as any};\n }\n);\n\nexport const getWorldPacksSelector = createSelector(\n [ getPropsWorldID, getEntitiesData ],\n (worldId: number, entities: WorldsEntities): Array => {\n return getWorldPacks(worldId, entities);\n }\n);\n\n/**\n * Gets game data for Tutorial page\n */\nexport const getTutorialGamesSelector = createSelector(\n [ getWorldsSelector, getEntitiesData ],\n (worldsArray: Array, entities: WorldsEntities): any => {\n const firstWorld = worldsArray[0];\n const firstPack = get(entities, `packs.${firstWorld.Packs[0]}`);\n const packLevelsIds = get(firstPack, 'Levels');\n return {\n worldId: firstWorld.Id,\n packId: firstPack.Id,\n levels: packLevelsIds.map((levelId: any) => getLevelByEntityId(levelId, entities))\n };\n }\n);\n\n// other selectors\n\n/**\n * Warning: Pack levels array contains level id's only\n * E.g Pack.Levels = ['1-1-1', '1-1-2']\n * @type {Array}\n */\nexport const getWorldPacks = (worldId: number, entities: WorldsEntities): Array => {\n const packs = get(entities, `worlds.${worldId}.Packs`);\n if (!packs) return [];\n return packs.map((packId: any) => entities.packs[packId] as Pack);\n};\n\nexport const getPackLevels = (worldId: number, packId: number, entities: WorldsEntities): Array => {\n const packLevels = get(entities, `packs.${createPackEntityId(worldId, packId)}.Levels`);\n if (!packLevels) return [];\n return packLevels.map((levelId: any) => getLevelByEntityId(levelId, entities));\n};\n\nexport const getLevel = (worldId: number, packId: number, levelId: number, entities: WorldsEntities): Level => {\n return get(entities, `levels.${createLevelEntityId(worldId, packId, levelId)}`);\n};\n\nexport const getPack = (worldId: number, packId: number, entities: WorldsEntities): Pack => {\n return get(entities, `packs.${createPackEntityId(worldId, packId)}`);\n};\n\nexport const getLevelByEntityId = (levelId: string, entities: WorldsEntities): Level => {\n return get(entities, `levels.${levelId}`);\n};\n\nexport const getMaxStarsInWorld = (worldId: number, worldsMaxStars: any): number => {\n return get(worldsMaxStars, worldId, 0);\n};\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"cWhite\":\"#FFFFFF\",\"NewLifeTime\":\"NewLifeTime_NewLifeTime__omXWw\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"Page\":\"Page_Page__2w4K-\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"ModalManager\":\"ModalManager_ModalManager__CHMez\",\"Modal\":\"ModalManager_Modal__3WOYm\",\"Show\":\"ModalManager_Show__1Rs4j\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"cWhite\":\"#FFFFFF\",\"PageTitle\":\"PageTitle_PageTitle__3GkWv\"};","import {\n GET_SETTINGS_REQUEST,\n GET_SETTINGS_SUCCESS,\n GET_SETTINGS_FAILURE,\n PUT_SETTINGS_REQUEST,\n PUT_SETTINGS_SUCCESS,\n PUT_SETTINGS_FAILURE,\n SET_SETTINGS,\n GET_SETTINGS_TUTORIAL_REQUEST,\n GET_SETTINGS_TUTORIAL_SUCCESS,\n GET_SETTINGS_TUTORIAL_ERROR\n} from 'redux/actionTypes';\nimport * as settingsAPI from 'shared/api/settingsAPI';\n\n\n/* SYNC ACTION CREATORS */\n\nexport const getSettingsRequest = () => ({\n type: GET_SETTINGS_REQUEST,\n});\n\nexport const getSettingsSuccess = (settings) => ({\n type: GET_SETTINGS_SUCCESS,\n settings,\n});\n\nexport const getSettingsFailure = () => ({\n type: GET_SETTINGS_FAILURE,\n});\n\nexport const putSettingsRequest = () => ({\n type: PUT_SETTINGS_REQUEST,\n});\n\nexport const putSettingsSuccess = () => ({\n type: PUT_SETTINGS_SUCCESS,\n});\n\nexport const putSettingsFailure = () => ({\n type: PUT_SETTINGS_FAILURE,\n});\n\nexport const setSettings = (settings) => ({\n type: SET_SETTINGS,\n settings,\n});\n\n/* ASYNC ACTION CREATORS */\n\nfunction apiSettingsTutorial() {\n const fnDefer = arguments[0];\n const args = Array.prototype.slice.call(arguments, 1);\n return function (dispatch) {\n dispatch({\n type: GET_SETTINGS_TUTORIAL_REQUEST\n });\n fnDefer.apply(null, args).then(\n ({\n tutorial\n }) => dispatch({\n type: GET_SETTINGS_TUTORIAL_SUCCESS,\n data: tutorial\n }),\n err => dispatch({\n type: GET_SETTINGS_TUTORIAL_ERROR,\n error: err\n })\n )\n }\n}\n\nexport const fetchSettingsTutorial = () => apiSettingsTutorial(settingsAPI.fetchSettingsTutorial);\nexport const updateSettingsTutorial = (levels) => apiSettingsTutorial(settingsAPI.putSettingsTutorial, levels);\nexport const addSettingsTutorial = (level) => (dispatch, getState) => {\n const {\n settings: {\n tutorialProgress\n }\n } = getState();\n const newProgress = tutorialProgress ? tutorialProgress.concat(level) : [level];\n updateSettingsTutorial(newProgress)(dispatch, getState);\n}\n\n\nexport function getSettings() {\n return function (dispatch) {\n dispatch(getSettingsRequest());\n return settingsAPI.fetchSettings()\n .then(settings => {\n dispatch(getSettingsSuccess(settings));\n }, () => {\n dispatch(getSettingsFailure());\n });\n };\n};\n\nexport function putSettings(settings) {\n return function (dispatch) {\n dispatch(putSettingsRequest());\n return settingsAPI.putSettings(settings)\n .then(() => {\n dispatch(putSettingsSuccess(settings));\n }, () => {\n dispatch(putSettingsFailure());\n });\n };\n};\n","import loadable from '@loadable/component';\nimport config from '../../shared/config';\nimport { sendAnalyticsEvent, withCount } from 'shared/modules/AnalyticsEvents';\n\ntype YmFunction = (methodName: string, ...args: any[]) => void;\n\nexport const isAnalyticsEnabled = true;\n\nexport const getAnalyticsID = (analyticsName: 'GA' | 'YM'): string|number => {\n return config.analytics[analyticsName];\n}\n\nexport const loadYandexMetrica = (): Promise<{ default: YmFunction } & any> => {\n if (isAnalyticsEnabled) {\n return loadable.lib<{ default: YmFunction } & any>(() => import('react-yandex-metrika')).load()\n }\n return Promise.reject();\n};\n\nexport const loadReactGA = (): Promise => {\n if (isAnalyticsEnabled) return loadable.lib(() => import('react-ga')).load();\n return Promise.reject();\n};\n\nexport const sendRouteMetric = (currentRoute: string, previousRoute?: string): void => {\n sendAnalyticsEvent('route', withCount({\n [currentRoute]: withCount({\n fromRoute: previousRoute\n })\n }));\n};\n","/*\n @value cWhite from '../../styles/vars.css';\n\n.EmptyAdv {\n width: 100vw;\n height: 100vh;\n position: fixed;\n top: 0;\n left: 0;\n background-color: rgba(0, 0, 0, 0.75);\n z-index: 200;\n}\n\n.EmptyAdvVideo {\n position: fixed;\n top: 50%;\n left: 50%;\n width: 640px;\n height: 360px;\n transform: translate(-50%,-50%);\n background-color: black;\n}\n*/\n\n\nconst divWrap = document.createElement('div');\nconst divVideoBlock = document.createElement('div');\ndivWrap.style.cssText = `\n width: 100vw; \\\n height: 100vh; \\\n position: fixed; \\\n top: 0; \\\n left: 0; \\\n background-color: rgba(0, 0, 0, 0.75); \\\n z-index: 200; \\\n`;\ndivVideoBlock.style.cssText = `\n position: fixed; \\\n top: 50%; \\\n left: 50%; \\\n width: 640px; \\\n height: 360px; \\\n transform: translate(-50%,-50%); \\\n background-color: black; \\\n`;\ndivWrap.appendChild(divVideoBlock);\n\nexport default divWrap;\n","import advStub from './advStub';\nimport delay from 'lodash/delay';\nimport { SUCCESS, ERROR } from 'shared/constants';\nimport { Observable } from 'rxjs';\n\nimport loadSDK from 'shared/sdk';\nimport store from 'redux/store';\nimport { showAdNotFoundModal } from 'redux/actions/modals';\nimport { MODAL_APPEAR_TIME } from 'shared/constants';\nimport { PurchaseItemType } from 'shared/helpers/modals';\n\nexport default class Advertizer {\n static isInited = false;\n static isAdvShowing = false; // indicates showing adverticement at the moment\n static advKey = false; // key which advertizer generates to return to caller\n static isSDKOK = false;\n static sdk: any;\n /******************************************\n * CLASS METHODS\n ******************************************/\n /*\n * Inits SDK\n */\n static init() {\n if (!process.env.REACT_APP_SHOW_ADV) return;\n\n switch (process.env.REACT_APP_SOCIAL_MEDIA) {\n case 'ok':\n this.isSDKOK = true;\n break;\n default:\n break;\n }\n\n if (this.isSDKOK) {\n loadSDK().then(({default: sdk}: any) => {\n this.sdk = sdk;\n sdk.init().then(({ status }: any) => {\n this.isInited = status === SUCCESS;\n sdk.prepareAdverticementCycle();\n });\n }, _ => {}) ;\n }\n }\n\n static show(purchaseItem: PurchaseItemType) {\n return new Observable(observer => {\n if (!process.env.REACT_APP_SHOW_ADV || this.isAdvShowing) {\n observer.next({ status: ERROR });\n observer.complete();\n return;\n }\n\n this.isAdvShowing = true;\n\n if (this.isInited && this.sdk && process.env.REACT_APP_SOCIAL_MEDIA) {\n this.sdk.showAdv().subscribe((response: any) => {\n this.isAdvShowing = false;\n observer.next(response);\n observer.complete();\n });\n } else {\n // If advertisement wasn't found - show fake advertisement\n // this.showFakeAdv().subscribe(response => {\n // this.isAdvShowing = false;\n // observer.next(response);\n // observer.complete();\n // });\n \n // Show ADNotFoundModal\n store.dispatch(showAdNotFoundModal(purchaseItem));\n delay(() => {\n this.isAdvShowing = false;\n observer.next({ status: SUCCESS });\n observer.complete();\n }, MODAL_APPEAR_TIME);\n }\n });\n }\n\n static showFakeAdv() {\n return new Observable(observer => {\n const bodyEl = document.body;\n bodyEl.appendChild(advStub);\n delay(() => {\n bodyEl.removeChild(advStub);\n observer.next({ status: SUCCESS });\n observer.complete();\n }, 1500);\n });\n }\n}\n","/* eslint react/jsx-pascal-case: [0, { ignore: 1 }] */\n\nimport React from 'react';\nimport classNames from 'classnames';\n\n// styles\nimport styles from './OKShareBtn.module.css';\n\n\nclass OKShareBtn extends React.PureComponent {\n\n /******************************************\n * COMPONENT HOOKS\n ******************************************/\n\n render() {\n const btnClasses = classNames({\n [styles.OKShareBtn]: true,\n [this.props.className]: !!this.props.className,\n });\n\n return (\n \n );\n }\n}\n\nexport default OKShareBtn;\n","const mode: \"prod\" | \"stage\" = (process as any).env.REACT_APP_MODE;\nconst appID = {\n prod: 1278241024,\n stage: 1271901952\n};\n\nconst analyticsConfig = {\n default: {\n prod: {\n YM: 50196268,\n GA: \"UA-125048542-1\",\n },\n stage: {\n YM: 56762791,\n GA: 'UA-154895611-1'\n }\n },\n ok: {\n stage: {\n YM: 53358607,\n GA: \"UA-138686692-1\"\n },\n prod: {\n YM: 53415310,\n GA: \"UA-138979085-1\"\n }\n }\n}\nconst analytics = (process.env.REACT_APP_MODE === 'ok' ? analyticsConfig.ok : analyticsConfig.default)[mode];\n\nexport default {\n reviewLink: !process.env.REACT_APP_MODE ? \"\" : \"https://docs.google.com/forms/d/e/1FAIpQLScasE8ms2OCZMfITXGeziVTT78-OmVwQcBpUfZMzHXUyANvPg/viewform\",\n secretApiToken: \"cbfb633cade1cc5f605d6ac3e4f19021f53960132af18\",\n ok: {\n appID: appID[mode],\n appServerURL: \"https://ok.thedollargame.io\",\n logged_user_id_test: \"thedollargame-test-442\",\n reviewLink: \"https://ok.ru/group/55822418706461/messages\",\n },\n analytics\n};\n","import {\n SET_GAME, RESET_GAME,\n CLEAR_STEPS_SPENT, SET_STEPS_SPENT, SET_LEVEL_HASH,\n SET_MAX_STARS, SET_MAX_MOVES_COUNT, SET_BEST_MOVES_COUNT,\n SET_INFINITE_STEPS,\n COMPLETE_LEVEL_REQUEST, COMPLETE_LEVEL_SUCCESS, COMPLETE_LEVEL_FAILURE,\n SET_GAME_PASSED, SET_GAME_LOST, SET_MOVES_RUN_OUT, SET_CHEAT_STARS,\n SET_BEST_VERTEX_COORDS, SET_GRAPH_COORDS,\n SET_STEPS_LEFT, SET_NOT_BEST_VERTEX_DATA,\n BEST_VERTEX_CLICK_REQUIRE, NOT_BEST_VERTEX_CLICK_REQUIRE, SHOW_HINT_REQUIRE,\n UPDATE_BEST_VERTEX_COORD_REQUIRE, UPDATE_GRAPH_COORD_REQUIRE,\n UPDATE_STEPS_LEFT_REQUIRE, UPDATE_NOT_BEST_VERTEX_DATA_REQUIRE,\n} from '../../redux/actionTypes';\n\n\n/* SYNC ACTION CREATORS */\n\nexport const setGame = (\n worldId: any, packId: any, levelId: any, levelHash: any, maxMovesCount: any, bestMovesCount: any, maxStars: any,\n ) => ({\n type: SET_GAME,\n worldId,\n packId,\n levelId,\n levelHash,\n maxMovesCount,\n bestMovesCount,\n maxStars,\n});\n\nexport const resetGame = () => ({\n type: RESET_GAME,\n});\n\nexport const clearStepsSpent = () => ({\n type: CLEAR_STEPS_SPENT,\n});\n\nexport const setStepsSpent = (stepsSpent: any) => ({\n type: SET_STEPS_SPENT,\n stepsSpent,\n});\n\nexport const setLevelHash = (levelHash: any) => ({\n type: SET_LEVEL_HASH,\n levelHash,\n});\n\nexport const setMaxStars = (maxStars: any) => ({\n type: SET_MAX_STARS,\n maxStars,\n});\n\nexport const setMaxMovesCount = (maxMovesCount: any) => ({\n type: SET_MAX_MOVES_COUNT,\n maxMovesCount,\n});\n\nexport const setBestMovesCount = (bestMovesCount: any) => ({\n type: SET_BEST_MOVES_COUNT,\n bestMovesCount,\n});\n\nexport const setInfiniteSteps = (infiniteSteps: boolean) => ({\n type: SET_INFINITE_STEPS,\n infiniteSteps,\n});\n\nexport const completeLevelRequest = () => ({\n type: COMPLETE_LEVEL_REQUEST,\n});\n\nexport const completeLevelSuccess = () => ({\n type: COMPLETE_LEVEL_SUCCESS,\n});\n\nexport const completeLevelFailure = () => ({\n type: COMPLETE_LEVEL_FAILURE,\n});\n\nexport const setGamePassed = (passed: any) => ({\n type: SET_GAME_PASSED,\n passed,\n});\n\nexport const setGameLost = (lost: any) => ({\n type: SET_GAME_LOST,\n lost,\n});\n\nexport const setMovesRunOut = (movesRunOut: any) => ({\n type: SET_MOVES_RUN_OUT,\n movesRunOut,\n});\n\nexport const setCheatStars = (cheatStars: any) => ({\n type: SET_CHEAT_STARS,\n cheatStars,\n});\n\nexport const setBestVertexCoords = (x: any, y: any, r: any) => ({\n type: SET_BEST_VERTEX_COORDS,\n x,\n y,\n r,\n});\n\nexport const setGraphCoords = (x: any, y: any, r: any) => ({\n type: SET_GRAPH_COORDS,\n x,\n y,\n r,\n});\n\nexport const setStepsLeft = (stepsLeft: any) => ({\n type: SET_STEPS_LEFT,\n stepsLeft,\n});\n\nexport const setNotBestVertexData = (index: any, x: any, y: any, r: any) => ({\n type: SET_NOT_BEST_VERTEX_DATA,\n index,\n x,\n y,\n r,\n});\n\nexport const bestVertexClickRequire = (require: boolean) => ({\n type: BEST_VERTEX_CLICK_REQUIRE,\n require,\n});\n\nexport const notBestVertexClickRequire = (require: boolean) => ({\n type: NOT_BEST_VERTEX_CLICK_REQUIRE,\n require,\n});\n\nexport const showHintRequire = (require: boolean) => ({\n type: SHOW_HINT_REQUIRE,\n require,\n});\n\nexport const updateBestVertexCoordRequire = (require: boolean) => ({\n type: UPDATE_BEST_VERTEX_COORD_REQUIRE,\n require,\n});\n\nexport const updateGraphCoordRequire = (require: boolean) => ({\n type: UPDATE_GRAPH_COORD_REQUIRE,\n require,\n});\n\nexport const updateStepsLeftRequire = (require: boolean) => ({\n type: UPDATE_STEPS_LEFT_REQUIRE,\n require,\n});\n\nexport const updateNotBestVertexDataRequire = (require: boolean) => ({\n type: UPDATE_NOT_BEST_VERTEX_DATA_REQUIRE,\n require,\n});\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"cWhite\":\"#FFFFFF\",\"headerHorizontalOffset\":\"20px\",\"hHeader\":\"58px\",\"wLangBtn\":\"50px\",\"LevelsPage\":\"LevelsPage_LevelsPage__2gl8a\",\"LevelsPageTitle\":\"LevelsPage_LevelsPageTitle__3LinY\",\"LevelsContent\":\"LevelsPage_LevelsContent__1_fR2\",\"levelsShow\":\"LevelsPage_levelsShow__2wdXZ\",\"LevelsListScrollWrap\":\"LevelsPage_LevelsListScrollWrap__2-b7K\",\"OK\":\"LevelsPage_OK__2rx_G\",\"LevelList\":\"LevelsPage_LevelList__12ZkA\",\"LevelItem\":\"LevelsPage_LevelItem__8phR8\",\"Locked\":\"LevelsPage_Locked__ISMFM\",\"LevelItemWrap\":\"LevelsPage_LevelItemWrap__1RhR_\",\"LevelItemNumber\":\"LevelsPage_LevelItemNumber__24ZgK\",\"LevelItemStars\":\"LevelsPage_LevelItemStars__2cPBC\",\"BackBtn\":\"LevelsPage_BackBtn__3ndPH\",\"Completed\":\"LevelsPage_Completed__1T69D\",\"ToBeContinued\":\"LevelsPage_ToBeContinued__xkQgW\",\"LevelLocked\":\"LevelsPage_LevelLocked__2xbR9\",\"StarsCounter\":\"LevelsPage_StarsCounter__3Ub9C\"};","/*\n ACTIONS FOR MODALS MANAGEMENT\n*/\n\nimport { SHOW_MODAL, HIDE_MODAL } from 'redux/actionTypes';\n\n// constants\nimport {\n MODAL_LIFE_PURCHASE, MODAL_LIFE_REDUCE, MODAL_SETTINGS, MODAL_AD_BLOCK,\n MODAL_SECOND_SESSION, MODAL_WATCH_AD, MODAL_AD_NOT_FOUND, MODAL_CHANGE_PRICE\n} from 'shared/constants';\nimport { getPrices } from 'shared/api/purchasesAPI';\nimport { Dispatch } from 'redux';\n\nimport { WarningTextType } from 'shared/helpers/adBlockDetector';\nimport { PurchaseItemType } from 'shared/helpers/modals';\n\nconst actionTypes = [\n MODAL_LIFE_PURCHASE, MODAL_LIFE_REDUCE, MODAL_SETTINGS, MODAL_AD_BLOCK,\n MODAL_SECOND_SESSION, MODAL_WATCH_AD, MODAL_AD_NOT_FOUND, MODAL_CHANGE_PRICE\n] as const;\n\nexport type ModalType = typeof actionTypes[number];\n\nexport type ModalAction = {\n type: typeof SHOW_MODAL | typeof HIDE_MODAL;\n modalType: ModalType;\n modalProps?: any;\n metrica?: any;\n}\n\n/* SYNC ACTION CREATORS */\n\nexport const showModal = (modalType: ModalType, modalProps?: any, metrica?: any) => ({\n type: SHOW_MODAL,\n modalType,\n modalProps,\n metrica\n});\n\nexport const hideModal = (modalType: ModalType) => ({\n type: HIDE_MODAL,\n modalType,\n});\n\nexport const showLifeReduceModal = (lifeNumber: number) => {\n return showModal(MODAL_LIFE_REDUCE, { lifeNumber });\n};\n\nexport const showLifePurchaseModal = (metrica: any) => {\n return (dispatch: Dispatch) => {\n getPrices().then(priceBlob => {\n dispatch(showModal(MODAL_LIFE_PURCHASE, priceBlob, metrica));\n });\n }\n\n};\n\nexport const showSettingsModal = () => {\n return showModal(MODAL_SETTINGS);\n};\n\nexport const showAdBlockModal = (warningTextType: WarningTextType) => {\n return showModal(MODAL_AD_BLOCK, { warningTextType });\n};\n\nexport const showSecondSessionModal = () => {\n return showModal(MODAL_SECOND_SESSION);\n};\n\nexport const showWatchAdModal = () => {\n return showModal(MODAL_WATCH_AD);\n};\n\nexport const showAdNotFoundModal = (purchaseItem: PurchaseItemType) => {\n return showModal(MODAL_AD_NOT_FOUND, { purchaseItem });\n};\n\nexport const hideLifeReduceModal = () => {\n return hideModal(MODAL_LIFE_REDUCE);\n};\n\nexport const hideLifePurchaseModal = () => {\n return hideModal(MODAL_LIFE_PURCHASE);\n};\n\nexport const hideSettingsModal = () => {\n return hideModal(MODAL_SETTINGS);\n};\n\nexport const hideAdBlockModal = () => {\n return hideModal(MODAL_AD_BLOCK);\n};\n\nexport const hideSecondSessionModal = () => {\n return hideModal(MODAL_SECOND_SESSION);\n};\n\nexport const hideWatchAdModal = () => {\n return hideModal(MODAL_WATCH_AD);\n};\n\nexport const hideAdNotFoundModal = () => {\n return hideModal(MODAL_AD_NOT_FOUND);\n};\n\nexport const showChangePriceModal = () => showModal(MODAL_CHANGE_PRICE);\nexport const hideChangePriceModal = () => hideModal(MODAL_CHANGE_PRICE);\n","import { defaultLng, okDefaultLng /*, appLngForDetectedLng */ } from 'shared/locales/languages';\nimport cookies from 'browser-cookies';\n\n\nexport default {\n name: 'thedollarGameLngDetector',\n\n lookup(options) {\n // check cookies first\n const cookiesLang = cookies.get(options.lookupCookie);\n if (cookiesLang) return cookiesLang;\n\n // set russian languages as default for ok.ru platform\n if (process.env.REACT_APP_SOCIAL_MEDIA === 'ok') {\n return okDefaultLng;\n }\n\n // check navigator then\n /* Switch off language detector - EN always default\n if (navigator.language) {\n const appLng = appLngForDetectedLng(navigator.language.toLowerCase());\n return appLng;\n } */\n\n // default\n return defaultLng;\n },\n\n cacheUserLanguage(lng, options) {\n cookies.set(options.lookupCookie, lng);\n }\n};\n","import forEach from 'lodash/forEach';\nimport keys from 'lodash/keys';\n\n\n// default lng for system\nexport const defaultLng = 'en';\nexport const okDefaultLng = 'ru';\n\n/*\n Languages, for which we show Russian:\n Ukrainian, Kazakh, Kazakh (Kazakhstan), Belarusian, Belarusian (Belarus),\n Uzbek, Uzbek (Uzbekistan), Romanian, Romanian (Moldavia), Russian (Moldavia), Moldavian, Turkmen, Tatar, Tajik, Kyrgyz,\n Georgian, Armenian, Azerbaijani\n\n For others we show English\n*/\nexport const languagesTrans = {\n 'ru': [\n 'ru', 'ru-ru', 'uk', 'uk-ua', 'kk', 'kk-kz', 'be', 'be-by', 'uz', 'uz-uz', 'ro',\n 'mo', 'ro-mo', 'ru-mo', 'tk', 'tt', 'tg', 'ky', 'ka', 'hy', 'az',\n ],\n};\n\n/*\n This function returns language for application based on detected language\n*/\nexport const appLngForDetectedLng = (detectedLng) => {\n let appLng = null;\n forEach(keys(languagesTrans), lng => {\n if (languagesTrans[lng].indexOf(detectedLng) >= 0) {\n appLng = lng;\n return;\n }\n });\n return appLng ? appLng : defaultLng;\n};","import i18n from 'i18next';\nimport LngDetector from 'i18next-browser-languagedetector';\nimport { reactI18nextModule } from 'react-i18next';\n\nimport translationEN from 'shared/locales/en/translation.json';\nimport translationRU from 'shared/locales/ru/translation.json';\nimport langCookieName from 'shared/locales/langCookieName';\nimport thedollarGameLngDetector from 'shared/locales/lngDetector';\n\n\n// the translations\nconst resources = {\n en: {\n translation: translationEN\n },\n ru: {\n translation: translationRU\n }\n};\n\nconst detectionOptions = {\n // order and from where user language should be detected\n order: ['thedollarGameLngDetector'],\n\n // keys or params to lookup language from\n lookupCookie: langCookieName,\n\n // cache user language on\n caches: ['thedollarGameLngDetector'],\n\n // optional expire and domain for set cookie\n cookieMinutes: 10,\n};\n\nconst lngDetector = new LngDetector();\nlngDetector.addDetector(thedollarGameLngDetector);\n\ni18n\n .use(reactI18nextModule) // passes i18n down to react-i18next\n .use(lngDetector)\n .init({\n detection: detectionOptions,\n debug: true,\n resources,\n interpolation: {\n escapeValue: false // react already safes from xss\n }\n });\n\nexport default i18n;","// after you add new variable, you need to restart your local dev, in order to allow postcss get that vars\nmodule.exports = {\n\tDESKTOP_WIDTH: 1024,\n\tMOBILE_WIDTH: 767,\n\tSMALL_MOBILE_WIDTH: 677,\n\tTINY_MOBILE_WIDTH: 370,\n\tLEVEL_ITEM_HEIGHT: 85,\n\tLEVEL_ITEM_BOTTOM_OFFSET: 33,\n\tMOBILE_LEVEL_ITEM_HEIGHT: 43,\n\tMOBILE_LEVEL_ITEM_BOTTOM_OFFSET: 17,\n\tCUSTOM_LIST_ITEM_HEIGHT: 49,\n\tCUSTOM_LIST_ITEM_BOTTOM_OFFSET: 16,\n};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"cWhite\":\"#FFFFFF\",\"CustomListItem\":\"CustomListItem_CustomListItem__3b8jp\",\"Blocked\":\"CustomListItem_Blocked__15spM\",\"CustomListItemTitle\":\"CustomListItem_CustomListItemTitle__53r3c\",\"CustomListItemRight\":\"CustomListItem_CustomListItemRight__BxxVz\",\"Virtual\":\"CustomListItem_Virtual__27s8R\",\"CustomListItemStarsInfo\":\"CustomListItem_CustomListItemStarsInfo__Kzg-V\",\"CustomListItemStarsRequired\":\"CustomListItem_CustomListItemStarsRequired__3TYIO\",\"StarIcon\":\"CustomListItem_StarIcon__2vm6l\",\"StarIconGrey\":\"CustomListItem_StarIconGrey__3loKY\",\"SizeSmall\":\"CustomListItem_SizeSmall__N2gkP\",\"LockIcon\":\"CustomListItem_LockIcon__2W1XK\",\"Hint\":\"CustomListItem_Hint__1fS6N\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"cWhite\":\"#FFFFFF\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"time\":\"1s\"};","// polyfill for Array.prototype.includes\nif (!Array.prototype.includes) {\n // eslint-disable-next-line\n Object.defineProperty(Array.prototype, 'includes', {\n value: function (searchElement, fromIndex) {\n if (this == null) {\n throw new TypeError('\"this\" is null or not defined');\n }\n var o = Object(this);\n var len = o.length >>> 0;\n if (len === 0) {\n return false;\n }\n var n = fromIndex | 0;\n var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);\n function sameValueZero(x, y) {\n return x === y || (typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y));\n }\n while (k < len) {\n if (sameValueZero(o[k], searchElement)) {\n return true;\n }\n k++;\n }\n return false;\n }\n });\n};\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"time\":\"0.4s\",\"easing\":\"ease-in-out\"};","// In production, we register a service worker to serve assets from local cache.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on the \"N+1\" visit to a page, since previously\n// cached resources are updated in the background.\n\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\n// This link also includes instructions on opting out of this behavior.\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport default function register() {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Lets check if a service worker still exists or not.\n checkValidServiceWorker(swUrl);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://goo.gl/SC7cgQ'\n );\n });\n } else {\n // Is not local host. Just register service worker\n registerValidSW(swUrl);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the old content will have been purged and\n // the fresh content will have been added to the cache.\n // It's the perfect time to display a \"New content is\n // available; please refresh.\" message in your web app.\n console.log('New content is available; please refresh.');\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n if (\n response.status === 404 ||\n response.headers.get('content-type').indexOf('javascript') === -1\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import PropTypes from 'prop-types';\n\n\nexport const propTypes = {\n LivesNumber: PropTypes.number,\n};\n\nexport const defaultProps = {\n LivesNumber: 0,\n};","import React from 'react';\nimport classNames from 'classnames';\n\nimport LifeIcon from 'shared/components/LifeIcon';\n\nimport { propTypes, defaultProps } from './props';\nimport styles from './LivesNumber.module.css';\n\n\nclass LivesNumber extends React.PureComponent {\n\tconstructor(props) {\n\t super(props);\n\t this.state = {};\n\t}\n\n\trender() {\n\t\tconst wrapperClasses = classNames({\n\t\t [styles.LivesNumber]: true,\n\t\t [this.props.className]: !!this.props.className,\n\t\t});\n\t\treturn (\n\t\t\t
\n\t\t\t\t\n\t\t\t\t{this.props.livesNumber}\n\t\t\t
\n\t\t);\n\t}\n}\n\nLivesNumber.propTypes = propTypes;\nLivesNumber.defaultProps = defaultProps;\n\nexport default LivesNumber;","import axios from 'axios';\n\nexport interface Ads {\n AdPassedLevelPropability: number;\n AdFailedLevelProbability: number;\n AdFrequencySeconds: number;\n RateUsFrequency: number;\n}\n\nexport let adsData: Ads;\n\n/**\n * Fetch ads data or return cached object\n */\nexport const getAdsData = (): Promise => {\n if (adsData) {\n return Promise.resolve(adsData);\n } else {\n const data = axios\n .get(`${String(process.env.REACT_APP_API)}/ads`)\n .then(response => {\n adsData = response.data;\n return adsData;\n });\n data.catch(error => {\n console.log(error);\n });\n return data;\n }\n};\n","import LivesNumber from './LivesNumber';\n\nexport default LivesNumber;","import AddBtn from './AddBtn';\n\nexport default AddBtn;\n","/* eslint react/jsx-pascal-case: [0, { ignore: 1 }] */\n\nimport React from 'react';\nimport classNames from 'classnames';\n\n// styles\nimport styles from './AddBtn.module.css';\n\n\nclass AddBtn extends React.PureComponent {\n\n /******************************************\n * COMPONENT HOOKS\n ******************************************/\n\n render() {\n const btnClasses = classNames({\n [styles.AddBtn]: true,\n [this.props.className]: !!this.props.className,\n [styles.AddBtnDisabled]: this.props.disabled\n });\n\n return (\n \n );\n }\n}\n\nexport default AddBtn;","import PayBtn from './PayBtn';\n\nexport default PayBtn;\n","/* eslint react/jsx-pascal-case: [0, { ignore: 1 }] */\n\nimport React from 'react';\nimport classNames from 'classnames';\n\n// styles\nimport styles from './PayBtn.module.css';\n\n\nclass PayBtn extends React.PureComponent {\n\n /******************************************\n * COMPONENT HOOKS\n ******************************************/\n\n render() {\n const btnClasses = classNames({\n [styles.PayBtn]: true,\n [this.props.className]: !!this.props.className,\n });\n\n return (\n \n );\n }\n}\n\nexport default PayBtn;\n","import React from 'react';\nimport classNames from 'classnames';\nimport { connect } from 'react-redux'\n\n// modules\nimport { sendAnalyticsEvent, AdWatchRewards, AdWatchResults, withCount } from 'shared/modules/AnalyticsEvents';\n\n// styles\nimport styles from './UserLives.module.css';\n\n// components\nimport LivesNumber from 'shared/components/LivesNumber';\nimport NewLifeTime from 'shared/components/NewLifeTime';\nimport AddBtn from 'shared/components/AddBtn';\nimport PayBtn from 'shared/components/PayBtn';\n\n// helpers\nimport { warningTextTypes } from 'shared/helpers/adBlockDetector';\n\n// redux\nimport { showAdBlockModal, showLifePurchaseModal, showWatchAdModal } from 'redux/actions/modals';\n\nconst mapStateToProps = state => ({\n\tlivesNumber: state.lives.livesNumber,\n\tmaxLivesNumber: state.lives.maxLivesNumber,\n\tinfiniteLife: state.lives.infiniteLife,\n\tlifeRestoreMinutes: state.lives.lifeRestoreMinutes,\n\tnewLifeTimer: state.lives.newLifeTimer,\n\tadBlockDetected: state.adBlock.adBlockDetected,\n});\n\nconst mapDispatchToProps = dispatch => ({\n\tshowAdBlockModal: warningTextType => dispatch(showAdBlockModal(warningTextType)),\n\tshowLifePurchaseModal: () => dispatch(showLifePurchaseModal({ entryPoint: 'UserLives' })),\n\tshowWatchAdModal: () => dispatch(showWatchAdModal()),\n});\n\nclass UserLives extends React.PureComponent {\n\n\t/******************************************\n\t* COMPONENT HOOKS\n\t******************************************/\n\n\trender() {\n\t\tconst {\n\t\t\tlivesNumber, newLifeTimer, maxLivesNumber,\n\t\t\tlifeRestoreMinutes,\n\t\t} = this.props;\n\n\t\tconst wrapperClasses = classNames({\n\t\t [styles.UserLives]: true,\n\t\t [this.props.className]: !!this.props.className,\n\t\t});\n\n\t\treturn (\n\t\t\t
\n\t\t\t\t{!this.props.infiniteLife && }\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t
\n\t\t);\n\t}\n\n\t/******************************************\n\t* COMPONENT HANDLERS\n\t******************************************/\n\n\thandlerShowADModalClick = () => {\n\t\tif (this.props.livesNumber === this.props.maxLivesNumber) return;\n\t\tif (this.props.adBlockDetected) {\n\t\t\tthis.props.showAdBlockModal(warningTextTypes.lives);\n\t\t\tsendAnalyticsEvent('adWatch', withCount({\n\t\t\t\t[AdWatchRewards.live]: withCount({\n\t\t\t\t\tresult: AdWatchResults.blocked\n\t\t\t\t})\n\t\t\t}));\n\t\t} else {\n\t\t\tthis.props.showWatchAdModal();\n\t\t}\n\t}\n\n\thandlerPayBtnClick = () => {\n\t\tthis.props.showLifePurchaseModal();\n\t}\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(UserLives);\n","import UserLives from './UserLives';\n\nexport default UserLives;","/* eslint react/jsx-pascal-case: [0, { ignore: 1 }] */\n\nimport { connect } from 'react-redux'\nimport React, { Component } from 'react';\nimport defer from 'lodash/defer';\nimport classNames from 'classnames';\n\n// components\nimport BackBtn from 'shared/components/BackBtn';\nimport UpdateBtn from 'shared/components/UpdateBtn';\nimport Settings from 'shared/components/Settings';\nimport UserLives from 'shared/containers/UserLives';\n\n// redux\nimport { backBtnClick, updateBtnClick } from 'redux/actions/header';\n\n// styles\nimport styles from './Header.module.css';\n\n\nconst mapStateToProps = state => ({\n infiniteLife: state.lives.infiniteLife,\n title: state.header.title,\n showBackBtn: state.header.showBackBtn,\n showUserLives: state.header.showUserLives,\n showUpdateBtn: state.header.showUpdateBtn,\n showTitle: state.header.showTitle,\n showSettings: state.header.showSettings,\n});\n\nconst mapDispatchToProps = dispatch => ({\n backBtnClick: (click) => dispatch(backBtnClick(click)),\n updateBtnClick: (click) => dispatch(updateBtnClick(click)),\n});\n\n\nclass Header extends Component {\n\n render() {\n const {\n infiniteLife, title,\n showBackBtn, showUserLives, showUpdateBtn, showTitle, showSettings,\n className,\n } = this.props;\n\n const headerClasses = classNames({\n [styles.Header]: true,\n [className]: !!className,\n });\n\n return (\n
\n {/* Back button */}\n {!!showBackBtn &&\n }\n\n {/* User lives */}\n {!!showUserLives && !infiniteLife && }\n\n {/* Update button */}\n {!!showUpdateBtn &&\n \n }\n\n {/* Title */}\n {!!showTitle &&\n \n \n }\n\n {/* Settings */}\n {!!showSettings &&\n \n }\n\n
\n );\n }\n\n handlerBackBtnClick = () => {\n // toggle click\n this.props.backBtnClick(true);\n defer(() => this.props.backBtnClick(false));\n }\n\n handlerUpdateBtnClick = () => {\n // toggle click\n this.props.updateBtnClick(true);\n defer(() => this.props.updateBtnClick(false));\n }\n\n}\n\nexport default connect(\n mapStateToProps,\n mapDispatchToProps,\n)(Header);","import Header from './Header';\n\nexport default Header;\n","import config from 'shared/config';\n\nexport const fb = 'https://fb.me/thedollargame';\nexport const tw = 'https://twitter.com/the_dollar_game';\nexport const email = 'feedback@thedollargame.io';\nexport const rd = 'https://reddit.com/r/thedollargame';\nexport const ok = 'https://ok.ru/group/55822418706461';\nexport const okApp = `https://ok.ru/game/${config.ok.appID}`;\n","/* eslint react/jsx-pascal-case: [0, { ignore: 1 }] */\n\nimport React, { Component } from 'react';\nimport classNames from 'classnames';\nimport { withNamespaces, WithNamespaces } from 'react-i18next';\nimport { Trans } from 'react-i18next';\n\nimport { fb, tw, rd, ok } from 'shared/contacts';\nimport OKShareBtn from 'shared/components/OKShareBtn';\nimport { createOKSharing } from \"shared/helpers/sharing\";\n\nimport { sendAnalyticsEvent } from 'shared/modules/AnalyticsEvents';\n\nimport config from 'shared/config';\n\n// styles\nimport styles from './Footer.module.css';\n\ninterface InProps {\n className?: string;\n}\n\ntype FooterProps = InProps & WithNamespaces;\n\nclass Footer extends Component {\n\n private shareText = 'A puzzle game inspired by graph theory. Play with thousands of people and find the optimal solution to each level!';\n private fbShareLink = 'https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fthedollargame.io%2F&src=sdkpreparse';\n private twShareLink = `https://twitter.com/intent/tweet?text=${encodeURIComponent(this.shareText)}&url=${encodeURIComponent('https://thedollargame.io')}&hashtags=thedollargame`;\n private twitterShareBtnRef = React.createRef();\n private fbShareBtnRef = React.createRef();\n\n /******************************************\n * COMPONENT HOOKS\n ******************************************/\n\n componentDidMount() {\n if (process.env.REACT_APP_SOCIAL_MEDIA !== 'ok') {\n window.waitTwitterInit.then(() => {\n window.twttr.widgets.load(this.twitterShareBtnRef.current!);\n });\n \n window.waitFBInit.then(() => {\n window.FB.XFBML.parse(this.fbShareBtnRef.current);\n });\n }\n }\n\n render() {\n const footerClasses = classNames(styles.Footer, this.props.className);\n const { t } = this.props;\n return (\n
\n {(process.env.REACT_APP_SOCIAL_MEDIA === 'ok') ? (\n
\n
\n \n
\n
\n \n
\n
\n ) : (\n
\n
\n  \n  \n  \n
\n
\n
\n  \n
\n
\n
\n Share\n
\n
\n
\n
\n )}\n {(process.env.REACT_APP_SOCIAL_MEDIA !== 'ok') &&\n \n\n
\n

\n \n Download\n \n Android\n  version.\n version\n \n
\n {t('footer.ios')}\n

\n
\n

\n {t('footer.developed')} \n \n Hoodies\n \n

\n
\n }\n {config.reviewLink &&\n
\n
\n {t('footer.reviewLink')}\n
\n
\n }\n
\n );\n }\n\n handlerOKShareClick = () => {\n sendAnalyticsEvent('shareClick');\n createOKSharing();\n }\n\n handlerOKGroupClick = () => {\n sendAnalyticsEvent('groupClick');\n window.open(ok, '_blank');\n }\n}\n\nexport default withNamespaces()(Footer);\n","import Footer from './Footer';\n\nexport default Footer;\n","import Preloader from './Preloader';\n\nexport default Preloader;\n","/* eslint react/jsx-pascal-case: [0, { ignore: 1 }] */\nimport React, { PureComponent } from 'react';\nimport classNames from 'classnames';\nimport range from 'lodash/range';\n\n// styles\n/* eslint-disable */\n// not css module\nimport styles from './Preloader.css';\n/* eslint-enable */\n\n/**\n * Preloader from https://github.com/tobiasahlin/SpinKit\n */\nclass Preloader extends PureComponent {\n\n constructor(props) {\n super(props);\n this.circlesRange = range(1, 13);\n }\n\n /******************************************\n * COMPONENT HOOKS\n ******************************************/\n\n render() {\n return (\n
\n {this.circlesRange.map((itemNumber) => {\n return
\n })}\n
\n );\n }\n\n}\n\nexport default Preloader;\n","import { GET_ADS_REQUEST, GET_ADS_SUCCESS, GET_ADS_FAILURE } from 'redux/actionTypes';\nimport { getAdsData } from 'shared/api/adsAPI';\n\n/* SYNC ACTION CREATORS */\n\n\nexport const getAdsRequest = () => ({\n type: GET_ADS_REQUEST,\n});\nexport const getAdsSuccess = (ads) => ({\n type: GET_ADS_SUCCESS,\n ads,\n});\n\nexport const getAdsFailure = () => ({\n type: GET_ADS_FAILURE,\n});\n\n/* ASYNC ACTION CREATORS */\n\nexport function getAds() {\n return function (dispatch) {\n dispatch(getAdsRequest());\n\n return getAdsData()\n .then(adsData => {\n dispatch(getAdsSuccess(adsData));\n })\n .catch(() => {\n dispatch(getAdsFailure());\n });\n };\n};\n","/* eslint react/jsx-pascal-case: [0, { ignore: 1 }] */\n\nimport React from 'react';\nimport { connect } from 'react-redux'\nimport delay from 'lodash/delay';\n\n// redux\nimport { getAds } from 'redux/actions/ads';\n\n\nconst mapStateToProps = state => {\n return {\n isPageWithGame: state.cheats.isPageWithGame,\n suggestTime: state.ads.androidOkAppSuggestDesktopIconTimeoutMinutes * 60000, // in ms\n };\n};\n\nconst mapDispatchToProps = dispatch => {\n return {\n getAds: () => dispatch(getAds()), // important to return it because it's Promise\n };\n};\n\nclass OKAndroidManager extends React.PureComponent {\n\n constructor(props) {\n super(props);\n this.isSuggested = false;\n this.suggestTimeout = null;\n }\n\n /******************************************\n * COMPONENT HOOKS\n ******************************************/\n\n render() { return null }\n\n componentDidMount() {\n this.props.getAds()\n .then(() => {\n delay(() => {\n this.suggestCycle();\n }, this.props.suggestTime);\n });\n }\n \n componentWillUnmount() {\n if (this.suggestTimeout) clearTimeout(this.suggestTimeout);\n }\n\n /******************************************\n * COMPONENT METHODS\n ******************************************/\n\n suggestCycle() {\n // if we've already suggested icon for this session - stop suggesting\n if (this.isSuggested && this.suggestTimeout) {\n clearTimeout(this.suggestTimeout);\n }\n\n this.suggestDesktopIcon();\n \n // we're on game page\n if (!this.isSuggested) {\n delay(() => {\n this.suggestCycle();\n }, 1000);\n }\n }\n\n suggestDesktopIcon() {\n if (!this.props.isPageWithGame) {\n window.OKApp.suggestDesktopIcon();\n this.isSuggested = true;\n }\n }\n\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(OKAndroidManager);\n","import OKAndroidManager from './OKAndroidManager';\n\nexport default OKAndroidManager;\n","import PageWrap from './PageWrap';\n\nexport default PageWrap;\n","import React, { FunctionComponent, ReactNode } from 'react';\n\n// styles\nimport styles from 'shared/styles/Page.module.css';\n\ninterface InProps {\n children: ReactNode;\n}\n\n/**\n * Wraps pages components in react router \n * Adds a basic styles to pages for performing animation\n * It was implemented to fix broken animations after adding code splitting\n */\nconst PageWrap: FunctionComponent = ({ children }) => (\n
{children}
\n);\n\nexport default PageWrap;","import PropTypes from 'prop-types';\nimport { HINT_TEXT_BOTTOM } from 'shared/constants';\n\n\nexport const propTypes = {\n circleX: PropTypes.number, // x position of circle\n circleY: PropTypes.number, // y position of circle\n circleR: PropTypes.number, // radius of circle\n circleDelta: PropTypes.number, // delta to add to the radius of circle\n text: PropTypes.string,\n textPosition: PropTypes.string, // positioning of text\n btnText: PropTypes.string,\n skipBtnText: PropTypes.string,\n onBtnClick: PropTypes.func.isRequired,\n onSkipBtnClick: PropTypes.func.isRequired,\n};\n\nexport const defaultProps = {\n circleX: 0,\n circleY: 0,\n circleR: 0,\n circleDelta: 0,\n text: 'Test text to check if hint is displayed correct',\n textPosition: HINT_TEXT_BOTTOM,\n};","/* eslint react/jsx-pascal-case: [0, { ignore: 1 }] */\n\nimport React, { Component } from 'react';\nimport { Observable } from 'rxjs';\nimport classNames from 'classnames';\nimport anime from 'animejs';\n\nimport { propTypes, defaultProps } from './props';\n\nimport { HINT_TEXT_TOP, BTN_SKIP_TOP } from 'shared/constants';\n\n// styles\nimport styles from './Hint.module.css';\n\n\nclass Hint extends Component {\n\n constructor(props) {\n super(props);\n this.animationDuration = 300;\n }\n\n /******************************************\n * COMPONENT HOOKS\n ******************************************/\n\n render() {\n const hintClasses = classNames({\n [styles.Hint]: true,\n [this.props.className]: !!this.props.className,\n });\n\n const textClasses = classNames({\n [styles.TextWrap]: true,\n });\n\n const { bgWidth, bgHeight, skipBtnText } = this.props;\n\n return (\n
\n \n \n \n \n {\n this.circle = node;\n }}/>\n \n \n \n \n
{\n this.textWrap = node;\n }}>\n

{\n this.textNode = node;\n }}>

\n \n
\n \n
\n );\n }\n\n shouldComponentUpdate(nextProps) {\n if (this.props.className !== nextProps.className) return true;\n if (this.props.bgWidth !== nextProps.bgWidth) return true;\n if (this.props.bgHeight !== nextProps.bgHeight) return true;\n if (this.props.text !== nextProps.text) {\n this.textNode.innerHTML = nextProps.text;\n return false;\n }\n if (this.props.btnText !== nextProps.btnText) {\n this.btnNode.innerHTML = nextProps.btnText;\n this.btnNode.classList.toggle(styles.Hidden, !nextProps.btnText);\n return false;\n }\n if (this.props.skipBtnText !== nextProps.skipBtnText) {\n this.skipBtnNode.innerHTML = nextProps.skipBtnText;\n }\n\n return false;\n }\n\n /******************************************\n * COMPONENT HANDLERS\n ******************************************/\n\n handleRectClick = e => {\n // if click was in the circle area\n if (this.isInsideCircle(e.clientX, e.clientY)) {\n this.props.onCircleClick();\n }\n }\n\n /******************************************\n * COMPONENT METHODS\n ******************************************/\n\n isInsideCircle(x, y) {\n const { circleX, circleY, circleR } = this;\n\n const d = Math.sqrt(Math.pow(x - circleX, 2) + Math.pow(y - circleY, 2));\n\n return d <= circleR;\n }\n\n getSkipBtnPosition() {\n const { btnSkipPosition } = this;\n switch (btnSkipPosition) {\n case BTN_SKIP_TOP:\n return `bottom: auto; top: 15%`;\n default:\n return '';\n }\n }\n\n getTextCSSProps() {\n const { circleX, circleY, circleR, textPosition } = this;\n\n const textWidth = Math.max(circleR * 2, 180);\n const textLeft = circleX - textWidth / 2;\n\n switch (textPosition) {\n case HINT_TEXT_TOP:\n const textBottom = window.innerHeight - circleY + circleR + 20;\n return `width: ${textWidth}px; bottom: ${textBottom}px; left: ${textLeft}px`;\n default: // HINT_TEXT_BOTTOM by default\n const textTop = circleY + circleR + 20;\n return `width: ${textWidth}px; top: ${textTop}px; left: ${textLeft}px`;\n }\n }\n\n animateAppear() {\n const { circleX, circleY, circleR, text, textPosition, btnText, btnSkipPosition } = this.props;\n // save props\n this.circleX = circleX;\n this.circleY = circleY;\n this.circleR = circleR;\n this.textPosition = textPosition;\n this.btnSkipPosition = btnSkipPosition;\n\n this.circle.setAttribute('cx', circleX);\n this.circle.setAttribute('cy', circleY);\n\n this.textWrap.setAttribute('style', this.getTextCSSProps());\n this.textWrap.classList.toggle(styles.Visible, true);\n this.textNode.innerHTML = text;\n\n this.btnNode.innerHTML = btnText;\n this.btnNode.classList.toggle(styles.Hidden, !btnText);\n\n this.skipBtnNode.setAttribute('style', this.getSkipBtnPosition());\n\n return Observable.create(observer => {\n anime({\n targets: this.circle,\n r: this.circleR,\n easing: 'easeOutQuad',\n duration: this.animationDuration,\n complete: (anim) => {\n observer.next();\n observer.complete();\n },\n });\n });\n }\n\n animateDisappear() {\n this.textWrap.classList.toggle(styles.Visible, false);\n\n return Observable.create(observer => {\n anime({\n targets: this.circle,\n r: 0,\n easing: 'easeOutQuad',\n duration: this.animationDuration,\n complete: (anim) => {\n observer.next();\n observer.complete();\n },\n });\n });\n }\n}\n\nHint.propTypes = propTypes;\nHint.defaultProps = defaultProps;\n\nexport default Hint;\n","import Hint from './Hint';\n\nexport default Hint;","/* eslint react/jsx-pascal-case: [0, { ignore: 1 }] */\n\nimport React from 'react';\nimport { connect } from 'react-redux';\nimport classNames from 'classnames';\nimport { fromEvent, Unsubscribable, Observable, Observer } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\nimport indexOf from 'lodash/indexOf';\nimport keys from 'lodash/keys';\nimport delay from 'lodash/delay';\nimport get from 'lodash/get';\nimport { withNamespaces, WithNamespaces } from 'react-i18next';\n\n// components\nimport Hint from 'shared/containers/Hint';\n\n// modules\nimport TutorialManager from 'shared/modules/TutorialManager';\nimport { sendAnalyticsEvent, withCount } from 'shared/modules/AnalyticsEvents';\n\n// redux\nimport * as hintActions from 'redux/actions/hint';\nimport * as settingsActions from 'redux/actions/settings';\n\nimport { tutorialConfig } from 'shared/config/tutorialConfig';\n\nimport {\n HINT_BEST_VERTEX, HINT_AI_BEST_VERTEX, HINT_NOT_BEST_VERTEX,\n HINT_GENERAL, HINT_AI_GENERAL,\n HINT_BOOSTER_HINT, HINT_BOOSTER_MOVE_BACK, HINT_TEXT_STEPS_REGEXP,\n BTN_SKIP_BOTTOM\n} from 'shared/constants';\nimport { boostersConfig } from 'shared/config/boostersConfig';\n\n// styles\nimport styles from './Tutorial.module.css';\nimport { Dispatch } from 'redux';\n\ninterface InProps {\n className?: string;\n}\n\ninterface ITutorialState {\n showHint: boolean,\n bgWidth: number | null,\n bgHeight: number | null,\n currTutorialHintIndex: number;\n}\n\ninterface IStateToProps {\n language: string;\n userId: number;\n tutorialProgress: string[];\n\n // game steps spent for identifying user activity\n stepsSpent: number;\n // coords of best vertex\n bestVertexX: number;\n bestVertexY: number;\n bestVertexR: number;\n // coords of not best vertex\n notBestVertexY: number;\n notBestVertexX: number;\n notBestVertexR: number;\n notBestVertexIndex: number;\n // coords of whole graph\n graphX: number;\n graphY: number;\n graphR: number;\n isGamePassed: boolean;\n\n // // coords of booster hint\n boosterHintX: number;\n boosterHintY: number;\n boosterHintR: number;\n\n // // coords of booster move back\n boosterMoveBackY: number;\n boosterMoveBackX: number;\n boosterMoveBackR: number;\n\n // tutorial\n tutorialLevelId: string;\n infiniteBoosterHint: boolean;\n infiniteBoosterMoveBack: boolean;\n stepsLeft: number;\n}\n\ninterface IDispatchToProps {\n setHintBgSize: (width: number, height: number) => void;\n setHintCircle: (x: number, y: number, r: number) => void;\n addSettingsTutorial: (level: string) => void;\n updateSettingsTutorial: (levels: string[]) => void;\n}\n\ntype TutorialProps = InProps & IStateToProps & IDispatchToProps & WithNamespaces;\n\nconst mapStateToProps = (state: any): IStateToProps => ({\n language: state.settings.language,\n userId: state.user.userId,\n tutorialProgress: state.settings.tutorialProgress,\n\n // game steps spent for identifying user activity\n stepsSpent: state.game.stepsSpent,\n // coords of best vertex\n bestVertexX: state.game.bestVertexX,\n bestVertexY: state.game.bestVertexY,\n bestVertexR: state.game.bestVertexR,\n // coords of not best vertex\n notBestVertexY: state.game.notBestVertexY,\n notBestVertexX: state.game.notBestVertexX,\n notBestVertexR: state.game.notBestVertexR,\n notBestVertexIndex: state.game.notBestVertexIndex,\n // coords of whole graph\n graphX: state.game.graphX,\n graphY: state.game.graphY,\n graphR: state.game.graphR,\n // is game passed\n isGamePassed: state.game.passed,\n // // coords of booster hint\n boosterHintX: state.boosters.boosterHintX,\n boosterHintY: state.boosters.boosterHintY,\n boosterHintR: state.boosters.boosterHintR,\n // // coords of booster move back\n boosterMoveBackY: state.boosters.boosterMoveBackY,\n boosterMoveBackX: state.boosters.boosterMoveBackX,\n boosterMoveBackR: state.boosters.boosterMoveBackR,\n\n // tutorial\n tutorialLevelId: state.tutorial.activeLevelId,\n\n infiniteBoosterHint: state.boosters.infiniteBoosterHint,\n infiniteBoosterMoveBack: state.boosters.infiniteBoosterMoveBack,\n\n // game steps left (AI data)\n stepsLeft: state.game.stepsLeft,\n});\n\nconst mapDispatchToProps = (dispatch: Dispatch) => ({\n setHintBgSize: (width: number, height: number) => dispatch(hintActions.setBgSize(width, height)),\n setHintCircle: (x: number, y: number, r: number) => dispatch(hintActions.setCircle(x, y, r)),\n addSettingsTutorial: (level: string) => dispatch(settingsActions.addSettingsTutorial(level)),\n updateSettingsTutorial: (levels: string[]) => dispatch(settingsActions.updateSettingsTutorial(levels))\n});\n\n\nclass Tutorial extends React.Component {\n\n state: ITutorialState = {\n showHint: false,\n bgWidth: null,\n bgHeight: null,\n currTutorialHintIndex: -1, // current index of tutorial hint from config\n }\n\n // delta to add to the circle radius if there's no deltaCircleR in hint config\n private defaultDeltaCircleR: number = 25;\n private tutorialLevels: string[] = keys(tutorialConfig);\n private isTransitionBetweenHints: boolean = false;\n private resizeEventSubscr?: Unsubscribable;\n private hint?: Hint;\n // waiting mode\n private isWaitingMode: boolean = false;\n private waitingHintTimeout?: any;\n\n get hasTutorial() {\n // check if current tutorialLevelId has tutorial in config\n return indexOf(this.tutorialLevels, this.props.tutorialLevelId) >= 0;\n }\n\n get tutorialConfigOfLevel() {\n return get(tutorialConfig, this.props.tutorialLevelId);\n }\n\n get boostersConfigOfLevel() {\n return get(boostersConfig, this.props.tutorialLevelId);\n }\n\n get tutorialHintsOfLevel() {\n if (this.hasTutorial) {\n return get(this.tutorialConfigOfLevel, 'tutorialHints');\n }\n return null;\n }\n\n get waitingHintOfLevel() {\n if (this.hasTutorial) {\n return get(this.tutorialConfigOfLevel, 'waitHint');\n }\n return null;\n }\n\n get currTutorialHint() {\n if (this.tutorialHintsOfLevel) {\n return this.tutorialHintsOfLevel[this.state.currTutorialHintIndex];\n }\n return null;\n }\n\n get deltaYOfCurrTutorialHint() {\n return get(this.currTutorialHint, 'deltaY', 0);\n }\n\n get isLevelPassed() {\n const { tutorialProgress, tutorialLevelId } = this.props;\n if (!tutorialProgress) {\n return false;\n }\n return tutorialProgress.indexOf(tutorialLevelId) >= 0;\n }\n\n get hintCircle() {\n if (!this.props.tutorialLevelId) return null;\n\n const {\n bestVertexX, bestVertexY, bestVertexR, graphX, graphY, graphR,\n boosterHintX, boosterHintY, boosterHintR,\n boosterMoveBackX, boosterMoveBackY, boosterMoveBackR,\n notBestVertexX, notBestVertexY, notBestVertexR,\n } = this.props;\n\n if (this.isWaitingMode) {\n // if it's waiting hint - it's always best vertex hint\n return this.createHintCircleData(bestVertexX, bestVertexY, bestVertexR + this.defaultDeltaCircleR);\n } else if (this.currTutorialHint) {\n const deltaCircleR = get(this.currTutorialHint, 'deltaCircleR', this.defaultDeltaCircleR);\n\n switch (this.currTutorialHint.type) {\n case HINT_BEST_VERTEX:\n case HINT_AI_BEST_VERTEX:\n return bestVertexR ? this.createHintCircleData(bestVertexX, bestVertexY, bestVertexR + deltaCircleR) : null;\n case HINT_NOT_BEST_VERTEX:\n return notBestVertexY ? this.createHintCircleData(notBestVertexX, notBestVertexY, notBestVertexR + deltaCircleR) : null;\n case HINT_GENERAL:\n case HINT_AI_GENERAL:\n return graphR ? this.createHintCircleData(graphX, graphY, graphR + deltaCircleR) : null;\n case HINT_BOOSTER_HINT:\n return boosterHintR ? this.createHintCircleData(boosterHintX, boosterHintY, boosterHintR + deltaCircleR) : null;\n case HINT_BOOSTER_MOVE_BACK:\n default:\n return boosterMoveBackR ? this.createHintCircleData(boosterMoveBackX, boosterMoveBackY, boosterMoveBackR + deltaCircleR) : null;\n }\n }\n\n return null;\n }\n\n get hintTextData(): { text: string | null , textPosition: string | null } {\n if (!this.props.tutorialLevelId) {\n return this.createHintTextData(null, null);\n }\n\n if (this.isWaitingMode) {\n // if it's waiting hint - it's always best vertex hint\n return this.createHintTextData(\n this.waitingHintOfLevel.text[this.props.language],\n this.waitingHintOfLevel.textPosition,\n );\n } else if (this.currTutorialHint) {\n return this.createHintTextData(\n this.currTutorialHint.text[this.props.language],\n this.currTutorialHint.textPosition,\n );\n } else {\n return this.createHintTextData(null, null);\n }\n }\n\n get hintBtnText() {\n if (!this.props.tutorialLevelId || this.isWaitingMode) return null;\n return get(this.currTutorialHint, `button[${this.props.language}]`);\n }\n\n /******************************************\n * COMPONENT HOOKS\n ******************************************/\n\n render() {\n if (!this.hintCircle) {\n return '';\n }\n\n const tutorialClasses = classNames({\n [styles.Tutorial]: true,\n [styles.HintShow]: this.state.showHint,\n [this.props.className!]: !!this.props.className,\n });\n\n const { circleX, circleY, circleR } = this.hintCircle;\n\n const { textPosition } = this.hintTextData;\n const text = this.handleHintText(this.hintTextData.text);\n\n const { bgWidth, bgHeight } = this.state;\n const btnSkipPosition = get(this.currTutorialHint, 'btnSkipPosition', BTN_SKIP_BOTTOM)\n return (\n
\n {\n this.hint = node!;\n }}\n circleX={circleX}\n circleY={circleY + this.deltaYOfCurrTutorialHint}\n circleR={circleR}\n text={text}\n textPosition={textPosition}\n btnSkipPosition={btnSkipPosition}\n bgWidth={bgWidth}\n bgHeight={bgHeight}\n btnText={this.hintBtnText}\n skipBtnText={this.props.t('tutorial.skipTutorial')}\n onCircleClick={this.handleCircleClick}\n onBtnClick={this.handleBtnClick}\n onSkipBtnClick={this.handleSkipBtnClick}>\n \n
\n );\n }\n\n componentWillUnmount() {\n if (this.isLevelPassed) return;\n if (this.resizeEventSubscr) this.resizeEventSubscr.unsubscribe();\n }\n\n componentDidUpdate(prevProps: TutorialProps) {\n // if level Id was changed - start tutorial for this level\n if (prevProps.tutorialLevelId !== this.props.tutorialLevelId && this.hasTutorial) {\n this.start();\n }\n\n // if we're in the waiting mode and user do some actions - restart waiting hint timeout\n if (prevProps.stepsSpent !== this.props.stepsSpent && this.isWaitingMode) {\n this.callWaitingHintIteration();\n }\n\n // if game passed\n if (prevProps.isGamePassed !== this.props.isGamePassed && this.props.isGamePassed) {\n this.setTutorialPassed();\n }\n }\n\n /******************************************\n * COMPONENT HANDLERS\n ******************************************/\n\n handleBtnClick = () => {\n if (this.isTransitionBetweenHints) return;\n if (this.currTutorialHint.type === HINT_GENERAL ||\n this.currTutorialHint.type === HINT_AI_GENERAL) {\n this.isTransitionBetweenHints = true;\n this.showNextHint();\n }\n }\n\n handleCircleClick = () => {\n if (!this.props.tutorialLevelId || this.isTransitionBetweenHints) return;\n if (this.isWaitingMode) {\n TutorialManager.callGameBestVertexClick();\n this.setShowHint(false).subscribe(() => {\n this.isTransitionBetweenHints = false;\n this.callWaitingHintIteration();\n });\n } else if (this.currTutorialHint) {\n switch (this.currTutorialHint.type) {\n case HINT_BEST_VERTEX:\n case HINT_AI_BEST_VERTEX:\n TutorialManager.callGameBestVertexClick();\n break;\n case HINT_NOT_BEST_VERTEX:\n TutorialManager.callGameNotBestVertexClick();\n break;\n case HINT_BOOSTER_HINT:\n TutorialManager.callBoosterHintClick();\n break;\n case HINT_BOOSTER_MOVE_BACK:\n default:\n TutorialManager.callBoosterMoveBackClick();\n break;\n }\n if (this.currTutorialHint.type !== HINT_GENERAL &&\n this.currTutorialHint.type !== HINT_AI_GENERAL) {\n this.isTransitionBetweenHints = true;\n this.showNextHint();\n }\n }\n }\n\n handleSkipBtnClick = () => {\n const { userId, tutorialLevelId } = this.props;\n sendAnalyticsEvent('skipTutorial', withCount<{ [key: string]: any }>({\n [tutorialLevelId]: withCount({ userId }),\n }));\n this.skipAllTutorials();\n }\n\n /******************************************\n * COMPONENT METHODS\n ******************************************/\n\n // Start tutorial for level with Id = this.props.tutorialLevelId\n start() {\n if (this.isLevelPassed) return;\n\n this.callUpdateGameData();\n // reset tutorialHint index\n if (this.tutorialHintsOfLevel) {\n this.setCurrTutorialHintIndex(0)\n .subscribe(() => {\n this.setShowHint(true).subscribe();\n });\n } else if (this.waitingHintOfLevel) {\n this.startWaitingMode();\n }\n this.startListeningResize();\n this.updateHintBgSize();\n }\n\n startListeningResize() {\n const resizeEvent$ = fromEvent(window, 'resize').pipe(debounceTime(200));\n\n this.resizeEventSubscr = resizeEvent$.subscribe(e => {\n this.updateHintBgSize();\n this.callUpdateGameData();\n this.updateBoostersCoords();\n });\n }\n\n setCurrTutorialHintIndex(index: number) {\n return Observable.create((observer: Observer) => {\n this.setState({\n currTutorialHintIndex: index\n }, () => {\n observer.next();\n observer.complete();\n });\n });\n }\n\n showNextHint() {\n if (this.state.currTutorialHintIndex < this.tutorialHintsOfLevel.length - 1) {\n this.hint && this.hint.animateDisappear()\n .subscribe(() => {\n this.setCurrTutorialHintIndex(this.state.currTutorialHintIndex + 1)\n .subscribe(() => {\n this.updateHint();\n this.callUpdateGameData();\n delay(() => {\n if (this.hint) {\n this.hint.animateAppear().subscribe();\n }\n }, 100);\n });\n });\n } else {\n this.setShowHint(false)\n .subscribe(() => {\n this.setCurrTutorialHintIndex(-1)\n .subscribe(() => {\n // set waiting mode if we have one\n this.startWaitingMode();\n this.updateBoostersInfinities();\n });\n });\n }\n this.isTransitionBetweenHints = false;\n }\n\n updateHint() {\n this.updateBoostersCoords();\n this.updateBoostersInfinities();\n\n if (get(this.currTutorialHint, 'type') === HINT_BEST_VERTEX) {\n TutorialManager.callGameShowBestMoveHint();\n }\n\n if (get(this.currTutorialHint, 'type') === HINT_AI_BEST_VERTEX) {\n TutorialManager.callGameShowBestMoveHint();\n TutorialManager.callGameUpdateStepsLeft();\n }\n\n if (get(this.currTutorialHint, 'type') === HINT_NOT_BEST_VERTEX) {\n TutorialManager.callGameShowNotBestMoveHint();\n }\n\n if (get(this.currTutorialHint, 'type') === HINT_AI_GENERAL) {\n TutorialManager.callGameUpdateStepsLeft();\n }\n }\n\n // update all hint parameters based on current config item\n updateHintBgSize() {\n this.setState({\n bgWidth: window.innerWidth,\n bgHeight: window.innerHeight\n });\n }\n\n startWaitingMode() {\n if (!this.props.tutorialLevelId) this.stopWaitingMode();\n if (this.isWaitingMode || this.isLevelPassed) return;\n if (this.waitingHintOfLevel) {\n this.isWaitingMode = true;\n // universal for all waiting hints\n this.callWaitingHintIteration();\n }\n }\n\n stopWaitingMode() {\n if ((!this.isWaitingMode || this.isLevelPassed) && this.props.tutorialLevelId) return;\n\n this.isWaitingMode = false;\n clearTimeout(this.waitingHintTimeout);\n }\n\n callWaitingHintIteration() {\n if (!this.props.tutorialLevelId || this.isLevelPassed) return;\n\n if (this.waitingHintTimeout) {\n clearTimeout(this.waitingHintTimeout);\n }\n if (!this.waitingHintOfLevel) {\n console.warn('No waiting hint');\n return;\n }\n this.waitingHintTimeout = delay(this.executeWaitingHintIteration, this.waitingHintOfLevel.time);\n }\n\n executeWaitingHintIteration = () => {\n if (!this.state.showHint) {\n TutorialManager.callGameShowBestMoveHint();\n this.setShowHint(true).subscribe();\n }\n this.callWaitingHintIteration();\n }\n\n setTutorialPassed() {\n if (this.isLevelPassed) return;\n this.stopWaitingMode();\n this.props.addSettingsTutorial(this.props.tutorialLevelId);\n }\n\n setShowHint(showHint: boolean) {\n return Observable.create((observer: Observer) => {\n if (showHint) {\n const showHintDelay = get(this.currTutorialHint, 'delay', 0);\n\n setTimeout(() => {\n this.setState({ showHint });\n this.updateHint();\n this.hint && this.hint.animateAppear().subscribe(() => {\n observer.next();\n observer.complete();\n });\n }, showHintDelay);\n } else {\n this.hint && this.hint.animateDisappear().subscribe(() => {\n observer.next();\n observer.complete();\n this.updateHint();\n this.setState({ showHint });\n });\n }\n });\n }\n\n createHintCircleData(circleX: number, circleY: number, circleR: number) {\n return { circleX, circleY, circleR };\n }\n\n createHintTextData(text: string | null, textPosition: string | null) {\n return { text, textPosition };\n }\n\n callUpdateGameData() {\n TutorialManager.callGameUpdateGraphCoord();\n TutorialManager.callGameUpdateBestVertexCoord();\n TutorialManager.callGameUpdateNotBestVertexData();\n }\n\n updateBoostersCoords() {\n if (this.currTutorialHint) {\n const boosterR = 15;\n switch (this.currTutorialHint.type) {\n case HINT_BOOSTER_HINT:\n if (!this.boostersConfigOfLevel.hideBoosterHint) {\n // if there's only booster hint - it's in the middle\n if (this.boostersConfigOfLevel.hideBoosterMoveBack) {\n TutorialManager.setBoosterHintCoords(\n window.innerWidth / 2,\n window.innerHeight - 40,\n boosterR\n );\n } else {\n TutorialManager.setBoosterHintCoords(\n window.innerWidth / 2 - 40,\n window.innerHeight - 40,\n boosterR\n );\n }\n }\n return;\n case HINT_BOOSTER_MOVE_BACK:\n TutorialManager.setBoosterMoveBackCoords(\n window.innerWidth / 2 + 35,\n window.innerHeight - 40,\n boosterR\n );\n return;\n default:\n return;\n }\n }\n }\n\n updateBoostersInfinities() {\n if (process.env.REACT_APP_INFINITE_BOOSTERS === 'true') {\n TutorialManager.setInfiniteBoosterHint(true);\n TutorialManager.setInfiniteBoosterMoveBack(true);\n return\n }\n\n if (!this.currTutorialHint) {\n TutorialManager.setInfiniteBoosterHint(false);\n TutorialManager.setInfiniteBoosterMoveBack(false);\n return;\n }\n\n if (this.currTutorialHint.isInfiniteBoosterHint !== this.props.infiniteBoosterHint) {\n TutorialManager.setInfiniteBoosterHint(!!this.currTutorialHint.isInfiniteBoosterHint);\n }\n\n if (this.currTutorialHint.isInfiniteBoosterMoveBack !== this.props.infiniteBoosterMoveBack) {\n TutorialManager.setInfiniteBoosterMoveBack(!!this.currTutorialHint.isInfiniteBoosterMoveBack);\n }\n }\n\n handleHintText(text: string | null) {\n if (!text) return text;\n\n if (text.indexOf(HINT_TEXT_STEPS_REGEXP) >= 0) {\n let movesText = '';\n const { stepsLeft } = this.props;\n if (this.props.language === 'ru') {\n const rest = stepsLeft % 10;\n if (rest === 1) {\n movesText = 'шаг';\n } else if (rest > 1 && rest < 5 ) {\n movesText = 'шага';\n } else {\n movesText = 'шагов';\n }\n } else if (this.props.language === 'en') {\n if (stepsLeft === 1) {\n movesText = 'move';\n } else {\n movesText = 'moves';\n }\n }\n return text.replace(HINT_TEXT_STEPS_REGEXP, `${this.props.stepsLeft} ${movesText}`);\n }\n return text;\n }\n\n skipAllTutorials() {\n this.stopWaitingMode();\n this.props.updateSettingsTutorial(this.tutorialLevels);\n this.setShowHint(false).subscribe();\n }\n}\n\nexport default withNamespaces()(\n connect(mapStateToProps, mapDispatchToProps)(Tutorial)\n);\n","import Tutorial from './Tutorial';\n\nexport default Tutorial;","import {\n SHOW_HINT, SET_HINT_CIRCLE, SET_HINT_TEXT, SET_HINT_BG_SIZE,\n} from '../actionTypes';\n\ntype TextPosition = 'top' | 'bottom';\n\n\n/* SYNC ACTION CREATORS */\n\nexport const showHint = (show: boolean) => ({\n type: SHOW_HINT,\n show,\n});\n\nexport const setCircle = (x: number, y: number, r: number) => ({\n type: SET_HINT_CIRCLE,\n x, // x position\n y, // y position\n r, // radius\n});\n\nexport const setText = (text: any, textPosition: TextPosition) => ({\n type: SET_HINT_TEXT,\n text, // text string\n textPosition,\n});\n\nexport const setBgSize = (bgWidth: number, bgHeight: number) => ({\n type: SET_HINT_BG_SIZE,\n bgWidth,\n bgHeight,\n});\n","/* eslint react/jsx-pascal-case: [0, { ignore: 1 }] */\n\nimport React, { ComponentType } from 'react';\nimport { connect } from 'react-redux'\nimport delay from 'lodash/delay';\nimport size from 'lodash/size';\nimport loadable from '@loadable/component';\nimport { Dispatch } from 'redux';\n\n// constants\nimport {\n MODAL_APPEAR_TIME, LIFE_REDUCE_MODAL_SHOW_TIME, MODAL_LIFE_REDUCE\n} from 'shared/constants';\nimport { ICustomModalProps } from 'shared/components/CustomModal/CustomModal';\n\n// redux\nimport {\n hideModal, hideLifeReduceModal, showSecondSessionModal, hideSecondSessionModal,\n} from 'redux/actions/modals';\nimport { removeLife } from 'redux/actions/lives';\nimport { modalsSelector, isModalShowedSelector } from 'redux/selectors/modals';\nimport { IModal } from 'redux/reducers/modals';\nimport { ModalType } from 'redux/actions/modals';\n\nimport styles from './ModalManager.module.css';\nimport 'shared/styles/modalAnimation.css';\n\n// loadable components\nconst ModalsLoadable = loadable.lib(() => import('shared/components/modals'));\n\ninterface IStateToProps {\n modals: IModal[];\n isLifeReduceModalShowed: boolean;\n livesNumber: number;\n isSecondSession: boolean;\n}\n\ninterface IDispatchToProps {\n hideModal: (modalType: ModalType) => void;\n hideLifeReduceModal: () => void;\n showSecondSessionModal: () => void;\n hideSecondSessionModal: () => void;\n updateSettingsTutorial: () => void;\n removeLife: () => any;\n}\n\ntype ModalManagerProps = IStateToProps & IDispatchToProps;\n\nconst mapStateToProps = (state: any): IStateToProps => {\n const isModalShowed = isModalShowedSelector(state);\n return ({\n modals: modalsSelector(state),\n isLifeReduceModalShowed: isModalShowed(MODAL_LIFE_REDUCE),\n livesNumber: state.lives.livesNumber,\n isSecondSession: state.secondSession.isSecondSession,\n });\n};\n\nconst mapDispatchToProps = (dispatch: Dispatch) => ({\n hideModal: (modalType: ModalType) => dispatch(hideModal(modalType)),\n hideLifeReduceModal: () => dispatch(hideLifeReduceModal()),\n showSecondSessionModal: () => dispatch(showSecondSessionModal()),\n hideSecondSessionModal: () => dispatch(hideSecondSessionModal()),\n removeLife: () => dispatch(removeLife()),\n});\n\nclass ModalManager extends React.PureComponent {\n\n /******************************************\n * COMPONENT HOOKS\n ******************************************/\n\n render() {\n return (\n
\n {size(this.props.modals) &&\n \n {({ default: loadedModals }) => (\n this.props.modals.map((modal: IModal) => {\n const SpecificModal: ComponentType = loadedModals[modal.type];\n if (!SpecificModal) return null;\n return (\n \n \n );\n })\n )}\n \n }\n {/* */}\n
\n );\n }\n\n componentDidMount() {\n if (this.props.isSecondSession) {\n this.toggleSecondSessionModal();\n }\n }\n\n componentDidUpdate(prevProps: Readonly) {\n if (this.props.isLifeReduceModalShowed !== prevProps.isLifeReduceModalShowed &&\n this.props.isLifeReduceModalShowed) {\n delay(() => {\n this.props.hideLifeReduceModal();\n delay(() => {\n this.props.removeLife();\n }, MODAL_APPEAR_TIME);\n }, LIFE_REDUCE_MODAL_SHOW_TIME);\n }\n\n if (this.props.isSecondSession !== prevProps.isSecondSession) {\n this.toggleSecondSessionModal();\n }\n }\n\n /******************************************\n\t* COMPONENT HANDLERS\n ******************************************/\n\n handlerBackClick = (modalType: ModalType) => {\n this.props.hideModal(modalType);\n }\n\n /******************************************\n\t* COMPONENT METHODS\n\t******************************************/\n\n toggleSecondSessionModal() {\n if (this.props.isSecondSession) {\n this.props.showSecondSessionModal();\n } else {\n this.props.hideSecondSessionModal();\n }\n }\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ModalManager);\n","import ModalManager from './ModalManager';\n\nexport default ModalManager;\n","import axiosInstance from 'shared/api/axiosInstance';\nimport config from 'shared/config';\n\nexport interface IUserData {\n\tid: number;\n\tuserId: number;\n\tlogins: {\n\t\ttoday: number;\n\t\ttotal: number;\n\t\tdaysInARow: number;\n\t}\n\tdeveloper: boolean;\n}\n\nexport interface IUserExistsData {\n id: number;\n uuid: string;\n\tdeveloper: boolean;\n}\n\nexport interface IUserCreateData extends IUserData {};\n\nconst secretApiToken = config.secretApiToken;\nconst uuidParamName = process.env.REACT_APP_SOCIAL_MEDIA === 'ok' ? 'okUuid' : 'uuid';\nconst appSource = (process.env.REACT_APP_SOCIAL_MEDIA as 'ok' | 'vk' | 'fb') || 'web';\n\nexport const checkUserExists = (uuid: string): Promise => {\n const queryString = `${uuidParamName}=${uuid}&secretApiToken=${secretApiToken}`;\n return axiosInstance.get(`/users/${appSource}/exists?${queryString}`);\n};\n\nexport const createUser = (uuid: string): Promise => {\n return axiosInstance.post(`/users/${appSource}/`, {\n [uuidParamName]: uuid,\n secretApiToken: secretApiToken\n });\n};\n\n/*\n * Delete current user\n * By X-Session-Token\n*/\nexport const deleteUser = (): Promise => {\n const endpoint = `/users/${appSource}/current`;\n return axiosInstance.delete(endpoint);\n};\n\nexport const authUser = (uuid: string): Promise => {\n return axiosInstance.post(`/authentications/${appSource}`, {\n [uuidParamName]: uuid,\n secretApiToken\n });\n};\n\n/*\n * Delete OK user\n*/\nexport const deleteSession = (): Promise => {\n const endpoint = `/authentications/${appSource}`;\n return axiosInstance.delete(endpoint);\n};","import { Dispatch } from 'redux';\nimport {\n SET_USER_ID,\n CHECK_USER_REQUEST, CHECK_USER_SUCCESS, CHECK_USER_FAILURE,\n CREATE_USER_REQUEST, CREATE_USER_SUCCESS, CREATE_USER_FAILURE,\n AUTH_USER_REQUEST, AUTH_USER_SUCCESS, AUTH_USER_FAILURE,\n DELETE_USER_REQUEST, DELETE_USER_SUCCESS, DELETE_USER_FAILURE,\n DELETE_SESSION_REQUEST, DELETE_SESSION_SUCCESS, DELETE_SESSION_FAILURE,\n} from '../../redux/actionTypes';\nimport * as userAPI from '../../shared/api/userAPI';\nimport { AxiousError } from 'shared/api/axiosInstance';\n\n/* SYNC ACTION CREATORS */\n\nexport const setUserUuid = (uuid: string) => ({\n type: SET_USER_ID,\n uuid,\n});\n\n// CHECK USER\n\nexport const checkUserRequest = () => ({\n type: CHECK_USER_REQUEST,\n});\n\nexport const checkUserSuccess = (user: any) => ({\n type: CHECK_USER_SUCCESS,\n user,\n});\n\nexport const checkUserFailure = () => ({\n type: CHECK_USER_FAILURE,\n});\n\n// CREATE USER\n\nexport const createUserRequest = () => ({\n type: CREATE_USER_REQUEST,\n});\n\nexport const createUserSuccess = (user: any) => ({\n type: CREATE_USER_SUCCESS,\n user,\n});\n\nexport const createUserFailure = () => ({\n type: CREATE_USER_FAILURE,\n});\n\n// AUTH USER\n\nexport const authUserRequest = () => ({\n type: AUTH_USER_REQUEST,\n});\n\nexport const authUserSuccess = (user: any) => ({\n type: AUTH_USER_SUCCESS,\n user,\n});\n\nexport const authUserFailure = () => ({\n type: AUTH_USER_FAILURE,\n});\n\n// DELETE USER\n\nexport const deleteUserRequest = () => ({\n type: DELETE_USER_REQUEST,\n});\n\nexport const deleteUserSuccess = () => ({\n type: DELETE_USER_SUCCESS,\n});\n\nexport const deleteUserFailure = () => ({\n type: DELETE_USER_FAILURE,\n});\n\n// DELETE SESSION\n\nexport const deleteSessionRequest = () => ({\n type: DELETE_SESSION_REQUEST,\n});\n\nexport const deleteSessionSuccess = (user?: any) => ({\n type: DELETE_SESSION_SUCCESS,\n user,\n});\n\nexport const deleteSessionFailure = () => ({\n type: DELETE_SESSION_FAILURE,\n});\n\n/* ASYNC ACTION CREATORS */\n\nexport function checkUserExists(uuid: string) {\n return function(dispatch: Dispatch) {\n dispatch(checkUserRequest());\n\n return userAPI.checkUserExists(uuid).then((user: userAPI.IUserExistsData) => {\n dispatch(checkUserSuccess(user));\n return user;\n })\n .catch((error: AxiousError) => {\n dispatch(checkUserFailure());\n throw error;\n });\n };\n};\n\nexport function createUser(uuid: string) {\n return function(dispatch: Dispatch) {\n dispatch(createUserRequest());\n\n return userAPI.createUser(uuid)\n .then((user: userAPI.IUserCreateData) => {\n dispatch(createUserSuccess(user));\n return user;\n })\n .catch((error: AxiousError) => {\n dispatch(createUserFailure());\n throw error;\n });\n };\n};\n\nexport function authUser(uuid: string) {\n return function (dispatch: Dispatch) {\n dispatch(authUserRequest());\n\n return userAPI.authUser(uuid)\n .then((user: userAPI.IUserData) => {\n dispatch(setUserUuid(uuid));\n dispatch(authUserSuccess(user));\n return user;\n })\n .catch((error: AxiousError) => {\n dispatch(authUserFailure());\n throw error;\n });\n }\n};\n\nexport function deleteUser() {\n return function (dispatch: Dispatch) {\n dispatch(deleteUserRequest());\n\n return userAPI.deleteUser()\n .then(() => {\n dispatch(deleteUserSuccess());\n return;\n })\n .catch((error: AxiousError) => {\n dispatch(deleteUserFailure());\n throw error;\n });\n };\n};\n\nexport function deleteSession() {\n return function(dispatch: Dispatch) {\n dispatch(deleteSessionRequest());\n\n return userAPI.deleteSession()\n .then(() => {\n dispatch(deleteSessionSuccess());\n return;\n })\n .catch((error: AxiousError) => {\n dispatch(deleteSessionFailure());\n throw error;\n });\n };\n};\n","import store from 'redux/store';\n\n// constants\nimport { NOT_FOUND } from 'shared/constants';\n\n// redux\nimport { checkUserExists, createUser, authUser } from 'redux/actions/user';\n\n// modules\nimport { sendAnalyticsEvent, composeAnalyticsEntityId, withCount } from 'shared/modules/AnalyticsEvents';\n\n// helpers\nimport { loadYandexMetrica } from 'shared/helpers/analytics';\nimport { IUserData } from 'shared/api/userAPI';\n\nfunction sendUserLoginEvent(user: IUserData) {\n\tconst { userId, logins } = user;\n\tsendAnalyticsEvent('login', withCount({\n\t\t[composeAnalyticsEntityId(userId)]: withCount({\n\t\t\tlogins\n\t\t}),\n }));\n loadYandexMetrica().then(({ default: ym }) => {\n ym('userParams', {\n UserId: userId\n });\n });\n}\n\n/**\n * Manages user authentication in applicaiton\n */\nexport default class Auth {\n\n\t/******************************************\n\t* CLASS METHODS\n\t******************************************/\n\n\tstatic async authUser(uuid: string) {\n\t\ttry {\n\t\t\tawait store.dispatch(checkUserExists(uuid));\n\t\t\tconst user: IUserData = await store.dispatch(authUser(uuid));\n\t\t\tsendUserLoginEvent(user);\n\t\t\t/* ONLY FOR TESTING: Uncommit it if you want to delete this user*/\n\t\t\t// \tstore.dispatch(deleteUser());\n\t\t} catch (error) {\n\t\t\t// this user isn't exist\n\t\t\tif (error.status && error.status === NOT_FOUND) {\n\t\t\t\ttry {\n\t\t\t\t\t// create new user\n\t\t\t\t\tawait store.dispatch(createUser(uuid));\n\t\t\t\t\t// auth user\n\t\t\t\t\tconst user = await store.dispatch(authUser(uuid));\n\t\t\t\t\tsendUserLoginEvent(user);\n\t\t\t\t} catch (error) { console.log(error) };\n\t\t\t}\n\t\t}\n\t}\n}\n","import { schema } from 'normalizr';\n\nimport { Level, Pack, World } from '../../shared/api/worldsAPI';\nimport { createPackEntityId, createLevelEntityId } from '../../shared/helpers/schemas';\n\n// Normalized Data interfaces\n\nexport type WorldsEntity = Record;\n\nexport type PacksEntity = Record;\n\n\nexport type LevelsEntity = Record;\n\n\n/**\n * Structure Example:\n entities: {\n\t\tworlds: {\n\t\t\t1: {\n\t\t\t\tId: 1,\n\t\t\t\tLocales: {en: string, ru: string},\n\t\t\t\tName: string,\n\t\t\t\tPacks: ['1-1', '1-2']\n\t\t\t},\n\t\t\t2: {...}\n\t\t},\n\t\tpacks: {\n\t\t\t'1-1': {\n\t\t\t\tId: number,\n\t\t\t\tName: string,\n\t\t\t\tLocales: {en: string, ru: string}\n\t\t\t\tStarsRequired: number\n\t\t\t\tLevels: ['1-1-1', '1-1-2', '1-1-3']\n\t\t\t},\n\t\t\t'1-2': {...}\n\t\t},\n\t\tlevels: {\n\t\t\t'1-1-1': Level,\n\t\t\t'1-1-2': Level,\n\t\t\t'1-1-3': Level,\n\t\t}\n }\n */\nexport interface WorldsEntities {\n\tworlds: WorldsEntity;\n\tpacks: PacksEntity;\n\tlevels: LevelsEntity;\n};\n\nconst LevelSchema = new schema.Entity('levels',\n\t{},\n\t{\n\t\tidAttribute: (value, parent, key) => createLevelEntityId(parent.WorldId, parent.Id, value.Id)\n\t}\n);\n\nconst PackSchema = new schema.Entity('packs', {\n\tLevels: [LevelSchema]\n}, {\n\tprocessStrategy: (value, parent, key) => ({ ...value, WorldId: parent.Id }),\n\tidAttribute: (value, parent, key) => createPackEntityId(parent.Id, value.Id),\n});\n\nexport const WorldSchema = new schema.Entity('worlds', {\n\tPacks: [PackSchema]\n}, { idAttribute: 'Id' });\n\nexport const WorldListSchema = [WorldSchema];\n","import { normalize } from 'normalizr';\n\nimport { GET_WORLDS_SUCCESS, GET_WORLDS_FAILURE } from '../../redux/actionTypes';\nimport { fetchWorlds } from '../../shared/api/worldsAPI';\nimport { updateWorldsLocales } from '../../shared/helpers/locales';\nimport { WorldListSchema, WorldsEntities } from '../../shared/schemas/worlds';\n\nexport const getWorldsSuccess = (worlds: WorldsEntities) => ({\n type: GET_WORLDS_SUCCESS,\n worlds\n});\n\nexport const getWorldsFailure = () => ({\n type: GET_WORLDS_FAILURE,\n});\n\n/* ASYNC ACTION CREATORS */\n\nexport const getWorlds = () => {\n return (dispatch: any, getState: any): Promise => {\n \tif (getState().worlds.entities) {\n \t\treturn Promise.resolve(getState().worlds.entities);\n \t}\n return fetchWorlds().then((worldsData) => {\n // Update titles according locales\n updateWorldsLocales(worldsData);\n // Normalize data, see WorldsEntities interface structure\n const normalizedData = normalize(worldsData, WorldListSchema);\n \tdispatch(getWorldsSuccess(normalizedData.entities));\n return normalizedData.entities;\n }, (err) => {\n dispatch(getWorldsFailure());\n });\n };\n};\n","import axios from 'axios';\nimport get from 'lodash/get';\n\n/**\n * Entity id in the normalized data\n * Pack id example: '1-1', '2-1'. First number represents World.Id, second number is Pack.Id\n * level id example '1-1-1', '1-1-2', '3-2-1'. First number is World.Id, second is Pack.Id, thrid is Level.Id\n * @type {entityID}\n */\nexport type entityID = string;\nexport type WorldProgress = any;\nexport interface Graph {\n\tVertices: Array;\n\tMaxMovesCount: number;\n\tBestMovesCount: number;\n\tData: any;\n};\n\nexport interface Level {\n\tId: number;\n\tHash: string;\n\tGraph: Graph;\n};\n\nexport interface Pack {\n\tId: number;\n\tName: string;\n\tLocales: any;\n\tStarsRequired: number;\n\tMaxStars: number;\n\tLevels: Array;\n};\n\nexport interface World {\n\tId: number;\n\tName: string;\n\tLocales: any;\n\tPacks: Array;\n};\n\n/**\n * Fetch worlds data or return worldsData cached array\n * Worlds Data Structure\n\t[{\n\t \tId: number,\n\t \tName: string,\n\t \tLocales: {en: string, ru: string}\n\t \tPacks: [{\n\t \t\tId: number,\n\t \t\tName: string,\n\t \t\tLocales: {en: string, ru: string}\n\t \t\tStarsRequired: number\n\t \t\tLevels: [{\n\t \t\t\tId: number,\n\t \t\t\tHash: string,\n\t \t\t\tGraph: {\n\t \t\t\t\tVertices: Array\n\t \t\t\t\tMaxMovesCount: number\n\t \t\t\t\tBestMovesCount: number\n\t \t\t\t\tData: Object,\n\t \t\t\t}\n\t \t\t}]\n\t \t}],\n\t }]\n*/\nexport const fetchWorlds = (): Promise> => {\n\tconst endpoint =\n\t\t//axios.get(`${String(process.env.REACT_APP_API)}/worlds`);\n\t\taxios.get('/worlds_new_28.01.20.json');\n\n\treturn endpoint.then(response => {\n\t\treturn get(response, 'data');\n\t})\n\t.catch((error) => {\n \tconsole.log(error);\n\t\tthrow new Error(error);\n \t});\n};\n","import { SET_SECOND_SESSION } from 'redux/actionTypes';\n\nimport { getSecondSession } from 'shared/api/secondSessionAPI';\n\nexport const setSecondSession = isSecondSession => ({\n type: SET_SECOND_SESSION,\n\tisSecondSession,\n});\n\nexport const checkSecondSession = () => {\n return (dispatch) => {\n \t// async\n \treturn getSecondSession()\n\t\t.then((isSecondSession) => {\n\t\t\tdispatch(setSecondSession(isSecondSession));\n \t});\n };\n};","// import axios from 'axios';\n\nexport const getSecondSession = () => {\n return Promise.resolve(false);\n}","import PropTypes from 'prop-types';\n\n\nexport const propTypes = {\n isBlocked: PropTypes.bool,\n title: PropTypes.string,\n starsAchieved: PropTypes.number,\n maxStarsCount: PropTypes.number,\n starsRequired: PropTypes.number,\n onClick: PropTypes.func,\n};\n\nexport const defaultProps = {\n isBlocked: false,\n title: '',\n starsAchieved: 0,\n maxStarsCount: 0,\n starsRequired: 0,\n onClick: () => {},\n};","import React from 'react';\nimport classNames from 'classnames';\n\nimport { propTypes, defaultProps } from './props';\nimport styles from './CustomListItem.module.css';\n\nclass CustomListItem extends React.PureComponent {\n\tconstructor(props) {\n\t super(props);\n\t this.state = {};\n\t}\n\n\trender() {\n\t\tconst { isBlocked, title, starsAchieved, maxStarsCount, starsRequired, isVirtual } = this.props;\n\t\tconst wrapperClasses = classNames({\n\t\t [styles.CustomListItem]: true,\n\t\t [styles.Blocked]: isBlocked,\n\t\t [styles.Virtual]: isVirtual,\n\t\t [styles.SizeSmall]: maxStarsCount > 999,\n\t\t [this.props.className]: !!this.props.className,\n\t\t});\n\t\treturn (\n\t\t\t\n\t\t\t\t{title}\n\t\t\t\t
\n\t\t\t\t\t{isBlocked ?\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t{starsRequired}\n\t\t\t\t\t\t\n\t\t\t\t\t\t:\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t{starsAchieved}\n\t\t\t\t\t\t\t/\n\t\t\t\t\t\t\t{maxStarsCount}\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t}\n\t\t\t\t
\n\t\t\t\n\n\t\t);\n\t}\n\n}\n\nCustomListItem.propTypes = propTypes;\nCustomListItem.defaultProps = defaultProps;\n\nexport default CustomListItem;\n","import CustomListItem from './CustomListItem';\n\nexport default CustomListItem;","export interface ListItem {\n\theight: number;\n\tmarginBottom?: number;\n};\n\n/**\n * To avoid list item crop inside scroll area\n * calculate scroll height, that can fit a number of items without cropping them\n */\nexport const calcCustomListHeight = (maxAvailableHeight: number, listItem: ListItem): number => {\n\tconst fullHeight = listItem.marginBottom ? listItem.height + listItem.marginBottom : listItem.height;\n\tconst visibleRowsCount = maxAvailableHeight/fullHeight;\n\tlet maxHeightWithItems = Math.round(visibleRowsCount) * fullHeight;\n\tif (listItem.marginBottom) {\n\t\t// remove last row margin bottom\n\t\tmaxHeightWithItems -= listItem.marginBottom;\n\t}\n\tif (maxHeightWithItems > maxAvailableHeight) {\n\t\treturn Math.floor(visibleRowsCount) * fullHeight;\n\t}\n\treturn maxHeightWithItems;\n};\n\n(window as any).calcCustomListHeight = calcCustomListHeight;\n","import PropTypes from 'prop-types';\n\nexport const propTypes = {\n listItem: PropTypes.shape({\n \theight: PropTypes.number.isRequired,\n \tmarginBottom: PropTypes.number\n }),\n};\n\nexport const defaultProps = {\n listItem: {},\n};","import React, { Component } from 'react';\n\nimport { propTypes, defaultProps } from './props';\n\nimport { calcCustomListHeight } from 'shared/helpers/lists';\n\n/**\n * Component is using for lists\n * Sets scroll area height according on available height and one list item height \n */\nclass ScrollbarHeightAdjuster extends Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\t\tthis.state = {\n\t\t\tmaxHeight: 0,\n\t\t}\n\t\tthis.scrollWrapRef = React.createRef();\n\t}\n\n\trender() {\n\t\tconst { maxHeight } = this.state;\n\t\treturn (\n\t\t\t
\n\t\t\t\t\t{this.props.children}\n\t\t\t
\n\t\t);\n\t}\n\tcomponentDidMount() {\n\t\tthis.setState({\n\t\t\tmaxHeight: this.scrollWrapRef.current.clientHeight\n\t\t})\n\t}\n}\n\nScrollbarHeightAdjuster.propTypes = propTypes;\nScrollbarHeightAdjuster.defaultProps = defaultProps;\n\nexport default ScrollbarHeightAdjuster","import ScrollbarHeightAdjuster from './ScrollbarHeightAdjuster';\n\nexport default ScrollbarHeightAdjuster;","/* eslint react/jsx-pascal-case: [0, { ignore: 1 }] */\n\nimport React, { Component } from 'react';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router';\nimport get from 'lodash/get';\nimport { withNamespaces } from 'react-i18next';\nimport { Scrollbars } from 'react-custom-scrollbars';\nimport { NamespacesConsumer } from 'react-i18next';\n\n// modules\nimport { sendAnalyticsEvent, composeAnalyticsEntityId, withCount } from 'shared/modules/AnalyticsEvents';\n\n// components\nimport CustomListItem from 'shared/components/CustomListItem';\nimport ScrollbarHeightAdjuster from 'shared/components/ScrollbarHeightAdjuster';\nimport PageHeaderManager from 'shared/containers/PageHeaderManager';\nimport withTracker from 'shared/components/withTracker';\n\n// constants\nimport cssEnvVars from 'shared/cssEnvironmentVariables';\n\n// helpers\nimport { getLastVisitedLevel } from 'shared/helpers/progress';\nimport AppSoundManager from 'shared/modules/AppSoundManager';\n\n// styles\nimport styles from './LandingPage.module.css';\n\n// redux\nimport { getAchievedStarsInWorld } from 'redux/selectors/progress';\nimport { getMaxStarsInWorld, getWorldsSelector } from 'redux/selectors/worlds';\n\nconst mapStateToProps = state => ({\n worlds: getWorldsSelector(state),\n worldsMaxStars: state.worlds.worldsMaxStars,\n achievedStars: state.progress.achievedStars,\n});\n\nclass LandingPage extends Component {\n\n constructor(props) {\n super(props);\n this.isActive = true;\n this.state = {\n hasContinueLevel: !!getLastVisitedLevel(),\n };\n }\n\n /******************************************\n * COMPONENT HOOKS\n ******************************************/\n\n render() {\n const { t, worlds, achievedStars, worldsMaxStars } = this.props;\n\n return (\n
\n \n
\n
\n
\n
\n \n \n
    \n {worlds.map((worldItem, index) => {\n const worldName = t(`worlds.${worldItem.Id}.title`);\n return (\n \n );\n })}\n \n { t => (\n \n )}\n \n\n
\n
\n \n
\n );\n }\n\n componentWillUnmount() {\n this.isActive = false;\n }\n\n /******************************************\n * COMPONENT HANDLERS\n ******************************************/\n\n handlerContinueClick() {\n AppSoundManager.playButtonSound();\n const lvl = getLastVisitedLevel();\n if (lvl) {\n this.props.history.push(`/game/level/${lvl.worldId}/${lvl.packId}/${lvl.levelId}`);\n return;\n }\n }\n\n handlerNewGameClick() {\n // New Game - появляется один раз. При клике - кидаем на туториал.\n AppSoundManager.playButtonSound();\n this.props.history.push('/tutorial');\n }\n\n handlerTutorialClick() {\n AppSoundManager.playButtonSound();\n this.props.history.push('/tutorial');\n }\n\n handlerChooseLevelClick() {\n // (показывется вместо new game после первого запуска)\n AppSoundManager.playButtonSound();\n const firstWorldId = get(this.props.worlds, '[0].Id', 1);\n this.props.history.push(`/world/${firstWorldId}`);\n }\n\n handlerWorldClick(worldId) {\n sendAnalyticsEvent('worldClick', withCount({\n worldId: composeAnalyticsEntityId(worldId)\n }));\n AppSoundManager.playButtonSound();\n this.props.history.push(`/world/${worldId}`);\n }\n\n}\n\nexport default withTracker(withNamespaces()(withRouter(connect(mapStateToProps)(LandingPage))));\n","import LandingPage from './LandingPage';\n\nexport default LandingPage;\n","import PageTitle from './PageTitle';\n\nexport default PageTitle;\n","/* eslint react/jsx-pascal-case: [0, { ignore: 1 }] */\n\nimport React from 'react';\nimport classNames from 'classnames';\n\n// styles\nimport styles from './PageTitle.module.css';\nimport 'shared/styles/header.css';\n\n\nclass PageTitle extends React.PureComponent {\n\n /******************************************\n * COMPONENT HOOKS\n ******************************************/\n\n render() {\n const { className, children } = this.props;\n\n const titleClasses = classNames({\n [styles.PageTitle]: true,\n [className]: !!className,\n });\n\n return (\n

{children}

\n );\n }\n}\n\nexport default PageTitle;","import StarsCounter from './StarsCounter';\n\nexport default StarsCounter;","import React from 'react';\nimport classNames from 'classnames';\n\n// styles\nimport styles from './StarsCounter.module.css';\n\n\nclass StarsCounter extends React.PureComponent {\n\n\trender() {\n\t\tconst counterClasses = classNames({\n\t\t [styles.StarsCounter]: true,\n\t\t [this.props.className]: !!this.props.className,\n\t\t});\n\t\treturn (\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t{this.props.currentStarsNumber}\n\t\t\t\t\t/\n\t\t\t\t\t{this.props.maxStarsNumber}\n\t\t\t\t
\n\t\t);\n\t}\n\n}\n\nexport default StarsCounter;","export const windowInnerHeight = window.innerHeight;\nexport const windowInnerWidth = window.innerWidth;","/* eslint react/jsx-pascal-case: [0, { ignore: 1 }] */\n\nimport React, { Component } from 'react';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router';\nimport classNames from 'classnames';\nimport get from 'lodash/get';\nimport { Scrollbars } from 'react-custom-scrollbars';\nimport { withNamespaces } from 'react-i18next';\n\n// components\nimport Stars from 'shared/components/Stars';\nimport PageTitle from 'shared/components/PageTitle';\nimport StarsCounter from 'shared/components/StarsCounter';\nimport PageHeaderManager from 'shared/containers/PageHeaderManager';\nimport ScrollbarHeightAdjuster from 'shared/components/ScrollbarHeightAdjuster';\nimport withTracker from 'shared/components/withTracker';\n\n// constants\nimport cssEnvVars from 'shared/cssEnvironmentVariables';\n\n// helpers\nimport { hasPackAccess, hasLevelAccess, getAchievedStarsAmount, } from 'shared/helpers/progress';\nimport { windowInnerWidth } from 'shared/helpers/resize';\n\nimport AppSoundManager from 'shared/modules/AppSoundManager';\n\n// styles\nimport styles from './LevelsPage.module.css';\n\n// redux\nimport { getPackWithLevelsSelector } from 'redux/selectors/worlds';\nimport {\n getAchievedStarsInPack, getAllAchievedStars, getLevelProgress\n} from 'redux/selectors/progress';\n\n\nconst mapStateToProps = (state, props) => ({\n progress: state.progress.progress,\n pack: getPackWithLevelsSelector(state, props),\n achievedStars: state.progress.achievedStars,\n});\n\nclass LevelsPage extends Component {\n\n constructor(props) {\n super(props);\n this.isActive = true;\n }\n\n get worldId() {\n return +get(this.props.match.params, 'worldId');\n }\n\n get packId() {\n return +get(this.props.match.params, 'packId');\n }\n\n /******************************************\n * COMPONENT HOOKS\n ******************************************/\n\n render() {\n const { t, pack, achievedStars, progress } = this.props;\n const packName = t(`worlds.${this.worldId}.packs.${this.packId}`);\n\n return (\n
\n \n {!!pack.Levels.length && \n \n }\n
\n );\n }\n\n componentDidMount() {\n const { pack, achievedStars } = this.props;\n if (!this.isActive) return;\n if (!this.props.pack) return this.goPageBack();\n // user must achieve stars more or equal than pack requires\n if (!hasPackAccess(pack.StarsRequired, getAllAchievedStars(achievedStars))) {\n this.goPageBack();\n return;\n }\n }\n\n componentWillUnmount() {\n this.isActive = false;\n }\n\n /******************************************\n * COMPONENT HANDLERS\n ******************************************/\n \n handlerLevelClick(levelId, isLevelLocked) {\n if (isLevelLocked) return;\n AppSoundManager.playButtonSound();\n if (this.worldId) {\n this.props.history.push(`/game/level/${this.worldId}/${this.packId}/${levelId}`);\n }\n }\n\n handlerBackClick = () => {\n AppSoundManager.playButtonSound();\n if (this.worldId) {\n this.goPageBack();\n } else {\n this.props.history.push('/', {routeBack: true});\n }\n }\n\n /******************************************\n * COMPONENT METHODS\n ******************************************/\n\n goPageBack() {\n this.props.history.push(`/world/${this.worldId}`, {routeBack: true});\n }\n}\n\nexport default withTracker(withNamespaces()(withRouter(connect(mapStateToProps, null)(LevelsPage))));\n","import LevelsPage from './LevelsPage';\n\nexport default LevelsPage;\n","import React, { Component } from 'react';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router';\nimport get from 'lodash/get';\nimport { Scrollbars } from 'react-custom-scrollbars';\nimport { withNamespaces } from 'react-i18next';\n\nimport { hasPackAccess } from 'shared/helpers/progress';\n\n// modules\nimport { sendAnalyticsEvent, composeAnalyticsEntityId, withCount } from 'shared/modules/AnalyticsEvents';\n\n// components\nimport PageTitle from 'shared/components/PageTitle';\nimport StarsCounter from 'shared/components/StarsCounter';\nimport AppSoundManager from 'shared/modules/AppSoundManager';\nimport CustomListItem from 'shared/components/CustomListItem';\nimport PageHeaderManager from 'shared/containers/PageHeaderManager';\nimport ScrollbarHeightAdjuster from 'shared/components/ScrollbarHeightAdjuster';\nimport withTracker from 'shared/components/withTracker';\n\n// constants\nimport cssEnvVars from 'shared/cssEnvironmentVariables';\n\n// redux\nimport { getWorldPacksSelector } from 'redux/selectors/worlds';\nimport {\n\tgetAchievedStarsInWorld, getAchievedStarsInPack, getAllAchievedStars\n} from 'redux/selectors/progress';\nimport { getMaxStarsInWorld } from 'redux/selectors/worlds';\n\n// styles\nimport styles from './WorldPage.module.css';\n\n\nconst mapStateToProps = (state, props) => ({\n\tworldsMaxStars: state.worlds.worldsMaxStars,\n\tpacks: getWorldPacksSelector(state, props),\n\tachievedStars: state.progress.achievedStars,\n});\n\nclass WorldPage extends Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\t\tthis.isActive = true;\n\t}\n\n\tget worldId() {\n\t return +get(this.props.match.params, 'worldId');\n\t}\n\n\t/******************************************\n\t* COMPONENT HOOKS\n\t******************************************/\n\n\trender() {\n\t\tconst { t, achievedStars, worldsMaxStars, packs } = this.props;\n\n\t\treturn (\n\t\t\t
\n\t\t\t\t\n\n\t\t\t\t
\n\t\t\t\t {t(`worlds.${this.worldId}.title`)}\n\t\t\t\t \n\t\t\t\t \n\t\t\t\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t{packs.map((packItem, index) => {\n\t\t\t\t\t\t\t\t\tconst isPackBlocked = !hasPackAccess(packItem.StarsRequired, getAllAchievedStars(achievedStars));\n\t\t\t\t\t\t\t\t\tconst packName = t(`worlds.${this.worldId}.packs.${packItem.Id}`);\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t
\n\t\t);\n\t}\n\n\tcomponentWillUnmount() {\n\t\tthis.isActive = false;\n\t}\n\n\t/******************************************\n\t* COMPONENT HANDLERS\n\t******************************************/\n\n\thandlerPackClick(packId) {\n\t\tconst { worldId } = this;\n\t\tsendAnalyticsEvent('packClick', withCount({ \n\t\t\tpackId: composeAnalyticsEntityId(worldId, packId) \n\t\t}));\n\t\tAppSoundManager.playButtonSound();\n\t\tthis.props.history.push(`/world/${worldId}/pack/${packId}`);\n\t}\n\n\thandlerBackClick = () => {\n\t\tAppSoundManager.playButtonSound();\n\t\tthis.props.history.push(`/`, {routeBack: true});\n\t}\n}\n\nexport default withTracker(withNamespaces()(withRouter(connect(mapStateToProps, null)(WorldPage))));","import WorldPage from './WorldPage';\n\nexport default WorldPage;","import React from 'react';\nimport { connect } from 'react-redux';\nimport { Switch, Route, Redirect } from 'react-router-dom';\nimport { withRouter, matchPath } from 'react-router';\nimport {\n CSSTransition,\n TransitionGroup,\n} from 'react-transition-group';\nimport get from 'lodash/get';\nimport defer from 'lodash/defer';\nimport some from 'lodash/some';\nimport upperCase from 'lodash/upperCase';\nimport { setAutoFreeze } from 'immer';\nimport 'fuckadblock';\nimport classNames from 'classnames';\nimport loadable from '@loadable/component';\nimport Div100vh from 'react-div-100vh';\n\nimport i18n from 'shared/i18n';\nimport config from 'shared/config';\n\n// components\nimport Header from 'containers/Header';\nimport Footer from 'components/Footer';\n\nimport Preloader from 'shared/components/Preloader';\nimport OKAndroidManager from 'shared/containers/OKAndroidManager';\nimport PageWrap from 'shared/components/PageWrap';\nimport Tutorial from 'shared/containers/Tutorial';\nimport ModalManager from 'shared/containers/ModalManager';\n\n// constants\nimport { SUCCESS, PAGE_ANIMATION_TIME } from 'shared/constants';\n\n// helpers\nimport { detectTabVisibility, tabVisibility$ } from 'shared/helpers/tabVisibility';\nimport { getLastVisitedLevel } from 'shared/helpers/progress';\nimport { initAdBlockDetector } from 'shared/helpers/adBlockDetector';\nimport { setLang } from 'shared/helpers/locales';\nimport 'shared/helpers/arrayIncludesPolyfill';\nimport { getAnalyticsID, isAnalyticsEnabled, sendRouteMetric } from 'shared/helpers/analytics';\n\n// modules\nimport AppSoundManager from 'shared/modules/AppSoundManager';\nimport Auth from 'shared/modules/Auth';\nimport TutorialManager from 'shared/modules/TutorialManager';\nimport Advertizer from 'shared/adv/Advertizer';\nimport loadSDK from 'shared/sdk/index';\n\n// redux\nimport { getSettings, setSettings, fetchSettingsTutorial } from 'redux/actions/settings';\nimport { getLives } from 'redux/actions/lives';\nimport { getBoosters } from 'redux/actions/boosters';\nimport { getProgress, calcAchievedStarsAsync } from 'redux/actions/progress';\nimport { getWorlds } from 'redux/actions/worlds';\nimport { checkSecondSession } from 'redux/actions/secondSession';\nimport { setInfiniteBoosterHint, setInfiniteBoosterMoveBack } from 'redux/actions/boosters';\n\nimport styles from './App.module.css';\nimport 'shared/styles/animation.css';\n\nimport LandingPage from 'containers/LandingPage';\nimport LevelsPage from 'containers/LevelsPage';\nimport WorldPage from 'containers/WorldPage';\nimport { createUUID } from 'shared/helpers/user';\n\n// libs lazy loading\nconst ReactYMLoadable = loadable.lib(() => import('react-yandex-metrika'));\n\n// pages lazy loading\nconst PlaygroundPage = loadable(() => import('containers/PlaygroundPage'));\n\n// components lazy loading\nconst CheatPanel = loadable(() => import('shared/containers/CheatPanel'))\n\n// Stub for testing\n// Uncomment for testing android app emulation\n// window.OKApp = {\n// suggestDesktopIcon: () => {\n// console.log('window.OKApp.suggestDesktopIcon() was called');\n// },\n// };\n\nconst mapStateToProps = state => ({\n isAuth: state.user.isAuth,\n isDeveloper: state.user.developer,\n language: state.settings.language,\n progressFetched: state.progress.isGetWorldsProgressSuccess,\n isAchievedStarsCalculated: state.progress.isAchievedStarsCalculated,\n worldsFetched: state.worlds.isGetWorldsSuccess,\n isTutorialLoad: !!state.settings.tutorialProgress\n});\n\nconst mapDispatchToProps = dispatch => ({\n fetchSettings: () => dispatch(getSettings()),\n fetchSettingsTutorial: () => dispatch(fetchSettingsTutorial()),\n getProgress: () => dispatch(getProgress()),\n calcAchievedStarsAsync: () => dispatch(calcAchievedStarsAsync()),\n getWorlds: () => dispatch(getWorlds()),\n setSettingsLanguage: language => dispatch(setSettings({ language })),\n fetchLives: () => dispatch(getLives()),\n fetchBoosters: () => dispatch(getBoosters()),\n checkSecondSession: () => dispatch(checkSecondSession()),\n setInfiniteBoosters: () => {\n dispatch(setInfiniteBoosterHint(true))\n dispatch(setInfiniteBoosterMoveBack(true))\n },\n});\n\nclass App extends React.PureComponent {\n\n constructor(props) {\n super(props);\n // https://github.com/mweststrate/immer#auto-freezing\n setAutoFreeze(false);\n // set pages paths on which footer must be hidden\n this.hiddenFooterPaths = [\n { path: '/game/level/:worldId/:packId/:levelId', exact: true }\n ];\n }\n\n get isAndroidOkApp() {\n return (process.env.REACT_APP_SOCIAL_MEDIA === 'ok') && get(window, 'OKApp.suggestDesktopIcon');\n }\n\n /******************************************\n * COMPONENT HOOKS\n ******************************************/\n\n render() {\n const { location, progressFetched, worldsFetched, isAchievedStarsCalculated, isDeveloper } = this.props;\n // For animating route back different way add {routeBack: true} state to the history.push or to the \n const transitionClassName = get(location, 'state.routeBack') ? 'page-back' : 'page-forward';\n const hideFooter = some(this.hiddenFooterPaths, (item) => matchPath(location.pathname, item));\n\n // Show preloader until progress, worlds data are fetched and achievedStars are calculated\n // Thus all pages will have these data before rendering\n const isLoading = !(progressFetched && worldsFetched && isAchievedStarsCalculated);\n\n return (\n \n {isLoading ? (\n
\n \n
\n ) : (\n \n \n\n {/* Header */}\n
\n\n {/* Page content */}\n
\n React.cloneElement(\n child,\n { classNames: transitionClassName }\n )} >\n \n \n (\n \n )} />\n {\n return ();\n }} />\n {\n return ();\n }} />\n {\n return ();\n }} />\n (\n \n )} />\n (\n \n )} />\n (\n \n )} />\n \n \n \n
\n\n {/* Footer */}\n